1 /*****************************************************************************
2 * vpar_headers.c : headers parsing
4 *****************************************************************************/
6 /*****************************************************************************
8 *****************************************************************************/
19 #include "vlc_thread.h"
22 #include "debug.h" /* ?? temporaire, requis par netlist.h */
25 #include "input_netlist.h"
26 #include "decoder_fifo.h"
28 #include "video_output.h"
30 #include "vdec_idct.h"
31 #include "video_decoder.h"
32 #include "vdec_motion.h"
34 #include "vpar_blocks.h"
35 #include "vpar_headers.h"
36 #include "vpar_synchro.h"
37 #include "video_parser.h"
38 #include "vpar_motion.h"
39 #include "video_fifo.h"
44 static __inline__ void NextStartCode( vpar_thread_t * p_vpar );
45 static void SequenceHeader( vpar_thread_t * p_vpar );
46 static void GroupHeader( vpar_thread_t * p_vpar );
47 static void PictureHeader( vpar_thread_t * p_vpar );
48 static void SliceHeader00( vpar_thread_t * p_vpar,
49 int * pi_mb_address, int i_mb_base,
51 static void SliceHeader01( vpar_thread_t * p_vpar,
52 int * pi_mb_address, int i_mb_base,
54 static void SliceHeader10( vpar_thread_t * p_vpar,
55 int * pi_mb_address, int i_mb_base,
57 static void SliceHeader11( vpar_thread_t * p_vpar,
58 int * pi_mb_address, int i_mb_base,
60 static __inline__ void SliceHeader( vpar_thread_t * p_vpar,
61 int * pi_mb_address, int i_mb_base,
63 static void ExtensionAndUserData( vpar_thread_t * p_vpar );
64 static void QuantMatrixExtension( vpar_thread_t * p_vpar );
65 static void SequenceScalableExtension( vpar_thread_t * p_vpar );
66 static void SequenceDisplayExtension( vpar_thread_t * p_vpar );
67 static void PictureDisplayExtension( vpar_thread_t * p_vpar );
68 static void PictureSpatialScalableExtension( vpar_thread_t * p_vpar );
69 static void PictureTemporalScalableExtension( vpar_thread_t * p_vpar );
70 static void CopyrightExtension( vpar_thread_t * p_vpar );
76 /*****************************************************************************
77 * pi_default_intra_quant : default quantization matrix
78 *****************************************************************************/
80 int pi_default_intra_quant[] =
82 8, 16, 19, 22, 26, 27, 29, 34,
83 16, 16, 22, 24, 27, 29, 34, 37,
84 19, 22, 26, 27, 29, 34, 34, 38,
85 22, 22, 26, 27, 29, 34, 37, 40,
86 22, 26, 27, 29, 32, 35, 40, 48,
87 26, 27, 29, 32, 35, 40, 48, 58,
88 26, 27, 29, 34, 38, 46, 56, 69,
89 27, 29, 35, 38, 46, 56, 69, 83
92 int pi_default_intra_quant[] =
94 2048, 5681, 6355, 6623, 6656, 5431, 4018, 2401,
95 5681, 7880, 10207, 10021, 9587, 8091, 6534, 3625,
96 6355, 10207, 11363, 10619, 9700, 8935, 6155, 3507,
97 6623, 9186, 10226, 9557, 8730, 8041, 6028, 3322,
98 5632, 9232, 9031, 8730, 8192, 7040, 5542, 3390,
99 5230, 7533, 7621, 7568, 7040, 6321, 5225, 3219,
100 3602, 5189, 5250, 5539, 5265, 5007, 4199, 2638,
101 1907, 2841, 3230, 3156, 3249, 3108, 2638, 1617
105 /*****************************************************************************
106 * pi_default_nonintra_quant : default quantization matrix
107 *****************************************************************************/
109 int pi_default_nonintra_quant[] =
111 16, 16, 16, 16, 16, 16, 16, 16,
112 16, 16, 16, 16, 16, 16, 16, 16,
113 16, 16, 16, 16, 16, 16, 16, 16,
114 16, 16, 16, 16, 16, 16, 16, 16,
115 16, 16, 16, 16, 16, 16, 16, 16,
116 16, 16, 16, 16, 16, 16, 16, 16,
117 16, 16, 16, 16, 16, 16, 16, 16,
118 16, 16, 16, 16, 16, 16, 16, 16
121 int pi_default_nonintra_quanit[] =
123 4096, 5680, 5344, 4816, 4096, 3216, 2224, 1136,
124 5680, 7888, 7424, 6688, 5680, 4464, 3072, 1568,
125 5344, 7424, 6992, 6288, 5344, 4208, 2896, 1472,
126 4816, 6688, 6288, 5664, 4816, 3792, 2608, 1328,
127 4096, 5680, 5344, 4816, 4096, 3216, 2224, 1136,
128 3216, 4464, 4208, 3792, 3216, 2528, 1744, 880,
129 2224, 3072, 2896, 2608, 2224, 1744, 1200, 608,
130 1136, 1568, 1472, 1328, 1136, 880, 608, 304
134 /*****************************************************************************
135 * pi_scan : zig-zag and alternate scan patterns
136 *****************************************************************************/
139 { /* Zig-Zag pattern */
140 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
141 12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
142 35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
143 58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
145 { /* Alternate scan pattern */
146 0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
147 41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
148 51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
149 53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
154 * Local inline functions.
157 /*****************************************************************************
158 * NextStartCode : Find the next start code
159 *****************************************************************************/
160 static __inline__ void NextStartCode( vpar_thread_t * p_vpar )
162 /* Re-align the buffer on an 8-bit boundary */
163 RealignBits( &p_vpar->bit_stream );
165 while( ShowBits( &p_vpar->bit_stream, 24 ) != 0x01L && !p_vpar->b_die )
167 RemoveBits( &p_vpar->bit_stream, 8 );
171 /*****************************************************************************
172 * ReferenceUpdate : Update the reference pointers when we have a new picture
173 *****************************************************************************/
174 static void __inline__ ReferenceUpdate( vpar_thread_t * p_vpar,
176 picture_t * p_newref )
178 if( i_coding_type != B_CODING_TYPE )
180 if( p_vpar->sequence.p_forward != NULL )
181 vout_UnlinkPicture( p_vpar->p_vout, p_vpar->sequence.p_forward );
182 if( p_vpar->sequence.p_backward != NULL )
184 vout_DatePicture( p_vpar->p_vout, p_vpar->sequence.p_backward,
185 vpar_SynchroDate( p_vpar ) );
187 p_vpar->sequence.p_forward = p_vpar->sequence.p_backward;
188 p_vpar->sequence.p_backward = p_newref;
189 if( p_newref != NULL )
190 vout_LinkPicture( p_vpar->p_vout, p_newref );
194 /*****************************************************************************
195 * ReferenceReplace : Replace the last reference pointer when we destroy
197 *****************************************************************************/
198 static void __inline__ ReferenceReplace( vpar_thread_t * p_vpar,
200 picture_t * p_newref )
202 if( i_coding_type != B_CODING_TYPE )
204 if( p_vpar->sequence.p_backward != NULL )
205 vout_UnlinkPicture( p_vpar->p_vout, p_vpar->sequence.p_backward );
206 p_vpar->sequence.p_backward = p_newref;
207 if( p_newref != NULL )
208 vout_LinkPicture( p_vpar->p_vout, p_newref );
212 /*****************************************************************************
213 * LoadMatrix : Load a quantization matrix
214 *****************************************************************************/
215 static __inline__ void LoadMatrix( vpar_thread_t * p_vpar, quant_matrix_t * p_matrix )
219 if( !p_matrix->b_allocated )
221 /* Allocate a piece of memory to load the matrix. */
222 if( (p_matrix->pi_matrix = (int *)malloc( 64*sizeof(int) )) == NULL )
224 intf_ErrMsg("vpar error: allocation error in LoadMatrix()\n");
228 p_matrix->b_allocated = 1;
231 for( i_dummy = 0; i_dummy < 64; i_dummy++ )
233 p_matrix->pi_matrix[pi_scan[SCAN_ZIGZAG][i_dummy]]
234 = GetBits( &p_vpar->bit_stream, 8 );
238 /* Discrete Fourier Transform requires the quantization matrices to
239 * be normalized before using them. */
240 vdec_NormQuantMatrix( p_matrix->pi_matrix );
244 /*****************************************************************************
245 * LinkMatrix : Link a quantization matrix to another
246 *****************************************************************************/
247 static __inline__ void LinkMatrix( quant_matrix_t * p_matrix, int * pi_array )
249 if( p_matrix->b_allocated )
251 /* Deallocate the piece of memory. */
252 free( p_matrix->pi_matrix );
253 p_matrix->b_allocated = 0;
256 p_matrix->pi_matrix = pi_array;
260 * Exported functions.
263 /*****************************************************************************
264 * vpar_NextSequenceHeader : Find the next sequence header
265 *****************************************************************************/
266 int vpar_NextSequenceHeader( vpar_thread_t * p_vpar )
268 while( !p_vpar->b_die )
270 NextStartCode( p_vpar );
271 if( ShowBits( &p_vpar->bit_stream, 32 ) == SEQUENCE_HEADER_CODE )
273 RemoveBits( &p_vpar->bit_stream, 8 );
278 /*****************************************************************************
279 * vpar_ParseHeader : Parse the next header
280 *****************************************************************************/
281 int vpar_ParseHeader( vpar_thread_t * p_vpar )
283 while( !p_vpar->b_die )
285 NextStartCode( p_vpar );
286 switch( GetBits32( &p_vpar->bit_stream ) )
288 case SEQUENCE_HEADER_CODE:
289 SequenceHeader( p_vpar );
293 case GROUP_START_CODE:
294 GroupHeader( p_vpar );
298 case PICTURE_START_CODE:
299 PictureHeader( p_vpar );
303 case SEQUENCE_END_CODE:
304 intf_DbgMsg("vpar debug: sequence end code received\n");
316 * Following functions are local
319 /*****************************************************************************
320 * SequenceHeader : Parse the next sequence header
321 *****************************************************************************/
322 static void SequenceHeader( vpar_thread_t * p_vpar )
325 static float r_frame_rate_table[16] =
328 ((23.0*1000.0)/1001.0),
331 ((30.0*1000.0)/1001.0),
334 ((60.0*1000.0)/1001.0),
336 RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED
340 int i_height_save, i_width_save;
342 i_height_save = p_vpar->sequence.i_height;
343 i_width_save = p_vpar->sequence.i_width;
345 p_vpar->sequence.i_width = GetBits( &p_vpar->bit_stream, 12 );
346 p_vpar->sequence.i_height = GetBits( &p_vpar->bit_stream, 12 );
347 p_vpar->sequence.i_aspect_ratio = GetBits( &p_vpar->bit_stream, 4 );
348 p_vpar->sequence.r_frame_rate =
349 r_frame_rate_table[ GetBits( &p_vpar->bit_stream, 4 ) ];
351 /* We don't need bit_rate_value, marker_bit, vbv_buffer_size,
352 * constrained_parameters_flag */
353 RemoveBits( &p_vpar->bit_stream, 30 );
356 * Quantization matrices
358 if( GetBits( &p_vpar->bit_stream, 1 ) ) /* load_intra_quantizer_matrix */
360 LoadMatrix( p_vpar, &p_vpar->sequence.intra_quant );
364 /* Use default matrix. */
365 LinkMatrix( &p_vpar->sequence.intra_quant, pi_default_intra_quant );
368 if( GetBits( &p_vpar->bit_stream, 1 ) ) /* load_non_intra_quantizer_matrix */
370 LoadMatrix( p_vpar, &p_vpar->sequence.nonintra_quant );
374 /* Use default matrix. */
375 LinkMatrix( &p_vpar->sequence.nonintra_quant, pi_default_nonintra_quant );
378 /* Unless later overwritten by a matrix extension, we have the same
379 * matrices for luminance and chrominance. */
380 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
381 p_vpar->sequence.intra_quant.pi_matrix );
382 LinkMatrix( &p_vpar->sequence.chroma_nonintra_quant,
383 p_vpar->sequence.nonintra_quant.pi_matrix );
388 NextStartCode( p_vpar );
389 if( ShowBits( &p_vpar->bit_stream, 32 ) == EXTENSION_START_CODE )
393 /* Turn the MPEG2 flag on */
394 p_vpar->sequence.b_mpeg2 = 1;
396 /* Parse sequence_extension */
397 RemoveBits32( &p_vpar->bit_stream );
398 /* extension_start_code_identifier, profile_and_level_indication */
399 RemoveBits( &p_vpar->bit_stream, 12 );
400 p_vpar->sequence.b_progressive = GetBits( &p_vpar->bit_stream, 1 );
401 p_vpar->sequence.i_chroma_format = GetBits( &p_vpar->bit_stream, 2 );
402 p_vpar->sequence.i_width |= GetBits( &p_vpar->bit_stream, 2 ) << 12;
403 p_vpar->sequence.i_height |= GetBits( &p_vpar->bit_stream, 2 ) << 12;
404 /* bit_rate_extension, marker_bit, vbv_buffer_size_extension, low_delay */
405 RemoveBits( &p_vpar->bit_stream, 22 );
406 /* frame_rate_extension_n */
407 i_dummy = GetBits( &p_vpar->bit_stream, 2 );
408 /* frame_rate_extension_d */
409 p_vpar->sequence.r_frame_rate *= (i_dummy + 1)
410 / (GetBits( &p_vpar->bit_stream, 5 ) + 1);
414 /* It's an MPEG-1 stream. Put adequate parameters. */
416 p_vpar->sequence.b_mpeg2 = 0;
417 p_vpar->sequence.b_progressive = 1;
418 p_vpar->sequence.i_chroma_format = CHROMA_420;
422 p_vpar->sequence.i_mb_width = (p_vpar->sequence.i_width + 15) / 16;
423 p_vpar->sequence.i_mb_height = (p_vpar->sequence.b_progressive) ?
424 (p_vpar->sequence.i_height + 15) / 16 :
425 2 * ((p_vpar->sequence.i_height + 31) / 32);
426 p_vpar->sequence.i_mb_size = p_vpar->sequence.i_mb_width
427 * p_vpar->sequence.i_mb_height;
428 p_vpar->sequence.i_width = (p_vpar->sequence.i_mb_width * 16);
429 p_vpar->sequence.i_height = (p_vpar->sequence.i_mb_height * 16);
430 p_vpar->sequence.i_size = p_vpar->sequence.i_width
431 * p_vpar->sequence.i_height;
433 /* Update chromatic information */
434 switch( p_vpar->sequence.i_chroma_format )
437 p_vpar->sequence.i_chroma_nb_blocks = 2;
438 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width >> 1;
439 p_vpar->sequence.i_chroma_mb_width = 8;
440 p_vpar->sequence.i_chroma_mb_height = 8;
444 p_vpar->sequence.i_chroma_nb_blocks = 4;
445 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width >> 1;
446 p_vpar->sequence.i_chroma_mb_width = 8;
447 p_vpar->sequence.i_chroma_mb_height = 16;
451 p_vpar->sequence.i_chroma_nb_blocks = 8;
452 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width;
453 p_vpar->sequence.i_chroma_mb_width = 16;
454 p_vpar->sequence.i_chroma_mb_height = 16;
457 /* Slice Header functions */
458 if( p_vpar->sequence.i_height <= 2800 )
460 if( p_vpar->sequence.i_scalable_mode != SC_DP )
462 p_vpar->sequence.pf_slice_header = SliceHeader00;
466 p_vpar->sequence.pf_slice_header = SliceHeader01;
471 if( p_vpar->sequence.i_scalable_mode != SC_DP )
473 p_vpar->sequence.pf_slice_header = SliceHeader10;
477 p_vpar->sequence.pf_slice_header = SliceHeader11;
481 if( p_vpar->sequence.i_width != i_width_save
482 || p_vpar->sequence.i_height != i_height_save )
484 /* What do we do in case of a size change ??? */
487 /* Extension and User data */
488 ExtensionAndUserData( p_vpar );
491 /*****************************************************************************
492 * GroupHeader : Parse the next group of pictures header
493 *****************************************************************************/
494 static void GroupHeader( vpar_thread_t * p_vpar )
496 /* Nothing to do, we don't care. */
497 RemoveBits( &p_vpar->bit_stream, 27 );
498 ExtensionAndUserData( p_vpar );
501 /*****************************************************************************
502 * PictureHeader : Parse the next picture header
503 *****************************************************************************/
504 static void PictureHeader( vpar_thread_t * p_vpar )
506 static f_parse_mb_t ppf_parse_mb[4][4][2] =
509 {NULL, NULL}, {NULL, NULL}, {NULL, NULL}, {NULL, NULL}
514 {vpar_ParseMacroblock2I420T0, vpar_ParseMacroblockGENERIC},
515 {vpar_ParseMacroblockGENERIC, vpar_ParseMacroblock2I420B1},
516 {vpar_ParseMacroblock2I420F0, vpar_ParseMacroblock2I420F0}
521 {vpar_ParseMacroblock2P420T0, vpar_ParseMacroblockGENERIC},
522 {vpar_ParseMacroblockGENERIC, vpar_ParseMacroblock2P420B1},
523 {vpar_ParseMacroblock2P420F0, vpar_ParseMacroblock2P420F0}
528 {vpar_ParseMacroblock2B420T0, vpar_ParseMacroblockGENERIC},
529 {vpar_ParseMacroblockGENERIC, vpar_ParseMacroblock2B420B1},
530 {vpar_ParseMacroblock2B420F0, vpar_ParseMacroblock2B420F0}
535 int i_mb_address, i_mb_base;
536 boolean_t b_parsable;
542 RemoveBits( &p_vpar->bit_stream, 10 ); /* temporal_reference */
543 p_vpar->picture.i_coding_type = GetBits( &p_vpar->bit_stream, 3 );
544 RemoveBits( &p_vpar->bit_stream, 16 ); /* vbv_delay */
546 if( p_vpar->picture.i_coding_type == P_CODING_TYPE
547 || p_vpar->picture.i_coding_type == B_CODING_TYPE )
549 p_vpar->picture.pb_full_pel_vector[0] = GetBits( &p_vpar->bit_stream, 1 );
550 p_vpar->picture.i_forward_f_code = GetBits( &p_vpar->bit_stream, 3 );
552 if( p_vpar->picture.i_coding_type == B_CODING_TYPE )
554 p_vpar->picture.pb_full_pel_vector[1] = GetBits( &p_vpar->bit_stream, 1 );
555 p_vpar->picture.i_backward_f_code = GetBits( &p_vpar->bit_stream, 3 );
558 /* extra_information_picture */
559 while( GetBits( &p_vpar->bit_stream, 1 ) )
561 RemoveBits( &p_vpar->bit_stream, 8 );
565 * Picture Coding Extension
567 NextStartCode( p_vpar );
568 if( ShowBits( &p_vpar->bit_stream, 32 ) == EXTENSION_START_CODE )
570 /* Parse picture_coding_extension */
571 RemoveBits32( &p_vpar->bit_stream );
572 /* extension_start_code_identifier */
573 RemoveBits( &p_vpar->bit_stream, 4 );
575 p_vpar->picture.ppi_f_code[0][0] = GetBits( &p_vpar->bit_stream, 4 );
576 p_vpar->picture.ppi_f_code[0][1] = GetBits( &p_vpar->bit_stream, 4 );
577 p_vpar->picture.ppi_f_code[1][0] = GetBits( &p_vpar->bit_stream, 4 );
578 p_vpar->picture.ppi_f_code[1][1] = GetBits( &p_vpar->bit_stream, 4 );
579 p_vpar->picture.i_intra_dc_precision = GetBits( &p_vpar->bit_stream, 2 );
580 i_structure = GetBits( &p_vpar->bit_stream, 2 );
581 p_vpar->picture.b_top_field_first = GetBits( &p_vpar->bit_stream, 1 );
582 p_vpar->picture.b_frame_pred_frame_dct
583 = GetBits( &p_vpar->bit_stream, 1 );
584 p_vpar->picture.b_concealment_mv = GetBits( &p_vpar->bit_stream, 1 );
585 p_vpar->picture.b_q_scale_type = GetBits( &p_vpar->bit_stream, 1 );
586 p_vpar->picture.b_intra_vlc_format = GetBits( &p_vpar->bit_stream, 1 );
587 p_vpar->picture.b_alternate_scan = GetBits( &p_vpar->bit_stream, 1 );
588 p_vpar->picture.b_repeat_first_field = GetBits( &p_vpar->bit_stream, 1 );
589 /* repeat_first_field (ISO/IEC 13818-2 6.3.10 is necessary to know
590 * the length of the picture_display_extension structure.
591 * chroma_420_type (obsolete) */
592 RemoveBits( &p_vpar->bit_stream, 1 );
593 p_vpar->picture.b_progressive_frame = GetBits( &p_vpar->bit_stream, 1 );
595 /* composite_display_flag */
596 if( GetBits( &p_vpar->bit_stream, 1 ) )
598 /* v_axis, field_sequence, sub_carrier, burst_amplitude,
599 * sub_carrier_phase */
600 RemoveBits( &p_vpar->bit_stream, 20 );
605 /* MPEG-1 compatibility flags */
606 p_vpar->picture.i_intra_dc_precision = 0; /* 8 bits */
607 i_structure = FRAME_STRUCTURE;
608 p_vpar->picture.b_frame_pred_frame_dct = 1;
609 p_vpar->picture.b_concealment_mv = 0;
610 p_vpar->picture.b_q_scale_type = 0;
611 p_vpar->picture.b_intra_vlc_format = 0;
612 p_vpar->picture.b_alternate_scan = 0; /* zigzag */
613 p_vpar->picture.b_repeat_first_field = 0;
614 p_vpar->picture.b_progressive_frame = 1;
617 if( p_vpar->picture.i_current_structure &&
618 (i_structure == FRAME_STRUCTURE ||
619 i_structure == p_vpar->picture.i_current_structure) )
621 /* We don't have the second field of the buffered frame. */
622 if( p_vpar->picture.p_picture != NULL )
624 ReferenceReplace( p_vpar,
625 p_vpar->picture.i_coding_type,
629 for( i_mb = 0; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
631 vpar_DestroyMacroblock( &p_vpar->vfifo,
632 p_vpar->picture.pp_mb[i_mb] );
635 vout_DestroyPicture( p_vpar->p_vout, p_vpar->picture.p_picture );
638 p_vpar->picture.i_current_structure = 0;
640 intf_DbgMsg("vpar debug: odd number of field picture.\n");
643 /* Do we have the reference pictures ? */
644 b_parsable = !(((p_vpar->picture.i_coding_type == P_CODING_TYPE) &&
645 (p_vpar->sequence.p_backward == NULL)) ||
646 /* p_backward will become p_forward later */
647 ((p_vpar->picture.i_coding_type == B_CODING_TYPE) &&
648 (p_vpar->sequence.p_forward == NULL ||
649 p_vpar->sequence.p_backward == NULL)));
653 if( p_vpar->picture.i_current_structure )
655 /* Second field of a frame. We will decode it if, and only if we
656 * have decoded the first field. */
657 b_parsable = (p_vpar->picture.p_picture != NULL);
661 /* Does synchro say we have enough time to decode it ? */
662 b_parsable = vpar_SynchroChoose( p_vpar,
663 p_vpar->picture.i_coding_type, i_structure );
669 /* Update the reference pointers. */
670 ReferenceUpdate( p_vpar, p_vpar->picture.i_coding_type, NULL );
672 /* Warn Synchro we have trashed a picture. */
673 vpar_SynchroTrash( p_vpar, p_vpar->picture.i_coding_type, i_structure );
675 /* Update context. */
676 if( i_structure != FRAME_STRUCTURE )
677 p_vpar->picture.i_current_structure = i_structure;
678 p_vpar->picture.p_picture = NULL;
683 /* OK, now we are sure we will decode the picture. */
684 #define P_picture p_vpar->picture.p_picture
685 p_vpar->picture.b_error = 0;
686 p_vpar->picture.b_frame_structure = (i_structure == FRAME_STRUCTURE);
688 if( !p_vpar->picture.i_current_structure )
690 /* This is a new frame. Get a structure from the video_output. */
691 while( ( P_picture = vout_CreatePicture( p_vpar->p_vout,
692 99+p_vpar->sequence.i_chroma_format, /*???*/
693 p_vpar->sequence.i_width,
694 p_vpar->sequence.i_height ) )
697 intf_DbgMsg("vpar debug: allocation error in vout_CreatePicture\n");
698 if( p_vpar->b_die || p_vpar->b_error )
702 msleep( VPAR_OUTMEM_SLEEP );
705 /* Initialize values. */
706 vpar_SynchroDecode( p_vpar, p_vpar->picture.i_coding_type, i_structure );
707 if( p_vpar->picture.i_coding_type == B_CODING_TYPE )
709 /* Put date immediately. */
710 vout_DatePicture( p_vpar->p_vout, P_picture,
711 vpar_SynchroDate( p_vpar ) );
713 P_picture->i_aspect_ratio = p_vpar->sequence.i_aspect_ratio;
714 P_picture->i_matrix_coefficients = p_vpar->sequence.i_matrix_coefficients;
715 p_vpar->picture.i_l_stride = ( p_vpar->sequence.i_width
716 << ( 1 - p_vpar->picture.b_frame_structure ) );
717 p_vpar->picture.i_c_stride = ( p_vpar->sequence.i_chroma_width
718 << ( 1 - p_vpar->picture.b_frame_structure ));
720 P_picture->i_deccount = p_vpar->sequence.i_mb_size;
721 vlc_mutex_init( &p_vpar->picture.p_picture->lock_deccount );
723 memset( p_vpar->picture.pp_mb, 0, MAX_MB*sizeof(macroblock_t *) );
725 /* FIXME ! remove asap */
726 //memset( P_picture->p_data, 0, (p_vpar->sequence.i_mb_size*384));
728 /* Update the reference pointers. */
729 ReferenceUpdate( p_vpar, p_vpar->picture.i_coding_type, P_picture );
732 /* Link referenced pictures for the decoder
733 * They are unlinked in vpar_ReleaseMacroblock() & vpar_DestroyMacroblock() */
734 if( p_vpar->picture.i_coding_type == P_CODING_TYPE ||
735 p_vpar->picture.i_coding_type == B_CODING_TYPE )
737 vout_LinkPicture( p_vpar->p_vout, p_vpar->sequence.p_forward );
739 if( p_vpar->picture.i_coding_type == B_CODING_TYPE )
741 vout_LinkPicture( p_vpar->p_vout, p_vpar->sequence.p_backward );
745 p_vpar->picture.i_current_structure |= i_structure;
746 p_vpar->picture.i_structure = i_structure;
748 /* Initialize picture data for decoding. */
749 if( i_structure == BOTTOM_FIELD )
751 i_mb_base = p_vpar->sequence.i_mb_size >> 1;
752 p_vpar->mb.i_l_y = 1;
753 p_vpar->mb.i_c_y = 1;
758 p_vpar->mb.i_l_y = p_vpar->mb.i_c_y = 0;
761 p_vpar->mb.i_l_x = p_vpar->mb.i_c_x = 0;
763 /* Extension and User data. */
764 ExtensionAndUserData( p_vpar );
766 /* Macroblock parsing function. */
767 if( p_vpar->sequence.i_chroma_format != CHROMA_420
768 || !p_vpar->sequence.b_mpeg2 )
770 p_vpar->picture.pf_parse_mb = vpar_ParseMacroblockGENERIC;
774 p_vpar->picture.pf_parse_mb =
775 ppf_parse_mb[p_vpar->picture.i_coding_type]
776 [p_vpar->picture.i_structure]
777 [(p_vpar->picture.i_structure !=
778 p_vpar->picture.i_current_structure)];
781 /* Picture data (ISO/IEC 13818-2 6.2.3.7). */
782 NextStartCode( p_vpar );
783 while( i_mb_address+i_mb_base < p_vpar->sequence.i_mb_size
786 if( ((i_dummy = ShowBits( &p_vpar->bit_stream, 32 ))
787 < SLICE_START_CODE_MIN) ||
788 (i_dummy > SLICE_START_CODE_MAX) )
790 intf_DbgMsg("vpar debug: premature end of picture\n");
791 p_vpar->picture.b_error = 1;
794 RemoveBits32( &p_vpar->bit_stream );
796 /* Decode slice data. */
797 p_vpar->sequence.pf_slice_header( p_vpar, &i_mb_address, i_mb_base, i_dummy & 255 );
800 if( p_vpar->b_die || p_vpar->b_error )
805 if( p_vpar->picture.b_error )
808 //fprintf(stderr, "Image trashee\n");
810 for( i_mb = 1; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
812 vpar_DestroyMacroblock( &p_vpar->vfifo, p_vpar->picture.pp_mb[i_mb] );
816 if( P_picture->i_deccount != 1 )
818 vout_DestroyPicture( p_vpar->p_vout, P_picture );
821 ReferenceReplace( p_vpar, p_vpar->picture.i_coding_type, NULL );
823 /* Prepare context for the next picture. */
825 if( p_vpar->picture.i_current_structure == FRAME_STRUCTURE )
826 p_vpar->picture.i_current_structure = 0;
828 else if( p_vpar->picture.i_current_structure == FRAME_STRUCTURE )
830 //fprintf(stderr, "Image parsee (%d)\n", p_vpar->picture.i_coding_type);
831 /* Frame completely parsed. */
833 for( i_mb = 1; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
835 vpar_DecodeMacroblock( &p_vpar->vfifo, p_vpar->picture.pp_mb[i_mb] );
838 /* Send signal to the video_decoder. */
839 vlc_mutex_lock( &p_vpar->vfifo.lock );
840 vlc_cond_signal( &p_vpar->vfifo.wait );
841 vlc_mutex_unlock( &p_vpar->vfifo.lock );
844 /* Prepare context for the next picture. */
846 p_vpar->picture.i_current_structure = 0;
851 /*****************************************************************************
852 * SliceHeader : Parse the next slice structure
853 *****************************************************************************/
854 static __inline__ void SliceHeader( vpar_thread_t * p_vpar,
855 int * pi_mb_address, int i_mb_base,
858 /* DC predictors initialization table */
859 static int pi_dc_dct_reinit[4] = {128,256,512,1024};
861 int i_mb_address_save = *pi_mb_address;
863 p_vpar->picture.b_error = 0;
865 /* slice_vertical_position_extension and priority_breakpoint already done */
866 LoadQuantizerScale( p_vpar );
868 if( GetBits( &p_vpar->bit_stream, 1 ) )
870 /* intra_slice, slice_id */
871 RemoveBits( &p_vpar->bit_stream, 8 );
872 /* extra_information_slice */
873 while( GetBits( &p_vpar->bit_stream, 1 ) )
875 RemoveBits( &p_vpar->bit_stream, 8 );
878 *pi_mb_address = (i_vert_code - 1)*p_vpar->sequence.i_mb_width;
880 /* Reset DC coefficients predictors (ISO/IEC 13818-2 7.2.1). Why
881 * does the reference decoder put 0 instead of the normative values ? */
882 p_vpar->slice.pi_dc_dct_pred[0] = p_vpar->slice.pi_dc_dct_pred[1]
883 = p_vpar->slice.pi_dc_dct_pred[2]
884 = pi_dc_dct_reinit[p_vpar->picture.i_intra_dc_precision];
886 /* Reset motion vector predictors (ISO/IEC 13818-2 7.6.3.4). */
887 memset( p_vpar->slice.pppi_pmv, 0, 8*sizeof(int) );
891 p_vpar->picture.pf_parse_mb( p_vpar, pi_mb_address,
892 i_mb_address_save, i_mb_base,
893 p_vpar->sequence.b_mpeg2,
894 p_vpar->picture.i_coding_type,
895 p_vpar->sequence.i_chroma_format,
896 p_vpar->picture.i_structure,
897 (p_vpar->picture.i_structure !=
898 p_vpar->picture.i_current_structure) );
899 i_mb_address_save = *pi_mb_address;
901 while( ShowBits( &p_vpar->bit_stream, 23 ) && !p_vpar->picture.b_error
903 NextStartCode( p_vpar );
906 /*****************************************************************************
907 * SliceHeaderXY : Parse the next slice structure
908 *****************************************************************************
909 * X = i_height > 2800 ?
910 * Y = scalable_mode == SC_DP ?
911 *****************************************************************************/
912 static void SliceHeader00( vpar_thread_t * p_vpar,
913 int * pi_mb_address, int i_mb_base,
916 SliceHeader( p_vpar, pi_mb_address, i_mb_base, i_vert_code );
919 static void SliceHeader01( vpar_thread_t * p_vpar,
920 int * pi_mb_address, int i_mb_base,
923 RemoveBits( &p_vpar->bit_stream, 7 ); /* priority_breakpoint */
924 SliceHeader( p_vpar, pi_mb_address, i_mb_base, i_vert_code );
927 static void SliceHeader10( vpar_thread_t * p_vpar,
928 int * pi_mb_address, int i_mb_base,
931 i_vert_code += GetBits( &p_vpar->bit_stream, 3 ) << 7;
932 SliceHeader( p_vpar, pi_mb_address, i_mb_base, i_vert_code );
935 static void SliceHeader11( vpar_thread_t * p_vpar,
936 int * pi_mb_address, int i_mb_base,
939 i_vert_code += GetBits( &p_vpar->bit_stream, 3 ) << 7;
940 RemoveBits( &p_vpar->bit_stream, 7 ); /* priority_breakpoint */
941 SliceHeader( p_vpar, pi_mb_address, i_mb_base, i_vert_code );
944 /*****************************************************************************
945 * ExtensionAndUserData : Parse the extension_and_user_data structure
946 *****************************************************************************/
947 static void ExtensionAndUserData( vpar_thread_t * p_vpar )
949 while( !p_vpar->b_die )
951 NextStartCode( p_vpar );
952 switch( ShowBits( &p_vpar->bit_stream, 32 ) )
954 case EXTENSION_START_CODE:
955 RemoveBits32( &p_vpar->bit_stream );
956 switch( GetBits( &p_vpar->bit_stream, 4 ) )
958 case SEQUENCE_DISPLAY_EXTENSION_ID:
959 SequenceDisplayExtension( p_vpar );
961 case QUANT_MATRIX_EXTENSION_ID:
962 QuantMatrixExtension( p_vpar );
964 case SEQUENCE_SCALABLE_EXTENSION_ID:
965 SequenceScalableExtension( p_vpar );
967 case PICTURE_DISPLAY_EXTENSION_ID:
968 PictureDisplayExtension( p_vpar );
970 case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID:
971 PictureSpatialScalableExtension( p_vpar );
973 case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID:
974 PictureTemporalScalableExtension( p_vpar );
976 case COPYRIGHT_EXTENSION_ID:
977 CopyrightExtension( p_vpar );
983 case USER_DATA_START_CODE:
984 RemoveBits32( &p_vpar->bit_stream );
985 /* Wait for the next start code */
995 /*****************************************************************************
996 * SequenceDisplayExtension : Parse the sequence_display_extension structure *
997 *****************************************************************************/
999 static void SequenceDisplayExtension( vpar_thread_t * p_vpar )
1001 /* We don't care sequence_display_extension. */
1003 RemoveBits( &p_vpar->bit_stream, 3 );
1004 if( GetBits( &p_vpar->bit_stream, 1 ) )
1006 /* Two bytes for color_desciption */
1007 RemoveBits( &p_vpar->bit_stream, 16 );
1008 p_vpar->sequence.i_matrix_coefficients = GetBits( &p_vpar->bit_stream, 8 );
1010 /* display_horizontal and vertical_size and a marker_bit */
1011 RemoveBits( &p_vpar->bit_stream, 29 );
1015 /*****************************************************************************
1016 * QuantMatrixExtension : Load quantization matrices for luminance *
1018 *****************************************************************************/
1020 static void QuantMatrixExtension( vpar_thread_t * p_vpar )
1022 if( GetBits( &p_vpar->bit_stream, 1 ) )
1024 /* Load intra_quantiser_matrix for luminance. */
1025 LoadMatrix( p_vpar, &p_vpar->sequence.intra_quant );
1029 /* Use the default matrix. */
1030 LinkMatrix( &p_vpar->sequence.intra_quant,
1031 pi_default_intra_quant );
1033 if( GetBits( &p_vpar->bit_stream, 1 ) )
1035 /* Load non_intra_quantiser_matrix for luminance. */
1036 LoadMatrix( p_vpar, &p_vpar->sequence.nonintra_quant );
1040 /* Use the default matrix. */
1041 LinkMatrix( &p_vpar->sequence.nonintra_quant,
1042 pi_default_nonintra_quant );
1044 if( GetBits( &p_vpar->bit_stream, 1 ) )
1046 /* Load intra_quantiser_matrix for chrominance. */
1047 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_intra_quant );
1051 /* Link the chrominance intra matrix to the luminance one. */
1052 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
1053 p_vpar->sequence.intra_quant.pi_matrix );
1055 if( GetBits( &p_vpar->bit_stream, 1 ) )
1057 /* Load non_intra_quantiser_matrix for chrominance. */
1058 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_nonintra_quant );
1062 /* Link the chrominance intra matrix to the luminance one. */
1063 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
1064 p_vpar->sequence.intra_quant.pi_matrix );
1066 if( GetBits( &p_vpar->bit_stream, 1 ) )
1068 /* Load non_intra_quantiser_matrix for chrominance. */
1069 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_nonintra_quant );
1073 /* Link the chrominance nonintra matrix to the luminance one. */
1074 LinkMatrix( &p_vpar->sequence.chroma_nonintra_quant,
1075 p_vpar->sequence.nonintra_quant.pi_matrix );
1080 /*****************************************************************************
1081 * SequenceScalableExtension : Parse the sequence_scalable_extension *
1082 * structure to handle scalable coding *
1083 *****************************************************************************/
1085 static void SequenceScalableExtension( vpar_thread_t * p_vpar )
1087 /* We don't care about anything scalable except the scalable mode. */
1088 switch( p_vpar->sequence.i_scalable_mode = GetBits( &p_vpar->bit_stream, 2 ) )
1089 /* The length of the structure depends on the value of the scalable_mode */
1092 RemoveBits32( &p_vpar->bit_stream );
1093 RemoveBits( &p_vpar->bit_stream, 21 );
1096 RemoveBits( &p_vpar->bit_stream, 12 );
1099 RemoveBits( &p_vpar->bit_stream, 4 );
1103 /*****************************************************************************
1104 * PictureDisplayExtension : Parse the picture_display_extension structure *
1105 *****************************************************************************/
1107 static void PictureDisplayExtension( vpar_thread_t * p_vpar )
1109 /* Number of frame center offset */
1111 /* I am not sure it works but it should
1112 (fewer tests than shown in ยง6.3.12) */
1113 i_nb = p_vpar->sequence.b_progressive ? p_vpar->sequence.b_progressive +
1114 p_vpar->picture.b_repeat_first_field +
1115 p_vpar->picture.b_top_field_first
1116 : ( p_vpar->picture.b_frame_structure + 1 ) +
1117 p_vpar->picture.b_repeat_first_field;
1118 for( i_dummy = 0; i_dummy < i_nb; i_dummy++ )
1120 RemoveBits( &p_vpar->bit_stream, 17 );
1121 RemoveBits( &p_vpar->bit_stream, 17 );
1126 /*****************************************************************************
1127 * PictureSpatialScalableExtension *
1128 *****************************************************************************/
1130 static void PictureSpatialScalableExtension( vpar_thread_t * p_vpar )
1132 /* That's scalable, so we trash it */
1133 RemoveBits32( &p_vpar->bit_stream );
1134 RemoveBits( &p_vpar->bit_stream, 16 );
1138 /*****************************************************************************
1139 * PictureTemporalScalableExtension *
1140 *****************************************************************************/
1142 static void PictureTemporalScalableExtension( vpar_thread_t * p_vpar )
1144 /* Scalable again, trashed again */
1145 RemoveBits( &p_vpar->bit_stream, 23 );
1149 /*****************************************************************************
1150 * CopyrightExtension : Keeps some legal informations *
1151 *****************************************************************************/
1153 static void CopyrightExtension( vpar_thread_t * p_vpar )
1155 u32 i_copyright_nb_1, i_copyright_nb_2; /* local integers */
1156 p_vpar->sequence.b_copyright_flag = GetBits( &p_vpar->bit_stream, 1 );
1157 /* A flag that says whether the copyright information is significant */
1158 p_vpar->sequence.i_copyright_id = GetBits( &p_vpar->bit_stream, 8 );
1159 /* An identifier compliant with ISO/CEI JTC 1/SC 29 */
1160 p_vpar->sequence.b_original = GetBits( &p_vpar->bit_stream, 1 );
1162 RemoveBits( &p_vpar->bit_stream, 8 );
1163 /* The copyright_number is split in three parts */
1165 i_copyright_nb_1 = GetBits( &p_vpar->bit_stream, 20 );
1166 RemoveBits( &p_vpar->bit_stream, 1 );
1168 i_copyright_nb_2 = GetBits( &p_vpar->bit_stream, 22 );
1169 RemoveBits( &p_vpar->bit_stream, 1 );
1170 /* third part and sum */
1171 p_vpar->sequence.i_copyright_nb = ( (u64)i_copyright_nb_1 << 44 ) |
1172 ( (u64)i_copyright_nb_2 << 22 ) |
1173 ( (u64)GetBits( &p_vpar->bit_stream, 22 ) );