annotate libmpdemux/mpeg_hdr.c @ 27319:09cf111f68b8

Revert to previous dependency checking behavior. Take included header files into account when generating dependency files. This has problems when header files are removed or renamed, but does not silently miscompile files.
author diego
date Sat, 26 Jul 2008 18:36:48 +0000
parents 328d1b36952a
children d643e4643313
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
15225
a8c02eef4972 proper fix
rfelker
parents: 15224
diff changeset
4 #include <inttypes.h>
2565
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
5 #include <stdio.h>
14886
a109ae86ba63 missing #include (for malloc and free)
rathann
parents: 14798
diff changeset
6 #include <stdlib.h>
21947
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
7 #include <string.h>
2565
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
8
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
9 #include "config.h"
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
10 #include "mpeg_hdr.h"
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
11
18398
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
12 #include "mp_msg.h"
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
13
16184
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 15618
diff changeset
14 static float frameratecode2framerate[16] = {
2565
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
15 0,
5441
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
16 // Official mpeg1/2 framerates: (1-8)
16184
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 15618
diff changeset
17 24000.0/1001, 24,25,
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 15618
diff changeset
18 30000.0/1001, 30,50,
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 15618
diff changeset
19 60000.0/1001, 60,
5441
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
20 // Xing's 15fps: (9)
16184
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 15618
diff changeset
21 15,
5441
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
22 // libmpeg3's "Unofficial economy rates": (10-13)
16184
04dd5945fab8 100l to whoever wrote this crap using 1/10000 units. it caused framerates to get trashed from 30000/1001 to 2997/100, etc.!
rfelker
parents: 15618
diff changeset
23 5,10,12,15,
5441
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
24 // some invalid ones: (14-15)
268ea6bda6ff after some STFW i've found some info about fps codes
arpi
parents: 5440
diff changeset
25 0,0
2565
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
26 };
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
27
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
28
24784
328d1b36952a Mark constant argument of mp_header_process_sequence_header as such.
diego
parents: 21953
diff changeset
29 int mp_header_process_sequence_header (mp_mpeg_header_t * picture, const unsigned char * buffer)
2565
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
30 {
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
31 int width, height;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
32
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
33 if ((buffer[6] & 0x20) != 0x20){
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
34 fprintf(stderr, "missing marker bit!\n");
2565
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
35 return 1; /* missing marker_bit */
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
36 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
37
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
38 height = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2];
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
39
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
40 picture->display_picture_width = (height >> 12);
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
41 picture->display_picture_height = (height & 0xfff);
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
42
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
43 width = ((height >> 12) + 15) & ~15;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
44 height = ((height & 0xfff) + 15) & ~15;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
45
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
46 picture->aspect_ratio_information = buffer[3] >> 4;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
47 picture->frame_rate_code = buffer[3] & 15;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
48 picture->fps=frameratecode2framerate[picture->frame_rate_code];
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
49 picture->bitrate = (buffer[4]<<10)|(buffer[5]<<2)|(buffer[6]>>6);
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
50 picture->mpeg1 = 1;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
51 picture->picture_structure = 3; //FRAME_PICTURE;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
52 picture->display_time=100;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
53 return 0;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
54 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
55
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
56 static int header_process_sequence_extension (mp_mpeg_header_t * picture,
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
57 unsigned char * buffer)
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
58 {
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
59 /* check chroma format, size extensions, marker bit */
12562
83d91a7cba19 mpeg2 chroma422/444 support
iive
parents: 5441
diff changeset
60
83d91a7cba19 mpeg2 chroma422/444 support
iive
parents: 5441
diff changeset
61 if ( ((buffer[1] & 0x06) == 0x00) ||
83d91a7cba19 mpeg2 chroma422/444 support
iive
parents: 5441
diff changeset
62 ((buffer[1] & 0x01) != 0x00) || (buffer[2] & 0xe0) ||
83d91a7cba19 mpeg2 chroma422/444 support
iive
parents: 5441
diff changeset
63 ((buffer[3] & 0x01) != 0x01) )
2565
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
64 return 1;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
65
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
66 picture->progressive_sequence = (buffer[1] >> 3) & 1;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
67 picture->mpeg1 = 0;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
68 return 0;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
69 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
70
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
71 static int header_process_picture_coding_extension (mp_mpeg_header_t * picture, unsigned char * buffer)
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
72 {
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
73 picture->picture_structure = buffer[2] & 3;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
74 picture->top_field_first = buffer[3] >> 7;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
75 picture->repeat_first_field = (buffer[3] >> 1) & 1;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
76 picture->progressive_frame = buffer[4] >> 7;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
77
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
78 // repeat_first implementation by A'rpi/ESP-team, based on libmpeg3:
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
79 picture->display_time=100;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
80 if(picture->repeat_first_field){
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
81 if(picture->progressive_sequence){
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
82 if(picture->top_field_first)
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
83 picture->display_time+=200;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
84 else
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
85 picture->display_time+=100;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
86 } else
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
87 if(picture->progressive_frame){
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
88 picture->display_time+=50;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
89 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
90 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
91 //temopral hack. We calc time on every field, so if we have 2 fields
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
92 // interlaced we'll end with double time for 1 frame
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
93 if( picture->picture_structure!=3 ) picture->display_time/=2;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
94 return 0;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
95 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
96
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
97 int mp_header_process_extension (mp_mpeg_header_t * picture, unsigned char * buffer)
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
98 {
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
99 switch (buffer[0] & 0xf0) {
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
100 case 0x10: /* sequence extension */
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
101 return header_process_sequence_extension (picture, buffer);
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
102 case 0x80: /* picture coding extension */
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
103 return header_process_picture_coding_extension (picture, buffer);
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
104 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
105 return 0;
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
106 }
4bc54a0f775f mpeg video header parser
arpi
parents:
diff changeset
107
18398
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
108 float mpeg12_aspect_info(mp_mpeg_header_t *picture)
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
109 {
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
110 float aspect = 0.0;
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
111
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
112 switch(picture->aspect_ratio_information) {
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
113 case 2: // PAL/NTSC SVCD/DVD 4:3
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
114 case 8: // PAL VCD 4:3
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
115 case 12: // NTSC VCD 4:3
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
116 aspect=4.0/3.0;
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
117 break;
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
118 case 3: // PAL/NTSC Widescreen SVCD/DVD 16:9
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
119 case 6: // (PAL?)/NTSC Widescreen SVCD 16:9
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
120 aspect=16.0/9.0;
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
121 break;
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
122 case 4: // according to ISO-138182-2 Table 6.3
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
123 aspect=2.21;
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
124 break;
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
125 case 1: // VGA 1:1 - do not prescale
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
126 case 9: // Movie Type ??? / 640x480
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
127 aspect=0.0;
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
128 break;
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
129 default:
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
130 mp_msg(MSGT_DECVIDEO,MSGL_ERR,"Detected unknown aspect_ratio_information in mpeg sequence header.\n"
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
131 "Please report the aspect value (%i) along with the movie type (VGA,PAL,NTSC,"
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
132 "SECAM) and the movie resolution (720x576,352x240,480x480,...) to the MPlayer"
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
133 " developers, so that we can add support for it!\nAssuming 1:1 aspect for now.\n",
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
134 picture->aspect_ratio_information);
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
135 }
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
136
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
137 return aspect;
a1375e440e92 COSMETICS: moved code to parse mpeg1/2 A/R to mpeg_hdr.c
nicodvb
parents: 17952
diff changeset
138 }
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
139
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
140 //MPEG4 HEADERS
14967
d901658f487d export getbits() as mp_getbits()
nicodvb
parents: 14887
diff changeset
141 unsigned char mp_getbits(unsigned char *buffer, unsigned int from, unsigned char len)
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
142 {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
143 unsigned int n;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
144 unsigned char m, u, l, y;
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 n = from / 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
147 m = from % 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
148 u = 8 - m;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
149 l = (len > u ? len - u : 0);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
150
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
151 y = (buffer[n] << m);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
152 if(8 > len)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
153 y >>= (8-len);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
154 if(l)
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
155 y |= (buffer[n+1] >> (8-l));
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
156
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
157 //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
158 // 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
159 return y;
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
21947
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
162 static inline unsigned int mp_getbits16(unsigned char *buffer, unsigned int from, unsigned char len)
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
163 {
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
164 if(len > 8)
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
165 return (mp_getbits(buffer, from, len - 8) << 8) | mp_getbits(buffer, from + len - 8, 8);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
166 else
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
167 return mp_getbits(buffer, from, len);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
168 }
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
169
14967
d901658f487d export getbits() as mp_getbits()
nicodvb
parents: 14887
diff changeset
170 #define getbits mp_getbits
21947
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
171 #define getbits16 mp_getbits16
14967
d901658f487d export getbits() as mp_getbits()
nicodvb
parents: 14887
diff changeset
172
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
173 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
174 {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
175 if(picture->timeinc_bits > 8) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
176 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
177 n += picture->timeinc_bits - 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
178 picture->timeinc_unit |= getbits(buffer, n, 8);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
179 n += 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
180 } else {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
181 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
182 n += picture->timeinc_bits;
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 //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
185 return n;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
186 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
187
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
188 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
189 {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
190 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
191
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
192 //begins with 0x0000012x
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
193 picture->fps = 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
194 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
195 n = 9;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
196 if(getbits(buffer, n, 1))
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
197 n += 7;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
198 n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
199 aspect=getbits(buffer, n, 4);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
200 n += 4;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
201 if(aspect == 0x0f) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
202 aspectw = getbits(buffer, n, 8);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
203 n += 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
204 aspecth = getbits(buffer, n, 8);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
205 n += 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
206 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
207
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
208 if(getbits(buffer, n, 1)) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
209 n += 4;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
210 if(getbits(buffer, n, 1))
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
211 n += 79;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
212 n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
213 } else n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
214
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
215 n+=3;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
216
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
217 picture->timeinc_resolution = getbits(buffer, n, 8) << 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
218 n += 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
219 picture->timeinc_resolution |= getbits(buffer, n, 8);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
220 n += 8;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
221
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
222 picture->timeinc_bits = 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
223 v = picture->timeinc_resolution - 1;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
224 while(v && (x<16)) {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
225 v>>=1;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
226 picture->timeinc_bits++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
227 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
228 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
229
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
230 n++; //marker bit
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
231
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
232 if(getbits(buffer, n, 1)) { //fixed_vop_timeinc
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
233 n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
234 n = read_timeinc(picture, buffer, n);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
235
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
236 if(picture->timeinc_unit)
16319
798d9be2337f multiplying fps by 10000 is no more necessary (when determining mp4v and h264 framerate)
nicodvb
parents: 16184
diff changeset
237 picture->fps = (float) picture->timeinc_resolution / (float) picture->timeinc_unit;
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
238 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
239
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
240 //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
241 // 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
242
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
243 return 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
244 }
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
245
14887
rathann
parents: 14886
diff changeset
246 void mp4_header_process_vop(mp_mpeg_header_t * picture, unsigned char * buffer)
14477
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
247 {
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
248 int n;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
249 n = 0;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
250 picture->picture_type = getbits(buffer, n, 2);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
251 n += 2;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
252 while(getbits(buffer, n, 1))
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
253 n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
254 n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
255 getbits(buffer, n, 1);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
256 n++;
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
257 n = read_timeinc(picture, buffer, n);
92553e3c8f01 automatic fps calculation for mpeg4 in raw stream/mpeg-ts
nicodvb
parents: 12755
diff changeset
258 }
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
259
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
260 #define min(a, b) ((a) <= (b) ? (a) : (b))
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
261
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
262 static unsigned int read_golomb(unsigned char *buffer, unsigned int *init)
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
263 {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
264 unsigned int x, v = 0, v2 = 0, m, len = 0, n = *init;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
265
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
266 while(getbits(buffer, n++, 1) == 0)
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
267 len++;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
268
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
269 x = len + n;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
270 while(n < x)
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
271 {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
272 m = min(x - n, 8);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
273 v |= getbits(buffer, n, m);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
274 n += m;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
275 if(x - n > 8)
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
276 v <<= 8;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
277 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
278
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
279 v2 = 1;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
280 for(n = 0; n < len; n++)
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
281 v2 <<= 1;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
282 v2 = (v2 - 1) + v;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
283
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
284 //fprintf(stderr, "READ_GOLOMB(%u), V=2^%u + %u-1 = %u\n", *init, len, v, v2);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
285 *init = x;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
286 return v2;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
287 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
288
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
289
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
290 static int h264_parse_vui(mp_mpeg_header_t * picture, unsigned char * buf, unsigned int n)
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
291 {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
292 unsigned int overscan, vsp_color, chroma, timing, fixed_fps;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
293
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
294 if(getbits(buf, n++, 1))
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
295 {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
296 picture->aspect_ratio_information = getbits(buf, n, 8);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
297 n += 8;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
298 if(picture->aspect_ratio_information == 255)
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
299 {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
300 picture->display_picture_width = (getbits(buf, n, 8) << 8) | getbits(buf, n + 8, 8);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
301 n += 16;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
302
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
303 picture->display_picture_height = (getbits(buf, n, 8) << 8) | getbits(buf, n + 8, 8);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
304 n += 16;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
305 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
306 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
307
14887
rathann
parents: 14886
diff changeset
308 if((overscan=getbits(buf, n++, 1)))
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
309 n++;
14887
rathann
parents: 14886
diff changeset
310 if((vsp_color=getbits(buf, n++, 1)))
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
311 {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
312 n += 4;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
313 if(getbits(buf, n++, 1))
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
314 n += 24;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
315 }
14887
rathann
parents: 14886
diff changeset
316 if((chroma=getbits(buf, n++, 1)))
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
317 {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
318 read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
319 read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
320 }
14887
rathann
parents: 14886
diff changeset
321 if((timing=getbits(buf, n++, 1)))
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
322 {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
323 picture->timeinc_unit = (getbits(buf, n, 8) << 24) | (getbits(buf, n+8, 8) << 16) | (getbits(buf, n+16, 8) << 8) | getbits(buf, n+24, 8);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
324 n += 32;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
325
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
326 picture->timeinc_resolution = (getbits(buf, n, 8) << 24) | (getbits(buf, n+8, 8) << 16) | (getbits(buf, n+16, 8) << 8) | getbits(buf, n+24, 8);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
327 n += 32;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
328
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
329 fixed_fps = getbits(buf, n, 1);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
330
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
331 if(picture->timeinc_unit > 0 && picture->timeinc_resolution > 0)
16319
798d9be2337f multiplying fps by 10000 is no more necessary (when determining mp4v and h264 framerate)
nicodvb
parents: 16184
diff changeset
332 picture->fps = (float) picture->timeinc_resolution / (float) picture->timeinc_unit;
17952
7ad7d20cfadc H264: when fixed_fps is set the framerate is expressed in fields per second, so it must be halved
nicodvb
parents: 16319
diff changeset
333 if(fixed_fps)
7ad7d20cfadc H264: when fixed_fps is set the framerate is expressed in fields per second, so it must be halved
nicodvb
parents: 16319
diff changeset
334 picture->fps /= 2;
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
335 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
336
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
337 //fprintf(stderr, "H264_PARSE_VUI, OVESCAN=%u, VSP_COLOR=%u, CHROMA=%u, TIMING=%u, DISPW=%u, DISPH=%u, TIMERES=%u, TIMEINC=%u, FIXED_FPS=%u\n", overscan, vsp_color, chroma, timing, picture->display_picture_width, picture->display_picture_height,
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
338 // picture->timeinc_resolution, picture->timeinc_unit, picture->timeinc_unit, fixed_fps);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
339
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
340 return n;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
341 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
342
21953
62bf4204eed4 in h264_parse_sps() reuse mp_unescape03()
nicodvb
parents: 21947
diff changeset
343 static int mp_unescape03(unsigned char *buf, int len);
62bf4204eed4 in h264_parse_sps() reuse mp_unescape03()
nicodvb
parents: 21947
diff changeset
344
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
345 int h264_parse_sps(mp_mpeg_header_t * picture, unsigned char * buf, int len)
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
346 {
21953
62bf4204eed4 in h264_parse_sps() reuse mp_unescape03()
nicodvb
parents: 21947
diff changeset
347 unsigned int n = 0, v, i, mbh;
15073
28ba6bfcf2dc assign picture->(width,height) when parsing h264
nicodvb
parents: 14967
diff changeset
348 int frame_mbs_only;
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
349
21953
62bf4204eed4 in h264_parse_sps() reuse mp_unescape03()
nicodvb
parents: 21947
diff changeset
350 len = mp_unescape03(buf, len);
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
351
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
352 picture->fps = picture->timeinc_unit = picture->timeinc_resolution = 0;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
353 n = 24;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
354 read_golomb(buf, &n);
15618
1965072518be demux high profile H.264 ES
lorenm
parents: 15225
diff changeset
355 if(buf[0] >= 100){
1965072518be demux high profile H.264 ES
lorenm
parents: 15225
diff changeset
356 if(read_golomb(buf, &n) == 3)
1965072518be demux high profile H.264 ES
lorenm
parents: 15225
diff changeset
357 n++;
1965072518be demux high profile H.264 ES
lorenm
parents: 15225
diff changeset
358 read_golomb(buf, &n);
1965072518be demux high profile H.264 ES
lorenm
parents: 15225
diff changeset
359 read_golomb(buf, &n);
1965072518be demux high profile H.264 ES
lorenm
parents: 15225
diff changeset
360 n++;
1965072518be demux high profile H.264 ES
lorenm
parents: 15225
diff changeset
361 if(getbits(buf, n++, 1)){
1965072518be demux high profile H.264 ES
lorenm
parents: 15225
diff changeset
362 //FIXME scaling matrix
1965072518be demux high profile H.264 ES
lorenm
parents: 15225
diff changeset
363 }
1965072518be demux high profile H.264 ES
lorenm
parents: 15225
diff changeset
364 }
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
365 read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
366 v = read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
367 if(v == 0)
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
368 read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
369 else if(v == 1)
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
370 {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
371 getbits(buf, n++, 1);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
372 read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
373 read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
374 v = read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
375 for(i = 0; i < v; i++)
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
376 read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
377 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
378 read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
379 getbits(buf, n++, 1);
15073
28ba6bfcf2dc assign picture->(width,height) when parsing h264
nicodvb
parents: 14967
diff changeset
380 picture->display_picture_width = 16 *(read_golomb(buf, &n)+1);
28ba6bfcf2dc assign picture->(width,height) when parsing h264
nicodvb
parents: 14967
diff changeset
381 mbh = read_golomb(buf, &n)+1;
28ba6bfcf2dc assign picture->(width,height) when parsing h264
nicodvb
parents: 14967
diff changeset
382 frame_mbs_only = getbits(buf, n++, 1);
28ba6bfcf2dc assign picture->(width,height) when parsing h264
nicodvb
parents: 14967
diff changeset
383 picture->display_picture_height = 16 * (2 - frame_mbs_only) * mbh;
28ba6bfcf2dc assign picture->(width,height) when parsing h264
nicodvb
parents: 14967
diff changeset
384 if(!frame_mbs_only)
14798
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
385 getbits(buf, n++, 1);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
386 getbits(buf, n++, 1);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
387 if(getbits(buf, n++, 1))
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
388 {
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
389 read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
390 read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
391 read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
392 read_golomb(buf, &n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
393 }
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
394 if(getbits(buf, n++, 1))
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
395 n = h264_parse_vui(picture, buf, n);
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
396
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
397 return n;
0bd50330e688 framerate autodetection for H264 in raw/ts streams
nicodvb
parents: 14477
diff changeset
398 }
21947
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
399
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
400 static int mp_unescape03(unsigned char *buf, int len)
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
401 {
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
402 unsigned char *dest;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
403 int i, j, skip;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
404
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
405 dest = malloc(len);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
406 if(! dest)
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
407 return 0;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
408
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
409 j = i = skip = 0;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
410 while(i <= len-3)
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
411 {
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
412 if(buf[i] == 0 && buf[i+1] == 0 && buf[i+2] == 3)
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
413 {
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
414 dest[j] = dest[j+1] = 0;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
415 j += 2;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
416 i += 3;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
417 skip++;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
418 }
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
419 else
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
420 {
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
421 dest[j] = buf[i];
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
422 j++;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
423 i++;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
424 }
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
425 }
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
426 dest[j] = buf[len-2];
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
427 dest[j+1] = buf[len-1];
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
428 len -= skip;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
429 memcpy(buf, dest, len);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
430 free(dest);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
431
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
432 return len;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
433 }
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
434
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
435 int mp_vc1_decode_sequence_header(mp_mpeg_header_t * picture, unsigned char * buf, int len)
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
436 {
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
437 int n, x;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
438
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
439 len = mp_unescape03(buf, len);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
440
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
441 picture->display_picture_width = picture->display_picture_height = 0;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
442 picture->fps = 0;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
443 n = 0;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
444 x = getbits(buf, n, 2);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
445 n += 2;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
446 if(x != 3) //not advanced profile
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
447 return 0;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
448
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
449 getbits16(buf, n, 14);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
450 n += 14;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
451 picture->display_picture_width = getbits16(buf, n, 12) * 2 + 2;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
452 n += 12;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
453 picture->display_picture_height = getbits16(buf, n, 12) * 2 + 2;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
454 n += 12;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
455 getbits(buf, n, 6);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
456 n += 6;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
457 x = getbits(buf, n, 1);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
458 n += 1;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
459 if(x) //display info
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
460 {
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
461 getbits16(buf, n, 14);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
462 n += 14;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
463 getbits16(buf, n, 14);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
464 n += 14;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
465 if(getbits(buf, n++, 1)) //aspect ratio
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
466 {
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
467 x = getbits(buf, n, 4);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
468 n += 4;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
469 if(x == 15)
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
470 {
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
471 getbits16(buf, n, 16);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
472 n += 16;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
473 }
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
474 }
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
475
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
476 if(getbits(buf, n++, 1)) //framerates
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
477 {
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
478 int frexp=0, frnum=0, frden=0;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
479
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
480 if(getbits(buf, n++, 1))
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
481 {
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
482 frexp = getbits16(buf, n, 16);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
483 n += 16;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
484 picture->fps = (double) (frexp+1) / 32.0;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
485 }
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
486 else
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
487 {
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
488 float frates[] = {0, 24000, 25000, 30000, 50000, 60000, 48000, 72000, 0};
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
489 float frdivs[] = {0, 1000, 1001, 0};
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
490
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
491 frnum = getbits(buf, n, 8);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
492 n += 8;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
493 frden = getbits(buf, n, 4);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
494 n += 4;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
495 if((frden == 1 || frden == 2) && (frnum < 8))
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
496 picture->fps = frates[frnum] / frdivs[frden];
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
497 }
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
498 }
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
499 }
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
500
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
501 //free(dest);
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
502 return 1;
df1d03939216 added function to parse vc1 sequence header
nicodvb
parents: 18398
diff changeset
503 }