1 /*****************************************************************************
2 * vpar_headers.c : headers parsing
3 *****************************************************************************
4 * Copyright (C) 1999, 2000 VideoLAN
5 * $Id: vpar_headers.c,v 1.82 2001/04/28 03:36:26 sam Exp $
7 * Authors: Christophe Massiot <massiot@via.ecp.fr>
8 * Stéphane Borel <stef@via.ecp.fr>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
23 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
30 #include <stdlib.h> /* free() */
31 #include <string.h> /* memcpy(), memset() */
40 #include "stream_control.h"
41 #include "input_ext-dec.h"
44 #include "video_output.h"
46 #include "video_decoder.h"
47 #include "vdec_motion.h"
48 #include "../video_decoder/vdec_idct.h"
50 #include "vpar_blocks.h"
51 #include "../video_decoder/vpar_headers.h"
52 #include "../video_decoder/vpar_synchro.h"
53 #include "../video_decoder/video_parser.h"
54 #include "../video_decoder/video_fifo.h"
59 static __inline__ void NextStartCode( bit_stream_t * );
60 static void SequenceHeader( vpar_thread_t * p_vpar );
61 static void GroupHeader( vpar_thread_t * p_vpar );
62 static void PictureHeader( vpar_thread_t * p_vpar );
63 static void ExtensionAndUserData( vpar_thread_t * p_vpar );
64 static void QuantMatrixExtension( vpar_thread_t * p_vpar );
65 static void SequenceScalableExtension( vpar_thread_t * p_vpar );
66 static void SequenceDisplayExtension( vpar_thread_t * p_vpar );
67 static void PictureDisplayExtension( vpar_thread_t * p_vpar );
68 static void PictureSpatialScalableExtension( vpar_thread_t * p_vpar );
69 static void PictureTemporalScalableExtension( vpar_thread_t * p_vpar );
70 static void CopyrightExtension( vpar_thread_t * p_vpar );
76 /*****************************************************************************
77 * pi_default_intra_quant : default quantization matrix
78 *****************************************************************************/
79 u8 pi_default_intra_quant[] =
81 8, 16, 19, 22, 26, 27, 29, 34,
82 16, 16, 22, 24, 27, 29, 34, 37,
83 19, 22, 26, 27, 29, 34, 34, 38,
84 22, 22, 26, 27, 29, 34, 37, 40,
85 22, 26, 27, 29, 32, 35, 40, 48,
86 26, 27, 29, 32, 35, 40, 48, 58,
87 26, 27, 29, 34, 38, 46, 56, 69,
88 27, 29, 35, 38, 46, 56, 69, 83
91 /*****************************************************************************
92 * pi_default_nonintra_quant : default quantization matrix
93 *****************************************************************************/
94 u8 pi_default_nonintra_quant[] =
96 16, 16, 16, 16, 16, 16, 16, 16,
97 16, 16, 16, 16, 16, 16, 16, 16,
98 16, 16, 16, 16, 16, 16, 16, 16,
99 16, 16, 16, 16, 16, 16, 16, 16,
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
106 /*****************************************************************************
107 * pi_scan : zig-zag and alternate scan patterns
108 *****************************************************************************/
111 { /* Zig-Zag pattern */
112 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
113 12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
114 35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
115 58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
117 { /* Alternate scan pattern */
118 0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
119 41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
120 51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
121 53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
126 * Local inline functions.
129 /*****************************************************************************
130 * ReferenceUpdate : Update the reference pointers when we have a new picture
131 *****************************************************************************/
132 static void __inline__ ReferenceUpdate( vpar_thread_t * p_vpar,
134 picture_t * p_newref )
136 if( i_coding_type != B_CODING_TYPE )
138 if( p_vpar->sequence.p_forward != NULL )
140 vout_UnlinkPicture( p_vpar->p_vout, p_vpar->sequence.p_forward );
142 if( p_vpar->sequence.p_backward != NULL )
144 vout_DatePicture( p_vpar->p_vout, p_vpar->sequence.p_backward,
145 vpar_SynchroDate( p_vpar ) );
147 p_vpar->sequence.p_forward = p_vpar->sequence.p_backward;
148 p_vpar->sequence.p_backward = p_newref;
149 if( p_newref != NULL )
151 vout_LinkPicture( p_vpar->p_vout, p_newref );
154 else if( p_newref != NULL )
156 /* Put date immediately. */
157 vout_DatePicture( p_vpar->p_vout, p_newref, vpar_SynchroDate(p_vpar) );
161 /*****************************************************************************
162 * ReferenceReplace : Replace the last reference pointer when we destroy
164 *****************************************************************************/
165 static void __inline__ ReferenceReplace( vpar_thread_t * p_vpar,
167 picture_t * p_newref )
169 if( i_coding_type != B_CODING_TYPE )
171 if( p_vpar->sequence.p_backward != NULL )
173 vout_UnlinkPicture( p_vpar->p_vout, p_vpar->sequence.p_backward );
175 p_vpar->sequence.p_backward = p_newref;
176 if( p_newref != NULL )
178 vout_LinkPicture( p_vpar->p_vout, p_newref );
183 /*****************************************************************************
184 * LoadMatrix : Load a quantization matrix
185 *****************************************************************************/
186 static __inline__ void LoadMatrix( vpar_thread_t * p_vpar,
187 quant_matrix_t * p_matrix )
191 if( !p_matrix->b_allocated )
193 /* Allocate a piece of memory to load the matrix. */
194 if( (p_matrix->pi_matrix = (u8 *)malloc( 64*sizeof(u8) )) == NULL )
196 intf_ErrMsg( "vpar error: allocation error in LoadMatrix()" );
197 p_vpar->p_fifo->b_error = 1;
200 p_matrix->b_allocated = 1;
203 for( i_dummy = 0; i_dummy < 64; i_dummy++ )
205 p_matrix->pi_matrix[p_vpar->ppi_scan[SCAN_ZIGZAG][i_dummy]]
206 = GetBits( &p_vpar->bit_stream, 8 );
210 /* Discrete Fourier Transform requires the quantization matrices to
211 * be normalized before using them. */
212 vdec_NormQuantMatrix( p_matrix->pi_matrix );
216 /*****************************************************************************
217 * LinkMatrix : Link a quantization matrix to another
218 *****************************************************************************/
219 static __inline__ void LinkMatrix( quant_matrix_t * p_matrix, u8 * pi_array )
221 if( p_matrix->b_allocated )
223 /* Deallocate the piece of memory. */
224 free( p_matrix->pi_matrix );
225 p_matrix->b_allocated = 0;
228 p_matrix->pi_matrix = pi_array;
232 * Exported functions.
235 /*****************************************************************************
236 * vpar_NextSequenceHeader : Find the next sequence header
237 *****************************************************************************/
238 int vpar_NextSequenceHeader( vpar_thread_t * p_vpar )
240 while( !p_vpar->p_fifo->b_die )
242 NextStartCode( &p_vpar->bit_stream );
243 if( ShowBits( &p_vpar->bit_stream, 32 ) == SEQUENCE_HEADER_CODE )
247 RemoveBits( &p_vpar->bit_stream, 8 );
252 /*****************************************************************************
253 * vpar_ParseHeader : Parse the next header
254 *****************************************************************************/
255 int vpar_ParseHeader( vpar_thread_t * p_vpar )
257 while( !p_vpar->p_fifo->b_die )
259 NextStartCode( &p_vpar->bit_stream );
260 switch( GetBits32( &p_vpar->bit_stream ) )
262 case SEQUENCE_HEADER_CODE:
264 p_vpar->c_sequences++;
266 SequenceHeader( p_vpar );
270 case GROUP_START_CODE:
271 GroupHeader( p_vpar );
275 case PICTURE_START_CODE:
276 PictureHeader( p_vpar );
280 case SEQUENCE_END_CODE:
281 intf_DbgMsg("vpar debug: sequence end code received");
294 * Following functions are local
297 /*****************************************************************************
298 * SequenceHeader : Parse the next sequence header
299 *****************************************************************************/
300 static void SequenceHeader( vpar_thread_t * p_vpar )
303 static int i_frame_rate_table[16] =
314 RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED
318 int i_height_save, i_width_save;
320 i_height_save = p_vpar->sequence.i_height;
321 i_width_save = p_vpar->sequence.i_width;
323 p_vpar->sequence.i_width = GetBits( &p_vpar->bit_stream, 12 );
324 p_vpar->sequence.i_height = GetBits( &p_vpar->bit_stream, 12 );
325 p_vpar->sequence.i_aspect_ratio = GetBits( &p_vpar->bit_stream, 4 );
326 p_vpar->sequence.i_frame_rate =
327 i_frame_rate_table[ GetBits( &p_vpar->bit_stream, 4 ) ];
329 /* We don't need bit_rate_value, marker_bit, vbv_buffer_size,
330 * constrained_parameters_flag */
331 RemoveBits( &p_vpar->bit_stream, 30 );
334 * Quantization matrices
336 if( GetBits( &p_vpar->bit_stream, 1 ) ) /* load_intra_quantizer_matrix */
338 LoadMatrix( p_vpar, &p_vpar->sequence.intra_quant );
342 /* Use default matrix. */
343 LinkMatrix( &p_vpar->sequence.intra_quant,
344 p_vpar->pi_default_intra_quant );
347 if( GetBits(&p_vpar->bit_stream, 1) ) /* load_non_intra_quantizer_matrix */
349 LoadMatrix( p_vpar, &p_vpar->sequence.nonintra_quant );
353 /* Use default matrix. */
354 LinkMatrix( &p_vpar->sequence.nonintra_quant,
355 p_vpar->pi_default_nonintra_quant );
358 /* Unless later overwritten by a matrix extension, we have the same
359 * matrices for luminance and chrominance. */
360 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
361 p_vpar->sequence.intra_quant.pi_matrix );
362 LinkMatrix( &p_vpar->sequence.chroma_nonintra_quant,
363 p_vpar->sequence.nonintra_quant.pi_matrix );
368 NextStartCode( &p_vpar->bit_stream );
369 if( ShowBits( &p_vpar->bit_stream, 32 ) == EXTENSION_START_CODE )
373 /* Turn the MPEG2 flag on */
374 p_vpar->sequence.b_mpeg2 = 1;
376 /* Parse sequence_extension */
377 RemoveBits32( &p_vpar->bit_stream );
378 /* extension_start_code_identifier, profile_and_level_indication */
379 RemoveBits( &p_vpar->bit_stream, 12 );
380 p_vpar->sequence.b_progressive = GetBits( &p_vpar->bit_stream, 1 );
381 p_vpar->sequence.i_chroma_format = GetBits( &p_vpar->bit_stream, 2 );
382 p_vpar->sequence.i_width |= GetBits( &p_vpar->bit_stream, 2 ) << 12;
383 p_vpar->sequence.i_height |= GetBits( &p_vpar->bit_stream, 2 ) << 12;
384 /* bit_rate_extension, marker_bit, vbv_buffer_size_extension,
386 RemoveBits( &p_vpar->bit_stream, 22 );
387 /* frame_rate_extension_n */
388 i_dummy = GetBits( &p_vpar->bit_stream, 2 );
389 /* frame_rate_extension_d */
390 p_vpar->sequence.i_frame_rate *= (i_dummy + 1)
391 / (GetBits( &p_vpar->bit_stream, 5 ) + 1);
395 /* It's an MPEG-1 stream. Put adequate parameters. */
397 p_vpar->sequence.b_mpeg2 = 0;
398 p_vpar->sequence.b_progressive = 1;
399 p_vpar->sequence.i_chroma_format = CHROMA_420;
403 p_vpar->sequence.i_mb_width = (p_vpar->sequence.i_width + 15) / 16;
404 p_vpar->sequence.i_mb_height = (p_vpar->sequence.b_progressive) ?
405 (p_vpar->sequence.i_height + 15) / 16 :
406 2 * ((p_vpar->sequence.i_height + 31) / 32);
407 p_vpar->sequence.i_mb_size = p_vpar->sequence.i_mb_width
408 * p_vpar->sequence.i_mb_height;
409 p_vpar->sequence.i_width = (p_vpar->sequence.i_mb_width * 16);
410 p_vpar->sequence.i_height = (p_vpar->sequence.i_mb_height * 16);
411 p_vpar->sequence.i_size = p_vpar->sequence.i_width
412 * p_vpar->sequence.i_height;
414 /* Update chromatic information. */
415 switch( p_vpar->sequence.i_chroma_format )
418 p_vpar->sequence.i_chroma_nb_blocks = 2;
419 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width >> 1;
420 p_vpar->sequence.i_chroma_mb_width = 8;
421 p_vpar->sequence.i_chroma_mb_height = 8;
425 p_vpar->sequence.i_chroma_nb_blocks = 4;
426 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width >> 1;
427 p_vpar->sequence.i_chroma_mb_width = 8;
428 p_vpar->sequence.i_chroma_mb_height = 16;
432 p_vpar->sequence.i_chroma_nb_blocks = 8;
433 p_vpar->sequence.i_chroma_width = p_vpar->sequence.i_width;
434 p_vpar->sequence.i_chroma_mb_width = 16;
435 p_vpar->sequence.i_chroma_mb_height = 16;
438 /* Reset scalable_mode. */
439 p_vpar->sequence.i_scalable_mode = SC_NONE;
442 if( p_vpar->sequence.i_width != i_width_save
443 || p_vpar->sequence.i_height != i_height_save )
445 /* FIXME: What do we do in case of a size change ?? */
449 /* Extension and User data */
450 ExtensionAndUserData( p_vpar );
453 /*****************************************************************************
454 * GroupHeader : Parse the next group of pictures header
455 *****************************************************************************/
456 static void GroupHeader( vpar_thread_t * p_vpar )
458 /* Nothing to do, we don't care. */
459 RemoveBits( &p_vpar->bit_stream, 27 );
460 ExtensionAndUserData( p_vpar );
463 /*****************************************************************************
464 * PictureHeader : Parse the next picture header
465 *****************************************************************************/
466 static void PictureHeader( vpar_thread_t * p_vpar )
470 boolean_t b_parsable;
475 /* Recover in case of stream discontinuity. */
476 if( p_vpar->sequence.b_expect_discontinuity )
478 ReferenceUpdate( p_vpar, I_CODING_TYPE, NULL );
479 ReferenceUpdate( p_vpar, I_CODING_TYPE, NULL );
480 if( p_vpar->picture.p_picture != NULL )
485 for( i_mb = 0; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
487 vpar_DestroyMacroblock( &p_vpar->vfifo,
488 p_vpar->picture.pp_mb[i_mb] );
491 vout_DestroyPicture( p_vpar->p_vout, p_vpar->picture.p_picture );
493 p_vpar->sequence.b_expect_discontinuity = 0;
496 /* Parse the picture header. */
497 RemoveBits( &p_vpar->bit_stream, 10 ); /* temporal_reference */
498 p_vpar->picture.i_coding_type = GetBits( &p_vpar->bit_stream, 3 );
499 RemoveBits( &p_vpar->bit_stream, 16 ); /* vbv_delay */
501 if( p_vpar->picture.i_coding_type == P_CODING_TYPE
502 || p_vpar->picture.i_coding_type == B_CODING_TYPE )
504 p_vpar->picture.pb_full_pel_vector[0] = GetBits( &p_vpar->bit_stream, 1 );
505 p_vpar->picture.i_forward_f_code = GetBits( &p_vpar->bit_stream, 3 );
507 if( p_vpar->picture.i_coding_type == B_CODING_TYPE )
509 p_vpar->picture.pb_full_pel_vector[1] = GetBits( &p_vpar->bit_stream, 1 );
510 p_vpar->picture.i_backward_f_code = GetBits( &p_vpar->bit_stream, 3 );
513 /* extra_information_picture */
514 while( GetBits( &p_vpar->bit_stream, 1 ) )
516 RemoveBits( &p_vpar->bit_stream, 8 );
520 * Picture Coding Extension
522 NextStartCode( &p_vpar->bit_stream );
523 if( ShowBits( &p_vpar->bit_stream, 32 ) == EXTENSION_START_CODE )
525 /* Parse picture_coding_extension */
526 RemoveBits32( &p_vpar->bit_stream );
527 /* extension_start_code_identifier */
528 RemoveBits( &p_vpar->bit_stream, 4 );
530 p_vpar->picture.ppi_f_code[0][0] = GetBits( &p_vpar->bit_stream, 4 );
531 p_vpar->picture.ppi_f_code[0][1] = GetBits( &p_vpar->bit_stream, 4 );
532 p_vpar->picture.ppi_f_code[1][0] = GetBits( &p_vpar->bit_stream, 4 );
533 p_vpar->picture.ppi_f_code[1][1] = GetBits( &p_vpar->bit_stream, 4 );
534 p_vpar->picture.i_intra_dc_precision = GetBits( &p_vpar->bit_stream, 2 );
535 i_structure = GetBits( &p_vpar->bit_stream, 2 );
536 p_vpar->picture.b_top_field_first = GetBits( &p_vpar->bit_stream, 1 );
537 p_vpar->picture.b_frame_pred_frame_dct
538 = GetBits( &p_vpar->bit_stream, 1 );
539 p_vpar->picture.b_concealment_mv = GetBits( &p_vpar->bit_stream, 1 );
540 p_vpar->picture.b_q_scale_type = GetBits( &p_vpar->bit_stream, 1 );
541 p_vpar->picture.b_intra_vlc_format = GetBits( &p_vpar->bit_stream, 1 );
542 p_vpar->picture.b_alternate_scan = GetBits( &p_vpar->bit_stream, 1 );
543 p_vpar->picture.b_repeat_first_field = GetBits( &p_vpar->bit_stream, 1 );
544 /* chroma_420_type (obsolete) */
545 RemoveBits( &p_vpar->bit_stream, 1 );
546 p_vpar->picture.b_progressive = GetBits( &p_vpar->bit_stream, 1 );
548 /* composite_display_flag */
549 if( GetBits( &p_vpar->bit_stream, 1 ) )
551 /* v_axis, field_sequence, sub_carrier, burst_amplitude,
552 * sub_carrier_phase */
553 RemoveBits( &p_vpar->bit_stream, 20 );
558 /* MPEG-1 compatibility flags */
559 p_vpar->picture.i_intra_dc_precision = 0; /* 8 bits */
560 i_structure = FRAME_STRUCTURE;
561 p_vpar->picture.b_top_field_first = 0;
562 p_vpar->picture.b_frame_pred_frame_dct = 1;
563 p_vpar->picture.b_concealment_mv = 0;
564 p_vpar->picture.b_q_scale_type = 0;
565 p_vpar->picture.b_intra_vlc_format = 0;
566 p_vpar->picture.b_alternate_scan = 0; /* zigzag */
567 p_vpar->picture.b_repeat_first_field = 0;
568 p_vpar->picture.b_progressive = 1;
572 p_vpar->pc_pictures[p_vpar->picture.i_coding_type]++;
575 if( p_vpar->picture.i_current_structure &&
576 (i_structure == FRAME_STRUCTURE ||
577 i_structure == p_vpar->picture.i_current_structure) )
579 /* We don't have the second field of the buffered frame. */
580 if( p_vpar->picture.p_picture != NULL )
582 ReferenceReplace( p_vpar,
583 p_vpar->picture.i_coding_type,
587 for( i_mb = 0; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
589 vpar_DestroyMacroblock( &p_vpar->vfifo,
590 p_vpar->picture.pp_mb[i_mb] );
593 vout_DestroyPicture( p_vpar->p_vout, p_vpar->picture.p_picture );
596 p_vpar->picture.i_current_structure = 0;
598 intf_WarnMsg( 2, "Odd number of field pictures." );
601 /* Do we have the reference pictures ? */
602 b_parsable = !(((p_vpar->picture.i_coding_type == P_CODING_TYPE) &&
603 (p_vpar->sequence.p_backward == NULL)) ||
604 /* p_backward will become p_forward later */
605 ((p_vpar->picture.i_coding_type == B_CODING_TYPE) &&
606 (p_vpar->sequence.p_forward == NULL ||
607 p_vpar->sequence.p_backward == NULL)));
609 if( p_vpar->picture.i_current_structure )
611 /* Second field of a frame. We will decode it if, and only if we
612 * have decoded the first field. */
615 b_parsable = (p_vpar->picture.p_picture != NULL);
622 /* Compute the number of times the frame will be emitted by the
623 * decoder (number of half-periods). */
624 if( p_vpar->sequence.b_progressive )
626 i_repeat_field = (1 + p_vpar->picture.b_repeat_first_field
627 + p_vpar->picture.b_top_field_first) * 2;
631 if( p_vpar->picture.b_progressive )
633 i_repeat_field = 2 + p_vpar->picture.b_repeat_first_field;
641 /* Warn synchro we have a new picture (updates pictures index). */
642 vpar_SynchroNewPicture( p_vpar, p_vpar->picture.i_coding_type,
647 /* Does synchro say we have enough time to decode it ? */
648 b_parsable = vpar_SynchroChoose( p_vpar,
649 p_vpar->picture.i_coding_type, i_structure );
655 /* Update the reference pointers. */
656 ReferenceUpdate( p_vpar, p_vpar->picture.i_coding_type, NULL );
658 /* Update context. */
659 if( i_structure != FRAME_STRUCTURE )
661 if( (p_vpar->picture.i_current_structure | i_structure)
664 p_vpar->picture.i_current_structure = 0;
668 /* The frame is complete. */
669 p_vpar->picture.i_current_structure = i_structure;
671 vpar_SynchroTrash( p_vpar, p_vpar->picture.i_coding_type, i_structure );
676 /* Warn Synchro we have trashed a picture. */
677 vpar_SynchroTrash( p_vpar, p_vpar->picture.i_coding_type, i_structure );
679 p_vpar->picture.p_picture = NULL;
684 /* OK, now we are sure we will decode the picture. */
686 p_vpar->pc_decoded_pictures[p_vpar->picture.i_coding_type]++;
689 #define P_picture p_vpar->picture.p_picture
690 p_vpar->picture.b_error = 0;
691 p_vpar->picture.b_frame_structure = (i_structure == FRAME_STRUCTURE);
693 if( !p_vpar->picture.i_current_structure )
695 /* This is a new frame. Get a structure from the video_output. */
696 while( ( P_picture = vout_CreatePicture( p_vpar->p_vout,
697 /* XXX */ 99+p_vpar->sequence.i_chroma_format,
698 p_vpar->sequence.i_width,
699 p_vpar->sequence.i_height ) )
702 intf_DbgMsg("vpar debug: allocation error in vout_CreatePicture, delaying");
703 if( p_vpar->p_fifo->b_die || p_vpar->p_fifo->b_error )
707 msleep( VPAR_OUTMEM_SLEEP );
710 /* Initialize values. */
711 vpar_SynchroDecode( p_vpar, p_vpar->picture.i_coding_type, i_structure );
712 P_picture->i_aspect_ratio = p_vpar->sequence.i_aspect_ratio;
713 P_picture->i_matrix_coefficients = p_vpar->sequence.i_matrix_coefficients;
714 p_vpar->picture.i_l_stride = ( p_vpar->sequence.i_width
715 << ( 1 - p_vpar->picture.b_frame_structure ) );
716 p_vpar->picture.i_c_stride = ( p_vpar->sequence.i_chroma_width
717 << ( 1 - p_vpar->picture.b_frame_structure ));
719 P_picture->i_deccount = p_vpar->sequence.i_mb_size;
721 memset( p_vpar->picture.pp_mb, 0, MAX_MB*sizeof(macroblock_t *) );
723 /* FIXME ! remove asap ?? */
724 //memset( P_picture->p_data, 0, (p_vpar->sequence.i_mb_size*384));
726 /* Update the reference pointers. */
727 ReferenceUpdate( p_vpar, p_vpar->picture.i_coding_type, P_picture );
730 /* Link referenced pictures for the decoder
731 * They are unlinked in vpar_ReleaseMacroblock() &
732 * vpar_DestroyMacroblock() */
733 if( p_vpar->picture.i_coding_type == P_CODING_TYPE ||
734 p_vpar->picture.i_coding_type == B_CODING_TYPE )
736 vout_LinkPicture( p_vpar->p_vout, p_vpar->sequence.p_forward );
738 if( p_vpar->picture.i_coding_type == B_CODING_TYPE )
740 vout_LinkPicture( p_vpar->p_vout, p_vpar->sequence.p_backward );
744 p_vpar->picture.i_current_structure |= i_structure;
745 p_vpar->picture.i_structure = i_structure;
747 /* Initialize picture data for decoding. */
748 if( i_structure == BOTTOM_FIELD )
750 i_mb_base = p_vpar->sequence.i_mb_size >> 1;
751 p_vpar->mb.i_l_y = 1;
752 p_vpar->mb.i_c_y = 1;
757 p_vpar->mb.i_l_y = p_vpar->mb.i_c_y = 0;
759 p_vpar->mb.i_l_x = p_vpar->mb.i_c_x = 0;
761 /* Extension and User data. */
762 ExtensionAndUserData( p_vpar );
764 /* This is an MP@ML decoder, please note that neither of the following
765 * assertions can be true :
766 * p_vpar->sequence.i_chroma_format != CHROMA_420
767 * p_vpar->sequence.i_height > 2800
768 * p_vpar->sequence.i_scalable_mode == SC_DP
769 * Be cautious if you try to use the decoder for other profiles and
772 if( p_vpar->sequence.b_mpeg2 )
774 static f_picture_data_t ppf_picture_data[4][4] =
777 NULL, NULL, NULL, NULL
781 #if (VPAR_OPTIM_LEVEL > 1)
782 NULL, vpar_PictureData2IT, vpar_PictureData2PT,
785 NULL, vpar_PictureDataGENERIC, vpar_PictureDataGENERIC,
786 vpar_PictureDataGENERIC
791 #if (VPAR_OPTIM_LEVEL > 1)
792 NULL, vpar_PictureData2IB, vpar_PictureData2PB,
795 NULL, vpar_PictureDataGENERIC, vpar_PictureDataGENERIC,
796 vpar_PictureDataGENERIC
801 #if (VPAR_OPTIM_LEVEL > 0)
802 NULL, vpar_PictureData2IF, vpar_PictureData2PF,
805 NULL, vpar_PictureDataGENERIC, vpar_PictureDataGENERIC,
806 vpar_PictureDataGENERIC
811 ppf_picture_data[p_vpar->picture.i_structure]
812 [p_vpar->picture.i_coding_type]( p_vpar, i_mb_base );
816 #if (VPAR_OPTIM_LEVEL > 0)
817 static f_picture_data_t pf_picture_data[5] =
818 { NULL, vpar_PictureData1I, vpar_PictureData1P, vpar_PictureData1B,
819 vpar_PictureData1D };
821 pf_picture_data[p_vpar->picture.i_coding_type]( p_vpar, i_mb_base );
823 vpar_PictureDataGENERIC( p_vpar, i_mb_base );
827 if( p_vpar->p_fifo->b_die || p_vpar->p_fifo->b_error )
832 if( p_vpar->picture.b_error )
836 for( i_mb = 1; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
838 vpar_DestroyMacroblock( &p_vpar->vfifo, p_vpar->picture.pp_mb[i_mb] );
843 p_vpar->pc_malformed_pictures[p_vpar->picture.i_coding_type]++;
846 if( P_picture->i_deccount != 1 )
848 vpar_SynchroEnd( p_vpar, 1 );
849 vout_DestroyPicture( p_vpar->p_vout, P_picture );
852 ReferenceReplace( p_vpar, p_vpar->picture.i_coding_type, NULL );
854 /* Prepare context for the next picture. */
856 if( p_vpar->picture.i_current_structure == FRAME_STRUCTURE )
857 p_vpar->picture.i_current_structure = 0;
859 else if( p_vpar->picture.i_current_structure == FRAME_STRUCTURE )
861 /* Frame completely parsed. */
863 for( i_mb = 1; p_vpar->picture.pp_mb[i_mb] != NULL; i_mb++ )
865 vpar_DecodeMacroblock( &p_vpar->vfifo, p_vpar->picture.pp_mb[i_mb] );
868 /* Send signal to the video_decoder. */
869 vlc_mutex_lock( &p_vpar->vfifo.lock );
870 vlc_cond_signal( &p_vpar->vfifo.wait );
871 vlc_mutex_unlock( &p_vpar->vfifo.lock );
874 /* Prepare context for the next picture. */
876 p_vpar->picture.i_current_structure = 0;
881 /*****************************************************************************
882 * ExtensionAndUserData : Parse the extension_and_user_data structure
883 *****************************************************************************/
884 static void ExtensionAndUserData( vpar_thread_t * p_vpar )
886 while( !p_vpar->p_fifo->b_die )
888 NextStartCode( &p_vpar->bit_stream );
889 switch( ShowBits( &p_vpar->bit_stream, 32 ) )
891 case EXTENSION_START_CODE:
892 RemoveBits32( &p_vpar->bit_stream );
893 switch( GetBits( &p_vpar->bit_stream, 4 ) )
895 case SEQUENCE_DISPLAY_EXTENSION_ID:
896 SequenceDisplayExtension( p_vpar );
898 case QUANT_MATRIX_EXTENSION_ID:
899 QuantMatrixExtension( p_vpar );
901 case SEQUENCE_SCALABLE_EXTENSION_ID:
902 SequenceScalableExtension( p_vpar );
904 case PICTURE_DISPLAY_EXTENSION_ID:
905 PictureDisplayExtension( p_vpar );
907 case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID:
908 PictureSpatialScalableExtension( p_vpar );
910 case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID:
911 PictureTemporalScalableExtension( p_vpar );
913 case COPYRIGHT_EXTENSION_ID:
914 CopyrightExtension( p_vpar );
921 case USER_DATA_START_CODE:
922 RemoveBits32( &p_vpar->bit_stream );
923 /* Wait for the next start code */
933 /*****************************************************************************
934 * SequenceDisplayExtension : Parse the sequence_display_extension structure *
935 *****************************************************************************/
937 static void SequenceDisplayExtension( vpar_thread_t * p_vpar )
939 /* We don't care sequence_display_extension. */
941 RemoveBits( &p_vpar->bit_stream, 3 );
942 if( GetBits( &p_vpar->bit_stream, 1 ) )
944 /* Two bytes for color_desciption */
945 RemoveBits( &p_vpar->bit_stream, 16 );
946 p_vpar->sequence.i_matrix_coefficients = GetBits( &p_vpar->bit_stream, 8 );
948 /* display_horizontal and vertical_size and a marker_bit */
949 RemoveBits( &p_vpar->bit_stream, 29 );
953 /*****************************************************************************
954 * QuantMatrixExtension : Load quantization matrices for luminance *
956 *****************************************************************************/
958 static void QuantMatrixExtension( vpar_thread_t * p_vpar )
960 if( GetBits( &p_vpar->bit_stream, 1 ) )
962 /* Load intra_quantiser_matrix for luminance. */
963 LoadMatrix( p_vpar, &p_vpar->sequence.intra_quant );
967 /* Use the default matrix. */
968 LinkMatrix( &p_vpar->sequence.intra_quant,
969 p_vpar->pi_default_intra_quant );
971 if( GetBits( &p_vpar->bit_stream, 1 ) )
973 /* Load non_intra_quantiser_matrix for luminance. */
974 LoadMatrix( p_vpar, &p_vpar->sequence.nonintra_quant );
978 /* Use the default matrix. */
979 LinkMatrix( &p_vpar->sequence.nonintra_quant,
980 p_vpar->pi_default_nonintra_quant );
982 if( GetBits( &p_vpar->bit_stream, 1 ) )
984 /* Load intra_quantiser_matrix for chrominance. */
985 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_intra_quant );
989 /* Link the chrominance intra matrix to the luminance one. */
990 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
991 p_vpar->sequence.intra_quant.pi_matrix );
993 if( GetBits( &p_vpar->bit_stream, 1 ) )
995 /* Load non_intra_quantiser_matrix for chrominance. */
996 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_nonintra_quant );
1000 /* Link the chrominance intra matrix to the luminance one. */
1001 LinkMatrix( &p_vpar->sequence.chroma_intra_quant,
1002 p_vpar->sequence.intra_quant.pi_matrix );
1004 if( GetBits( &p_vpar->bit_stream, 1 ) )
1006 /* Load non_intra_quantiser_matrix for chrominance. */
1007 LoadMatrix( p_vpar, &p_vpar->sequence.chroma_nonintra_quant );
1011 /* Link the chrominance nonintra matrix to the luminance one. */
1012 LinkMatrix( &p_vpar->sequence.chroma_nonintra_quant,
1013 p_vpar->sequence.nonintra_quant.pi_matrix );
1018 /*****************************************************************************
1019 * SequenceScalableExtension : Parse the sequence_scalable_extension *
1020 * structure to handle scalable coding *
1021 *****************************************************************************/
1023 static void SequenceScalableExtension( vpar_thread_t * p_vpar )
1025 /* We don't care about anything scalable except the scalable mode. */
1026 switch( p_vpar->sequence.i_scalable_mode = GetBits( &p_vpar->bit_stream, 2 ) )
1027 /* The length of the structure depends on the value of the scalable_mode */
1030 RemoveBits32( &p_vpar->bit_stream );
1031 RemoveBits( &p_vpar->bit_stream, 21 );
1034 RemoveBits( &p_vpar->bit_stream, 12 );
1037 RemoveBits( &p_vpar->bit_stream, 4 );
1041 /*****************************************************************************
1042 * PictureDisplayExtension : Parse the picture_display_extension structure *
1043 *****************************************************************************/
1045 static void PictureDisplayExtension( vpar_thread_t * p_vpar )
1047 /* Number of frame center offset */
1049 /* I am not sure it works but it should
1050 (fewer tests than shown in §6.3.12) */
1051 i_nb = p_vpar->sequence.b_progressive ? p_vpar->sequence.b_progressive +
1052 p_vpar->picture.b_repeat_first_field +
1053 p_vpar->picture.b_top_field_first
1054 : ( p_vpar->picture.b_frame_structure + 1 ) +
1055 p_vpar->picture.b_repeat_first_field;
1056 for( i_dummy = 0; i_dummy < i_nb; i_dummy++ )
1058 RemoveBits( &p_vpar->bit_stream, 17 );
1059 RemoveBits( &p_vpar->bit_stream, 17 );
1064 /*****************************************************************************
1065 * PictureSpatialScalableExtension *
1066 *****************************************************************************/
1068 static void PictureSpatialScalableExtension( vpar_thread_t * p_vpar )
1070 /* That's scalable, so we trash it */
1071 RemoveBits32( &p_vpar->bit_stream );
1072 RemoveBits( &p_vpar->bit_stream, 16 );
1076 /*****************************************************************************
1077 * PictureTemporalScalableExtension *
1078 *****************************************************************************/
1080 static void PictureTemporalScalableExtension( vpar_thread_t * p_vpar )
1082 /* Scalable again, trashed again */
1083 RemoveBits( &p_vpar->bit_stream, 23 );
1087 /*****************************************************************************
1088 * CopyrightExtension : Keeps some legal informations *
1089 *****************************************************************************/
1091 static void CopyrightExtension( vpar_thread_t * p_vpar )
1093 u32 i_copyright_nb_1, i_copyright_nb_2; /* local integers */
1094 p_vpar->sequence.b_copyright_flag = GetBits( &p_vpar->bit_stream, 1 );
1095 /* A flag that says whether the copyright information is significant */
1096 p_vpar->sequence.i_copyright_id = GetBits( &p_vpar->bit_stream, 8 );
1097 /* An identifier compliant with ISO/CEI JTC 1/SC 29 */
1098 p_vpar->sequence.b_original = GetBits( &p_vpar->bit_stream, 1 );
1100 RemoveBits( &p_vpar->bit_stream, 8 );
1101 /* The copyright_number is split in three parts */
1103 i_copyright_nb_1 = GetBits( &p_vpar->bit_stream, 20 );
1104 RemoveBits( &p_vpar->bit_stream, 1 );
1106 i_copyright_nb_2 = GetBits( &p_vpar->bit_stream, 22 );
1107 RemoveBits( &p_vpar->bit_stream, 1 );
1108 /* third part and sum */
1109 p_vpar->sequence.i_copyright_nb = ( (u64)i_copyright_nb_1 << 44 ) |
1110 ( (u64)i_copyright_nb_2 << 22 ) |
1111 ( (u64)GetBits( &p_vpar->bit_stream, 22 ) );