Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Side by Side Diff: source/libvpx/vp9/common/vp9_entropymv.c

Issue 17451020: libvpx: Pull from upstream (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vp9/common/vp9_entropymv.h ('k') | source/libvpx/vp9/common/vp9_findnearmv.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 else if (z < CLASS0_SIZE * 1024) c = MV_CLASS_7; 107 else if (z < CLASS0_SIZE * 1024) c = MV_CLASS_7;
108 else if (z < CLASS0_SIZE * 2048) c = MV_CLASS_8; 108 else if (z < CLASS0_SIZE * 2048) c = MV_CLASS_8;
109 else if (z < CLASS0_SIZE * 4096) c = MV_CLASS_9; 109 else if (z < CLASS0_SIZE * 4096) c = MV_CLASS_9;
110 else if (z < CLASS0_SIZE * 8192) c = MV_CLASS_10; 110 else if (z < CLASS0_SIZE * 8192) c = MV_CLASS_10;
111 else assert(0); 111 else assert(0);
112 if (offset) 112 if (offset)
113 *offset = z - mv_class_base(c); 113 *offset = z - mv_class_base(c);
114 return c; 114 return c;
115 } 115 }
116 116
117 int vp9_use_nmv_hp(const MV *ref) { 117 int vp9_use_mv_hp(const MV *ref) {
118 return (abs(ref->row) >> 3) < COMPANDED_MVREF_THRESH && 118 return (abs(ref->row) >> 3) < COMPANDED_MVREF_THRESH &&
119 (abs(ref->col) >> 3) < COMPANDED_MVREF_THRESH; 119 (abs(ref->col) >> 3) < COMPANDED_MVREF_THRESH;
120 } 120 }
121 121
122 int vp9_get_mv_mag(MV_CLASS_TYPE c, int offset) { 122 int vp9_get_mv_mag(MV_CLASS_TYPE c, int offset) {
123 return mv_class_base(c) + offset; 123 return mv_class_base(c) + offset;
124 } 124 }
125 125
126 static void increment_nmv_component_count(int v, 126 static void inc_mv_component_count(int v, nmv_component_counts *comp_counts,
127 nmv_component_counts *mvcomp, 127 int incr) {
128 int incr, 128 assert (v != 0);
129 int usehp) { 129 comp_counts->mvcount[MV_MAX + v] += incr;
130 assert (v != 0); /* should not be zero */
131 mvcomp->mvcount[MV_MAX + v] += incr;
132 } 130 }
133 131
134 static void increment_nmv_component(int v, 132 static void inc_mv_component(int v, nmv_component_counts *comp_counts,
135 nmv_component_counts *mvcomp, 133 int incr, int usehp) {
136 int incr,
137 int usehp) {
138 int s, z, c, o, d, e, f; 134 int s, z, c, o, d, e, f;
139 if (!incr) 135 if (!incr)
140 return; 136 return;
141 assert (v != 0); /* should not be zero */ 137 assert (v != 0); /* should not be zero */
142 s = v < 0; 138 s = v < 0;
143 mvcomp->sign[s] += incr; 139 comp_counts->sign[s] += incr;
144 z = (s ? -v : v) - 1; /* magnitude - 1 */ 140 z = (s ? -v : v) - 1; /* magnitude - 1 */
145 141
146 c = vp9_get_mv_class(z, &o); 142 c = vp9_get_mv_class(z, &o);
147 mvcomp->classes[c] += incr; 143 comp_counts->classes[c] += incr;
148 144
149 d = (o >> 3); /* int mv data */ 145 d = (o >> 3); /* int mv data */
150 f = (o >> 1) & 3; /* fractional pel mv data */ 146 f = (o >> 1) & 3; /* fractional pel mv data */
151 e = (o & 1); /* high precision mv data */ 147 e = (o & 1); /* high precision mv data */
152 if (c == MV_CLASS_0) { 148 if (c == MV_CLASS_0) {
153 mvcomp->class0[d] += incr; 149 comp_counts->class0[d] += incr;
154 } else { 150 } else {
155 int i; 151 int i;
156 int b = c + CLASS0_BITS - 1; // number of bits 152 int b = c + CLASS0_BITS - 1; // number of bits
157 for (i = 0; i < b; ++i) 153 for (i = 0; i < b; ++i)
158 mvcomp->bits[i][((d >> i) & 1)] += incr; 154 comp_counts->bits[i][((d >> i) & 1)] += incr;
159 } 155 }
160 156
161 /* Code the fractional pel bits */ 157 /* Code the fractional pel bits */
162 if (c == MV_CLASS_0) { 158 if (c == MV_CLASS_0) {
163 mvcomp->class0_fp[d][f] += incr; 159 comp_counts->class0_fp[d][f] += incr;
164 } else { 160 } else {
165 mvcomp->fp[f] += incr; 161 comp_counts->fp[f] += incr;
166 } 162 }
167 163
168 /* Code the high precision bit */ 164 /* Code the high precision bit */
169 if (usehp) { 165 if (usehp) {
170 if (c == MV_CLASS_0) { 166 if (c == MV_CLASS_0) {
171 mvcomp->class0_hp[e] += incr; 167 comp_counts->class0_hp[e] += incr;
172 } else { 168 } else {
173 mvcomp->hp[e] += incr; 169 comp_counts->hp[e] += incr;
174 } 170 }
175 } 171 }
176 } 172 }
177 173
178 #ifdef SMOOTH_MV_COUNTS 174 #ifdef SMOOTH_MV_COUNTS
179 static void smooth_counts(nmv_component_counts *mvcomp) { 175 static void smooth_counts(nmv_component_counts *mvcomp) {
180 static const int flen = 3; // (filter_length + 1) / 2 176 static const int flen = 3; // (filter_length + 1) / 2
181 static const int fval[] = {8, 3, 1}; 177 static const int fval[] = {8, 3, 1};
182 static const int fvalbits = 4; 178 static const int fvalbits = 4;
183 int i; 179 int i;
184 unsigned int smvcount[MV_VALS]; 180 unsigned int smvcount[MV_VALS];
185 vpx_memcpy(smvcount, mvcomp->mvcount, sizeof(smvcount)); 181 vpx_memcpy(smvcount, mvcomp->mvcount, sizeof(smvcount));
186 smvcount[MV_MAX] = (smvcount[MV_MAX - 1] + smvcount[MV_MAX + 1]) >> 1; 182 smvcount[MV_MAX] = (smvcount[MV_MAX - 1] + smvcount[MV_MAX + 1]) >> 1;
187 for (i = flen - 1; i <= MV_VALS - flen; ++i) { 183 for (i = flen - 1; i <= MV_VALS - flen; ++i) {
188 int j, s = smvcount[i] * fval[0]; 184 int j, s = smvcount[i] * fval[0];
189 for (j = 1; j < flen; ++j) 185 for (j = 1; j < flen; ++j)
190 s += (smvcount[i - j] + smvcount[i + j]) * fval[j]; 186 s += (smvcount[i - j] + smvcount[i + j]) * fval[j];
191 mvcomp->mvcount[i] = (s + (1 << (fvalbits - 1))) >> fvalbits; 187 mvcomp->mvcount[i] = (s + (1 << (fvalbits - 1))) >> fvalbits;
192 } 188 }
193 } 189 }
194 #endif 190 #endif
195 191
196 static void counts_to_context(nmv_component_counts *mvcomp, int usehp) { 192 static void counts_to_context(nmv_component_counts *mvcomp, int usehp) {
197 int v; 193 int v;
198 vpx_memset(mvcomp->sign, 0, sizeof(nmv_component_counts) - sizeof(mvcomp->mvco unt)); 194 vpx_memset(mvcomp->sign, 0, sizeof(nmv_component_counts) - sizeof(mvcomp->mvco unt));
199 for (v = 1; v <= MV_MAX; v++) { 195 for (v = 1; v <= MV_MAX; v++) {
200 increment_nmv_component(-v, mvcomp, mvcomp->mvcount[MV_MAX - v], usehp); 196 inc_mv_component(-v, mvcomp, mvcomp->mvcount[MV_MAX - v], usehp);
201 increment_nmv_component( v, mvcomp, mvcomp->mvcount[MV_MAX + v], usehp); 197 inc_mv_component( v, mvcomp, mvcomp->mvcount[MV_MAX + v], usehp);
202 } 198 }
203 } 199 }
204 200
205 void vp9_increment_nmv(const MV *mv, const MV *ref, nmv_context_counts *mvctx, 201 void vp9_increment_nmv(const MV *mv, const MV *ref, nmv_context_counts *mvctx,
206 int usehp) { 202 int usehp) {
207 const MV_JOINT_TYPE j = vp9_get_mv_joint(mv); 203 const MV_JOINT_TYPE j = vp9_get_mv_joint(mv);
208 mvctx->joints[j]++; 204 mvctx->joints[j]++;
209 usehp = usehp && vp9_use_nmv_hp(ref); 205 usehp = usehp && vp9_use_mv_hp(ref);
210 if (mv_joint_vertical(j)) 206 if (mv_joint_vertical(j))
211 increment_nmv_component_count(mv->row, &mvctx->comps[0], 1, usehp); 207 inc_mv_component_count(mv->row, &mvctx->comps[0], 1);
212 208
213 if (mv_joint_horizontal(j)) 209 if (mv_joint_horizontal(j))
214 increment_nmv_component_count(mv->col, &mvctx->comps[1], 1, usehp); 210 inc_mv_component_count(mv->col, &mvctx->comps[1], 1);
215 } 211 }
216 212
217 static void adapt_prob(vp9_prob *dest, vp9_prob prep, unsigned int ct[2]) { 213 static void adapt_prob(vp9_prob *dest, vp9_prob prep, unsigned int ct[2]) {
218 const int count = MIN(ct[0] + ct[1], MV_COUNT_SAT); 214 const int count = MIN(ct[0] + ct[1], MV_COUNT_SAT);
219 if (count) { 215 if (count) {
220 const vp9_prob newp = get_binary_prob(ct[0], ct[1]); 216 const vp9_prob newp = get_binary_prob(ct[0], ct[1]);
221 const int factor = MV_MAX_UPDATE_FACTOR * count / MV_COUNT_SAT; 217 const int factor = MV_MAX_UPDATE_FACTOR * count / MV_COUNT_SAT;
222 *dest = weighted_prob(prep, newp, factor); 218 *dest = weighted_prob(prep, newp, factor);
223 } else { 219 } else {
224 *dest = prep; 220 *dest = prep;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 this_prob = weighted_prob(last_probs[i >> 1], this_prob, 321 this_prob = weighted_prob(last_probs[i >> 1], this_prob,
326 MV_MAX_UPDATE_FACTOR * weight / MV_COUNT_SAT); 322 MV_MAX_UPDATE_FACTOR * weight / MV_COUNT_SAT);
327 } else { 323 } else {
328 this_prob = last_probs[i >> 1]; 324 this_prob = last_probs[i >> 1];
329 } 325 }
330 this_probs[i >> 1] = this_prob; 326 this_probs[i >> 1] = this_prob;
331 return left + right; 327 return left + right;
332 } 328 }
333 329
334 330
335 void vp9_adapt_nmv_probs(VP9_COMMON *cm, int usehp) { 331 void vp9_adapt_mv_probs(VP9_COMMON *cm, int usehp) {
336 int i, j; 332 int i, j;
337 #ifdef MV_COUNT_TESTING 333 #ifdef MV_COUNT_TESTING
338 printf("joints count: "); 334 printf("joints count: ");
339 for (j = 0; j < MV_JOINTS; ++j) printf("%d ", cm->fc.NMVcount.joints[j]); 335 for (j = 0; j < MV_JOINTS; ++j) printf("%d ", cm->fc.NMVcount.joints[j]);
340 printf("\n"); fflush(stdout); 336 printf("\n"); fflush(stdout);
341 printf("signs count:\n"); 337 printf("signs count:\n");
342 for (i = 0; i < 2; ++i) 338 for (i = 0; i < 2; ++i)
343 printf("%d/%d ", cm->fc.NMVcount.comps[i].sign[0], cm->fc.NMVcount.comps[i]. sign[1]); 339 printf("%d/%d ", cm->fc.NMVcount.comps[i].sign[0], cm->fc.NMVcount.comps[i]. sign[1]);
344 printf("\n"); fflush(stdout); 340 printf("\n"); fflush(stdout);
345 printf("classes count:\n"); 341 printf("classes count:\n");
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 void vp9_entropy_mv_init() { 439 void vp9_entropy_mv_init() {
444 vp9_tokens_from_tree(vp9_mv_joint_encodings, vp9_mv_joint_tree); 440 vp9_tokens_from_tree(vp9_mv_joint_encodings, vp9_mv_joint_tree);
445 vp9_tokens_from_tree(vp9_mv_class_encodings, vp9_mv_class_tree); 441 vp9_tokens_from_tree(vp9_mv_class_encodings, vp9_mv_class_tree);
446 vp9_tokens_from_tree(vp9_mv_class0_encodings, vp9_mv_class0_tree); 442 vp9_tokens_from_tree(vp9_mv_class0_encodings, vp9_mv_class0_tree);
447 vp9_tokens_from_tree(vp9_mv_fp_encodings, vp9_mv_fp_tree); 443 vp9_tokens_from_tree(vp9_mv_fp_encodings, vp9_mv_fp_tree);
448 } 444 }
449 445
450 void vp9_init_mv_probs(VP9_COMMON *cm) { 446 void vp9_init_mv_probs(VP9_COMMON *cm) {
451 vpx_memcpy(&cm->fc.nmvc, &vp9_default_nmv_context, sizeof(nmv_context)); 447 vpx_memcpy(&cm->fc.nmvc, &vp9_default_nmv_context, sizeof(nmv_context));
452 } 448 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/common/vp9_entropymv.h ('k') | source/libvpx/vp9/common/vp9_findnearmv.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698