1 #include <VLIB/Platform/video_utils.h>
2 #include <VLIB/Platform/video_config.h>
4 #include <VLIB/video_quantizer.h>
5 #include <VLIB/video_dct.h>
6 #include <VLIB/video_mem32.h>
7 #include <VLIB/video_packetizer.h>
9 #include <VLIB/UVLC/uvlc_codec.h>
10 #include <VLIB/UVLC/uvlc.h>
12 #include <VP_Os/vp_os_malloc.h>
13 #include <VP_Os/vp_os_assert.h>
15 #if TARGET_CPU_ARM == 1
17 #ifdef HAS_UVLC_DECODE_BLOCKLINE
18 C_RESULT uvlc_read_block_unquantize( video_controller_t* controller, int16_t* data, int32_t quant, int32_t nc )
20 video_stream_t* stream = &controller->in_stream;
22 int32_t index, code, run, last;
24 zztable = &video_zztable_t81[0];
25 code = run = last = 0;
27 if (quant == TABLE_QUANTIZATION)
29 quant = TBL_QUANT_QUALITY;
31 // table quantization mode
32 video_read_data( stream, (uint32_t*) &code, 10 );
33 code *= QUANT_I(0,quant);
38 uvlc_decode( stream, &run, &code, &last);
41 VP_OS_ASSERT( run < 64 );
45 code *= QUANT_I(index,quant);
47 uvlc_decode( stream, &run, &code, &last);
54 uint16_t* uvlc_read_mb_layer_unquantize( video_controller_t* controller, video_macroblock_t* mb, uint16_t* out )
59 video_zeromem32( (uint32_t*)mb->data, 6 * MCU_BLOCK_SIZE / 2 );
62 video_read_data( &controller->in_stream, (uint32_t*)&mb->azq, 1 );
66 video_read_data( &controller->in_stream, &code, 8 );
68 mb->num_coeff_y0 = (code >> 0) & 1;
69 mb->num_coeff_y1 = (code >> 1) & 1;
70 mb->num_coeff_y2 = (code >> 2) & 1;
71 mb->num_coeff_y3 = (code >> 3) & 1;
72 mb->num_coeff_cb = (code >> 4) & 1;
73 mb->num_coeff_cr = (code >> 5) & 1;
78 video_read_data( &controller->in_stream, &code, 2 );
80 mb->dquant = (code < 2) ? ~code : code;
83 controller->quant += mb->dquant;
85 /**************** Block Y0 ****************/
87 uvlc_read_block_unquantize( controller, data, controller->quant, mb->num_coeff_y0 );
89 out += MCU_BLOCK_SIZE;
91 /**************** Block Y1 ****************/
92 data += MCU_BLOCK_SIZE;
93 uvlc_read_block_unquantize( controller, data, controller->quant, mb->num_coeff_y1 );
95 out += MCU_BLOCK_SIZE;
97 /**************** Block Y2 ****************/
98 data += MCU_BLOCK_SIZE;
99 uvlc_read_block_unquantize( controller, data, controller->quant, mb->num_coeff_y2 );
101 out += MCU_BLOCK_SIZE;
103 /**************** Block Y3 ****************/
104 data += MCU_BLOCK_SIZE;
105 uvlc_read_block_unquantize( controller, data, controller->quant, mb->num_coeff_y3 );
107 out += MCU_BLOCK_SIZE;
109 /**************** Block CB ****************/
110 data += MCU_BLOCK_SIZE;
111 uvlc_read_block_unquantize( controller, data, controller->quant, mb->num_coeff_cb );
113 out += MCU_BLOCK_SIZE;
115 /**************** Block CR ****************/
116 data += MCU_BLOCK_SIZE;
117 uvlc_read_block_unquantize( controller, data, controller->quant, mb->num_coeff_cr );
119 out += MCU_BLOCK_SIZE;
127 C_RESULT uvlc_decode_blockline( video_controller_t* controller, vp_api_picture_t* picture, bool_t* got_image )
129 video_codec_t* video_codec;
130 vp_api_picture_t blockline = { 0 };
132 uint16_t *out = NULL;
133 int32_t num_macro_blocks = 0;
134 video_macroblock_t* macroblock = NULL;
135 video_picture_context_t blockline_ctx;
138 controller->mode = VIDEO_DECODE;
139 video_codec = controller->video_codec;
141 blockline = *picture;
142 blockline.height = MB_HEIGHT_Y;
143 blockline.complete = 1;
144 blockline.vision_complete = 0;
146 picture->complete = controller->picture_complete;
148 blockline_ctx.y_woffset = blockline.y_line_size;
149 blockline_ctx.c_woffset = blockline.cb_line_size;
150 blockline_ctx.y_hoffset = blockline.y_line_size * MCU_HEIGHT;
152 // At least a complete blockline is found
153 while( !controller->picture_complete && controller->in_stream.index <= (controller->in_stream.used >> 2) )
155 uvlc_unpack_controller( controller );
157 if( !controller->picture_complete )
159 blockline.blockline = controller->blockline;
161 blockline_ctx.y_src = picture->y_buf + blockline.blockline * MB_HEIGHT_Y * picture->y_line_size;
162 blockline_ctx.cb_src = picture->cb_buf + blockline.blockline * MB_HEIGHT_C * picture->cb_line_size;
163 blockline_ctx.cr_src = picture->cr_buf + blockline.blockline * MB_HEIGHT_C * picture->cr_line_size;
165 picture->blockline = controller->blockline;
166 num_macro_blocks = controller->mb_blockline;
168 macroblock = &controller->cache_mbs[0];
169 gobs = &controller->gobs[controller->blockline];
170 out = (uint16_t*) gobs->macroblocks->data;
172 if( gobs->quant != controller->quant )
174 controller->quant = gobs->quant;
175 video_quantizer_update( controller );
178 while( num_macro_blocks > 0 )
180 in = ¯oblock->data[0];
182 out = uvlc_read_mb_layer_unquantize( controller, macroblock, out );
187 video_blockline_from_macro_blocks(&blockline_ctx, gobs->macroblocks->data, controller->mb_blockline, picture->format);
189 // Update controller according to video statistics
190 video_controller_update( controller, controller->picture_complete );
194 if( controller->picture_complete )
196 picture->complete = controller->picture_complete;
197 picture->blockline = 0;
199 controller->picture_complete = 0;
200 controller->in_stream.length = 32;
201 //controller->num_frames++;
207 controller->in_stream.used = 0;
208 controller->in_stream.index = 0;
215 #endif // TARGET_CPU_ARM == 1