#include <MPEG2TransportFileServerMediaSubsession.hh>
Collaboration diagram for ClientTrickPlayState:

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 | |
| MPEG2TransportStreamIndexFile * | fIndexFile |
| ByteStreamFileSource * | fOriginalTransportStreamSource |
| MPEG2TransportStreamTrickModeFilter * | fTrickModeFilter |
| MPEG2TransportStreamFromESSource * | fTrickPlaySource |
| MPEG2TransportStreamFramer * | fFramer |
| float | fScale |
| float | fNextScale |
| float | fNPT |
| unsigned long | fTSRecordNum |
| unsigned long | fIxRecordNum |
Definition at line 102 of file MPEG2TransportFileServerMediaSubsession.hh.
| 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 }
| 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 }
Definition at line 122 of file MPEG2TransportFileServerMediaSubsession.hh.
Referenced by updateStateFromNPT(), updateStateOnPlayChange(), and updateStateOnScaleChange().
Definition at line 123 of file MPEG2TransportFileServerMediaSubsession.hh.
Referenced by reseekOriginalTransportStreamSource(), setSource(), and updateStateOnScaleChange().
Definition at line 124 of file MPEG2TransportFileServerMediaSubsession.hh.
Referenced by updateStateOnPlayChange(), and updateStateOnScaleChange().
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().
1.5.2