ClientTrickPlayState Class Reference

#include <MPEG2TransportFileServerMediaSubsession.hh>

Collaboration diagram for ClientTrickPlayState:

Collaboration graph
[legend]

Public Member Functions

 ClientTrickPlayState (MPEG2TransportStreamIndexFile *indexFile)
unsigned long updateStateFromNPT (double npt, double seekDuration)
void updateStateOnScaleChange ()
void updateStateOnPlayChange (Boolean reverseToPreviousVSH)
void handleStreamDeletion ()
void setSource (MPEG2TransportStreamFramer *framer)
void setNextScale (float nextScale)
Boolean areChangingScale () const

Protected Member Functions

void updateTSRecordNum ()
void reseekOriginalTransportStreamSource ()

Protected Attributes

MPEG2TransportStreamIndexFilefIndexFile
ByteStreamFileSourcefOriginalTransportStreamSource
MPEG2TransportStreamTrickModeFilterfTrickModeFilter
MPEG2TransportStreamFromESSourcefTrickPlaySource
MPEG2TransportStreamFramerfFramer
float fScale
float fNextScale
float fNPT
unsigned long fTSRecordNum
unsigned long fIxRecordNum

Detailed Description

Definition at line 102 of file MPEG2TransportFileServerMediaSubsession.hh.


Constructor & Destructor Documentation

ClientTrickPlayState::ClientTrickPlayState ( MPEG2TransportStreamIndexFile indexFile  ) 

Definition at line 225 of file MPEG2TransportFileServerMediaSubsession.cpp.

00226   : fIndexFile(indexFile),
00227     fOriginalTransportStreamSource(NULL),
00228     fTrickModeFilter(NULL), fTrickPlaySource(NULL),
00229     fFramer(NULL),
00230     fScale(1.0f), fNextScale(1.0f), fNPT(0.0f),
00231     fTSRecordNum(0), fIxRecordNum(0) {
00232 }


Member Function Documentation

unsigned long ClientTrickPlayState::updateStateFromNPT ( double  npt,
double  seekDuration 
)

Definition at line 234 of file MPEG2TransportFileServerMediaSubsession.cpp.

References MPEG2TransportStreamFramer::clearPIDStatusTable(), fFramer, fIndexFile, fIxRecordNum, fNPT, fTSRecordNum, MPEG2TransportStreamIndexFile::lookupTSPacketNumFromNPT(), reseekOriginalTransportStreamSource(), MPEG2TransportStreamFramer::setNumTSPacketsToStream(), and updateTSRecordNum().

Referenced by MPEG2TransportFileServerMediaSubsession::seekStream().

00234                                                                                         {
00235   fNPT = (float)npt;
00236   // Map "fNPT" to the corresponding Transport Stream and Index record numbers:
00237   unsigned long tsRecordNum, ixRecordNum;
00238   fIndexFile->lookupTSPacketNumFromNPT(fNPT, tsRecordNum, ixRecordNum);
00239 
00240   updateTSRecordNum();
00241   if (tsRecordNum != fTSRecordNum) {
00242     fTSRecordNum = tsRecordNum;
00243     fIxRecordNum = ixRecordNum;
00244 
00245     // Seek the source to the new record number:
00246     reseekOriginalTransportStreamSource();
00247     // Note: We assume that we're asked to seek only in normal
00248     // (i.e., non trick play) mode, so we don't seek within the trick
00249     // play source (if any).
00250 
00251     fFramer->clearPIDStatusTable();
00252   }
00253 
00254   // NPT might have changed when we looked it up in the index file.  Adjust "streamDuration" accordingly:
00255   streamDuration += npt - (double)fNPT;
00256 
00257   unsigned long numTSRecordsToStream = 0;
00258   if (streamDuration > 0.0) {
00259     // Use the index file to figure out how many Transport Packets we get to stream:
00260     unsigned long toTSRecordNum, toIxRecordNum;    
00261     float toNPT = (float)(fNPT + streamDuration);
00262     fIndexFile->lookupTSPacketNumFromNPT(toNPT, toTSRecordNum, toIxRecordNum);
00263     if (toTSRecordNum > tsRecordNum) { // sanity check
00264       numTSRecordsToStream = toTSRecordNum - tsRecordNum;
00265     }
00266   }
00267   fFramer->setNumTSPacketsToStream(numTSRecordsToStream);
00268 
00269   return numTSRecordsToStream;
00270 }

void ClientTrickPlayState::updateStateOnScaleChange (  ) 

Definition at line 272 of file MPEG2TransportFileServerMediaSubsession.cpp.

References MPEG2TransportStreamFromESSource::addNewVideoSource(), MPEG2TransportStreamFramer::changeInputSource(), Medium::close(), MPEG2TransportStreamFromESSource::createNew(), MPEG2TransportStreamTrickModeFilter::createNew(), env, Medium::envir(), fFramer, fIndexFile, fIxRecordNum, fNextScale, MPEG2TransportStreamTrickModeFilter::forgetInputSource(), fOriginalTransportStreamSource, fScale, fTrickModeFilter, fTrickPlaySource, fTSRecordNum, MPEG2TransportStreamIndexFile::mpegVersion(), NULL, reseekOriginalTransportStreamSource(), and MPEG2TransportStreamTrickModeFilter::seekTo().

Referenced by MPEG2TransportFileServerMediaSubsession::startStream().

00272                                                     {
00273   fScale = fNextScale;
00274 
00275   // Change our source objects to reflect the change in scale:
00276   // First, close the existing trick play source (if any):
00277   if (fTrickPlaySource != NULL) {
00278     fTrickModeFilter->forgetInputSource();
00279         // so that the underlying Transport Stream source doesn't get deleted by:
00280     Medium::close(fTrickPlaySource);
00281     fTrickPlaySource = NULL;
00282     fTrickModeFilter = NULL;
00283   }
00284   if (fNextScale != 1.0f) {
00285     // Create a new trick play filter from the original Transport Stream source:
00286     UsageEnvironment& env = fIndexFile->envir(); // alias
00287     fTrickModeFilter = MPEG2TransportStreamTrickModeFilter
00288       ::createNew(env, fOriginalTransportStreamSource, fIndexFile, int(fNextScale));
00289     fTrickModeFilter->seekTo(fTSRecordNum, fIxRecordNum);
00290 
00291     // And generate a Transport Stream from this:
00292     fTrickPlaySource = MPEG2TransportStreamFromESSource::createNew(env);
00293     fTrickPlaySource->addNewVideoSource(fTrickModeFilter, fIndexFile->mpegVersion());
00294 
00295     fFramer->changeInputSource(fTrickPlaySource);
00296   } else {
00297     // Switch back to the original Transport Stream source:
00298     reseekOriginalTransportStreamSource();
00299     fFramer->changeInputSource(fOriginalTransportStreamSource);
00300   }
00301 }

void ClientTrickPlayState::updateStateOnPlayChange ( Boolean  reverseToPreviousVSH  ) 

Definition at line 303 of file MPEG2TransportFileServerMediaSubsession.cpp.

References fIndexFile, fIxRecordNum, fNPT, fTrickModeFilter, fTrickPlaySource, fTSRecordNum, MPEG2TransportStreamIndexFile::lookupPCRFromTSPacketNum(), MPEG2TransportStreamTrickModeFilter::nextIndexRecordNum(), NULL, MPEG2TransportStreamIndexFile::readIndexRecordValues(), size, and updateTSRecordNum().

Referenced by MPEG2TransportFileServerMediaSubsession::deleteStream(), MPEG2TransportFileServerMediaSubsession::pauseStream(), and MPEG2TransportFileServerMediaSubsession::startStream().

00303                                                                                {
00304   updateTSRecordNum();
00305   if (fTrickPlaySource == NULL) {
00306     // We were in regular (1x) play. Use the index file to look up the
00307     // index record number and npt from the current transport number:
00308     fIndexFile->lookupPCRFromTSPacketNum(fTSRecordNum, reverseToPreviousVSH, fNPT, fIxRecordNum);
00309   } else {
00310     // We were in trick mode, and so already have the index record number.
00311     // Get the transport record number and npt from this:
00312     fIxRecordNum = fTrickModeFilter->nextIndexRecordNum();
00313     if ((long)fIxRecordNum < 0) fIxRecordNum = 0; // we were at the start of the file
00314     unsigned long transportRecordNum;
00315     float pcr;
00316     u_int8_t offset, size, recordType; // all dummy
00317     if (fIndexFile->readIndexRecordValues(fIxRecordNum, transportRecordNum,
00318                                           offset, size, pcr, recordType)) {
00319       fTSRecordNum = transportRecordNum;
00320       fNPT = pcr;
00321     }
00322   }
00323 }

void ClientTrickPlayState::handleStreamDeletion (  ) 

void ClientTrickPlayState::setSource ( MPEG2TransportStreamFramer framer  ) 

Definition at line 325 of file MPEG2TransportFileServerMediaSubsession.cpp.

References fFramer, fOriginalTransportStreamSource, and FramedFilter::inputSource().

Referenced by MPEG2TransportFileServerMediaSubsession::createNewStreamSource().

00325                                                                        {
00326   fFramer = framer;
00327   fOriginalTransportStreamSource = (ByteStreamFileSource*)(framer->inputSource());
00328 }

void ClientTrickPlayState::setNextScale ( float  nextScale  )  [inline]

Definition at line 114 of file MPEG2TransportFileServerMediaSubsession.hh.

References fNextScale.

Referenced by MPEG2TransportFileServerMediaSubsession::setStreamScale().

00114 { fNextScale = nextScale; }

Boolean ClientTrickPlayState::areChangingScale (  )  const [inline]

Definition at line 115 of file MPEG2TransportFileServerMediaSubsession.hh.

References fNextScale, and fScale.

Referenced by MPEG2TransportFileServerMediaSubsession::startStream().

00115 { return fNextScale != fScale; }

void ClientTrickPlayState::updateTSRecordNum (  )  [protected]

Definition at line 330 of file MPEG2TransportFileServerMediaSubsession.cpp.

References fFramer, fTSRecordNum, NULL, and MPEG2TransportStreamFramer::tsPacketCount().

Referenced by updateStateFromNPT(), and updateStateOnPlayChange().

00330                                             {
00331   if (fFramer != NULL) fTSRecordNum += (unsigned long)(fFramer->tsPacketCount());
00332 }

void ClientTrickPlayState::reseekOriginalTransportStreamSource (  )  [protected]

Definition at line 334 of file MPEG2TransportFileServerMediaSubsession.cpp.

References fOriginalTransportStreamSource, fTSRecordNum, ByteStreamFileSource::seekToByteAbsolute(), and TRANSPORT_PACKET_SIZE.

Referenced by updateStateFromNPT(), and updateStateOnScaleChange().

00334                                                                {
00335   u_int64_t tsRecordNum64 = (u_int64_t)fTSRecordNum;
00336   fOriginalTransportStreamSource->seekToByteAbsolute(tsRecordNum64*TRANSPORT_PACKET_SIZE);
00337 }


Field Documentation

MPEG2TransportStreamIndexFile* ClientTrickPlayState::fIndexFile [protected]

Definition at line 122 of file MPEG2TransportFileServerMediaSubsession.hh.

Referenced by updateStateFromNPT(), updateStateOnPlayChange(), and updateStateOnScaleChange().

ByteStreamFileSource* ClientTrickPlayState::fOriginalTransportStreamSource [protected]

Definition at line 123 of file MPEG2TransportFileServerMediaSubsession.hh.

Referenced by reseekOriginalTransportStreamSource(), setSource(), and updateStateOnScaleChange().

MPEG2TransportStreamTrickModeFilter* ClientTrickPlayState::fTrickModeFilter [protected]

Definition at line 124 of file MPEG2TransportFileServerMediaSubsession.hh.

Referenced by updateStateOnPlayChange(), and updateStateOnScaleChange().

MPEG2TransportStreamFromESSource* ClientTrickPlayState::fTrickPlaySource [protected]

Definition at line 125 of file MPEG2TransportFileServerMediaSubsession.hh.

Referenced by updateStateOnPlayChange(), and updateStateOnScaleChange().

MPEG2TransportStreamFramer* ClientTrickPlayState::fFramer [protected]

Definition at line 126 of file MPEG2TransportFileServerMediaSubsession.hh.

Referenced by setSource(), updateStateFromNPT(), updateStateOnScaleChange(), and updateTSRecordNum().

float ClientTrickPlayState::fScale [protected]

Definition at line 127 of file MPEG2TransportFileServerMediaSubsession.hh.

Referenced by areChangingScale(), and updateStateOnScaleChange().

float ClientTrickPlayState::fNextScale [protected]

Definition at line 127 of file MPEG2TransportFileServerMediaSubsession.hh.

Referenced by areChangingScale(), setNextScale(), and updateStateOnScaleChange().

float ClientTrickPlayState::fNPT [protected]

Definition at line 127 of file MPEG2TransportFileServerMediaSubsession.hh.

Referenced by updateStateFromNPT(), and updateStateOnPlayChange().

unsigned long ClientTrickPlayState::fTSRecordNum [protected]

Definition at line 128 of file MPEG2TransportFileServerMediaSubsession.hh.

Referenced by reseekOriginalTransportStreamSource(), updateStateFromNPT(), updateStateOnPlayChange(), updateStateOnScaleChange(), and updateTSRecordNum().

unsigned long ClientTrickPlayState::fIxRecordNum [protected]

Definition at line 128 of file MPEG2TransportFileServerMediaSubsession.hh.

Referenced by updateStateFromNPT(), updateStateOnPlayChange(), and updateStateOnScaleChange().


The documentation for this class was generated from the following files:
Generated on Thu May 17 07:15:10 2012 for live by  doxygen 1.5.2