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 typedef void (*f_picture_data_t)( vpar_thread_t*, int );
49 static __inline__ void NextStartCode( vpar_thread_t * p_vpar );
50 static void SequenceHeader( vpar_thread_t * p_vpar );
51 static void GroupHeader( vpar_thread_t * p_vpar );
52 static void PictureHeader( vpar_thread_t * p_vpar );
53 static void ExtensionAndUserData( vpar_thread_t * p_vpar );
54 static void QuantMatrixExtension( vpar_thread_t * p_vpar );
55 static void SequenceScalableExtension( vpar_thread_t * p_vpar );
56 static void SequenceDisplayExtension( vpar_thread_t * p_vpar );
57 static void PictureDisplayExtension( vpar_thread_t * p_vpar );
58 static void PictureSpatialScalableExtension( vpar_thread_t * p_vpar );
59 static void PictureTemporalScalableExtension( vpar_thread_t * p_vpar );
60 static void CopyrightExtension( vpar_thread_t * p_vpar );
66 /*****************************************************************************
67 * pi_default_intra_quant : default quantization matrix
68 *****************************************************************************/
70 int pi_default_intra_quant[] =
72 8, 16, 19, 22, 26, 27, 29, 34,
73 16, 16, 22, 24, 27, 29, 34, 37,
74 19, 22, 26, 27, 29, 34, 34, 38,
75 22, 22, 26, 27, 29, 34, 37, 40,
76 22, 26, 27, 29, 32, 35, 40, 48,
77 26, 27, 29, 32, 35, 40, 48, 58,
78 26, 27, 29, 34, 38, 46, 56, 69,
79 27, 29, 35, 38, 46, 56, 69, 83
82 int pi_default_intra_quant[] =
84 2048, 5681, 6355, 6623, 6656, 5431, 4018, 2401,
85 5681, 7880, 10207, 10021, 9587, 8091, 6534, 3625,
86 6355, 10207, 11363, 10619, 9700, 8935, 6155, 3507,
87 6623, 9186, 10226, 9557, 8730, 8041, 6028, 3322,
88 5632, 9232, 9031, 8730, 8192, 7040, 5542, 3390,
89 5230, 7533, 7621, 7568, 7040, 6321, 5225, 3219,
90 3602, 5189, 5250, 5539, 5265, 5007, 4199, 2638,
91 1907, 2841, 3230, 3156, 3249, 3108, 2638, 1617
95 /*****************************************************************************
96 * pi_default_nonintra_quant : default quantization matrix
97 *****************************************************************************/
99 int pi_default_nonintra_quant[] =
101 16, 16, 16, 16, 16, 16, 16, 16,
102 16, 16, 16, 16, 16, 16, 16, 16,
103 16, 16, 16, 16, 16, 16, 16, 16,
104 16, 16, 16, 16, 16, 16, 16, 16,
105 16, 16, 16, 16, 16, 16, 16, 16,
106 16, 16, 16, 16, 16, 16, 16, 16,
107 16, 16, 16, 16, 16, 16, 16, 16,
108 16, 16, 16, 16, 16, 16, 16, 16
111 int pi_default_nonintra_quanit[] =
113 4096, 5680, 5344, 4816, 4096, 3216, 2224, 1136,
114 5680, 7888, 7424, 6688, 5680, 4464, 3072, 1568,
115 5344, 7424, 6992, 6288, 5344, 4208, 2896, 1472,
116 4816, 6688, 6288, 5664, 4816, 3792, 2608, 1328,
117 4096, 5680, 5344, 4816, 4096, 3216, 2224, 1136,
118 3216, 4464, 4208, 3792, 3216, 2528, 1744, 880,
119 2224, 3072, 2896, 2608, 2224, 1744, 1200, 608,
120 1136, 1568, 1472, 1328, 1136, 880, 608, 304
124 /*****************************************************************************
125 * pi_scan : zig-zag and alternate scan patterns
126 *****************************************************************************/
129 { /* Zig-Zag pattern */
130 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
131 12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
132 35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
133 58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
135 { /* Alternate scan pattern */
136 0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
137 41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
138 51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
139 53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
144 * Local inline functions.
147 /*****************************************************************************
148 * ReferenceUpdate : Update the reference pointers when we have a new picture
149 *****************************************************************************/
150 static void __inline__ ReferenceUpdate( vpar_thread_t * p_vpar,
152 picture_t * p_newref )
154 if( i_coding_type != B_CODING_TYPE )
156 if( p_vpar->sequence.p_forward != NULL )
157 vout_UnlinkPicture( p_vpar->p_vout, p_vpar->sequence.p_forward );
158 if( p_vpar->sequence.p_backward != NULL )
160 vout_DatePicture( p_vpar->p_vout, p_vpar->sequence.p_backward,
161 vpar_SynchroDate( p_vpar ) );
163 p_vpar->sequence.p_forward = p_vpar->sequence.p_backward;
164 p_vpar->sequence.p_backward = p_newref;
165 if( p_newref != NULL )
166 vout_LinkPicture( p_vpar->p_vout, p_newref );
170 /*****************************************************************************
171 * ReferenceReplace : Replace the last reference pointer when we destroy
173 *****************************************************************************/
174 static void __inline__ ReferenceReplace( vpar_thread_t * p_vpar,
176 picture_t * p_newref )
178 if( i_coding_type != B_CODING_TYPE )
180 if( p_vpar->sequence.p_backward != NULL )
181 vout_UnlinkPicture( p_vpar->p_vout, p_vpar->sequence.p_backward );
182 p_vpar->sequence.p_backward = p_newref;
183 if( p_newref != NULL )
184 vout_LinkPicture( p_vpar->p_vout, p_newref );
188 /*****************************************************************************
189 * LoadMatrix : Load a quantization matrix
190 *****************************************************************************/
191 static __inline__ void LoadMatrix( vpar_thread_t * p_vpar, quant_matrix_t * p_matrix )
195 if( !p_matrix->b_allocated )
197 /* Allocate a piece of memory to load the matrix. */
198 if( (p_matrix->pi_matrix = (int *)malloc( 64*sizeof(int) )) == NULL )
200 intf_ErrMsg("vpar error: allocation error in LoadMatrix()\n");
204 p_matrix->b_allocated = 1;
207 for( i_dummy = 0; i_dummy < 64; i_dummy++ )
209 p_matrix->pi_matrix[pi_scan[SCAN_ZIGZAG][i_dummy]]
210 = GetBits( &p_vpar->bit_stream, 8 );
214 /* Discrete Fourier Transform requires the quantization matrices to
215 * be normalized before using them. */
216 vdec_NormQuantMatrix( p_matrix->pi_matrix );
220 /*****************************************************************************
221 * LinkMatrix : Link a quantization matrix to another
222 *****************************************************************************/
223 static __inline__ void LinkMatrix( quant_matrix_t * p_matrix, int * pi_array )
225 if( p_matrix->b_allocated )
227 /* Deallocate the piece of memory. */
228 free( p_matrix->pi_matrix );
229 p_matrix->b_allocated = 0;
232 p_matrix->pi_matrix = pi_array;
236 * Exported functions.
239 /*****************************************************************************
240 * vpar_NextSequenceHeader : Find the next sequence header
241 *****************************************************************************/
242 int vpar_NextSequenceHeader( vpar_thread_t * p_vpar )
244 while( !p_vpar->b_die )
246 NextStartCode( p_vpar );
247 if( ShowBits( &p_vpar->bit_stream, 32 ) == SEQUENCE_HEADER_CODE )
249 RemoveBits( &p_vpar->bit_stream, 8 );
254 /*****************************************************************************
255 * vpar_ParseHeader : Parse the next header
256 *****************************************************************************/
257 int vpar_ParseHeader( vpar_thread_t * p_vpar )
259 while( !p_vpar->b_die )
261 NextStartCode( p_vpar );
262 switch( GetBits32( &p_vpar->bit_stream ) )
264 case SEQUENCE_HEADER_CODE:
265 SequenceHeader( p_vpar );
269 case GROUP_START_CODE:
270 GroupHeader( p_vpar );
274 case PICTURE_START_CODE:
275 PictureHeader( p_vpar );
279 case SEQUENCE_END_CODE:
280 intf_DbgMsg("vpar debug: sequence end code received\n");
292 * Following functions are local
295 /*****************************************************************************
296 * SequenceHeader : Parse the next sequence header
297 *****************************************************************************/
298 static void SequenceHeader( vpar_thread_t * p_vpar )
301 static float r_frame_rate_table[16] =
304 ((23.0*1000.0)/1001.0),
307 ((30.0*1000.0)/1001.0),
310 ((60.0*1000.0)/1001.0),
312 RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED
316 int i_height_save, i_width_save;
318 i_height_save = p_vpar->sequence.i_height;
319 i_width_save = p_vpar->sequence.i_width;
321 p_vpar->sequence.i_width = GetBits( &p_vpar->bit_stream, 12 );
322 p_vpar->sequence.i_height = GetBits( &p_vpar->bit_stream, 12 );
323 p_vpar->sequence.i_aspect_ratio = GetBits( &p_vpar->bit_stream, 4 );
324 p_vpar->sequence.r_frame_rate =
325 r_frame_rate_table[ GetBits( &p_vpar->bit_stream, 4 ) ];
327 /* We don't need bit_rate_value, marker_bit, vbv_buffer_size,
328 * constrained_parameters_flag */
329 RemoveBits( &p_vpar->bit_stream, 30 );
332 * Quantization matrices
334 if( GetBits( &p_vpar->bit_stream, 1 ) ) /* load_intra_quantizer_matrix */
336 LoadMatrix( p_vpar, &p_vpar->sequence.intra_quant );
340 /* Use default matrix. */
341 LinkMatrix( &p_vpar->sequence.intra_quant, pi_default_intra_quant );
344 if( GetBits( &p_vpar->bit_stream, 1 ) ) /* load_non_intra_quantizer_matrix */
346 LoadMatrix( p_vpar, &p_vpar->sequence.nonintra_quant );
350 /* Use default matrix. */
351 LinkMatrix( &p_vpar->sequence.nonintra_quant, pi_default_nonintra_quant );
354 /* Unless later overwritten by a matrix extension, we have the same
355 * matrices for luminance and chrominance. */
356 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
357 p_vpar->sequence.intra_quant.pi_matrix );
358 LinkMatrix( &p_vpar->sequence.chroma_nonintra_quant,
359 p_vpar->sequence.nonintra_quant.pi_matrix );
364 NextStartCode( p_vpar );
365 if( ShowBits( &p_vpar->bit_stream, 32 ) == EXTENSION_START_CODE )
369 /* Turn the MPEG2 flag on */
370 p_vpar->sequence.b_mpeg2 = 1;
372 /* Parse sequence_extension */
373 RemoveBits32( &p_vpar->bit_stream );
374 /* extension_start_code_identifier, profile_and_level_indication */
375 RemoveBits( &p_vpar->bit_stream, 12 );
376 p_vpar->sequence.b_progressive = GetBits( &p_vpar->bit_stream, 1 );
377 p_vpar->sequence.i_chroma_format = GetBits( &p_vpar->bit_stream, 2 );
378 p_vpar->sequence.i_width |= GetBits( &p_vpar->bit_stream, 2 ) << 12;
379 p_vpar->sequence.i_height |= GetBits( &p_vpar->bit_stream, 2 ) << 12;
380 /* bit_rate_extension, marker_bit, vbv_buffer_size_extension, low_delay */
381 RemoveBits( &p_vpar->bit_stream, 22 );
382 /* frame_rate_extension_n */
383 i_dummy = GetBits( &p_vpar->bit_stream, 2 );
384 /* frame_rate_extension_d */
385 p_vpar->sequence.r_frame_rate *= (i_dummy + 1)
386 / (GetBits( &p_vpar->bit_stream, 5 ) + 1);
390 /* It's an MPEG-1 stream. Put adequate parameters. */
392 p_vpar->sequence.b_mpeg2 = 0;
393 p_vpar->sequence.b_progressive = 1;
394 p_vpar->sequence.i_chroma_format = CHROMA_420;
398 p_vpar->sequence.i_mb_width = (p_vpar->sequence.i_width + 15) / 16;
399 p_vpar->sequence.i_mb_height = (p_vpar->sequence.b_progressive) ?
400 (p_vpar->sequence.i_height + 15) / 16 :
401 2 * ((p_vpar->sequence.i_height + 31) / 32);
402 p_vpar->sequence.i_mb_size = p_vpar->sequence.i_mb_width
403 * p_vpar->sequence.i_mb_height;
404 p_vpar->sequence.i_width = (p_vpar->sequence.i_mb_width * 16);
405 p_vpar->sequence.i_height = (p_vpar->sequence.i_mb_height * 16);
406 p_vpar->sequence.i_size = p_vpar->sequence.i_width
407 * p_vpar->sequence.i_height;
409 /* Update chromatic information. */
410 switch( p_vpar->sequence.i_chroma_format )
413 p_vpar->sequence.i_chroma_nb_blocks = 2;
414 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width >> 1;
415 p_vpar->sequence.i_chroma_mb_width = 8;
416 p_vpar->sequence.i_chroma_mb_height = 8;
420 p_vpar->sequence.i_chroma_nb_blocks = 4;
421 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width >> 1;
422 p_vpar->sequence.i_chroma_mb_width = 8;
423 p_vpar->sequence.i_chroma_mb_height = 16;
427 p_vpar->sequence.i_chroma_nb_blocks = 8;
428 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width;
429 p_vpar->sequence.i_chroma_mb_width = 16;
430 p_vpar->sequence.i_chroma_mb_height = 16;
433 /* Reset scalable_mode. */
434 p_vpar->sequence.i_scalable_mode = SC_NONE;
437 if( p_vpar->sequence.i_width != i_width_save
438 || p_vpar->sequence.i_height != i_height_save )
440 /* What do we do in case of a size change ??? */
444 /* Extension and User data */
445 ExtensionAndUserData( p_vpar );
448 /*****************************************************************************
449 * GroupHeader : Parse the next group of pictures header
450 *****************************************************************************/
451 static void GroupHeader( vpar_thread_t * p_vpar )
453 /* Nothing to do, we don't care. */
454 RemoveBits( &p_vpar->bit_stream, 27 );
455 ExtensionAndUserData( p_vpar );
458 /*****************************************************************************
459 * PictureHeader : Parse the next picture header
460 *****************************************************************************/
461 static void PictureHeader( vpar_thread_t * p_vpar )
463 /* Table of optimized PictureData functions. */
464 static f_picture_data_t ppf_picture_data[4][4] =
467 NULL, NULL, NULL, NULL
471 #if (VPAR_OPTIM_LEVEL > 1)
472 NULL, vpar_PictureData2I420TZ, vpar_PictureData2P420TZ,
473 vpar_PictureData2B420TZ
475 NULL, vpar_PictureDataGENERIC, vpar_PictureDataGENERIC,
476 vpar_PictureDataGENERIC
481 #if (VPAR_OPTIM_LEVEL > 1)
482 NULL, vpar_PictureData2I420BZ, vpar_PictureData2P420BZ,
483 vpar_PictureData2B420BZ
485 NULL, vpar_PictureDataGENERIC, vpar_PictureDataGENERIC,
486 vpar_PictureDataGENERIC
491 #if (VPAR_OPTIM_LEVEL > 0)
492 NULL, vpar_PictureData2I420F0, vpar_PictureData2P420F0,
493 vpar_PictureData2B420F0
495 NULL, vpar_PictureDataGENERIC, vpar_PictureDataGENERIC,
496 vpar_PictureDataGENERIC
503 boolean_t b_parsable;
508 RemoveBits( &p_vpar->bit_stream, 10 ); /* temporal_reference */
509 p_vpar->picture.i_coding_type = GetBits( &p_vpar->bit_stream, 3 );
510 RemoveBits( &p_vpar->bit_stream, 16 ); /* vbv_delay */
512 if( p_vpar->picture.i_coding_type == P_CODING_TYPE
513 || p_vpar->picture.i_coding_type == B_CODING_TYPE )
515 p_vpar->picture.pb_full_pel_vector[0] = GetBits( &p_vpar->bit_stream, 1 );
516 p_vpar->picture.i_forward_f_code = GetBits( &p_vpar->bit_stream, 3 );
518 if( p_vpar->picture.i_coding_type == B_CODING_TYPE )
520 p_vpar->picture.pb_full_pel_vector[1] = GetBits( &p_vpar->bit_stream, 1 );
521 p_vpar->picture.i_backward_f_code = GetBits( &p_vpar->bit_stream, 3 );
524 /* extra_information_picture */
525 while( GetBits( &p_vpar->bit_stream, 1 ) )
527 RemoveBits( &p_vpar->bit_stream, 8 );
531 * Picture Coding Extension
533 NextStartCode( p_vpar );
534 if( ShowBits( &p_vpar->bit_stream, 32 ) == EXTENSION_START_CODE )
536 /* Parse picture_coding_extension */
537 RemoveBits32( &p_vpar->bit_stream );
538 /* extension_start_code_identifier */
539 RemoveBits( &p_vpar->bit_stream, 4 );
541 p_vpar->picture.ppi_f_code[0][0] = GetBits( &p_vpar->bit_stream, 4 );
542 p_vpar->picture.ppi_f_code[0][1] = GetBits( &p_vpar->bit_stream, 4 );
543 p_vpar->picture.ppi_f_code[1][0] = GetBits( &p_vpar->bit_stream, 4 );
544 p_vpar->picture.ppi_f_code[1][1] = GetBits( &p_vpar->bit_stream, 4 );
545 p_vpar->picture.i_intra_dc_precision = GetBits( &p_vpar->bit_stream, 2 );
546 i_structure = GetBits( &p_vpar->bit_stream, 2 );
547 p_vpar->picture.b_top_field_first = GetBits( &p_vpar->bit_stream, 1 );
548 p_vpar->picture.b_frame_pred_frame_dct
549 = GetBits( &p_vpar->bit_stream, 1 );
550 p_vpar->picture.b_concealment_mv = GetBits( &p_vpar->bit_stream, 1 );
551 p_vpar->picture.b_q_scale_type = GetBits( &p_vpar->bit_stream, 1 );
552 p_vpar->picture.b_intra_vlc_format = GetBits( &p_vpar->bit_stream, 1 );
553 p_vpar->picture.b_alternate_scan = GetBits( &p_vpar->bit_stream, 1 );
554 p_vpar->picture.b_repeat_first_field = GetBits( &p_vpar->bit_stream, 1 );
555 /* repeat_first_field (ISO/IEC 13818-2 6.3.10 is necessary to know
556 * the length of the picture_display_extension structure.
557 * chroma_420_type (obsolete) */
558 RemoveBits( &p_vpar->bit_stream, 1 );
559 p_vpar->picture.b_progressive_frame = GetBits( &p_vpar->bit_stream, 1 );
561 /* composite_display_flag */
562 if( GetBits( &p_vpar->bit_stream, 1 ) )
564 /* v_axis, field_sequence, sub_carrier, burst_amplitude,
565 * sub_carrier_phase */
566 RemoveBits( &p_vpar->bit_stream, 20 );
571 /* MPEG-1 compatibility flags */
572 p_vpar->picture.i_intra_dc_precision = 0; /* 8 bits */
573 i_structure = FRAME_STRUCTURE;
574 p_vpar->picture.b_frame_pred_frame_dct = 1;
575 p_vpar->picture.b_concealment_mv = 0;
576 p_vpar->picture.b_q_scale_type = 0;
577 p_vpar->picture.b_intra_vlc_format = 0;
578 p_vpar->picture.b_alternate_scan = 0; /* zigzag */
579 p_vpar->picture.b_repeat_first_field = 0;
580 p_vpar->picture.b_progressive_frame = 1;
583 if( p_vpar->picture.i_current_structure &&
584 (i_structure == FRAME_STRUCTURE ||
585 i_structure == p_vpar->picture.i_current_structure) )
587 /* We don't have the second field of the buffered frame. */
588 if( p_vpar->picture.p_picture != NULL )
590 ReferenceReplace( p_vpar,
591 p_vpar->picture.i_coding_type,
595 for( i_mb = 0; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
597 vpar_DestroyMacroblock( &p_vpar->vfifo,
598 p_vpar->picture.pp_mb[i_mb] );
601 vout_DestroyPicture( p_vpar->p_vout, p_vpar->picture.p_picture );
604 p_vpar->picture.i_current_structure = 0;
606 intf_DbgMsg("vpar debug: odd number of field picture.\n");
609 /* Do we have the reference pictures ? */
610 b_parsable = !(((p_vpar->picture.i_coding_type == P_CODING_TYPE) &&
611 (p_vpar->sequence.p_backward == NULL)) ||
612 /* p_backward will become p_forward later */
613 ((p_vpar->picture.i_coding_type == B_CODING_TYPE) &&
614 (p_vpar->sequence.p_forward == NULL ||
615 p_vpar->sequence.p_backward == NULL)));
619 if( p_vpar->picture.i_current_structure )
621 /* Second field of a frame. We will decode it if, and only if we
622 * have decoded the first field. */
623 b_parsable = (p_vpar->picture.p_picture != NULL);
627 /* Does synchro say we have enough time to decode it ? */
628 b_parsable = vpar_SynchroChoose( p_vpar,
629 p_vpar->picture.i_coding_type, i_structure );
635 /* Update the reference pointers. */
636 ReferenceUpdate( p_vpar, p_vpar->picture.i_coding_type, NULL );
638 /* Warn Synchro we have trashed a picture. */
639 vpar_SynchroTrash( p_vpar, p_vpar->picture.i_coding_type, i_structure );
641 /* Update context. */
642 if( i_structure != FRAME_STRUCTURE )
643 p_vpar->picture.i_current_structure = i_structure;
644 p_vpar->picture.p_picture = NULL;
649 /* OK, now we are sure we will decode the picture. */
650 #define P_picture p_vpar->picture.p_picture
651 p_vpar->picture.b_error = 0;
652 p_vpar->picture.b_frame_structure = (i_structure == FRAME_STRUCTURE);
654 if( !p_vpar->picture.i_current_structure )
656 /* This is a new frame. Get a structure from the video_output. */
657 while( ( P_picture = vout_CreatePicture( p_vpar->p_vout,
658 99+p_vpar->sequence.i_chroma_format, /*???*/
659 p_vpar->sequence.i_width,
660 p_vpar->sequence.i_height ) )
663 intf_DbgMsg("vpar debug: allocation error in vout_CreatePicture, delaying\n");
664 if( p_vpar->b_die || p_vpar->b_error )
668 msleep( VPAR_OUTMEM_SLEEP );
671 /* Initialize values. */
672 vpar_SynchroDecode( p_vpar, p_vpar->picture.i_coding_type, i_structure );
673 if( p_vpar->picture.i_coding_type == B_CODING_TYPE )
675 /* Put date immediately. */
676 vout_DatePicture( p_vpar->p_vout, P_picture,
677 vpar_SynchroDate( p_vpar ) );
679 P_picture->i_aspect_ratio = p_vpar->sequence.i_aspect_ratio;
680 P_picture->i_matrix_coefficients = p_vpar->sequence.i_matrix_coefficients;
681 p_vpar->picture.i_l_stride = ( p_vpar->sequence.i_width
682 << ( 1 - p_vpar->picture.b_frame_structure ) );
683 p_vpar->picture.i_c_stride = ( p_vpar->sequence.i_chroma_width
684 << ( 1 - p_vpar->picture.b_frame_structure ));
686 P_picture->i_deccount = p_vpar->sequence.i_mb_size;
687 vlc_mutex_init( &p_vpar->picture.p_picture->lock_deccount );
689 memset( p_vpar->picture.pp_mb, 0, MAX_MB*sizeof(macroblock_t *) );
691 /* FIXME ! remove asap */
692 //memset( P_picture->p_data, 0, (p_vpar->sequence.i_mb_size*384));
694 /* Update the reference pointers. */
695 ReferenceUpdate( p_vpar, p_vpar->picture.i_coding_type, P_picture );
698 /* Link referenced pictures for the decoder
699 * They are unlinked in vpar_ReleaseMacroblock() & vpar_DestroyMacroblock() */
700 if( p_vpar->picture.i_coding_type == P_CODING_TYPE ||
701 p_vpar->picture.i_coding_type == B_CODING_TYPE )
703 vout_LinkPicture( p_vpar->p_vout, p_vpar->sequence.p_forward );
705 if( p_vpar->picture.i_coding_type == B_CODING_TYPE )
707 vout_LinkPicture( p_vpar->p_vout, p_vpar->sequence.p_backward );
711 p_vpar->picture.i_current_structure |= i_structure;
712 p_vpar->picture.i_structure = i_structure;
714 /* Initialize picture data for decoding. */
715 if( i_structure == BOTTOM_FIELD )
717 i_mb_base = p_vpar->sequence.i_mb_size >> 1;
718 p_vpar->mb.i_l_y = 1;
719 p_vpar->mb.i_c_y = 1;
724 p_vpar->mb.i_l_y = p_vpar->mb.i_c_y = 0;
726 p_vpar->mb.i_l_x = p_vpar->mb.i_c_x = 0;
728 /* Extension and User data. */
729 ExtensionAndUserData( p_vpar );
731 /* Picture data (ISO/IEC 13818-2 6.2.3.7). */
732 if( p_vpar->sequence.i_chroma_format != CHROMA_420
733 || !p_vpar->sequence.b_mpeg2 || p_vpar->sequence.i_height > 2800
734 || p_vpar->sequence.i_scalable_mode == SC_DP )
736 /* Weird stream. Use the slower generic function. */
737 vpar_PictureDataGENERIC( p_vpar, i_mb_base );
741 /* Try to find an optimized function. */
742 ppf_picture_data[p_vpar->picture.i_structure]
743 [p_vpar->picture.i_coding_type]( p_vpar, i_mb_base );
746 if( p_vpar->b_die || p_vpar->b_error )
751 if( p_vpar->picture.b_error )
754 //fprintf(stderr, "Image trashee\n");
756 for( i_mb = 1; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
758 vpar_DestroyMacroblock( &p_vpar->vfifo, p_vpar->picture.pp_mb[i_mb] );
762 if( P_picture->i_deccount != 1 )
764 vout_DestroyPicture( p_vpar->p_vout, P_picture );
767 ReferenceReplace( p_vpar, p_vpar->picture.i_coding_type, NULL );
769 /* Prepare context for the next picture. */
771 if( p_vpar->picture.i_current_structure == FRAME_STRUCTURE )
772 p_vpar->picture.i_current_structure = 0;
774 else if( p_vpar->picture.i_current_structure == FRAME_STRUCTURE )
776 //fprintf(stderr, "Image parsee (%d)\n", p_vpar->picture.i_coding_type);
777 /* Frame completely parsed. */
779 for( i_mb = 1; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
781 vpar_DecodeMacroblock( &p_vpar->vfifo, p_vpar->picture.pp_mb[i_mb] );
784 /* Send signal to the video_decoder. */
785 vlc_mutex_lock( &p_vpar->vfifo.lock );
786 vlc_cond_signal( &p_vpar->vfifo.wait );
787 vlc_mutex_unlock( &p_vpar->vfifo.lock );
790 /* Prepare context for the next picture. */
792 p_vpar->picture.i_current_structure = 0;
797 /*****************************************************************************
798 * ExtensionAndUserData : Parse the extension_and_user_data structure
799 *****************************************************************************/
800 static void ExtensionAndUserData( vpar_thread_t * p_vpar )
802 while( !p_vpar->b_die )
804 NextStartCode( p_vpar );
805 switch( ShowBits( &p_vpar->bit_stream, 32 ) )
807 case EXTENSION_START_CODE:
808 RemoveBits32( &p_vpar->bit_stream );
809 switch( GetBits( &p_vpar->bit_stream, 4 ) )
811 case SEQUENCE_DISPLAY_EXTENSION_ID:
812 SequenceDisplayExtension( p_vpar );
814 case QUANT_MATRIX_EXTENSION_ID:
815 QuantMatrixExtension( p_vpar );
817 case SEQUENCE_SCALABLE_EXTENSION_ID:
818 SequenceScalableExtension( p_vpar );
820 case PICTURE_DISPLAY_EXTENSION_ID:
821 PictureDisplayExtension( p_vpar );
823 case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID:
824 PictureSpatialScalableExtension( p_vpar );
826 case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID:
827 PictureTemporalScalableExtension( p_vpar );
829 case COPYRIGHT_EXTENSION_ID:
830 CopyrightExtension( p_vpar );
836 case USER_DATA_START_CODE:
837 RemoveBits32( &p_vpar->bit_stream );
838 /* Wait for the next start code */
848 /*****************************************************************************
849 * SequenceDisplayExtension : Parse the sequence_display_extension structure *
850 *****************************************************************************/
852 static void SequenceDisplayExtension( vpar_thread_t * p_vpar )
854 /* We don't care sequence_display_extension. */
856 RemoveBits( &p_vpar->bit_stream, 3 );
857 if( GetBits( &p_vpar->bit_stream, 1 ) )
859 /* Two bytes for color_desciption */
860 RemoveBits( &p_vpar->bit_stream, 16 );
861 p_vpar->sequence.i_matrix_coefficients = GetBits( &p_vpar->bit_stream, 8 );
863 /* display_horizontal and vertical_size and a marker_bit */
864 RemoveBits( &p_vpar->bit_stream, 29 );
868 /*****************************************************************************
869 * QuantMatrixExtension : Load quantization matrices for luminance *
871 *****************************************************************************/
873 static void QuantMatrixExtension( vpar_thread_t * p_vpar )
875 if( GetBits( &p_vpar->bit_stream, 1 ) )
877 /* Load intra_quantiser_matrix for luminance. */
878 LoadMatrix( p_vpar, &p_vpar->sequence.intra_quant );
882 /* Use the default matrix. */
883 LinkMatrix( &p_vpar->sequence.intra_quant,
884 pi_default_intra_quant );
886 if( GetBits( &p_vpar->bit_stream, 1 ) )
888 /* Load non_intra_quantiser_matrix for luminance. */
889 LoadMatrix( p_vpar, &p_vpar->sequence.nonintra_quant );
893 /* Use the default matrix. */
894 LinkMatrix( &p_vpar->sequence.nonintra_quant,
895 pi_default_nonintra_quant );
897 if( GetBits( &p_vpar->bit_stream, 1 ) )
899 /* Load intra_quantiser_matrix for chrominance. */
900 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_intra_quant );
904 /* Link the chrominance intra matrix to the luminance one. */
905 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
906 p_vpar->sequence.intra_quant.pi_matrix );
908 if( GetBits( &p_vpar->bit_stream, 1 ) )
910 /* Load non_intra_quantiser_matrix for chrominance. */
911 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_nonintra_quant );
915 /* Link the chrominance intra matrix to the luminance one. */
916 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
917 p_vpar->sequence.intra_quant.pi_matrix );
919 if( GetBits( &p_vpar->bit_stream, 1 ) )
921 /* Load non_intra_quantiser_matrix for chrominance. */
922 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_nonintra_quant );
926 /* Link the chrominance nonintra matrix to the luminance one. */
927 LinkMatrix( &p_vpar->sequence.chroma_nonintra_quant,
928 p_vpar->sequence.nonintra_quant.pi_matrix );
933 /*****************************************************************************
934 * SequenceScalableExtension : Parse the sequence_scalable_extension *
935 * structure to handle scalable coding *
936 *****************************************************************************/
938 static void SequenceScalableExtension( vpar_thread_t * p_vpar )
940 /* We don't care about anything scalable except the scalable mode. */
941 switch( p_vpar->sequence.i_scalable_mode = GetBits( &p_vpar->bit_stream, 2 ) )
942 /* The length of the structure depends on the value of the scalable_mode */
945 RemoveBits32( &p_vpar->bit_stream );
946 RemoveBits( &p_vpar->bit_stream, 21 );
949 RemoveBits( &p_vpar->bit_stream, 12 );
952 RemoveBits( &p_vpar->bit_stream, 4 );
956 /*****************************************************************************
957 * PictureDisplayExtension : Parse the picture_display_extension structure *
958 *****************************************************************************/
960 static void PictureDisplayExtension( vpar_thread_t * p_vpar )
962 /* Number of frame center offset */
964 /* I am not sure it works but it should
965 (fewer tests than shown in ยง6.3.12) */
966 i_nb = p_vpar->sequence.b_progressive ? p_vpar->sequence.b_progressive +
967 p_vpar->picture.b_repeat_first_field +
968 p_vpar->picture.b_top_field_first
969 : ( p_vpar->picture.b_frame_structure + 1 ) +
970 p_vpar->picture.b_repeat_first_field;
971 for( i_dummy = 0; i_dummy < i_nb; i_dummy++ )
973 RemoveBits( &p_vpar->bit_stream, 17 );
974 RemoveBits( &p_vpar->bit_stream, 17 );
979 /*****************************************************************************
980 * PictureSpatialScalableExtension *
981 *****************************************************************************/
983 static void PictureSpatialScalableExtension( vpar_thread_t * p_vpar )
985 /* That's scalable, so we trash it */
986 RemoveBits32( &p_vpar->bit_stream );
987 RemoveBits( &p_vpar->bit_stream, 16 );
991 /*****************************************************************************
992 * PictureTemporalScalableExtension *
993 *****************************************************************************/
995 static void PictureTemporalScalableExtension( vpar_thread_t * p_vpar )
997 /* Scalable again, trashed again */
998 RemoveBits( &p_vpar->bit_stream, 23 );
1002 /*****************************************************************************
1003 * CopyrightExtension : Keeps some legal informations *
1004 *****************************************************************************/
1006 static void CopyrightExtension( vpar_thread_t * p_vpar )
1008 u32 i_copyright_nb_1, i_copyright_nb_2; /* local integers */
1009 p_vpar->sequence.b_copyright_flag = GetBits( &p_vpar->bit_stream, 1 );
1010 /* A flag that says whether the copyright information is significant */
1011 p_vpar->sequence.i_copyright_id = GetBits( &p_vpar->bit_stream, 8 );
1012 /* An identifier compliant with ISO/CEI JTC 1/SC 29 */
1013 p_vpar->sequence.b_original = GetBits( &p_vpar->bit_stream, 1 );
1015 RemoveBits( &p_vpar->bit_stream, 8 );
1016 /* The copyright_number is split in three parts */
1018 i_copyright_nb_1 = GetBits( &p_vpar->bit_stream, 20 );
1019 RemoveBits( &p_vpar->bit_stream, 1 );
1021 i_copyright_nb_2 = GetBits( &p_vpar->bit_stream, 22 );
1022 RemoveBits( &p_vpar->bit_stream, 1 );
1023 /* third part and sum */
1024 p_vpar->sequence.i_copyright_nb = ( (u64)i_copyright_nb_1 << 44 ) |
1025 ( (u64)i_copyright_nb_2 << 22 ) |
1026 ( (u64)GetBits( &p_vpar->bit_stream, 22 ) );