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 "video_fifo.h"
43 typedef void (*f_picture_data_t)( vpar_thread_t*, int );
48 static __inline__ void NextStartCode( vpar_thread_t * p_vpar );
49 static void SequenceHeader( vpar_thread_t * p_vpar );
50 static void GroupHeader( vpar_thread_t * p_vpar );
51 static void PictureHeader( vpar_thread_t * p_vpar );
52 static void ExtensionAndUserData( vpar_thread_t * p_vpar );
53 static void QuantMatrixExtension( vpar_thread_t * p_vpar );
54 static void SequenceScalableExtension( vpar_thread_t * p_vpar );
55 static void SequenceDisplayExtension( vpar_thread_t * p_vpar );
56 static void PictureDisplayExtension( vpar_thread_t * p_vpar );
57 static void PictureSpatialScalableExtension( vpar_thread_t * p_vpar );
58 static void PictureTemporalScalableExtension( vpar_thread_t * p_vpar );
59 static void CopyrightExtension( vpar_thread_t * p_vpar );
65 /*****************************************************************************
66 * pi_default_intra_quant : default quantization matrix
67 *****************************************************************************/
69 int pi_default_intra_quant[] =
71 8, 16, 19, 22, 26, 27, 29, 34,
72 16, 16, 22, 24, 27, 29, 34, 37,
73 19, 22, 26, 27, 29, 34, 34, 38,
74 22, 22, 26, 27, 29, 34, 37, 40,
75 22, 26, 27, 29, 32, 35, 40, 48,
76 26, 27, 29, 32, 35, 40, 48, 58,
77 26, 27, 29, 34, 38, 46, 56, 69,
78 27, 29, 35, 38, 46, 56, 69, 83
81 int pi_default_intra_quant[] =
83 2048, 5681, 6355, 6623, 6656, 5431, 4018, 2401,
84 5681, 7880, 10207, 10021, 9587, 8091, 6534, 3625,
85 6355, 10207, 11363, 10619, 9700, 8935, 6155, 3507,
86 6623, 9186, 10226, 9557, 8730, 8041, 6028, 3322,
87 5632, 9232, 9031, 8730, 8192, 7040, 5542, 3390,
88 5230, 7533, 7621, 7568, 7040, 6321, 5225, 3219,
89 3602, 5189, 5250, 5539, 5265, 5007, 4199, 2638,
90 1907, 2841, 3230, 3156, 3249, 3108, 2638, 1617
94 /*****************************************************************************
95 * pi_default_nonintra_quant : default quantization matrix
96 *****************************************************************************/
98 int pi_default_nonintra_quant[] =
100 16, 16, 16, 16, 16, 16, 16, 16,
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
110 int pi_default_nonintra_quanit[] =
112 4096, 5680, 5344, 4816, 4096, 3216, 2224, 1136,
113 5680, 7888, 7424, 6688, 5680, 4464, 3072, 1568,
114 5344, 7424, 6992, 6288, 5344, 4208, 2896, 1472,
115 4816, 6688, 6288, 5664, 4816, 3792, 2608, 1328,
116 4096, 5680, 5344, 4816, 4096, 3216, 2224, 1136,
117 3216, 4464, 4208, 3792, 3216, 2528, 1744, 880,
118 2224, 3072, 2896, 2608, 2224, 1744, 1200, 608,
119 1136, 1568, 1472, 1328, 1136, 880, 608, 304
123 /*****************************************************************************
124 * pi_scan : zig-zag and alternate scan patterns
125 *****************************************************************************/
128 { /* Zig-Zag pattern */
129 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
130 12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
131 35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
132 58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
134 { /* Alternate scan pattern */
135 0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
136 41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
137 51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
138 53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
143 * Local inline functions.
146 /*****************************************************************************
147 * ReferenceUpdate : Update the reference pointers when we have a new picture
148 *****************************************************************************/
149 static void __inline__ ReferenceUpdate( vpar_thread_t * p_vpar,
151 picture_t * p_newref )
153 if( i_coding_type != B_CODING_TYPE )
155 if( p_vpar->sequence.p_forward != NULL )
156 vout_UnlinkPicture( p_vpar->p_vout, p_vpar->sequence.p_forward );
157 if( p_vpar->sequence.p_backward != NULL )
160 vout_DatePicture( p_vpar->p_vout, p_vpar->sequence.p_backward,
161 vpar_SynchroDate( p_vpar ) );
164 vout_DatePicture( p_vpar->p_vout, p_vpar->sequence.p_backward,
165 vpar_SynchroDate( p_vpar ) );
169 date = vpar_SynchroDate( p_vpar );
170 vout_DatePicture( p_vpar->p_vout, p_vpar->sequence.p_backward,
172 if( p_vpar->synchro.i_coding_type == I_CODING_TYPE )
173 vpar_SynchroKludge( p_vpar, date );
176 p_vpar->sequence.p_forward = p_vpar->sequence.p_backward;
177 p_vpar->sequence.p_backward = p_newref;
178 if( p_newref != NULL )
179 vout_LinkPicture( p_vpar->p_vout, p_newref );
181 p_vpar->synchro.i_coding_type = i_coding_type;
184 else if( p_newref != NULL )
186 /* Put date immediately. */
187 vout_DatePicture( p_vpar->p_vout, p_newref, vpar_SynchroDate(p_vpar) );
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 if( (p_matrix->pi_matrix = (int *)malloc( 64*sizeof(int) )) == NULL )
221 intf_ErrMsg("vpar error: allocation error in LoadMatrix()\n");
225 p_matrix->b_allocated = 1;
228 for( i_dummy = 0; i_dummy < 64; i_dummy++ )
230 p_matrix->pi_matrix[pi_scan[SCAN_ZIGZAG][i_dummy]]
231 = GetBits( &p_vpar->bit_stream, 8 );
235 /* Discrete Fourier Transform requires the quantization matrices to
236 * be normalized before using them. */
237 vdec_NormQuantMatrix( p_matrix->pi_matrix );
241 /*****************************************************************************
242 * LinkMatrix : Link a quantization matrix to another
243 *****************************************************************************/
244 static __inline__ void LinkMatrix( quant_matrix_t * p_matrix, int * pi_array )
246 if( p_matrix->b_allocated )
248 /* Deallocate the piece of memory. */
249 free( p_matrix->pi_matrix );
250 p_matrix->b_allocated = 0;
253 p_matrix->pi_matrix = pi_array;
257 * Exported functions.
260 /*****************************************************************************
261 * vpar_NextSequenceHeader : Find the next sequence header
262 *****************************************************************************/
263 int vpar_NextSequenceHeader( vpar_thread_t * p_vpar )
265 while( !p_vpar->b_die )
267 NextStartCode( p_vpar );
268 if( ShowBits( &p_vpar->bit_stream, 32 ) == SEQUENCE_HEADER_CODE )
270 RemoveBits( &p_vpar->bit_stream, 8 );
275 /*****************************************************************************
276 * vpar_ParseHeader : Parse the next header
277 *****************************************************************************/
278 int vpar_ParseHeader( vpar_thread_t * p_vpar )
280 while( !p_vpar->b_die )
282 NextStartCode( p_vpar );
283 switch( GetBits32( &p_vpar->bit_stream ) )
285 case SEQUENCE_HEADER_CODE:
286 SequenceHeader( p_vpar );
290 case GROUP_START_CODE:
291 GroupHeader( p_vpar );
295 case PICTURE_START_CODE:
296 PictureHeader( p_vpar );
300 case SEQUENCE_END_CODE:
301 intf_DbgMsg("vpar debug: sequence end code received\n");
313 * Following functions are local
316 /*****************************************************************************
317 * SequenceHeader : Parse the next sequence header
318 *****************************************************************************/
319 static void SequenceHeader( vpar_thread_t * p_vpar )
322 static float r_frame_rate_table[16] =
325 ((23.0*1000.0)/1001.0),
328 ((30.0*1000.0)/1001.0),
331 ((60.0*1000.0)/1001.0),
333 RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED
337 int i_height_save, i_width_save;
339 i_height_save = p_vpar->sequence.i_height;
340 i_width_save = p_vpar->sequence.i_width;
342 p_vpar->sequence.i_width = GetBits( &p_vpar->bit_stream, 12 );
343 p_vpar->sequence.i_height = GetBits( &p_vpar->bit_stream, 12 );
344 p_vpar->sequence.i_aspect_ratio = GetBits( &p_vpar->bit_stream, 4 );
345 p_vpar->sequence.r_frame_rate =
346 r_frame_rate_table[ GetBits( &p_vpar->bit_stream, 4 ) ];
348 /* We don't need bit_rate_value, marker_bit, vbv_buffer_size,
349 * constrained_parameters_flag */
350 RemoveBits( &p_vpar->bit_stream, 30 );
353 * Quantization matrices
355 if( GetBits( &p_vpar->bit_stream, 1 ) ) /* load_intra_quantizer_matrix */
357 LoadMatrix( p_vpar, &p_vpar->sequence.intra_quant );
361 /* Use default matrix. */
362 LinkMatrix( &p_vpar->sequence.intra_quant, pi_default_intra_quant );
365 if( GetBits( &p_vpar->bit_stream, 1 ) ) /* load_non_intra_quantizer_matrix */
367 LoadMatrix( p_vpar, &p_vpar->sequence.nonintra_quant );
371 /* Use default matrix. */
372 LinkMatrix( &p_vpar->sequence.nonintra_quant, pi_default_nonintra_quant );
375 /* Unless later overwritten by a matrix extension, we have the same
376 * matrices for luminance and chrominance. */
377 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
378 p_vpar->sequence.intra_quant.pi_matrix );
379 LinkMatrix( &p_vpar->sequence.chroma_nonintra_quant,
380 p_vpar->sequence.nonintra_quant.pi_matrix );
385 NextStartCode( p_vpar );
386 if( ShowBits( &p_vpar->bit_stream, 32 ) == EXTENSION_START_CODE )
390 /* Turn the MPEG2 flag on */
391 p_vpar->sequence.b_mpeg2 = 1;
393 /* Parse sequence_extension */
394 RemoveBits32( &p_vpar->bit_stream );
395 /* extension_start_code_identifier, profile_and_level_indication */
396 RemoveBits( &p_vpar->bit_stream, 12 );
397 p_vpar->sequence.b_progressive = GetBits( &p_vpar->bit_stream, 1 );
398 p_vpar->sequence.i_chroma_format = GetBits( &p_vpar->bit_stream, 2 );
399 p_vpar->sequence.i_width |= GetBits( &p_vpar->bit_stream, 2 ) << 12;
400 p_vpar->sequence.i_height |= GetBits( &p_vpar->bit_stream, 2 ) << 12;
401 /* bit_rate_extension, marker_bit, vbv_buffer_size_extension, low_delay */
402 RemoveBits( &p_vpar->bit_stream, 22 );
403 /* frame_rate_extension_n */
404 i_dummy = GetBits( &p_vpar->bit_stream, 2 );
405 /* frame_rate_extension_d */
406 p_vpar->sequence.r_frame_rate *= (i_dummy + 1)
407 / (GetBits( &p_vpar->bit_stream, 5 ) + 1);
411 /* It's an MPEG-1 stream. Put adequate parameters. */
413 p_vpar->sequence.b_mpeg2 = 0;
414 p_vpar->sequence.b_progressive = 1;
415 p_vpar->sequence.i_chroma_format = CHROMA_420;
419 p_vpar->sequence.i_mb_width = (p_vpar->sequence.i_width + 15) / 16;
420 p_vpar->sequence.i_mb_height = (p_vpar->sequence.b_progressive) ?
421 (p_vpar->sequence.i_height + 15) / 16 :
422 2 * ((p_vpar->sequence.i_height + 31) / 32);
423 p_vpar->sequence.i_mb_size = p_vpar->sequence.i_mb_width
424 * p_vpar->sequence.i_mb_height;
425 p_vpar->sequence.i_width = (p_vpar->sequence.i_mb_width * 16);
426 p_vpar->sequence.i_height = (p_vpar->sequence.i_mb_height * 16);
427 p_vpar->sequence.i_size = p_vpar->sequence.i_width
428 * p_vpar->sequence.i_height;
430 /* Update chromatic information. */
431 switch( p_vpar->sequence.i_chroma_format )
434 p_vpar->sequence.i_chroma_nb_blocks = 2;
435 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width >> 1;
436 p_vpar->sequence.i_chroma_mb_width = 8;
437 p_vpar->sequence.i_chroma_mb_height = 8;
441 p_vpar->sequence.i_chroma_nb_blocks = 4;
442 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width >> 1;
443 p_vpar->sequence.i_chroma_mb_width = 8;
444 p_vpar->sequence.i_chroma_mb_height = 16;
448 p_vpar->sequence.i_chroma_nb_blocks = 8;
449 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width;
450 p_vpar->sequence.i_chroma_mb_width = 16;
451 p_vpar->sequence.i_chroma_mb_height = 16;
454 /* Reset scalable_mode. */
455 p_vpar->sequence.i_scalable_mode = SC_NONE;
458 if( p_vpar->sequence.i_width != i_width_save
459 || p_vpar->sequence.i_height != i_height_save )
461 /* What do we do in case of a size change ??? */
465 /* Extension and User data */
466 ExtensionAndUserData( p_vpar );
469 /*****************************************************************************
470 * GroupHeader : Parse the next group of pictures header
471 *****************************************************************************/
472 static void GroupHeader( vpar_thread_t * p_vpar )
474 /* Nothing to do, we don't care. */
475 RemoveBits( &p_vpar->bit_stream, 27 );
476 ExtensionAndUserData( p_vpar );
479 /*****************************************************************************
480 * PictureHeader : Parse the next picture header
481 *****************************************************************************/
482 static void PictureHeader( vpar_thread_t * p_vpar )
484 /* Table of optimized PictureData functions. */
485 static f_picture_data_t ppf_picture_data[4][4] =
488 NULL, NULL, NULL, NULL
492 #if (VPAR_OPTIM_LEVEL > 1)
493 NULL, vpar_PictureData2I420TZ, vpar_PictureData2P420TZ,
494 vpar_PictureData2B420TZ
496 NULL, vpar_PictureDataGENERIC, vpar_PictureDataGENERIC,
497 vpar_PictureDataGENERIC
502 #if (VPAR_OPTIM_LEVEL > 1)
503 NULL, vpar_PictureData2I420BZ, vpar_PictureData2P420BZ,
504 vpar_PictureData2B420BZ
506 NULL, vpar_PictureDataGENERIC, vpar_PictureDataGENERIC,
507 vpar_PictureDataGENERIC
512 #if (VPAR_OPTIM_LEVEL > 0)
513 NULL, vpar_PictureData2I420F0, vpar_PictureData2P420F0,
514 vpar_PictureData2B420F0
516 NULL, vpar_PictureDataGENERIC, vpar_PictureDataGENERIC,
517 vpar_PictureDataGENERIC
524 boolean_t b_parsable;
529 RemoveBits( &p_vpar->bit_stream, 10 ); /* temporal_reference */
530 p_vpar->picture.i_coding_type = GetBits( &p_vpar->bit_stream, 3 );
531 RemoveBits( &p_vpar->bit_stream, 16 ); /* vbv_delay */
533 if( p_vpar->picture.i_coding_type == P_CODING_TYPE
534 || p_vpar->picture.i_coding_type == B_CODING_TYPE )
536 p_vpar->picture.pb_full_pel_vector[0] = GetBits( &p_vpar->bit_stream, 1 );
537 p_vpar->picture.i_forward_f_code = GetBits( &p_vpar->bit_stream, 3 );
539 if( p_vpar->picture.i_coding_type == B_CODING_TYPE )
541 p_vpar->picture.pb_full_pel_vector[1] = GetBits( &p_vpar->bit_stream, 1 );
542 p_vpar->picture.i_backward_f_code = GetBits( &p_vpar->bit_stream, 3 );
545 /* extra_information_picture */
546 while( GetBits( &p_vpar->bit_stream, 1 ) )
548 RemoveBits( &p_vpar->bit_stream, 8 );
552 * Picture Coding Extension
554 NextStartCode( p_vpar );
555 if( ShowBits( &p_vpar->bit_stream, 32 ) == EXTENSION_START_CODE )
557 /* Parse picture_coding_extension */
558 RemoveBits32( &p_vpar->bit_stream );
559 /* extension_start_code_identifier */
560 RemoveBits( &p_vpar->bit_stream, 4 );
562 p_vpar->picture.ppi_f_code[0][0] = GetBits( &p_vpar->bit_stream, 4 );
563 p_vpar->picture.ppi_f_code[0][1] = GetBits( &p_vpar->bit_stream, 4 );
564 p_vpar->picture.ppi_f_code[1][0] = GetBits( &p_vpar->bit_stream, 4 );
565 p_vpar->picture.ppi_f_code[1][1] = GetBits( &p_vpar->bit_stream, 4 );
566 p_vpar->picture.i_intra_dc_precision = GetBits( &p_vpar->bit_stream, 2 );
567 i_structure = GetBits( &p_vpar->bit_stream, 2 );
568 p_vpar->picture.b_top_field_first = GetBits( &p_vpar->bit_stream, 1 );
569 p_vpar->picture.b_frame_pred_frame_dct
570 = GetBits( &p_vpar->bit_stream, 1 );
571 p_vpar->picture.b_concealment_mv = GetBits( &p_vpar->bit_stream, 1 );
572 p_vpar->picture.b_q_scale_type = GetBits( &p_vpar->bit_stream, 1 );
573 p_vpar->picture.b_intra_vlc_format = GetBits( &p_vpar->bit_stream, 1 );
574 p_vpar->picture.b_alternate_scan = GetBits( &p_vpar->bit_stream, 1 );
575 p_vpar->picture.b_repeat_first_field = GetBits( &p_vpar->bit_stream, 1 );
576 /* repeat_first_field (ISO/IEC 13818-2 6.3.10 is necessary to know
577 * the length of the picture_display_extension structure.
578 * chroma_420_type (obsolete) */
579 RemoveBits( &p_vpar->bit_stream, 1 );
580 p_vpar->picture.b_progressive_frame = GetBits( &p_vpar->bit_stream, 1 );
582 /* composite_display_flag */
583 if( GetBits( &p_vpar->bit_stream, 1 ) )
585 /* v_axis, field_sequence, sub_carrier, burst_amplitude,
586 * sub_carrier_phase */
587 RemoveBits( &p_vpar->bit_stream, 20 );
592 /* MPEG-1 compatibility flags */
593 p_vpar->picture.i_intra_dc_precision = 0; /* 8 bits */
594 i_structure = FRAME_STRUCTURE;
595 p_vpar->picture.b_frame_pred_frame_dct = 1;
596 p_vpar->picture.b_concealment_mv = 0;
597 p_vpar->picture.b_q_scale_type = 0;
598 p_vpar->picture.b_intra_vlc_format = 0;
599 p_vpar->picture.b_alternate_scan = 0; /* zigzag */
600 p_vpar->picture.b_repeat_first_field = 0;
601 p_vpar->picture.b_progressive_frame = 1;
604 if( p_vpar->picture.i_current_structure &&
605 (i_structure == FRAME_STRUCTURE ||
606 i_structure == p_vpar->picture.i_current_structure) )
608 /* We don't have the second field of the buffered frame. */
609 if( p_vpar->picture.p_picture != NULL )
611 ReferenceReplace( p_vpar,
612 p_vpar->picture.i_coding_type,
616 for( i_mb = 0; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
618 vpar_DestroyMacroblock( &p_vpar->vfifo,
619 p_vpar->picture.pp_mb[i_mb] );
622 vout_DestroyPicture( p_vpar->p_vout, p_vpar->picture.p_picture );
625 p_vpar->picture.i_current_structure = 0;
627 intf_DbgMsg("vpar debug: odd number of field picture.\n");
630 /* Do we have the reference pictures ? */
631 b_parsable = !(((p_vpar->picture.i_coding_type == P_CODING_TYPE) &&
632 (p_vpar->sequence.p_backward == NULL)) ||
633 /* p_backward will become p_forward later */
634 ((p_vpar->picture.i_coding_type == B_CODING_TYPE) &&
635 (p_vpar->sequence.p_forward == NULL ||
636 p_vpar->sequence.p_backward == NULL)));
640 if( p_vpar->picture.i_current_structure )
642 /* Second field of a frame. We will decode it if, and only if we
643 * have decoded the first field. */
644 b_parsable = (p_vpar->picture.p_picture != NULL);
648 /* Does synchro say we have enough time to decode it ? */
649 b_parsable = vpar_SynchroChoose( p_vpar,
650 p_vpar->picture.i_coding_type, i_structure );
654 else if( !p_vpar->picture.i_current_structure )
656 vpar_SynchroTrash( p_vpar, p_vpar->picture.i_coding_type, i_structure );
662 /* Update the reference pointers. */
663 ReferenceUpdate( p_vpar, p_vpar->picture.i_coding_type, NULL );
664 #ifndef POLUX_SYNCHRO
665 /* Warn Synchro we have trashed a picture. */
666 vpar_SynchroTrash( p_vpar, p_vpar->picture.i_coding_type, i_structure );
668 /* Update context. */
669 if( i_structure != FRAME_STRUCTURE )
670 p_vpar->picture.i_current_structure = i_structure;
671 p_vpar->picture.p_picture = NULL;
676 /* OK, now we are sure we will decode the picture. */
677 #define P_picture p_vpar->picture.p_picture
678 p_vpar->picture.b_error = 0;
679 p_vpar->picture.b_frame_structure = (i_structure == FRAME_STRUCTURE);
681 if( !p_vpar->picture.i_current_structure )
683 /* This is a new frame. Get a structure from the video_output. */
684 while( ( P_picture = vout_CreatePicture( p_vpar->p_vout,
685 99+p_vpar->sequence.i_chroma_format, /*???*/
686 p_vpar->sequence.i_width,
687 p_vpar->sequence.i_height ) )
690 intf_DbgMsg("vpar debug: allocation error in vout_CreatePicture, delaying\n");
691 if( p_vpar->b_die || p_vpar->b_error )
695 msleep( VPAR_OUTMEM_SLEEP );
698 /* Initialize values. */
699 vpar_SynchroDecode( p_vpar, p_vpar->picture.i_coding_type, i_structure );
700 P_picture->i_aspect_ratio = p_vpar->sequence.i_aspect_ratio;
701 P_picture->i_matrix_coefficients = p_vpar->sequence.i_matrix_coefficients;
702 p_vpar->picture.i_l_stride = ( p_vpar->sequence.i_width
703 << ( 1 - p_vpar->picture.b_frame_structure ) );
704 p_vpar->picture.i_c_stride = ( p_vpar->sequence.i_chroma_width
705 << ( 1 - p_vpar->picture.b_frame_structure ));
707 P_picture->i_deccount = p_vpar->sequence.i_mb_size;
708 vlc_mutex_init( &p_vpar->picture.p_picture->lock_deccount );
710 memset( p_vpar->picture.pp_mb, 0, MAX_MB*sizeof(macroblock_t *) );
712 /* FIXME ! remove asap */
713 //memset( P_picture->p_data, 0, (p_vpar->sequence.i_mb_size*384));
715 /* Update the reference pointers. */
716 ReferenceUpdate( p_vpar, p_vpar->picture.i_coding_type, P_picture );
719 /* Link referenced pictures for the decoder
720 * They are unlinked in vpar_ReleaseMacroblock() & vpar_DestroyMacroblock() */
721 if( p_vpar->picture.i_coding_type == P_CODING_TYPE ||
722 p_vpar->picture.i_coding_type == B_CODING_TYPE )
724 vout_LinkPicture( p_vpar->p_vout, p_vpar->sequence.p_forward );
726 if( p_vpar->picture.i_coding_type == B_CODING_TYPE )
728 vout_LinkPicture( p_vpar->p_vout, p_vpar->sequence.p_backward );
732 p_vpar->picture.i_current_structure |= i_structure;
733 p_vpar->picture.i_structure = i_structure;
735 /* Initialize picture data for decoding. */
736 if( i_structure == BOTTOM_FIELD )
738 i_mb_base = p_vpar->sequence.i_mb_size >> 1;
739 p_vpar->mb.i_l_y = 1;
740 p_vpar->mb.i_c_y = 1;
745 p_vpar->mb.i_l_y = p_vpar->mb.i_c_y = 0;
747 p_vpar->mb.i_l_x = p_vpar->mb.i_c_x = 0;
749 /* Extension and User data. */
750 ExtensionAndUserData( p_vpar );
752 /* Picture data (ISO/IEC 13818-2 6.2.3.7). */
753 if( p_vpar->sequence.i_chroma_format != CHROMA_420
754 || !p_vpar->sequence.b_mpeg2 || p_vpar->sequence.i_height > 2800
755 || p_vpar->sequence.i_scalable_mode == SC_DP )
757 /* Weird stream. Use the slower generic function. */
758 vpar_PictureDataGENERIC( p_vpar, i_mb_base );
762 /* Try to find an optimized function. */
763 ppf_picture_data[p_vpar->picture.i_structure]
764 [p_vpar->picture.i_coding_type]( p_vpar, i_mb_base );
767 if( p_vpar->b_die || p_vpar->b_error )
772 if( p_vpar->picture.b_error )
775 //fprintf(stderr, "Image trashee\n");
777 for( i_mb = 1; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
779 vpar_DestroyMacroblock( &p_vpar->vfifo, p_vpar->picture.pp_mb[i_mb] );
783 if( P_picture->i_deccount != 1 )
785 vout_DestroyPicture( p_vpar->p_vout, P_picture );
788 ReferenceReplace( p_vpar, p_vpar->picture.i_coding_type, NULL );
790 /* Prepare context for the next picture. */
792 if( p_vpar->picture.i_current_structure == FRAME_STRUCTURE )
793 p_vpar->picture.i_current_structure = 0;
795 else if( p_vpar->picture.i_current_structure == FRAME_STRUCTURE )
797 //fprintf(stderr, "Image parsee (%d)\n", p_vpar->picture.i_coding_type);
798 /* Frame completely parsed. */
800 for( i_mb = 1; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
802 vpar_DecodeMacroblock( &p_vpar->vfifo, p_vpar->picture.pp_mb[i_mb] );
805 /* Send signal to the video_decoder. */
806 vlc_mutex_lock( &p_vpar->vfifo.lock );
807 vlc_cond_signal( &p_vpar->vfifo.wait );
808 vlc_mutex_unlock( &p_vpar->vfifo.lock );
811 /* Prepare context for the next picture. */
813 p_vpar->picture.i_current_structure = 0;
818 /*****************************************************************************
819 * ExtensionAndUserData : Parse the extension_and_user_data structure
820 *****************************************************************************/
821 static void ExtensionAndUserData( vpar_thread_t * p_vpar )
823 while( !p_vpar->b_die )
825 NextStartCode( p_vpar );
826 switch( ShowBits( &p_vpar->bit_stream, 32 ) )
828 case EXTENSION_START_CODE:
829 RemoveBits32( &p_vpar->bit_stream );
830 switch( GetBits( &p_vpar->bit_stream, 4 ) )
832 case SEQUENCE_DISPLAY_EXTENSION_ID:
833 SequenceDisplayExtension( p_vpar );
835 case QUANT_MATRIX_EXTENSION_ID:
836 QuantMatrixExtension( p_vpar );
838 case SEQUENCE_SCALABLE_EXTENSION_ID:
839 SequenceScalableExtension( p_vpar );
841 case PICTURE_DISPLAY_EXTENSION_ID:
842 PictureDisplayExtension( p_vpar );
844 case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID:
845 PictureSpatialScalableExtension( p_vpar );
847 case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID:
848 PictureTemporalScalableExtension( p_vpar );
850 case COPYRIGHT_EXTENSION_ID:
851 CopyrightExtension( p_vpar );
857 case USER_DATA_START_CODE:
858 RemoveBits32( &p_vpar->bit_stream );
859 /* Wait for the next start code */
869 /*****************************************************************************
870 * SequenceDisplayExtension : Parse the sequence_display_extension structure *
871 *****************************************************************************/
873 static void SequenceDisplayExtension( vpar_thread_t * p_vpar )
875 /* We don't care sequence_display_extension. */
877 RemoveBits( &p_vpar->bit_stream, 3 );
878 if( GetBits( &p_vpar->bit_stream, 1 ) )
880 /* Two bytes for color_desciption */
881 RemoveBits( &p_vpar->bit_stream, 16 );
882 p_vpar->sequence.i_matrix_coefficients = GetBits( &p_vpar->bit_stream, 8 );
884 /* display_horizontal and vertical_size and a marker_bit */
885 RemoveBits( &p_vpar->bit_stream, 29 );
889 /*****************************************************************************
890 * QuantMatrixExtension : Load quantization matrices for luminance *
892 *****************************************************************************/
894 static void QuantMatrixExtension( vpar_thread_t * p_vpar )
896 if( GetBits( &p_vpar->bit_stream, 1 ) )
898 /* Load intra_quantiser_matrix for luminance. */
899 LoadMatrix( p_vpar, &p_vpar->sequence.intra_quant );
903 /* Use the default matrix. */
904 LinkMatrix( &p_vpar->sequence.intra_quant,
905 pi_default_intra_quant );
907 if( GetBits( &p_vpar->bit_stream, 1 ) )
909 /* Load non_intra_quantiser_matrix for luminance. */
910 LoadMatrix( p_vpar, &p_vpar->sequence.nonintra_quant );
914 /* Use the default matrix. */
915 LinkMatrix( &p_vpar->sequence.nonintra_quant,
916 pi_default_nonintra_quant );
918 if( GetBits( &p_vpar->bit_stream, 1 ) )
920 /* Load intra_quantiser_matrix for chrominance. */
921 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_intra_quant );
925 /* Link the chrominance intra matrix to the luminance one. */
926 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
927 p_vpar->sequence.intra_quant.pi_matrix );
929 if( GetBits( &p_vpar->bit_stream, 1 ) )
931 /* Load non_intra_quantiser_matrix for chrominance. */
932 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_nonintra_quant );
936 /* Link the chrominance intra matrix to the luminance one. */
937 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
938 p_vpar->sequence.intra_quant.pi_matrix );
940 if( GetBits( &p_vpar->bit_stream, 1 ) )
942 /* Load non_intra_quantiser_matrix for chrominance. */
943 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_nonintra_quant );
947 /* Link the chrominance nonintra matrix to the luminance one. */
948 LinkMatrix( &p_vpar->sequence.chroma_nonintra_quant,
949 p_vpar->sequence.nonintra_quant.pi_matrix );
954 /*****************************************************************************
955 * SequenceScalableExtension : Parse the sequence_scalable_extension *
956 * structure to handle scalable coding *
957 *****************************************************************************/
959 static void SequenceScalableExtension( vpar_thread_t * p_vpar )
961 /* We don't care about anything scalable except the scalable mode. */
962 switch( p_vpar->sequence.i_scalable_mode = GetBits( &p_vpar->bit_stream, 2 ) )
963 /* The length of the structure depends on the value of the scalable_mode */
966 RemoveBits32( &p_vpar->bit_stream );
967 RemoveBits( &p_vpar->bit_stream, 21 );
970 RemoveBits( &p_vpar->bit_stream, 12 );
973 RemoveBits( &p_vpar->bit_stream, 4 );
977 /*****************************************************************************
978 * PictureDisplayExtension : Parse the picture_display_extension structure *
979 *****************************************************************************/
981 static void PictureDisplayExtension( vpar_thread_t * p_vpar )
983 /* Number of frame center offset */
985 /* I am not sure it works but it should
986 (fewer tests than shown in ยง6.3.12) */
987 i_nb = p_vpar->sequence.b_progressive ? p_vpar->sequence.b_progressive +
988 p_vpar->picture.b_repeat_first_field +
989 p_vpar->picture.b_top_field_first
990 : ( p_vpar->picture.b_frame_structure + 1 ) +
991 p_vpar->picture.b_repeat_first_field;
992 for( i_dummy = 0; i_dummy < i_nb; i_dummy++ )
994 RemoveBits( &p_vpar->bit_stream, 17 );
995 RemoveBits( &p_vpar->bit_stream, 17 );
1000 /*****************************************************************************
1001 * PictureSpatialScalableExtension *
1002 *****************************************************************************/
1004 static void PictureSpatialScalableExtension( vpar_thread_t * p_vpar )
1006 /* That's scalable, so we trash it */
1007 RemoveBits32( &p_vpar->bit_stream );
1008 RemoveBits( &p_vpar->bit_stream, 16 );
1012 /*****************************************************************************
1013 * PictureTemporalScalableExtension *
1014 *****************************************************************************/
1016 static void PictureTemporalScalableExtension( vpar_thread_t * p_vpar )
1018 /* Scalable again, trashed again */
1019 RemoveBits( &p_vpar->bit_stream, 23 );
1023 /*****************************************************************************
1024 * CopyrightExtension : Keeps some legal informations *
1025 *****************************************************************************/
1027 static void CopyrightExtension( vpar_thread_t * p_vpar )
1029 u32 i_copyright_nb_1, i_copyright_nb_2; /* local integers */
1030 p_vpar->sequence.b_copyright_flag = GetBits( &p_vpar->bit_stream, 1 );
1031 /* A flag that says whether the copyright information is significant */
1032 p_vpar->sequence.i_copyright_id = GetBits( &p_vpar->bit_stream, 8 );
1033 /* An identifier compliant with ISO/CEI JTC 1/SC 29 */
1034 p_vpar->sequence.b_original = GetBits( &p_vpar->bit_stream, 1 );
1036 RemoveBits( &p_vpar->bit_stream, 8 );
1037 /* The copyright_number is split in three parts */
1039 i_copyright_nb_1 = GetBits( &p_vpar->bit_stream, 20 );
1040 RemoveBits( &p_vpar->bit_stream, 1 );
1042 i_copyright_nb_2 = GetBits( &p_vpar->bit_stream, 22 );
1043 RemoveBits( &p_vpar->bit_stream, 1 );
1044 /* third part and sum */
1045 p_vpar->sequence.i_copyright_nb = ( (u64)i_copyright_nb_1 << 44 ) |
1046 ( (u64)i_copyright_nb_2 << 22 ) |
1047 ( (u64)GetBits( &p_vpar->bit_stream, 22 ) );