1 /*****************************************************************************
2 * vpar_headers.c : headers parsing
4 *****************************************************************************/
6 /*****************************************************************************
8 *****************************************************************************/
16 #include <X11/extensions/XShm.h>
21 #include "vlc_thread.h"
24 #include "debug.h" /* ?? temporaire, requis par netlist.h */
27 #include "input_netlist.h"
28 #include "decoder_fifo.h"
30 #include "video_output.h"
32 #include "vdec_idct.h"
33 #include "video_decoder.h"
34 #include "vdec_motion.h"
36 #include "vpar_blocks.h"
37 #include "vpar_headers.h"
38 #include "video_fifo.h"
39 #include "vpar_synchro.h"
40 #include "video_parser.h"
41 #include "vpar_motion.h"
46 static __inline__ void NextStartCode( vpar_thread_t * p_vpar );
47 static void SequenceHeader( vpar_thread_t * p_vpar );
48 static void GroupHeader( vpar_thread_t * p_vpar );
49 static void PictureHeader( vpar_thread_t * p_vpar );
50 static void SliceHeader00( vpar_thread_t * p_vpar,
51 int * pi_mb_address, int i_mb_base,
53 static void SliceHeader01( vpar_thread_t * p_vpar,
54 int * pi_mb_address, int i_mb_base,
56 static void SliceHeader10( vpar_thread_t * p_vpar,
57 int * pi_mb_address, int i_mb_base,
59 static void SliceHeader11( vpar_thread_t * p_vpar,
60 int * pi_mb_address, int i_mb_base,
62 static __inline__ void SliceHeader( vpar_thread_t * p_vpar,
63 int * pi_mb_address, int i_mb_base,
65 static void ExtensionAndUserData( vpar_thread_t * p_vpar );
66 static void QuantMatrixExtension( vpar_thread_t * p_vpar );
67 static void SequenceScalableExtension( vpar_thread_t * p_vpar );
68 static void SequenceDisplayExtension( vpar_thread_t * p_vpar );
69 static void PictureDisplayExtension( vpar_thread_t * p_vpar );
70 static void PictureSpatialScalableExtension( vpar_thread_t * p_vpar );
71 static void PictureTemporalScalableExtension( vpar_thread_t * p_vpar );
72 static void CopyrightExtension( vpar_thread_t * p_vpar );
78 /*****************************************************************************
79 * pi_default_intra_quant : default quantization matrix
80 *****************************************************************************/
82 int pi_default_intra_quant[] =
84 8, 16, 19, 22, 26, 27, 29, 34,
85 16, 16, 22, 24, 27, 29, 34, 37,
86 19, 22, 26, 27, 29, 34, 34, 38,
87 22, 22, 26, 27, 29, 34, 37, 40,
88 22, 26, 27, 29, 32, 35, 40, 48,
89 26, 27, 29, 32, 35, 40, 48, 58,
90 26, 27, 29, 34, 38, 46, 56, 69,
91 27, 29, 35, 38, 46, 56, 69, 83
94 int pi_default_intra_quant[] =
96 2048, 5681, 6355, 6623, 6656, 5431, 4018, 2401,
97 5681, 7880, 10207, 10021, 9587, 8091, 6534, 3625,
98 6355, 10207, 11363, 10619, 9700, 8935, 6155, 3507,
99 6623, 9186, 10226, 9557, 8730, 8041, 6028, 3322,
100 5632, 9232, 9031, 8730, 8192, 7040, 5542, 3390,
101 5230, 7533, 7621, 7568, 7040, 6321, 5225, 3219,
102 3602, 5189, 5250, 5539, 5265, 5007, 4199, 2638,
103 1907, 2841, 3230, 3156, 3249, 3108, 2638, 1617
107 /*****************************************************************************
108 * pi_default_nonintra_quant : default quantization matrix
109 *****************************************************************************/
111 int pi_default_nonintra_quant[] =
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,
119 16, 16, 16, 16, 16, 16, 16, 16,
120 16, 16, 16, 16, 16, 16, 16, 16
123 int pi_default_nonintra_quanit[] =
125 4096, 5680, 5344, 4816, 4096, 3216, 2224, 1136,
126 5680, 7888, 7424, 6688, 5680, 4464, 3072, 1568,
127 5344, 7424, 6992, 6288, 5344, 4208, 2896, 1472,
128 4816, 6688, 6288, 5664, 4816, 3792, 2608, 1328,
129 4096, 5680, 5344, 4816, 4096, 3216, 2224, 1136,
130 3216, 4464, 4208, 3792, 3216, 2528, 1744, 880,
131 2224, 3072, 2896, 2608, 2224, 1744, 1200, 608,
132 1136, 1568, 1472, 1328, 1136, 880, 608, 304
136 /*****************************************************************************
137 * pi_scan : zig-zag and alternate scan patterns
138 *****************************************************************************/
141 { /* Zig-Zag pattern */
142 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
143 12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
144 35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
145 58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
147 { /* Alternate scan pattern */
148 0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
149 41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
150 51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
151 53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
156 * Local inline functions.
159 /*****************************************************************************
160 * NextStartCode : Find the next start code
161 *****************************************************************************/
162 static __inline__ void NextStartCode( vpar_thread_t * p_vpar )
164 /* Re-align the buffer on an 8-bit boundary */
165 RealignBits( &p_vpar->bit_stream );
167 while( ShowBits( &p_vpar->bit_stream, 24 ) != 0x01L && !p_vpar->b_die )
169 RemoveBits( &p_vpar->bit_stream, 8 );
173 /*****************************************************************************
174 * ReferenceUpdate : Update the reference pointers when we have a new picture
175 *****************************************************************************/
176 static void __inline__ ReferenceUpdate( vpar_thread_t * p_vpar,
178 picture_t * p_newref )
180 if( i_coding_type != B_CODING_TYPE )
182 if( p_vpar->sequence.p_forward != NULL )
183 vout_UnlinkPicture( p_vpar->p_vout, p_vpar->sequence.p_forward );
184 p_vpar->sequence.p_forward = p_vpar->sequence.p_backward;
185 p_vpar->sequence.p_backward = p_newref;
186 if( p_newref != NULL )
187 vout_LinkPicture( p_vpar->p_vout, p_newref );
191 /*****************************************************************************
192 * ReferenceReplace : Replace the last reference pointer when we destroy
194 *****************************************************************************/
195 static void __inline__ ReferenceReplace( vpar_thread_t * p_vpar,
197 picture_t * p_newref )
199 if( i_coding_type != B_CODING_TYPE )
201 if( p_vpar->sequence.p_backward != NULL )
202 vout_UnlinkPicture( p_vpar->p_vout, p_vpar->sequence.p_backward );
203 p_vpar->sequence.p_backward = p_newref;
204 if( p_newref != NULL )
205 vout_LinkPicture( p_vpar->p_vout, p_newref );
209 /*****************************************************************************
210 * LoadMatrix : Load a quantization matrix
211 *****************************************************************************/
212 static __inline__ void LoadMatrix( vpar_thread_t * p_vpar, quant_matrix_t * p_matrix )
216 if( !p_matrix->b_allocated )
218 /* Allocate a piece of memory to load the matrix. */
219 p_matrix->pi_matrix = (int *)malloc( 64*sizeof(int) );
220 p_matrix->b_allocated = 1;
223 for( i_dummy = 0; i_dummy < 64; i_dummy++ )
225 p_matrix->pi_matrix[pi_scan[SCAN_ZIGZAG][i_dummy]]
226 = GetBits( &p_vpar->bit_stream, 8 );
230 /* Discrete Fourier Transform requires the quantization matrices to
231 * be normalized before using them. */
232 vdec_NormQuantMatrix( p_matrix->pi_matrix );
236 /*****************************************************************************
237 * LinkMatrix : Link a quantization matrix to another
238 *****************************************************************************/
239 static __inline__ void LinkMatrix( quant_matrix_t * p_matrix, int * pi_array )
243 if( p_matrix->b_allocated )
245 /* Deallocate the piece of memory. */
246 free( p_matrix->pi_matrix );
247 p_matrix->b_allocated = 0;
250 p_matrix->pi_matrix = pi_array;
254 * Exported functions.
257 /*****************************************************************************
258 * vpar_NextSequenceHeader : Find the next sequence header
259 *****************************************************************************/
260 int vpar_NextSequenceHeader( vpar_thread_t * p_vpar )
262 while( !p_vpar->b_die )
264 NextStartCode( p_vpar );
265 if( ShowBits( &p_vpar->bit_stream, 32 ) == SEQUENCE_HEADER_CODE )
267 RemoveBits( &p_vpar->bit_stream, 8 );
272 /*****************************************************************************
273 * vpar_ParseHeader : Parse the next header
274 *****************************************************************************/
275 int vpar_ParseHeader( vpar_thread_t * p_vpar )
277 while( !p_vpar->b_die )
279 NextStartCode( p_vpar );
280 switch( GetBits32( &p_vpar->bit_stream ) )
282 case SEQUENCE_HEADER_CODE:
283 fprintf( stderr, "begin sequence header\n" );
284 SequenceHeader( p_vpar );
285 fprintf( stderr, "end sequence header\n" );
289 case GROUP_START_CODE:
290 fprintf( stderr, "begin group\n" );
291 GroupHeader( p_vpar );
292 fprintf( stderr, "end group\n" );
296 case PICTURE_START_CODE:
297 PictureHeader( p_vpar );
301 case SEQUENCE_END_CODE:
302 fprintf( stderr, "sequence header end code\n" );
314 * Following functions are local
317 /*****************************************************************************
318 * SequenceHeader : Parse the next sequence header
319 *****************************************************************************/
320 static void SequenceHeader( vpar_thread_t * p_vpar )
323 static float r_frame_rate_table[16] =
326 ((23.0*1000.0)/1001.0),
329 ((30.0*1000.0)/1001.0),
332 ((60.0*1000.0)/1001.0),
334 RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED
338 int i_height_save, i_width_save;
340 i_height_save = p_vpar->sequence.i_height;
341 i_width_save = p_vpar->sequence.i_width;
343 p_vpar->sequence.i_width = GetBits( &p_vpar->bit_stream, 12 );
344 p_vpar->sequence.i_height = GetBits( &p_vpar->bit_stream, 12 );
345 p_vpar->sequence.i_aspect_ratio = GetBits( &p_vpar->bit_stream, 4 );
346 p_vpar->sequence.r_frame_rate =
347 r_frame_rate_table[ GetBits( &p_vpar->bit_stream, 4 ) ];
349 /* We don't need bit_rate_value, marker_bit, vbv_buffer_size,
350 * constrained_parameters_flag */
351 RemoveBits( &p_vpar->bit_stream, 30 );
354 * Quantization matrices
356 if( GetBits( &p_vpar->bit_stream, 1 ) ) /* load_intra_quantizer_matrix */
358 LoadMatrix( p_vpar, &p_vpar->sequence.intra_quant );
362 /* Use default matrix. */
363 LinkMatrix( &p_vpar->sequence.intra_quant, pi_default_intra_quant );
366 if( GetBits( &p_vpar->bit_stream, 1 ) ) /* load_non_intra_quantizer_matrix */
368 LoadMatrix( p_vpar, &p_vpar->sequence.nonintra_quant );
372 /* Use default matrix. */
373 LinkMatrix( &p_vpar->sequence.nonintra_quant, pi_default_nonintra_quant );
376 /* Unless later overwritten by a matrix extension, we have the same
377 * matrices for luminance and chrominance. */
378 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
379 p_vpar->sequence.intra_quant.pi_matrix );
380 LinkMatrix( &p_vpar->sequence.chroma_nonintra_quant,
381 p_vpar->sequence.nonintra_quant.pi_matrix );
386 NextStartCode( p_vpar );
387 if( ShowBits( &p_vpar->bit_stream, 32 ) == EXTENSION_START_CODE )
390 static f_chroma_pattern_t ppf_chroma_pattern[4] =
391 {NULL, vpar_CodedPattern420,
392 vpar_CodedPattern422, vpar_CodedPattern444};
394 /* Turn the MPEG2 flag on */
395 p_vpar->sequence.b_mpeg2 = 1;
397 /* Parse sequence_extension */
398 RemoveBits32( &p_vpar->bit_stream );
399 /* extension_start_code_identifier, profile_and_level_indication */
400 RemoveBits( &p_vpar->bit_stream, 12 );
401 p_vpar->sequence.b_progressive = GetBits( &p_vpar->bit_stream, 1 );
402 p_vpar->sequence.i_chroma_format = GetBits( &p_vpar->bit_stream, 2 );
403 p_vpar->sequence.pf_decode_pattern = ppf_chroma_pattern
404 [p_vpar->sequence.i_chroma_format];
405 p_vpar->sequence.i_width |= GetBits( &p_vpar->bit_stream, 2 ) << 12;
406 p_vpar->sequence.i_height |= GetBits( &p_vpar->bit_stream, 2 ) << 12;
407 /* bit_rate_extension, marker_bit, vbv_buffer_size_extension, low_delay */
408 RemoveBits( &p_vpar->bit_stream, 22 );
409 /* frame_rate_extension_n */
410 i_dummy = GetBits( &p_vpar->bit_stream, 2 );
411 /* frame_rate_extension_d */
412 p_vpar->sequence.r_frame_rate *= (i_dummy + 1)
413 / (GetBits( &p_vpar->bit_stream, 5 ) + 1);
415 p_vpar->sequence.pf_decode_mv = vpar_MPEG2MotionVector;
419 /* It's an MPEG-1 stream. Put adequate parameters. */
421 p_vpar->sequence.b_mpeg2 = 0;
422 p_vpar->sequence.b_progressive = 1;
423 p_vpar->sequence.i_chroma_format = CHROMA_420;
424 p_vpar->sequence.pf_decode_pattern = vpar_CodedPattern420;
426 p_vpar->sequence.pf_decode_mv = vpar_MPEG1MotionVector;
430 p_vpar->sequence.i_mb_width = (p_vpar->sequence.i_width + 15) / 16;
431 p_vpar->sequence.i_mb_height = (p_vpar->sequence.b_progressive) ?
432 (p_vpar->sequence.i_height + 15) / 16 :
433 2 * ((p_vpar->sequence.i_height + 31) / 32);
434 p_vpar->sequence.i_mb_size = p_vpar->sequence.i_mb_width
435 * p_vpar->sequence.i_mb_height;
436 p_vpar->sequence.i_width = (p_vpar->sequence.i_mb_width * 16);
437 p_vpar->sequence.i_height = (p_vpar->sequence.i_mb_height * 16);
438 p_vpar->sequence.i_size = p_vpar->sequence.i_width
439 * p_vpar->sequence.i_height;
441 /* Update chromatic information */
442 switch( p_vpar->sequence.i_chroma_format )
445 p_vpar->sequence.i_chroma_nb_blocks = 2;
446 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width >> 1;
447 p_vpar->sequence.i_chroma_mb_width = 8;
448 p_vpar->sequence.i_chroma_mb_height = 8;
452 p_vpar->sequence.i_chroma_nb_blocks = 4;
453 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width >> 1;
454 p_vpar->sequence.i_chroma_mb_width = 8;
455 p_vpar->sequence.i_chroma_mb_height = 16;
459 p_vpar->sequence.i_chroma_nb_blocks = 8;
460 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width;
461 p_vpar->sequence.i_chroma_mb_width = 16;
462 p_vpar->sequence.i_chroma_mb_height = 16;
465 /* Slice Header functions */
466 if( p_vpar->sequence.i_height <= 2800 )
468 if( p_vpar->sequence.i_scalable_mode != SC_DP )
470 p_vpar->sequence.pf_slice_header = SliceHeader00;
474 p_vpar->sequence.pf_slice_header = SliceHeader01;
479 if( p_vpar->sequence.i_scalable_mode != SC_DP )
481 p_vpar->sequence.pf_slice_header = SliceHeader10;
485 p_vpar->sequence.pf_slice_header = SliceHeader11;
489 if( p_vpar->sequence.i_width != i_width_save
490 || p_vpar->sequence.i_height != i_height_save )
492 /* What do we do in case of a size change ??? */
495 /* Extension and User data */
496 ExtensionAndUserData( p_vpar );
499 /*****************************************************************************
500 * GroupHeader : Parse the next group of pictures header
501 *****************************************************************************/
502 static void GroupHeader( vpar_thread_t * p_vpar )
504 /* Nothing to do, we don't care. */
505 RemoveBits( &p_vpar->bit_stream, 27 );
506 ExtensionAndUserData( p_vpar );
509 /*****************************************************************************
510 * PictureHeader : Parse the next picture header
511 *****************************************************************************/
512 static void PictureHeader( vpar_thread_t * p_vpar )
514 static f_macroblock_type_t ppf_macroblock_type[5] = {NULL,
515 vpar_IMBType, vpar_PMBType,
516 vpar_BMBType, vpar_DMBType};
519 int i_mb_address, i_mb_base, i_mb;
520 elem_t * p_y, p_u, p_v;
521 boolean_t b_parsable;
524 RemoveBits( &p_vpar->bit_stream, 10 ); /* temporal_reference */
525 p_vpar->picture.i_coding_type = GetBits( &p_vpar->bit_stream, 3 );
526 p_vpar->picture.pf_macroblock_type = ppf_macroblock_type
527 [p_vpar->picture.i_coding_type];
528 RemoveBits( &p_vpar->bit_stream, 16 ); /* vbv_delay */
530 if( p_vpar->picture.i_coding_type == P_CODING_TYPE || p_vpar->picture.i_coding_type == B_CODING_TYPE )
532 p_vpar->picture.pb_full_pel_vector[0] = GetBits( &p_vpar->bit_stream, 1 );
533 p_vpar->picture.i_forward_f_code = GetBits( &p_vpar->bit_stream, 3 );
535 if( p_vpar->picture.i_coding_type == B_CODING_TYPE )
537 p_vpar->picture.pb_full_pel_vector[1] = GetBits( &p_vpar->bit_stream, 1 );
538 p_vpar->picture.i_backward_f_code = GetBits( &p_vpar->bit_stream, 3 );
541 /* extra_information_picture */
542 while( GetBits( &p_vpar->bit_stream, 1 ) )
544 RemoveBits( &p_vpar->bit_stream, 8 );
548 * Picture Coding Extension
550 NextStartCode( p_vpar );
551 if( ShowBits( &p_vpar->bit_stream, 32 ) == EXTENSION_START_CODE )
553 /* Parse picture_coding_extension */
554 RemoveBits32( &p_vpar->bit_stream );
555 /* extension_start_code_identifier */
556 RemoveBits( &p_vpar->bit_stream, 4 );
558 p_vpar->picture.ppi_f_code[0][0] = GetBits( &p_vpar->bit_stream, 4 );
559 p_vpar->picture.ppi_f_code[0][1] = GetBits( &p_vpar->bit_stream, 4 );
560 p_vpar->picture.ppi_f_code[1][0] = GetBits( &p_vpar->bit_stream, 4 );
561 p_vpar->picture.ppi_f_code[1][1] = GetBits( &p_vpar->bit_stream, 4 );
562 p_vpar->picture.i_intra_dc_precision = GetBits( &p_vpar->bit_stream, 2 );
563 i_structure = GetBits( &p_vpar->bit_stream, 2 );
564 p_vpar->picture.b_top_field_first = GetBits( &p_vpar->bit_stream, 1 );
565 p_vpar->picture.b_frame_pred_frame_dct
566 = GetBits( &p_vpar->bit_stream, 1 );
567 p_vpar->picture.b_concealment_mv = GetBits( &p_vpar->bit_stream, 1 );
568 p_vpar->picture.b_q_scale_type = GetBits( &p_vpar->bit_stream, 1 );
569 p_vpar->picture.b_intra_vlc_format = GetBits( &p_vpar->bit_stream, 1 );
570 p_vpar->picture.b_alternate_scan = GetBits( &p_vpar->bit_stream, 1 );
571 p_vpar->picture.b_repeat_first_field = GetBits( &p_vpar->bit_stream, 1 );
572 /* repeat_first_field (ISO/IEC 13818-2 6.3.10 is necessary to know
573 * the length of the picture_display_extension structure.
574 * chroma_420_type (obsolete) */
575 RemoveBits( &p_vpar->bit_stream, 1 );
576 p_vpar->picture.b_progressive_frame = GetBits( &p_vpar->bit_stream, 1 );
578 /* composite_display_flag */
579 if( GetBits( &p_vpar->bit_stream, 1 ) )
581 /* v_axis, field_sequence, sub_carrier, burst_amplitude,
582 * sub_carrier_phase */
583 RemoveBits( &p_vpar->bit_stream, 20 );
588 /* MPEG-1 compatibility flags */
589 p_vpar->picture.i_intra_dc_precision = 0; /* 8 bits */
590 i_structure = FRAME_STRUCTURE;
591 p_vpar->picture.b_frame_pred_frame_dct = 1;
592 p_vpar->picture.b_concealment_mv = 0;
593 p_vpar->picture.b_q_scale_type = 0;
594 p_vpar->picture.b_intra_vlc_format = 0;
595 p_vpar->picture.b_alternate_scan = 0; /* zigzag */
596 p_vpar->picture.b_repeat_first_field = 0;
597 p_vpar->picture.b_progressive_frame = 1;
600 if( p_vpar->picture.i_current_structure &&
601 (i_structure == FRAME_STRUCTURE ||
602 i_structure == p_vpar->picture.i_current_structure) )
604 /* We don't have the second field of the buffered frame. */
605 if( p_vpar->picture.p_picture != NULL )
607 ReferenceReplace( p_vpar,
608 p_vpar->picture.i_coding_type,
611 for( i_mb = 0; i_mb < p_vpar->sequence.i_mb_size >> 1; i_mb++ )
613 vpar_DestroyMacroblock( &p_vpar->vfifo,
614 p_vpar->picture.pp_mb[i_mb] );
616 vout_DestroyPicture( p_vpar->p_vout, p_vpar->picture.p_picture );
619 p_vpar->picture.i_current_structure = 0;
621 intf_DbgMsg("vpar debug: odd number of field picture.\n");
624 if( p_vpar->picture.i_current_structure )
626 /* Second field of a frame. We will decode it if, and only if we
627 * have decoded the first frame. */
628 b_parsable = (p_vpar->picture.p_picture != NULL);
632 /* Do we have the reference pictures ? */
633 b_parsable = !((p_vpar->picture.i_coding_type == P_CODING_TYPE) &&
634 (p_vpar->sequence.p_forward == NULL)) ||
635 ((p_vpar->picture.i_coding_type == B_CODING_TYPE) &&
636 (p_vpar->sequence.p_forward == NULL ||
637 p_vpar->sequence.p_backward == NULL));
641 /* Does synchro say we have enough time to decode it ? */
642 b_parsable = vpar_SynchroChoose( p_vpar,
643 p_vpar->picture.i_coding_type, i_structure );
649 /* Update the reference pointers. */
650 ReferenceUpdate( p_vpar, p_vpar->picture.i_coding_type, NULL );
652 /* Warn Synchro we have trashed a picture. */
653 vpar_SynchroTrash( p_vpar, p_vpar->picture.i_coding_type, i_structure );
655 /* Update context. */
656 if( i_structure != FRAME_STRUCTURE )
657 p_vpar->picture.i_current_structure = i_structure;
658 p_vpar->picture.p_picture = NULL;
662 fprintf(stderr, "begin picture\n");
664 /* OK, now we are sure we will decode the picture. */
665 #define P_picture p_vpar->picture.p_picture
666 p_vpar->picture.b_error = 0;
668 if( !p_vpar->picture.i_current_structure )
670 /* This is a new frame. Get a structure from the video_output. */
671 if( ( P_picture = vout_CreatePicture( p_vpar->p_vout,
672 99+p_vpar->sequence.i_chroma_format, /*???*/
673 p_vpar->sequence.i_width,
674 p_vpar->sequence.i_height,
675 p_vpar->sequence.i_width*sizeof(yuv_data_t) ) )
678 intf_ErrMsg("vpar debug: allocation error in vout_CreatePicture\n");
682 bzero( P_picture->p_data, 940032 );
683 /* Initialize values. */
684 P_picture->date = vpar_SynchroDecode( p_vpar,
685 p_vpar->picture.i_coding_type,
687 p_vpar->picture.i_l_stride = - 8 + ( p_vpar->sequence.i_width
688 << ( 1 - p_vpar->picture.b_frame_structure ) );
689 p_vpar->picture.i_c_stride = - 8 + ( p_vpar->sequence.i_chroma_width
690 << ( 1 - p_vpar->picture.b_frame_structure ));
692 /* Update the reference pointers. */
693 ReferenceUpdate( p_vpar, p_vpar->picture.i_coding_type, P_picture );
695 p_vpar->picture.i_current_structure |= i_structure;
696 p_vpar->picture.i_structure = i_structure;
697 p_vpar->picture.b_frame_structure = (i_structure == FRAME_STRUCTURE);
699 /* Initialize picture data for decoding. */
700 if( i_structure == BOTTOM_FIELD )
702 i_mb_base = p_vpar->sequence.i_mb_size >> 1;
703 p_vpar->mb.i_l_y = 1;
704 p_vpar->mb.i_c_y = 1;
709 p_vpar->mb.i_l_y = p_vpar->mb.i_c_y = 0;
712 p_vpar->mb.i_l_x = p_vpar->mb.i_c_x = 0;
714 /* Extension and User data. */
715 ExtensionAndUserData( p_vpar );
717 /* Picture data (ISO/IEC 13818-2 6.2.3.7). */
718 NextStartCode( p_vpar );
719 while( i_mb_address+i_mb_base < p_vpar->sequence.i_mb_size
720 && !p_vpar->picture.b_error && !p_vpar->b_die )
722 if( ((i_dummy = ShowBits( &p_vpar->bit_stream, 32 ))
723 < SLICE_START_CODE_MIN) ||
724 (i_dummy > SLICE_START_CODE_MAX) )
726 intf_DbgMsg("vpar debug: premature end of picture");
727 p_vpar->picture.b_error = 1;
730 RemoveBits32( &p_vpar->bit_stream );
732 /* Decode slice data. */
733 p_vpar->sequence.pf_slice_header( p_vpar, &i_mb_address, i_mb_base, i_dummy & 255 );
736 if( p_vpar->picture.b_error )
739 fprintf(stderr, "Image trashee\n");
740 for( i_mb = 0; p_vpar->picture.pp_mb[i_mb]; i_mb++ )
742 vpar_DestroyMacroblock( &p_vpar->vfifo, p_vpar->picture.pp_mb[i_mb] );
745 ReferenceReplace( p_vpar, p_vpar->picture.i_coding_type, NULL );
746 vout_DestroyPicture( p_vpar->p_vout, P_picture );
748 /* Prepare context for the next picture. */
750 if( p_vpar->picture.i_current_structure == FRAME_STRUCTURE )
751 p_vpar->picture.i_current_structure = 0;
753 else if( p_vpar->picture.i_current_structure == FRAME_STRUCTURE )
755 fprintf(stderr, "Image parsee\n");
756 /* Frame completely parsed. */
757 P_picture->i_deccount = p_vpar->sequence.i_mb_size;
758 for( i_mb = 0; i_mb < p_vpar->sequence.i_mb_size; i_mb++ )
760 vpar_DecodeMacroblock( &p_vpar->vfifo, p_vpar->picture.pp_mb[i_mb] );
763 /* Link referenced pictures for the decoder
764 * They are unlinked in vpar_ReleaseMacroblock() & vpar_DestroyMacroblock() */
766 if( p_vpar->sequence.p_forward != NULL )
768 vout_LinkPicture( p_vpar->p_vout, p_vpar->sequence.p_forward );
770 if( p_vpar->sequence.p_backward != NULL )
772 vout_LinkPicture( p_vpar->p_vout, p_vpar->sequence.p_backward );
775 /* Send signal to the video_decoder. */
776 vlc_cond_signal( &p_vpar->vfifo.wait );
778 /* Prepare context for the next picture. */
780 p_vpar->picture.i_current_structure = 0;
785 /*****************************************************************************
786 * SliceHeader : Parse the next slice structure
787 *****************************************************************************/
788 static __inline__ void SliceHeader( vpar_thread_t * p_vpar,
789 int * pi_mb_address, int i_mb_base,
792 /* DC predictors initialization table */
793 static int pi_dc_dct_reinit[4] = {128,256,512,1024};
795 int i_mb_address_save = *pi_mb_address;
797 /* slice_vertical_position_extension and priority_breakpoint already done */
798 LoadQuantizerScale( p_vpar );
800 if( GetBits( &p_vpar->bit_stream, 1 ) )
802 /* intra_slice, slice_id */
803 RemoveBits( &p_vpar->bit_stream, 8 );
804 /* extra_information_slice */
805 while( GetBits( &p_vpar->bit_stream, 1 ) )
807 RemoveBits( &p_vpar->bit_stream, 8 );
810 *pi_mb_address = (i_vert_code - 1)*p_vpar->sequence.i_mb_width;
812 /* Reset DC coefficients predictors (ISO/IEC 13818-2 7.2.1). Why
813 * does the reference decoder put 0 instead of the normative values ? */
814 p_vpar->slice.pi_dc_dct_pred[0] = p_vpar->slice.pi_dc_dct_pred[1]
815 = p_vpar->slice.pi_dc_dct_pred[2]
816 = pi_dc_dct_reinit[p_vpar->picture.i_intra_dc_precision];
818 /* Reset motion vector predictors (ISO/IEC 13818-2 7.6.3.4). */
819 memset( p_vpar->slice.pppi_pmv, 0, 8*sizeof(int) );
823 vpar_ParseMacroblock( p_vpar, pi_mb_address, i_mb_address_save,
825 i_mb_address_save = *pi_mb_address;
827 while( ShowBits( &p_vpar->bit_stream, 23 ) && !p_vpar->b_die );
828 NextStartCode( p_vpar );
831 /*****************************************************************************
832 * SliceHeaderXY : Parse the next slice structure
833 *****************************************************************************
834 * X = i_height > 2800 ?
835 * Y = scalable_mode == SC_DP ?
836 *****************************************************************************/
837 static void SliceHeader00( vpar_thread_t * p_vpar,
838 int * pi_mb_address, int i_mb_base,
841 SliceHeader( p_vpar, pi_mb_address, i_mb_base, i_vert_code );
844 static void SliceHeader01( vpar_thread_t * p_vpar,
845 int * pi_mb_address, int i_mb_base,
848 RemoveBits( &p_vpar->bit_stream, 7 ); /* priority_breakpoint */
849 SliceHeader( p_vpar, pi_mb_address, i_mb_base, i_vert_code );
852 static void SliceHeader10( vpar_thread_t * p_vpar,
853 int * pi_mb_address, int i_mb_base,
856 i_vert_code += GetBits( &p_vpar->bit_stream, 3 ) << 7;
857 SliceHeader( p_vpar, pi_mb_address, i_mb_base, i_vert_code );
860 static void SliceHeader11( vpar_thread_t * p_vpar,
861 int * pi_mb_address, int i_mb_base,
864 i_vert_code += GetBits( &p_vpar->bit_stream, 3 ) << 7;
865 RemoveBits( &p_vpar->bit_stream, 7 ); /* priority_breakpoint */
866 SliceHeader( p_vpar, pi_mb_address, i_mb_base, i_vert_code );
869 /*****************************************************************************
870 * ExtensionAndUserData : Parse the extension_and_user_data structure
871 *****************************************************************************/
872 static void ExtensionAndUserData( vpar_thread_t * p_vpar )
874 while( !p_vpar->b_die )
876 NextStartCode( p_vpar );
877 switch( ShowBits( &p_vpar->bit_stream, 32 ) )
879 case EXTENSION_START_CODE:
880 RemoveBits32( &p_vpar->bit_stream );
881 switch( GetBits( &p_vpar->bit_stream, 4 ) )
883 case SEQUENCE_DISPLAY_EXTENSION_ID:
884 SequenceDisplayExtension( p_vpar );
886 case QUANT_MATRIX_EXTENSION_ID:
887 QuantMatrixExtension( p_vpar );
889 case SEQUENCE_SCALABLE_EXTENSION_ID:
890 SequenceScalableExtension( p_vpar );
892 case PICTURE_DISPLAY_EXTENSION_ID:
893 PictureDisplayExtension( p_vpar );
895 case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID:
896 PictureSpatialScalableExtension( p_vpar );
898 case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID:
899 PictureTemporalScalableExtension( p_vpar );
901 case COPYRIGHT_EXTENSION_ID:
902 CopyrightExtension( p_vpar );
908 case USER_DATA_START_CODE:
909 RemoveBits32( &p_vpar->bit_stream );
910 /* Wait for the next start code */
920 /*****************************************************************************
921 * SequenceDisplayExtension : Parse the sequence_display_extension structure *
922 *****************************************************************************/
924 static void SequenceDisplayExtension( vpar_thread_t * p_vpar )
926 /* We don't care sequence_display_extension. */
928 RemoveBits( &p_vpar->bit_stream, 3 );
929 if( GetBits( &p_vpar->bit_stream, 1 ) )
931 /* Three bytes for color_desciption */
932 RemoveBits( &p_vpar->bit_stream, 24 );
934 /* display_horizontal and vertical_size and a marker_bit */
935 RemoveBits( &p_vpar->bit_stream, 29 );
939 /*****************************************************************************
940 * QuantMatrixExtension : Load quantization matrices for luminance *
942 *****************************************************************************/
944 static void QuantMatrixExtension( vpar_thread_t * p_vpar )
946 if( GetBits( &p_vpar->bit_stream, 1 ) )
948 /* Load intra_quantiser_matrix for luminance. */
949 LoadMatrix( p_vpar, &p_vpar->sequence.intra_quant );
953 /* Use the default matrix. */
954 LinkMatrix( &p_vpar->sequence.intra_quant,
955 pi_default_intra_quant );
957 if( GetBits( &p_vpar->bit_stream, 1 ) )
959 /* Load non_intra_quantiser_matrix for luminance. */
960 LoadMatrix( p_vpar, &p_vpar->sequence.nonintra_quant );
964 /* Use the default matrix. */
965 LinkMatrix( &p_vpar->sequence.nonintra_quant,
966 pi_default_nonintra_quant );
968 if( GetBits( &p_vpar->bit_stream, 1 ) )
970 /* Load intra_quantiser_matrix for chrominance. */
971 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_intra_quant );
975 /* Link the chrominance intra matrix to the luminance one. */
976 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
977 p_vpar->sequence.intra_quant.pi_matrix );
979 if( GetBits( &p_vpar->bit_stream, 1 ) )
981 /* Load non_intra_quantiser_matrix for chrominance. */
982 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_nonintra_quant );
986 /* Link the chrominance intra matrix to the luminance one. */
987 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
988 p_vpar->sequence.intra_quant.pi_matrix );
990 if( GetBits( &p_vpar->bit_stream, 1 ) )
992 /* Load non_intra_quantiser_matrix for chrominance. */
993 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_nonintra_quant );
997 /* Link the chrominance nonintra matrix to the luminance one. */
998 LinkMatrix( &p_vpar->sequence.chroma_nonintra_quant,
999 p_vpar->sequence.nonintra_quant.pi_matrix );
1004 /*****************************************************************************
1005 * SequenceScalableExtension : Parse the sequence_scalable_extension *
1006 * structure to handle scalable coding *
1007 *****************************************************************************/
1009 static void SequenceScalableExtension( vpar_thread_t * p_vpar )
1011 /* We don't care about anything scalable except the scalable mode. */
1012 switch( p_vpar->sequence.i_scalable_mode = GetBits( &p_vpar->bit_stream, 2 ) )
1013 /* The length of the structure depends on the value of the scalable_mode */
1016 RemoveBits32( &p_vpar->bit_stream );
1017 RemoveBits( &p_vpar->bit_stream, 21 );
1020 RemoveBits( &p_vpar->bit_stream, 12 );
1023 RemoveBits( &p_vpar->bit_stream, 4 );
1027 /*****************************************************************************
1028 * PictureDisplayExtension : Parse the picture_display_extension structure *
1029 *****************************************************************************/
1031 static void PictureDisplayExtension( vpar_thread_t * p_vpar )
1033 /* Number of frame center offset */
1035 /* I am not sure it works but it should
1036 (fewer tests than shown in ยง6.3.12) */
1037 nb = p_vpar->sequence.b_progressive ? p_vpar->sequence.b_progressive +
1038 p_vpar->picture.b_repeat_first_field +
1039 p_vpar->picture.b_top_field_first
1040 : ( p_vpar->picture.b_frame_structure + 1 ) +
1041 p_vpar->picture.b_repeat_first_field;
1042 RemoveBits( &p_vpar->bit_stream, 34 * nb );
1046 /*****************************************************************************
1047 * PictureSpatialScalableExtension *
1048 *****************************************************************************/
1050 static void PictureSpatialScalableExtension( vpar_thread_t * p_vpar )
1052 /* That's scalable, so we trash it */
1053 RemoveBits32( &p_vpar->bit_stream );
1054 RemoveBits( &p_vpar->bit_stream, 16 );
1058 /*****************************************************************************
1059 * PictureTemporalScalableExtension *
1060 *****************************************************************************/
1062 static void PictureTemporalScalableExtension( vpar_thread_t * p_vpar )
1064 /* Scalable again, trashed again */
1065 RemoveBits( &p_vpar->bit_stream, 23 );
1069 /*****************************************************************************
1070 * CopyrightExtension : Keeps some legal informations *
1071 *****************************************************************************/
1073 static void CopyrightExtension( vpar_thread_t * p_vpar )
1075 u32 i_copyright_nb_1, i_copyright_nb_2; /* local integers */
1076 p_vpar->sequence.b_copyright_flag = GetBits( &p_vpar->bit_stream, 1 );
1077 /* A flag that says whether the copyright information is significant */
1078 p_vpar->sequence.i_copyright_id = GetBits( &p_vpar->bit_stream, 8 );
1079 /* An identifier compliant with ISO/CEI JTC 1/SC 29 */
1080 p_vpar->sequence.b_original = GetBits( &p_vpar->bit_stream, 1 );
1082 RemoveBits( &p_vpar->bit_stream, 8 );
1083 /* The copyright_number is split in three parts */
1085 i_copyright_nb_1 = GetBits( &p_vpar->bit_stream, 20 );
1086 RemoveBits( &p_vpar->bit_stream, 1 );
1088 i_copyright_nb_2 = GetBits( &p_vpar->bit_stream, 22 );
1089 RemoveBits( &p_vpar->bit_stream, 1 );
1090 /* third part and sum */
1091 p_vpar->sequence.i_copyright_nb = ( (u64)i_copyright_nb_1 << 44 ) +
1092 ( (u64)i_copyright_nb_2 << 22 ) +
1093 ( (u64)GetBits( &p_vpar->bit_stream, 22 ) );