blob: 65c7d5370c196aeb871066383fa92b8f128813b3 [file] [log] [blame]
John Koleszar0ea50ce2010-05-18 11:58:33 -04001/*
John Koleszarc2140b82010-09-09 08:16:39 -04002 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar0ea50ce2010-05-18 11:58:33 -04003 *
John Koleszar94c52e42010-06-18 12:39:21 -04004 * Use of this source code is governed by a BSD-style license
John Koleszar09202d82010-06-04 16:19:40 -04005 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
John Koleszar94c52e42010-06-18 12:39:21 -04007 * in the file PATENTS. All contributing project authors may
John Koleszar09202d82010-06-04 16:19:40 -04008 * be found in the AUTHORS file in the root of the source tree.
John Koleszar0ea50ce2010-05-18 11:58:33 -04009 */
10
11
12#include "type_aliases.h"
13#include "blockd.h"
14#include "onyxd_int.h"
15#include "vpx_mem/vpx_mem.h"
16#include "vpx_ports/mem.h"
Johann96027992010-08-12 09:05:37 -040017#include "detokenize.h"
John Koleszar0ea50ce2010-05-18 11:58:33 -040018
John Koleszar0ea50ce2010-05-18 11:58:33 -040019#define BOOL_DATA UINT8
20
21#define OCB_X PREV_COEF_CONTEXTS * ENTROPY_NODES
Scott LaVarnwaye85e6312010-08-31 10:49:57 -040022DECLARE_ALIGNED(16, UINT8, vp8_coef_bands_x[16]) = { 0, 1 * OCB_X, 2 * OCB_X, 3 * OCB_X, 6 * OCB_X, 4 * OCB_X, 5 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 6 * OCB_X, 7 * OCB_X};
John Koleszar0ea50ce2010-05-18 11:58:33 -040023#define EOB_CONTEXT_NODE 0
24#define ZERO_CONTEXT_NODE 1
25#define ONE_CONTEXT_NODE 2
26#define LOW_VAL_CONTEXT_NODE 3
27#define TWO_CONTEXT_NODE 4
28#define THREE_CONTEXT_NODE 5
29#define HIGH_LOW_CONTEXT_NODE 6
30#define CAT_ONE_CONTEXT_NODE 7
31#define CAT_THREEFOUR_CONTEXT_NODE 8
32#define CAT_THREE_CONTEXT_NODE 9
33#define CAT_FIVE_CONTEXT_NODE 10
34
35/*
36//the definition is put in "onyxd_int.h"
37typedef struct
38{
39 INT16 min_val;
40 INT16 Length;
41 UINT8 Probs[12];
42} TOKENEXTRABITS;
43*/
44
45DECLARE_ALIGNED(16, static const TOKENEXTRABITS, vp8d_token_extra_bits2[MAX_ENTROPY_TOKENS]) =
46{
47 { 0, -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, //ZERO_TOKEN
48 { 1, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, //ONE_TOKEN
49 { 2, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, //TWO_TOKEN
50 { 3, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, //THREE_TOKEN
51 { 4, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, //FOUR_TOKEN
52 { 5, 0, { 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, //DCT_VAL_CATEGORY1
53 { 7, 1, { 145, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, //DCT_VAL_CATEGORY2
54 { 11, 2, { 140, 148, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, //DCT_VAL_CATEGORY3
55 { 19, 3, { 135, 140, 155, 176, 0, 0, 0, 0, 0, 0, 0, 0 } }, //DCT_VAL_CATEGORY4
56 { 35, 4, { 130, 134, 141, 157, 180, 0, 0, 0, 0, 0, 0, 0 } }, //DCT_VAL_CATEGORY5
57 { 67, 10, { 129, 130, 133, 140, 153, 177, 196, 230, 243, 254, 254, 0 } }, //DCT_VAL_CATEGORY6
58 { 0, -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, // EOB TOKEN
59};
60
61
62void vp8_reset_mb_tokens_context(MACROBLOCKD *x)
63{
Yunqing Wangd33bf3d2010-05-28 14:34:39 -040064 /* Clear entropy contexts for Y2 blocks */
Scott LaVarnway9c7a0092010-08-12 16:25:43 -040065 if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
John Koleszar0ea50ce2010-05-18 11:58:33 -040066 {
Scott LaVarnwaye85e6312010-08-31 10:49:57 -040067 vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
68 vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES));
69 }
70 else
71 {
72 vpx_memset(x->above_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
73 vpx_memset(x->left_context, 0, sizeof(ENTROPY_CONTEXT_PLANES)-1);
John Koleszar0ea50ce2010-05-18 11:58:33 -040074 }
John Koleszar0ea50ce2010-05-18 11:58:33 -040075}
Johann96027992010-08-12 09:05:37 -040076
77#if CONFIG_ARM_ASM_DETOK
Johann0b94f5d2010-08-26 16:11:30 -040078// mashup of vp8_block2left and vp8_block2above so we only need one pointer
79// for the assembly version.
80DECLARE_ALIGNED(16, const UINT8, vp8_block2leftabove[25*2]) =
Johann96027992010-08-12 09:05:37 -040081{
Johann0b94f5d2010-08-26 16:11:30 -040082 //vp8_block2left
83 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
84 //vp8_block2above
85 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 4, 5, 6, 7, 6, 7, 8
Johann96027992010-08-12 09:05:37 -040086};
87
88void vp8_init_detokenizer(VP8D_COMP *dx)
89{
90 const VP8_COMMON *const oc = & dx->common;
91 MACROBLOCKD *x = & dx->mb;
92
93 dx->detoken.vp8_coef_tree_ptr = vp8_coef_tree;
Johann0b94f5d2010-08-26 16:11:30 -040094 dx->detoken.ptr_block2leftabove = vp8_block2leftabove;
95 dx->detoken.ptr_coef_bands_x = vp8_coef_bands_x;
Johann96027992010-08-12 09:05:37 -040096 dx->detoken.scan = vp8_default_zig_zag1d;
97 dx->detoken.teb_base_ptr = vp8d_token_extra_bits2;
98 dx->detoken.qcoeff_start_ptr = &x->qcoeff[0];
99
100 dx->detoken.coef_probs[0] = (oc->fc.coef_probs [0] [ 0 ] [0]);
101 dx->detoken.coef_probs[1] = (oc->fc.coef_probs [1] [ 0 ] [0]);
102 dx->detoken.coef_probs[2] = (oc->fc.coef_probs [2] [ 0 ] [0]);
103 dx->detoken.coef_probs[3] = (oc->fc.coef_probs [3] [ 0 ] [0]);
104}
105#endif
106
Scott LaVarnwaye85e6312010-08-31 10:49:57 -0400107DECLARE_ALIGNED(16, extern const unsigned char, vp8dx_bitreader_norm[256]);
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400108#define FILL \
109 if(count < 0) \
110 VP8DX_BOOL_DECODER_FILL(count, value, bufptr, bufend);
111
John Koleszar0ea50ce2010-05-18 11:58:33 -0400112#define NORMALIZE \
113 /*if(range < 0x80)*/ \
114 { \
115 shift = vp8dx_bitreader_norm[range]; \
116 range <<= shift; \
117 value <<= shift; \
118 count -= shift; \
John Koleszar0ea50ce2010-05-18 11:58:33 -0400119 }
120
121#define DECODE_AND_APPLYSIGN(value_to_sign) \
122 split = (range + 1) >> 1; \
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400123 bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); \
124 FILL \
125 if ( value < bigsplit ) \
John Koleszar0ea50ce2010-05-18 11:58:33 -0400126 { \
127 range = split; \
128 v= value_to_sign; \
129 } \
130 else \
131 { \
132 range = range-split; \
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400133 value = value-bigsplit; \
John Koleszar0ea50ce2010-05-18 11:58:33 -0400134 v = -value_to_sign; \
135 } \
136 range +=range; \
137 value +=value; \
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400138 count--;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400139
140#define DECODE_AND_BRANCH_IF_ZERO(probability,branch) \
141 { \
142 split = 1 + ((( probability*(range-1) ) )>> 8); \
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400143 bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); \
144 FILL \
145 if ( value < bigsplit ) \
John Koleszar0ea50ce2010-05-18 11:58:33 -0400146 { \
147 range = split; \
148 NORMALIZE \
149 goto branch; \
150 } \
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400151 value -= bigsplit; \
John Koleszar0ea50ce2010-05-18 11:58:33 -0400152 range = range - split; \
153 NORMALIZE \
154 }
155
156#define DECODE_AND_LOOP_IF_ZERO(probability,branch) \
157 { \
158 split = 1 + ((( probability*(range-1) ) ) >> 8); \
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400159 bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); \
160 FILL \
161 if ( value < bigsplit ) \
John Koleszar0ea50ce2010-05-18 11:58:33 -0400162 { \
163 range = split; \
164 NORMALIZE \
165 Prob = coef_probs; \
166 if(c<15) {\
167 ++c; \
168 Prob += vp8_coef_bands_x[c]; \
169 goto branch; \
170 } goto BLOCK_FINISHED; /*for malformed input */\
171 } \
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400172 value -= bigsplit; \
John Koleszar0ea50ce2010-05-18 11:58:33 -0400173 range = range - split; \
174 NORMALIZE \
175 }
176
177#define DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(val) \
178 DECODE_AND_APPLYSIGN(val) \
179 Prob = coef_probs + (ENTROPY_NODES*2); \
180 if(c < 15){\
181 qcoeff_ptr [ scan[c] ] = (INT16) v; \
182 ++c; \
183 goto DO_WHILE; }\
184 qcoeff_ptr [ scan[15] ] = (INT16) v; \
185 goto BLOCK_FINISHED;
186
187
188#define DECODE_EXTRABIT_AND_ADJUST_VAL(t,bits_count)\
189 split = 1 + (((range-1) * vp8d_token_extra_bits2[t].Probs[bits_count]) >> 8); \
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400190 bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); \
191 FILL \
192 if(value >= bigsplit)\
John Koleszar0ea50ce2010-05-18 11:58:33 -0400193 {\
194 range = range-split;\
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400195 value = value-bigsplit;\
John Koleszar0ea50ce2010-05-18 11:58:33 -0400196 val += ((UINT16)1<<bits_count);\
197 }\
198 else\
199 {\
200 range = split;\
201 }\
202 NORMALIZE
203
Johann96027992010-08-12 09:05:37 -0400204#if CONFIG_ARM_ASM_DETOK
205int vp8_decode_mb_tokens(VP8D_COMP *dx, MACROBLOCKD *x)
206{
207 int eobtotal = 0;
208 int i, type;
209
210 dx->detoken.current_bc = x->current_bc;
211 dx->detoken.A = x->above_context;
212 dx->detoken.L = x->left_context;
213
214 type = 3;
215
Johannd73217a2010-08-23 13:35:26 -0400216 if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
Johann96027992010-08-12 09:05:37 -0400217 {
218 type = 1;
219 eobtotal -= 16;
220 }
221
222 vp8_decode_mb_tokens_v6(&dx->detoken, type);
223
224 for (i = 0; i < 25; i++)
225 {
Johannd73217a2010-08-23 13:35:26 -0400226 x->eobs[i] = dx->detoken.eob[i];
Johann96027992010-08-12 09:05:37 -0400227 eobtotal += dx->detoken.eob[i];
228 }
229
230 return eobtotal;
231}
232#else
John Koleszar0ea50ce2010-05-18 11:58:33 -0400233int vp8_decode_mb_tokens(VP8D_COMP *dx, MACROBLOCKD *x)
234{
Scott LaVarnwaye85e6312010-08-31 10:49:57 -0400235 ENTROPY_CONTEXT *A = (ENTROPY_CONTEXT *)x->above_context;
236 ENTROPY_CONTEXT *L = (ENTROPY_CONTEXT *)x->left_context;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400237 const VP8_COMMON *const oc = & dx->common;
238
239 BOOL_DECODER *bc = x->current_bc;
240
Fritz Koenig93c32a52010-08-20 10:58:19 -0700241 char *eobs = x->eobs;
242
John Koleszar0ea50ce2010-05-18 11:58:33 -0400243 ENTROPY_CONTEXT *a;
244 ENTROPY_CONTEXT *l;
245 int i;
246
247 int eobtotal = 0;
248
249 register int count;
250
251 const BOOL_DATA *bufptr;
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400252 const BOOL_DATA *bufend;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400253 register unsigned int range;
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400254 VP8_BD_VALUE value;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400255 const int *scan;
256 register unsigned int shift;
257 UINT32 split;
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400258 VP8_BD_VALUE bigsplit;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400259 INT16 *qcoeff_ptr;
260
261 const vp8_prob *coef_probs;
262 int type;
263 int stop;
264 INT16 val, bits_count;
265 INT16 c;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400266 INT16 v;
267 const vp8_prob *Prob;
268
John Koleszar0ea50ce2010-05-18 11:58:33 -0400269 type = 3;
270 i = 0;
271 stop = 16;
272
Scott LaVarnwaye85e6312010-08-31 10:49:57 -0400273 scan = vp8_default_zig_zag1d;
274 qcoeff_ptr = &x->qcoeff[0];
275
Scott LaVarnway9c7a0092010-08-12 16:25:43 -0400276 if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
John Koleszar0ea50ce2010-05-18 11:58:33 -0400277 {
278 i = 24;
279 stop = 24;
280 type = 1;
Scott LaVarnwaye85e6312010-08-31 10:49:57 -0400281 qcoeff_ptr += 24*16;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400282 eobtotal -= 16;
283 }
John Koleszar0ea50ce2010-05-18 11:58:33 -0400284
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400285 bufend = bc->user_buffer_end;
286 bufptr = bc->user_buffer;
287 value = bc->value;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400288 count = bc->count;
289 range = bc->range;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400290
291
292 coef_probs = oc->fc.coef_probs [type] [ 0 ] [0];
293
294BLOCK_LOOP:
Scott LaVarnwaye85e6312010-08-31 10:49:57 -0400295 a = A + vp8_block2above[i];
296 l = L + vp8_block2left[i];
297
John Koleszar0ea50ce2010-05-18 11:58:33 -0400298 c = (INT16)(!type);
299
Scott LaVarnwaye85e6312010-08-31 10:49:57 -0400300// Dest = ((A)!=0) + ((B)!=0);
301 VP8_COMBINEENTROPYCONTEXTS(v, *a, *l);
John Koleszar0ea50ce2010-05-18 11:58:33 -0400302 Prob = coef_probs;
Scott LaVarnwaye85e6312010-08-31 10:49:57 -0400303 Prob += v * ENTROPY_NODES;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400304
305DO_WHILE:
306 Prob += vp8_coef_bands_x[c];
307 DECODE_AND_BRANCH_IF_ZERO(Prob[EOB_CONTEXT_NODE], BLOCK_FINISHED);
308
309CHECK_0_:
310 DECODE_AND_LOOP_IF_ZERO(Prob[ZERO_CONTEXT_NODE], CHECK_0_);
311 DECODE_AND_BRANCH_IF_ZERO(Prob[ONE_CONTEXT_NODE], ONE_CONTEXT_NODE_0_);
312 DECODE_AND_BRANCH_IF_ZERO(Prob[LOW_VAL_CONTEXT_NODE], LOW_VAL_CONTEXT_NODE_0_);
313 DECODE_AND_BRANCH_IF_ZERO(Prob[HIGH_LOW_CONTEXT_NODE], HIGH_LOW_CONTEXT_NODE_0_);
314 DECODE_AND_BRANCH_IF_ZERO(Prob[CAT_THREEFOUR_CONTEXT_NODE], CAT_THREEFOUR_CONTEXT_NODE_0_);
315 DECODE_AND_BRANCH_IF_ZERO(Prob[CAT_FIVE_CONTEXT_NODE], CAT_FIVE_CONTEXT_NODE_0_);
316 val = vp8d_token_extra_bits2[DCT_VAL_CATEGORY6].min_val;
317 bits_count = vp8d_token_extra_bits2[DCT_VAL_CATEGORY6].Length;
318
319 do
320 {
321 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY6, bits_count);
322 bits_count -- ;
323 }
324 while (bits_count >= 0);
325
326 DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(val);
327
328CAT_FIVE_CONTEXT_NODE_0_:
329 val = vp8d_token_extra_bits2[DCT_VAL_CATEGORY5].min_val;
330 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY5, 4);
331 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY5, 3);
332 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY5, 2);
333 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY5, 1);
334 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY5, 0);
335 DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(val);
336
337CAT_THREEFOUR_CONTEXT_NODE_0_:
338 DECODE_AND_BRANCH_IF_ZERO(Prob[CAT_THREE_CONTEXT_NODE], CAT_THREE_CONTEXT_NODE_0_);
339 val = vp8d_token_extra_bits2[DCT_VAL_CATEGORY4].min_val;
340 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY4, 3);
341 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY4, 2);
342 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY4, 1);
343 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY4, 0);
344 DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(val);
345
346CAT_THREE_CONTEXT_NODE_0_:
347 val = vp8d_token_extra_bits2[DCT_VAL_CATEGORY3].min_val;
348 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY3, 2);
349 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY3, 1);
350 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY3, 0);
351 DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(val);
352
353HIGH_LOW_CONTEXT_NODE_0_:
354 DECODE_AND_BRANCH_IF_ZERO(Prob[CAT_ONE_CONTEXT_NODE], CAT_ONE_CONTEXT_NODE_0_);
355
356 val = vp8d_token_extra_bits2[DCT_VAL_CATEGORY2].min_val;
357 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY2, 1);
358 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY2, 0);
359 DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(val);
360
361CAT_ONE_CONTEXT_NODE_0_:
362 val = vp8d_token_extra_bits2[DCT_VAL_CATEGORY1].min_val;
363 DECODE_EXTRABIT_AND_ADJUST_VAL(DCT_VAL_CATEGORY1, 0);
364 DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(val);
365
366LOW_VAL_CONTEXT_NODE_0_:
367 DECODE_AND_BRANCH_IF_ZERO(Prob[TWO_CONTEXT_NODE], TWO_CONTEXT_NODE_0_);
368 DECODE_AND_BRANCH_IF_ZERO(Prob[THREE_CONTEXT_NODE], THREE_CONTEXT_NODE_0_);
369 DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(4);
370
371THREE_CONTEXT_NODE_0_:
372 DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(3);
373
374TWO_CONTEXT_NODE_0_:
375 DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(2);
376
377ONE_CONTEXT_NODE_0_:
378 DECODE_AND_APPLYSIGN(1);
379 Prob = coef_probs + ENTROPY_NODES;
380
381 if (c < 15)
382 {
383 qcoeff_ptr [ scan[c] ] = (INT16) v;
384 ++c;
385 goto DO_WHILE;
386 }
387
388 qcoeff_ptr [ scan[15] ] = (INT16) v;
389BLOCK_FINISHED:
Scott LaVarnwaye85e6312010-08-31 10:49:57 -0400390 *a = *l = ((eobs[i] = c) != !type); // any nonzero data?
Fritz Koenig93c32a52010-08-20 10:58:19 -0700391 eobtotal += c;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400392 qcoeff_ptr += 16;
393
394 i++;
395
396 if (i < stop)
397 goto BLOCK_LOOP;
398
399 if (i == 25)
400 {
John Koleszar0ea50ce2010-05-18 11:58:33 -0400401 type = 0;
402 i = 0;
403 stop = 16;
404 coef_probs = oc->fc.coef_probs [type] [ 0 ] [0];
Scott LaVarnwaye85e6312010-08-31 10:49:57 -0400405 qcoeff_ptr -= (24*16 + 16);
John Koleszar0ea50ce2010-05-18 11:58:33 -0400406 goto BLOCK_LOOP;
407 }
408
409 if (i == 16)
410 {
411 type = 2;
412 coef_probs = oc->fc.coef_probs [type] [ 0 ] [0];
413 stop = 24;
414 goto BLOCK_LOOP;
415 }
416
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400417 FILL
418 bc->user_buffer = bufptr;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400419 bc->value = value;
Timothy B. Terriberryc17b62e2010-05-05 17:58:19 -0400420 bc->count = count;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400421 bc->range = range;
John Koleszar0ea50ce2010-05-18 11:58:33 -0400422 return eobtotal;
423
424}
Johann96027992010-08-12 09:05:37 -0400425#endif //!CONFIG_ASM_DETOK