Home | History | Annotate | Download | only in decoder
      1 /*
      2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  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
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     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"
     17 #include "detokenize.h"
     18 
     19 #define BOOL_DATA UINT8
     20 
     21 #define OCB_X PREV_COEF_CONTEXTS * ENTROPY_NODES
     22 DECLARE_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};
     23 #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"
     37 typedef struct
     38 {
     39     INT16         min_val;
     40     INT16         Length;
     41     UINT8 Probs[12];
     42 } TOKENEXTRABITS;
     43 */
     44 
     45 DECLARE_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 
     62 void vp8_reset_mb_tokens_context(MACROBLOCKD *x)
     63 {
     64     /* Clear entropy contexts for Y2 blocks */
     65     if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
     66     {
     67         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);
     74     }
     75 }
     76 
     77 #if CONFIG_ARM_ASM_DETOK
     78 // mashup of vp8_block2left and vp8_block2above so we only need one pointer
     79 // for the assembly version.
     80 DECLARE_ALIGNED(16, const UINT8, vp8_block2leftabove[25*2]) =
     81 {
     82     //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
     86 };
     87 
     88 void 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;
     94     dx->detoken.ptr_block2leftabove = vp8_block2leftabove;
     95     dx->detoken.ptr_coef_bands_x = vp8_coef_bands_x;
     96     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 
    107 DECLARE_ALIGNED(16, extern const unsigned char, vp8dx_bitreader_norm[256]);
    108 #define FILL \
    109     if(count < 0) \
    110         VP8DX_BOOL_DECODER_FILL(count, value, bufptr, bufend);
    111 
    112 #define NORMALIZE \
    113     /*if(range < 0x80)*/                            \
    114     { \
    115         shift = vp8dx_bitreader_norm[range]; \
    116         range <<= shift; \
    117         value <<= shift; \
    118         count -= shift; \
    119     }
    120 
    121 #define DECODE_AND_APPLYSIGN(value_to_sign) \
    122     split = (range + 1) >> 1; \
    123     bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); \
    124     FILL \
    125     if ( value < bigsplit ) \
    126     { \
    127         range = split; \
    128         v= value_to_sign; \
    129     } \
    130     else \
    131     { \
    132         range = range-split; \
    133         value = value-bigsplit; \
    134         v = -value_to_sign; \
    135     } \
    136     range +=range;                   \
    137     value +=value;                   \
    138     count--;
    139 
    140 #define DECODE_AND_BRANCH_IF_ZERO(probability,branch) \
    141     { \
    142         split = 1 +  ((( probability*(range-1) ) )>> 8); \
    143         bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); \
    144         FILL \
    145         if ( value < bigsplit ) \
    146         { \
    147             range = split; \
    148             NORMALIZE \
    149             goto branch; \
    150         } \
    151         value -= bigsplit; \
    152         range = range - split; \
    153         NORMALIZE \
    154     }
    155 
    156 #define DECODE_AND_LOOP_IF_ZERO(probability,branch) \
    157     { \
    158         split = 1 + ((( probability*(range-1) ) ) >> 8); \
    159         bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); \
    160         FILL \
    161         if ( value < bigsplit ) \
    162         { \
    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         } \
    172         value -= bigsplit; \
    173         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); \
    190     bigsplit = (VP8_BD_VALUE)split << (VP8_BD_VALUE_SIZE - 8); \
    191     FILL \
    192     if(value >= bigsplit)\
    193     {\
    194         range = range-split;\
    195         value = value-bigsplit;\
    196         val += ((UINT16)1<<bits_count);\
    197     }\
    198     else\
    199     {\
    200         range = split;\
    201     }\
    202     NORMALIZE
    203 
    204 #if CONFIG_ARM_ASM_DETOK
    205 int 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 
    216     if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
    217     {
    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     {
    226         x->eobs[i] = dx->detoken.eob[i];
    227         eobtotal += dx->detoken.eob[i];
    228     }
    229 
    230     return eobtotal;
    231 }
    232 #else
    233 int vp8_decode_mb_tokens(VP8D_COMP *dx, MACROBLOCKD *x)
    234 {
    235     ENTROPY_CONTEXT *A = (ENTROPY_CONTEXT *)x->above_context;
    236     ENTROPY_CONTEXT *L = (ENTROPY_CONTEXT *)x->left_context;
    237     const VP8_COMMON *const oc = & dx->common;
    238 
    239     BOOL_DECODER *bc = x->current_bc;
    240 
    241     char *eobs = x->eobs;
    242 
    243     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;
    252     const BOOL_DATA *bufend;
    253     register unsigned int range;
    254     VP8_BD_VALUE value;
    255     const int *scan;
    256     register unsigned int shift;
    257     UINT32 split;
    258     VP8_BD_VALUE bigsplit;
    259     INT16 *qcoeff_ptr;
    260 
    261     const vp8_prob *coef_probs;
    262     int type;
    263     int stop;
    264     INT16 val, bits_count;
    265     INT16 c;
    266     INT16 v;
    267     const vp8_prob *Prob;
    268 
    269     type = 3;
    270     i = 0;
    271     stop = 16;
    272 
    273     scan = vp8_default_zig_zag1d;
    274     qcoeff_ptr = &x->qcoeff[0];
    275 
    276     if (x->mode_info_context->mbmi.mode != B_PRED && x->mode_info_context->mbmi.mode != SPLITMV)
    277     {
    278         i = 24;
    279         stop = 24;
    280         type = 1;
    281         qcoeff_ptr += 24*16;
    282         eobtotal -= 16;
    283     }
    284 
    285     bufend  = bc->user_buffer_end;
    286     bufptr  = bc->user_buffer;
    287     value   = bc->value;
    288     count   = bc->count;
    289     range   = bc->range;
    290 
    291 
    292     coef_probs = oc->fc.coef_probs [type] [ 0 ] [0];
    293 
    294 BLOCK_LOOP:
    295     a = A + vp8_block2above[i];
    296     l = L + vp8_block2left[i];
    297 
    298     c = (INT16)(!type);
    299 
    300 //    Dest = ((A)!=0) + ((B)!=0);
    301     VP8_COMBINEENTROPYCONTEXTS(v, *a, *l);
    302     Prob = coef_probs;
    303     Prob += v * ENTROPY_NODES;
    304 
    305 DO_WHILE:
    306     Prob += vp8_coef_bands_x[c];
    307     DECODE_AND_BRANCH_IF_ZERO(Prob[EOB_CONTEXT_NODE], BLOCK_FINISHED);
    308 
    309 CHECK_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 
    328 CAT_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 
    337 CAT_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 
    346 CAT_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 
    353 HIGH_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 
    361 CAT_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 
    366 LOW_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 
    371 THREE_CONTEXT_NODE_0_:
    372     DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(3);
    373 
    374 TWO_CONTEXT_NODE_0_:
    375     DECODE_SIGN_WRITE_COEFF_AND_CHECK_EXIT(2);
    376 
    377 ONE_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;
    389 BLOCK_FINISHED:
    390     *a = *l = ((eobs[i] = c) != !type);   // any nonzero data?
    391     eobtotal += c;
    392     qcoeff_ptr += 16;
    393 
    394     i++;
    395 
    396     if (i < stop)
    397         goto BLOCK_LOOP;
    398 
    399     if (i == 25)
    400     {
    401         type = 0;
    402         i = 0;
    403         stop = 16;
    404         coef_probs = oc->fc.coef_probs [type] [ 0 ] [0];
    405         qcoeff_ptr -= (24*16 + 16);
    406         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 
    417     FILL
    418     bc->user_buffer = bufptr;
    419     bc->value = value;
    420     bc->count = count;
    421     bc->range = range;
    422     return eobtotal;
    423 
    424 }
    425 #endif //!CONFIG_ASM_DETOK
    426