annotate libmpdemux/mpeg_hdr.c @ 14717:51a7560a92b7

confusing mixture of typecasts and casted variable, removed typecasts
author reimar
date Thu, 17 Feb 2005 15:35:44 +0000
parents 92553e3c8f01
children 0bd50330e688
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2565
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
1
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
2 // based on libmpeg2/header.c by Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
3
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
4 // #include <inttypes.h>
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
5 #include <stdio.h>
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
6
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
7 #include "config.h"
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
8 #include "mpeg_hdr.h"
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
9
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
10 static int frameratecode2framerate[16] = {
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
11 0,
5441
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
12 // Official mpeg1/2 framerates: (1-8)
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
13 24000*10000/1001, 24*10000,25*10000,
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
14 30000*10000/1001, 30*10000,50*10000,
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
15 60000*10000/1001, 60*10000,
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
16 // Xing's 15fps: (9)
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
17 15*10000,
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
18 // libmpeg3's "Unofficial economy rates": (10-13)
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
19 5*10000,10*10000,12*10000,15*10000,
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
20 // some invalid ones: (14-15)
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
21 0,0
2565
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
22 };
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
23
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
24
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
25 int mp_header_process_sequence_header (mp_mpeg_header_t * picture, unsigned char * buffer)
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
26 {
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
27 int width, height;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
28
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
29 if ((buffer[6] & 0x20) != 0x20){
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
30 fprintf(stderr, "missing marker bit!\n");
2565
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
31 return 1; /* missing marker_bit */
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
32 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
33
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
34 height = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2];
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
35
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
36 picture->display_picture_width = (height >> 12);
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
37 picture->display_picture_height = (height & 0xfff);
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
38
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
39 width = ((height >> 12) + 15) & ~15;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
40 height = ((height & 0xfff) + 15) & ~15;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
41
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
42 picture->aspect_ratio_information = buffer[3] >> 4;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
43 picture->frame_rate_code = buffer[3] & 15;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
44 picture->fps=frameratecode2framerate[picture->frame_rate_code];
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
45 picture->bitrate = (buffer[4]<<10)|(buffer[5]<<2)|(buffer[6]>>6);
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
46 picture->mpeg1 = 1;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
47 picture->picture_structure = 3; //FRAME_PICTURE;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
48 picture->display_time=100;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
49 return 0;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
50 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
51
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
52 static int header_process_sequence_extension (mp_mpeg_header_t * picture,
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
53 unsigned char * buffer)
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
54 {
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
55 /* check chroma format, size extensions, marker bit */
12562
83d91a7cba19 mpeg2 chroma422/444 support
iive
parents: 5441
diff changeset
56
83d91a7cba19 mpeg2 chroma422/444 support
iive
parents: 5441
diff changeset
57 if ( ((buffer[1] & 0x06) == 0x00) ||
83d91a7cba19 mpeg2 chroma422/444 support
iive
parents: 5441
diff changeset
58 ((buffer[1] & 0x01) != 0x00) || (buffer[2] & 0xe0) ||
83d91a7cba19 mpeg2 chroma422/444 support
iive
parents: 5441
diff changeset
59 ((buffer[3] & 0x01) != 0x01) )
2565
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
60 return 1;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
61
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
62 picture->progressive_sequence = (buffer[1] >> 3) & 1;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
63 picture->mpeg1 = 0;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
64 return 0;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
65 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
66
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
67 static int header_process_picture_coding_extension (mp_mpeg_header_t * picture, unsigned char * buffer)
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
68 {
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
69 picture->picture_structure = buffer[2] & 3;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
70 picture->top_field_first = buffer[3] >> 7;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
71 picture->repeat_first_field = (buffer[3] >> 1) & 1;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
72 picture->progressive_frame = buffer[4] >> 7;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
73
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
74 // repeat_first implementation by A'rpi/ESP-team, based on libmpeg3:
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
75 picture->display_time=100;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
76 if(picture->repeat_first_field){
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
77 if(picture->progressive_sequence){
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
78 if(picture->top_field_first)
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
79 picture->display_time+=200;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
80 else
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
81 picture->display_time+=100;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
82 } else
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
83 if(picture->progressive_frame){
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
84 picture->display_time+=50;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
85 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
86 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
87 //temopral hack. We calc time on every field, so if we have 2 fields
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
88 // interlaced we'll end with double time for 1 frame
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
89 if( picture->picture_structure!=3 ) picture->display_time/=2;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
90 return 0;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
91 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
92
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
93 int mp_header_process_extension (mp_mpeg_header_t * picture, unsigned char * buffer)
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
94 {
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
95 switch (buffer[0] & 0xf0) {
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
96 case 0x10: /* sequence extension */
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
97 return header_process_sequence_extension (picture, buffer);
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
98 case 0x80: /* picture coding extension */
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
99 return header_process_picture_coding_extension (picture, buffer);
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
100 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
101 return 0;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
102 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
103
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
104
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
105 //MPEG4 HEADERS
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
106 static unsigned char getbits(unsigned char *buffer, unsigned int from, unsigned char len)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
107 {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
108 unsigned int n;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
109 unsigned char m, u, l, y;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
110
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
111 n = from / 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
112 m = from % 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
113 u = 8 - m;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
114 l = (len > u ? len - u : 0);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
115
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
116 y = (buffer[n] << m);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
117 if(8 > len)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
118 y >>= (8-len);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
119 if(l)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
120 y |= (buffer[n+1] >> (8-l));
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
121
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
122 //fprintf(stderr, "GETBITS(%d -> %d): bytes=0x%x 0x%x, n=%d, m=%d, l=%d, u=%d, Y=%d\n",
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
123 // from, (int) len, (int) buffer[n],(int) buffer[n+1], n, (int) m, (int) l, (int) u, (int) y);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
124 return y;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
125 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
126
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
127 static int read_timeinc(mp_mpeg_header_t * picture, unsigned char * buffer, int n)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
128 {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
129 if(picture->timeinc_bits > 8) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
130 picture->timeinc_unit = getbits(buffer, n, picture->timeinc_bits - 8) << 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
131 n += picture->timeinc_bits - 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
132 picture->timeinc_unit |= getbits(buffer, n, 8);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
133 n += 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
134 } else {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
135 picture->timeinc_unit = getbits(buffer, n, picture->timeinc_bits);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
136 n += picture->timeinc_bits;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
137 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
138 //fprintf(stderr, "TIMEINC2: %d, bits: %d\n", picture->timeinc_unit, picture->timeinc_bits);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
139 return n;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
140 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
141
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
142 int mp4_header_process_vol(mp_mpeg_header_t * picture, unsigned char * buffer)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
143 {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
144 unsigned int n, aspect=0, aspectw=0, aspecth=0, x=1, v;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
145
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
146 //begins with 0x0000012x
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
147 picture->fps = 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
148 picture->timeinc_bits = picture->timeinc_resolution = picture->timeinc_unit = 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
149 n = 9;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
150 if(getbits(buffer, n, 1))
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
151 n += 7;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
152 n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
153 aspect=getbits(buffer, n, 4);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
154 n += 4;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
155 if(aspect == 0x0f) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
156 aspectw = getbits(buffer, n, 8);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
157 n += 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
158 aspecth = getbits(buffer, n, 8);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
159 n += 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
160 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
161
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
162 if(getbits(buffer, n, 1)) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
163 n += 4;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
164 if(getbits(buffer, n, 1))
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
165 n += 79;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
166 n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
167 } else n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
168
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
169 n+=3;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
170
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
171 picture->timeinc_resolution = getbits(buffer, n, 8) << 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
172 n += 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
173 picture->timeinc_resolution |= getbits(buffer, n, 8);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
174 n += 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
175
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
176 picture->timeinc_bits = 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
177 v = picture->timeinc_resolution - 1;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
178 while(v && (x<16)) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
179 v>>=1;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
180 picture->timeinc_bits++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
181 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
182 picture->timeinc_bits = (picture->timeinc_bits > 1 ? picture->timeinc_bits : 1);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
183
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
184 n++; //marker bit
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
185
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
186 if(getbits(buffer, n, 1)) { //fixed_vop_timeinc
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
187 n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
188 n = read_timeinc(picture, buffer, n);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
189
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
190 if(picture->timeinc_unit)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
191 picture->fps = (picture->timeinc_resolution * 10000) / picture->timeinc_unit;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
192 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
193
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
194 //fprintf(stderr, "ASPECT: %d, PARW=%d, PARH=%d, TIMEINCRESOLUTION: %d, FIXED_TIMEINC: %d (number of bits: %d), FPS: %u\n",
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
195 // aspect, aspectw, aspecth, picture->timeinc_resolution, picture->timeinc_unit, picture->timeinc_bits, picture->fps);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
196
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
197 return 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
198 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
199
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
200 int mp4_header_process_vop(mp_mpeg_header_t * picture, unsigned char * buffer)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
201 {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
202 int n;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
203 n = 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
204 picture->picture_type = getbits(buffer, n, 2);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
205 n += 2;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
206 while(getbits(buffer, n, 1))
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
207 n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
208 n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
209 getbits(buffer, n, 1);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
210 n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
211 n = read_timeinc(picture, buffer, n);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
212 }