1 /*****************************************************************************
2 * vpar_blocks.c : blocks parsing
4 *****************************************************************************/
6 /*****************************************************************************
8 *****************************************************************************/
16 #include <X11/extensions/XShm.h>
21 #include "vlc_thread.h"
24 #include "debug.h" /* ?? temporaire, requis par netlist.h */
27 #include "input_netlist.h"
28 #include "decoder_fifo.h"
30 #include "video_output.h"
32 #include "vdec_idct.h"
33 #include "video_decoder.h"
34 #include "vdec_motion.h"
36 #include "vpar_blocks.h"
37 #include "vpar_headers.h"
38 #include "video_fifo.h"
39 #include "vpar_synchro.h"
40 #include "video_parser.h"
45 static __inline__ void InitMacroblock( vpar_thread_t * p_vpar,
46 macroblock_t * p_mb );
47 static __inline__ int MacroblockAddressIncrement( vpar_thread_t * p_vpar );
48 static __inline__ void MacroblockModes( vpar_thread_t * p_vpar,
49 macroblock_t * p_mb );
50 typedef (void *) f_decode_block_t( vpar_thread_t *, macroblock_t *, int );
51 static void vpar_DecodeMPEG1Non( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b );
52 static void vpar_DecodeMPEG1Intra( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b );
53 static void vpar_DecodeMPEG2Non( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b );
54 static void vpar_DecodeMPEG2Intra( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b );
60 /*****************************************************************************
61 * pi_default_intra_quant : default quantization matrix
62 *****************************************************************************/
64 extern int pi_default_intra_quant =
66 8, 16, 19, 22, 26, 27, 29, 34,
67 16, 16, 22, 24, 27, 29, 34, 37,
68 19, 22, 26, 27, 29, 34, 34, 38,
69 22, 22, 26, 27, 29, 34, 37, 40,
70 22, 26, 27, 29, 32, 35, 40, 48,
71 26, 27, 29, 32, 35, 40, 48, 58,
72 26, 27, 29, 34, 38, 46, 56, 69,
73 27, 29, 35, 38, 46, 56, 69, 83
76 extern int pi_default_intra_quant =
78 2048, 5681, 6355, 6623, 6656, 5431, 4018, 2401,
79 5681, 7880, 10207, 10021, 9587, 8091, 6534, 3625,
80 6355, 10207, 11363, 10619, 9700, 8935, 6155, 3507,
81 6623, 9186, 10226, 9557, 8730, 8041, 6028, 3322,
82 5632, 9232, 9031, 8730, 8192, 7040, 5542, 3390,
83 5230, 7533, 7621, 7568, 7040, 6321, 5225, 3219,
84 3602, 5189, 5250, 5539, 5265, 5007, 4199, 2638,
85 1907, 2841, 3230, 3156, 3249, 3108, 2638, 1617
89 /*****************************************************************************
90 * pi_default_nonintra_quant : default quantization matrix
91 *****************************************************************************/
93 extern int pi_default_nonintra_quant =
95 16, 16, 16, 16, 16, 16, 16, 16,
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
105 extern int pi_default_nonintra_quant =
107 4096, 5680, 5344, 4816, 4096, 3216, 2224, 1136,
108 5680, 7888, 7424, 6688, 5680, 4464, 3072, 1568,
109 5344, 7424, 6992, 6288, 5344, 4208, 2896, 1472,
110 4816, 6688, 6288, 5664, 4816, 3792, 2608, 1328,
111 4096, 5680, 5344, 4816, 4096, 3216, 2224, 1136,
112 3216, 4464, 4208, 3792, 3216, 2528, 1744, 880,
113 2224, 3072, 2896, 2608, 2224, 1744, 1200, 608,
114 1136, 1568, 1472, 1328, 1136, 880, 608, 304
118 /*****************************************************************************
119 * pi_scan : zig-zag and alternate scan patterns
120 *****************************************************************************/
121 extern int pi_scan[2][64] =
123 { /* Zig-Zag pattern */
124 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
125 12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
126 35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
127 58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
129 { /* Alternate scan pattern */
130 0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
131 41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
132 51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
133 53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
138 * Initialization of lookup tables
141 /*****************************************************************************
142 * vpar_InitCrop : Initialize the crop table for saturation
143 * (ISO/IEC 13818-2 section 7.4.3)
144 *****************************************************************************/
145 #if defined(MPEG2_COMPLIANT) && !defined(VDEC_DFT)
146 void vpar_InitCrop( vpar_thread_t * p_vpar )
150 p_vpar->pi_crop = p_vpar->pi_crop_buf + 32768;
152 for( i_dummy = -32768; i_dummy < -2048; i_dummy++ )
154 p_vpar->pi_crop[i_dummy] = -2048;
156 for( ; i_dummy < 2047; i_dummy++ )
158 p_vpar->pi_crop[i_dummy] = i_dummy;
160 for( ; i_dummy < 32767; i_dummy++ )
162 p_vpar->pi_crop[i_dummy] = 2047;
167 /*****************************************************************************
168 * InitMbAddrInc : Initialize the lookup table for mb_addr_inc *
169 *****************************************************************************/
171 /* Fonction for filling up the lookup table for mb_addr_inc */
172 void __inline__ FillMbAddrIncTable( vpar_thread_t * p_vpar,
173 int i_start, int i_end, int i_step,
174 int * pi_value, int i_length )
176 int i_dummy, i_dummy2;
177 for( i_dummy = i_start, i_dummy < i_end, i_dummy += i_step )
178 for( i_dummy2 = 0, i_dummy2 < i_step, i_dummy2 ++ )
180 p_vpar->pl_mb_addr_inc[i_dummy + i_dummy2].value = * pi_value;
181 p_vpar->pl_mb_addr_inc[i_dummy + i_dummy2].length = i_length;
186 /* Fonction that initialize the table using the last one */
187 void InitMbAddrInc( vpar_thread_t * p_vpar )
191 for (i_dummy = 0; i_dummy < 8; i_dummy++)
193 p_vpar->pl_mb_addr_inc[i_dummy].i_value = MB_ERROR;
194 p_vpar->pl_mb_addr_inc[i_dummy].i_length = 0;
197 p_vpar->pl_mb_addr_inc[8].i_value = MB_ADDRINC_ESCAPE;
198 p_vpar->pl_mb_addr_inc[8].i_length = 11;
200 for (i_dummy = 9; i_dummy < 15; i_dummy ++)
202 p_vpar->pl_mb_addr_inc[i_dummy].i_value = MB_ERROR;
203 p_vpar->pl_mb_addr_inc[i_dummy].i_length = 0;
206 p_vpar->pl_mb_addr_inc[15].i_value = MB_ADDRINC_STUFFING;
207 p_vpar->pl_mb_addr_inc[15].i_length = 11;
209 for (i = 16; i < 24; i++)
211 p_vpar->pl_mb_addr_inc[i_dummy].i_value = MB_ERROR;
212 p_vpar->pl_mb_addr_inc[i_dummy].i_length = 0;
214 pi_value = (int *) malloc( sizeof( int ) );
216 FillMbAddrIncTable( p_vpar, 1024, 2048, 1024, pi_value, 1 );
217 FillMbAddrIncTable( p_vpar, 512, 1024, 256, pi_value, 3 );
218 FillMbAddrIncTable( p_vpar, 256, 512, 128, pi_value, 4 );
219 FillMbAddrIncTable( p_vpar, 128, 256, 64, pi_value, 5 );
220 FillMbAddrIncTable( p_vpar, 96, 128, 16, pi_value, 7 );
221 FillMbAddrIncTable( p_vpar, 48, 96, 8, pi_value, 8 );
222 FillMbAddrIncTable( p_vpar, 36, 48, 2, pi_value, 10 );
223 FillMbAddrIncTable( p_vpar, 24, 36, 1, pi_value, 11 );
225 /*****************************************************************************
226 * InitDCT : Initialize tables giving the length of the dct coefficient
228 *****************************************************************************/
230 void InitDCTTables( vpar_thread_t * p_vpar )
232 /* Tables are cut in two parts to reduce memory occupation */
234 /* Table B-12, dct_dc_size_luminance, codes 00xxx ... 11110 */
235 p_vpar->pppl_dct_dc_size[0][0] =
236 { {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
237 {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
238 {0, 3}, {0, 3}, {0, 3}, {0, 3}, {3, 3}, {3, 3}, {3, 3}, {3, 3},
239 {4, 3}, {4, 3}, {4, 3}, {4, 3}, {5, 4}, {5, 4}, {6, 5}, {MB_ERROR, 0}
242 /* Table B-12, dct_dc_size_luminance, codes 111110xxx ... 111111111 */
243 p_vpar->pppl_dct_dc_lum_size[1][0] =
244 { {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6}, {7, 6},
245 {8, 7}, {8, 7}, {8, 7}, {8, 7}, {9, 8}, {9, 8}, {10,9}, {11,9}
246 {MB_ERROR, 0}, {MB_ERROR, 0}, {MB_ERROR, 0}, {MB_ERROR, 0},
247 {MB_ERROR, 0}, {MB_ERROR, 0}, {MB_ERROR, 0}, {MB_ERROR, 0},
248 {MB_ERROR, 0}, {MB_ERROR, 0}, {MB_ERROR, 0}, {MB_ERROR, 0},
249 {MB_ERROR, 0}, {MB_ERROR, 0}, {MB_ERROR, 0}, {MB_ERROR, 0}
252 /* Table B-13, dct_dc_size_chrominance, codes 00xxx ... 11110 */
253 p_vpar->pppl_dct_dc_chrom_size[0][1] =
254 { {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2}, {0, 2},
255 {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2},
256 {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2},
257 {3, 3}, {3, 3}, {3, 3}, {3, 3}, {4, 4}, {4, 4}, {5, 5}, {MB_ERROR, 0}
260 /* Table B-13, dct_dc_size_chrominance, codes 111110xxxx ... 1111111111 */
261 p_vpar->pppl_dct_dc_size[1][1] =
262 { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
263 {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6},
264 {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7}, {7, 7},
265 {8, 8}, {8, 8}, {8, 8}, {8, 8}, {9, 9}, {9, 9}, {10,10}, {11,10}
270 /*****************************************************************************
271 * Init*MBType : Initialize lookup table for the Macroblock type *
272 * ***************************************************************************/
274 /* Fonction for filling up the tables */
275 static void __inline__ FillMBType( vpar_thread_t * p_vpar,
283 for( i_dummy = i_start, i_dummy < i_end, i++ )
285 p_vpar->pm_mb_type[i_mb_type][i_dummy].i_value = i_value;
286 p_vpar->pm_mb_type[i_mb_type][i_dummy].i_length = i_length;
290 /* Fonction that fills the table for P MB_Type */
291 void InitPMBType( vpar_thread_t * p_vpar )
293 FillMBType( p_vpar, 0, 32, 64, MB_MOTION_FORWARD|MB_PATTERN, 1 );
294 FillMBType( p_vpar, 0, 16, 32, MB_PATTERN, 2 );
295 FillMBType( p_vpar, 0, 8, 16, MB_MOTION_FORWARD, 3 );
296 FillMBType( p_vpar, 0, 6, 8, MB_INTRA, 5 );
297 FillMBType( p_vpar, 0, 4, 6, MB_QUANT|MB_MOTION_FORWARD|PATTERN, 5 );
298 FillMBType( p_vpar, 0, 2, 4, MB_QUANT|MB_PATTERN, 5 );
299 p_vpar->pm_mb_type[0][1].i_value = MB_QUANT|MB_INTRA;
300 p_vpar->pm_mb_type[0][1].i_length = 6;
301 p_vpar->pm_mb_type[0][0].i_value = MB_ERROR;
302 p_vpar->pm_mb_type[0][0].i_length = 0;
305 /* Fonction that fills the table for B MB_Type */
306 void InitBMBType( vpar_thread_t * p_vpar )
308 FillMBType( p_vpar, 1, 48, 64, MB_MOTION_FORWARD
309 |MB_MOTION_BACKWARD|MB_PATTERN, 2 );
310 FillMBType( p_vpar, 1, 32, 48, MB_MOTION_FORWARD|MB_MOTION_BACKWARD, 2 );
311 FillMBType( p_vpar, 1, 24, 32, MB_MOTION_BACKWARD|MB_PATTERN, 3 );
312 FillMBType( p_vpar, 1, 16, 24, MB_MOTION_BACKWARD, 3 );
313 FillMBType( p_vpar, 1, 12, 16, MB_MOTION_FORWARD|MB_PATTERN, 4 );
314 FillMBType( p_vpar, 1, 8, 12, MB_MOTION_FORWARD, 4 );
315 FillMBType( p_vpar, 1, 6, 8, MB_INTRA, 5 );
316 FillMBType( p_vpar, 1, 4, 6, MB_QUANT|MB_MOTION_FORWARD
317 |MB_MOTION_BACKWARD|MB_PATTERN, 5 );
318 p_vpar->pm_mb_type[1][3].i_value = MB_QUANT|MB_MOTION_FORWARD|MB_PATTERN
319 p_vpar->pm_mb_type[1][3].i_length = 6;
320 p_vpar->pm_mb_type[1][2].i_value = MB_QUANT|MB_MOTION_BACKWARD|MB_PATTERN;
321 p_vpar->pm_mb_type[1][2].i_length = 6;
322 p_vpar->pm_mb_type[1][1].i_value = MB_QUANT|MB_INTRA;
323 p_vpar->pm_mb_type[1][1].i_length = 6;
324 p_vpar->pm_mb_type[1][0].i_value =MB_ERROR;
325 p_vpar->pm_mb_type[1][0].i_length = 0;
328 /*****************************************************************************
329 * InitCodedPattern : Initialize the lookup table for decoding
330 * coded block pattern
331 *****************************************************************************/
332 void InitCodedPattern( vpar_thread_t * p_vpar )
334 p_vpar->pl_coded_pattern =
335 { {(unsigned int)ERROR, 0}, {(unsigned int)ERROR, 0}, {39, 9}, {27, 9}, {59, 9}, {55, 9}, {47, 9}, {31, 9},
336 {58, 8}, {58, 8}, {54, 8}, {54, 8}, {46, 8}, {46, 8}, {30, 8}, {30, 8},
337 {57, 8}, {57, 8}, {53, 8}, {53, 8}, {45, 8}, {45, 8}, {29, 8}, {29, 8},
338 {38, 8}, {38, 8}, {26, 8}, {26, 8}, {37, 8}, {37, 8}, {25, 8}, {25, 8},
339 {43, 8}, {43, 8}, {23, 8}, {23, 8}, {51, 8}, {51, 8}, {15, 8}, {15, 8},
340 {42, 8}, {42, 8}, {22, 8}, {22, 8}, {50, 8}, {50, 8}, {14, 8}, {14, 8},
341 {41, 8}, {41, 8}, {21, 8}, {21, 8}, {49, 8}, {49, 8}, {13, 8}, {13, 8},
342 {35, 8}, {35, 8}, {19, 8}, {19, 8}, {11, 8}, {11, 8}, {7, 8}, {7, 8},
343 {34, 7}, {34, 7}, {34, 7}, {34, 7}, {18, 7}, {18, 7}, {18, 7}, {18, 7},
344 {10, 7}, {10, 7}, {10, 7}, {10, 7}, {6, 7}, {6, 7}, {6, 7}, {6, 7},
345 {33, 7}, {33, 7}, {33, 7}, {33, 7}, {17, 7}, {17, 7}, {17, 7}, {17, 7},
346 {9, 7}, {9, 7}, {9, 7}, {9, 7}, {5, 7}, {5, 7}, {5, 7}, {5, 7},
347 {63, 6}, {63, 6}, {63, 6}, {63, 6}, {63, 6}, {63, 6}, {63, 6}, {63, 6},
348 {3, 6}, {3, 6}, {3, 6}, {3, 6}, {3, 6}, {3, 6}, {3, 6}, {3, 6},
349 {36, 6}, {36, 6}, {36, 6}, {36, 6}, {36, 6}, {36, 6}, {36, 6}, {36, 6},
350 {24, 6}, {24, 6}, {24, 6}, {24, 6}, {24, 6}, {24, 6}, {24, 6}, {24, 6},
351 {62, 5}, {62, 5}, {62, 5}, {62, 5}, {62, 5}, {62, 5}, {62, 5}, {62, 5},
352 {62, 5}, {62, 5}, {62, 5}, {62, 5}, {62, 5}, {62, 5}, {62, 5}, {62, 5},
353 {2, 5}, {2, 5}, {2, 5}, {2, 5}, {2, 5}, {2, 5}, {2, 5}, {2, 5},
354 {2, 5}, {2, 5}, {2, 5}, {2, 5}, {2, 5}, {2, 5}, {2, 5}, {2, 5},
355 {61, 5}, {61, 5}, {61, 5}, {61, 5}, {61, 5}, {61, 5}, {61, 5}, {61, 5},
356 {61, 5}, {61, 5}, {61, 5}, {61, 5}, {61, 5}, {61, 5}, {61, 5}, {61, 5},
357 {1, 5}, {1, 5}, {1, 5}, {1, 5}, {1, 5}, {1, 5}, {1, 5}, {1, 5},
358 {1, 5}, {1, 5}, {1, 5}, {1, 5}, {1, 5}, {1, 5}, {1, 5}, {1, 5},
359 {56, 5}, {56, 5}, {56, 5}, {56, 5}, {56, 5}, {56, 5}, {56, 5}, {56, 5},
360 {56, 5}, {56, 5}, {56, 5}, {56, 5}, {56, 5}, {56, 5}, {56, 5}, {56, 5},
361 {52, 5}, {52, 5}, {52, 5}, {52, 5}, {52, 5}, {52, 5}, {52, 5}, {52, 5},
362 {52, 5}, {52, 5}, {52, 5}, {52, 5}, {52, 5}, {52, 5}, {52, 5}, {52, 5},
363 {44, 5}, {44, 5}, {44, 5}, {44, 5}, {44, 5}, {44, 5}, {44, 5}, {44, 5},
364 {44, 5}, {44, 5}, {44, 5}, {44, 5}, {44, 5}, {44, 5}, {44, 5}, {44, 5},
365 {28, 5}, {28, 5}, {28, 5}, {28, 5}, {28, 5}, {28, 5}, {28, 5}, {28, 5},
366 {28, 5}, {28, 5}, {28, 5}, {28, 5}, {28, 5}, {28, 5}, {28, 5}, {28, 5},
367 {40, 5}, {40, 5}, {40, 5}, {40, 5}, {40, 5}, {40, 5}, {40, 5}, {40, 5},
368 {40, 5}, {40, 5}, {40, 5}, {40, 5}, {40, 5}, {40, 5}, {40, 5}, {40, 5},
369 {20, 5}, {20, 5}, {20, 5}, {20, 5}, {20, 5}, {20, 5}, {20, 5}, {20, 5},
370 {20, 5}, {20, 5}, {20, 5}, {20, 5}, {20, 5}, {20, 5}, {20, 5}, {20, 5},
371 {48, 5}, {48, 5}, {48, 5}, {48, 5}, {48, 5}, {48, 5}, {48, 5}, {48, 5},
372 {48, 5}, {48, 5}, {48, 5}, {48, 5}, {48, 5}, {48, 5}, {48, 5}, {48, 5},
373 {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
374 {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5}, {12, 5},
375 {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4},
376 {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4},
377 {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4},
378 {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4}, {32, 4},
379 {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4},
380 {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4},
381 {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4},
382 {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4}, {16, 4},
383 {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4},
384 {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4},
385 {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4},
386 {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4}, {8, 4},
387 {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4},
388 {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4},
389 {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4},
390 {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4}, {4, 4},
391 {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3},
392 {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3},
393 {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3},
394 {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3},
395 {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3},
396 {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3},
397 {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3},
398 {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3}, {60, 3} };
402 * Macroblock parsing functions
405 /*****************************************************************************
406 * vpar_ParseMacroblock : Parse the next macroblock
407 *****************************************************************************/
408 void vpar_ParseMacroblock( vpar_thread_t * p_vpar, int * pi_mb_address,
409 int i_mb_previous, int i_mb_base )
411 static f_addb_t ppf_addb_intra[2] = {vdec_AddBlock, vdec_CopyBlock};
412 static f_decode_block_t pppf_decode_block[2][2] =
413 { {vpar_DecodeMPEG1Non, vpar_DecodeMPEG1Intra},
414 {vpar_DecodeMPEG2Non, vpar_DecodeMPEG2Intra} };
415 static int pi_x[12] = {0,8,0,8,0,0,0,0,8,8,8,8};
416 static int pi_y[2][12] = { {0,0,8,8,0,0,8,8,0,0,8,8},
417 {0,0,1,1,0,0,1,1,0,0,1,1} };
418 static int pi_chroma_hor[4] = { 0, 1, 1, 0 };
419 static int pi_chroma_ver[4] = { 0, 1, 0, 0 };
421 int i_mb, i_b, i_mask;
427 *pi_mb_address += MacroblockAddressIncrement( p_vpar );
429 for( i_mb = i_mb_previous; i_mb < *pi_mb_address; i_mb++ )
431 /* Skipped macroblock (ISO/IEC 13818-2 7.6.6). */
432 static int pi_dc_dct_reinit[4] = {128,256,512,1024};
433 static f_motion_t pf_motion_skipped[4] = {NULL, vdec_MotionField,
434 vdec_MotionField, vdec_MotionFrame};
436 /* Reset DC predictors (7.2.1). */
437 p_vpar->slice.pi_dc_dct_pred[0] = p_vpar->slice.pi_dc_dct_pred[1]
438 = p_vpar->slice.pi_dc_dct_pred[2]
439 = pi_dc_dct_reinit[p_vpar->picture.i_intra_dc_precision];
441 if( p_vpar->picture.i_coding_type == P_CODING_TYPE )
443 /* Reset motion vector predictors (ISO/IEC 13818-2 7.6.3.4). */
444 bzero( p_vpar->slice.pppi_pmv, 8*sizeof(int) );
447 if( (p_mb = p_vpar->picture.pp_mb[i_mb_base + i_mb] =
448 vpar_NewMacroblock( &p_vpar->vfifo )) == NULL )
450 p_vpar->picture.b_error = 1;
451 intf_ErrMsg("vpar error: macroblock list is empty !");
455 InitMacroblock( p_vpar, p_mb );
457 /* No IDCT nor AddBlock. */
458 for( i_b = 0; i_b < 12; i_b++ )
460 p_mb->pf_idct[i_b] = vdec_DummyIDCT;
461 p_mb->pf_addb[i_b] = vdec_DummyBlock;
464 /* Motion type is picture structure. */
465 p_mb->pf_motion = pf_motion_skipped[p_vpar->picture.i_structure];
467 /* Predict from field of same parity. */
471 /* Get a macroblock structure. */
472 if( (p_mb = p_vpar->picture.pp_mb[i_mb_base + *pi_mb_address] =
473 vpar_NewMacroblock( &p_vpar->vfifo )) == NULL )
475 p_vpar->picture.b_error = 1;
476 intf_ErrMsg("vpar error: macroblock list is empty !");
480 InitMacroblock( p_vpar, p_mb );
482 /* Parse off macroblock_modes structure. */
483 MacroblockModes( p_vpar, p_mb );
485 if( p_vpar->mb.i_mb_type & MB_QUANT )
487 LoadQuantizerScale( p_vpar );
490 if( p_vpar->mb.i_mb_type & MB_MOTION_FORWARD )
492 (*p_vpar->sequence.pf_decode_mv)( p_vpar, 0 );
495 if( p_vpar->mb.i_mb_type & MB_MOTION_BACKWARD )
497 (*p_vpar->sequence.pf_decode_mv)( p_vpar, 1 );
500 if( p_vpar->picture.b_concealment_mv && (p_vpar->mb.i_mb_type & MB_INTRA) )
502 DumpBits( &p_vpar->bit_stream, 1 );
505 if( p_vpar->mb.i_mb_type & MB_PATTERN )
507 (*p_vpar->sequence.pf_decode_pattern)( p_vpar );
511 int pi_coded_block_pattern[2] = {0,
512 (1 << 4+2*p_vpar->sequence.i_chroma_nb_blocks) - 1};
513 p_vpar->mb.i_coded_block_pattern = pi_coded_block_pattern
514 [p_vpar->mb.i_mb_type & MB_INTRA];
517 pf_addb = ppf_addb_intra[p_vpar->mb.i_mb_type & MB_INTRA];
520 * Effectively decode blocks.
523 i_mask = 1 << (3 + 2*p_vpar->sequence.i_chroma_nb_blocks);
526 p_data1 = p_mb->p_picture->p_y
527 + p_mb->i_l_x + p_mb->i_l_y*(p_vpar->sequence.i_width);
529 for( i_b = 0; i_b < 4; i_b++, i_mask >>= 1 )
531 if( p_vpar->mb.i_coded_block_pattern & i_mask )
533 memset( p_mb->ppi_blocks[i_b], 0, 64*sizeof(elem_t) );
534 (*pppf_decode_block[p_vpar->sequence.b_mpeg2]
535 [p_vpar->mb.i_mb_type & MB_INTRA])
536 ( p_vpar, p_mb, i_b );
538 /* decode_block has already set pf_idct and pi_sparse_pos. */
539 p_mb->pf_addb[i_b] = pf_addb;
541 /* Calculate block coordinates. */
542 p_mb->p_data[i_b] = p_data1
543 + pi_y[p_vpar->mb.b_dct_type][i_b]
544 * p_vpar->sequence.i_chroma_width;
548 /* Block not coded, so no IDCT, nor AddBlock */
549 p_mb->pf_addb[i_b] = vdec_DummyBlock;
550 p_mb->pf_idct[i_b] = vdec_DummyIDCT;
555 p_data1 = p_mb->p_picture->p_u
556 + p_mb->i_c_x >> pi_chroma_hor[p_vpar->sequence.i_chroma_format]
557 + (p_mb->i_c_y >> pi_chroma_ver[p_vpar->sequence.i_chroma_format])
558 * (p_vpar->sequence.i_chroma_width);
559 p_data2 = p_mb->p_picture->p_v
560 + p_mb->i_c_x >> pi_chroma_hor[p_vpar->sequence.i_chroma_format]
561 + (p_mb->i_c_y >> pi_chroma_ver[p_vpar->sequence.i_chroma_format])
562 * (p_vpar->sequence.i_chroma_width);
564 for( i_b = 4; i_b < 4 + 2*p_vpar->sequence.i_chroma_nb_blocks;
565 i_b++, i_mask >>= 1 )
567 elem_t * pp_data[2] = {p_data1, p_data2};
569 if( p_vpar->mb.i_coded_block_pattern & i_mask )
571 memset( p_mb->ppi_blocks[i_b], 0, 64*sizeof(elem_t) );
572 (*pppf_decode_block[p_vpar->sequence.b_mpeg2]
573 [p_vpar->mb.i_mb_type & MB_INTRA])
574 ( p_vpar, p_mb, i_b );
576 /* decode_block has already set pf_idct and pi_sparse_pos. */
577 p_mb->pf_addb[i_b] = pf_addb;
579 /* Calculate block coordinates. */
580 p_mb->p_data[i_b] = pp_data[i_b & 1]
581 + pi_y[p_vpar->mb.b_dct_type][i_b]
582 * p_vpar->sequence.i_chroma_width;
586 /* Block not coded, so no IDCT, nor AddBlock */
587 p_mb->pf_addb[i_b] = vdec_DummyBlock;
588 p_mb->pf_idct[i_b] = vdec_DummyIDCT;
592 if( !( p_vpar->mb.i_mb_type & MB_INTRA ) )
594 static int pi_dc_dct_reinit[4] = {128,256,512,1024};
596 /* Reset DC predictors (7.2.1). */
597 p_vpar->slice.pi_dc_dct_pred[0] = p_vpar->slice.pi_dc_dct_pred[1]
598 = p_vpar->slice.pi_dc_dct_pred[2]
599 = pi_dc_dct_reinit[p_vpar->picture.i_intra_dc_precision];
601 else if( !p_vpar->picture.b_concealment_mv )
603 /* Reset MV predictors. */
604 bzero( p_vpar->slice.pppi_pmv, 8*sizeof(int) );
607 if( (p_vpar->picture.i_coding_type == P_CODING_TYPE) &&
608 !(p_vpar->mb.i_mb_type & (MB_MOTION_FORWARD|MB_INTRA)) )
610 /* Special No-MC macroblock in P pictures (7.6.3.5). */
611 p_vpar->slice.pppi_pmv[0][0][0] = p_vpar->slice.pppi_pmv[0][0][1] =
612 p_vpar->slice.pppi_pmv[1][0][0] = p_vpar->slice.pppi_pmv[1][0][1] = 0;
614 /* motion type ?????? */
615 /* predict from field of same parity ????? */
619 /*****************************************************************************
620 * InitMacroblock : Initialize macroblock values
621 *****************************************************************************/
622 static __inline__ void InitMacroblock( vpar_thread_t * p_vpar,
623 macroblock_t * p_mb )
625 p_mb->p_picture = p_vpar->picture.p_picture;
626 p_mb->i_structure = p_vpar->picture.i_structure;
627 p_mb->i_l_x = p_vpar->mb.i_l_x;
628 p_mb->i_l_y = p_vpar->mb.i_l_y;
629 p_mb->i_c_x = p_vpar->mb.i_c_x;
630 p_mb->i_c_y = p_vpar->mb.i_c_y;
631 p_mb->i_chroma_nb_blocks = p_vpar->sequence.i_chroma_nb_blocks;
633 p_mb->i_addb_l_stride = p_mb->i_l_stride = p_vpar->picture.i_l_stride;
634 p_mb->i_addb_c_stride = p_mb->i_c_stride = p_vpar->picture.i_c_stride;
636 /* Update macroblock real position. */
637 p_vpar->mb.i_l_x += 16;
638 p_vpar->mb.i_l_y += (p_vpar->mb.i_l_x / p_vpar->sequence.i_width)
639 * (2 - p_vpar->picture.b_frame_structure) * 16;
640 p_vpar->mb.i_l_x %= p_vpar->sequence.i_width;
642 p_vpar->mb.i_c_x += p_vpar->sequence.i_chroma_mb_width;
643 p_vpar->mb.i_c_y += (p_vpar->mb.i_c_x / p_vpar->sequence.i_chroma_width)
644 * (2 - p_vpar->picture.b_frame_structure)
645 * p_vpar->sequence.i_chroma_mb_height;
646 p_vpar->mb.i_c_x %= p_vpar->sequence.i_chroma_width;
649 /*****************************************************************************
650 * MacroblockAddressIncrement : Get the macroblock_address_increment field
651 *****************************************************************************/
652 static __inline__ int MacroblockAddressIncrement( vpar_thread_t * p_vpar )
654 /* Index in the lookup table mb_addr_inc */
655 int i_index = ShowBits( &p_vpar->bit_stream, 11 );
656 p_vpar->pl_mb.i_addr_inc = 0;
657 /* Test the presence of the escape character */
658 while( i_index == 8 )
660 DumpBits( &p_vpar->bit_stream, 11 );
661 p_vpar->mb.i_addr_inc += 33;
662 i_index = ShowBits( &p_vpar->bit_stream, 11 );
664 /* Affect the value from the lookup table */
665 p_vpar->pl_mb.i_addr_inc += p_vpar->pl_mb_addr_inc[i_index].i_value;
666 /* Dump the good number of bits */
667 DumpBits( &p_vpar->bit_stream, p_vpar->pl_mb_addr_inc[i_index].i_length );
670 /*****************************************************************************
671 * MacroblockModes : Get the macroblock_modes structure
672 *****************************************************************************/
673 static __inline__ void MacroblockModes( vpar_thread_t * p_vpar,
674 macroblock_t * p_mb )
676 static f_motion_t pf_motion[2][4] =
677 { {NULL, vdec_FieldRecon, vdec_16x8Recon, vdec_DMVRecon},
678 {NULL, vdec_FieldRecon, vdec_FrameRecon, vdec_DMVRecon} };
679 static int ppi_mv_count[2][4] = { {0, 1, 2, 1}, {0, 2, 1, 1} };
680 static int ppi_mv_format[2][4] = { {0, 1, 1, 1}, {0, 1, 2, 1} };
682 /* Get macroblock_type. */
683 p_vpar->mb.i_mb_type = (p_vpar->picture.pf_macroblock_type)
684 ( vpar_thread_t * p_vpar );
686 /* SCALABILITY : warning, we don't know if spatial_temporal_weight_code
687 * has to be dropped, take care if you use scalable streams. */
688 /* DumpBits( &p_vpar->bit_stream, 2 ); */
690 if( !(p_vpar->mb.i_mb_type & (MB_MOTION_FORWARD | MB_MOTION_BACKWARD))
691 || p_vpar->picture.b_frame_pred_frame_dct )
693 /* If mb_type has neither MOTION_FORWARD nor MOTION_BACKWARD, this
694 * is useless, but also harmless. */
695 p_vpar->mb.i_motion_type = MOTION_FRAME;
699 p_vpar->mb.i_motion_type = GetBits( &p_vpar->bit_stream, 2 );
702 p_mb->pf_motion = pf_motion[p_vpar->picture.b_frame_structure]
703 [p_vpar->mb.i_motion_type];
704 p_vpar->mb.i_mv_count = ppi_mv_count[p_vpar->picture.b_frame_structure]
705 [p_vpar->mb.i_motion_type];
706 p_vpar->mb.i_mv_format = ppi_mv_format[p_vpar->picture.b_frame_structure]
707 [p_vpar->mb.i_motion_type];
709 p_vpar->mb.b_dct_type = 0;
710 if( (p_vpar->picture.i_structure == FRAME_STRUCTURE) &&
711 (!p_vpar->picture.b_frame_pred_frame_dct) &&
712 (p_vpar->mb.i_mb_type & (MB_PATTERN|MB_INTRA)) )
714 if( p_vpar->mb.b_dct_type = GetBits( &p_vpar->bit_stream, 1 ) )
716 /* The DCT is coded on fields. Jump one line between each
718 p_mb->i_addb_l_stride <<= 1;
719 p_mb->i_addb_l_stride += 8;
720 /* With CHROMA_420, the DCT is necessarily frame-coded. */
721 if( p_vpar->picture.sequence.i_chroma_format != CHROMA_420 )
723 p_mb->i_addb_c_stride <<= 1;
724 p_mb->i_addb_c_stride += 8;
729 p_vpar->mb.b_dmv = p_vpar->mb.i_motion_type == MOTION_DMV;
732 /*****************************************************************************
733 * vpar_IMBType : macroblock_type in I pictures
734 *****************************************************************************/
735 int vpar_IMBType( vpar_thread_t * p_vpar )
737 /* Take two bits for testing */
738 int i_type = ShowBits( &p_vpar->bit_stream, 2 );
739 /* Lookup table for macroblock_type */
740 static lookup_t pl_mb_Itype[4] = { {MB_ERROR, 0},
741 {MB_QUANT|MB_INTRA, 2},
744 /* Dump the good number of bits */
745 DumpBits( &p_vpar->bit_stream, pl_mb_Itype[i_type].i_length );
746 return pl_mb_Itype[i_type];
749 /*****************************************************************************
750 * vpar_PMBType : macroblock_type in P pictures
751 *****************************************************************************/
752 int vpar_PMBType( vpar_thread_t * p_vpar )
754 /* Testing on 6 bits */
755 int i_type = ShowBits( &p_vpar->bit_stream, 6 );
756 /* Dump the good number of bits */
757 DumpBits( &p_vpar->bit_stream, p_vpar->pm_mb_type[0][i_type].i_length );
758 /* return the value from the lookup table for P type */
759 return p_vpar->pm_mb_type[0][i_type].i_value;
762 /*****************************************************************************
763 * vpar_BMBType : macroblock_type in B pictures
764 *****************************************************************************/
765 int vpar_BMBType( vpar_thread_t * p_vpar )
767 /* Testing on 6 bits */
768 int i_type = ShowBits( &p_vpar->bit_stream, 6 );
769 /* Dump the good number of bits */
770 DumpBits( &p_vpar->bit_stream, p_vpar->pm_mb_type[1][i_type].i_length );
771 /* return the value from the lookup table for B type */
772 return p_vpar->pm_mb_type[1][i_type].i_value;
775 /*****************************************************************************
776 * vpar_DMBType : macroblock_type in D pictures
777 *****************************************************************************/
778 int vpar_DMBType( vpar_thread_t * p_vpar )
781 int i_type = GetBits( &p_vpar->bit_stream, 1 );
783 static int pi_mb_Dtype[2] = { MB_ERROR, 1 };
784 return pi_mb_Dtype[i_type];
787 /*****************************************************************************
788 * vpar_CodedPattern420 : coded_block_pattern with 420 chroma
789 *****************************************************************************/
790 int vpar_CodedPattern420( vpar_thread_t * p_vpar )
792 int i_vlc = ShowBits( p_vpar->bit_stream, 9 );
793 DumpBits( p_vpar->bit_stream, p_vpar->pl_coded_pattern[i_vlc].i_length );
794 return p_vpar->pl_coded_pattern[i_vlc].i_value;
797 /*****************************************************************************
798 * vpar_CodedPattern422 : coded_block_pattern with 422 chroma
799 *****************************************************************************/
800 int vpar_CodedPattern422( vpar_thread_t * p_vpar )
802 /* À pomper dans Berkeley + attention ! y'a 2 bits en plus en MPEG2 */
805 /*****************************************************************************
806 * vpar_CodedPattern444 : coded_block_pattern with 444 chroma
807 *****************************************************************************/
808 int vpar_CodedPattern444( vpar_thread_t * p_vpar )
810 /* À pomper dans Berkeley + attention ! y'a 4 bits en plus en MPEG2 */
813 /*****************************************************************************
814 * vpar_DecodeMPEG1Non : decode MPEG-1 non-intra blocks
815 *****************************************************************************/
816 static void vpar_DecodeMPEG1Non( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b )
818 /* À pomper dans Berkeley. Pour toutes ces fonctions, il faut mettre
819 p_mb->pf_idct[i_b] à :
821 - vdec_SparseIDCT si la matrice n'a qu'un coefficient non nul.
822 Dans le deuxième cas, p_mb->pi_sparse_pos[i_b] contient le numéro
823 de ce coefficient. */
825 if( p_vpar->picture.i_coding_type == D_CODING_TYPE )
827 /* Remove end_of_macroblock (always 1, prevents startcode emulation)
828 * ISO/IEC 11172-2 section 2.4.2.7 and 2.4.3.6 */
829 DumpBits( &p_vpar->bit_stream, 1 );
833 /*****************************************************************************
834 * vpar_DecodeMPEG1Intra : decode MPEG-1 intra blocks
835 *****************************************************************************/
836 static void vpar_DecodeMPEG1Intra( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b )
838 /* À pomper dans Berkeley. */
840 if( p_vpar->picture.i_coding_type == D_CODING_TYPE )
842 /* Remove end_of_macroblock (always 1, prevents startcode emulation)
843 * ISO/IEC 11172-2 section 2.4.2.7 and 2.4.3.6 */
844 DumpBits( &p_vpar->bit_stream, 1 );
848 /*****************************************************************************
849 * vpar_DecodeMPEG2Non : decode MPEG-2 non-intra blocks
850 *****************************************************************************/
851 static void vpar_DecodeMPEG2Non( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b )
853 /* À pomper dans Berkeley. Bien sûr les matrices seront différentes... */
856 /*****************************************************************************
857 * vpar_DecodeMPEG2Intra : decode MPEG-2 intra blocks
858 *****************************************************************************/
859 static void vpar_DecodeMPEG2Intra( vpar_thread_t * p_vpar, macroblock_t * p_mb, int i_b )
861 /* Lookup Table for the chromatic component */
862 static int pi_cc_index[12] = { 0, 0, 0, 0, 1, 2, 1, 2, 1, 2 };
863 int i_cc = pi_cc_index[i_b];
864 /* Determine whether it is luminance or not (chrominance) */
865 int i_type = ( i_cc + 1 ) / 2;
867 /* Decoding of the DC intra coefficient */
868 /* The nb of bits to parse depends on i_type */
869 int i_code = ShowBits( &p_vpar->bit_stream, 9 + i_type );
870 /* To reduce memory occupation, there are two lookup tables
871 * See InitDCT above */
872 int i_code5 = i_code >> 4;
873 /* Shall we lookup in the first or in the second table ? */
874 int i_select = ( i_code5 - 1 ) / 31;
875 /* Offset value for looking in the second table */
876 int i_offset = 0x1f0 + ( i_type * 0x1f0 );
877 int i_pos = i_code5 * ( ! i_select ) +
878 ( i_code - i_offset ) * i_select;
881 i_dct_dc_size = p_vpar->pppl_dct_dc_size[i_select][i_type][i_pos].i_value;
882 /* Dump the variable length code */
883 DumpBits( &p_vpar->bit_stream,
884 pppl_dct_dc_size[i_select][i_type][i_pos].i_length );
885 i_dct_diff = GetBits( &p_vpar->bit_stream, i_dct_dc_size );
886 p_vpar->slice.pi_dct_dc_pred[i_cc] += i_dct_diff;
888 /* Decoding of the AC coefficients */