1 /*****************************************************************************
2 * video_parser.h : video parser thread
4 *****************************************************************************
5 *****************************************************************************
17 *****************************************************************************/
19 /*****************************************************************************
21 *****************************************************************************
22 * This rotative FIFO contains undecoded macroblocks that are to be decoded
23 *****************************************************************************/
26 typedef struct video_fifo_s
29 vlc_mutex_t lock; /* fifo data lock */
30 vlc_cond_t wait; /* fifo data conditional variable */
32 /* buffer is an array of undec_picture_t pointers */
33 macroblock_t * buffer[VFIFO_SIZE + 1];
40 struct vpar_thread_s * p_vpar;
43 /*****************************************************************************
45 *****************************************************************************
46 * This structure enables the parser to maintain a list of free
47 * macroblock_t structures
48 *****************************************************************************/
50 typedef struct video_buffer_s
52 vlc_mutex_t lock; /* buffer data lock */
54 macroblock_t p_macroblocks[VFIFO_SIZE + 1];
55 macroblock_t * pp_mb_free[VFIFO_SIZE+1]; /* this is a LIFO */
60 /*****************************************************************************
61 * vpar_thread_t: video parser thread descriptor
62 *****************************************************************************
64 *****************************************************************************/
65 typedef struct vpar_thread_s
67 /* Thread properties and locks */
68 boolean_t b_die; /* `die' flag */
69 boolean_t b_run; /* `run' flag */
70 boolean_t b_error; /* `error' flag */
71 boolean_t b_active; /* `active' flag */
72 vlc_thread_t thread_id; /* id for thread functions */
74 /* Thread configuration */
80 /* Input properties */
81 decoder_fifo_t fifo; /* PES input fifo */
83 /* The bit stream structure handles the PES stream at the bit level */
84 bit_stream_t bit_stream;
86 /* Output properties */
87 vout_thread_t * p_vout; /* video output thread */
89 /* Decoder properties */
90 struct vdec_thread_s * pp_vdec[NB_VDEC];
93 video_buffer_t vbuffer;
96 /* Parser properties */
98 picture_parsing_t picture;
99 macroblock_parsing_t mb;
100 video_synchro_t synchro;
103 #ifdef MPEG2_COMPLIANT
104 s16 pi_crop_buf[8192];
107 lookup_t pl_mb_addr_inc[2048]; /* for macroblock
109 /* tables for macroblock types 0=P 1=B */
110 lookup_t ppl_mb_type[2][64];
111 /* table for coded_block_pattern */
112 lookup_t * pl_coded_pattern;
113 /* variable length codes for the structure dct_dc_size for intra blocks */
114 lookup_t * pppl_dct_dc_size[2][2];
118 count_t c_loops; /* number of loops */
119 count_t c_idle_loops; /* number of idle loops */
120 count_t c_sequences; /* number of sequences */
121 count_t c_pictures; /* number of pictures read */
122 count_t c_i_pictures; /* number of I pictures read */
123 count_t c_p_pictures; /* number of P pictures read */
124 count_t c_b_pictures; /* number of B pictures read */
125 count_t c_decoded_pictures; /* number of pictures decoded */
126 count_t c_decoded_i_pictures; /* number of I pictures decoded */
127 count_t c_decoded_p_pictures; /* number of P pictures decoded */
128 count_t c_decoded_b_pictures; /* number of B pictures decoded */
132 /*****************************************************************************
134 *****************************************************************************/
136 /* Thread management functions */
137 vpar_thread_t * vpar_CreateThread ( /* video_cfg_t *p_cfg, */ input_thread_t *p_input /*,
138 vout_thread_t *p_vout, int *pi_status */ );
139 void vpar_DestroyThread ( vpar_thread_t *p_vpar /*, int *pi_status */ );
141 /* Time management functions */
144 /* Dynamic thread settings */
148 /*****************************************************************************
149 * NextStartCode : Find the next start code
150 *****************************************************************************/
151 static __inline__ void NextStartCode( vpar_thread_t * p_vpar )
153 /* Re-align the buffer on an 8-bit boundary */
154 RealignBits( &p_vpar->bit_stream );
156 while( ShowBits( &p_vpar->bit_stream, 24 ) != 0x01L && !p_vpar->b_die )
158 RemoveBits( &p_vpar->bit_stream, 8 );
162 /*****************************************************************************
164 *****************************************************************************
165 * Quantizer scale factor (ISO/IEC 13818-2 7.4.2.2)
166 *****************************************************************************/
167 static __inline__ void LoadQuantizerScale( struct vpar_thread_s * p_vpar )
169 /* Quantization coefficient table */
170 static u8 ppi_quantizer_scale[3][32] =
176 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,
177 32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62
181 0, 1, 2, 3, 4, 5, 6, 7, 8, 10,12,14,16,18,20, 22,
182 24,28,32,36,40,44,48,52,56,64,72,80,88,96,104,112
186 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
187 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
191 p_vpar->mb.i_quantizer_scale = ppi_quantizer_scale
192 [(!p_vpar->sequence.b_mpeg2 << 1) | p_vpar->picture.b_q_scale_type]
193 [GetBits( &p_vpar->bit_stream, 5 )];