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

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

Issue 592203002: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 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_pickmode.h ('k') | source/libvpx/vp9/encoder/vp9_quantize.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) 2014 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2014 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 10 matching lines...) Expand all
21 #include "vp9/common/vp9_common.h" 21 #include "vp9/common/vp9_common.h"
22 #include "vp9/common/vp9_mvref_common.h" 22 #include "vp9/common/vp9_mvref_common.h"
23 #include "vp9/common/vp9_reconinter.h" 23 #include "vp9/common/vp9_reconinter.h"
24 #include "vp9/common/vp9_reconintra.h" 24 #include "vp9/common/vp9_reconintra.h"
25 25
26 #include "vp9/encoder/vp9_encoder.h" 26 #include "vp9/encoder/vp9_encoder.h"
27 #include "vp9/encoder/vp9_pickmode.h" 27 #include "vp9/encoder/vp9_pickmode.h"
28 #include "vp9/encoder/vp9_ratectrl.h" 28 #include "vp9/encoder/vp9_ratectrl.h"
29 #include "vp9/encoder/vp9_rd.h" 29 #include "vp9/encoder/vp9_rd.h"
30 30
31 typedef struct {
32 uint8_t *data;
33 int stride;
34 int in_use;
35 } PRED_BUFFER;
36
31 static int mv_refs_rt(const VP9_COMMON *cm, const MACROBLOCKD *xd, 37 static int mv_refs_rt(const VP9_COMMON *cm, const MACROBLOCKD *xd,
32 const TileInfo *const tile, 38 const TileInfo *const tile,
33 MODE_INFO *mi, MV_REFERENCE_FRAME ref_frame, 39 MODE_INFO *mi, MV_REFERENCE_FRAME ref_frame,
34 int_mv *mv_ref_list, 40 int_mv *mv_ref_list,
35 int mi_row, int mi_col) { 41 int mi_row, int mi_col) {
36 const int *ref_sign_bias = cm->ref_frame_sign_bias; 42 const int *ref_sign_bias = cm->ref_frame_sign_bias;
37 int i, refmv_count = 0; 43 int i, refmv_count = 0;
38 44
39 const POSITION *const mv_ref_search = mv_ref_blocks[mi->mbmi.sb_type]; 45 const POSITION *const mv_ref_search = mv_ref_blocks[mi->mbmi.sb_type];
40 46
41 int different_ref_found = 0; 47 int different_ref_found = 0;
42 int context_counter = 0; 48 int context_counter = 0;
43 int const_motion = 0; 49 int const_motion = 0;
44 50
45 // Blank the reference vector list 51 // Blank the reference vector list
46 vpx_memset(mv_ref_list, 0, sizeof(*mv_ref_list) * MAX_MV_REF_CANDIDATES); 52 vpx_memset(mv_ref_list, 0, sizeof(*mv_ref_list) * MAX_MV_REF_CANDIDATES);
47 53
48 // The nearest 2 blocks are treated differently 54 // The nearest 2 blocks are treated differently
49 // if the size < 8x8 we get the mv from the bmi substructure, 55 // if the size < 8x8 we get the mv from the bmi substructure,
50 // and we also need to keep a mode count. 56 // and we also need to keep a mode count.
51 for (i = 0; i < 2; ++i) { 57 for (i = 0; i < 2; ++i) {
52 const POSITION *const mv_ref = &mv_ref_search[i]; 58 const POSITION *const mv_ref = &mv_ref_search[i];
53 if (is_inside(tile, mi_col, mi_row, cm->mi_rows, mv_ref)) { 59 if (is_inside(tile, mi_col, mi_row, cm->mi_rows, mv_ref)) {
54 const MODE_INFO *const candidate_mi = xd->mi[mv_ref->col + mv_ref->row * 60 const MODE_INFO *const candidate_mi = xd->mi[mv_ref->col + mv_ref->row *
55 xd->mi_stride]; 61 xd->mi_stride].src_mi;
56 const MB_MODE_INFO *const candidate = &candidate_mi->mbmi; 62 const MB_MODE_INFO *const candidate = &candidate_mi->mbmi;
57 // Keep counts for entropy encoding. 63 // Keep counts for entropy encoding.
58 context_counter += mode_2_counter[candidate->mode]; 64 context_counter += mode_2_counter[candidate->mode];
59 different_ref_found = 1; 65 different_ref_found = 1;
60 66
61 if (candidate->ref_frame[0] == ref_frame) 67 if (candidate->ref_frame[0] == ref_frame)
62 ADD_MV_REF_LIST(get_sub_block_mv(candidate_mi, 0, mv_ref->col, -1)); 68 ADD_MV_REF_LIST(get_sub_block_mv(candidate_mi, 0, mv_ref->col, -1));
63 } 69 }
64 } 70 }
65 71
66 const_motion = 1; 72 const_motion = 1;
67 73
68 // Check the rest of the neighbors in much the same way 74 // Check the rest of the neighbors in much the same way
69 // as before except we don't need to keep track of sub blocks or 75 // as before except we don't need to keep track of sub blocks or
70 // mode counts. 76 // mode counts.
71 for (; i < MVREF_NEIGHBOURS && !refmv_count; ++i) { 77 for (; i < MVREF_NEIGHBOURS && !refmv_count; ++i) {
72 const POSITION *const mv_ref = &mv_ref_search[i]; 78 const POSITION *const mv_ref = &mv_ref_search[i];
73 if (is_inside(tile, mi_col, mi_row, cm->mi_rows, mv_ref)) { 79 if (is_inside(tile, mi_col, mi_row, cm->mi_rows, mv_ref)) {
74 const MB_MODE_INFO *const candidate = &xd->mi[mv_ref->col + mv_ref->row * 80 const MB_MODE_INFO *const candidate = &xd->mi[mv_ref->col + mv_ref->row *
75 xd->mi_stride]->mbmi; 81 xd->mi_stride].src_mi->mbmi;
76 different_ref_found = 1; 82 different_ref_found = 1;
77 83
78 if (candidate->ref_frame[0] == ref_frame) 84 if (candidate->ref_frame[0] == ref_frame)
79 ADD_MV_REF_LIST(candidate->mv[0]); 85 ADD_MV_REF_LIST(candidate->mv[0]);
80 } 86 }
81 } 87 }
82 88
83 // Since we couldn't find 2 mvs from the same reference frame 89 // Since we couldn't find 2 mvs from the same reference frame
84 // go back through the neighbors and find motion vectors from 90 // go back through the neighbors and find motion vectors from
85 // different reference frames. 91 // different reference frames.
86 if (different_ref_found && !refmv_count) { 92 if (different_ref_found && !refmv_count) {
87 for (i = 0; i < MVREF_NEIGHBOURS; ++i) { 93 for (i = 0; i < MVREF_NEIGHBOURS; ++i) {
88 const POSITION *mv_ref = &mv_ref_search[i]; 94 const POSITION *mv_ref = &mv_ref_search[i];
89 if (is_inside(tile, mi_col, mi_row, cm->mi_rows, mv_ref)) { 95 if (is_inside(tile, mi_col, mi_row, cm->mi_rows, mv_ref)) {
90 const MB_MODE_INFO *const candidate = &xd->mi[mv_ref->col + mv_ref->row 96 const MB_MODE_INFO *const candidate = &xd->mi[mv_ref->col + mv_ref->row
91 * xd->mi_stride]->mbmi; 97 * xd->mi_stride].src_mi->mbmi;
92 98
93 // If the candidate is INTRA we don't want to consider its mv. 99 // If the candidate is INTRA we don't want to consider its mv.
94 IF_DIFF_REF_FRAME_ADD_MV(candidate); 100 IF_DIFF_REF_FRAME_ADD_MV(candidate);
95 } 101 }
96 } 102 }
97 } 103 }
98 104
99 Done: 105 Done:
100 106
101 mi->mbmi.mode_context[ref_frame] = counter_to_context[context_counter]; 107 mi->mbmi.mode_context[ref_frame] = counter_to_context[context_counter];
102 108
103 // Clamp vectors 109 // Clamp vectors
104 for (i = 0; i < MAX_MV_REF_CANDIDATES; ++i) 110 for (i = 0; i < MAX_MV_REF_CANDIDATES; ++i)
105 clamp_mv_ref(&mv_ref_list[i].as_mv, xd); 111 clamp_mv_ref(&mv_ref_list[i].as_mv, xd);
106 112
107 return const_motion; 113 return const_motion;
108 } 114 }
109 115
110 static int combined_motion_search(VP9_COMP *cpi, MACROBLOCK *x, 116 static int combined_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
111 BLOCK_SIZE bsize, int mi_row, int mi_col, 117 BLOCK_SIZE bsize, int mi_row, int mi_col,
112 int_mv *tmp_mv, int *rate_mv, 118 int_mv *tmp_mv, int *rate_mv,
113 int64_t best_rd_sofar) { 119 int64_t best_rd_sofar) {
114 MACROBLOCKD *xd = &x->e_mbd; 120 MACROBLOCKD *xd = &x->e_mbd;
115 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; 121 MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi;
116 struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0, 0}}; 122 struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0, 0}};
117 const int step_param = cpi->sf.mv.fullpel_search_step_param; 123 const int step_param = cpi->sf.mv.fullpel_search_step_param;
118 const int sadpb = x->sadperbit16; 124 const int sadpb = x->sadperbit16;
119 MV mvp_full; 125 MV mvp_full;
120 const int ref = mbmi->ref_frame[0]; 126 const int ref = mbmi->ref_frame[0];
121 const MV ref_mv = mbmi->ref_mvs[ref][0].as_mv; 127 const MV ref_mv = mbmi->ref_mvs[ref][0].as_mv;
122 int dis; 128 int dis;
123 int rate_mode; 129 int rate_mode;
124 const int tmp_col_min = x->mv_col_min; 130 const int tmp_col_min = x->mv_col_min;
125 const int tmp_col_max = x->mv_col_max; 131 const int tmp_col_max = x->mv_col_max;
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 223
218 if (sse < dc_quant * dc_quant >> 6) 224 if (sse < dc_quant * dc_quant >> 6)
219 x->skip_txfm[0] = 1; 225 x->skip_txfm[0] = 1;
220 else if (var < ac_quant * ac_quant >> 6) 226 else if (var < ac_quant * ac_quant >> 6)
221 x->skip_txfm[0] = 2; 227 x->skip_txfm[0] = 2;
222 else 228 else
223 x->skip_txfm[0] = 0; 229 x->skip_txfm[0] = 0;
224 230
225 if (cpi->common.tx_mode == TX_MODE_SELECT) { 231 if (cpi->common.tx_mode == TX_MODE_SELECT) {
226 if (sse > (var << 2)) 232 if (sse > (var << 2))
227 xd->mi[0]->mbmi.tx_size = MIN(max_txsize_lookup[bsize], 233 xd->mi[0].src_mi->mbmi.tx_size =
228 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); 234 MIN(max_txsize_lookup[bsize],
235 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
229 else 236 else
230 xd->mi[0]->mbmi.tx_size = TX_8X8; 237 xd->mi[0].src_mi->mbmi.tx_size = TX_8X8;
231 } else { 238 } else {
232 xd->mi[0]->mbmi.tx_size = MIN(max_txsize_lookup[bsize], 239 xd->mi[0].src_mi->mbmi.tx_size =
233 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); 240 MIN(max_txsize_lookup[bsize],
241 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
234 } 242 }
235 243
236 vp9_model_rd_from_var_lapndz(sse - var, 1 << num_pels_log2_lookup[bsize], 244 vp9_model_rd_from_var_lapndz(sse - var, 1 << num_pels_log2_lookup[bsize],
237 dc_quant >> 3, &rate, &dist); 245 dc_quant >> 3, &rate, &dist);
238 *out_rate_sum = rate >> 1; 246 *out_rate_sum = rate >> 1;
239 *out_dist_sum = dist << 3; 247 *out_dist_sum = dist << 3;
240 248
241 vp9_model_rd_from_var_lapndz(var, 1 << num_pels_log2_lookup[bsize], 249 vp9_model_rd_from_var_lapndz(var, 1 << num_pels_log2_lookup[bsize],
242 ac_quant >> 3, &rate, &dist); 250 ac_quant >> 3, &rate, &dist);
243 *out_rate_sum += rate; 251 *out_rate_sum += rate;
(...skipping 18 matching lines...) Expand all
262 } 270 }
263 271
264 static void encode_breakout_test(VP9_COMP *cpi, MACROBLOCK *x, 272 static void encode_breakout_test(VP9_COMP *cpi, MACROBLOCK *x,
265 BLOCK_SIZE bsize, int mi_row, int mi_col, 273 BLOCK_SIZE bsize, int mi_row, int mi_col,
266 MV_REFERENCE_FRAME ref_frame, 274 MV_REFERENCE_FRAME ref_frame,
267 PREDICTION_MODE this_mode, 275 PREDICTION_MODE this_mode,
268 unsigned int var_y, unsigned int sse_y, 276 unsigned int var_y, unsigned int sse_y,
269 struct buf_2d yv12_mb[][MAX_MB_PLANE], 277 struct buf_2d yv12_mb[][MAX_MB_PLANE],
270 int *rate, int64_t *dist) { 278 int *rate, int64_t *dist) {
271 MACROBLOCKD *xd = &x->e_mbd; 279 MACROBLOCKD *xd = &x->e_mbd;
272 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; 280 MB_MODE_INFO *mbmi = &xd->mi[0].src_mi->mbmi;
273 281
274 const BLOCK_SIZE uv_size = get_plane_block_size(bsize, &xd->plane[1]); 282 const BLOCK_SIZE uv_size = get_plane_block_size(bsize, &xd->plane[1]);
275 unsigned int var = var_y, sse = sse_y; 283 unsigned int var = var_y, sse = sse_y;
276 // Skipping threshold for ac. 284 // Skipping threshold for ac.
277 unsigned int thresh_ac; 285 unsigned int thresh_ac;
278 // Skipping threshold for dc. 286 // Skipping threshold for dc.
279 unsigned int thresh_dc; 287 unsigned int thresh_dc;
280 if (x->encode_breakout > 0) { 288 if (x->encode_breakout > 0) {
281 // Set a maximum for threshold to avoid big PSNR loss in low bit rate 289 // Set a maximum for threshold to avoid big PSNR loss in low bit rate
282 // case. Use extreme low threshold for static frames to limit 290 // case. Use extreme low threshold for static frames to limit
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 x->plane[2].src.stride, 332 x->plane[2].src.stride,
325 xd->plane[2].dst.buf, 333 xd->plane[2].dst.buf,
326 xd->plane[2].dst.stride, &sse_v); 334 xd->plane[2].dst.stride, &sse_v);
327 335
328 // V skipping condition checking 336 // V skipping condition checking
329 if ((var_v * 4 <= thresh_ac) && (sse_v - var_v <= thresh_dc)) { 337 if ((var_v * 4 <= thresh_ac) && (sse_v - var_v <= thresh_dc)) {
330 x->skip = 1; 338 x->skip = 1;
331 339
332 // The cost of skip bit needs to be added. 340 // The cost of skip bit needs to be added.
333 *rate = cpi->inter_mode_cost[mbmi->mode_context[ref_frame]] 341 *rate = cpi->inter_mode_cost[mbmi->mode_context[ref_frame]]
334 [INTER_OFFSET(this_mode)]; 342 [INTER_OFFSET(this_mode)];
335 343
336 // More on this part of rate 344 // More on this part of rate
337 // rate += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1); 345 // rate += vp9_cost_bit(vp9_get_skip_prob(cm, xd), 1);
338 346
339 // Scaling factor for SSE from spatial domain to frequency 347 // Scaling factor for SSE from spatial domain to frequency
340 // domain is 16. Adjust distortion accordingly. 348 // domain is 16. Adjust distortion accordingly.
341 // TODO(yunqingwang): In this function, only y-plane dist is 349 // TODO(yunqingwang): In this function, only y-plane dist is
342 // calculated. 350 // calculated.
343 *dist = (sse << 4); // + ((sse_u + sse_v) << 4); 351 *dist = (sse << 4); // + ((sse_u + sse_v) << 4);
344 352
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 } 403 }
396 404
397 static const THR_MODES mode_idx[MAX_REF_FRAMES - 1][INTER_MODES] = { 405 static const THR_MODES mode_idx[MAX_REF_FRAMES - 1][INTER_MODES] = {
398 {THR_NEARESTMV, THR_NEARMV, THR_ZEROMV, THR_NEWMV}, 406 {THR_NEARESTMV, THR_NEARMV, THR_ZEROMV, THR_NEWMV},
399 {THR_NEARESTG, THR_NEARG, THR_ZEROG, THR_NEWG}, 407 {THR_NEARESTG, THR_NEARG, THR_ZEROG, THR_NEWG},
400 {THR_NEARESTA, THR_NEARA, THR_ZEROA, THR_NEWA}, 408 {THR_NEARESTA, THR_NEARA, THR_ZEROA, THR_NEWA},
401 }; 409 };
402 410
403 // TODO(jingning) placeholder for inter-frame non-RD mode decision. 411 // TODO(jingning) placeholder for inter-frame non-RD mode decision.
404 // this needs various further optimizations. to be continued.. 412 // this needs various further optimizations. to be continued..
405 int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, 413 void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
406 const TileInfo *const tile, 414 const TileInfo *const tile,
407 int mi_row, int mi_col, 415 int mi_row, int mi_col,
408 int *returnrate, 416 int *returnrate,
409 int64_t *returndistortion, 417 int64_t *returndistortion,
410 BLOCK_SIZE bsize, 418 BLOCK_SIZE bsize,
411 PICK_MODE_CONTEXT *ctx) { 419 PICK_MODE_CONTEXT *ctx) {
412 MACROBLOCKD *xd = &x->e_mbd; 420 VP9_COMMON *const cm = &cpi->common;
413 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; 421 MACROBLOCKD *const xd = &x->e_mbd;
422 MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi;
414 struct macroblockd_plane *const pd = &xd->plane[0]; 423 struct macroblockd_plane *const pd = &xd->plane[0];
415 PREDICTION_MODE this_mode, best_mode = ZEROMV; 424 PREDICTION_MODE best_mode = ZEROMV;
416 MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME; 425 MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME;
417 TX_SIZE best_tx_size = MIN(max_txsize_lookup[bsize], 426 TX_SIZE best_tx_size = MIN(max_txsize_lookup[bsize],
418 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); 427 tx_mode_to_biggest_tx_size[cm->tx_mode]);
419 INTERP_FILTER best_pred_filter = EIGHTTAP; 428 INTERP_FILTER best_pred_filter = EIGHTTAP;
420 int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES]; 429 int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES];
421 struct buf_2d yv12_mb[4][MAX_MB_PLANE]; 430 struct buf_2d yv12_mb[4][MAX_MB_PLANE];
422 static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG, 431 static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG,
423 VP9_ALT_FLAG }; 432 VP9_ALT_FLAG };
424 int64_t best_rd = INT64_MAX; 433 int64_t best_rd = INT64_MAX;
425 int64_t this_rd = INT64_MAX; 434 int64_t this_rd = INT64_MAX;
426 uint8_t skip_txfm = 0; 435 uint8_t skip_txfm = 0;
427 int rate = INT_MAX; 436 int rate = INT_MAX;
428 int64_t dist = INT64_MAX; 437 int64_t dist = INT64_MAX;
429 // var_y and sse_y are saved to be used in skipping checking 438 // var_y and sse_y are saved to be used in skipping checking
430 unsigned int var_y = UINT_MAX; 439 unsigned int var_y = UINT_MAX;
431 unsigned int sse_y = UINT_MAX; 440 unsigned int sse_y = UINT_MAX;
432 441
433 VP9_COMMON *cm = &cpi->common; 442 const int intra_cost_penalty =
434 int intra_cost_penalty = 20 * vp9_dc_quant(cm->base_qindex, cm->y_dc_delta_q); 443 20 * vp9_dc_quant(cm->base_qindex, cm->y_dc_delta_q, cm->bit_depth);
435
436 const int64_t inter_mode_thresh = RDCOST(x->rdmult, x->rddiv, 444 const int64_t inter_mode_thresh = RDCOST(x->rdmult, x->rddiv,
437 intra_cost_penalty, 0); 445 intra_cost_penalty, 0);
438 const int64_t intra_mode_cost = 50; 446 const int intra_mode_cost = 50;
439 447
440 unsigned char segment_id = mbmi->segment_id; 448 const int8_t segment_id = mbmi->segment_id;
441 const int *const rd_threshes = cpi->rd.threshes[segment_id][bsize]; 449 const int *const rd_threshes = cpi->rd.threshes[segment_id][bsize];
442 const int *const rd_thresh_freq_fact = cpi->rd.thresh_freq_fact[bsize]; 450 const int *const rd_thresh_freq_fact = cpi->rd.thresh_freq_fact[bsize];
443 // Mode index conversion form THR_MODES to PREDICTION_MODE for a ref frame.
444 INTERP_FILTER filter_ref = cm->interp_filter; 451 INTERP_FILTER filter_ref = cm->interp_filter;
445 int bsl = mi_width_log2(bsize); 452 const int bsl = mi_width_log2(bsize);
446 const int pred_filter_search = cm->interp_filter == SWITCHABLE ? 453 const int pred_filter_search = cm->interp_filter == SWITCHABLE ?
447 (((mi_row + mi_col) >> bsl) + 454 (((mi_row + mi_col) >> bsl) +
448 get_chessboard_index(cm->current_video_frame)) & 0x1 : 0; 455 get_chessboard_index(cm->current_video_frame)) & 0x1 : 0;
449 int const_motion[MAX_REF_FRAMES] = { 0 }; 456 int const_motion[MAX_REF_FRAMES] = { 0 };
450 const int bh = num_4x4_blocks_high_lookup[bsize] << 2; 457 const int bh = num_4x4_blocks_high_lookup[bsize] << 2;
451 const int bw = num_4x4_blocks_wide_lookup[bsize] << 2; 458 const int bw = num_4x4_blocks_wide_lookup[bsize] << 2;
452 const int pixels_in_block = bh * bw;
453 // For speed 6, the result of interp filter is reused later in actual encoding 459 // For speed 6, the result of interp filter is reused later in actual encoding
454 // process. 460 // process.
455 // tmp[3] points to dst buffer, and the other 3 point to allocated buffers. 461 // tmp[3] points to dst buffer, and the other 3 point to allocated buffers.
456 PRED_BUFFER tmp[4]; 462 PRED_BUFFER tmp[4];
457 DECLARE_ALIGNED_ARRAY(16, uint8_t, pred_buf, 3 * 64 * 64); 463 DECLARE_ALIGNED_ARRAY(16, uint8_t, pred_buf, 3 * 64 * 64);
458 struct buf_2d orig_dst = pd->dst; 464 struct buf_2d orig_dst = pd->dst;
459 PRED_BUFFER *best_pred = NULL; 465 PRED_BUFFER *best_pred = NULL;
460 PRED_BUFFER *this_mode_pred = NULL; 466 PRED_BUFFER *this_mode_pred = NULL;
461 int i;
462 467
463 // CTX is used by the temporal denoiser which is currently being developed.
464 // TODO(jbb): when temporal denoiser is finished and in the default build
465 // remove the following line;
466 (void) ctx;
467 if (cpi->sf.reuse_inter_pred_sby) { 468 if (cpi->sf.reuse_inter_pred_sby) {
469 int i;
468 for (i = 0; i < 3; i++) { 470 for (i = 0; i < 3; i++) {
469 tmp[i].data = &pred_buf[pixels_in_block * i]; 471 tmp[i].data = &pred_buf[bw * bh * i];
470 tmp[i].stride = bw; 472 tmp[i].stride = bw;
471 tmp[i].in_use = 0; 473 tmp[i].in_use = 0;
472 } 474 }
473 tmp[3].data = pd->dst.buf; 475 tmp[3].data = pd->dst.buf;
474 tmp[3].stride = pd->dst.stride; 476 tmp[3].stride = pd->dst.stride;
475 tmp[3].in_use = 0; 477 tmp[3].in_use = 0;
476 } 478 }
477 479
478 x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH; 480 x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH;
479 x->skip = 0; 481 x->skip = 0;
480 482
481 // initialize mode decisions 483 // initialize mode decisions
482 *returnrate = INT_MAX; 484 *returnrate = INT_MAX;
483 *returndistortion = INT64_MAX; 485 *returndistortion = INT64_MAX;
484 vpx_memset(mbmi, 0, sizeof(MB_MODE_INFO)); 486 vpx_memset(mbmi, 0, sizeof(MB_MODE_INFO));
485 mbmi->sb_type = bsize; 487 mbmi->sb_type = bsize;
486 mbmi->ref_frame[0] = NONE; 488 mbmi->ref_frame[0] = NONE;
487 mbmi->ref_frame[1] = NONE; 489 mbmi->ref_frame[1] = NONE;
488 mbmi->tx_size = MIN(max_txsize_lookup[bsize], 490 mbmi->tx_size = MIN(max_txsize_lookup[bsize],
489 tx_mode_to_biggest_tx_size[cm->tx_mode]); 491 tx_mode_to_biggest_tx_size[cm->tx_mode]);
490 mbmi->interp_filter = cm->interp_filter == SWITCHABLE ? 492 mbmi->interp_filter = cm->interp_filter == SWITCHABLE ?
491 EIGHTTAP : cm->interp_filter; 493 EIGHTTAP : cm->interp_filter;
492 mbmi->segment_id = segment_id; 494 mbmi->segment_id = segment_id;
493 495
494 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { 496 for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
497 PREDICTION_MODE this_mode;
495 x->pred_mv_sad[ref_frame] = INT_MAX; 498 x->pred_mv_sad[ref_frame] = INT_MAX;
496 frame_mv[NEWMV][ref_frame].as_int = INVALID_MV; 499 frame_mv[NEWMV][ref_frame].as_int = INVALID_MV;
497 frame_mv[ZEROMV][ref_frame].as_int = 0; 500 frame_mv[ZEROMV][ref_frame].as_int = 0;
498 501
499 if (xd->up_available) 502 if (xd->up_available)
500 filter_ref = xd->mi[-xd->mi_stride]->mbmi.interp_filter; 503 filter_ref = xd->mi[-xd->mi_stride].src_mi->mbmi.interp_filter;
501 else if (xd->left_available) 504 else if (xd->left_available)
502 filter_ref = xd->mi[-1]->mbmi.interp_filter; 505 filter_ref = xd->mi[-1].src_mi->mbmi.interp_filter;
503 506
504 if (cpi->ref_frame_flags & flag_list[ref_frame]) { 507 if (cpi->ref_frame_flags & flag_list[ref_frame]) {
505 const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_buffer(cpi, ref_frame); 508 const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_buffer(cpi, ref_frame);
506 int_mv *const candidates = mbmi->ref_mvs[ref_frame]; 509 int_mv *const candidates = mbmi->ref_mvs[ref_frame];
507 const struct scale_factors *const sf = &cm->frame_refs[ref_frame - 1].sf; 510 const struct scale_factors *const sf = &cm->frame_refs[ref_frame - 1].sf;
508 vp9_setup_pred_block(xd, yv12_mb[ref_frame], yv12, mi_row, mi_col, 511 vp9_setup_pred_block(xd, yv12_mb[ref_frame], yv12, mi_row, mi_col,
509 sf, sf); 512 sf, sf);
510 513
511 if (!cm->error_resilient_mode) 514 if (!cm->error_resilient_mode)
512 vp9_find_mv_refs(cm, xd, tile, xd->mi[0], ref_frame, 515 vp9_find_mv_refs(cm, xd, tile, xd->mi[0].src_mi, ref_frame,
513 candidates, mi_row, mi_col); 516 candidates, mi_row, mi_col);
514 else 517 else
515 const_motion[ref_frame] = mv_refs_rt(cm, xd, tile, xd->mi[0], 518 const_motion[ref_frame] = mv_refs_rt(cm, xd, tile, xd->mi[0].src_mi,
516 ref_frame, candidates, 519 ref_frame, candidates,
517 mi_row, mi_col); 520 mi_row, mi_col);
518 521
519 vp9_find_best_ref_mvs(xd, cm->allow_high_precision_mv, candidates, 522 vp9_find_best_ref_mvs(xd, cm->allow_high_precision_mv, candidates,
520 &frame_mv[NEARESTMV][ref_frame], 523 &frame_mv[NEARESTMV][ref_frame],
521 &frame_mv[NEARMV][ref_frame]); 524 &frame_mv[NEARMV][ref_frame]);
522 525
523 if (!vp9_is_scaled(sf) && bsize >= BLOCK_8X8) 526 if (!vp9_is_scaled(sf) && bsize >= BLOCK_8X8)
524 vp9_mv_pred(cpi, x, yv12_mb[ref_frame][0].buf, yv12->y_stride, 527 vp9_mv_pred(cpi, x, yv12_mb[ref_frame][0].buf, yv12->y_stride,
525 ref_frame, bsize); 528 ref_frame, bsize);
(...skipping 13 matching lines...) Expand all
539 int rate_mv = 0; 542 int rate_mv = 0;
540 int mode_rd_thresh; 543 int mode_rd_thresh;
541 544
542 if (const_motion[ref_frame] && 545 if (const_motion[ref_frame] &&
543 (this_mode == NEARMV || this_mode == ZEROMV)) 546 (this_mode == NEARMV || this_mode == ZEROMV))
544 continue; 547 continue;
545 548
546 if (!(cpi->sf.inter_mode_mask[bsize] & (1 << this_mode))) 549 if (!(cpi->sf.inter_mode_mask[bsize] & (1 << this_mode)))
547 continue; 550 continue;
548 551
549 mode_rd_thresh = rd_threshes[mode_idx[ref_frame - LAST_FRAME] 552 mode_rd_thresh =
550 [INTER_OFFSET(this_mode)]]; 553 rd_threshes[mode_idx[ref_frame -
554 LAST_FRAME][INTER_OFFSET(this_mode)]];
551 if (rd_less_than_thresh(best_rd, mode_rd_thresh, 555 if (rd_less_than_thresh(best_rd, mode_rd_thresh,
552 rd_thresh_freq_fact[this_mode])) 556 rd_thresh_freq_fact[this_mode]))
553 continue; 557 continue;
554 558
555 if (this_mode == NEWMV) { 559 if (this_mode == NEWMV) {
556 if (this_rd < (int64_t)(1 << num_pels_log2_lookup[bsize])) 560 if (this_rd < (int64_t)(1 << num_pels_log2_lookup[bsize]))
557 continue; 561 continue;
558 if (!combined_motion_search(cpi, x, bsize, mi_row, mi_col, 562 if (!combined_motion_search(cpi, x, bsize, mi_row, mi_col,
559 &frame_mv[NEWMV][ref_frame], 563 &frame_mv[NEWMV][ref_frame],
560 &rate_mv, best_rd)) 564 &rate_mv, best_rd))
561 continue; 565 continue;
562 } 566 }
563 567
564 if (this_mode != NEARESTMV && 568 if (this_mode != NEARESTMV &&
565 frame_mv[this_mode][ref_frame].as_int == 569 frame_mv[this_mode][ref_frame].as_int ==
566 frame_mv[NEARESTMV][ref_frame].as_int) 570 frame_mv[NEARESTMV][ref_frame].as_int)
567 continue; 571 continue;
568 572
569 mbmi->mode = this_mode; 573 mbmi->mode = this_mode;
570 mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int; 574 mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int;
571 575
572 // Search for the best prediction filter type, when the resulting 576 // Search for the best prediction filter type, when the resulting
573 // motion vector is at sub-pixel accuracy level for luma component, i.e., 577 // motion vector is at sub-pixel accuracy level for luma component, i.e.,
574 // the last three bits are all zeros. 578 // the last three bits are all zeros.
575 if (cpi->sf.reuse_inter_pred_sby) { 579 if (cpi->sf.reuse_inter_pred_sby) {
576 if (this_mode == NEARESTMV) { 580 if (this_mode == NEARESTMV) {
577 this_mode_pred = &tmp[3]; 581 this_mode_pred = &tmp[3];
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 sse_y = pf_sse[mbmi->interp_filter]; 640 sse_y = pf_sse[mbmi->interp_filter];
637 x->skip_txfm[0] = skip_txfm; 641 x->skip_txfm[0] = skip_txfm;
638 } else { 642 } else {
639 mbmi->interp_filter = (filter_ref == SWITCHABLE) ? EIGHTTAP: filter_ref; 643 mbmi->interp_filter = (filter_ref == SWITCHABLE) ? EIGHTTAP: filter_ref;
640 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize); 644 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize);
641 model_rd_for_sb_y(cpi, bsize, x, xd, &rate, &dist, &var_y, &sse_y); 645 model_rd_for_sb_y(cpi, bsize, x, xd, &rate, &dist, &var_y, &sse_y);
642 } 646 }
643 647
644 rate += rate_mv; 648 rate += rate_mv;
645 rate += cpi->inter_mode_cost[mbmi->mode_context[ref_frame]] 649 rate += cpi->inter_mode_cost[mbmi->mode_context[ref_frame]]
646 [INTER_OFFSET(this_mode)]; 650 [INTER_OFFSET(this_mode)];
647 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); 651 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist);
648 652
649 // Skipping checking: test to see if this block can be reconstructed by 653 // Skipping checking: test to see if this block can be reconstructed by
650 // prediction only. 654 // prediction only.
651 if (cpi->allow_encode_breakout) { 655 if (cpi->allow_encode_breakout) {
652 encode_breakout_test(cpi, x, bsize, mi_row, mi_col, ref_frame, 656 encode_breakout_test(cpi, x, bsize, mi_row, mi_col, ref_frame,
653 this_mode, var_y, sse_y, yv12_mb, &rate, &dist); 657 this_mode, var_y, sse_y, yv12_mb, &rate, &dist);
654 if (x->skip) { 658 if (x->skip) {
655 rate += rate_mv; 659 rate += rate_mv;
656 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist); 660 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist);
657 } 661 }
658 } 662 }
659 663
660 #if CONFIG_VP9_TEMPORAL_DENOISING 664 #if CONFIG_VP9_TEMPORAL_DENOISING
661 if (cpi->oxcf.noise_sensitivity > 0) { 665 if (cpi->oxcf.noise_sensitivity > 0) {
662 vp9_denoiser_update_frame_stats(mbmi, sse_y, this_mode, ctx); 666 vp9_denoiser_update_frame_stats(mbmi, sse_y, this_mode, ctx);
663 } 667 }
668 #else
669 (void)ctx;
664 #endif 670 #endif
665 671
666 if (this_rd < best_rd || x->skip) { 672 if (this_rd < best_rd || x->skip) {
667 best_rd = this_rd; 673 best_rd = this_rd;
668 *returnrate = rate; 674 *returnrate = rate;
669 *returndistortion = dist; 675 *returndistortion = dist;
670 best_mode = this_mode; 676 best_mode = this_mode;
671 best_pred_filter = mbmi->interp_filter; 677 best_pred_filter = mbmi->interp_filter;
672 best_tx_size = mbmi->tx_size; 678 best_tx_size = mbmi->tx_size;
673 best_ref_frame = ref_frame; 679 best_ref_frame = ref_frame;
(...skipping 15 matching lines...) Expand all
689 // If the current reference frame is valid and we found a usable mode, 695 // If the current reference frame is valid and we found a usable mode,
690 // we are done. 696 // we are done.
691 if (best_rd < INT64_MAX) 697 if (best_rd < INT64_MAX)
692 break; 698 break;
693 } 699 }
694 700
695 // If best prediction is not in dst buf, then copy the prediction block from 701 // If best prediction is not in dst buf, then copy the prediction block from
696 // temp buf to dst buf. 702 // temp buf to dst buf.
697 if (best_pred != NULL && cpi->sf.reuse_inter_pred_sby && 703 if (best_pred != NULL && cpi->sf.reuse_inter_pred_sby &&
698 best_pred->data != orig_dst.buf) { 704 best_pred->data != orig_dst.buf) {
699 uint8_t *copy_from, *copy_to;
700
701 pd->dst = orig_dst; 705 pd->dst = orig_dst;
702 copy_to = pd->dst.buf; 706 vp9_convolve_copy(best_pred->data, bw, pd->dst.buf, pd->dst.stride, NULL, 0,
703 707 NULL, 0, bw, bh);
704 copy_from = best_pred->data;
705
706 vp9_convolve_copy(copy_from, bw, copy_to, pd->dst.stride, NULL, 0, NULL, 0,
707 bw, bh);
708 } 708 }
709 709
710 mbmi->mode = best_mode; 710 mbmi->mode = best_mode;
711 mbmi->interp_filter = best_pred_filter; 711 mbmi->interp_filter = best_pred_filter;
712 mbmi->tx_size = best_tx_size; 712 mbmi->tx_size = best_tx_size;
713 mbmi->ref_frame[0] = best_ref_frame; 713 mbmi->ref_frame[0] = best_ref_frame;
714 mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int; 714 mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int;
715 xd->mi[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; 715 xd->mi[0].src_mi->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int;
716 x->skip_txfm[0] = skip_txfm; 716 x->skip_txfm[0] = skip_txfm;
717 717
718 // Perform intra prediction search, if the best SAD is above a certain 718 // Perform intra prediction search, if the best SAD is above a certain
719 // threshold. 719 // threshold.
720 if (!x->skip && best_rd > inter_mode_thresh && 720 if (!x->skip && best_rd > inter_mode_thresh &&
721 bsize <= cpi->sf.max_intra_bsize) { 721 bsize <= cpi->sf.max_intra_bsize) {
722 PREDICTION_MODE this_mode;
722 struct estimate_block_intra_args args = { cpi, x, DC_PRED, 0, 0 }; 723 struct estimate_block_intra_args args = { cpi, x, DC_PRED, 0, 0 };
723
724 const TX_SIZE intra_tx_size = 724 const TX_SIZE intra_tx_size =
725 MIN(max_txsize_lookup[bsize], 725 MIN(max_txsize_lookup[bsize],
726 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); 726 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
727 727
728 if (cpi->sf.reuse_inter_pred_sby) { 728 if (cpi->sf.reuse_inter_pred_sby) {
729 pd->dst.buf = tmp[0].data; 729 pd->dst.buf = tmp[0].data;
730 pd->dst.stride = bw; 730 pd->dst.stride = bw;
731 } 731 }
732 732
733 for (this_mode = DC_PRED; this_mode <= DC_PRED; ++this_mode) { 733 for (this_mode = DC_PRED; this_mode <= DC_PRED; ++this_mode) {
(...skipping 20 matching lines...) Expand all
754 mbmi->ref_frame[0] = INTRA_FRAME; 754 mbmi->ref_frame[0] = INTRA_FRAME;
755 mbmi->uv_mode = this_mode; 755 mbmi->uv_mode = this_mode;
756 mbmi->mv[0].as_int = INVALID_MV; 756 mbmi->mv[0].as_int = INVALID_MV;
757 } else { 757 } else {
758 x->skip_txfm[0] = skip_txfm; 758 x->skip_txfm[0] = skip_txfm;
759 } 759 }
760 } 760 }
761 if (cpi->sf.reuse_inter_pred_sby) 761 if (cpi->sf.reuse_inter_pred_sby)
762 pd->dst = orig_dst; 762 pd->dst = orig_dst;
763 } 763 }
764
765 return INT64_MAX;
766 } 764 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_pickmode.h ('k') | source/libvpx/vp9/encoder/vp9_quantize.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698