7 typedef unsigned char u8;
9 #define PAGE_SIZE 0x1000
11 static void scan_pes(u8 *p, size_t len)
15 int nPacketLen, nStreamID, nDTS, nPTS, nHeaderLen;
18 /* look for a PES start */
19 while (len > 6 && (p[0] || p[1] || p[2] != 1)) { p++; len--; }
21 nPacketLen = p[4] << 8 | p[5];
24 if (p[7] & 0x80) { /* PTS avail */
25 nPTS = (p[ 9] & 0x0E) << 29 ;
27 nPTS |= (p[11] & 0xFE) << 14 ;
29 nPTS |= (p[13] & 0xFE) >> 1 ;
34 if (p[7] & 0x40) { /* DTS avail */
35 nDTS = (p[14] & 0x0E) << 29 ;
37 nDTS |= (p[16] & 0xFE) << 14 ;
39 nDTS |= (p[18] & 0xFE) >> 1 ;
47 printf("offset=0x%x xsize=0x%x stream_id=0x%x len=0x%x headerlen=%d pts=0x%x dts=0x%x\n",
48 (int)(p-p0), (int)(p-p1), nStreamID, nPacketLen, nHeaderLen, nPTS, nDTS);
53 nPacketLen -= nHeaderLen + 3;
58 int main(int argc, char *argv[])
64 fd = open(argv[1], O_RDONLY);
68 p = mmap(NULL, (st.st_size+(PAGE_SIZE-1))&~(PAGE_SIZE-1), PROT_READ, MAP_PRIVATE|MAP_FILE, fd, 0);
70 scan_pes(p, st.st_size);