00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _MPEG2_TRANSPORT_STREAM_TRICK_MODE_FILTER_HH
00024 #define _MPEG2_TRANSPORT_STREAM_TRICK_MODE_FILTER_HH
00025
00026 #ifndef _FRAMED_FILTER_HH
00027 #include "FramedFilter.hh"
00028 #endif
00029
00030 #ifndef _MPEG2_TRANSPORT_STREAM_INDEX_FILE_HH
00031 #include "MPEG2TransportStreamIndexFile.hh"
00032 #endif
00033
00034 #ifndef TRANSPORT_PACKET_SIZE
00035 #define TRANSPORT_PACKET_SIZE 188
00036 #endif
00037
00038 class MPEG2TransportStreamTrickModeFilter: public FramedFilter {
00039 public:
00040 static MPEG2TransportStreamTrickModeFilter*
00041 createNew(UsageEnvironment& env, FramedSource* inputSource,
00042 MPEG2TransportStreamIndexFile* indexFile, int scale);
00043
00044 Boolean seekTo(unsigned long tsPacketNumber, unsigned long indexRecordNumber);
00045
00046 unsigned long nextIndexRecordNum() const { return fNextIndexRecordNum; }
00047
00048 void forgetInputSource() { fInputSource = NULL; }
00049
00050
00051 protected:
00052 MPEG2TransportStreamTrickModeFilter(UsageEnvironment& env, FramedSource* inputSource,
00053 MPEG2TransportStreamIndexFile* indexFile, int scale);
00054
00055 virtual ~MPEG2TransportStreamTrickModeFilter();
00056
00057 private:
00058
00059 virtual void doGetNextFrame();
00060 virtual void doStopGettingFrames();
00061
00062 private:
00063 void attemptDeliveryToClient();
00064 void seekToTransportPacket(unsigned long tsPacketNum);
00065 void readTransportPacket(unsigned long tsPacketNum);
00066
00067 static void afterGettingFrame(void* clientData, unsigned frameSize,
00068 unsigned numTruncatedBytes,
00069 struct timeval presentationTime,
00070 unsigned durationInMicroseconds);
00071 void afterGettingFrame1(unsigned frameSize);
00072
00073 static void onSourceClosure(void* clientData);
00074 void onSourceClosure1();
00075
00076 private:
00077 Boolean fHaveStarted;
00078 MPEG2TransportStreamIndexFile* fIndexFile;
00079 int fScale;
00080 int fDirection;
00081 enum {
00082 SKIPPING_FRAME,
00083 DELIVERING_SAVED_FRAME,
00084 SAVING_AND_DELIVERING_FRAME
00085 } fState;
00086 unsigned fFrameCount;
00087 unsigned long fNextIndexRecordNum;
00088 unsigned long fNextTSPacketNum;
00089 unsigned char fInputBuffer[TRANSPORT_PACKET_SIZE];
00090 unsigned long fCurrentTSPacketNum;
00091 unsigned long fDesiredTSPacketNum;
00092 u_int8_t fDesiredDataOffset, fDesiredDataSize;
00093 float fDesiredDataPCR, fFirstPCR;
00094 unsigned long fSavedFrameIndexRecordStart;
00095 unsigned long fSavedSequentialIndexRecordNum;
00096 Boolean fUseSavedFrameNextTime;
00097 };
00098
00099 #endif