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
27 #include "mpeg2dec_config.h"
29 extern struct plugin_api
* rb
;
32 #include "attributes.h"
33 #include "mpeg2_internal.h"
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] =
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,
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 */
98 if (!mpeg2dec
->custom_fbuf
)
101 for (i
= mpeg2dec
->alloc_index_user
;
102 i
< mpeg2dec
->alloc_index
; i
++)
104 mpeg2_free(mpeg2dec
->fbuf_alloc
[i
].fbuf
.buf
[0]);
105 mpeg2_free(mpeg2dec
->fbuf_alloc
[i
].fbuf
.buf
[1]);
106 mpeg2_free(mpeg2dec
->fbuf_alloc
[i
].fbuf
.buf
[2]);
110 if (mpeg2dec
->convert_start
)
113 for (i
= 0; i
< 3; i
++)
115 mpeg2_free(mpeg2dec
->yuv_buf
[i
][0]);
116 mpeg2_free(mpeg2dec
->yuv_buf
[i
][1]);
117 mpeg2_free(mpeg2dec
->yuv_buf
[i
][2]);
121 if (mpeg2dec
->decoder
.convert_id
)
123 mpeg2_free(mpeg2dec
->decoder
.convert_id
);
128 mpeg2dec
->decoder
.coding_type
= I_TYPE
;
129 mpeg2dec
->decoder
.convert
= NULL
;
130 mpeg2dec
->decoder
.convert_id
= NULL
;
132 mpeg2dec
->picture
= mpeg2dec
->pictures
;
134 mpeg2dec
->fbuf
[0] = &mpeg2dec
->fbuf_alloc
[0].fbuf
;
135 mpeg2dec
->fbuf
[1] = &mpeg2dec
->fbuf_alloc
[1].fbuf
;
136 mpeg2dec
->fbuf
[2] = &mpeg2dec
->fbuf_alloc
[2].fbuf
;
139 mpeg2dec
->alloc_index
= 0;
140 mpeg2dec
->alloc_index_user
= 0;
141 mpeg2dec
->first_decode_slice
= 1;
142 mpeg2dec
->nb_decode_slices
= 0xb0 - 1;
143 mpeg2dec
->convert
= NULL
;
144 mpeg2dec
->convert_start
= NULL
;
145 mpeg2dec
->custom_fbuf
= 0;
146 mpeg2dec
->yuv_index
= 0;
149 void mpeg2_reset_info (mpeg2_info_t
* info
)
151 info
->current_picture
=
152 info
->current_picture_2nd
= NULL
;
154 info
->display_picture
=
155 info
->display_picture_2nd
= NULL
;
159 info
->discard_fbuf
= NULL
;
162 static void info_user_data (mpeg2dec_t
* mpeg2dec
)
164 if (mpeg2dec
->user_data_len
)
166 mpeg2dec
->info
.user_data
= mpeg2dec
->chunk_buffer
;
167 mpeg2dec
->info
.user_data_len
= mpeg2dec
->user_data_len
- 3;
171 int mpeg2_header_sequence (mpeg2dec_t
* mpeg2dec
)
173 static const unsigned int frame_period
[16] =
175 0, 1126125, 1125000, 1080000, 900900, 900000, 540000, 450450, 450000,
176 /* unofficial: xing 15 fps */
178 /* unofficial: libmpeg3 "Unofficial economy rates" 5/10/12/15 fps */
179 5400000, 2700000, 2250000, 1800000, 0, 0
182 uint8_t * buffer
= mpeg2dec
->chunk_start
;
183 mpeg2_sequence_t
* sequence
= &mpeg2dec
->new_sequence
;
186 if ((buffer
[6] & 0x20) != 0x20) /* missing marker_bit */
189 i
= (buffer
[0] << 16) | (buffer
[1] << 8) | buffer
[2];
191 if (!(sequence
->display_width
= sequence
->picture_width
= i
>> 12))
194 if (!(sequence
->display_height
= sequence
->picture_height
= i
& 0xfff))
197 sequence
->width
= (sequence
->picture_width
+ 15) & ~15;
198 sequence
->height
= (sequence
->picture_height
+ 15) & ~15;
199 sequence
->chroma_width
= sequence
->width
>> 1;
200 sequence
->chroma_height
= sequence
->height
>> 1;
202 sequence
->flags
= SEQ_FLAG_PROGRESSIVE_SEQUENCE
|
203 SEQ_VIDEO_FORMAT_UNSPECIFIED
;
205 sequence
->pixel_width
= buffer
[3] >> 4; /* aspect ratio */
206 sequence
->frame_period
= frame_period
[buffer
[3] & 15];
208 sequence
->byte_rate
= (buffer
[4]<<10) | (buffer
[5]<<2) | (buffer
[6]>>6);
210 sequence
->vbv_buffer_size
= ((buffer
[6]<<16) | (buffer
[7]<<8)) & 0x1ff800;
213 sequence
->flags
|= SEQ_FLAG_CONSTRAINED_PARAMETERS
;
215 mpeg2dec
->copy_matrix
= 3;
219 for (i
= 0; i
< 64; i
++)
221 mpeg2dec
->new_quantizer_matrix
[0][mpeg2_scan_norm
[i
]] =
222 (buffer
[i
+7] << 7) | (buffer
[i
+8] >> 1);
229 for (i
= 0; i
< 64; i
++)
231 mpeg2dec
->new_quantizer_matrix
[0][mpeg2_scan_norm
[i
]] =
232 default_intra_quantizer_matrix
[i
];
238 for (i
= 0; i
< 64; i
++)
240 mpeg2dec
->new_quantizer_matrix
[1][mpeg2_scan_norm
[i
]] =
246 rb
->memset (mpeg2dec
->new_quantizer_matrix
[1], 16, 64);
249 sequence
->profile_level_id
= 0x80;
250 sequence
->colour_primaries
= 0;
251 sequence
->transfer_characteristics
= 0;
252 sequence
->matrix_coefficients
= 0;
254 mpeg2dec
->ext_state
= SEQ_EXT
;
255 mpeg2dec
->state
= STATE_SEQUENCE
;
257 mpeg2dec
->display_offset_x
=
258 mpeg2dec
->display_offset_y
= 0;
263 static int sequence_ext (mpeg2dec_t
* mpeg2dec
)
265 uint8_t * buffer
= mpeg2dec
->chunk_start
;
266 mpeg2_sequence_t
* sequence
= &mpeg2dec
->new_sequence
;
269 if (!(buffer
[3] & 1))
272 sequence
->profile_level_id
= (buffer
[0] << 4) | (buffer
[1] >> 4);
274 sequence
->picture_width
+= ((buffer
[1] << 13) | (buffer
[2] << 5)) & 0x3000;
275 sequence
->display_width
= sequence
->picture_width
;
277 sequence
->picture_height
+= (buffer
[2] << 7) & 0x3000;
278 sequence
->display_height
= sequence
->picture_height
;
280 sequence
->width
= (sequence
->picture_width
+ 15) & ~15;
281 sequence
->height
= (sequence
->picture_height
+ 15) & ~15;
283 flags
= sequence
->flags
| SEQ_FLAG_MPEG2
;
285 if (!(buffer
[1] & 8))
287 flags
&= ~SEQ_FLAG_PROGRESSIVE_SEQUENCE
;
288 sequence
->height
= (sequence
->height
+ 31) & ~31;
291 if (buffer
[5] & 0x80)
292 flags
|= SEQ_FLAG_LOW_DELAY
;
294 sequence
->flags
= flags
;
295 sequence
->chroma_width
= sequence
->width
;
296 sequence
->chroma_height
= sequence
->height
;
298 switch (buffer
[1] & 6)
300 case 0: /* invalid */
303 sequence
->chroma_height
>>= 1;
305 sequence
->chroma_width
>>= 1;
308 sequence
->byte_rate
+= ((buffer
[2]<<25) | (buffer
[3]<<17)) & 0x3ffc0000;
310 sequence
->vbv_buffer_size
|= buffer
[4] << 21;
312 sequence
->frame_period
=
313 sequence
->frame_period
* ((buffer
[5]&31)+1) / (((buffer
[5]>>2)&3)+1);
315 mpeg2dec
->ext_state
= SEQ_DISPLAY_EXT
;
320 static int sequence_display_ext (mpeg2dec_t
* mpeg2dec
)
322 uint8_t * buffer
= mpeg2dec
->chunk_start
;
323 mpeg2_sequence_t
* sequence
= &mpeg2dec
->new_sequence
;
326 flags
= (sequence
->flags
& ~SEQ_MASK_VIDEO_FORMAT
) |
327 ((buffer
[0] << 4) & SEQ_MASK_VIDEO_FORMAT
);
331 flags
|= SEQ_FLAG_COLOUR_DESCRIPTION
;
332 sequence
->colour_primaries
= buffer
[1];
333 sequence
->transfer_characteristics
= buffer
[2];
334 sequence
->matrix_coefficients
= buffer
[3];
338 if (!(buffer
[2] & 2)) /* missing marker_bit */
341 sequence
->display_width
=
342 (buffer
[1] << 6) | (buffer
[2] >> 2);
344 sequence
->display_height
=
345 ((buffer
[2] & 1) << 13) | (buffer
[3] << 5) | (buffer
[4] >> 3);
350 static inline void finalize_sequence (mpeg2_sequence_t
* sequence
)
355 sequence
->byte_rate
*= 50;
357 if (sequence
->flags
& SEQ_FLAG_MPEG2
)
359 switch (sequence
->pixel_width
)
361 case 1: /* square pixels */
362 sequence
->pixel_width
=
363 sequence
->pixel_height
= 1;
365 case 2: /* 4:3 aspect ratio */
369 case 3: /* 16:9 aspect ratio */
373 case 4: /* 2.21:1 aspect ratio */
377 default: /* illegal */
378 sequence
->pixel_width
=
379 sequence
->pixel_height
= 0;
383 width
*= sequence
->display_height
;
384 height
*= sequence
->display_width
;
388 if (sequence
->byte_rate
== 50 * 0x3ffff)
389 sequence
->byte_rate
= 0; /* mpeg-1 VBR */
391 switch (sequence
->pixel_width
)
394 case 15: /* illegal */
395 sequence
->pixel_width
=
396 sequence
->pixel_height
= 0;
398 case 1: /* square pixels */
399 sequence
->pixel_width
=
400 sequence
->pixel_height
= 1;
402 case 3: /* 720x576 16:9 */
403 sequence
->pixel_width
= 64;
404 sequence
->pixel_height
= 45;
406 case 6: /* 720x480 16:9 */
407 sequence
->pixel_width
= 32;
408 sequence
->pixel_height
= 27;
410 case 12: /* 720*480 4:3 */
411 sequence
->pixel_width
= 8;
412 sequence
->pixel_height
= 9;
415 height
= 88 * sequence
->pixel_width
+ 1171;
420 sequence
->pixel_width
= width
;
421 sequence
->pixel_height
= height
;
423 /* find greatest common divisor */
427 width
= height
% tmp
;
431 sequence
->pixel_width
/= height
;
432 sequence
->pixel_height
/= height
;
435 static void copy_matrix (mpeg2dec_t
* mpeg2dec
, int index
)
437 if (rb
->memcmp (mpeg2dec
->quantizer_matrix
[index
],
438 mpeg2dec
->new_quantizer_matrix
[index
], 64))
440 rb
->memcpy (mpeg2dec
->quantizer_matrix
[index
],
441 mpeg2dec
->new_quantizer_matrix
[index
], 64);
443 mpeg2dec
->scaled
[index
] = -1;
447 static void finalize_matrix (mpeg2dec_t
* mpeg2dec
)
449 mpeg2_decoder_t
*decoder
= &mpeg2dec
->decoder
;
452 for (i
= 0; i
< 2; i
++)
454 if (mpeg2dec
->copy_matrix
& (1 << i
))
455 copy_matrix (mpeg2dec
, i
);
457 if ((mpeg2dec
->copy_matrix
& (4 << i
)) &&
458 rb
->memcmp(mpeg2dec
->quantizer_matrix
[i
],
459 mpeg2dec
->new_quantizer_matrix
[i
+2], 64))
461 copy_matrix (mpeg2dec
, i
+ 2);
462 decoder
->chroma_quantizer
[i
] = decoder
->quantizer_prescale
[i
+2];
464 else if (mpeg2dec
->copy_matrix
& (5 << i
))
466 decoder
->chroma_quantizer
[i
] = decoder
->quantizer_prescale
[i
];
471 static mpeg2_state_t
invalid_end_action (mpeg2dec_t
* mpeg2dec
)
473 mpeg2_reset_info (&mpeg2dec
->info
);
475 mpeg2dec
->info
.gop
= NULL
;
477 info_user_data (mpeg2dec
);
479 mpeg2_header_state_init (mpeg2dec
);
481 mpeg2dec
->sequence
= mpeg2dec
->new_sequence
;
482 mpeg2dec
->action
= mpeg2_seek_header
;
483 mpeg2dec
->state
= STATE_SEQUENCE
;
485 return STATE_SEQUENCE
;
488 void mpeg2_header_sequence_finalize (mpeg2dec_t
* mpeg2dec
)
490 mpeg2_sequence_t
* sequence
= &mpeg2dec
->new_sequence
;
491 mpeg2_decoder_t
* decoder
= &mpeg2dec
->decoder
;
493 finalize_sequence(sequence
);
494 finalize_matrix(mpeg2dec
);
496 decoder
->mpeg1
= !(sequence
->flags
& SEQ_FLAG_MPEG2
);
497 decoder
->width
= sequence
->width
;
498 decoder
->height
= sequence
->height
;
499 decoder
->vertical_position_extension
= sequence
->picture_height
> 2800;
500 decoder
->chroma_format
= (sequence
->chroma_width
== sequence
->width
) +
501 (sequence
->chroma_height
== sequence
->height
);
503 if (mpeg2dec
->sequence
.width
!= (unsigned)-1)
505 unsigned int new_byte_rate
;
508 * According to 6.1.1.6, repeat sequence headers should be
509 * identical to the original. However some DVDs dont respect
510 * that and have different bitrates in the repeat sequence
511 * headers. So we'll ignore that in the comparison and still
512 * consider these as repeat sequence headers.
514 * However, be careful not to alter the current sequence when
515 * returning STATE_INVALID_END.
517 new_byte_rate
= sequence
->byte_rate
;
518 sequence
->byte_rate
= mpeg2dec
->sequence
.byte_rate
;
520 if (rb
->memcmp(&mpeg2dec
->sequence
, sequence
,
521 sizeof (mpeg2_sequence_t
)))
523 decoder
->stride_frame
= sequence
->width
;
524 sequence
->byte_rate
= new_byte_rate
;
526 mpeg2_header_end (mpeg2dec
);
528 mpeg2dec
->action
= invalid_end_action
;
529 mpeg2dec
->state
= STATE_INVALID_END
;
533 sequence
->byte_rate
= new_byte_rate
;
534 mpeg2dec
->state
= STATE_SEQUENCE_REPEATED
;
538 decoder
->stride_frame
= sequence
->width
;
541 mpeg2dec
->sequence
= *sequence
;
542 mpeg2_reset_info(&mpeg2dec
->info
);
543 mpeg2dec
->info
.sequence
= &mpeg2dec
->sequence
;
544 mpeg2dec
->info
.gop
= NULL
;
546 info_user_data (mpeg2dec
);
549 int mpeg2_header_gop (mpeg2dec_t
* mpeg2dec
)
551 uint8_t * buffer
= mpeg2dec
->chunk_start
;
552 mpeg2_gop_t
* gop
= &mpeg2dec
->new_gop
;
554 if (!(buffer
[1] & 8))
557 gop
->hours
= (buffer
[0] >> 2) & 31;
558 gop
->minutes
= ((buffer
[0] << 4) | (buffer
[1] >> 4)) & 63;
559 gop
->seconds
= ((buffer
[1] << 3) | (buffer
[2] >> 5)) & 63;
560 gop
->pictures
= ((buffer
[2] << 1) | (buffer
[3] >> 7)) & 63;
561 gop
->flags
= (buffer
[0] >> 7) | ((buffer
[3] >> 4) & 6);
563 mpeg2dec
->state
= STATE_GOP
;
567 void mpeg2_header_gop_finalize (mpeg2dec_t
* mpeg2dec
)
569 mpeg2dec
->gop
= mpeg2dec
->new_gop
;
570 mpeg2_reset_info (&mpeg2dec
->info
);
571 mpeg2dec
->info
.gop
= &mpeg2dec
->gop
;
572 info_user_data (mpeg2dec
);
575 void mpeg2_set_fbuf (mpeg2dec_t
* mpeg2dec
, int b_type
)
579 for (i
= 0; i
< 3; i
++)
581 if (mpeg2dec
->fbuf
[1] != &mpeg2dec
->fbuf_alloc
[i
].fbuf
&&
582 mpeg2dec
->fbuf
[2] != &mpeg2dec
->fbuf_alloc
[i
].fbuf
)
584 mpeg2dec
->fbuf
[0] = &mpeg2dec
->fbuf_alloc
[i
].fbuf
;
585 mpeg2dec
->info
.current_fbuf
= mpeg2dec
->fbuf
[0];
587 if (b_type
|| (mpeg2dec
->sequence
.flags
& SEQ_FLAG_LOW_DELAY
))
589 if (b_type
|| mpeg2dec
->convert
)
590 mpeg2dec
->info
.discard_fbuf
= mpeg2dec
->fbuf
[0];
592 mpeg2dec
->info
.display_fbuf
= mpeg2dec
->fbuf
[0];
600 mpeg2_state_t
mpeg2_header_picture_start (mpeg2dec_t
* mpeg2dec
)
602 mpeg2_picture_t
* picture
= &mpeg2dec
->new_picture
;
604 mpeg2dec
->state
= (mpeg2dec
->state
!= STATE_SLICE_1ST
) ?
605 STATE_PICTURE
: STATE_PICTURE_2ND
;
607 picture
->tag
= picture
->tag2
= 0;
609 if (mpeg2dec
->num_tags
)
611 if (mpeg2dec
->bytes_since_tag
>= 4)
613 mpeg2dec
->num_tags
= 0;
614 picture
->tag
= mpeg2dec
->tag_current
;
615 picture
->tag2
= mpeg2dec
->tag2_current
;
616 picture
->flags
= PIC_FLAG_TAGS
;
618 else if (mpeg2dec
->num_tags
> 1)
620 mpeg2dec
->num_tags
= 1;
621 picture
->tag
= mpeg2dec
->tag_previous
;
622 picture
->tag2
= mpeg2dec
->tag2_previous
;
623 picture
->flags
= PIC_FLAG_TAGS
;
627 picture
->display_offset
[0].x
= picture
->display_offset
[1].x
=
628 picture
->display_offset
[2].x
= mpeg2dec
->display_offset_x
;
630 picture
->display_offset
[0].y
= picture
->display_offset
[1].y
=
631 picture
->display_offset
[2].y
= mpeg2dec
->display_offset_y
;
633 return mpeg2_parse_header (mpeg2dec
);
636 int mpeg2_header_picture (mpeg2dec_t
* mpeg2dec
)
638 uint8_t * buffer
= mpeg2dec
->chunk_start
;
639 mpeg2_picture_t
* picture
= &mpeg2dec
->new_picture
;
640 mpeg2_decoder_t
* decoder
= &mpeg2dec
->decoder
;
643 type
= (buffer
[1] >> 3) & 7;
644 mpeg2dec
->ext_state
= PIC_CODING_EXT
;
646 picture
->temporal_reference
= (buffer
[0] << 2) | (buffer
[1] >> 6);
648 picture
->flags
|= type
;
650 if (type
== PIC_FLAG_CODING_TYPE_P
|| type
== PIC_FLAG_CODING_TYPE_B
)
652 /* forward_f_code and backward_f_code - used in mpeg1 only */
653 decoder
->f_motion
.f_code
[1] = (buffer
[3] >> 2) & 1;
654 decoder
->f_motion
.f_code
[0] =
655 (((buffer
[3] << 1) | (buffer
[4] >> 7)) & 7) - 1;
656 decoder
->b_motion
.f_code
[1] = (buffer
[4] >> 6) & 1;
657 decoder
->b_motion
.f_code
[0] = ((buffer
[4] >> 3) & 7) - 1;
660 /* XXXXXX decode extra_information_picture as well */
662 picture
->nb_fields
= 2;
664 mpeg2dec
->q_scale_type
= 0;
665 decoder
->intra_dc_precision
= 7;
666 decoder
->frame_pred_frame_dct
= 1;
667 decoder
->concealment_motion_vectors
= 0;
668 decoder
->scan
= mpeg2_scan_norm
;
669 decoder
->picture_structure
= FRAME_PICTURE
;
670 mpeg2dec
->copy_matrix
= 0;
675 static int picture_coding_ext (mpeg2dec_t
* mpeg2dec
)
677 uint8_t * buffer
= mpeg2dec
->chunk_start
;
678 mpeg2_picture_t
* picture
= &mpeg2dec
->new_picture
;
679 mpeg2_decoder_t
* decoder
= &mpeg2dec
->decoder
;
682 /* pre subtract 1 for use later in compute_motion_vector */
683 decoder
->f_motion
.f_code
[0] = (buffer
[0] & 15) - 1;
684 decoder
->f_motion
.f_code
[1] = (buffer
[1] >> 4) - 1;
685 decoder
->b_motion
.f_code
[0] = (buffer
[1] & 15) - 1;
686 decoder
->b_motion
.f_code
[1] = (buffer
[2] >> 4) - 1;
688 flags
= picture
->flags
;
690 decoder
->intra_dc_precision
= 7 - ((buffer
[2] >> 2) & 3);
691 decoder
->picture_structure
= buffer
[2] & 3;
693 switch (decoder
->picture_structure
)
696 flags
|= PIC_FLAG_TOP_FIELD_FIRST
;
698 picture
->nb_fields
= 1;
701 if (!(mpeg2dec
->sequence
.flags
& SEQ_FLAG_PROGRESSIVE_SEQUENCE
))
703 picture
->nb_fields
= (buffer
[3] & 2) ? 3 : 2;
704 flags
|= (buffer
[3] & 128) ? PIC_FLAG_TOP_FIELD_FIRST
: 0;
708 picture
->nb_fields
= (buffer
[3]&2) ? ((buffer
[3]&128) ? 6 : 4) : 2;
715 decoder
->top_field_first
= buffer
[3] >> 7;
716 decoder
->frame_pred_frame_dct
= (buffer
[3] >> 6) & 1;
717 decoder
->concealment_motion_vectors
= (buffer
[3] >> 5) & 1;
718 mpeg2dec
->q_scale_type
= buffer
[3] & 16;
719 decoder
->intra_vlc_format
= (buffer
[3] >> 3) & 1;
720 decoder
->scan
= (buffer
[3] & 4) ? mpeg2_scan_alt
: mpeg2_scan_norm
;
721 flags
|= (buffer
[4] & 0x80) ? PIC_FLAG_PROGRESSIVE_FRAME
: 0;
723 if (buffer
[4] & 0x40)
725 flags
|= (((buffer
[4]<<26) | (buffer
[5]<<18) | (buffer
[6]<<10)) &
726 PIC_MASK_COMPOSITE_DISPLAY
) | PIC_FLAG_COMPOSITE_DISPLAY
;
729 picture
->flags
= flags
;
731 mpeg2dec
->ext_state
= PIC_DISPLAY_EXT
| COPYRIGHT_EXT
| QUANT_MATRIX_EXT
;
736 static int picture_display_ext (mpeg2dec_t
* mpeg2dec
)
738 uint8_t * buffer
= mpeg2dec
->chunk_start
;
739 mpeg2_picture_t
* picture
= &mpeg2dec
->new_picture
;
742 nb_pos
= picture
->nb_fields
;
744 if (mpeg2dec
->sequence
.flags
& SEQ_FLAG_PROGRESSIVE_SEQUENCE
)
747 for (i
= 0; i
< nb_pos
; i
++)
751 x
= ((buffer
[4*i
] << 24) | (buffer
[4*i
+1] << 16) |
752 (buffer
[4*i
+2] << 8) | buffer
[4*i
+3]) >> (11-2*i
);
754 y
= ((buffer
[4*i
+2] << 24) | (buffer
[4*i
+3] << 16) |
755 (buffer
[4*i
+4] << 8) | buffer
[4*i
+5]) >> (10-2*i
);
760 picture
->display_offset
[i
].x
= mpeg2dec
->display_offset_x
= x
>> 1;
761 picture
->display_offset
[i
].y
= mpeg2dec
->display_offset_y
= y
>> 1;
766 picture
->display_offset
[i
].x
= mpeg2dec
->display_offset_x
;
767 picture
->display_offset
[i
].y
= mpeg2dec
->display_offset_y
;
773 void mpeg2_header_picture_finalize (mpeg2dec_t
* mpeg2dec
)
775 mpeg2_decoder_t
* decoder
= &mpeg2dec
->decoder
;
776 int old_type_b
= decoder
->coding_type
== B_TYPE
;
777 int low_delay
= mpeg2dec
->sequence
.flags
& SEQ_FLAG_LOW_DELAY
;
779 finalize_matrix (mpeg2dec
);
780 decoder
->coding_type
= mpeg2dec
->new_picture
.flags
& PIC_MASK_CODING_TYPE
;
782 if (mpeg2dec
->state
== STATE_PICTURE
)
784 mpeg2_picture_t
* picture
;
785 mpeg2_picture_t
* other
;
787 decoder
->second_field
= 0;
789 picture
= other
= mpeg2dec
->pictures
;
791 if (old_type_b
^ (mpeg2dec
->picture
< mpeg2dec
->pictures
+ 2))
796 mpeg2dec
->picture
= picture
;
797 *picture
= mpeg2dec
->new_picture
;
801 mpeg2dec
->fbuf
[2] = mpeg2dec
->fbuf
[1];
802 mpeg2dec
->fbuf
[1] = mpeg2dec
->fbuf
[0];
805 mpeg2dec
->fbuf
[0] = NULL
;
806 mpeg2_reset_info (&mpeg2dec
->info
);
807 mpeg2dec
->info
.current_picture
= picture
;
808 mpeg2dec
->info
.display_picture
= picture
;
810 if (decoder
->coding_type
!= B_TYPE
)
816 mpeg2dec
->info
.display_picture
= NULL
;
821 mpeg2dec
->info
.display_picture
= other
;
823 if (other
->nb_fields
== 1)
824 mpeg2dec
->info
.display_picture_2nd
= other
+ 1;
826 mpeg2dec
->info
.display_fbuf
= mpeg2dec
->fbuf
[1];
830 if (!low_delay
+ !mpeg2dec
->convert
)
832 mpeg2dec
->info
.discard_fbuf
=
833 mpeg2dec
->fbuf
[!low_delay
+ !mpeg2dec
->convert
];
837 if (mpeg2dec
->convert
)
839 mpeg2_convert_init_t convert_init
;
841 if (!mpeg2dec
->convert_start
)
845 mpeg2dec
->decoder
.convert_id
=
846 mpeg2_malloc (mpeg2dec
->convert_id_size
,
847 MPEG2_ALLOC_CONVERT_ID
);
849 mpeg2dec
->convert (MPEG2_CONVERT_START
,
850 mpeg2dec
->decoder
.convert_id
,
852 mpeg2dec
->convert_stride
,
853 mpeg2dec
->convert_arg
, &convert_init
);
855 mpeg2dec
->convert_start
= convert_init
.start
;
856 mpeg2dec
->decoder
.convert
= convert_init
.copy
;
858 y_size
= decoder
->stride_frame
* mpeg2dec
->sequence
.height
;
859 uv_size
= y_size
>> (2 - mpeg2dec
->decoder
.chroma_format
);
861 mpeg2dec
->yuv_buf
[0][0] =
862 (uint8_t *) mpeg2_malloc(y_size
, MPEG2_ALLOC_YUV
);
863 mpeg2dec
->yuv_buf
[0][1] =
864 (uint8_t *) mpeg2_malloc(uv_size
, MPEG2_ALLOC_YUV
);
865 mpeg2dec
->yuv_buf
[0][2] =
866 (uint8_t *) mpeg2_malloc(uv_size
, MPEG2_ALLOC_YUV
);
868 mpeg2dec
->yuv_buf
[1][0] =
869 (uint8_t *) mpeg2_malloc(y_size
, MPEG2_ALLOC_YUV
);
870 mpeg2dec
->yuv_buf
[1][1] =
871 (uint8_t *) mpeg2_malloc(uv_size
, MPEG2_ALLOC_YUV
);
872 mpeg2dec
->yuv_buf
[1][2] =
873 (uint8_t *) mpeg2_malloc(uv_size
, MPEG2_ALLOC_YUV
);
875 y_size
= decoder
->stride_frame
* 32;
876 uv_size
= y_size
>> (2 - mpeg2dec
->decoder
.chroma_format
);
878 mpeg2dec
->yuv_buf
[2][0] =
879 (uint8_t *) mpeg2_malloc(y_size
, MPEG2_ALLOC_YUV
);
880 mpeg2dec
->yuv_buf
[2][1] =
881 (uint8_t *) mpeg2_malloc(uv_size
, MPEG2_ALLOC_YUV
);
882 mpeg2dec
->yuv_buf
[2][2] =
883 (uint8_t *) mpeg2_malloc(uv_size
, MPEG2_ALLOC_YUV
);
886 if (!mpeg2dec
->custom_fbuf
)
888 while (mpeg2dec
->alloc_index
< 3)
892 fbuf
= &mpeg2dec
->fbuf_alloc
[mpeg2dec
->alloc_index
++].fbuf
;
896 (uint8_t *) mpeg2_malloc (convert_init
.buf_size
[0],
897 MPEG2_ALLOC_CONVERTED
);
899 (uint8_t *) mpeg2_malloc (convert_init
.buf_size
[1],
900 MPEG2_ALLOC_CONVERTED
);
902 (uint8_t *) mpeg2_malloc (convert_init
.buf_size
[2],
903 MPEG2_ALLOC_CONVERTED
);
905 mpeg2_set_fbuf (mpeg2dec
, (decoder
->coding_type
== B_TYPE
));
908 else if (!mpeg2dec
->custom_fbuf
)
910 while (mpeg2dec
->alloc_index
< 3)
915 fbuf
= &mpeg2dec
->fbuf_alloc
[mpeg2dec
->alloc_index
++].fbuf
;
919 y_size
= decoder
->stride_frame
* mpeg2dec
->sequence
.height
;
920 uv_size
= y_size
>> (2 - decoder
->chroma_format
);
922 fbuf
->buf
[0] = (uint8_t *) mpeg2_malloc (y_size
,
924 fbuf
->buf
[1] = (uint8_t *) mpeg2_malloc (uv_size
,
926 fbuf
->buf
[2] = (uint8_t *) mpeg2_malloc (uv_size
,
930 mpeg2_set_fbuf (mpeg2dec
, (decoder
->coding_type
== B_TYPE
));
935 decoder
->second_field
= 1;
936 mpeg2dec
->picture
++; /* second field picture */
938 *(mpeg2dec
->picture
) = mpeg2dec
->new_picture
;
940 mpeg2dec
->info
.current_picture_2nd
= mpeg2dec
->picture
;
942 if (low_delay
|| decoder
->coding_type
== B_TYPE
)
943 mpeg2dec
->info
.display_picture_2nd
= mpeg2dec
->picture
;
946 info_user_data (mpeg2dec
);
949 static int copyright_ext (mpeg2dec_t
* mpeg2dec
)
955 static int quant_matrix_ext (mpeg2dec_t
* mpeg2dec
)
957 uint8_t * buffer
= mpeg2dec
->chunk_start
;
960 for (i
= 0; i
< 4; i
++)
962 if (buffer
[0] & (8 >> i
))
964 for (j
= 0; j
< 64; j
++)
966 mpeg2dec
->new_quantizer_matrix
[i
][mpeg2_scan_norm
[j
]] =
967 (buffer
[j
] << (i
+5)) | (buffer
[j
+1] >> (3-i
));
970 mpeg2dec
->copy_matrix
|= 1 << i
;
978 int mpeg2_header_extension (mpeg2dec_t
* mpeg2dec
)
980 static int (* const parser
[9]) (mpeg2dec_t
*) =
984 sequence_display_ext
,
995 ext
= mpeg2dec
->chunk_start
[0] >> 4;
998 if (!(mpeg2dec
->ext_state
& ext_bit
))
999 return 0; /* ignore illegal extensions */
1001 mpeg2dec
->ext_state
&= ~ext_bit
;
1003 return parser
[ext
] (mpeg2dec
);
1006 int mpeg2_header_user_data (mpeg2dec_t
* mpeg2dec
)
1008 mpeg2dec
->user_data_len
+= mpeg2dec
->chunk_ptr
- 1 - mpeg2dec
->chunk_start
;
1009 mpeg2dec
->chunk_start
= mpeg2dec
->chunk_ptr
- 1;
1014 static void prescale (mpeg2dec_t
* mpeg2dec
, int index
)
1016 static const int non_linear_scale
[32] =
1018 0, 1, 2, 3, 4, 5, 6, 7,
1019 8, 10, 12, 14, 16, 18, 20, 22,
1020 24, 28, 32, 36, 40, 44, 48, 52,
1021 56, 64, 72, 80, 88, 96, 104, 112
1025 mpeg2_decoder_t
* decoder
= &mpeg2dec
->decoder
;
1027 if (mpeg2dec
->scaled
[index
] != mpeg2dec
->q_scale_type
)
1029 mpeg2dec
->scaled
[index
] = mpeg2dec
->q_scale_type
;
1031 for (i
= 0; i
< 32; i
++)
1033 k
= mpeg2dec
->q_scale_type
? non_linear_scale
[i
] : (i
<< 1);
1035 for (j
= 0; j
< 64; j
++)
1037 decoder
->quantizer_prescale
[index
][i
][j
] =
1038 k
* mpeg2dec
->quantizer_matrix
[index
][j
];
1044 mpeg2_state_t
mpeg2_header_slice_start (mpeg2dec_t
* mpeg2dec
)
1046 mpeg2_decoder_t
* decoder
= &mpeg2dec
->decoder
;
1048 mpeg2dec
->info
.user_data
= NULL
;
1049 mpeg2dec
->info
.user_data_len
= 0;
1050 mpeg2dec
->state
= (mpeg2dec
->picture
->nb_fields
> 1 ||
1051 mpeg2dec
->state
== STATE_PICTURE_2ND
) ?
1052 STATE_SLICE
: STATE_SLICE_1ST
;
1054 if (mpeg2dec
->decoder
.coding_type
!= D_TYPE
)
1056 prescale (mpeg2dec
, 0);
1058 if (decoder
->chroma_quantizer
[0] == decoder
->quantizer_prescale
[2])
1059 prescale (mpeg2dec
, 2);
1061 if (mpeg2dec
->decoder
.coding_type
!= I_TYPE
)
1063 prescale (mpeg2dec
, 1);
1065 if (decoder
->chroma_quantizer
[1] == decoder
->quantizer_prescale
[3])
1066 prescale (mpeg2dec
, 3);
1070 if (!(mpeg2dec
->nb_decode_slices
))
1072 mpeg2dec
->picture
->flags
|= PIC_FLAG_SKIP
;
1074 else if (mpeg2dec
->convert_start
)
1076 mpeg2dec
->convert_start (decoder
->convert_id
, mpeg2dec
->fbuf
[0],
1077 mpeg2dec
->picture
, mpeg2dec
->info
.gop
);
1079 if (mpeg2dec
->decoder
.coding_type
== B_TYPE
)
1081 mpeg2_init_fbuf (&mpeg2dec
->decoder
, mpeg2dec
->yuv_buf
[2],
1082 mpeg2dec
->yuv_buf
[mpeg2dec
->yuv_index
^ 1],
1083 mpeg2dec
->yuv_buf
[mpeg2dec
->yuv_index
]);
1087 mpeg2_init_fbuf (&mpeg2dec
->decoder
,
1088 mpeg2dec
->yuv_buf
[mpeg2dec
->yuv_index
^ 1],
1089 mpeg2dec
->yuv_buf
[mpeg2dec
->yuv_index
],
1090 mpeg2dec
->yuv_buf
[mpeg2dec
->yuv_index
]);
1092 if (mpeg2dec
->state
== STATE_SLICE
)
1093 mpeg2dec
->yuv_index
^= 1;
1100 b_type
= (mpeg2dec
->decoder
.coding_type
== B_TYPE
);
1102 mpeg2_init_fbuf (&mpeg2dec
->decoder
, mpeg2dec
->fbuf
[0]->buf
,
1103 mpeg2dec
->fbuf
[b_type
+ 1]->buf
,
1104 mpeg2dec
->fbuf
[b_type
]->buf
);
1107 mpeg2dec
->action
= NULL
;
1109 return (mpeg2_state_t
)-1;
1112 static mpeg2_state_t
seek_sequence (mpeg2dec_t
* mpeg2dec
)
1114 mpeg2_reset_info (&mpeg2dec
->info
);
1116 mpeg2dec
->info
.sequence
= NULL
;
1117 mpeg2dec
->info
.gop
= NULL
;
1119 mpeg2_header_state_init (mpeg2dec
);
1121 mpeg2dec
->action
= mpeg2_seek_header
;
1123 return mpeg2_seek_header (mpeg2dec
);
1126 mpeg2_state_t
mpeg2_header_end (mpeg2dec_t
* mpeg2dec
)
1128 mpeg2_picture_t
* picture
;
1131 b_type
= (mpeg2dec
->decoder
.coding_type
== B_TYPE
);
1132 picture
= mpeg2dec
->pictures
;
1134 if ((mpeg2dec
->picture
>= picture
+ 2) ^ b_type
)
1135 picture
= mpeg2dec
->pictures
+ 2;
1137 mpeg2_reset_info (&mpeg2dec
->info
);
1139 if (!(mpeg2dec
->sequence
.flags
& SEQ_FLAG_LOW_DELAY
))
1141 mpeg2dec
->info
.display_picture
= picture
;
1143 if (picture
->nb_fields
== 1)
1144 mpeg2dec
->info
.display_picture_2nd
= picture
+ 1;
1146 mpeg2dec
->info
.display_fbuf
= mpeg2dec
->fbuf
[b_type
];
1148 if (!mpeg2dec
->convert
)
1149 mpeg2dec
->info
.discard_fbuf
= mpeg2dec
->fbuf
[b_type
+ 1];
1151 else if (!mpeg2dec
->convert
)
1153 mpeg2dec
->info
.discard_fbuf
= mpeg2dec
->fbuf
[b_type
];
1156 mpeg2dec
->action
= seek_sequence
;