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