summaryrefslogtreecommitdiff
path: root/apps/plugins/mpegplayer/header.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/mpegplayer/header.c')
-rw-r--r--apps/plugins/mpegplayer/header.c592
1 files changed, 427 insertions, 165 deletions
diff --git a/apps/plugins/mpegplayer/header.c b/apps/plugins/mpegplayer/header.c
index 664be4badb..52a301f8d8 100644
--- a/apps/plugins/mpegplayer/header.c
+++ b/apps/plugins/mpegplayer/header.c
@@ -40,7 +40,8 @@ extern struct plugin_api* rb;
40#define PIC_CODING_EXT 0x100 40#define PIC_CODING_EXT 0x100
41 41
42/* default intra quant matrix, in zig-zag order */ 42/* default intra quant matrix, in zig-zag order */
43static const uint8_t default_intra_quantizer_matrix[64] = { 43static const uint8_t default_intra_quantizer_matrix[64] =
44{
44 8, 45 8,
45 16, 16, 46 16, 16,
46 19, 16, 19, 47 19, 16, 19,
@@ -58,20 +59,30 @@ static const uint8_t default_intra_quantizer_matrix[64] = {
58 83 59 83
59}; 60};
60 61
61const uint8_t default_mpeg2_scan_norm[64] = { 62const uint8_t default_mpeg2_scan_norm[64] =
63{
62 /* Zig-Zag scan pattern */ 64 /* Zig-Zag scan pattern */
63 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 65 0, 1, 8, 16, 9, 2, 3, 10,
64 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 66 17, 24, 32, 25, 18, 11, 4, 5,
65 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 67 12, 19, 26, 33, 40, 48, 41, 34,
66 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63 68 27, 20, 13, 6, 7, 14, 21, 28,
69 35, 42, 49, 56, 57, 50, 43, 36,
70 29, 22, 15, 23, 30, 37, 44, 51,
71 58, 59, 52, 45, 38, 31, 39, 46,
72 53, 60, 61, 54, 47, 55, 62, 63
67}; 73};
68 74
69const uint8_t default_mpeg2_scan_alt[64] = { 75const uint8_t default_mpeg2_scan_alt[64] =
76{
70 /* Alternate scan pattern */ 77 /* Alternate scan pattern */
71 0, 8, 16, 24, 1, 9, 2, 10, 17, 25, 32, 40, 48, 56, 57, 49, 78 0, 8, 16, 24, 1, 9, 2, 10,
72 41, 33, 26, 18, 3, 11, 4, 12, 19, 27, 34, 42, 50, 58, 35, 43, 79 17, 25, 32, 40, 48, 56, 57, 49,
73 51, 59, 20, 28, 5, 13, 6, 14, 21, 29, 36, 44, 52, 60, 37, 45, 80 41, 33, 26, 18, 3, 11, 4, 12,
74 53, 61, 22, 30, 7, 15, 23, 31, 38, 46, 54, 62, 39, 47, 55, 63 81 19, 27, 34, 42, 50, 58, 35, 43,
82 51, 59, 20, 28, 5, 13, 6, 14,
83 21, 29, 36, 44, 52, 60, 37, 45,
84 53, 61, 22, 30, 7, 15, 23, 31,
85 38, 46, 54, 62, 39, 47, 55, 63
75}; 86};
76 87
77uint8_t mpeg2_scan_norm[64] IDATA_ATTR; 88uint8_t mpeg2_scan_norm[64] IDATA_ATTR;
@@ -79,33 +90,49 @@ uint8_t mpeg2_scan_alt[64] IDATA_ATTR;
79 90
80void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec) 91void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec)
81{ 92{
82 if (mpeg2dec->sequence.width != (unsigned)-1) { 93 if (mpeg2dec->sequence.width != (unsigned)-1)
94 {
83 int i; 95 int i;
84 96
85 mpeg2dec->sequence.width = (unsigned)-1; 97 mpeg2dec->sequence.width = (unsigned)-1;
98
86 if (!mpeg2dec->custom_fbuf) 99 if (!mpeg2dec->custom_fbuf)
100 {
87 for (i = mpeg2dec->alloc_index_user; 101 for (i = mpeg2dec->alloc_index_user;
88 i < mpeg2dec->alloc_index; i++) { 102 i < mpeg2dec->alloc_index; i++)
89 mpeg2_free (mpeg2dec->fbuf_alloc[i].fbuf.buf[0]); 103 {
90 mpeg2_free (mpeg2dec->fbuf_alloc[i].fbuf.buf[1]); 104 mpeg2_free(mpeg2dec->fbuf_alloc[i].fbuf.buf[0]);
91 mpeg2_free (mpeg2dec->fbuf_alloc[i].fbuf.buf[2]); 105 mpeg2_free(mpeg2dec->fbuf_alloc[i].fbuf.buf[1]);
106 mpeg2_free(mpeg2dec->fbuf_alloc[i].fbuf.buf[2]);
92 } 107 }
108 }
109
93 if (mpeg2dec->convert_start) 110 if (mpeg2dec->convert_start)
94 for (i = 0; i < 3; i++) { 111 {
95 mpeg2_free (mpeg2dec->yuv_buf[i][0]); 112 for (i = 0; i < 3; i++)
96 mpeg2_free (mpeg2dec->yuv_buf[i][1]); 113 {
97 mpeg2_free (mpeg2dec->yuv_buf[i][2]); 114 mpeg2_free(mpeg2dec->yuv_buf[i][0]);
115 mpeg2_free(mpeg2dec->yuv_buf[i][1]);
116 mpeg2_free(mpeg2dec->yuv_buf[i][2]);
98 } 117 }
118 }
119
99 if (mpeg2dec->decoder.convert_id) 120 if (mpeg2dec->decoder.convert_id)
100 mpeg2_free (mpeg2dec->decoder.convert_id); 121 {
122 mpeg2_free(mpeg2dec->decoder.convert_id);
123 }
101 } 124 }
125
102 mpeg2dec->decoder.coding_type = I_TYPE; 126 mpeg2dec->decoder.coding_type = I_TYPE;
103 mpeg2dec->decoder.convert = NULL; 127 mpeg2dec->decoder.convert = NULL;
104 mpeg2dec->decoder.convert_id = NULL; 128 mpeg2dec->decoder.convert_id = NULL;
129
105 mpeg2dec->picture = mpeg2dec->pictures; 130 mpeg2dec->picture = mpeg2dec->pictures;
131
106 mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[0].fbuf; 132 mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[0].fbuf;
107 mpeg2dec->fbuf[1] = &mpeg2dec->fbuf_alloc[1].fbuf; 133 mpeg2dec->fbuf[1] = &mpeg2dec->fbuf_alloc[1].fbuf;
108 mpeg2dec->fbuf[2] = &mpeg2dec->fbuf_alloc[2].fbuf; 134 mpeg2dec->fbuf[2] = &mpeg2dec->fbuf_alloc[2].fbuf;
135
109 mpeg2dec->first = 1; 136 mpeg2dec->first = 1;
110 mpeg2dec->alloc_index = 0; 137 mpeg2dec->alloc_index = 0;
111 mpeg2dec->alloc_index_user = 0; 138 mpeg2dec->alloc_index_user = 0;
@@ -119,14 +146,21 @@ void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec)
119 146
120void mpeg2_reset_info (mpeg2_info_t * info) 147void mpeg2_reset_info (mpeg2_info_t * info)
121{ 148{
122 info->current_picture = info->current_picture_2nd = NULL; 149 info->current_picture =
123 info->display_picture = info->display_picture_2nd = NULL; 150 info->current_picture_2nd = NULL;
124 info->current_fbuf = info->display_fbuf = info->discard_fbuf = NULL; 151
152 info->display_picture =
153 info->display_picture_2nd = NULL;
154
155 info->current_fbuf =
156 info->display_fbuf =
157 info->discard_fbuf = NULL;
125} 158}
126 159
127static void info_user_data (mpeg2dec_t * mpeg2dec) 160static void info_user_data (mpeg2dec_t * mpeg2dec)
128{ 161{
129 if (mpeg2dec->user_data_len) { 162 if (mpeg2dec->user_data_len)
163 {
130 mpeg2dec->info.user_data = mpeg2dec->chunk_buffer; 164 mpeg2dec->info.user_data = mpeg2dec->chunk_buffer;
131 mpeg2dec->info.user_data_len = mpeg2dec->user_data_len - 3; 165 mpeg2dec->info.user_data_len = mpeg2dec->user_data_len - 3;
132 } 166 }
@@ -134,60 +168,81 @@ static void info_user_data (mpeg2dec_t * mpeg2dec)
134 168
135int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec) 169int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec)
136{ 170{
137 uint8_t * buffer = mpeg2dec->chunk_start; 171 static const unsigned int frame_period[16] =
138 mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence); 172 {
139 static unsigned int frame_period[16] = {
140 0, 1126125, 1125000, 1080000, 900900, 900000, 540000, 450450, 450000, 173 0, 1126125, 1125000, 1080000, 900900, 900000, 540000, 450450, 450000,
141 /* unofficial: xing 15 fps */ 174 /* unofficial: xing 15 fps */
142 1800000, 175 1800000,
143 /* unofficial: libmpeg3 "Unofficial economy rates" 5/10/12/15 fps */ 176 /* unofficial: libmpeg3 "Unofficial economy rates" 5/10/12/15 fps */
144 5400000, 2700000, 2250000, 1800000, 0, 0 177 5400000, 2700000, 2250000, 1800000, 0, 0
145 }; 178 };
179
180 uint8_t * buffer = mpeg2dec->chunk_start;
181 mpeg2_sequence_t * sequence = &mpeg2dec->new_sequence;
146 int i; 182 int i;
147 183
148 if ((buffer[6] & 0x20) != 0x20) /* missing marker_bit */ 184 if ((buffer[6] & 0x20) != 0x20) /* missing marker_bit */
149 return 1; 185 return 1;
150 186
151 i = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2]; 187 i = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2];
152 if (! (sequence->display_width = sequence->picture_width = i >> 12)) 188
189 if (!(sequence->display_width = sequence->picture_width = i >> 12))
153 return 1; 190 return 1;
154 if (! (sequence->display_height = sequence->picture_height = i & 0xfff)) 191
192 if (!(sequence->display_height = sequence->picture_height = i & 0xfff))
155 return 1; 193 return 1;
194
156 sequence->width = (sequence->picture_width + 15) & ~15; 195 sequence->width = (sequence->picture_width + 15) & ~15;
157 sequence->height = (sequence->picture_height + 15) & ~15; 196 sequence->height = (sequence->picture_height + 15) & ~15;
158 sequence->chroma_width = sequence->width >> 1; 197 sequence->chroma_width = sequence->width >> 1;
159 sequence->chroma_height = sequence->height >> 1; 198 sequence->chroma_height = sequence->height >> 1;
160 199
161 sequence->flags = (SEQ_FLAG_PROGRESSIVE_SEQUENCE | 200 sequence->flags = SEQ_FLAG_PROGRESSIVE_SEQUENCE |
162 SEQ_VIDEO_FORMAT_UNSPECIFIED); 201 SEQ_VIDEO_FORMAT_UNSPECIFIED;
163 202
164 sequence->pixel_width = buffer[3] >> 4; /* aspect ratio */ 203 sequence->pixel_width = buffer[3] >> 4; /* aspect ratio */
165 sequence->frame_period = frame_period[buffer[3] & 15]; 204 sequence->frame_period = frame_period[buffer[3] & 15];
166 205
167 sequence->byte_rate = (buffer[4]<<10) | (buffer[5]<<2) | (buffer[6]>>6); 206 sequence->byte_rate = (buffer[4]<<10) | (buffer[5]<<2) | (buffer[6]>>6);
168 207
169 sequence->vbv_buffer_size = ((buffer[6]<<16)|(buffer[7]<<8))&0x1ff800; 208 sequence->vbv_buffer_size = ((buffer[6]<<16) | (buffer[7]<<8)) & 0x1ff800;
170 209
171 if (buffer[7] & 4) 210 if (buffer[7] & 4)
172 sequence->flags |= SEQ_FLAG_CONSTRAINED_PARAMETERS; 211 sequence->flags |= SEQ_FLAG_CONSTRAINED_PARAMETERS;
173 212
174 mpeg2dec->copy_matrix = 3; 213 mpeg2dec->copy_matrix = 3;
175 if (buffer[7] & 2) { 214
215 if (buffer[7] & 2)
216 {
176 for (i = 0; i < 64; i++) 217 for (i = 0; i < 64; i++)
218 {
177 mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] = 219 mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] =
178 (buffer[i+7] << 7) | (buffer[i+8] >> 1); 220 (buffer[i+7] << 7) | (buffer[i+8] >> 1);
221 }
222
179 buffer += 64; 223 buffer += 64;
180 } else 224 }
225 else
226 {
181 for (i = 0; i < 64; i++) 227 for (i = 0; i < 64; i++)
228 {
182 mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] = 229 mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] =
183 default_intra_quantizer_matrix[i]; 230 default_intra_quantizer_matrix[i];
231 }
232 }
184 233
185 if (buffer[7] & 1) 234 if (buffer[7] & 1)
235 {
186 for (i = 0; i < 64; i++) 236 for (i = 0; i < 64; i++)
237 {
187 mpeg2dec->new_quantizer_matrix[1][mpeg2_scan_norm[i]] = 238 mpeg2dec->new_quantizer_matrix[1][mpeg2_scan_norm[i]] =
188 buffer[i+8]; 239 buffer[i+8];
240 }
241 }
189 else 242 else
243 {
190 rb->memset (mpeg2dec->new_quantizer_matrix[1], 16, 64); 244 rb->memset (mpeg2dec->new_quantizer_matrix[1], 16, 64);
245 }
191 246
192 sequence->profile_level_id = 0x80; 247 sequence->profile_level_id = 0x80;
193 sequence->colour_primaries = 0; 248 sequence->colour_primaries = 0;
@@ -196,7 +251,9 @@ int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec)
196 251
197 mpeg2dec->ext_state = SEQ_EXT; 252 mpeg2dec->ext_state = SEQ_EXT;
198 mpeg2dec->state = STATE_SEQUENCE; 253 mpeg2dec->state = STATE_SEQUENCE;
199 mpeg2dec->display_offset_x = mpeg2dec->display_offset_y = 0; 254
255 mpeg2dec->display_offset_x =
256 mpeg2dec->display_offset_y = 0;
200 257
201 return 0; 258 return 0;
202} 259}
@@ -204,7 +261,7 @@ int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec)
204static int sequence_ext (mpeg2dec_t * mpeg2dec) 261static int sequence_ext (mpeg2dec_t * mpeg2dec)
205{ 262{
206 uint8_t * buffer = mpeg2dec->chunk_start; 263 uint8_t * buffer = mpeg2dec->chunk_start;
207 mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence); 264 mpeg2_sequence_t * sequence = &mpeg2dec->new_sequence;
208 uint32_t flags; 265 uint32_t flags;
209 266
210 if (!(buffer[3] & 1)) 267 if (!(buffer[3] & 1))
@@ -212,23 +269,32 @@ static int sequence_ext (mpeg2dec_t * mpeg2dec)
212 269
213 sequence->profile_level_id = (buffer[0] << 4) | (buffer[1] >> 4); 270 sequence->profile_level_id = (buffer[0] << 4) | (buffer[1] >> 4);
214 271
215 sequence->display_width = sequence->picture_width += 272 sequence->picture_width += ((buffer[1] << 13) | (buffer[2] << 5)) & 0x3000;
216 ((buffer[1] << 13) | (buffer[2] << 5)) & 0x3000; 273 sequence->display_width = sequence->picture_width;
217 sequence->display_height = sequence->picture_height += 274
218 (buffer[2] << 7) & 0x3000; 275 sequence->picture_height += (buffer[2] << 7) & 0x3000;
276 sequence->display_height = sequence->picture_height;
277
219 sequence->width = (sequence->picture_width + 15) & ~15; 278 sequence->width = (sequence->picture_width + 15) & ~15;
220 sequence->height = (sequence->picture_height + 15) & ~15; 279 sequence->height = (sequence->picture_height + 15) & ~15;
280
221 flags = sequence->flags | SEQ_FLAG_MPEG2; 281 flags = sequence->flags | SEQ_FLAG_MPEG2;
222 if (!(buffer[1] & 8)) { 282
283 if (!(buffer[1] & 8))
284 {
223 flags &= ~SEQ_FLAG_PROGRESSIVE_SEQUENCE; 285 flags &= ~SEQ_FLAG_PROGRESSIVE_SEQUENCE;
224 sequence->height = (sequence->height + 31) & ~31; 286 sequence->height = (sequence->height + 31) & ~31;
225 } 287 }
288
226 if (buffer[5] & 0x80) 289 if (buffer[5] & 0x80)
227 flags |= SEQ_FLAG_LOW_DELAY; 290 flags |= SEQ_FLAG_LOW_DELAY;
291
228 sequence->flags = flags; 292 sequence->flags = flags;
229 sequence->chroma_width = sequence->width; 293 sequence->chroma_width = sequence->width;
230 sequence->chroma_height = sequence->height; 294 sequence->chroma_height = sequence->height;
231 switch (buffer[1] & 6) { 295
296 switch (buffer[1] & 6)
297 {
232 case 0: /* invalid */ 298 case 0: /* invalid */
233 return 1; 299 return 1;
234 case 2: /* 4:2:0 */ 300 case 2: /* 4:2:0 */
@@ -252,12 +318,14 @@ static int sequence_ext (mpeg2dec_t * mpeg2dec)
252static int sequence_display_ext (mpeg2dec_t * mpeg2dec) 318static int sequence_display_ext (mpeg2dec_t * mpeg2dec)
253{ 319{
254 uint8_t * buffer = mpeg2dec->chunk_start; 320 uint8_t * buffer = mpeg2dec->chunk_start;
255 mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence); 321 mpeg2_sequence_t * sequence = &mpeg2dec->new_sequence;
256 uint32_t flags; 322 uint32_t flags;
257 323
258 flags = ((sequence->flags & ~SEQ_MASK_VIDEO_FORMAT) | 324 flags = (sequence->flags & ~SEQ_MASK_VIDEO_FORMAT) |
259 ((buffer[0]<<4) & SEQ_MASK_VIDEO_FORMAT)); 325 ((buffer[0] << 4) & SEQ_MASK_VIDEO_FORMAT);
260 if (buffer[0] & 1) { 326
327 if (buffer[0] & 1)
328 {
261 flags |= SEQ_FLAG_COLOUR_DESCRIPTION; 329 flags |= SEQ_FLAG_COLOUR_DESCRIPTION;
262 sequence->colour_primaries = buffer[1]; 330 sequence->colour_primaries = buffer[1];
263 sequence->transfer_characteristics = buffer[2]; 331 sequence->transfer_characteristics = buffer[2];
@@ -268,9 +336,11 @@ static int sequence_display_ext (mpeg2dec_t * mpeg2dec)
268 if (!(buffer[2] & 2)) /* missing marker_bit */ 336 if (!(buffer[2] & 2)) /* missing marker_bit */
269 return 1; 337 return 1;
270 338
271 sequence->display_width = (buffer[1] << 6) | (buffer[2] >> 2); 339 sequence->display_width =
340 (buffer[1] << 6) | (buffer[2] >> 2);
341
272 sequence->display_height = 342 sequence->display_height =
273 ((buffer[2]& 1 ) << 13) | (buffer[3] << 5) | (buffer[4] >> 3); 343 ((buffer[2] & 1) << 13) | (buffer[3] << 5) | (buffer[4] >> 3);
274 344
275 return 0; 345 return 0;
276} 346}
@@ -282,37 +352,63 @@ static inline void finalize_sequence (mpeg2_sequence_t * sequence)
282 352
283 sequence->byte_rate *= 50; 353 sequence->byte_rate *= 50;
284 354
285 if (sequence->flags & SEQ_FLAG_MPEG2) { 355 if (sequence->flags & SEQ_FLAG_MPEG2)
286 switch (sequence->pixel_width) { 356 {
357 switch (sequence->pixel_width)
358 {
287 case 1: /* square pixels */ 359 case 1: /* square pixels */
288 sequence->pixel_width = sequence->pixel_height = 1; return; 360 sequence->pixel_width =
361 sequence->pixel_height = 1;
362 return;
289 case 2: /* 4:3 aspect ratio */ 363 case 2: /* 4:3 aspect ratio */
290 width = 4; height = 3; break; 364 width = 4;
365 height = 3;
366 break;
291 case 3: /* 16:9 aspect ratio */ 367 case 3: /* 16:9 aspect ratio */
292 width = 16; height = 9; break; 368 width = 16;
369 height = 9;
370 break;
293 case 4: /* 2.21:1 aspect ratio */ 371 case 4: /* 2.21:1 aspect ratio */
294 width = 221; height = 100; break; 372 width = 221;
373 height = 100;
374 break;
295 default: /* illegal */ 375 default: /* illegal */
296 sequence->pixel_width = sequence->pixel_height = 0; return; 376 sequence->pixel_width =
377 sequence->pixel_height = 0;
378 return;
297 } 379 }
380
298 width *= sequence->display_height; 381 width *= sequence->display_height;
299 height *= sequence->display_width; 382 height *= sequence->display_width;
300 383 }
301 } else { 384 else
302 if (sequence->byte_rate == 50 * 0x3ffff) 385 {
303 sequence->byte_rate = 0; /* mpeg-1 VBR */ 386 if (sequence->byte_rate == 50 * 0x3ffff)
304 387 sequence->byte_rate = 0; /* mpeg-1 VBR */
305 switch (sequence->pixel_width) { 388
306 case 0: case 15: /* illegal */ 389 switch (sequence->pixel_width)
307 sequence->pixel_width = sequence->pixel_height = 0; return; 390 {
391 case 0:
392 case 15: /* illegal */
393 sequence->pixel_width =
394 sequence->pixel_height = 0;
395 return;
308 case 1: /* square pixels */ 396 case 1: /* square pixels */
309 sequence->pixel_width = sequence->pixel_height = 1; return; 397 sequence->pixel_width =
398 sequence->pixel_height = 1;
399 return;
310 case 3: /* 720x576 16:9 */ 400 case 3: /* 720x576 16:9 */
311 sequence->pixel_width = 64; sequence->pixel_height = 45; return; 401 sequence->pixel_width = 64;
402 sequence->pixel_height = 45;
403 return;
312 case 6: /* 720x480 16:9 */ 404 case 6: /* 720x480 16:9 */
313 sequence->pixel_width = 32; sequence->pixel_height = 27; return; 405 sequence->pixel_width = 32;
406 sequence->pixel_height = 27;
407 return;
314 case 12: /* 720*480 4:3 */ 408 case 12: /* 720*480 4:3 */
315 sequence->pixel_width = 8; sequence->pixel_height = 9; return; 409 sequence->pixel_width = 8;
410 sequence->pixel_height = 9;
411 return;
316 default: 412 default:
317 height = 88 * sequence->pixel_width + 1171; 413 height = 88 * sequence->pixel_width + 1171;
318 width = 2000; 414 width = 2000;
@@ -321,11 +417,15 @@ static inline void finalize_sequence (mpeg2_sequence_t * sequence)
321 417
322 sequence->pixel_width = width; 418 sequence->pixel_width = width;
323 sequence->pixel_height = height; 419 sequence->pixel_height = height;
324 while (width) { /* find greatest common divisor */ 420
421 /* find greatest common divisor */
422 while (width)
423 {
325 int tmp = width; 424 int tmp = width;
326 width = height % tmp; 425 width = height % tmp;
327 height = tmp; 426 height = tmp;
328 } 427 }
428
329 sequence->pixel_width /= height; 429 sequence->pixel_width /= height;
330 sequence->pixel_height /= height; 430 sequence->pixel_height /= height;
331} 431}
@@ -333,59 +433,73 @@ static inline void finalize_sequence (mpeg2_sequence_t * sequence)
333static void copy_matrix (mpeg2dec_t * mpeg2dec, int index) 433static void copy_matrix (mpeg2dec_t * mpeg2dec, int index)
334{ 434{
335 if (rb->memcmp (mpeg2dec->quantizer_matrix[index], 435 if (rb->memcmp (mpeg2dec->quantizer_matrix[index],
336 mpeg2dec->new_quantizer_matrix[index], 64)) { 436 mpeg2dec->new_quantizer_matrix[index], 64))
437 {
337 rb->memcpy (mpeg2dec->quantizer_matrix[index], 438 rb->memcpy (mpeg2dec->quantizer_matrix[index],
338 mpeg2dec->new_quantizer_matrix[index], 64); 439 mpeg2dec->new_quantizer_matrix[index], 64);
440
339 mpeg2dec->scaled[index] = -1; 441 mpeg2dec->scaled[index] = -1;
340 } 442 }
341} 443}
342 444
343static void finalize_matrix (mpeg2dec_t * mpeg2dec) 445static void finalize_matrix (mpeg2dec_t * mpeg2dec)
344{ 446{
345 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); 447 mpeg2_decoder_t *decoder = &mpeg2dec->decoder;
346 int i; 448 int i;
347 449
348 for (i = 0; i < 2; i++) { 450 for (i = 0; i < 2; i++)
451 {
349 if (mpeg2dec->copy_matrix & (1 << i)) 452 if (mpeg2dec->copy_matrix & (1 << i))
350 copy_matrix (mpeg2dec, i); 453 copy_matrix (mpeg2dec, i);
454
351 if ((mpeg2dec->copy_matrix & (4 << i)) && 455 if ((mpeg2dec->copy_matrix & (4 << i)) &&
352 rb->memcmp (mpeg2dec->quantizer_matrix[i], 456 rb->memcmp(mpeg2dec->quantizer_matrix[i],
353 mpeg2dec->new_quantizer_matrix[i+2], 64)) { 457 mpeg2dec->new_quantizer_matrix[i+2], 64))
458 {
354 copy_matrix (mpeg2dec, i + 2); 459 copy_matrix (mpeg2dec, i + 2);
355 decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i+2]; 460 decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i+2];
356 } else if (mpeg2dec->copy_matrix & (5 << i)) 461 }
462 else if (mpeg2dec->copy_matrix & (5 << i))
463 {
357 decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i]; 464 decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i];
465 }
358 } 466 }
359} 467}
360 468
361static mpeg2_state_t invalid_end_action (mpeg2dec_t * mpeg2dec) 469static mpeg2_state_t invalid_end_action (mpeg2dec_t * mpeg2dec)
362{ 470{
363 mpeg2_reset_info (&(mpeg2dec->info)); 471 mpeg2_reset_info (&mpeg2dec->info);
472
364 mpeg2dec->info.gop = NULL; 473 mpeg2dec->info.gop = NULL;
474
365 info_user_data (mpeg2dec); 475 info_user_data (mpeg2dec);
476
366 mpeg2_header_state_init (mpeg2dec); 477 mpeg2_header_state_init (mpeg2dec);
478
367 mpeg2dec->sequence = mpeg2dec->new_sequence; 479 mpeg2dec->sequence = mpeg2dec->new_sequence;
368 mpeg2dec->action = mpeg2_seek_header; 480 mpeg2dec->action = mpeg2_seek_header;
369 mpeg2dec->state = STATE_SEQUENCE; 481 mpeg2dec->state = STATE_SEQUENCE;
482
370 return STATE_SEQUENCE; 483 return STATE_SEQUENCE;
371} 484}
372 485
373void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec) 486void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec)
374{ 487{
375 mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence); 488 mpeg2_sequence_t * sequence = &mpeg2dec->new_sequence;
376 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); 489 mpeg2_decoder_t * decoder = &mpeg2dec->decoder;
377 490
378 finalize_sequence (sequence); 491 finalize_sequence(sequence);
379 finalize_matrix (mpeg2dec); 492 finalize_matrix(mpeg2dec);
380 493
381 decoder->mpeg1 = !(sequence->flags & SEQ_FLAG_MPEG2); 494 decoder->mpeg1 = !(sequence->flags & SEQ_FLAG_MPEG2);
382 decoder->width = sequence->width; 495 decoder->width = sequence->width;
383 decoder->height = sequence->height; 496 decoder->height = sequence->height;
384 decoder->vertical_position_extension = (sequence->picture_height > 2800); 497 decoder->vertical_position_extension = sequence->picture_height > 2800;
385 decoder->chroma_format = ((sequence->chroma_width == sequence->width) + 498 decoder->chroma_format = (sequence->chroma_width == sequence->width) +
386 (sequence->chroma_height == sequence->height)); 499 (sequence->chroma_height == sequence->height);
387 500
388 if (mpeg2dec->sequence.width != (unsigned)-1) { 501 if (mpeg2dec->sequence.width != (unsigned)-1)
502 {
389 unsigned int new_byte_rate; 503 unsigned int new_byte_rate;
390 504
391 /* 505 /*
@@ -400,38 +514,50 @@ void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec)
400 */ 514 */
401 new_byte_rate = sequence->byte_rate; 515 new_byte_rate = sequence->byte_rate;
402 sequence->byte_rate = mpeg2dec->sequence.byte_rate; 516 sequence->byte_rate = mpeg2dec->sequence.byte_rate;
403 if (rb->memcmp (&(mpeg2dec->sequence), sequence, 517
404 sizeof (mpeg2_sequence_t))) { 518 if (rb->memcmp(&mpeg2dec->sequence, sequence,
519 sizeof (mpeg2_sequence_t)))
520 {
405 decoder->stride_frame = sequence->width; 521 decoder->stride_frame = sequence->width;
406 sequence->byte_rate = new_byte_rate; 522 sequence->byte_rate = new_byte_rate;
523
407 mpeg2_header_end (mpeg2dec); 524 mpeg2_header_end (mpeg2dec);
525
408 mpeg2dec->action = invalid_end_action; 526 mpeg2dec->action = invalid_end_action;
409 mpeg2dec->state = STATE_INVALID_END; 527 mpeg2dec->state = STATE_INVALID_END;
410 return; 528 return;
411 } 529 }
530
412 sequence->byte_rate = new_byte_rate; 531 sequence->byte_rate = new_byte_rate;
413 mpeg2dec->state = STATE_SEQUENCE_REPEATED; 532 mpeg2dec->state = STATE_SEQUENCE_REPEATED;
414 } else 533 }
534 else
535 {
415 decoder->stride_frame = sequence->width; 536 decoder->stride_frame = sequence->width;
537 }
538
416 mpeg2dec->sequence = *sequence; 539 mpeg2dec->sequence = *sequence;
417 mpeg2_reset_info (&(mpeg2dec->info)); 540 mpeg2_reset_info(&mpeg2dec->info);
418 mpeg2dec->info.sequence = &(mpeg2dec->sequence); 541 mpeg2dec->info.sequence = &mpeg2dec->sequence;
419 mpeg2dec->info.gop = NULL; 542 mpeg2dec->info.gop = NULL;
543
420 info_user_data (mpeg2dec); 544 info_user_data (mpeg2dec);
421} 545}
422 546
423int mpeg2_header_gop (mpeg2dec_t * mpeg2dec) 547int mpeg2_header_gop (mpeg2dec_t * mpeg2dec)
424{ 548{
425 uint8_t * buffer = mpeg2dec->chunk_start; 549 uint8_t * buffer = mpeg2dec->chunk_start;
426 mpeg2_gop_t * gop = &(mpeg2dec->new_gop); 550 mpeg2_gop_t * gop = &mpeg2dec->new_gop;
427 551
428 if (! (buffer[1] & 8)) 552 if (!(buffer[1] & 8))
429 return 1; 553 return 1;
554
430 gop->hours = (buffer[0] >> 2) & 31; 555 gop->hours = (buffer[0] >> 2) & 31;
431 gop->minutes = ((buffer[0] << 4) | (buffer[1] >> 4)) & 63; 556 gop->minutes = ((buffer[0] << 4) | (buffer[1] >> 4)) & 63;
432 gop->seconds = ((buffer[1] << 3) | (buffer[2] >> 5)) & 63; 557 gop->seconds = ((buffer[1] << 3) | (buffer[2] >> 5)) & 63;
433 gop->pictures = ((buffer[2] << 1) | (buffer[3] >> 7)) & 63; 558 gop->pictures = ((buffer[2] << 1) | (buffer[3] >> 7)) & 63;
434 gop->flags = (buffer[0] >> 7) | ((buffer[3] >> 4) & 6); 559 gop->flags = (buffer[0] >> 7) | ((buffer[3] >> 4) & 6);
560
435 mpeg2dec->state = STATE_GOP; 561 mpeg2dec->state = STATE_GOP;
436 return 0; 562 return 0;
437} 563}
@@ -439,8 +565,8 @@ int mpeg2_header_gop (mpeg2dec_t * mpeg2dec)
439void mpeg2_header_gop_finalize (mpeg2dec_t * mpeg2dec) 565void mpeg2_header_gop_finalize (mpeg2dec_t * mpeg2dec)
440{ 566{
441 mpeg2dec->gop = mpeg2dec->new_gop; 567 mpeg2dec->gop = mpeg2dec->new_gop;
442 mpeg2_reset_info (&(mpeg2dec->info)); 568 mpeg2_reset_info (&mpeg2dec->info);
443 mpeg2dec->info.gop = &(mpeg2dec->gop); 569 mpeg2dec->info.gop = &mpeg2dec->gop;
444 info_user_data (mpeg2dec); 570 info_user_data (mpeg2dec);
445} 571}
446 572
@@ -449,52 +575,67 @@ void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int b_type)
449 int i; 575 int i;
450 576
451 for (i = 0; i < 3; i++) 577 for (i = 0; i < 3; i++)
578 {
452 if (mpeg2dec->fbuf[1] != &mpeg2dec->fbuf_alloc[i].fbuf && 579 if (mpeg2dec->fbuf[1] != &mpeg2dec->fbuf_alloc[i].fbuf &&
453 mpeg2dec->fbuf[2] != &mpeg2dec->fbuf_alloc[i].fbuf) { 580 mpeg2dec->fbuf[2] != &mpeg2dec->fbuf_alloc[i].fbuf)
581 {
454 mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[i].fbuf; 582 mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[i].fbuf;
455 mpeg2dec->info.current_fbuf = mpeg2dec->fbuf[0]; 583 mpeg2dec->info.current_fbuf = mpeg2dec->fbuf[0];
456 if (b_type || (mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY)) { 584
585 if (b_type || (mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY))
586 {
457 if (b_type || mpeg2dec->convert) 587 if (b_type || mpeg2dec->convert)
458 mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[0]; 588 mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[0];
589
459 mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[0]; 590 mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[0];
460 } 591 }
592
461 break; 593 break;
462 } 594 }
595 }
463} 596}
464 597
465mpeg2_state_t mpeg2_header_picture_start (mpeg2dec_t * mpeg2dec) 598mpeg2_state_t mpeg2_header_picture_start (mpeg2dec_t * mpeg2dec)
466{ 599{
467 mpeg2_picture_t * picture = &(mpeg2dec->new_picture); 600 mpeg2_picture_t * picture = &mpeg2dec->new_picture;
468 601
469 mpeg2dec->state = ((mpeg2dec->state != STATE_SLICE_1ST) ? 602 mpeg2dec->state = (mpeg2dec->state != STATE_SLICE_1ST) ?
470 STATE_PICTURE : STATE_PICTURE_2ND); 603 STATE_PICTURE : STATE_PICTURE_2ND;
471 picture->flags = 0; 604 picture->flags = 0;
472 picture->tag = picture->tag2 = 0; 605 picture->tag = picture->tag2 = 0;
473 if (mpeg2dec->num_tags) { 606
474 if (mpeg2dec->bytes_since_tag >= 4) { 607 if (mpeg2dec->num_tags)
608 {
609 if (mpeg2dec->bytes_since_tag >= 4)
610 {
475 mpeg2dec->num_tags = 0; 611 mpeg2dec->num_tags = 0;
476 picture->tag = mpeg2dec->tag_current; 612 picture->tag = mpeg2dec->tag_current;
477 picture->tag2 = mpeg2dec->tag2_current; 613 picture->tag2 = mpeg2dec->tag2_current;
478 picture->flags = PIC_FLAG_TAGS; 614 picture->flags = PIC_FLAG_TAGS;
479 } else if (mpeg2dec->num_tags > 1) { 615 }
616 else if (mpeg2dec->num_tags > 1)
617 {
480 mpeg2dec->num_tags = 1; 618 mpeg2dec->num_tags = 1;
481 picture->tag = mpeg2dec->tag_previous; 619 picture->tag = mpeg2dec->tag_previous;
482 picture->tag2 = mpeg2dec->tag2_previous; 620 picture->tag2 = mpeg2dec->tag2_previous;
483 picture->flags = PIC_FLAG_TAGS; 621 picture->flags = PIC_FLAG_TAGS;
484 } 622 }
485 } 623 }
624
486 picture->display_offset[0].x = picture->display_offset[1].x = 625 picture->display_offset[0].x = picture->display_offset[1].x =
487 picture->display_offset[2].x = mpeg2dec->display_offset_x; 626 picture->display_offset[2].x = mpeg2dec->display_offset_x;
627
488 picture->display_offset[0].y = picture->display_offset[1].y = 628 picture->display_offset[0].y = picture->display_offset[1].y =
489 picture->display_offset[2].y = mpeg2dec->display_offset_y; 629 picture->display_offset[2].y = mpeg2dec->display_offset_y;
630
490 return mpeg2_parse_header (mpeg2dec); 631 return mpeg2_parse_header (mpeg2dec);
491} 632}
492 633
493int mpeg2_header_picture (mpeg2dec_t * mpeg2dec) 634int mpeg2_header_picture (mpeg2dec_t * mpeg2dec)
494{ 635{
495 uint8_t * buffer = mpeg2dec->chunk_start; 636 uint8_t * buffer = mpeg2dec->chunk_start;
496 mpeg2_picture_t * picture = &(mpeg2dec->new_picture); 637 mpeg2_picture_t * picture = &mpeg2dec->new_picture;
497 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); 638 mpeg2_decoder_t * decoder = &mpeg2dec->decoder;
498 int type; 639 int type;
499 640
500 type = (buffer [1] >> 3) & 7; 641 type = (buffer [1] >> 3) & 7;
@@ -504,7 +645,8 @@ int mpeg2_header_picture (mpeg2dec_t * mpeg2dec)
504 645
505 picture->flags |= type; 646 picture->flags |= type;
506 647
507 if (type == PIC_FLAG_CODING_TYPE_P || type == PIC_FLAG_CODING_TYPE_B) { 648 if (type == PIC_FLAG_CODING_TYPE_P || type == PIC_FLAG_CODING_TYPE_B)
649 {
508 /* forward_f_code and backward_f_code - used in mpeg1 only */ 650 /* forward_f_code and backward_f_code - used in mpeg1 only */
509 decoder->f_motion.f_code[1] = (buffer[3] >> 2) & 1; 651 decoder->f_motion.f_code[1] = (buffer[3] >> 2) & 1;
510 decoder->f_motion.f_code[0] = 652 decoder->f_motion.f_code[0] =
@@ -531,8 +673,8 @@ int mpeg2_header_picture (mpeg2dec_t * mpeg2dec)
531static int picture_coding_ext (mpeg2dec_t * mpeg2dec) 673static int picture_coding_ext (mpeg2dec_t * mpeg2dec)
532{ 674{
533 uint8_t * buffer = mpeg2dec->chunk_start; 675 uint8_t * buffer = mpeg2dec->chunk_start;
534 mpeg2_picture_t * picture = &(mpeg2dec->new_picture); 676 mpeg2_picture_t * picture = &mpeg2dec->new_picture;
535 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); 677 mpeg2_decoder_t * decoder = &mpeg2dec->decoder;
536 uint32_t flags; 678 uint32_t flags;
537 679
538 /* pre subtract 1 for use later in compute_motion_vector */ 680 /* pre subtract 1 for use later in compute_motion_vector */
@@ -542,24 +684,32 @@ static int picture_coding_ext (mpeg2dec_t * mpeg2dec)
542 decoder->b_motion.f_code[1] = (buffer[2] >> 4) - 1; 684 decoder->b_motion.f_code[1] = (buffer[2] >> 4) - 1;
543 685
544 flags = picture->flags; 686 flags = picture->flags;
687
545 decoder->intra_dc_precision = 7 - ((buffer[2] >> 2) & 3); 688 decoder->intra_dc_precision = 7 - ((buffer[2] >> 2) & 3);
546 decoder->picture_structure = buffer[2] & 3; 689 decoder->picture_structure = buffer[2] & 3;
547 switch (decoder->picture_structure) { 690
691 switch (decoder->picture_structure)
692 {
548 case TOP_FIELD: 693 case TOP_FIELD:
549 flags |= PIC_FLAG_TOP_FIELD_FIRST; 694 flags |= PIC_FLAG_TOP_FIELD_FIRST;
550 case BOTTOM_FIELD: 695 case BOTTOM_FIELD:
551 picture->nb_fields = 1; 696 picture->nb_fields = 1;
552 break; 697 break;
553 case FRAME_PICTURE: 698 case FRAME_PICTURE:
554 if (!(mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)) { 699 if (!(mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE))
700 {
555 picture->nb_fields = (buffer[3] & 2) ? 3 : 2; 701 picture->nb_fields = (buffer[3] & 2) ? 3 : 2;
556 flags |= (buffer[3] & 128) ? PIC_FLAG_TOP_FIELD_FIRST : 0; 702 flags |= (buffer[3] & 128) ? PIC_FLAG_TOP_FIELD_FIRST : 0;
557 } else 703 }
704 else
705 {
558 picture->nb_fields = (buffer[3]&2) ? ((buffer[3]&128) ? 6 : 4) : 2; 706 picture->nb_fields = (buffer[3]&2) ? ((buffer[3]&128) ? 6 : 4) : 2;
707 }
559 break; 708 break;
560 default: 709 default:
561 return 1; 710 return 1;
562 } 711 }
712
563 decoder->top_field_first = buffer[3] >> 7; 713 decoder->top_field_first = buffer[3] >> 7;
564 decoder->frame_pred_frame_dct = (buffer[3] >> 6) & 1; 714 decoder->frame_pred_frame_dct = (buffer[3] >> 6) & 1;
565 decoder->concealment_motion_vectors = (buffer[3] >> 5) & 1; 715 decoder->concealment_motion_vectors = (buffer[3] >> 5) & 1;
@@ -567,9 +717,13 @@ static int picture_coding_ext (mpeg2dec_t * mpeg2dec)
567 decoder->intra_vlc_format = (buffer[3] >> 3) & 1; 717 decoder->intra_vlc_format = (buffer[3] >> 3) & 1;
568 decoder->scan = (buffer[3] & 4) ? mpeg2_scan_alt : mpeg2_scan_norm; 718 decoder->scan = (buffer[3] & 4) ? mpeg2_scan_alt : mpeg2_scan_norm;
569 flags |= (buffer[4] & 0x80) ? PIC_FLAG_PROGRESSIVE_FRAME : 0; 719 flags |= (buffer[4] & 0x80) ? PIC_FLAG_PROGRESSIVE_FRAME : 0;
720
570 if (buffer[4] & 0x40) 721 if (buffer[4] & 0x40)
722 {
571 flags |= (((buffer[4]<<26) | (buffer[5]<<18) | (buffer[6]<<10)) & 723 flags |= (((buffer[4]<<26) | (buffer[5]<<18) | (buffer[6]<<10)) &
572 PIC_MASK_COMPOSITE_DISPLAY) | PIC_FLAG_COMPOSITE_DISPLAY; 724 PIC_MASK_COMPOSITE_DISPLAY) | PIC_FLAG_COMPOSITE_DISPLAY;
725 }
726
573 picture->flags = flags; 727 picture->flags = flags;
574 728
575 mpeg2dec->ext_state = PIC_DISPLAY_EXT | COPYRIGHT_EXT | QUANT_MATRIX_EXT; 729 mpeg2dec->ext_state = PIC_DISPLAY_EXT | COPYRIGHT_EXT | QUANT_MATRIX_EXT;
@@ -580,124 +734,162 @@ static int picture_coding_ext (mpeg2dec_t * mpeg2dec)
580static int picture_display_ext (mpeg2dec_t * mpeg2dec) 734static int picture_display_ext (mpeg2dec_t * mpeg2dec)
581{ 735{
582 uint8_t * buffer = mpeg2dec->chunk_start; 736 uint8_t * buffer = mpeg2dec->chunk_start;
583 mpeg2_picture_t * picture = &(mpeg2dec->new_picture); 737 mpeg2_picture_t * picture = &mpeg2dec->new_picture;
584 int i, nb_pos; 738 int i, nb_pos;
585 739
586 nb_pos = picture->nb_fields; 740 nb_pos = picture->nb_fields;
741
587 if (mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE) 742 if (mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)
588 nb_pos >>= 1; 743 nb_pos >>= 1;
589 744
590 for (i = 0; i < nb_pos; i++) { 745 for (i = 0; i < nb_pos; i++)
746 {
591 int x, y; 747 int x, y;
592 748
593 x = ((buffer[4*i] << 24) | (buffer[4*i+1] << 16) | 749 x = ((buffer[4*i] << 24) | (buffer[4*i+1] << 16) |
594 (buffer[4*i+2] << 8) | buffer[4*i+3]) >> (11-2*i); 750 (buffer[4*i+2] << 8) | buffer[4*i+3]) >> (11-2*i);
751
595 y = ((buffer[4*i+2] << 24) | (buffer[4*i+3] << 16) | 752 y = ((buffer[4*i+2] << 24) | (buffer[4*i+3] << 16) |
596 (buffer[4*i+4] << 8) | buffer[4*i+5]) >> (10-2*i); 753 (buffer[4*i+4] << 8) | buffer[4*i+5]) >> (10-2*i);
754
597 if (! (x & y & 1)) 755 if (! (x & y & 1))
598 return 1; 756 return 1;
757
599 picture->display_offset[i].x = mpeg2dec->display_offset_x = x >> 1; 758 picture->display_offset[i].x = mpeg2dec->display_offset_x = x >> 1;
600 picture->display_offset[i].y = mpeg2dec->display_offset_y = y >> 1; 759 picture->display_offset[i].y = mpeg2dec->display_offset_y = y >> 1;
601 } 760 }
602 for (; i < 3; i++) { 761
762 for (; i < 3; i++)
763 {
603 picture->display_offset[i].x = mpeg2dec->display_offset_x; 764 picture->display_offset[i].x = mpeg2dec->display_offset_x;
604 picture->display_offset[i].y = mpeg2dec->display_offset_y; 765 picture->display_offset[i].y = mpeg2dec->display_offset_y;
605 } 766 }
767
606 return 0; 768 return 0;
607} 769}
608 770
609void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec) 771void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec)
610{ 772{
611 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); 773 mpeg2_decoder_t * decoder = &mpeg2dec->decoder;
612 int old_type_b = (decoder->coding_type == B_TYPE); 774 int old_type_b = decoder->coding_type == B_TYPE;
613 int low_delay = mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY; 775 int low_delay = mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY;
614 776
615 finalize_matrix (mpeg2dec); 777 finalize_matrix (mpeg2dec);
616 decoder->coding_type = mpeg2dec->new_picture.flags & PIC_MASK_CODING_TYPE; 778 decoder->coding_type = mpeg2dec->new_picture.flags & PIC_MASK_CODING_TYPE;
617 779
618 if (mpeg2dec->state == STATE_PICTURE) { 780 if (mpeg2dec->state == STATE_PICTURE)
781 {
619 mpeg2_picture_t * picture; 782 mpeg2_picture_t * picture;
620 mpeg2_picture_t * other; 783 mpeg2_picture_t * other;
621 784
622 decoder->second_field = 0; 785 decoder->second_field = 0;
623 786
624 picture = other = mpeg2dec->pictures; 787 picture = other = mpeg2dec->pictures;
788
625 if (old_type_b ^ (mpeg2dec->picture < mpeg2dec->pictures + 2)) 789 if (old_type_b ^ (mpeg2dec->picture < mpeg2dec->pictures + 2))
626 picture += 2; 790 picture += 2;
627 else 791 else
628 other += 2; 792 other += 2;
793
629 mpeg2dec->picture = picture; 794 mpeg2dec->picture = picture;
630 *picture = mpeg2dec->new_picture; 795 *picture = mpeg2dec->new_picture;
631 796
632 if (!old_type_b) { 797 if (!old_type_b)
798 {
633 mpeg2dec->fbuf[2] = mpeg2dec->fbuf[1]; 799 mpeg2dec->fbuf[2] = mpeg2dec->fbuf[1];
634 mpeg2dec->fbuf[1] = mpeg2dec->fbuf[0]; 800 mpeg2dec->fbuf[1] = mpeg2dec->fbuf[0];
635 } 801 }
802
636 mpeg2dec->fbuf[0] = NULL; 803 mpeg2dec->fbuf[0] = NULL;
637 mpeg2_reset_info (&(mpeg2dec->info)); 804 mpeg2_reset_info (&mpeg2dec->info);
638 mpeg2dec->info.current_picture = picture; 805 mpeg2dec->info.current_picture = picture;
639 mpeg2dec->info.display_picture = picture; 806 mpeg2dec->info.display_picture = picture;
640 if (decoder->coding_type != B_TYPE) { 807
641 if (!low_delay) { 808 if (decoder->coding_type != B_TYPE)
642 if (mpeg2dec->first) { 809 {
810 if (!low_delay)
811 {
812 if (mpeg2dec->first)
813 {
643 mpeg2dec->info.display_picture = NULL; 814 mpeg2dec->info.display_picture = NULL;
644 mpeg2dec->first = 0; 815 mpeg2dec->first = 0;
645 } else { 816 }
817 else
818 {
646 mpeg2dec->info.display_picture = other; 819 mpeg2dec->info.display_picture = other;
820
647 if (other->nb_fields == 1) 821 if (other->nb_fields == 1)
648 mpeg2dec->info.display_picture_2nd = other + 1; 822 mpeg2dec->info.display_picture_2nd = other + 1;
823
649 mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[1]; 824 mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[1];
650 } 825 }
651 } 826 }
827
652 if (!low_delay + !mpeg2dec->convert) 828 if (!low_delay + !mpeg2dec->convert)
829 {
653 mpeg2dec->info.discard_fbuf = 830 mpeg2dec->info.discard_fbuf =
654 mpeg2dec->fbuf[!low_delay + !mpeg2dec->convert]; 831 mpeg2dec->fbuf[!low_delay + !mpeg2dec->convert];
832 }
655 } 833 }
656 if (mpeg2dec->convert) { 834
835 if (mpeg2dec->convert)
836 {
657 mpeg2_convert_init_t convert_init; 837 mpeg2_convert_init_t convert_init;
658 if (!mpeg2dec->convert_start) { 838
839 if (!mpeg2dec->convert_start)
840 {
659 int y_size, uv_size; 841 int y_size, uv_size;
660 842
661 mpeg2dec->decoder.convert_id = 843 mpeg2dec->decoder.convert_id =
662 mpeg2_malloc (mpeg2dec->convert_id_size, 844 mpeg2_malloc (mpeg2dec->convert_id_size,
663 MPEG2_ALLOC_CONVERT_ID); 845 MPEG2_ALLOC_CONVERT_ID);
846
664 mpeg2dec->convert (MPEG2_CONVERT_START, 847 mpeg2dec->convert (MPEG2_CONVERT_START,
665 mpeg2dec->decoder.convert_id, 848 mpeg2dec->decoder.convert_id,
666 &(mpeg2dec->sequence), 849 &mpeg2dec->sequence,
667 mpeg2dec->convert_stride, 850 mpeg2dec->convert_stride,
668 mpeg2dec->convert_arg, &convert_init); 851 mpeg2dec->convert_arg, &convert_init);
852
669 mpeg2dec->convert_start = convert_init.start; 853 mpeg2dec->convert_start = convert_init.start;
670 mpeg2dec->decoder.convert = convert_init.copy; 854 mpeg2dec->decoder.convert = convert_init.copy;
671 855
672 y_size = decoder->stride_frame * mpeg2dec->sequence.height; 856 y_size = decoder->stride_frame * mpeg2dec->sequence.height;
673 uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format); 857 uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format);
858
674 mpeg2dec->yuv_buf[0][0] = 859 mpeg2dec->yuv_buf[0][0] =
675 (uint8_t *) mpeg2_malloc (y_size, MPEG2_ALLOC_YUV); 860 (uint8_t *) mpeg2_malloc(y_size, MPEG2_ALLOC_YUV);
676 mpeg2dec->yuv_buf[0][1] = 861 mpeg2dec->yuv_buf[0][1] =
677 (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV); 862 (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV);
678 mpeg2dec->yuv_buf[0][2] = 863 mpeg2dec->yuv_buf[0][2] =
679 (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV); 864 (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV);
865
680 mpeg2dec->yuv_buf[1][0] = 866 mpeg2dec->yuv_buf[1][0] =
681 (uint8_t *) mpeg2_malloc (y_size, MPEG2_ALLOC_YUV); 867 (uint8_t *) mpeg2_malloc(y_size, MPEG2_ALLOC_YUV);
682 mpeg2dec->yuv_buf[1][1] = 868 mpeg2dec->yuv_buf[1][1] =
683 (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV); 869 (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV);
684 mpeg2dec->yuv_buf[1][2] = 870 mpeg2dec->yuv_buf[1][2] =
685 (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV); 871 (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV);
872
686 y_size = decoder->stride_frame * 32; 873 y_size = decoder->stride_frame * 32;
687 uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format); 874 uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format);
875
688 mpeg2dec->yuv_buf[2][0] = 876 mpeg2dec->yuv_buf[2][0] =
689 (uint8_t *) mpeg2_malloc (y_size, MPEG2_ALLOC_YUV); 877 (uint8_t *) mpeg2_malloc(y_size, MPEG2_ALLOC_YUV);
690 mpeg2dec->yuv_buf[2][1] = 878 mpeg2dec->yuv_buf[2][1] =
691 (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV); 879 (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV);
692 mpeg2dec->yuv_buf[2][2] = 880 mpeg2dec->yuv_buf[2][2] =
693 (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV); 881 (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV);
694 } 882 }
695 if (!mpeg2dec->custom_fbuf) { 883
696 while (mpeg2dec->alloc_index < 3) { 884 if (!mpeg2dec->custom_fbuf)
885 {
886 while (mpeg2dec->alloc_index < 3)
887 {
697 mpeg2_fbuf_t * fbuf; 888 mpeg2_fbuf_t * fbuf;
698 889
699 fbuf = &mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf; 890 fbuf = &mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf;
700 fbuf->id = NULL; 891 fbuf->id = NULL;
892
701 fbuf->buf[0] = 893 fbuf->buf[0] =
702 (uint8_t *) mpeg2_malloc (convert_init.buf_size[0], 894 (uint8_t *) mpeg2_malloc (convert_init.buf_size[0],
703 MPEG2_ALLOC_CONVERTED); 895 MPEG2_ALLOC_CONVERTED);
@@ -710,15 +902,21 @@ void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec)
710 } 902 }
711 mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE)); 903 mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE));
712 } 904 }
713 } else if (!mpeg2dec->custom_fbuf) { 905 }
714 while (mpeg2dec->alloc_index < 3) { 906 else if (!mpeg2dec->custom_fbuf)
907 {
908 while (mpeg2dec->alloc_index < 3)
909 {
715 mpeg2_fbuf_t * fbuf; 910 mpeg2_fbuf_t * fbuf;
716 int y_size, uv_size; 911 int y_size, uv_size;
717 912
718 fbuf = &(mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf); 913 fbuf = &mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf;
914
719 fbuf->id = NULL; 915 fbuf->id = NULL;
916
720 y_size = decoder->stride_frame * mpeg2dec->sequence.height; 917 y_size = decoder->stride_frame * mpeg2dec->sequence.height;
721 uv_size = y_size >> (2 - decoder->chroma_format); 918 uv_size = y_size >> (2 - decoder->chroma_format);
919
722 fbuf->buf[0] = (uint8_t *) mpeg2_malloc (y_size, 920 fbuf->buf[0] = (uint8_t *) mpeg2_malloc (y_size,
723 MPEG2_ALLOC_YUV); 921 MPEG2_ALLOC_YUV);
724 fbuf->buf[1] = (uint8_t *) mpeg2_malloc (uv_size, 922 fbuf->buf[1] = (uint8_t *) mpeg2_malloc (uv_size,
@@ -726,13 +924,19 @@ void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec)
726 fbuf->buf[2] = (uint8_t *) mpeg2_malloc (uv_size, 924 fbuf->buf[2] = (uint8_t *) mpeg2_malloc (uv_size,
727 MPEG2_ALLOC_YUV); 925 MPEG2_ALLOC_YUV);
728 } 926 }
927
729 mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE)); 928 mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE));
730 } 929 }
731 } else { 930 }
931 else
932 {
732 decoder->second_field = 1; 933 decoder->second_field = 1;
733 mpeg2dec->picture++; /* second field picture */ 934 mpeg2dec->picture++; /* second field picture */
935
734 *(mpeg2dec->picture) = mpeg2dec->new_picture; 936 *(mpeg2dec->picture) = mpeg2dec->new_picture;
937
735 mpeg2dec->info.current_picture_2nd = mpeg2dec->picture; 938 mpeg2dec->info.current_picture_2nd = mpeg2dec->picture;
939
736 if (low_delay || decoder->coding_type == B_TYPE) 940 if (low_delay || decoder->coding_type == B_TYPE)
737 mpeg2dec->info.display_picture_2nd = mpeg2dec->picture; 941 mpeg2dec->info.display_picture_2nd = mpeg2dec->picture;
738 } 942 }
@@ -752,23 +956,38 @@ static int quant_matrix_ext (mpeg2dec_t * mpeg2dec)
752 int i, j; 956 int i, j;
753 957
754 for (i = 0; i < 4; i++) 958 for (i = 0; i < 4; i++)
755 if (buffer[0] & (8 >> i)) { 959 {
960 if (buffer[0] & (8 >> i))
961 {
756 for (j = 0; j < 64; j++) 962 for (j = 0; j < 64; j++)
963 {
757 mpeg2dec->new_quantizer_matrix[i][mpeg2_scan_norm[j]] = 964 mpeg2dec->new_quantizer_matrix[i][mpeg2_scan_norm[j]] =
758 (buffer[j] << (i+5)) | (buffer[j+1] >> (3-i)); 965 (buffer[j] << (i+5)) | (buffer[j+1] >> (3-i));
966 }
967
759 mpeg2dec->copy_matrix |= 1 << i; 968 mpeg2dec->copy_matrix |= 1 << i;
760 buffer += 64; 969 buffer += 64;
761 } 970 }
971 }
762 972
763 return 0; 973 return 0;
764} 974}
765 975
766int mpeg2_header_extension (mpeg2dec_t * mpeg2dec) 976int mpeg2_header_extension (mpeg2dec_t * mpeg2dec)
767{ 977{
768 static int (* parser[]) (mpeg2dec_t *) = { 978 static int (* const parser[9]) (mpeg2dec_t *) =
769 0, sequence_ext, sequence_display_ext, quant_matrix_ext, 979 {
770 copyright_ext, 0, 0, picture_display_ext, picture_coding_ext 980 NULL,
981 sequence_ext,
982 sequence_display_ext,
983 quant_matrix_ext,
984 copyright_ext,
985 NULL,
986 NULL,
987 picture_display_ext,
988 picture_coding_ext
771 }; 989 };
990
772 int ext, ext_bit; 991 int ext, ext_bit;
773 992
774 ext = mpeg2dec->chunk_start[0] >> 4; 993 ext = mpeg2dec->chunk_start[0] >> 4;
@@ -776,7 +995,9 @@ int mpeg2_header_extension (mpeg2dec_t * mpeg2dec)
776 995
777 if (!(mpeg2dec->ext_state & ext_bit)) 996 if (!(mpeg2dec->ext_state & ext_bit))
778 return 0; /* ignore illegal extensions */ 997 return 0; /* ignore illegal extensions */
998
779 mpeg2dec->ext_state &= ~ext_bit; 999 mpeg2dec->ext_state &= ~ext_bit;
1000
780 return parser[ext] (mpeg2dec); 1001 return parser[ext] (mpeg2dec);
781} 1002}
782 1003
@@ -784,89 +1005,119 @@ int mpeg2_header_user_data (mpeg2dec_t * mpeg2dec)
784{ 1005{
785 mpeg2dec->user_data_len += mpeg2dec->chunk_ptr - 1 - mpeg2dec->chunk_start; 1006 mpeg2dec->user_data_len += mpeg2dec->chunk_ptr - 1 - mpeg2dec->chunk_start;
786 mpeg2dec->chunk_start = mpeg2dec->chunk_ptr - 1; 1007 mpeg2dec->chunk_start = mpeg2dec->chunk_ptr - 1;
787 1008
788 return 0; 1009 return 0;
789} 1010}
790 1011
791static void prescale (mpeg2dec_t * mpeg2dec, int index) 1012static void prescale (mpeg2dec_t * mpeg2dec, int index)
792{ 1013{
793 static int non_linear_scale [] = { 1014 static const int non_linear_scale[32] =
1015 {
794 0, 1, 2, 3, 4, 5, 6, 7, 1016 0, 1, 2, 3, 4, 5, 6, 7,
795 8, 10, 12, 14, 16, 18, 20, 22, 1017 8, 10, 12, 14, 16, 18, 20, 22,
796 24, 28, 32, 36, 40, 44, 48, 52, 1018 24, 28, 32, 36, 40, 44, 48, 52,
797 56, 64, 72, 80, 88, 96, 104, 112 1019 56, 64, 72, 80, 88, 96, 104, 112
798 }; 1020 };
1021
799 int i, j, k; 1022 int i, j, k;
800 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); 1023 mpeg2_decoder_t * decoder = &mpeg2dec->decoder;
801 1024
802 if (mpeg2dec->scaled[index] != mpeg2dec->q_scale_type) { 1025 if (mpeg2dec->scaled[index] != mpeg2dec->q_scale_type)
1026 {
803 mpeg2dec->scaled[index] = mpeg2dec->q_scale_type; 1027 mpeg2dec->scaled[index] = mpeg2dec->q_scale_type;
804 for (i = 0; i < 32; i++) { 1028
1029 for (i = 0; i < 32; i++)
1030 {
805 k = mpeg2dec->q_scale_type ? non_linear_scale[i] : (i << 1); 1031 k = mpeg2dec->q_scale_type ? non_linear_scale[i] : (i << 1);
1032
806 for (j = 0; j < 64; j++) 1033 for (j = 0; j < 64; j++)
1034 {
807 decoder->quantizer_prescale[index][i][j] = 1035 decoder->quantizer_prescale[index][i][j] =
808 k * mpeg2dec->quantizer_matrix[index][j]; 1036 k * mpeg2dec->quantizer_matrix[index][j];
1037 }
809 } 1038 }
810 } 1039 }
811} 1040}
812 1041
813mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec) 1042mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec)
814{ 1043{
815 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder); 1044 mpeg2_decoder_t * decoder = &mpeg2dec->decoder;
816 1045
817 mpeg2dec->info.user_data = NULL; mpeg2dec->info.user_data_len = 0; 1046 mpeg2dec->info.user_data = NULL;
818 mpeg2dec->state = ((mpeg2dec->picture->nb_fields > 1 || 1047 mpeg2dec->info.user_data_len = 0;
819 mpeg2dec->state == STATE_PICTURE_2ND) ? 1048 mpeg2dec->state = (mpeg2dec->picture->nb_fields > 1 ||
820 STATE_SLICE : STATE_SLICE_1ST); 1049 mpeg2dec->state == STATE_PICTURE_2ND) ?
1050 STATE_SLICE : STATE_SLICE_1ST;
821 1051
822 if (mpeg2dec->decoder.coding_type != D_TYPE) { 1052 if (mpeg2dec->decoder.coding_type != D_TYPE)
1053 {
823 prescale (mpeg2dec, 0); 1054 prescale (mpeg2dec, 0);
1055
824 if (decoder->chroma_quantizer[0] == decoder->quantizer_prescale[2]) 1056 if (decoder->chroma_quantizer[0] == decoder->quantizer_prescale[2])
825 prescale (mpeg2dec, 2); 1057 prescale (mpeg2dec, 2);
826 if (mpeg2dec->decoder.coding_type != I_TYPE) { 1058
1059 if (mpeg2dec->decoder.coding_type != I_TYPE)
1060 {
827 prescale (mpeg2dec, 1); 1061 prescale (mpeg2dec, 1);
1062
828 if (decoder->chroma_quantizer[1] == decoder->quantizer_prescale[3]) 1063 if (decoder->chroma_quantizer[1] == decoder->quantizer_prescale[3])
829 prescale (mpeg2dec, 3); 1064 prescale (mpeg2dec, 3);
830 } 1065 }
831 } 1066 }
832 1067
833 if (!(mpeg2dec->nb_decode_slices)) 1068 if (!(mpeg2dec->nb_decode_slices))
1069 {
834 mpeg2dec->picture->flags |= PIC_FLAG_SKIP; 1070 mpeg2dec->picture->flags |= PIC_FLAG_SKIP;
835 else if (mpeg2dec->convert_start) { 1071 }
1072 else if (mpeg2dec->convert_start)
1073 {
836 mpeg2dec->convert_start (decoder->convert_id, mpeg2dec->fbuf[0], 1074 mpeg2dec->convert_start (decoder->convert_id, mpeg2dec->fbuf[0],
837 mpeg2dec->picture, mpeg2dec->info.gop); 1075 mpeg2dec->picture, mpeg2dec->info.gop);
838 1076
839 if (mpeg2dec->decoder.coding_type == B_TYPE) 1077 if (mpeg2dec->decoder.coding_type == B_TYPE)
840 mpeg2_init_fbuf (&(mpeg2dec->decoder), mpeg2dec->yuv_buf[2], 1078 {
1079 mpeg2_init_fbuf (&mpeg2dec->decoder, mpeg2dec->yuv_buf[2],
841 mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1], 1080 mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1],
842 mpeg2dec->yuv_buf[mpeg2dec->yuv_index]); 1081 mpeg2dec->yuv_buf[mpeg2dec->yuv_index]);
843 else { 1082 }
844 mpeg2_init_fbuf (&(mpeg2dec->decoder), 1083 else
1084 {
1085 mpeg2_init_fbuf (&mpeg2dec->decoder,
845 mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1], 1086 mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1],
846 mpeg2dec->yuv_buf[mpeg2dec->yuv_index], 1087 mpeg2dec->yuv_buf[mpeg2dec->yuv_index],
847 mpeg2dec->yuv_buf[mpeg2dec->yuv_index]); 1088 mpeg2dec->yuv_buf[mpeg2dec->yuv_index]);
1089
848 if (mpeg2dec->state == STATE_SLICE) 1090 if (mpeg2dec->state == STATE_SLICE)
849 mpeg2dec->yuv_index ^= 1; 1091 mpeg2dec->yuv_index ^= 1;
850 } 1092 }
851 } else { 1093 }
1094 else
1095 {
852 int b_type; 1096 int b_type;
853 1097
854 b_type = (mpeg2dec->decoder.coding_type == B_TYPE); 1098 b_type = (mpeg2dec->decoder.coding_type == B_TYPE);
855 mpeg2_init_fbuf (&(mpeg2dec->decoder), mpeg2dec->fbuf[0]->buf, 1099
1100 mpeg2_init_fbuf (&mpeg2dec->decoder, mpeg2dec->fbuf[0]->buf,
856 mpeg2dec->fbuf[b_type + 1]->buf, 1101 mpeg2dec->fbuf[b_type + 1]->buf,
857 mpeg2dec->fbuf[b_type]->buf); 1102 mpeg2dec->fbuf[b_type]->buf);
858 } 1103 }
1104
859 mpeg2dec->action = NULL; 1105 mpeg2dec->action = NULL;
1106
860 return (mpeg2_state_t)-1; 1107 return (mpeg2_state_t)-1;
861} 1108}
862 1109
863static mpeg2_state_t seek_sequence (mpeg2dec_t * mpeg2dec) 1110static mpeg2_state_t seek_sequence (mpeg2dec_t * mpeg2dec)
864{ 1111{
865 mpeg2_reset_info (&(mpeg2dec->info)); 1112 mpeg2_reset_info (&mpeg2dec->info);
1113
866 mpeg2dec->info.sequence = NULL; 1114 mpeg2dec->info.sequence = NULL;
867 mpeg2dec->info.gop = NULL; 1115 mpeg2dec->info.gop = NULL;
1116
868 mpeg2_header_state_init (mpeg2dec); 1117 mpeg2_header_state_init (mpeg2dec);
1118
869 mpeg2dec->action = mpeg2_seek_header; 1119 mpeg2dec->action = mpeg2_seek_header;
1120
870 return mpeg2_seek_header (mpeg2dec); 1121 return mpeg2_seek_header (mpeg2dec);
871} 1122}
872 1123
@@ -877,19 +1128,30 @@ mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec)
877 1128
878 b_type = (mpeg2dec->decoder.coding_type == B_TYPE); 1129 b_type = (mpeg2dec->decoder.coding_type == B_TYPE);
879 picture = mpeg2dec->pictures; 1130 picture = mpeg2dec->pictures;
1131
880 if ((mpeg2dec->picture >= picture + 2) ^ b_type) 1132 if ((mpeg2dec->picture >= picture + 2) ^ b_type)
881 picture = mpeg2dec->pictures + 2; 1133 picture = mpeg2dec->pictures + 2;
882 1134
883 mpeg2_reset_info (&(mpeg2dec->info)); 1135 mpeg2_reset_info (&mpeg2dec->info);
884 if (!(mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY)) { 1136
1137 if (!(mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY))
1138 {
885 mpeg2dec->info.display_picture = picture; 1139 mpeg2dec->info.display_picture = picture;
1140
886 if (picture->nb_fields == 1) 1141 if (picture->nb_fields == 1)
887 mpeg2dec->info.display_picture_2nd = picture + 1; 1142 mpeg2dec->info.display_picture_2nd = picture + 1;
1143
888 mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[b_type]; 1144 mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[b_type];
1145
889 if (!mpeg2dec->convert) 1146 if (!mpeg2dec->convert)
890 mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type + 1]; 1147 mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type + 1];
891 } else if (!mpeg2dec->convert) 1148 }
1149 else if (!mpeg2dec->convert)
1150 {
892 mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type]; 1151 mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type];
1152 }
1153
893 mpeg2dec->action = seek_sequence; 1154 mpeg2dec->action = seek_sequence;
1155
894 return STATE_END; 1156 return STATE_END;
895} 1157}