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

Side by Side Diff: source/libvpx/vp9/encoder/vp9_encodemv.c

Issue 232133009: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 8 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/encoder/vp9_encodemv.h ('k') | source/libvpx/vp9/encoder/vp9_firstpass.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
11 #include <math.h> 11 #include <math.h>
12 12
13 #include "vp9/common/vp9_common.h" 13 #include "vp9/common/vp9_common.h"
14 #include "vp9/common/vp9_entropymode.h" 14 #include "vp9/common/vp9_entropymode.h"
15 #include "vp9/common/vp9_systemdependent.h" 15 #include "vp9/common/vp9_systemdependent.h"
16
17 #include "vp9/encoder/vp9_cost.h"
16 #include "vp9/encoder/vp9_encodemv.h" 18 #include "vp9/encoder/vp9_encodemv.h"
17 19
18 #ifdef ENTROPY_STATS
19 extern unsigned int active_section;
20 #endif
21
22 static struct vp9_token mv_joint_encodings[MV_JOINTS]; 20 static struct vp9_token mv_joint_encodings[MV_JOINTS];
23 static struct vp9_token mv_class_encodings[MV_CLASSES]; 21 static struct vp9_token mv_class_encodings[MV_CLASSES];
24 static struct vp9_token mv_fp_encodings[MV_FP_SIZE]; 22 static struct vp9_token mv_fp_encodings[MV_FP_SIZE];
25 static struct vp9_token mv_class0_encodings[CLASS0_SIZE]; 23 static struct vp9_token mv_class0_encodings[CLASS0_SIZE];
26 24
27 void vp9_entropy_mv_init() { 25 void vp9_entropy_mv_init() {
28 vp9_tokens_from_tree(mv_joint_encodings, vp9_mv_joint_tree); 26 vp9_tokens_from_tree(mv_joint_encodings, vp9_mv_joint_tree);
29 vp9_tokens_from_tree(mv_class_encodings, vp9_mv_class_tree); 27 vp9_tokens_from_tree(mv_class_encodings, vp9_mv_class_tree);
30 vp9_tokens_from_tree(mv_class0_encodings, vp9_mv_class0_tree); 28 vp9_tokens_from_tree(mv_class0_encodings, vp9_mv_class0_tree);
31 vp9_tokens_from_tree(mv_fp_encodings, vp9_mv_fp_tree); 29 vp9_tokens_from_tree(mv_fp_encodings, vp9_mv_fp_tree);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 const unsigned int counts[/*n - 1*/], 151 const unsigned int counts[/*n - 1*/],
154 int n, vp9_writer *w) { 152 int n, vp9_writer *w) {
155 int i; 153 int i;
156 unsigned int branch_ct[32][2]; 154 unsigned int branch_ct[32][2];
157 155
158 // Assuming max number of probabilities <= 32 156 // Assuming max number of probabilities <= 32
159 assert(n <= 32); 157 assert(n <= 32);
160 158
161 vp9_tree_probs_from_distribution(tree, branch_ct, counts); 159 vp9_tree_probs_from_distribution(tree, branch_ct, counts);
162 for (i = 0; i < n - 1; ++i) 160 for (i = 0; i < n - 1; ++i)
163 update_mv(w, branch_ct[i], &probs[i], NMV_UPDATE_PROB); 161 update_mv(w, branch_ct[i], &probs[i], MV_UPDATE_PROB);
164 } 162 }
165 163
166 void vp9_write_nmv_probs(VP9_COMMON *cm, int usehp, vp9_writer *w) { 164 void vp9_write_nmv_probs(VP9_COMMON *cm, int usehp, vp9_writer *w) {
167 int i, j; 165 int i, j;
168 nmv_context *const mvc = &cm->fc.nmvc; 166 nmv_context *const mvc = &cm->fc.nmvc;
169 nmv_context_counts *const counts = &cm->counts.mv; 167 nmv_context_counts *const counts = &cm->counts.mv;
170 168
171 write_mv_update(vp9_mv_joint_tree, mvc->joints, counts->joints, MV_JOINTS, w); 169 write_mv_update(vp9_mv_joint_tree, mvc->joints, counts->joints, MV_JOINTS, w);
172 170
173 for (i = 0; i < 2; ++i) { 171 for (i = 0; i < 2; ++i) {
174 nmv_component *comp = &mvc->comps[i]; 172 nmv_component *comp = &mvc->comps[i];
175 nmv_component_counts *comp_counts = &counts->comps[i]; 173 nmv_component_counts *comp_counts = &counts->comps[i];
176 174
177 update_mv(w, comp_counts->sign, &comp->sign, NMV_UPDATE_PROB); 175 update_mv(w, comp_counts->sign, &comp->sign, MV_UPDATE_PROB);
178 write_mv_update(vp9_mv_class_tree, comp->classes, comp_counts->classes, 176 write_mv_update(vp9_mv_class_tree, comp->classes, comp_counts->classes,
179 MV_CLASSES, w); 177 MV_CLASSES, w);
180 write_mv_update(vp9_mv_class0_tree, comp->class0, comp_counts->class0, 178 write_mv_update(vp9_mv_class0_tree, comp->class0, comp_counts->class0,
181 CLASS0_SIZE, w); 179 CLASS0_SIZE, w);
182 for (j = 0; j < MV_OFFSET_BITS; ++j) 180 for (j = 0; j < MV_OFFSET_BITS; ++j)
183 update_mv(w, comp_counts->bits[j], &comp->bits[j], NMV_UPDATE_PROB); 181 update_mv(w, comp_counts->bits[j], &comp->bits[j], MV_UPDATE_PROB);
184 } 182 }
185 183
186 for (i = 0; i < 2; ++i) { 184 for (i = 0; i < 2; ++i) {
187 for (j = 0; j < CLASS0_SIZE; ++j) 185 for (j = 0; j < CLASS0_SIZE; ++j)
188 write_mv_update(vp9_mv_fp_tree, mvc->comps[i].class0_fp[j], 186 write_mv_update(vp9_mv_fp_tree, mvc->comps[i].class0_fp[j],
189 counts->comps[i].class0_fp[j], MV_FP_SIZE, w); 187 counts->comps[i].class0_fp[j], MV_FP_SIZE, w);
190 188
191 write_mv_update(vp9_mv_fp_tree, mvc->comps[i].fp, counts->comps[i].fp, 189 write_mv_update(vp9_mv_fp_tree, mvc->comps[i].fp, counts->comps[i].fp,
192 MV_FP_SIZE, w); 190 MV_FP_SIZE, w);
193 } 191 }
194 192
195 if (usehp) { 193 if (usehp) {
196 for (i = 0; i < 2; ++i) { 194 for (i = 0; i < 2; ++i) {
197 update_mv(w, counts->comps[i].class0_hp, &mvc->comps[i].class0_hp, 195 update_mv(w, counts->comps[i].class0_hp, &mvc->comps[i].class0_hp,
198 NMV_UPDATE_PROB); 196 MV_UPDATE_PROB);
199 update_mv(w, counts->comps[i].hp, &mvc->comps[i].hp, NMV_UPDATE_PROB); 197 update_mv(w, counts->comps[i].hp, &mvc->comps[i].hp, MV_UPDATE_PROB);
200 } 198 }
201 } 199 }
202 } 200 }
203 201
204 void vp9_encode_mv(VP9_COMP* cpi, vp9_writer* w, 202 void vp9_encode_mv(VP9_COMP* cpi, vp9_writer* w,
205 const MV* mv, const MV* ref, 203 const MV* mv, const MV* ref,
206 const nmv_context* mvctx, int usehp) { 204 const nmv_context* mvctx, int usehp) {
207 const MV diff = {mv->row - ref->row, 205 const MV diff = {mv->row - ref->row,
208 mv->col - ref->col}; 206 mv->col - ref->col};
209 const MV_JOINT_TYPE j = vp9_get_mv_joint(&diff); 207 const MV_JOINT_TYPE j = vp9_get_mv_joint(&diff);
(...skipping 14 matching lines...) Expand all
224 } 222 }
225 } 223 }
226 224
227 void vp9_build_nmv_cost_table(int *mvjoint, int *mvcost[2], 225 void vp9_build_nmv_cost_table(int *mvjoint, int *mvcost[2],
228 const nmv_context* ctx, int usehp) { 226 const nmv_context* ctx, int usehp) {
229 vp9_cost_tokens(mvjoint, ctx->joints, vp9_mv_joint_tree); 227 vp9_cost_tokens(mvjoint, ctx->joints, vp9_mv_joint_tree);
230 build_nmv_component_cost_table(mvcost[0], &ctx->comps[0], usehp); 228 build_nmv_component_cost_table(mvcost[0], &ctx->comps[0], usehp);
231 build_nmv_component_cost_table(mvcost[1], &ctx->comps[1], usehp); 229 build_nmv_component_cost_table(mvcost[1], &ctx->comps[1], usehp);
232 } 230 }
233 231
234 static void inc_mvs(const int_mv mv[2], const MV ref[2], int is_compound, 232 static void inc_mvs(const MB_MODE_INFO *mbmi, const int_mv mvs[2],
235 nmv_context_counts *counts) { 233 nmv_context_counts *counts) {
236 int i; 234 int i;
237 for (i = 0; i < 1 + is_compound; ++i) { 235
238 const MV diff = { mv[i].as_mv.row - ref[i].row, 236 for (i = 0; i < 1 + has_second_ref(mbmi); ++i) {
239 mv[i].as_mv.col - ref[i].col }; 237 const MV *ref = &mbmi->ref_mvs[mbmi->ref_frame[i]][0].as_mv;
238 const MV diff = {mvs[i].as_mv.row - ref->row,
239 mvs[i].as_mv.col - ref->col};
240 vp9_inc_mv(&diff, counts); 240 vp9_inc_mv(&diff, counts);
241 } 241 }
242 } 242 }
243 243
244 void vp9_update_mv_count(VP9_COMMON *cm, const MACROBLOCKD *xd, 244 void vp9_update_mv_count(VP9_COMMON *cm, const MACROBLOCKD *xd) {
245 const MV best_ref_mv[2]) { 245 const MODE_INFO *mi = xd->mi[0];
246 const MODE_INFO *mi = xd->mi_8x8[0];
247 const MB_MODE_INFO *const mbmi = &mi->mbmi; 246 const MB_MODE_INFO *const mbmi = &mi->mbmi;
248 const int is_compound = has_second_ref(mbmi);
249 nmv_context_counts *counts = &cm->counts.mv;
250 247
251 if (mbmi->sb_type < BLOCK_8X8) { 248 if (mbmi->sb_type < BLOCK_8X8) {
252 const int num_4x4_w = num_4x4_blocks_wide_lookup[mbmi->sb_type]; 249 const int num_4x4_w = num_4x4_blocks_wide_lookup[mbmi->sb_type];
253 const int num_4x4_h = num_4x4_blocks_high_lookup[mbmi->sb_type]; 250 const int num_4x4_h = num_4x4_blocks_high_lookup[mbmi->sb_type];
254 int idx, idy; 251 int idx, idy;
255 252
256 for (idy = 0; idy < 2; idy += num_4x4_h) { 253 for (idy = 0; idy < 2; idy += num_4x4_h) {
257 for (idx = 0; idx < 2; idx += num_4x4_w) { 254 for (idx = 0; idx < 2; idx += num_4x4_w) {
258 const int i = idy * 2 + idx; 255 const int i = idy * 2 + idx;
259 if (mi->bmi[i].as_mode == NEWMV) 256 if (mi->bmi[i].as_mode == NEWMV)
260 inc_mvs(mi->bmi[i].as_mv, best_ref_mv, is_compound, counts); 257 inc_mvs(mbmi, mi->bmi[i].as_mv, &cm->counts.mv);
261 } 258 }
262 } 259 }
263 } else if (mbmi->mode == NEWMV) { 260 } else {
264 inc_mvs(mbmi->mv, best_ref_mv, is_compound, counts); 261 if (mbmi->mode == NEWMV)
262 inc_mvs(mbmi, mbmi->mv, &cm->counts.mv);
265 } 263 }
266 } 264 }
267 265
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_encodemv.h ('k') | source/libvpx/vp9/encoder/vp9_firstpass.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698