Updated our source code header to explicitly mention that we are GPL v2 or
[Rockbox.git] / apps / plugins / mpegplayer / header.c
blobd8d005b692438298d5a68af7fb6080b15929046f
1 /*
2 * header.c
3 * Copyright (C) 2000-2003 Michel Lespinasse <walken@zoy.org>
4 * Copyright (C) 2003 Regis Duchesne <hpreg@zoy.org>
5 * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>
7 * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
8 * See http://libmpeg2.sourceforge.net/ for updates.
10 * mpeg2dec is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * mpeg2dec is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #include "plugin.h"
27 #include "mpeg2dec_config.h"
29 extern const struct plugin_api* rb;
31 #include "mpeg2.h"
32 #include "attributes.h"
33 #include "mpeg2_internal.h"
35 #define SEQ_EXT 2
36 #define SEQ_DISPLAY_EXT 4
37 #define QUANT_MATRIX_EXT 8
38 #define COPYRIGHT_EXT 0x10
39 #define PIC_DISPLAY_EXT 0x80
40 #define PIC_CODING_EXT 0x100
42 /* default intra quant matrix, in zig-zag order */
43 static const uint8_t default_intra_quantizer_matrix[64] =
46 16, 16,
47 19, 16, 19,
48 22, 22, 22, 22,
49 22, 22, 26, 24, 26,
50 27, 27, 27, 26, 26, 26,
51 26, 27, 27, 27, 29, 29, 29,
52 34, 34, 34, 29, 29, 29, 27, 27,
53 29, 29, 32, 32, 34, 34, 37,
54 38, 37, 35, 35, 34, 35,
55 38, 38, 40, 40, 40,
56 48, 48, 46, 46,
57 56, 56, 58,
58 69, 69,
62 const uint8_t default_mpeg2_scan_norm[64] =
64 /* Zig-Zag scan pattern */
65 0, 1, 8, 16, 9, 2, 3, 10,
66 17, 24, 32, 25, 18, 11, 4, 5,
67 12, 19, 26, 33, 40, 48, 41, 34,
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
75 const uint8_t default_mpeg2_scan_alt[64] =
77 /* Alternate scan pattern */
78 0, 8, 16, 24, 1, 9, 2, 10,
79 17, 25, 32, 40, 48, 56, 57, 49,
80 41, 33, 26, 18, 3, 11, 4, 12,
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
88 uint8_t mpeg2_scan_norm[64] IDATA_ATTR;
89 uint8_t mpeg2_scan_alt[64] IDATA_ATTR;
91 void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec)
93 if (mpeg2dec->sequence.width != (unsigned)-1)
95 mpeg2dec->sequence.width = (unsigned)-1;
96 mpeg2_mem_reset(); /* Clean the memory slate */
97 #if 0
98 if (!mpeg2dec->custom_fbuf)
100 int i;
101 for (i = mpeg2dec->alloc_index_user;
102 i < mpeg2dec->alloc_index; i++)
104 mpeg2_free(mpeg2dec->fbuf_alloc[i].fbuf.buf[0]);
105 #if MPEG2_COLOR
106 mpeg2_free(mpeg2dec->fbuf_alloc[i].fbuf.buf[1]);
107 mpeg2_free(mpeg2dec->fbuf_alloc[i].fbuf.buf[2]);
108 #endif
112 if (mpeg2dec->convert_start)
114 int i;
115 for (i = 0; i < 3; i++)
117 mpeg2_free(mpeg2dec->yuv_buf[i][0]);
118 #if MPEG2_COLOR
119 mpeg2_free(mpeg2dec->yuv_buf[i][1]);
120 mpeg2_free(mpeg2dec->yuv_buf[i][2]);
121 #endif
125 if (mpeg2dec->decoder.convert_id)
127 mpeg2_free(mpeg2dec->decoder.convert_id);
129 #endif
132 mpeg2dec->decoder.coding_type = I_TYPE;
133 mpeg2dec->decoder.convert = NULL;
134 mpeg2dec->decoder.convert_id = NULL;
136 mpeg2dec->picture = mpeg2dec->pictures;
138 mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[0].fbuf;
139 mpeg2dec->fbuf[1] = &mpeg2dec->fbuf_alloc[1].fbuf;
140 mpeg2dec->fbuf[2] = &mpeg2dec->fbuf_alloc[2].fbuf;
142 mpeg2dec->first = 1;
143 mpeg2dec->alloc_index = 0;
144 mpeg2dec->alloc_index_user = 0;
145 mpeg2dec->first_decode_slice = 1;
146 mpeg2dec->nb_decode_slices = 0xb0 - 1;
147 mpeg2dec->convert = NULL;
148 mpeg2dec->convert_start = NULL;
149 mpeg2dec->custom_fbuf = 0;
150 mpeg2dec->yuv_index = 0;
153 void mpeg2_reset_info (mpeg2_info_t * info)
155 info->current_picture =
156 info->current_picture_2nd = NULL;
158 info->display_picture =
159 info->display_picture_2nd = NULL;
161 info->current_fbuf =
162 info->display_fbuf =
163 info->discard_fbuf = NULL;
166 static void info_user_data (mpeg2dec_t * mpeg2dec)
168 if (mpeg2dec->user_data_len)
170 mpeg2dec->info.user_data = mpeg2dec->chunk_buffer;
171 mpeg2dec->info.user_data_len = mpeg2dec->user_data_len - 3;
175 int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec)
177 static const unsigned int frame_period[16] =
179 0, 1126125, 1125000, 1080000, 900900, 900000, 540000, 450450, 450000,
180 /* unofficial: xing 15 fps */
181 1800000,
182 /* unofficial: libmpeg3 "Unofficial economy rates" 5/10/12/15 fps */
183 5400000, 2700000, 2250000, 1800000, 0, 0
186 uint8_t * buffer = mpeg2dec->chunk_start;
187 mpeg2_sequence_t * sequence = &mpeg2dec->new_sequence;
188 int i;
190 if ((buffer[6] & 0x20) != 0x20) /* missing marker_bit */
191 return 1;
193 i = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2];
195 if (!(sequence->display_width = sequence->picture_width = i >> 12))
196 return 1;
198 if (!(sequence->display_height = sequence->picture_height = i & 0xfff))
199 return 1;
201 sequence->width = (sequence->picture_width + 15) & ~15;
202 sequence->height = (sequence->picture_height + 15) & ~15;
203 sequence->chroma_width = sequence->width >> 1;
204 sequence->chroma_height = sequence->height >> 1;
206 sequence->flags = SEQ_FLAG_PROGRESSIVE_SEQUENCE |
207 SEQ_VIDEO_FORMAT_UNSPECIFIED;
209 sequence->pixel_width = buffer[3] >> 4; /* aspect ratio */
210 sequence->frame_period = frame_period[buffer[3] & 15];
212 sequence->byte_rate = (buffer[4]<<10) | (buffer[5]<<2) | (buffer[6]>>6);
214 sequence->vbv_buffer_size = ((buffer[6]<<16) | (buffer[7]<<8)) & 0x1ff800;
216 if (buffer[7] & 4)
217 sequence->flags |= SEQ_FLAG_CONSTRAINED_PARAMETERS;
219 mpeg2dec->copy_matrix = 3;
221 if (buffer[7] & 2)
223 for (i = 0; i < 64; i++)
225 mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] =
226 (buffer[i+7] << 7) | (buffer[i+8] >> 1);
229 buffer += 64;
231 else
233 for (i = 0; i < 64; i++)
235 mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] =
236 default_intra_quantizer_matrix[i];
240 if (buffer[7] & 1)
242 for (i = 0; i < 64; i++)
244 mpeg2dec->new_quantizer_matrix[1][mpeg2_scan_norm[i]] =
245 buffer[i+8];
248 else
250 rb->memset (mpeg2dec->new_quantizer_matrix[1], 16, 64);
253 sequence->profile_level_id = 0x80;
254 sequence->colour_primaries = 0;
255 sequence->transfer_characteristics = 0;
256 sequence->matrix_coefficients = 0;
258 mpeg2dec->ext_state = SEQ_EXT;
259 mpeg2dec->state = STATE_SEQUENCE;
261 mpeg2dec->display_offset_x =
262 mpeg2dec->display_offset_y = 0;
264 return 0;
267 static int sequence_ext (mpeg2dec_t * mpeg2dec)
269 uint8_t * buffer = mpeg2dec->chunk_start;
270 mpeg2_sequence_t * sequence = &mpeg2dec->new_sequence;
271 uint32_t flags;
273 if (!(buffer[3] & 1))
274 return 1;
276 sequence->profile_level_id = (buffer[0] << 4) | (buffer[1] >> 4);
278 sequence->picture_width += ((buffer[1] << 13) | (buffer[2] << 5)) & 0x3000;
279 sequence->display_width = sequence->picture_width;
281 sequence->picture_height += (buffer[2] << 7) & 0x3000;
282 sequence->display_height = sequence->picture_height;
284 sequence->width = (sequence->picture_width + 15) & ~15;
285 sequence->height = (sequence->picture_height + 15) & ~15;
287 flags = sequence->flags | SEQ_FLAG_MPEG2;
289 if (!(buffer[1] & 8))
291 flags &= ~SEQ_FLAG_PROGRESSIVE_SEQUENCE;
292 sequence->height = (sequence->height + 31) & ~31;
295 if (buffer[5] & 0x80)
296 flags |= SEQ_FLAG_LOW_DELAY;
298 sequence->flags = flags;
299 sequence->chroma_width = sequence->width;
300 sequence->chroma_height = sequence->height;
302 switch (buffer[1] & 6)
304 case 0: /* invalid */
305 return 1;
306 case 2: /* 4:2:0 */
307 sequence->chroma_height >>= 1;
308 case 4: /* 4:2:2 */
309 sequence->chroma_width >>= 1;
312 sequence->byte_rate += ((buffer[2]<<25) | (buffer[3]<<17)) & 0x3ffc0000;
314 sequence->vbv_buffer_size |= buffer[4] << 21;
316 sequence->frame_period =
317 sequence->frame_period * ((buffer[5]&31)+1) / (((buffer[5]>>2)&3)+1);
319 mpeg2dec->ext_state = SEQ_DISPLAY_EXT;
321 return 0;
324 static int sequence_display_ext (mpeg2dec_t * mpeg2dec)
326 uint8_t * buffer = mpeg2dec->chunk_start;
327 mpeg2_sequence_t * sequence = &mpeg2dec->new_sequence;
328 uint32_t flags;
330 flags = (sequence->flags & ~SEQ_MASK_VIDEO_FORMAT) |
331 ((buffer[0] << 4) & SEQ_MASK_VIDEO_FORMAT);
333 if (buffer[0] & 1)
335 flags |= SEQ_FLAG_COLOUR_DESCRIPTION;
336 sequence->colour_primaries = buffer[1];
337 sequence->transfer_characteristics = buffer[2];
338 sequence->matrix_coefficients = buffer[3];
339 buffer += 3;
342 if (!(buffer[2] & 2)) /* missing marker_bit */
343 return 1;
345 sequence->display_width =
346 (buffer[1] << 6) | (buffer[2] >> 2);
348 sequence->display_height =
349 ((buffer[2] & 1) << 13) | (buffer[3] << 5) | (buffer[4] >> 3);
351 return 0;
354 static inline void finalize_sequence (mpeg2_sequence_t * sequence)
356 int width;
357 int height;
359 sequence->byte_rate *= 50;
361 if (sequence->flags & SEQ_FLAG_MPEG2)
363 switch (sequence->pixel_width)
365 case 1: /* square pixels */
366 sequence->pixel_width =
367 sequence->pixel_height = 1;
368 return;
369 case 2: /* 4:3 aspect ratio */
370 width = 4;
371 height = 3;
372 break;
373 case 3: /* 16:9 aspect ratio */
374 width = 16;
375 height = 9;
376 break;
377 case 4: /* 2.21:1 aspect ratio */
378 width = 221;
379 height = 100;
380 break;
381 default: /* illegal */
382 sequence->pixel_width =
383 sequence->pixel_height = 0;
384 return;
387 width *= sequence->display_height;
388 height *= sequence->display_width;
390 else
392 if (sequence->byte_rate == 50 * 0x3ffff)
393 sequence->byte_rate = 0; /* mpeg-1 VBR */
395 switch (sequence->pixel_width)
397 case 0:
398 case 15: /* illegal */
399 sequence->pixel_width =
400 sequence->pixel_height = 0;
401 return;
402 case 1: /* square pixels */
403 sequence->pixel_width =
404 sequence->pixel_height = 1;
405 return;
406 case 3: /* 720x576 16:9 */
407 sequence->pixel_width = 64;
408 sequence->pixel_height = 45;
409 return;
410 case 6: /* 720x480 16:9 */
411 sequence->pixel_width = 32;
412 sequence->pixel_height = 27;
413 return;
414 case 12: /* 720*480 4:3 */
415 sequence->pixel_width = 8;
416 sequence->pixel_height = 9;
417 return;
418 default:
419 height = 88 * sequence->pixel_width + 1171;
420 width = 2000;
424 sequence->pixel_width = width;
425 sequence->pixel_height = height;
427 /* find greatest common divisor */
428 while (width)
430 int tmp = width;
431 width = height % tmp;
432 height = tmp;
435 sequence->pixel_width /= height;
436 sequence->pixel_height /= height;
439 static void copy_matrix (mpeg2dec_t * mpeg2dec, int index)
441 if (rb->memcmp (mpeg2dec->quantizer_matrix[index],
442 mpeg2dec->new_quantizer_matrix[index], 64))
444 rb->memcpy (mpeg2dec->quantizer_matrix[index],
445 mpeg2dec->new_quantizer_matrix[index], 64);
447 mpeg2dec->scaled[index] = -1;
451 static void finalize_matrix (mpeg2dec_t * mpeg2dec)
453 mpeg2_decoder_t *decoder = &mpeg2dec->decoder;
454 int i;
456 for (i = 0; i < 2; i++)
458 if (mpeg2dec->copy_matrix & (1 << i))
459 copy_matrix (mpeg2dec, i);
461 if ((mpeg2dec->copy_matrix & (4 << i)) &&
462 rb->memcmp(mpeg2dec->quantizer_matrix[i],
463 mpeg2dec->new_quantizer_matrix[i+2], 64))
465 copy_matrix (mpeg2dec, i + 2);
466 decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i+2];
468 else if (mpeg2dec->copy_matrix & (5 << i))
470 decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i];
475 static mpeg2_state_t invalid_end_action (mpeg2dec_t * mpeg2dec)
477 mpeg2_reset_info (&mpeg2dec->info);
479 mpeg2dec->info.gop = NULL;
481 info_user_data (mpeg2dec);
483 mpeg2_header_state_init (mpeg2dec);
485 mpeg2dec->sequence = mpeg2dec->new_sequence;
486 mpeg2dec->action = mpeg2_seek_header;
487 mpeg2dec->state = STATE_SEQUENCE;
489 return STATE_SEQUENCE;
492 void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec)
494 mpeg2_sequence_t * sequence = &mpeg2dec->new_sequence;
495 mpeg2_decoder_t * decoder = &mpeg2dec->decoder;
497 finalize_sequence(sequence);
498 finalize_matrix(mpeg2dec);
500 decoder->mpeg1 = !(sequence->flags & SEQ_FLAG_MPEG2);
501 decoder->width = sequence->width;
502 decoder->height = sequence->height;
503 decoder->vertical_position_extension = sequence->picture_height > 2800;
504 decoder->chroma_format = (sequence->chroma_width == sequence->width) +
505 (sequence->chroma_height == sequence->height);
507 if (mpeg2dec->sequence.width != (unsigned)-1)
509 unsigned int new_byte_rate;
512 * According to 6.1.1.6, repeat sequence headers should be
513 * identical to the original. However some DVDs dont respect
514 * that and have different bitrates in the repeat sequence
515 * headers. So we'll ignore that in the comparison and still
516 * consider these as repeat sequence headers.
518 * However, be careful not to alter the current sequence when
519 * returning STATE_INVALID_END.
521 new_byte_rate = sequence->byte_rate;
522 sequence->byte_rate = mpeg2dec->sequence.byte_rate;
524 if (rb->memcmp(&mpeg2dec->sequence, sequence,
525 sizeof (mpeg2_sequence_t)))
527 decoder->stride_frame = sequence->width;
528 sequence->byte_rate = new_byte_rate;
530 mpeg2_header_end (mpeg2dec);
532 mpeg2dec->action = invalid_end_action;
533 mpeg2dec->state = STATE_INVALID_END;
534 return;
537 sequence->byte_rate = new_byte_rate;
538 mpeg2dec->state = STATE_SEQUENCE_REPEATED;
540 else
542 decoder->stride_frame = sequence->width;
545 mpeg2dec->sequence = *sequence;
546 mpeg2_reset_info(&mpeg2dec->info);
547 mpeg2dec->info.sequence = &mpeg2dec->sequence;
548 mpeg2dec->info.gop = NULL;
550 info_user_data (mpeg2dec);
553 int mpeg2_header_gop (mpeg2dec_t * mpeg2dec)
555 uint8_t * buffer = mpeg2dec->chunk_start;
556 mpeg2_gop_t * gop = &mpeg2dec->new_gop;
558 if (!(buffer[1] & 8))
559 return 1;
561 gop->hours = (buffer[0] >> 2) & 31;
562 gop->minutes = ((buffer[0] << 4) | (buffer[1] >> 4)) & 63;
563 gop->seconds = ((buffer[1] << 3) | (buffer[2] >> 5)) & 63;
564 gop->pictures = ((buffer[2] << 1) | (buffer[3] >> 7)) & 63;
565 gop->flags = (buffer[0] >> 7) | ((buffer[3] >> 4) & 6);
567 mpeg2dec->state = STATE_GOP;
568 return 0;
571 void mpeg2_header_gop_finalize (mpeg2dec_t * mpeg2dec)
573 mpeg2dec->gop = mpeg2dec->new_gop;
574 mpeg2_reset_info (&mpeg2dec->info);
575 mpeg2dec->info.gop = &mpeg2dec->gop;
576 info_user_data (mpeg2dec);
579 void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int b_type)
581 int i;
583 for (i = 0; i < 3; i++)
585 if (mpeg2dec->fbuf[1] != &mpeg2dec->fbuf_alloc[i].fbuf &&
586 mpeg2dec->fbuf[2] != &mpeg2dec->fbuf_alloc[i].fbuf)
588 mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[i].fbuf;
589 mpeg2dec->info.current_fbuf = mpeg2dec->fbuf[0];
591 if (b_type || (mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY))
593 if (b_type || mpeg2dec->convert)
594 mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[0];
596 mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[0];
599 break;
604 mpeg2_state_t mpeg2_header_picture_start (mpeg2dec_t * mpeg2dec)
606 mpeg2_picture_t * picture = &mpeg2dec->new_picture;
608 mpeg2dec->state = (mpeg2dec->state != STATE_SLICE_1ST) ?
609 STATE_PICTURE : STATE_PICTURE_2ND;
610 picture->flags = 0;
611 picture->tag = picture->tag2 = 0;
613 if (mpeg2dec->num_tags)
615 if (mpeg2dec->bytes_since_tag >= 4)
617 mpeg2dec->num_tags = 0;
618 picture->tag = mpeg2dec->tag_current;
619 picture->tag2 = mpeg2dec->tag2_current;
620 picture->flags = PIC_FLAG_TAGS;
622 else if (mpeg2dec->num_tags > 1)
624 mpeg2dec->num_tags = 1;
625 picture->tag = mpeg2dec->tag_previous;
626 picture->tag2 = mpeg2dec->tag2_previous;
627 picture->flags = PIC_FLAG_TAGS;
631 picture->display_offset[0].x = picture->display_offset[1].x =
632 picture->display_offset[2].x = mpeg2dec->display_offset_x;
634 picture->display_offset[0].y = picture->display_offset[1].y =
635 picture->display_offset[2].y = mpeg2dec->display_offset_y;
637 return mpeg2_parse_header (mpeg2dec);
640 int mpeg2_header_picture (mpeg2dec_t * mpeg2dec)
642 uint8_t * buffer = mpeg2dec->chunk_start;
643 mpeg2_picture_t * picture = &mpeg2dec->new_picture;
644 mpeg2_decoder_t * decoder = &mpeg2dec->decoder;
645 int type;
647 type = (buffer [1] >> 3) & 7;
648 mpeg2dec->ext_state = PIC_CODING_EXT;
650 picture->temporal_reference = (buffer[0] << 2) | (buffer[1] >> 6);
652 picture->flags |= type;
654 if (type == PIC_FLAG_CODING_TYPE_P || type == PIC_FLAG_CODING_TYPE_B)
656 /* forward_f_code and backward_f_code - used in mpeg1 only */
657 decoder->f_motion.f_code[1] = (buffer[3] >> 2) & 1;
658 decoder->f_motion.f_code[0] =
659 (((buffer[3] << 1) | (buffer[4] >> 7)) & 7) - 1;
660 decoder->b_motion.f_code[1] = (buffer[4] >> 6) & 1;
661 decoder->b_motion.f_code[0] = ((buffer[4] >> 3) & 7) - 1;
664 /* XXXXXX decode extra_information_picture as well */
666 picture->nb_fields = 2;
668 mpeg2dec->q_scale_type = 0;
669 decoder->intra_dc_precision = 7;
670 decoder->frame_pred_frame_dct = 1;
671 decoder->concealment_motion_vectors = 0;
672 decoder->scan = mpeg2_scan_norm;
673 decoder->picture_structure = FRAME_PICTURE;
674 mpeg2dec->copy_matrix = 0;
676 return 0;
679 static int picture_coding_ext (mpeg2dec_t * mpeg2dec)
681 uint8_t * buffer = mpeg2dec->chunk_start;
682 mpeg2_picture_t * picture = &mpeg2dec->new_picture;
683 mpeg2_decoder_t * decoder = &mpeg2dec->decoder;
684 uint32_t flags;
686 /* pre subtract 1 for use later in compute_motion_vector */
687 decoder->f_motion.f_code[0] = (buffer[0] & 15) - 1;
688 decoder->f_motion.f_code[1] = (buffer[1] >> 4) - 1;
689 decoder->b_motion.f_code[0] = (buffer[1] & 15) - 1;
690 decoder->b_motion.f_code[1] = (buffer[2] >> 4) - 1;
692 flags = picture->flags;
694 decoder->intra_dc_precision = 7 - ((buffer[2] >> 2) & 3);
695 decoder->picture_structure = buffer[2] & 3;
697 switch (decoder->picture_structure)
699 case TOP_FIELD:
700 flags |= PIC_FLAG_TOP_FIELD_FIRST;
701 case BOTTOM_FIELD:
702 picture->nb_fields = 1;
703 break;
704 case FRAME_PICTURE:
705 if (!(mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE))
707 picture->nb_fields = (buffer[3] & 2) ? 3 : 2;
708 flags |= (buffer[3] & 128) ? PIC_FLAG_TOP_FIELD_FIRST : 0;
710 else
712 picture->nb_fields = (buffer[3]&2) ? ((buffer[3]&128) ? 6 : 4) : 2;
714 break;
715 default:
716 return 1;
719 decoder->top_field_first = buffer[3] >> 7;
720 decoder->frame_pred_frame_dct = (buffer[3] >> 6) & 1;
721 decoder->concealment_motion_vectors = (buffer[3] >> 5) & 1;
722 mpeg2dec->q_scale_type = buffer[3] & 16;
723 decoder->intra_vlc_format = (buffer[3] >> 3) & 1;
724 decoder->scan = (buffer[3] & 4) ? mpeg2_scan_alt : mpeg2_scan_norm;
725 flags |= (buffer[4] & 0x80) ? PIC_FLAG_PROGRESSIVE_FRAME : 0;
727 if (buffer[4] & 0x40)
729 flags |= (((buffer[4]<<26) | (buffer[5]<<18) | (buffer[6]<<10)) &
730 PIC_MASK_COMPOSITE_DISPLAY) | PIC_FLAG_COMPOSITE_DISPLAY;
733 picture->flags = flags;
735 mpeg2dec->ext_state = PIC_DISPLAY_EXT | COPYRIGHT_EXT | QUANT_MATRIX_EXT;
737 return 0;
740 static int picture_display_ext (mpeg2dec_t * mpeg2dec)
742 uint8_t * buffer = mpeg2dec->chunk_start;
743 mpeg2_picture_t * picture = &mpeg2dec->new_picture;
744 int i, nb_pos;
746 nb_pos = picture->nb_fields;
748 if (mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)
749 nb_pos >>= 1;
751 for (i = 0; i < nb_pos; i++)
753 int x, y;
755 x = ((buffer[4*i] << 24) | (buffer[4*i+1] << 16) |
756 (buffer[4*i+2] << 8) | buffer[4*i+3]) >> (11-2*i);
758 y = ((buffer[4*i+2] << 24) | (buffer[4*i+3] << 16) |
759 (buffer[4*i+4] << 8) | buffer[4*i+5]) >> (10-2*i);
761 if (! (x & y & 1))
762 return 1;
764 picture->display_offset[i].x = mpeg2dec->display_offset_x = x >> 1;
765 picture->display_offset[i].y = mpeg2dec->display_offset_y = y >> 1;
768 for (; i < 3; i++)
770 picture->display_offset[i].x = mpeg2dec->display_offset_x;
771 picture->display_offset[i].y = mpeg2dec->display_offset_y;
774 return 0;
777 void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec)
779 mpeg2_decoder_t * decoder = &mpeg2dec->decoder;
780 int old_type_b = decoder->coding_type == B_TYPE;
781 int low_delay = mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY;
783 finalize_matrix (mpeg2dec);
784 decoder->coding_type = mpeg2dec->new_picture.flags & PIC_MASK_CODING_TYPE;
786 if (mpeg2dec->state == STATE_PICTURE)
788 mpeg2_picture_t * picture;
789 mpeg2_picture_t * other;
791 decoder->second_field = 0;
793 picture = other = mpeg2dec->pictures;
795 if (old_type_b ^ (mpeg2dec->picture < mpeg2dec->pictures + 2))
796 picture += 2;
797 else
798 other += 2;
800 mpeg2dec->picture = picture;
801 *picture = mpeg2dec->new_picture;
803 if (!old_type_b)
805 mpeg2dec->fbuf[2] = mpeg2dec->fbuf[1];
806 mpeg2dec->fbuf[1] = mpeg2dec->fbuf[0];
809 mpeg2dec->fbuf[0] = NULL;
810 mpeg2_reset_info (&mpeg2dec->info);
811 mpeg2dec->info.current_picture = picture;
812 mpeg2dec->info.display_picture = picture;
814 if (decoder->coding_type != B_TYPE)
816 if (!low_delay)
818 if (mpeg2dec->first)
820 mpeg2dec->info.display_picture = NULL;
821 mpeg2dec->first = 0;
823 else
825 mpeg2dec->info.display_picture = other;
827 if (other->nb_fields == 1)
828 mpeg2dec->info.display_picture_2nd = other + 1;
830 mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[1];
834 if (!low_delay + !mpeg2dec->convert)
836 mpeg2dec->info.discard_fbuf =
837 mpeg2dec->fbuf[!low_delay + !mpeg2dec->convert];
841 if (mpeg2dec->convert)
843 mpeg2_convert_init_t convert_init;
845 if (!mpeg2dec->convert_start)
847 mpeg2dec->decoder.convert_id =
848 mpeg2_malloc (mpeg2dec->convert_id_size,
849 MPEG2_ALLOC_CONVERT_ID);
851 mpeg2dec->convert (MPEG2_CONVERT_START,
852 mpeg2dec->decoder.convert_id,
853 &mpeg2dec->sequence,
854 mpeg2dec->convert_stride,
855 mpeg2dec->convert_arg, &convert_init);
857 mpeg2dec->convert_start = convert_init.start;
858 mpeg2dec->decoder.convert = convert_init.copy;
860 int y_size = decoder->stride_frame * mpeg2dec->sequence.height;
862 mpeg2dec->yuv_buf[0][0] =
863 (uint8_t *) mpeg2_malloc(y_size, MPEG2_ALLOC_YUV);
864 #if MPEG2_COLOR
865 int uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format);
867 mpeg2dec->yuv_buf[0][1] =
868 (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV);
869 mpeg2dec->yuv_buf[0][2] =
870 (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV);
871 #endif
873 mpeg2dec->yuv_buf[1][0] =
874 (uint8_t *) mpeg2_malloc(y_size, MPEG2_ALLOC_YUV);
875 #if MPEG2_COLOR
876 mpeg2dec->yuv_buf[1][1] =
877 (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV);
878 mpeg2dec->yuv_buf[1][2] =
879 (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV);
880 #endif
881 y_size = decoder->stride_frame * 32;
883 mpeg2dec->yuv_buf[2][0] =
884 (uint8_t *) mpeg2_malloc(y_size, MPEG2_ALLOC_YUV);
885 #if MPEG2_COLOR
886 uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format);
888 mpeg2dec->yuv_buf[2][1] =
889 (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV);
890 mpeg2dec->yuv_buf[2][2] =
891 (uint8_t *) mpeg2_malloc(uv_size, MPEG2_ALLOC_YUV);
892 #endif
895 if (!mpeg2dec->custom_fbuf)
897 while (mpeg2dec->alloc_index < 3)
899 mpeg2_fbuf_t * fbuf;
901 fbuf = &mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf;
902 fbuf->id = NULL;
904 fbuf->buf[0] =
905 (uint8_t *) mpeg2_malloc (convert_init.buf_size[0],
906 MPEG2_ALLOC_CONVERTED);
907 #if MPEG2_COLOR
908 fbuf->buf[1] =
909 (uint8_t *) mpeg2_malloc (convert_init.buf_size[1],
910 MPEG2_ALLOC_CONVERTED);
911 fbuf->buf[2] =
912 (uint8_t *) mpeg2_malloc (convert_init.buf_size[2],
913 MPEG2_ALLOC_CONVERTED);
914 #endif
917 mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE));
920 else if (!mpeg2dec->custom_fbuf)
922 while (mpeg2dec->alloc_index < 3)
924 mpeg2_fbuf_t * fbuf;
926 fbuf = &mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf;
928 fbuf->id = NULL;
930 int y_size = decoder->stride_frame * mpeg2dec->sequence.height;
932 fbuf->buf[0] = (uint8_t *) mpeg2_malloc (y_size,
933 MPEG2_ALLOC_YUV);
934 #if MPEG2_COLOR
935 int uv_size = y_size >> (2 - decoder->chroma_format);
937 fbuf->buf[1] = (uint8_t *) mpeg2_malloc (uv_size,
938 MPEG2_ALLOC_YUV);
939 fbuf->buf[2] = (uint8_t *) mpeg2_malloc (uv_size,
940 MPEG2_ALLOC_YUV);
941 #endif
944 mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE));
947 else
949 decoder->second_field = 1;
950 mpeg2dec->picture++; /* second field picture */
952 *(mpeg2dec->picture) = mpeg2dec->new_picture;
954 mpeg2dec->info.current_picture_2nd = mpeg2dec->picture;
956 if (low_delay || decoder->coding_type == B_TYPE)
957 mpeg2dec->info.display_picture_2nd = mpeg2dec->picture;
960 info_user_data (mpeg2dec);
963 static int copyright_ext (mpeg2dec_t * mpeg2dec)
965 (void)mpeg2dec;
966 return 0;
969 static int quant_matrix_ext (mpeg2dec_t * mpeg2dec)
971 uint8_t * buffer = mpeg2dec->chunk_start;
972 int i, j;
974 for (i = 0; i < 4; i++)
976 if (buffer[0] & (8 >> i))
978 for (j = 0; j < 64; j++)
980 mpeg2dec->new_quantizer_matrix[i][mpeg2_scan_norm[j]] =
981 (buffer[j] << (i+5)) | (buffer[j+1] >> (3-i));
984 mpeg2dec->copy_matrix |= 1 << i;
985 buffer += 64;
989 return 0;
992 int mpeg2_header_extension (mpeg2dec_t * mpeg2dec)
994 static int (* const parser[9]) (mpeg2dec_t *) =
996 NULL,
997 sequence_ext,
998 sequence_display_ext,
999 quant_matrix_ext,
1000 copyright_ext,
1001 NULL,
1002 NULL,
1003 picture_display_ext,
1004 picture_coding_ext
1007 int ext, ext_bit;
1009 ext = mpeg2dec->chunk_start[0] >> 4;
1010 ext_bit = 1 << ext;
1012 if (!(mpeg2dec->ext_state & ext_bit))
1013 return 0; /* ignore illegal extensions */
1015 mpeg2dec->ext_state &= ~ext_bit;
1017 return parser[ext] (mpeg2dec);
1020 int mpeg2_header_user_data (mpeg2dec_t * mpeg2dec)
1022 mpeg2dec->user_data_len += mpeg2dec->chunk_ptr - 1 - mpeg2dec->chunk_start;
1023 mpeg2dec->chunk_start = mpeg2dec->chunk_ptr - 1;
1025 return 0;
1028 static void prescale (mpeg2dec_t * mpeg2dec, int index)
1030 static const int non_linear_scale[32] =
1032 0, 1, 2, 3, 4, 5, 6, 7,
1033 8, 10, 12, 14, 16, 18, 20, 22,
1034 24, 28, 32, 36, 40, 44, 48, 52,
1035 56, 64, 72, 80, 88, 96, 104, 112
1038 int i, j, k;
1039 mpeg2_decoder_t * decoder = &mpeg2dec->decoder;
1041 if (mpeg2dec->scaled[index] != mpeg2dec->q_scale_type)
1043 mpeg2dec->scaled[index] = mpeg2dec->q_scale_type;
1045 for (i = 0; i < 32; i++)
1047 k = mpeg2dec->q_scale_type ? non_linear_scale[i] : (i << 1);
1049 for (j = 0; j < 64; j++)
1051 decoder->quantizer_prescale[index][i][j] =
1052 k * mpeg2dec->quantizer_matrix[index][j];
1058 mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec)
1060 mpeg2_decoder_t * decoder = &mpeg2dec->decoder;
1062 mpeg2dec->info.user_data = NULL;
1063 mpeg2dec->info.user_data_len = 0;
1064 mpeg2dec->state = (mpeg2dec->picture->nb_fields > 1 ||
1065 mpeg2dec->state == STATE_PICTURE_2ND) ?
1066 STATE_SLICE : STATE_SLICE_1ST;
1068 if (mpeg2dec->decoder.coding_type != D_TYPE)
1070 prescale (mpeg2dec, 0);
1072 if (decoder->chroma_quantizer[0] == decoder->quantizer_prescale[2])
1073 prescale (mpeg2dec, 2);
1075 if (mpeg2dec->decoder.coding_type != I_TYPE)
1077 prescale (mpeg2dec, 1);
1079 if (decoder->chroma_quantizer[1] == decoder->quantizer_prescale[3])
1080 prescale (mpeg2dec, 3);
1084 if (!(mpeg2dec->nb_decode_slices))
1086 mpeg2dec->picture->flags |= PIC_FLAG_SKIP;
1088 else if (mpeg2dec->convert_start)
1090 mpeg2dec->convert_start (decoder->convert_id, mpeg2dec->fbuf[0],
1091 mpeg2dec->picture, mpeg2dec->info.gop);
1093 if (mpeg2dec->decoder.coding_type == B_TYPE)
1095 mpeg2_init_fbuf (&mpeg2dec->decoder, mpeg2dec->yuv_buf[2],
1096 mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1],
1097 mpeg2dec->yuv_buf[mpeg2dec->yuv_index]);
1099 else
1101 mpeg2_init_fbuf (&mpeg2dec->decoder,
1102 mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1],
1103 mpeg2dec->yuv_buf[mpeg2dec->yuv_index],
1104 mpeg2dec->yuv_buf[mpeg2dec->yuv_index]);
1106 if (mpeg2dec->state == STATE_SLICE)
1107 mpeg2dec->yuv_index ^= 1;
1110 else
1112 int b_type;
1114 b_type = (mpeg2dec->decoder.coding_type == B_TYPE);
1116 mpeg2_init_fbuf (&mpeg2dec->decoder, mpeg2dec->fbuf[0]->buf,
1117 mpeg2dec->fbuf[b_type + 1]->buf,
1118 mpeg2dec->fbuf[b_type]->buf);
1121 mpeg2dec->action = NULL;
1123 return (mpeg2_state_t)-1;
1126 static mpeg2_state_t seek_sequence (mpeg2dec_t * mpeg2dec)
1128 mpeg2_reset_info (&mpeg2dec->info);
1130 mpeg2dec->info.sequence = NULL;
1131 mpeg2dec->info.gop = NULL;
1133 mpeg2_header_state_init (mpeg2dec);
1135 mpeg2dec->action = mpeg2_seek_header;
1137 return mpeg2_seek_header (mpeg2dec);
1140 mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec)
1142 mpeg2_picture_t * picture;
1143 int b_type;
1145 b_type = (mpeg2dec->decoder.coding_type == B_TYPE);
1146 picture = mpeg2dec->pictures;
1148 if ((mpeg2dec->picture >= picture + 2) ^ b_type)
1149 picture = mpeg2dec->pictures + 2;
1151 mpeg2_reset_info (&mpeg2dec->info);
1153 if (!(mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY))
1155 mpeg2dec->info.display_picture = picture;
1157 if (picture->nb_fields == 1)
1158 mpeg2dec->info.display_picture_2nd = picture + 1;
1160 mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[b_type];
1162 if (!mpeg2dec->convert)
1163 mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type + 1];
1165 else if (!mpeg2dec->convert)
1167 mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type];
1170 mpeg2dec->action = seek_sequence;
1172 return STATE_END;