Home | History | Annotate | Download | only in common
      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 #include "vp9/common/vp9_onyxc_int.h"
     12 #include "vp9/common/vp9_entropymv.h"
     13 
     14 #define MV_COUNT_SAT 20
     15 #define MV_MAX_UPDATE_FACTOR 128
     16 
     17 // Integer pel reference mv threshold for use of high-precision 1/8 mv
     18 #define COMPANDED_MVREF_THRESH 8
     19 
     20 const vp9_tree_index vp9_mv_joint_tree[TREE_SIZE(MV_JOINTS)] = {
     21   -MV_JOINT_ZERO, 2,
     22   -MV_JOINT_HNZVZ, 4,
     23   -MV_JOINT_HZVNZ, -MV_JOINT_HNZVNZ
     24 };
     25 
     26 const vp9_tree_index vp9_mv_class_tree[TREE_SIZE(MV_CLASSES)] = {
     27   -MV_CLASS_0, 2,
     28   -MV_CLASS_1, 4,
     29   6, 8,
     30   -MV_CLASS_2, -MV_CLASS_3,
     31   10, 12,
     32   -MV_CLASS_4, -MV_CLASS_5,
     33   -MV_CLASS_6, 14,
     34   16, 18,
     35   -MV_CLASS_7, -MV_CLASS_8,
     36   -MV_CLASS_9, -MV_CLASS_10,
     37 };
     38 
     39 const vp9_tree_index vp9_mv_class0_tree[TREE_SIZE(CLASS0_SIZE)] = {
     40   -0, -1,
     41 };
     42 
     43 const vp9_tree_index vp9_mv_fp_tree[TREE_SIZE(MV_FP_SIZE)] = {
     44   -0, 2,
     45   -1, 4,
     46   -2, -3
     47 };
     48 
     49 static const nmv_context default_nmv_context = {
     50   {32, 64, 96},
     51   {
     52     { // Vertical component
     53       128,                                                  // sign
     54       {224, 144, 192, 168, 192, 176, 192, 198, 198, 245},   // class
     55       {216},                                                // class0
     56       {136, 140, 148, 160, 176, 192, 224, 234, 234, 240},   // bits
     57       {{128, 128, 64}, {96, 112, 64}},                      // class0_fp
     58       {64, 96, 64},                                         // fp
     59       160,                                                  // class0_hp bit
     60       128,                                                  // hp
     61     },
     62     { // Horizontal component
     63       128,                                                  // sign
     64       {216, 128, 176, 160, 176, 176, 192, 198, 198, 208},   // class
     65       {208},                                                // class0
     66       {136, 140, 148, 160, 176, 192, 224, 234, 234, 240},   // bits
     67       {{128, 128, 64}, {96, 112, 64}},                      // class0_fp
     68       {64, 96, 64},                                         // fp
     69       160,                                                  // class0_hp bit
     70       128,                                                  // hp
     71     }
     72   },
     73 };
     74 
     75 static const uint8_t log_in_base_2[] = {
     76   0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
     77   4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
     78   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6,
     79   6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
     80   6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
     81   6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
     82   7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
     83   7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
     84   7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
     85   7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
     86   7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
     87   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
     88   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
     89   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
     90   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
     91   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
     92   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
     93   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
     94   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
     95   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
     96   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
     97   8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
     98   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
     99   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    100   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    101   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    102   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    103   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    104   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    105   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    106   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    107   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    108   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    109   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    110   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    111   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    112   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    113   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    114   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    115   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    116   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    117   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
    118   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10
    119 };
    120 
    121 static INLINE int mv_class_base(MV_CLASS_TYPE c) {
    122   return c ? CLASS0_SIZE << (c + 2) : 0;
    123 }
    124 
    125 MV_CLASS_TYPE vp9_get_mv_class(int z, int *offset) {
    126   const MV_CLASS_TYPE c = (z >= CLASS0_SIZE * 4096) ?
    127       MV_CLASS_10 : (MV_CLASS_TYPE)log_in_base_2[z >> 3];
    128   if (offset)
    129     *offset = z - mv_class_base(c);
    130   return c;
    131 }
    132 
    133 int vp9_use_mv_hp(const MV *ref) {
    134   return (abs(ref->row) >> 3) < COMPANDED_MVREF_THRESH &&
    135          (abs(ref->col) >> 3) < COMPANDED_MVREF_THRESH;
    136 }
    137 
    138 int vp9_get_mv_mag(MV_CLASS_TYPE c, int offset) {
    139   return mv_class_base(c) + offset;
    140 }
    141 
    142 static void inc_mv_component(int v, nmv_component_counts *comp_counts,
    143                              int incr, int usehp) {
    144   int s, z, c, o, d, e, f;
    145   assert(v != 0);            /* should not be zero */
    146   s = v < 0;
    147   comp_counts->sign[s] += incr;
    148   z = (s ? -v : v) - 1;       /* magnitude - 1 */
    149 
    150   c = vp9_get_mv_class(z, &o);
    151   comp_counts->classes[c] += incr;
    152 
    153   d = (o >> 3);               /* int mv data */
    154   f = (o >> 1) & 3;           /* fractional pel mv data */
    155   e = (o & 1);                /* high precision mv data */
    156 
    157   if (c == MV_CLASS_0) {
    158     comp_counts->class0[d] += incr;
    159     comp_counts->class0_fp[d][f] += incr;
    160     comp_counts->class0_hp[e] += usehp * incr;
    161   } else {
    162     int i;
    163     int b = c + CLASS0_BITS - 1;  // number of bits
    164     for (i = 0; i < b; ++i)
    165       comp_counts->bits[i][((d >> i) & 1)] += incr;
    166     comp_counts->fp[f] += incr;
    167     comp_counts->hp[e] += usehp * incr;
    168   }
    169 }
    170 
    171 void vp9_inc_mv(const MV *mv, nmv_context_counts *counts) {
    172   if (counts != NULL) {
    173     const MV_JOINT_TYPE j = vp9_get_mv_joint(mv);
    174     ++counts->joints[j];
    175 
    176     if (mv_joint_vertical(j)) {
    177       inc_mv_component(mv->row, &counts->comps[0], 1, 1);
    178     }
    179 
    180     if (mv_joint_horizontal(j)) {
    181       inc_mv_component(mv->col, &counts->comps[1], 1, 1);
    182     }
    183   }
    184 }
    185 
    186 static vp9_prob adapt_prob(vp9_prob prep, const unsigned int ct[2]) {
    187   return merge_probs(prep, ct, MV_COUNT_SAT, MV_MAX_UPDATE_FACTOR);
    188 }
    189 
    190 static void adapt_probs(const vp9_tree_index *tree, const vp9_prob *pre_probs,
    191                         const unsigned int *counts, vp9_prob *probs) {
    192   vp9_tree_merge_probs(tree, pre_probs, counts, MV_COUNT_SAT,
    193                        MV_MAX_UPDATE_FACTOR, probs);
    194 }
    195 
    196 void vp9_adapt_mv_probs(VP9_COMMON *cm, int allow_hp) {
    197   int i, j;
    198 
    199   nmv_context *fc = &cm->fc.nmvc;
    200   const nmv_context *pre_fc = &cm->frame_contexts[cm->frame_context_idx].nmvc;
    201   const nmv_context_counts *counts = &cm->counts.mv;
    202 
    203   adapt_probs(vp9_mv_joint_tree, pre_fc->joints, counts->joints, fc->joints);
    204 
    205   for (i = 0; i < 2; ++i) {
    206     nmv_component *comp = &fc->comps[i];
    207     const nmv_component *pre_comp = &pre_fc->comps[i];
    208     const nmv_component_counts *c = &counts->comps[i];
    209 
    210     comp->sign = adapt_prob(pre_comp->sign, c->sign);
    211     adapt_probs(vp9_mv_class_tree, pre_comp->classes, c->classes,
    212                 comp->classes);
    213     adapt_probs(vp9_mv_class0_tree, pre_comp->class0, c->class0, comp->class0);
    214 
    215     for (j = 0; j < MV_OFFSET_BITS; ++j)
    216       comp->bits[j] = adapt_prob(pre_comp->bits[j], c->bits[j]);
    217 
    218     for (j = 0; j < CLASS0_SIZE; ++j)
    219       adapt_probs(vp9_mv_fp_tree, pre_comp->class0_fp[j], c->class0_fp[j],
    220                   comp->class0_fp[j]);
    221 
    222     adapt_probs(vp9_mv_fp_tree, pre_comp->fp, c->fp, comp->fp);
    223 
    224     if (allow_hp) {
    225       comp->class0_hp = adapt_prob(pre_comp->class0_hp, c->class0_hp);
    226       comp->hp = adapt_prob(pre_comp->hp, c->hp);
    227     }
    228   }
    229 }
    230 
    231 void vp9_init_mv_probs(VP9_COMMON *cm) {
    232   cm->fc.nmvc = default_nmv_context;
    233 }
    234