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 reverseToPreviousVSH,
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 private:
00063 MPEG2TransportStreamIndexFile(UsageEnvironment& env, char const* indexFileName);
00064
00065 Boolean openFid();
00066 Boolean seekToIndexRecord(unsigned long indexRecordNumber);
00067 Boolean readIndexRecord(unsigned long indexRecordNum);
00068 Boolean readOneIndexRecord(unsigned long indexRecordNum);
00069 void closeFid();
00070
00071 u_int8_t recordTypeFromBuf() { return fBuf[0]; }
00072 u_int8_t offsetFromBuf() { return fBuf[1]; }
00073 u_int8_t sizeFromBuf() { return fBuf[2]; }
00074 float pcrFromBuf();
00075 unsigned long tsPacketNumFromBuf();
00076
00077 Boolean rewindToVSH(unsigned long&ixFound);
00078
00079
00080 private:
00081 char* fFileName;
00082 FILE* fFid;
00083 unsigned long fCurrentIndexRecordNum;
00084 float fCachedPCR;
00085 unsigned long fCachedTSPacketNumber, fCachedIndexRecordNumber;
00086 unsigned long fNumIndexRecords;
00087 unsigned char fBuf[INDEX_RECORD_SIZE];
00088 };
00089
00090 #endif