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

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

Issue 23600008: libvpx: Pull from upstream (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 7 years, 3 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_firstpass.c ('k') | source/libvpx/vp9/encoder/vp9_mcomp.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 22 matching lines...) Expand all
33 const int tmp_col_max = x->mv_col_max; 33 const int tmp_col_max = x->mv_col_max;
34 const int tmp_row_min = x->mv_row_min; 34 const int tmp_row_min = x->mv_row_min;
35 const int tmp_row_max = x->mv_row_max; 35 const int tmp_row_max = x->mv_row_max;
36 int_mv ref_full; 36 int_mv ref_full;
37 37
38 // Further step/diamond searches as necessary 38 // Further step/diamond searches as necessary
39 int step_param = cpi->sf.reduce_first_step_size + 39 int step_param = cpi->sf.reduce_first_step_size +
40 (cpi->speed < 8 ? (cpi->speed > 5 ? 1 : 0) : 2); 40 (cpi->speed < 8 ? (cpi->speed > 5 ? 1 : 0) : 2);
41 step_param = MIN(step_param, (cpi->sf.max_step_search_steps - 2)); 41 step_param = MIN(step_param, (cpi->sf.max_step_search_steps - 2));
42 42
43 vp9_clamp_mv_min_max(x, ref_mv); 43 vp9_clamp_mv_min_max(x, &ref_mv->as_mv);
44 44
45 ref_full.as_mv.col = ref_mv->as_mv.col >> 3; 45 ref_full.as_mv.col = ref_mv->as_mv.col >> 3;
46 ref_full.as_mv.row = ref_mv->as_mv.row >> 3; 46 ref_full.as_mv.row = ref_mv->as_mv.row >> 3;
47 47
48 /*cpi->sf.search_method == HEX*/ 48 /*cpi->sf.search_method == HEX*/
49 best_err = vp9_hex_search(x, &ref_full, dst_mv, step_param, x->errorperbit, 49 best_err = vp9_hex_search(x, &ref_full, step_param, x->errorperbit,
50 &v_fn_ptr, NULL, NULL, NULL, NULL, ref_mv); 50 0, &v_fn_ptr,
51 0, ref_mv, dst_mv);
51 52
52 // Try sub-pixel MC 53 // Try sub-pixel MC
53 // if (bestsme > error_thresh && bestsme < INT_MAX) 54 // if (bestsme > error_thresh && bestsme < INT_MAX)
54 { 55 {
55 int distortion; 56 int distortion;
56 unsigned int sse; 57 unsigned int sse;
57 best_err = cpi->find_fractional_mv_step( 58 best_err = cpi->find_fractional_mv_step(
58 x, 59 x,
59 dst_mv, ref_mv, 60 dst_mv, ref_mv,
60 x->errorperbit, &v_fn_ptr, 61 x->errorperbit, &v_fn_ptr,
61 NULL, NULL, 62 0, cpi->sf.subpel_iters_per_step, NULL, NULL,
62 & distortion, &sse); 63 & distortion, &sse);
63 } 64 }
64 65
65 vp9_set_mbmode_and_mvs(x, NEWMV, dst_mv); 66 vp9_set_mbmode_and_mvs(x, NEWMV, dst_mv);
66 vp9_build_inter_predictors_sby(xd, mb_row, mb_col, BLOCK_SIZE_MB16X16); 67 vp9_build_inter_predictors_sby(xd, mb_row, mb_col, BLOCK_16X16);
67 best_err = vp9_sad16x16(x->plane[0].src.buf, x->plane[0].src.stride, 68 best_err = vp9_sad16x16(x->plane[0].src.buf, x->plane[0].src.stride,
68 xd->plane[0].dst.buf, xd->plane[0].dst.stride, 69 xd->plane[0].dst.buf, xd->plane[0].dst.stride,
69 INT_MAX); 70 INT_MAX);
70 71
71 /* restore UMV window */ 72 /* restore UMV window */
72 x->mv_col_min = tmp_col_min; 73 x->mv_col_min = tmp_col_min;
73 x->mv_col_max = tmp_col_max; 74 x->mv_col_max = tmp_col_max;
74 x->mv_row_min = tmp_row_min; 75 x->mv_row_min = tmp_row_min;
75 x->mv_row_max = tmp_row_max; 76 x->mv_row_max = tmp_row_max;
76 77
77 return best_err; 78 return best_err;
78 } 79 }
79 80
80 static int do_16x16_motion_search(VP9_COMP *cpi, 81 static int do_16x16_motion_search(VP9_COMP *cpi, int_mv *ref_mv, int_mv *dst_mv,
81 int_mv *ref_mv, int_mv *dst_mv,
82 int buf_mb_y_offset, int mb_y_offset,
83 int mb_row, int mb_col) { 82 int mb_row, int mb_col) {
84 MACROBLOCK *const x = &cpi->mb; 83 MACROBLOCK *const x = &cpi->mb;
85 MACROBLOCKD *const xd = &x->e_mbd; 84 MACROBLOCKD *const xd = &x->e_mbd;
86 unsigned int err, tmp_err; 85 unsigned int err, tmp_err;
87 int_mv tmp_mv; 86 int_mv tmp_mv;
88 87
89 // Try zero MV first 88 // Try zero MV first
90 // FIXME should really use something like near/nearest MV and/or MV prediction 89 // FIXME should really use something like near/nearest MV and/or MV prediction
91 err = vp9_sad16x16(x->plane[0].src.buf, x->plane[0].src.stride, 90 err = vp9_sad16x16(x->plane[0].src.buf, x->plane[0].src.stride,
92 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, 91 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride,
(...skipping 18 matching lines...) Expand all
111 mb_row, mb_col); 110 mb_row, mb_col);
112 if (tmp_err < err) { 111 if (tmp_err < err) {
113 dst_mv->as_int = tmp_mv.as_int; 112 dst_mv->as_int = tmp_mv.as_int;
114 err = tmp_err; 113 err = tmp_err;
115 } 114 }
116 } 115 }
117 116
118 return err; 117 return err;
119 } 118 }
120 119
121 static int do_16x16_zerozero_search(VP9_COMP *cpi, 120 static int do_16x16_zerozero_search(VP9_COMP *cpi, int_mv *dst_mv) {
122 int_mv *dst_mv,
123 int buf_mb_y_offset, int mb_y_offset) {
124 MACROBLOCK *const x = &cpi->mb; 121 MACROBLOCK *const x = &cpi->mb;
125 MACROBLOCKD *const xd = &x->e_mbd; 122 MACROBLOCKD *const xd = &x->e_mbd;
126 unsigned int err; 123 unsigned int err;
127 124
128 // Try zero MV first 125 // Try zero MV first
129 // FIXME should really use something like near/nearest MV and/or MV prediction 126 // FIXME should really use something like near/nearest MV and/or MV prediction
130 err = vp9_sad16x16(x->plane[0].src.buf, x->plane[0].src.stride, 127 err = vp9_sad16x16(x->plane[0].src.buf, x->plane[0].src.stride,
131 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, 128 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride,
132 INT_MAX); 129 INT_MAX);
133 130
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 stats->ref[INTRA_FRAME].err = intra_error; 200 stats->ref[INTRA_FRAME].err = intra_error;
204 201
205 // Golden frame MV search, if it exists and is different than last frame 202 // Golden frame MV search, if it exists and is different than last frame
206 if (golden_ref) { 203 if (golden_ref) {
207 int g_motion_error; 204 int g_motion_error;
208 xd->plane[0].pre[0].buf = golden_ref->y_buffer + mb_y_offset; 205 xd->plane[0].pre[0].buf = golden_ref->y_buffer + mb_y_offset;
209 xd->plane[0].pre[0].stride = golden_ref->y_stride; 206 xd->plane[0].pre[0].stride = golden_ref->y_stride;
210 g_motion_error = do_16x16_motion_search(cpi, 207 g_motion_error = do_16x16_motion_search(cpi,
211 prev_golden_ref_mv, 208 prev_golden_ref_mv,
212 &stats->ref[GOLDEN_FRAME].m.mv, 209 &stats->ref[GOLDEN_FRAME].m.mv,
213 mb_y_offset, gld_y_offset,
214 mb_row, mb_col); 210 mb_row, mb_col);
215 stats->ref[GOLDEN_FRAME].err = g_motion_error; 211 stats->ref[GOLDEN_FRAME].err = g_motion_error;
216 } else { 212 } else {
217 stats->ref[GOLDEN_FRAME].err = INT_MAX; 213 stats->ref[GOLDEN_FRAME].err = INT_MAX;
218 stats->ref[GOLDEN_FRAME].m.mv.as_int = 0; 214 stats->ref[GOLDEN_FRAME].m.mv.as_int = 0;
219 } 215 }
220 216
221 // Alt-ref frame MV search, if it exists and is different than last/golden fra me 217 // Alt-ref frame MV search, if it exists and is different than last/golden fra me
222 if (alt_ref) { 218 if (alt_ref) {
223 int a_motion_error; 219 int a_motion_error;
224 xd->plane[0].pre[0].buf = alt_ref->y_buffer + mb_y_offset; 220 xd->plane[0].pre[0].buf = alt_ref->y_buffer + mb_y_offset;
225 xd->plane[0].pre[0].stride = alt_ref->y_stride; 221 xd->plane[0].pre[0].stride = alt_ref->y_stride;
226 a_motion_error = do_16x16_zerozero_search(cpi, 222 a_motion_error = do_16x16_zerozero_search(cpi,
227 &stats->ref[ALTREF_FRAME].m.mv, 223 &stats->ref[ALTREF_FRAME].m.mv);
228 mb_y_offset, arf_y_offset);
229 224
230 stats->ref[ALTREF_FRAME].err = a_motion_error; 225 stats->ref[ALTREF_FRAME].err = a_motion_error;
231 } else { 226 } else {
232 stats->ref[ALTREF_FRAME].err = INT_MAX; 227 stats->ref[ALTREF_FRAME].err = INT_MAX;
233 stats->ref[ALTREF_FRAME].m.mv.as_int = 0; 228 stats->ref[ALTREF_FRAME].m.mv.as_int = 0;
234 } 229 }
235 } 230 }
236 231
237 static void update_mbgraph_frame_stats(VP9_COMP *cpi, 232 static void update_mbgraph_frame_stats(VP9_COMP *cpi,
238 MBGRAPH_FRAME_STATS *stats, 233 MBGRAPH_FRAME_STATS *stats,
239 YV12_BUFFER_CONFIG *buf, 234 YV12_BUFFER_CONFIG *buf,
240 YV12_BUFFER_CONFIG *golden_ref, 235 YV12_BUFFER_CONFIG *golden_ref,
241 YV12_BUFFER_CONFIG *alt_ref) { 236 YV12_BUFFER_CONFIG *alt_ref) {
242 MACROBLOCK *const x = &cpi->mb; 237 MACROBLOCK *const x = &cpi->mb;
243 MACROBLOCKD *const xd = &x->e_mbd; 238 MACROBLOCKD *const xd = &x->e_mbd;
244 VP9_COMMON *const cm = &cpi->common; 239 VP9_COMMON *const cm = &cpi->common;
245 240
246 int mb_col, mb_row, offset = 0; 241 int mb_col, mb_row, offset = 0;
247 int mb_y_offset = 0, arf_y_offset = 0, gld_y_offset = 0; 242 int mb_y_offset = 0, arf_y_offset = 0, gld_y_offset = 0;
248 int_mv arf_top_mv, gld_top_mv; 243 int_mv arf_top_mv, gld_top_mv;
249 MODE_INFO mi_local; 244 MODE_INFO mi_local = { { 0 } };
250
251 // Make sure the mi context starts in a consistent state.
252 memset(&mi_local, 0, sizeof(mi_local));
253 245
254 // Set up limit values for motion vectors to prevent them extending outside th e UMV borders 246 // Set up limit values for motion vectors to prevent them extending outside th e UMV borders
255 arf_top_mv.as_int = 0; 247 arf_top_mv.as_int = 0;
256 gld_top_mv.as_int = 0; 248 gld_top_mv.as_int = 0;
257 x->mv_row_min = -(VP9BORDERINPIXELS - 8 - VP9_INTERP_EXTEND); 249 x->mv_row_min = -(VP9BORDERINPIXELS - 8 - VP9_INTERP_EXTEND);
258 x->mv_row_max = (cm->mb_rows - 1) * 8 + VP9BORDERINPIXELS 250 x->mv_row_max = (cm->mb_rows - 1) * 8 + VP9BORDERINPIXELS
259 - 8 - VP9_INTERP_EXTEND; 251 - 8 - VP9_INTERP_EXTEND;
260 xd->up_available = 0; 252 xd->up_available = 0;
261 xd->plane[0].dst.stride = buf->y_stride; 253 xd->plane[0].dst.stride = buf->y_stride;
262 xd->plane[0].pre[0].stride = buf->y_stride; 254 xd->plane[0].pre[0].stride = buf->y_stride;
263 xd->plane[1].dst.stride = buf->uv_stride; 255 xd->plane[1].dst.stride = buf->uv_stride;
264 xd->mode_info_context = &mi_local; 256 xd->mode_info_context = &mi_local;
265 mi_local.mbmi.sb_type = BLOCK_SIZE_MB16X16; 257 mi_local.mbmi.sb_type = BLOCK_16X16;
266 mi_local.mbmi.ref_frame[0] = LAST_FRAME; 258 mi_local.mbmi.ref_frame[0] = LAST_FRAME;
267 mi_local.mbmi.ref_frame[1] = NONE; 259 mi_local.mbmi.ref_frame[1] = NONE;
268 260
269 for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) { 261 for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) {
270 int_mv arf_left_mv, gld_left_mv; 262 int_mv arf_left_mv, gld_left_mv;
271 int mb_y_in_offset = mb_y_offset; 263 int mb_y_in_offset = mb_y_offset;
272 int arf_y_in_offset = arf_y_offset; 264 int arf_y_in_offset = arf_y_offset;
273 int gld_y_in_offset = gld_y_offset; 265 int gld_y_in_offset = gld_y_offset;
274 266
275 // Set up limit values for motion vectors to prevent them extending outside the UMV borders 267 // Set up limit values for motion vectors to prevent them extending outside the UMV borders
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 x->mv_row_min -= 16; 300 x->mv_row_min -= 16;
309 x->mv_row_max -= 16; 301 x->mv_row_max -= 16;
310 offset += cm->mb_cols; 302 offset += cm->mb_cols;
311 } 303 }
312 } 304 }
313 305
314 // void separate_arf_mbs_byzz 306 // void separate_arf_mbs_byzz
315 static void separate_arf_mbs(VP9_COMP *cpi) { 307 static void separate_arf_mbs(VP9_COMP *cpi) {
316 VP9_COMMON *const cm = &cpi->common; 308 VP9_COMMON *const cm = &cpi->common;
317 int mb_col, mb_row, offset, i; 309 int mb_col, mb_row, offset, i;
318 int ncnt[4]; 310 int ncnt[4] = { 0 };
319 int n_frames = cpi->mbgraph_n_frames; 311 int n_frames = cpi->mbgraph_n_frames;
320 312
321 int *arf_not_zz; 313 int *arf_not_zz;
322 314
323 CHECK_MEM_ERROR(cm, arf_not_zz, 315 CHECK_MEM_ERROR(cm, arf_not_zz,
324 vpx_calloc(cm->mb_rows * cm->mb_cols * sizeof(*arf_not_zz), 316 vpx_calloc(cm->mb_rows * cm->mb_cols * sizeof(*arf_not_zz),
325 1)); 317 1));
326 318
327 // We are not interested in results beyond the alt ref itself. 319 // We are not interested in results beyond the alt ref itself.
328 if (n_frames > cpi->frames_till_gf_update_due) 320 if (n_frames > cpi->frames_till_gf_update_due)
(...skipping 15 matching lines...) Expand all
344 // Test for altref vs intra and gf and that its mv was 0,0. 336 // Test for altref vs intra and gf and that its mv was 0,0.
345 if (altref_err > 1000 || 337 if (altref_err > 1000 ||
346 altref_err > intra_err || 338 altref_err > intra_err ||
347 altref_err > golden_err) { 339 altref_err > golden_err) {
348 arf_not_zz[offset + mb_col]++; 340 arf_not_zz[offset + mb_col]++;
349 } 341 }
350 } 342 }
351 } 343 }
352 } 344 }
353 345
354 vpx_memset(ncnt, 0, sizeof(ncnt));
355 for (offset = 0, mb_row = 0; mb_row < cm->mb_rows; 346 for (offset = 0, mb_row = 0; mb_row < cm->mb_rows;
356 offset += cm->mb_cols, mb_row++) { 347 offset += cm->mb_cols, mb_row++) {
357 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) { 348 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) {
358 // If any of the blocks in the sequence failed then the MB 349 // If any of the blocks in the sequence failed then the MB
359 // goes in segment 0 350 // goes in segment 0
360 if (arf_not_zz[offset + mb_col]) { 351 if (arf_not_zz[offset + mb_col]) {
361 ncnt[0]++; 352 ncnt[0]++;
362 cpi->segmentation_map[offset * 4 + 2 * mb_col] = 0; 353 cpi->segmentation_map[offset * 4 + 2 * mb_col] = 0;
363 cpi->segmentation_map[offset * 4 + 2 * mb_col + 1] = 0; 354 cpi->segmentation_map[offset * 4 + 2 * mb_col + 1] = 0;
364 cpi->segmentation_map[offset * 4 + 2 * mb_col + cm->mi_cols] = 0; 355 cpi->segmentation_map[offset * 4 + 2 * mb_col + cm->mi_cols] = 0;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 assert(q_cur != NULL); 420 assert(q_cur != NULL);
430 421
431 update_mbgraph_frame_stats(cpi, frame_stats, &q_cur->img, 422 update_mbgraph_frame_stats(cpi, frame_stats, &q_cur->img,
432 golden_ref, cpi->Source); 423 golden_ref, cpi->Source);
433 } 424 }
434 425
435 vp9_clear_system_state(); // __asm emms; 426 vp9_clear_system_state(); // __asm emms;
436 427
437 separate_arf_mbs(cpi); 428 separate_arf_mbs(cpi);
438 } 429 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_firstpass.c ('k') | source/libvpx/vp9/encoder/vp9_mcomp.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698