00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _MPEG2_TRANSPORT_STREAM_INDEX_FILE_HH
00025 #define _MPEG2_TRANSPORT_STREAM_INDEX_FILE_HH
00026
00027 #ifndef _MEDIA_HH
00028 #include "Media.hh"
00029 #endif
00030
00031 #define INDEX_RECORD_SIZE 11
00032
00033 class MPEG2TransportStreamIndexFile: public Medium {
00034 public:
00035 static MPEG2TransportStreamIndexFile* createNew(UsageEnvironment& env,
00036 char const* indexFileName);
00037
00038 virtual ~MPEG2TransportStreamIndexFile();
00039
00040
00041
00042
00043 void lookupTSPacketNumFromNPT(float& npt, unsigned long& tsPacketNumber,
00044 unsigned long& indexRecordNumber);
00045
00046
00047
00048
00049 void lookupPCRFromTSPacketNum(unsigned long& tsPacketNumber, Boolean reverseToPreviousCleanPoint,
00050 float& pcr, unsigned long& indexRecordNumber);
00051
00052
00053
00054
00055
00056 Boolean readIndexRecordValues(unsigned long indexRecordNum,
00057 unsigned long& transportPacketNum, u_int8_t& offset,
00058 u_int8_t& size, float& pcr, u_int8_t& recordType);
00059 float getPlayingDuration();
00060 void stopReading() { closeFid(); }
00061
00062 int mpegVersion();
00063
00064
00065
00066 private:
00067 MPEG2TransportStreamIndexFile(UsageEnvironment& env, char const* indexFileName);
00068
00069 Boolean openFid();
00070 Boolean seekToIndexRecord(unsigned long indexRecordNumber);
00071 Boolean readIndexRecord(unsigned long indexRecordNum);
00072 Boolean readOneIndexRecord(unsigned long indexRecordNum);
00073 void closeFid();
00074
00075 u_int8_t recordTypeFromBuf() { return fBuf[0]; }
00076 u_int8_t offsetFromBuf() { return fBuf[1]; }
00077 u_int8_t sizeFromBuf() { return fBuf[2]; }
00078 float pcrFromBuf();
00079 unsigned long tsPacketNumFromBuf();
00080 void setMPEGVersionFromRecordType(u_int8_t recordType);
00081
00082 Boolean rewindToCleanPoint(unsigned long&ixFound);
00083
00084
00085 private:
00086 char* fFileName;
00087 FILE* fFid;
00088 int fMPEGVersion;
00089 unsigned long fCurrentIndexRecordNum;
00090 float fCachedPCR;
00091 unsigned long fCachedTSPacketNumber, fCachedIndexRecordNumber;
00092 unsigned long fNumIndexRecords;
00093 unsigned char fBuf[INDEX_RECORD_SIZE];
00094 };
00095
00096 #endif