blob: 32e6c9104b8fcb62b7d64c514502c7f12ef48fe4 [file] [log] [blame]
Yaowu Xuc27fc142016-08-22 16:08:15 -07001/*
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07002 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
Yaowu Xuc27fc142016-08-22 16:08:15 -07003 *
Yaowu Xu2ab7ff02016-09-02 12:04:54 -07004 * This source code is subject to the terms of the BSD 2 Clause License and
5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 * was not distributed with this source code in the LICENSE file, you can
7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 * Media Patent License 1.0 was not distributed with this source code in the
9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
Yaowu Xuc27fc142016-08-22 16:08:15 -070010 */
11
12#include "av1/common/onyxc_int.h"
13#include "av1/common/entropymv.h"
14
15// Integer pel reference mv threshold for use of high-precision 1/8 mv
16#define COMPANDED_MVREF_THRESH 8
17
Yaowu Xuf883b422016-08-30 14:01:10 -070018const aom_tree_index av1_mv_joint_tree[TREE_SIZE(MV_JOINTS)] = {
Yaowu Xuc27fc142016-08-22 16:08:15 -070019 -MV_JOINT_ZERO, 2, -MV_JOINT_HNZVZ, 4, -MV_JOINT_HZVNZ, -MV_JOINT_HNZVNZ
20};
21
22/* clang-format off */
Yaowu Xuf883b422016-08-30 14:01:10 -070023const aom_tree_index av1_mv_class_tree[TREE_SIZE(MV_CLASSES)] = {
Yaowu Xuc27fc142016-08-22 16:08:15 -070024 -MV_CLASS_0, 2,
25 -MV_CLASS_1, 4,
26 6, 8,
27 -MV_CLASS_2, -MV_CLASS_3,
28 10, 12,
29 -MV_CLASS_4, -MV_CLASS_5,
30 -MV_CLASS_6, 14,
31 16, 18,
32 -MV_CLASS_7, -MV_CLASS_8,
33 -MV_CLASS_9, -MV_CLASS_10,
34};
35/* clang-format on */
36
Yaowu Xuf883b422016-08-30 14:01:10 -070037const aom_tree_index av1_mv_class0_tree[TREE_SIZE(CLASS0_SIZE)] = {
Yaowu Xuc27fc142016-08-22 16:08:15 -070038 -0, -1,
39};
40
Yaowu Xuf883b422016-08-30 14:01:10 -070041const aom_tree_index av1_mv_fp_tree[TREE_SIZE(MV_FP_SIZE)] = { -0, 2, -1,
42 4, -2, -3 };
Yaowu Xuc27fc142016-08-22 16:08:15 -070043
44static const nmv_context default_nmv_context = {
Nathan E. Egge5f7fd7a2016-09-08 11:22:03 -040045 { 32, 64, 96 }, // joints
Timothy B. Terriberryf6c807c2017-03-25 16:09:29 -070046 { AOM_ICDF(4096), AOM_ICDF(11264), AOM_ICDF(19328), AOM_ICDF(32768),
47 0 }, // joint_cdf
Yaowu Xuc27fc142016-08-22 16:08:15 -070048 { {
49 // Vertical component
50 128, // sign
51 { 224, 144, 192, 168, 192, 176, 192, 198, 198, 245 }, // class
Timothy B. Terriberryf6c807c2017-03-25 16:09:29 -070052 { AOM_ICDF(28672), AOM_ICDF(30976), AOM_ICDF(31858), AOM_ICDF(32320),
53 AOM_ICDF(32551), AOM_ICDF(32656), AOM_ICDF(32740), AOM_ICDF(32757),
54 AOM_ICDF(32762), AOM_ICDF(32767), AOM_ICDF(32768), 0 }, // class_cdf
Nathan E. Egge476c63c2017-05-18 18:35:16 -040055 { 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
Timothy B. Terriberryf6c807c2017-03-25 16:09:29 -070059 { { AOM_ICDF(16384), AOM_ICDF(24576), AOM_ICDF(26624), AOM_ICDF(32768),
60 0 },
61 { AOM_ICDF(12288), AOM_ICDF(21248), AOM_ICDF(24128), AOM_ICDF(32768),
62 0 } }, // class0_fp_cdf
63 { AOM_ICDF(8192), AOM_ICDF(17408), AOM_ICDF(21248), AOM_ICDF(32768),
64 0 }, // fp_cdf
Nathan E. Eggecd539512017-05-16 12:00:36 -040065 160, // class0_hp bit
66 128, // hp
Thomas Davies599395e2017-07-21 18:02:48 +010067#if CONFIG_NEW_MULTISYMBOL
68 { AOM_ICDF(160 * 128), AOM_ICDF(32768), 0 },
69 { AOM_ICDF(128 * 128), AOM_ICDF(32768), 0 },
70 { AOM_ICDF(216 * 128), AOM_ICDF(32768), 0 },
71#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070072 },
73 {
74 // Horizontal component
75 128, // sign
76 { 216, 128, 176, 160, 176, 176, 192, 198, 198, 208 }, // class
Timothy B. Terriberryf6c807c2017-03-25 16:09:29 -070077 { AOM_ICDF(28672), AOM_ICDF(30976), AOM_ICDF(31858), AOM_ICDF(32320),
78 AOM_ICDF(32551), AOM_ICDF(32656), AOM_ICDF(32740), AOM_ICDF(32757),
79 AOM_ICDF(32762), AOM_ICDF(32767), AOM_ICDF(32768), 0 }, // class_cdf
Nathan E. Egge476c63c2017-05-18 18:35:16 -040080 { 208 }, // class0
81 { 136, 140, 148, 160, 176, 192, 224, 234, 234, 240 }, // bits
82 { { 128, 128, 64 }, { 96, 112, 64 } }, // class0_fp
83 { 64, 96, 64 }, // fp
Timothy B. Terriberryf6c807c2017-03-25 16:09:29 -070084 { { AOM_ICDF(16384), AOM_ICDF(24576), AOM_ICDF(26624), AOM_ICDF(32768),
85 0 },
86 { AOM_ICDF(12288), AOM_ICDF(21248), AOM_ICDF(24128), AOM_ICDF(32768),
87 0 } }, // class0_fp_cdf
88 { AOM_ICDF(8192), AOM_ICDF(17408), AOM_ICDF(21248), AOM_ICDF(32768),
89 0 }, // fp_cdf
Nathan E. Eggecd539512017-05-16 12:00:36 -040090 160, // class0_hp bit
91 128, // hp
Thomas Davies599395e2017-07-21 18:02:48 +010092#if CONFIG_NEW_MULTISYMBOL
93 { AOM_ICDF(160 * 128), AOM_ICDF(32768), 0 },
94 { AOM_ICDF(128 * 128), AOM_ICDF(32768), 0 },
95 { AOM_ICDF(216 * 128), AOM_ICDF(32768), 0 },
96#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -070097 } },
98};
99
100static const uint8_t log_in_base_2[] = {
101 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
102 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
103 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
104 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
105 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,
106 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
107 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
108 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
109 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
110 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
111 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
112 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
113 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
114 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
115 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
116 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
117 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
118 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
119 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
120 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9,
121 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
122 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
123 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
124 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
125 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
126 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
127 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
128 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
129 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
130 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
131 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
132 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
133 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
134 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
135 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
136 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
137 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
138 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
139 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
140 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10
141};
142
Yaowu Xuc27fc142016-08-22 16:08:15 -0700143static INLINE int mv_class_base(MV_CLASS_TYPE c) {
144 return c ? CLASS0_SIZE << (c + 2) : 0;
145}
146
Yaowu Xuf883b422016-08-30 14:01:10 -0700147MV_CLASS_TYPE av1_get_mv_class(int z, int *offset) {
Yaowu Xuc27fc142016-08-22 16:08:15 -0700148 const MV_CLASS_TYPE c = (z >= CLASS0_SIZE * 4096)
149 ? MV_CLASS_10
150 : (MV_CLASS_TYPE)log_in_base_2[z >> 3];
151 if (offset) *offset = z - mv_class_base(c);
152 return c;
153}
154
Yaowu Xuc27fc142016-08-22 16:08:15 -0700155static void inc_mv_component(int v, nmv_component_counts *comp_counts, int incr,
Alex Converse6b2584c2017-05-02 09:51:21 -0700156 MvSubpelPrecision precision) {
Yaowu Xuc27fc142016-08-22 16:08:15 -0700157 int s, z, c, o, d, e, f;
158 assert(v != 0); /* should not be zero */
159 s = v < 0;
160 comp_counts->sign[s] += incr;
161 z = (s ? -v : v) - 1; /* magnitude - 1 */
162
Yaowu Xuf883b422016-08-30 14:01:10 -0700163 c = av1_get_mv_class(z, &o);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700164 comp_counts->classes[c] += incr;
165
166 d = (o >> 3); /* int mv data */
167 f = (o >> 1) & 3; /* fractional pel mv data */
168 e = (o & 1); /* high precision mv data */
169
170 if (c == MV_CLASS_0) {
171 comp_counts->class0[d] += incr;
RogerZhou3b635242017-09-19 10:06:46 -0700172#if CONFIG_INTRABC || CONFIG_AMVR
Alex Converse6b2584c2017-05-02 09:51:21 -0700173 if (precision > MV_SUBPEL_NONE)
174#endif
175 comp_counts->class0_fp[d][f] += incr;
176 if (precision > MV_SUBPEL_LOW_PRECISION) comp_counts->class0_hp[e] += incr;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700177 } else {
178 int i;
179 int b = c + CLASS0_BITS - 1; // number of bits
180 for (i = 0; i < b; ++i) comp_counts->bits[i][((d >> i) & 1)] += incr;
RogerZhou3b635242017-09-19 10:06:46 -0700181#if CONFIG_INTRABC || CONFIG_AMVR
Alex Converse6b2584c2017-05-02 09:51:21 -0700182 if (precision > MV_SUBPEL_NONE)
183#endif
184 comp_counts->fp[f] += incr;
185 if (precision > MV_SUBPEL_LOW_PRECISION) comp_counts->hp[e] += incr;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700186 }
187}
188
Alex Converse6b2584c2017-05-02 09:51:21 -0700189void av1_inc_mv(const MV *mv, nmv_context_counts *counts,
190 MvSubpelPrecision precision) {
Yaowu Xuc27fc142016-08-22 16:08:15 -0700191 if (counts != NULL) {
Yaowu Xuf883b422016-08-30 14:01:10 -0700192 const MV_JOINT_TYPE j = av1_get_mv_joint(mv);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700193 ++counts->joints[j];
194
195 if (mv_joint_vertical(j))
Alex Converse6b2584c2017-05-02 09:51:21 -0700196 inc_mv_component(mv->row, &counts->comps[0], 1, precision);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700197
198 if (mv_joint_horizontal(j))
Alex Converse6b2584c2017-05-02 09:51:21 -0700199 inc_mv_component(mv->col, &counts->comps[1], 1, precision);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700200 }
201}
202
Yaowu Xuf883b422016-08-30 14:01:10 -0700203void av1_adapt_mv_probs(AV1_COMMON *cm, int allow_hp) {
Joe Young947fa972017-03-16 10:34:32 -0700204 int i, j;
Yaowu Xuc27fc142016-08-22 16:08:15 -0700205 int idx;
206 for (idx = 0; idx < NMV_CONTEXTS; ++idx) {
Thomas Daede10e1da92017-04-26 13:22:21 -0700207 nmv_context *nmvc = &cm->fc->nmvc[idx];
208 const nmv_context *pre_nmvc = &cm->pre_fc->nmvc[idx];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700209 const nmv_context_counts *counts = &cm->counts.mv[idx];
Thomas Daede10e1da92017-04-26 13:22:21 -0700210 aom_tree_merge_probs(av1_mv_joint_tree, pre_nmvc->joints, counts->joints,
211 nmvc->joints);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700212 for (i = 0; i < 2; ++i) {
Thomas Daede10e1da92017-04-26 13:22:21 -0700213 nmv_component *comp = &nmvc->comps[i];
214 const nmv_component *pre_comp = &pre_nmvc->comps[i];
Yaowu Xuc27fc142016-08-22 16:08:15 -0700215 const nmv_component_counts *c = &counts->comps[i];
216
Yaowu Xuf883b422016-08-30 14:01:10 -0700217 comp->sign = av1_mode_mv_merge_probs(pre_comp->sign, c->sign);
218 aom_tree_merge_probs(av1_mv_class_tree, pre_comp->classes, c->classes,
Yaowu Xuc27fc142016-08-22 16:08:15 -0700219 comp->classes);
Yaowu Xuf883b422016-08-30 14:01:10 -0700220 aom_tree_merge_probs(av1_mv_class0_tree, pre_comp->class0, c->class0,
Yaowu Xuc27fc142016-08-22 16:08:15 -0700221 comp->class0);
222
223 for (j = 0; j < MV_OFFSET_BITS; ++j)
Yaowu Xuf883b422016-08-30 14:01:10 -0700224 comp->bits[j] = av1_mode_mv_merge_probs(pre_comp->bits[j], c->bits[j]);
RogerZhou3b635242017-09-19 10:06:46 -0700225#if CONFIG_AMVR
226 if (cm->cur_frame_mv_precision_level == 0) {
227#endif
228 for (j = 0; j < CLASS0_SIZE; ++j)
229 aom_tree_merge_probs(av1_mv_fp_tree, pre_comp->class0_fp[j],
230 c->class0_fp[j], comp->class0_fp[j]);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700231
RogerZhou3b635242017-09-19 10:06:46 -0700232 aom_tree_merge_probs(av1_mv_fp_tree, pre_comp->fp, c->fp, comp->fp);
Yaowu Xuc27fc142016-08-22 16:08:15 -0700233
RogerZhou3b635242017-09-19 10:06:46 -0700234 if (allow_hp) {
235 comp->class0_hp =
236 av1_mode_mv_merge_probs(pre_comp->class0_hp, c->class0_hp);
237 comp->hp = av1_mode_mv_merge_probs(pre_comp->hp, c->hp);
238 }
239#if CONFIG_AMVR
Yaowu Xuc27fc142016-08-22 16:08:15 -0700240 }
RogerZhou3b635242017-09-19 10:06:46 -0700241#endif
Yaowu Xuc27fc142016-08-22 16:08:15 -0700242 }
243 }
Yaowu Xuc27fc142016-08-22 16:08:15 -0700244}
245
Yaowu Xuf883b422016-08-30 14:01:10 -0700246void av1_init_mv_probs(AV1_COMMON *cm) {
Yaowu Xuc27fc142016-08-22 16:08:15 -0700247 int i;
Thomas Davies05fdc392017-02-22 14:15:39 +0000248 for (i = 0; i < NMV_CONTEXTS; ++i) {
249 // NB: this sets CDFs too
250 cm->fc->nmvc[i] = default_nmv_context;
251 }
Alex Converse28744302017-04-13 14:46:22 -0700252#if CONFIG_INTRABC
253 cm->fc->ndvc = default_nmv_context;
254#endif // CONFIG_INTRABC
Yaowu Xuc27fc142016-08-22 16:08:15 -0700255}