1 /** 2 dmxPSPacket.cpp 3 4 */ 5 6 #ifndef DMXPSPACKET_H 7 #define DMXPSPACKET_H 8 9 #include "ADM_coreDemuxerMpeg6_export.h" 10 #include "dmxPacket.h" 11 #include "ADM_Video.h" 12 13 #define PS_PACKET_INLINE 14 15 16 /** 17 \class psPacket 18 */ 19 class ADM_COREDEMUXER6_EXPORT psPacket : public ADMMpegPacket 20 { 21 protected: 22 uint8_t getPacketInfo(uint8_t stream,uint8_t *substream,uint32_t *olen,uint64_t *opts,uint64_t *odts); 23 public: 24 psPacket(void); 25 virtual ~psPacket(); 26 virtual bool open(const char *filenames, int append); 27 virtual bool close(void); 28 virtual bool getPacket(uint32_t maxSize, uint8_t *pid, uint32_t *packetSize,uint64_t *pts,uint64_t *dts,uint8_t *buffer,uint64_t *startAt); 29 virtual uint64_t getPos(void); 30 virtual bool setPos(uint64_t pos); 31 }; 32 /** 33 \class psPacketLinear 34 */ 35 #define ADM_PACKET_LINEAR (300*1024) // TIVO 36 37 class ADM_COREDEMUXER6_EXPORT psPacketLinear : public psPacket 38 { 39 protected: 40 uint8_t myPid; 41 uint64_t startAt; 42 uint32_t bufferLen; 43 uint64_t bufferPts; 44 uint64_t bufferDts; 45 uint32_t bufferIndex; 46 uint8_t buffer[ADM_PACKET_LINEAR]; 47 bool eof; 48 bool refill(void); 49 uint64_t oldStartAt; 50 uint32_t oldBufferLen; 51 uint64_t oldBufferPts; 52 uint64_t oldBufferDts; 53 uint32_t consumed; 54 55 public: 56 psPacketLinear(uint8_t pid); 57 ~psPacketLinear(); 58 uint32_t getConsumed(void); 59 bool sync(uint8_t *pid); 60 bool read(uint32_t len, uint8_t *buffer); 61 bool forward(uint32_t v); stillOk(void)62 bool stillOk(void) {return !eof;}; 63 bool getInfo(dmxPacketInfo *info); 64 bool seek(uint64_t packetStart, uint32_t offset); 65 bool changePid(uint32_t pid) ; 66 #ifndef PS_PACKET_INLINE 67 uint8_t readi8(); 68 uint16_t readi16(); 69 uint32_t readi32(); 70 #else 71 /** 72 \fn readi8 73 */ readi8(void)74 uint8_t readi8(void) 75 { 76 consumed++; 77 if(bufferIndex<bufferLen) 78 { 79 return buffer[bufferIndex++]; 80 } 81 if(false==refill()) 82 { 83 eof=1; 84 return 0; 85 } 86 ADM_assert(bufferLen); 87 bufferIndex=1; 88 return buffer[0]; 89 90 } 91 /** 92 \fn readi16 93 */ readi16(void)94 uint16_t readi16(void) 95 { 96 if(bufferIndex+1<bufferLen) 97 { 98 uint16_t v=(buffer[bufferIndex]<<8)+buffer[bufferIndex+1];; 99 bufferIndex+=2; 100 consumed+=2; 101 return v; 102 } 103 return (readi8()<<8)+readi8(); 104 } 105 /** 106 \fn readi32 107 */ readi32(void)108 uint32_t readi32(void) 109 { 110 if(bufferIndex+3<bufferLen) 111 { 112 uint8_t *p=buffer+bufferIndex; 113 uint32_t v=(p[0]<<24)+(p[1]<<16)+(p[2]<<8)+p[3]; 114 bufferIndex+=4; 115 consumed+=4; 116 return v; 117 } 118 return (readi16()<<16)+readi16(); 119 } 120 #endif 121 }; 122 /** 123 \class packetStats 124 */ 125 typedef struct 126 { 127 uint32_t count; 128 uint32_t size; 129 130 uint64_t startAt; 131 uint32_t startCount; 132 uint32_t startSize; 133 uint64_t startDts; 134 }packetStats; 135 /** 136 \class psPacketLinearTracker 137 \brief Same as psPacketLinear, but keep stats 138 */ 139 class ADM_COREDEMUXER6_EXPORT psPacketLinearTracker : public psPacketLinear 140 { 141 protected: 142 packetStats stats[256]; 143 uint64_t lastVobuEnd; // In 90 Khz tick 144 uint64_t nextVobuEnd; // In 90 Khz tick 145 uint64_t nextVobuStart; 146 uint64_t lastVobuPosition; 147 uint64_t nextVobuPosition; 148 bool decodeVobuPCI(uint32_t size,uint8_t *data); 149 bool decodeVobuDSI(uint32_t size); 150 151 152 public: getLastVobuEndTime(void)153 uint64_t getLastVobuEndTime(void) {return lastVobuEnd > nextVobuStart ? lastVobuEnd-nextVobuStart : 0;} getLastVobuPosition(void)154 uint64_t getLastVobuPosition(void) {return lastVobuPosition;} getNextVobuPosition(void)155 uint64_t getNextVobuPosition(void) {return nextVobuPosition;} 156 psPacketLinearTracker(uint8_t pid); 157 ~psPacketLinearTracker(); 158 packetStats *getStat(int intdex); 159 bool resetStats(void); 160 bool collectStats(uint8_t pid); 161 virtual bool getPacketOfType(uint8_t pid,uint32_t maxSize, uint32_t *packetSize,uint64_t *pts,uint64_t *dts,uint8_t *buffer,uint64_t *startAt); 162 int findStartCode(void); 163 }; 164 165 166 #endif 167