1 #include <VLIB/video_quantizer.h>
2 #include <VLIB/Platform/video_utils.h>
4 C_RESULT video_quantizer_init( video_controller_t* controller )
6 // Init quantizer's value
7 // This value is between 1 and 31
8 // TODO: this is not true in case of P264 but P264 don't use the video_quantizer functions. To be fixed
10 int32_t quant = controller->quant;
14 else if( quant >= 32 )
17 if( controller->picture_type == VIDEO_PICTURE_INTRA )
20 controller->invQp = (1 << 16) / (2*quant);
22 else // VIDEO_PICTURE_INTER
24 controller->Qp = quant / 2;
25 controller->invQp = (1 << 16) / (2*quant);
28 controller->dquant = 0;
33 C_RESULT video_quantizer_update( video_controller_t* controller )
35 // Update quantizer's value
36 int32_t quant = controller->quant;
40 else if( quant >= 32 )
43 if( controller->picture_type == VIDEO_PICTURE_INTRA )
46 controller->invQp = (1 << 16) / (2*quant);
48 else // VIDEO_PICTURE_INTER
50 controller->Qp = quant / 2;
51 controller->invQp = (1 << 16) / (2*quant);
54 controller->dquant = 0;
59 C_RESULT video_quantize( video_controller_t* controller, video_macroblock_t* macroblock, int32_t num_macro_blocks )
61 int32_t sum_y, sum_c, dc0, dc1, dc2, dc3, dcb, dcr;
64 y0 = macroblock->data;
66 while( num_macro_blocks > 0 )
68 if( controller->do_azq == TRUE )
70 int16_t *y1, *y2, *y3, *cb, *cr;
72 y1 = y0 + MCU_BLOCK_SIZE;
73 y2 = y1 + MCU_BLOCK_SIZE;
74 y3 = y2 + MCU_BLOCK_SIZE;
75 cb = y3 + MCU_BLOCK_SIZE;
76 cr = cb + MCU_BLOCK_SIZE;
78 // Test for azq (all zero quantized) in luma blocks
86 sum_y = dc0 + dc1 + dc2 + dc3;
95 macroblock->azq = (sum_y < controller->aq) & (sum_c < controller->bq);
96 macroblock->dquant = controller->dquant;
98 // Perform quantification on coefficients if necessary
99 if( !macroblock->azq )
101 RTMON_USTART(VIDEO_VLIB_DOQUANTIZE);
102 if( controller->picture_type == VIDEO_PICTURE_INTRA ) // intra
104 y0 = do_quantize_intra_mb(y0, controller->quant, ¯oblock->num_coeff_y0);
108 y0 = do_quantize_inter_mb(y0, controller->Qp, controller->invQp, ¯oblock->num_coeff_y0);
110 RTMON_USTOP(VIDEO_VLIB_DOQUANTIZE);
116 if( macroblock->azq )
118 y0 = macroblock->data;
125 C_RESULT video_unquantize( video_controller_t* controller, video_macroblock_t* macroblock, int32_t num_macro_blocks )
129 controller->quant += macroblock->dquant;
131 dst = macroblock->data;
133 while( num_macro_blocks > 0 )
135 // TODO Check generated code
137 if( !macroblock->azq )
138 do_unquantize(dst, controller->picture_type, controller->quant, macroblock->num_coeff_y0);
140 dst += MCU_BLOCK_SIZE;
142 if( !macroblock->azq )
143 do_unquantize(dst, controller->picture_type, controller->quant, macroblock->num_coeff_y1);
145 dst += MCU_BLOCK_SIZE;
147 if( !macroblock->azq )
148 do_unquantize(dst, controller->picture_type, controller->quant, macroblock->num_coeff_y2);
150 dst += MCU_BLOCK_SIZE;
152 if( !macroblock->azq )
153 do_unquantize(dst, controller->picture_type, controller->quant, macroblock->num_coeff_y3);
155 dst += MCU_BLOCK_SIZE;
157 if( !macroblock->azq )
158 do_unquantize(dst, controller->picture_type, controller->quant, macroblock->num_coeff_cb);
160 dst += MCU_BLOCK_SIZE;
162 if( !macroblock->azq )
163 do_unquantize(dst, controller->picture_type, controller->quant, macroblock->num_coeff_cr);
165 dst += MCU_BLOCK_SIZE;
174 #ifndef HAS_DO_QUANTIZE_INTRA_MB
175 int16_t* do_quantize_intra_mb(int16_t* ptr, int32_t quant, int32_t* last_ptr)
177 int32_t i, num_coeff;
180 if (quant == TABLE_QUANTIZATION)
181 quant = TBL_QUANT_QUALITY;
183 for( i = 6; i > 0; i-- )
187 num_coeff = MCU_BLOCK_SIZE-1;
188 coeff = coeff / (QUANT_I(0,quant));
195 while( num_coeff > 0 )
200 // TODO : division can be slow, a better implementation would consist in building an invQuant(j) table [2^16/QUANT_I(j,quant)] and computing (coeff*invQuant(j))>>16 instead of coeff / (QUANT_I(j,quant))
201 coeff = coeff / (QUANT_I(j,quant));
220 #endif // HAS_DO_QUANTIZE_INTRA_MB
222 int16_t* do_quantize_inter_mb(int16_t* ptr, int32_t quant, int32_t invQuant, int32_t* last_ptr)
224 int32_t i, num_coeff;
225 int32_t coeff, sign, last;
227 // LEVEL = ( |COF| - QUANT/2 ) / (2*QUANT) see III.3.2.1
229 for( i = 6; i > 0; i-- )
232 num_coeff = MCU_BLOCK_SIZE;
234 while( num_coeff > 0 )
269 #ifndef HAS_DO_UNQUANTIZE
270 C_RESULT do_unquantize(int16_t* ptr, int32_t picture_type, int32_t quant, int32_t num_coeff)
275 if (quant == TABLE_QUANTIZATION)
276 quant = TBL_QUANT_QUALITY; // TABLE_QUANTIZATION is an old mode and is equivalent to a QUANT_I(i,2) quantization table
278 // table quantization mode
285 coeff *= QUANT_I (i,quant);
291 } while( num_coeff > 0 );