MPEG2TransportStreamTrickModeFilter Class Reference

#include <MPEG2TransportStreamTrickModeFilter.hh>

Inheritance diagram for MPEG2TransportStreamTrickModeFilter:

Inheritance graph
[legend]
Collaboration diagram for MPEG2TransportStreamTrickModeFilter:

Collaboration graph
[legend]

Public Types

typedef void( afterGettingFunc )(void *clientData, unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime, unsigned durationInMicroseconds)
typedef void( onCloseFunc )(void *clientData)

Public Member Functions

Boolean seekTo (unsigned long tsPacketNumber, unsigned long indexRecordNumber)
unsigned long nextIndexRecordNum () const
void forgetInputSource ()
FramedSourceinputSource () const
void getNextFrame (unsigned char *to, unsigned maxSize, afterGettingFunc *afterGettingFunc, void *afterGettingClientData, onCloseFunc *onCloseFunc, void *onCloseClientData)
void stopGettingFrames ()
virtual unsigned maxFrameSize () const
Boolean isCurrentlyAwaitingData () const
virtual Boolean isRTPSource () const
virtual Boolean isMPEG1or2VideoStreamFramer () const
virtual Boolean isMPEG4VideoStreamFramer () const
virtual Boolean isH264VideoStreamFramer () const
virtual Boolean isJPEGVideoSource () const
virtual Boolean isAMRAudioSource () const
UsageEnvironmentenvir () const
char const * name () const
virtual Boolean isSink () const
virtual Boolean isRTCPInstance () const
virtual Boolean isRTSPClient () const
virtual Boolean isRTSPServer () const
virtual Boolean isMediaSession () const
virtual Boolean isServerMediaSession () const
virtual Boolean isDarwinInjector () const

Static Public Member Functions

static MPEG2TransportStreamTrickModeFiltercreateNew (UsageEnvironment &env, FramedSource *inputSource, MPEG2TransportStreamIndexFile *indexFile, int scale)
static Boolean lookupByName (UsageEnvironment &env, char const *sourceName, FramedSource *&resultSource)
static Boolean lookupByName (UsageEnvironment &env, char const *sourceName, MediaSource *&resultSource)
static Boolean lookupByName (UsageEnvironment &env, char const *mediumName, Medium *&resultMedium)
static void handleClosure (void *clientData)
static void close (UsageEnvironment &env, char const *mediumName)
static void close (Medium *medium)

Protected Member Functions

 MPEG2TransportStreamTrickModeFilter (UsageEnvironment &env, FramedSource *inputSource, MPEG2TransportStreamIndexFile *indexFile, int scale)
virtual ~MPEG2TransportStreamTrickModeFilter ()
virtual char const * MIMEtype () const
virtual void getAttributes () const
TaskTokennextTask ()

Static Protected Member Functions

static void afterGetting (FramedSource *source)

Protected Attributes

FramedSourcefInputSource
unsigned char * fTo
unsigned fMaxSize
unsigned fFrameSize
unsigned fNumTruncatedBytes
timeval fPresentationTime
unsigned fDurationInMicroseconds

Private Types

enum  { SKIPPING_FRAME, DELIVERING_SAVED_FRAME, SAVING_AND_DELIVERING_FRAME }

Private Member Functions

virtual void doGetNextFrame ()
virtual void doStopGettingFrames ()
void attemptDeliveryToClient ()
void seekToTransportPacket (unsigned long tsPacketNum)
void readTransportPacket (unsigned long tsPacketNum)
void afterGettingFrame1 (unsigned frameSize)
void onSourceClosure1 ()

Static Private Member Functions

static void afterGettingFrame (void *clientData, unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime, unsigned durationInMicroseconds)
static void onSourceClosure (void *clientData)

Private Attributes

Boolean fHaveStarted
MPEG2TransportStreamIndexFilefIndexFile
int fScale
int fDirection
enum MPEG2TransportStreamTrickModeFilter:: { ... }  fState
unsigned fFrameCount
unsigned long fNextIndexRecordNum
unsigned long fNextTSPacketNum
unsigned char fInputBuffer [TRANSPORT_PACKET_SIZE]
unsigned long fCurrentTSPacketNum
unsigned long fDesiredTSPacketNum
u_int8_t fDesiredDataOffset
u_int8_t fDesiredDataSize
float fDesiredDataPCR
float fFirstPCR
unsigned long fSavedFrameIndexRecordStart
unsigned long fSavedSequentialIndexRecordNum

Detailed Description

Definition at line 38 of file MPEG2TransportStreamTrickModeFilter.hh.


Member Typedef Documentation

typedef void( FramedSource::afterGettingFunc)(void *clientData, unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime, unsigned durationInMicroseconds) [inherited]

Definition at line 36 of file FramedSource.hh.

typedef void( FramedSource::onCloseFunc)(void *clientData) [inherited]

Definition at line 40 of file FramedSource.hh.


Member Enumeration Documentation

anonymous enum [private]

Enumerator:
SKIPPING_FRAME 
DELIVERING_SAVED_FRAME 
SAVING_AND_DELIVERING_FRAME 

Definition at line 81 of file MPEG2TransportStreamTrickModeFilter.hh.


Constructor & Destructor Documentation

MPEG2TransportStreamTrickModeFilter::MPEG2TransportStreamTrickModeFilter ( UsageEnvironment env,
FramedSource inputSource,
MPEG2TransportStreamIndexFile indexFile,
int  scale 
) [protected]

Definition at line 34 of file MPEG2TransportStreamTrickModeFilter.cpp.

00036   : FramedFilter(env, inputSource),
00037     fHaveStarted(False), fIndexFile(indexFile), fScale(scale), fDirection(1),
00038     fState(SKIPPING_FRAME), fFrameCount(0),
00039     fNextIndexRecordNum(0), fNextTSPacketNum(0),
00040     fCurrentTSPacketNum((unsigned long)(-1)) {
00041   if (fScale < 0) { // reverse play
00042     fScale = -fScale;
00043     fDirection = -1;
00044   }
00045 }

MPEG2TransportStreamTrickModeFilter::~MPEG2TransportStreamTrickModeFilter (  )  [protected, virtual]

Definition at line 47 of file MPEG2TransportStreamTrickModeFilter.cpp.

00047                                                                           {
00048 }


Member Function Documentation

MPEG2TransportStreamTrickModeFilter * MPEG2TransportStreamTrickModeFilter::createNew ( UsageEnvironment env,
FramedSource inputSource,
MPEG2TransportStreamIndexFile indexFile,
int  scale 
) [static]

Definition at line 28 of file MPEG2TransportStreamTrickModeFilter.cpp.

References env.

Referenced by main(), and ClientTrickPlayState::updateStateOnScaleChange().

00029                                                                  {
00030   return new MPEG2TransportStreamTrickModeFilter(env, inputSource, indexFile, scale);
00031 }

Boolean MPEG2TransportStreamTrickModeFilter::seekTo ( unsigned long  tsPacketNumber,
unsigned long  indexRecordNumber 
)

Definition at line 50 of file MPEG2TransportStreamTrickModeFilter.cpp.

References fNextIndexRecordNum, seekToTransportPacket(), and True.

Referenced by main(), and ClientTrickPlayState::updateStateOnScaleChange().

00051                                                                                      {
00052   seekToTransportPacket(tsPacketNumber);
00053   fNextIndexRecordNum = indexRecordNumber;
00054   return True;
00055 }

unsigned long MPEG2TransportStreamTrickModeFilter::nextIndexRecordNum (  )  const [inline]

Definition at line 46 of file MPEG2TransportStreamTrickModeFilter.hh.

References fNextIndexRecordNum.

Referenced by ClientTrickPlayState::updateStateOnPlayChange().

00046 { return fNextIndexRecordNum; }

void MPEG2TransportStreamTrickModeFilter::forgetInputSource (  )  [inline]

Definition at line 48 of file MPEG2TransportStreamTrickModeFilter.hh.

References FramedFilter::fInputSource, and NULL.

Referenced by ClientTrickPlayState::updateStateOnScaleChange().

00048 { fInputSource = NULL; }

void MPEG2TransportStreamTrickModeFilter::doGetNextFrame (  )  [private, virtual]

Implements FramedSource.

Definition at line 61 of file MPEG2TransportStreamTrickModeFilter.cpp.

References FramedSource::afterGetting(), attemptDeliveryToClient(), DELIVERING_SAVED_FRAME, False, fDesiredDataOffset, fDesiredDataPCR, fDesiredDataSize, fDesiredTSPacketNum, fDirection, fFirstPCR, fFrameCount, FramedSource::fFrameSize, fHaveStarted, fIndexFile, FramedSource::fMaxSize, fNextIndexRecordNum, fSavedFrameIndexRecordStart, fSavedSequentialIndexRecordNum, fScale, fState, isIFrameStart, isNonIFrameStart, onSourceClosure1(), MPEG2TransportStreamIndexFile::readIndexRecordValues(), SAVING_AND_DELIVERING_FRAME, SKIPPING_FRAME, TRANSPORT_PACKET_SIZE, and True.

00061                                                          {
00062   //  fprintf(stderr, "#####DGNF1\n");
00063   // If our client's buffer size is too small, then deliver
00064   // a 0-byte 'frame', to tell it to process all of the data that it has
00065   // already read, before asking for more data from us:
00066   if (fMaxSize < TRANSPORT_PACKET_SIZE) {
00067     fFrameSize = 0;
00068     afterGetting(this);
00069     return;
00070   }
00071 
00072   while (1) {
00073     // Get the next record from our index file.
00074     // This tells us the type of frame this data is, which Transport Stream packet
00075     // (from the input source) the data comes from, and where in the Transport Stream
00076     // packet it comes from:
00077     u_int8_t recordType;
00078     float recordPCR;
00079     Boolean endOfIndexFile = False;
00080     if (!fIndexFile->readIndexRecordValues(fNextIndexRecordNum,
00081                                            fDesiredTSPacketNum, fDesiredDataOffset,
00082                                            fDesiredDataSize, recordPCR,
00083                                            recordType)) {
00084       // We ran off the end of the index file.  If we're not delivering a
00085       // pre-saved frame, then handle this the same way as if the
00086       // input Transport Stream source ended.
00087       if (fState != DELIVERING_SAVED_FRAME) {
00088         onSourceClosure1();
00089         return;
00090       }
00091       endOfIndexFile = True;
00092     } else if (!fHaveStarted) {
00093       fFirstPCR = recordPCR;
00094       fHaveStarted = True;
00095     }
00096     //    fprintf(stderr, "#####read index record %ld: ts %ld: %c, PCR %f\n", fNextIndexRecordNum, fDesiredTSPacketNum, isIFrameStart(recordType) ? 'I' : isNonIFrameStart(recordType) ? 'j' : 'x', recordPCR);
00097     fNextIndexRecordNum
00098       += (fState == DELIVERING_SAVED_FRAME) ? 1 : fDirection;
00099 
00100     // Handle this index record, depending on the record type and our current state:
00101     switch (fState) {
00102     case SKIPPING_FRAME:
00103     case SAVING_AND_DELIVERING_FRAME: {
00104       //      if (fState == SKIPPING_FRAME) fprintf(stderr, "\tSKIPPING_FRAME\n"); else fprintf(stderr, "\tSAVING_AND_DELIVERING_FRAME\n");//#####
00105       if (isIFrameStart(recordType)) {
00106         // Save a record of this frame:
00107         fSavedFrameIndexRecordStart = fNextIndexRecordNum - fDirection;
00108         //      fprintf(stderr, "\trecording\n");//#####
00109         if ((fFrameCount++)%fScale == 0) {
00110           // A frame is due now.
00111           fFrameCount = 1; // reset to avoid overflow
00112           if (fDirection > 0) {
00113             // Begin delivering this frame, as we're scanning it:
00114             fState = SAVING_AND_DELIVERING_FRAME;
00115             //      fprintf(stderr, "\tdelivering\n");//#####
00116             fDesiredDataPCR = recordPCR; // use this frame's PCR
00117             attemptDeliveryToClient();
00118             return;
00119           } else {
00120             // Deliver this frame, then resume normal scanning:
00121             // (This relies on the index records having begun with an I-frame.)
00122             fState = DELIVERING_SAVED_FRAME;
00123             fSavedSequentialIndexRecordNum = fNextIndexRecordNum;
00124             fDesiredDataPCR = recordPCR;
00125             // use this frame's (not the saved frame's) PCR
00126             fNextIndexRecordNum = fSavedFrameIndexRecordStart;
00127             //      fprintf(stderr, "\tbeginning delivery of saved frame\n");//#####
00128           }
00129         } else {
00130           // No frame is needed now:
00131           fState = SKIPPING_FRAME;
00132         }
00133       } else if (isNonIFrameStart(recordType)) {
00134         if ((fFrameCount++)%fScale == 0) {
00135           // A frame is due now, so begin delivering the one that we had saved:
00136           // (This relies on the index records having begun with an I-frame.)
00137           fFrameCount = 1; // reset to avoid overflow
00138           fState = DELIVERING_SAVED_FRAME;
00139           fSavedSequentialIndexRecordNum = fNextIndexRecordNum;
00140           fDesiredDataPCR = recordPCR;
00141           // use this frame's (not the saved frame's) PCR
00142           fNextIndexRecordNum = fSavedFrameIndexRecordStart;
00143           //      fprintf(stderr, "\tbeginning delivery of saved frame\n");//#####
00144         } else {
00145           // No frame is needed now:
00146           fState = SKIPPING_FRAME;
00147         }
00148       } else {
00149         // Not the start of a frame, but deliver it, if it's needed:
00150         if (fState == SAVING_AND_DELIVERING_FRAME) {
00151           //      fprintf(stderr, "\tdelivering\n");//#####
00152           fDesiredDataPCR = recordPCR; // use this frame's PCR
00153           attemptDeliveryToClient();
00154           return;
00155         }
00156       }
00157       break;
00158     }
00159     case DELIVERING_SAVED_FRAME: {
00160       //      fprintf(stderr, "\tDELIVERING_SAVED_FRAME\n");//#####
00161       if (endOfIndexFile
00162           || (isIFrameStart(recordType)
00163               && fNextIndexRecordNum-1 != fSavedFrameIndexRecordStart)
00164           || isNonIFrameStart(recordType)) {
00165         //      fprintf(stderr, "\tended delivery of saved frame\n");//#####
00166         // We've reached the end of the saved frame, so revert to the
00167         // original sequence of index records:
00168         fNextIndexRecordNum = fSavedSequentialIndexRecordNum;
00169         fState = SKIPPING_FRAME;
00170       } else {
00171         // Continue delivering:
00172         //      fprintf(stderr, "\tdelivering\n");//#####
00173         attemptDeliveryToClient();
00174         return;
00175       }
00176       break;
00177     }
00178     }
00179   }
00180 }

void MPEG2TransportStreamTrickModeFilter::doStopGettingFrames (  )  [private, virtual]

Reimplemented from FramedFilter.

Definition at line 182 of file MPEG2TransportStreamTrickModeFilter.cpp.

References FramedFilter::doStopGettingFrames(), fIndexFile, and MPEG2TransportStreamIndexFile::stopReading().

00182                                                               {
00183   FramedFilter::doStopGettingFrames();
00184   fIndexFile->stopReading();
00185 }

void MPEG2TransportStreamTrickModeFilter::attemptDeliveryToClient (  )  [private]

Definition at line 187 of file MPEG2TransportStreamTrickModeFilter.cpp.

References FramedSource::afterGetting(), fCurrentTSPacketNum, fDesiredDataOffset, fDesiredDataPCR, fDesiredDataSize, fDesiredTSPacketNum, fDirection, fFirstPCR, FramedSource::fFrameSize, fInputBuffer, FramedSource::fPresentationTime, fScale, FramedSource::fTo, and readTransportPacket().

Referenced by afterGettingFrame1(), and doGetNextFrame().

00187                                                                   {
00188   if (fCurrentTSPacketNum == fDesiredTSPacketNum) {
00189     //    fprintf(stderr, "\t\tdelivering ts %d:%d, %d bytes, PCR %f\n", fCurrentTSPacketNum, fDesiredDataOffset, fDesiredDataSize, fDesiredDataPCR);//#####
00190     // We already have the Transport Packet that we want.  Deliver its data:
00191     memmove(fTo, &fInputBuffer[fDesiredDataOffset], fDesiredDataSize);
00192     fFrameSize = fDesiredDataSize;
00193     float deliveryPCR = fDirection*(fDesiredDataPCR - fFirstPCR)/fScale;
00194     if (deliveryPCR < 0.0) deliveryPCR = 0.0;
00195     fPresentationTime.tv_sec = (unsigned long)deliveryPCR;
00196     fPresentationTime.tv_usec
00197       = (unsigned long)((deliveryPCR - fPresentationTime.tv_sec)*1000000.0f);
00198     //    fprintf(stderr, "#####DGNF9\n");
00199 
00200     afterGetting(this);
00201   } else {
00202     // Arrange to read the Transport Packet that we want:
00203     readTransportPacket(fDesiredTSPacketNum);
00204   }
00205 }

void MPEG2TransportStreamTrickModeFilter::seekToTransportPacket ( unsigned long  tsPacketNum  )  [private]

Definition at line 207 of file MPEG2TransportStreamTrickModeFilter.cpp.

References FramedFilter::fInputSource, fNextTSPacketNum, ByteStreamFileSource::seekToByteAbsolute(), and TRANSPORT_PACKET_SIZE.

Referenced by readTransportPacket(), and seekTo().

00207                                                                                          {
00208   if (tsPacketNum == fNextTSPacketNum) return; // we're already there
00209 
00210   ByteStreamFileSource* tsFile = (ByteStreamFileSource*)fInputSource;
00211   u_int64_t tsPacketNum64 = (u_int64_t)tsPacketNum;
00212   tsFile->seekToByteAbsolute(tsPacketNum64*TRANSPORT_PACKET_SIZE);
00213 
00214   fNextTSPacketNum = tsPacketNum;
00215 }

void MPEG2TransportStreamTrickModeFilter::readTransportPacket ( unsigned long  tsPacketNum  )  [private]

Definition at line 217 of file MPEG2TransportStreamTrickModeFilter.cpp.

References afterGettingFrame(), fInputBuffer, FramedFilter::fInputSource, FramedSource::getNextFrame(), onSourceClosure(), seekToTransportPacket(), and TRANSPORT_PACKET_SIZE.

Referenced by attemptDeliveryToClient().

00217                                                                                        {
00218   seekToTransportPacket(tsPacketNum);
00219   fInputSource->getNextFrame(fInputBuffer, TRANSPORT_PACKET_SIZE,
00220                              afterGettingFrame, this,
00221                              onSourceClosure, this);
00222 }

void MPEG2TransportStreamTrickModeFilter::afterGettingFrame ( void *  clientData,
unsigned  frameSize,
unsigned  numTruncatedBytes,
struct timeval  presentationTime,
unsigned  durationInMicroseconds 
) [static, private]

Definition at line 225 of file MPEG2TransportStreamTrickModeFilter.cpp.

References afterGettingFrame1().

Referenced by readTransportPacket().

00228                                                          {
00229   MPEG2TransportStreamTrickModeFilter* filter = (MPEG2TransportStreamTrickModeFilter*)clientData;
00230   filter->afterGettingFrame1(frameSize);
00231 }

void MPEG2TransportStreamTrickModeFilter::afterGettingFrame1 ( unsigned  frameSize  )  [private]

Definition at line 233 of file MPEG2TransportStreamTrickModeFilter.cpp.

References attemptDeliveryToClient(), fCurrentTSPacketNum, fNextTSPacketNum, onSourceClosure1(), and TRANSPORT_PACKET_SIZE.

Referenced by afterGettingFrame().

00233                                                                                {
00234   if (frameSize != TRANSPORT_PACKET_SIZE) {
00235     // Treat this as if the input source ended:
00236     onSourceClosure1();
00237     return;
00238   }
00239 
00240   fCurrentTSPacketNum = fNextTSPacketNum; // i.e., the one that we just read
00241   ++fNextTSPacketNum;
00242 
00243   // Attempt deliver again:
00244   attemptDeliveryToClient();
00245 }

void MPEG2TransportStreamTrickModeFilter::onSourceClosure ( void *  clientData  )  [static, private]

Definition at line 247 of file MPEG2TransportStreamTrickModeFilter.cpp.

References onSourceClosure1().

Referenced by readTransportPacket().

00247                                                                           {
00248   MPEG2TransportStreamTrickModeFilter* filter = (MPEG2TransportStreamTrickModeFilter*)clientData;
00249   filter->onSourceClosure1();
00250 }

void MPEG2TransportStreamTrickModeFilter::onSourceClosure1 (  )  [private]

Definition at line 252 of file MPEG2TransportStreamTrickModeFilter.cpp.

References fIndexFile, FramedSource::handleClosure(), and MPEG2TransportStreamIndexFile::stopReading().

Referenced by afterGettingFrame1(), doGetNextFrame(), and onSourceClosure().

00252                                                            {
00253   fIndexFile->stopReading();
00254   FramedSource::handleClosure(this);
00255 }

FramedSource* FramedFilter::inputSource (  )  const [inline, inherited]

Definition at line 30 of file FramedFilter.hh.

References FramedFilter::fInputSource.

Referenced by AC3AudioStreamFramer::AC3AudioStreamFramer(), EndianSwap16::createNew(), HostFromNetworkOrder16::createNew(), NetworkFromHostOrder16::createNew(), PCMFromuLawAudioSource::createNew(), QCELPDeinterleaver::createNew(), MPEG4VideoStreamFramer::createNew(), MPEG4VideoStreamDiscreteFramer::createNew(), MPEG2IFrameIndexFromTransportStream::createNew(), MPEG1or2VideoStreamFramer::createNew(), MPEG1or2VideoStreamDiscreteFramer::createNew(), MPEG1or2AudioStreamFramer::createNew(), MP3Transcoder::createNew(), MP3ADUTranscoder::createNew(), MP3ADUdeinterleaver::createNew(), MP3ADUinterleaver::createNew(), MP3FromADUSource::createNew(), ADUFromMP3Source::createNew(), H263plusVideoStreamFramer::createNew(), AC3AudioStreamFramer::createNew(), H264VideoRTPSink::doSpecialFrameHandling(), MP3ADUinterleaverBase::getInputSource(), H263plusVideoStreamFramer::H263plusVideoStreamFramer(), MPEG1or2VideoStreamFramer::MPEG1or2VideoStreamFramer(), MPEG4VideoStreamFramer::MPEG4VideoStreamFramer(), MP3AudioFileServerMediaSubsession::seekStreamSource(), ClientTrickPlayState::setSource(), and MP3AudioFileServerMediaSubsession::setStreamSourceScale().

00030 { return fInputSource; }

char const * FramedFilter::MIMEtype (  )  const [protected, virtual, inherited]

Reimplemented from MediaSource.

Reimplemented in ADUFromMP3Source, and MP3FromADUSource.

Definition at line 39 of file FramedFilter.cpp.

References FramedFilter::fInputSource, MediaSource::MIMEtype(), and NULL.

00039                                          {
00040   if (fInputSource == NULL) return "";
00041 
00042   return fInputSource->MIMEtype();
00043 }

void FramedFilter::getAttributes (  )  const [protected, virtual, inherited]

Reimplemented from MediaSource.

Reimplemented in MP3ADUTranscoder.

Definition at line 45 of file FramedFilter.cpp.

References FramedFilter::fInputSource, MediaSource::getAttributes(), and NULL.

00045                                        {
00046   if (fInputSource != NULL) fInputSource->getAttributes();
00047 }

Boolean FramedSource::lookupByName ( UsageEnvironment env,
char const *  sourceName,
FramedSource *&  resultSource 
) [static, inherited]

Definition at line 41 of file FramedSource.cpp.

References env, False, MediaSource::isFramedSource(), MediaSource::lookupByName(), NULL, and True.

Referenced by MP3ADUinterleaverBase::getInputSource().

00042                                                                 {
00043   resultSource = NULL; // unless we succeed
00044 
00045   MediaSource* source;
00046   if (!MediaSource::lookupByName(env, sourceName, source)) return False;
00047 
00048   if (!source->isFramedSource()) {
00049     env.setResultMsg(sourceName, " is not a framed source");
00050     return False;
00051   }
00052 
00053   resultSource = (FramedSource*)source;
00054   return True;
00055 }

Boolean MediaSource::lookupByName ( UsageEnvironment env,
char const *  sourceName,
MediaSource *&  resultSource 
) [static, inherited]

Definition at line 62 of file MediaSource.cpp.

References env, False, Medium::isSource(), Medium::lookupByName(), NULL, and True.

Referenced by RTPSource::lookupByName(), and FramedSource::lookupByName().

00064                                                               {
00065   resultSource = NULL; // unless we succeed
00066 
00067   Medium* medium;
00068   if (!Medium::lookupByName(env, sourceName, medium)) return False;
00069 
00070   if (!medium->isSource()) {
00071     env.setResultMsg(sourceName, " is not a media source");
00072     return False;
00073   }
00074 
00075   resultSource = (MediaSource*)medium;
00076   return True;
00077 }

Boolean Medium::lookupByName ( UsageEnvironment env,
char const *  mediumName,
Medium *&  resultMedium 
) [static, inherited]

Definition at line 65 of file Media.cpp.

References env, False, MediaLookupTable::lookup(), NULL, MediaLookupTable::ourMedia(), UsageEnvironment::setResultMsg(), and True.

Referenced by ServerMediaSession::lookupByName(), RTSPServer::lookupByName(), RTSPClient::lookupByName(), RTCPInstance::lookupByName(), MediaSource::lookupByName(), MediaSink::lookupByName(), MediaSession::lookupByName(), and DarwinInjector::lookupByName().

00066                                                          {
00067   resultMedium = MediaLookupTable::ourMedia(env)->lookup(mediumName);
00068   if (resultMedium == NULL) {
00069     env.setResultMsg("Medium ", mediumName, " does not exist");
00070     return False;
00071   }
00072 
00073   return True;
00074 }

void FramedSource::getNextFrame ( unsigned char *  to,
unsigned  maxSize,
afterGettingFunc afterGettingFunc,
void *  afterGettingClientData,
onCloseFunc onCloseFunc,
void *  onCloseClientData 
) [inherited]

Definition at line 57 of file FramedSource.cpp.

References FramedSource::doGetNextFrame(), Medium::envir(), FramedSource::fAfterGettingClientData, FramedSource::fAfterGettingFunc, FramedSource::fDurationInMicroseconds, FramedSource::fIsCurrentlyAwaitingData, FramedSource::fMaxSize, FramedSource::fNumTruncatedBytes, FramedSource::fOnCloseClientData, FramedSource::fOnCloseFunc, FramedSource::fTo, and True.

Referenced by MPEG2TransportStreamFramer::afterGettingFrame1(), InputESSourceRecord::askForNewData(), MPEG2TransportStreamFromPESSource::awaitNewBuffer(), QuickTimeFileSink::continuePlaying(), DummySink::continuePlaying(), HTTPSink::continuePlaying(), FileSink::continuePlaying(), AVIFileSink::continuePlaying(), BasicUDPSink::continuePlaying1(), EndianSwap16::doGetNextFrame(), HostFromNetworkOrder16::doGetNextFrame(), NetworkFromHostOrder16::doGetNextFrame(), PCMFromuLawAudioSource::doGetNextFrame(), uLawFromPCMAudioSource::doGetNextFrame(), QCELPDeinterleaver::doGetNextFrame(), MPEG4VideoStreamDiscreteFramer::doGetNextFrame(), MPEG2TransportStreamFramer::doGetNextFrame(), MPEG2IFrameIndexFromTransportStream::doGetNextFrame(), MPEG1or2VideoStreamDiscreteFramer::doGetNextFrame(), MP3ADUTranscoder::doGetNextFrame(), MP3ADUdeinterleaver::doGetNextFrame(), MP3ADUinterleaver::doGetNextFrame(), H264FUAFragmenter::doGetNextFrame(), ByteStreamMultiFileSource::doGetNextFrame(), AMRDeinterleaver::doGetNextFrame(), SegmentQueue::enqueueNewSegment(), StreamParser::ensureValidBytes1(), MultiFramedRTPSink::packFrame(), AC3AudioStreamParser::readAndSaveAFrame(), and readTransportPacket().

00061                                                          {
00062   // Make sure we're not already being read:
00063   if (fIsCurrentlyAwaitingData) {
00064     envir() << "FramedSource[" << this << "]::getNextFrame(): attempting to read more than once at the same time!\n";
00065     exit(1);
00066   }
00067 
00068   fTo = to;
00069   fMaxSize = maxSize;
00070   fNumTruncatedBytes = 0; // by default; could be changed by doGetNextFrame()
00071   fDurationInMicroseconds = 0; // by default; could be changed by doGetNextFrame()
00072   fAfterGettingFunc = afterGettingFunc;
00073   fAfterGettingClientData = afterGettingClientData;
00074   fOnCloseFunc = onCloseFunc;
00075   fOnCloseClientData = onCloseClientData;
00076   fIsCurrentlyAwaitingData = True;
00077 
00078   doGetNextFrame();
00079 }

void FramedSource::handleClosure ( void *  clientData  )  [static, inherited]

Definition at line 95 of file FramedSource.cpp.

References False, FramedSource::fIsCurrentlyAwaitingData, FramedSource::fOnCloseClientData, FramedSource::fOnCloseFunc, and NULL.

Referenced by MPEG2TransportStreamFramer::afterGettingFrame1(), MP3ADUTranscoder::afterGettingFrame1(), InputESSourceRecord::askForNewData(), MPEG2TransportStreamFromPESSource::awaitNewBuffer(), WAVAudioFileSource::doGetNextFrame(), EndianSwap16::doGetNextFrame(), HostFromNetworkOrder16::doGetNextFrame(), NetworkFromHostOrder16::doGetNextFrame(), PCMFromuLawAudioSource::doGetNextFrame(), uLawFromPCMAudioSource::doGetNextFrame(), QCELPDeinterleaver::doGetNextFrame(), MPEG4VideoStreamDiscreteFramer::doGetNextFrame(), MPEG2TransportStreamFramer::doGetNextFrame(), MPEG1or2VideoStreamDiscreteFramer::doGetNextFrame(), MPEG1or2DemuxedElementaryStream::doGetNextFrame(), MP3FileSource::doGetNextFrame(), MP3ADUTranscoder::doGetNextFrame(), MP3ADUdeinterleaver::doGetNextFrame(), MP3ADUinterleaver::doGetNextFrame(), ADUFromMP3Source::doGetNextFrame(), H264FUAFragmenter::doGetNextFrame(), DeviceSource::doGetNextFrame(), ByteStreamMultiFileSource::doGetNextFrame(), ByteStreamFileSource::doGetNextFrame(), AMRDeinterleaver::doGetNextFrame(), AMRAudioFileSource::doGetNextFrame(), ADTSAudioFileSource::doGetNextFrame(), ByteStreamFileSource::doReadFromFile(), SegmentQueue::enqueueNewSegment(), MPEG2IFrameIndexFromTransportStream::handleInputClosure1(), and onSourceClosure1().

00095                                                  {
00096   FramedSource* source = (FramedSource*)clientData;
00097   source->fIsCurrentlyAwaitingData = False; // because we got a close instead
00098   if (source->fOnCloseFunc != NULL) {
00099     (*(source->fOnCloseFunc))(source->fOnCloseClientData);
00100   }
00101 }

void FramedSource::stopGettingFrames (  )  [inherited]

Definition at line 103 of file FramedSource.cpp.

References FramedSource::doStopGettingFrames(), False, and FramedSource::fIsCurrentlyAwaitingData.

Referenced by MPEG2TransportStreamFromPESSource::doStopGettingFrames(), FramedFilter::doStopGettingFrames(), AMRDeinterleaver::doStopGettingFrames(), and MediaSink::stopPlaying().

00103                                      {
00104   fIsCurrentlyAwaitingData = False; // indicates that we can be read again
00105 
00106   // Perform any specialized action now:
00107   doStopGettingFrames();
00108 }