ClientTrickPlayState Class Reference

Collaboration diagram for ClientTrickPlayState:

Collaboration graph
[legend]

Public Member Functions

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

Private Member Functions

void updateTSRecordNum ()
void reseekOriginalTransportStreamSource ()

Private Attributes

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

Detailed Description

Definition at line 38 of file MPEG2TransportFileServerMediaSubsession.cpp.


Constructor & Destructor Documentation

ClientTrickPlayState::ClientTrickPlayState ( MPEG2TransportStreamIndexFile indexFile  ) 

Definition at line 253 of file MPEG2TransportFileServerMediaSubsession.cpp.

00254   : fIndexFile(indexFile),
00255     fOriginalTransportStreamSource(NULL),
00256     fTrickModeFilter(NULL), fTrickPlaySource(NULL),
00257     fFramer(NULL),
00258     fScale(1.0f), fNextScale(1.0f), fNPT(0.0f),
00259     fTSRecordNum(0), fIxRecordNum(0) {
00260 }


Member Function Documentation

void ClientTrickPlayState::updateStateFromNPT ( float  npt  ) 

Definition at line 262 of file MPEG2TransportFileServerMediaSubsession.cpp.

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

Referenced by MPEG2TransportFileServerMediaSubsession::seekStream().

00262                                                        {
00263   fNPT = npt;
00264   // Map "fNPT" to the corresponding Transport Stream and Index record numbers:
00265   unsigned long tsRecordNum, ixRecordNum;
00266   fIndexFile->lookupTSPacketNumFromNPT(fNPT, tsRecordNum, ixRecordNum);
00267 
00268   updateTSRecordNum();
00269   if (tsRecordNum != fTSRecordNum) {
00270     fTSRecordNum = tsRecordNum;
00271     fIxRecordNum = ixRecordNum;
00272 
00273     // Seek the source to the new record number:
00274     reseekOriginalTransportStreamSource();
00275     // Note: We assume that we're asked to seek only in normal
00276     // (i.e., non trick play) mode, so we don't seek within the trick
00277     // play source (if any).
00278 
00279     fFramer->clearPIDStatusTable();
00280   }
00281 }

void ClientTrickPlayState::updateStateOnScaleChange (  ) 

Definition at line 283 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, NULL, reseekOriginalTransportStreamSource(), MPEG2TransportStreamTrickModeFilter::seekTo(), and VIDEO_MPEG_VERSION.

Referenced by MPEG2TransportFileServerMediaSubsession::startStream().

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

void ClientTrickPlayState::updateStateOnPlayChange ( Boolean  reverseToPreviousVSH  ) 

Definition at line 314 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().

00314                                                                                {
00315   updateTSRecordNum();
00316   if (fTrickPlaySource == NULL) {
00317     // We were in regular (1x) play. Use the index file to look up the
00318     // index record number and npt from the current transport number:
00319     fIndexFile->lookupPCRFromTSPacketNum(fTSRecordNum, reverseToPreviousVSH, fNPT, fIxRecordNum);
00320   } else {
00321     // We were in trick mode, and so already have the index record number.
00322     // Get the transport record number and npt from this:
00323     fIxRecordNum = fTrickModeFilter->nextIndexRecordNum();
00324     if ((long)fIxRecordNum < 0) fIxRecordNum = 0; // we were at the start of the file
00325     unsigned long transportRecordNum;
00326     float pcr;
00327     u_int8_t offset, size, recordType; // all dummy
00328     if (fIndexFile->readIndexRecordValues(fIxRecordNum, transportRecordNum,
00329                                           offset, size, pcr, recordType)) {
00330       fTSRecordNum = transportRecordNum;
00331       fNPT = pcr;
00332     }
00333   }
00334 }

void ClientTrickPlayState::handleStreamDeletion (  ) 

void ClientTrickPlayState::setSource ( MPEG2TransportStreamFramer framer  ) 

Definition at line 336 of file MPEG2TransportFileServerMediaSubsession.cpp.

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

Referenced by MPEG2TransportFileServerMediaSubsession::createNewStreamSource().

00336                                                                        {
00337   fFramer = framer;
00338   fOriginalTransportStreamSource = (ByteStreamFileSource*)(framer->inputSource());
00339 }

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

Definition at line 50 of file MPEG2TransportFileServerMediaSubsession.cpp.

References fNextScale.

Referenced by MPEG2TransportFileServerMediaSubsession::setStreamScale().

00050 { fNextScale = nextScale; }

Boolean ClientTrickPlayState::areChangingScale (  )  const [inline]

Definition at line 51 of file MPEG2TransportFileServerMediaSubsession.cpp.

References fNextScale, and fScale.

Referenced by MPEG2TransportFileServerMediaSubsession::startStream().

00051 { return fNextScale != fScale; }

void ClientTrickPlayState::updateTSRecordNum (  )  [private]

Definition at line 341 of file MPEG2TransportFileServerMediaSubsession.cpp.

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

Referenced by updateStateFromNPT(), and updateStateOnPlayChange().

00341                                             {
00342   if (fFramer != NULL) fTSRecordNum += fFramer->tsPacketCount();
00343 }

void ClientTrickPlayState::reseekOriginalTransportStreamSource (  )  [private]

Definition at line 345 of file MPEG2TransportFileServerMediaSubsession.cpp.

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

Referenced by updateStateFromNPT(), and updateStateOnScaleChange().

00345                                                                {
00346   u_int64_t tsRecordNum64 = (u_int64_t)fTSRecordNum;
00347   fOriginalTransportStreamSource->seekToByteAbsolute(tsRecordNum64*TRANSPORT_PACKET_SIZE);
00348 }


Field Documentation

MPEG2TransportStreamIndexFile* ClientTrickPlayState::fIndexFile [private]

Definition at line 58 of file MPEG2TransportFileServerMediaSubsession.cpp.

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

ByteStreamFileSource* ClientTrickPlayState::fOriginalTransportStreamSource [private]

Definition at line 59 of file MPEG2TransportFileServerMediaSubsession.cpp.

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

MPEG2TransportStreamTrickModeFilter* ClientTrickPlayState::fTrickModeFilter [private]

Definition at line 60 of file MPEG2TransportFileServerMediaSubsession.cpp.

Referenced by updateStateOnPlayChange(), and updateStateOnScaleChange().

MPEG2TransportStreamFromESSource* ClientTrickPlayState::fTrickPlaySource [private]

Definition at line 61 of file MPEG2TransportFileServerMediaSubsession.cpp.

Referenced by updateStateOnPlayChange(), and updateStateOnScaleChange().

MPEG2TransportStreamFramer* ClientTrickPlayState::fFramer [private]

Definition at line 62 of file MPEG2TransportFileServerMediaSubsession.cpp.

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

float ClientTrickPlayState::fScale [private]

Definition at line 63 of file MPEG2TransportFileServerMediaSubsession.cpp.

Referenced by areChangingScale(), and updateStateOnScaleChange().

float ClientTrickPlayState::fNextScale [private]

Definition at line 63 of file MPEG2TransportFileServerMediaSubsession.cpp.

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

float ClientTrickPlayState::fNPT [private]

Definition at line 63 of file MPEG2TransportFileServerMediaSubsession.cpp.

Referenced by updateStateFromNPT(), and updateStateOnPlayChange().

unsigned long ClientTrickPlayState::fTSRecordNum [private]

Definition at line 64 of file MPEG2TransportFileServerMediaSubsession.cpp.

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

unsigned long ClientTrickPlayState::fIxRecordNum [private]

Definition at line 64 of file MPEG2TransportFileServerMediaSubsession.cpp.

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


The documentation for this class was generated from the following file:
Generated on Tue Oct 7 15:39:37 2008 for live by  doxygen 1.5.2