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

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

Issue 1015483002: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: Created 5 years, 9 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
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_mcomp.c ('k') | source/libvpx/vp9/encoder/vp9_ratectrl.c » ('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 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 int dis; 130 int dis;
131 int rate_mode; 131 int rate_mode;
132 const int tmp_col_min = x->mv_col_min; 132 const int tmp_col_min = x->mv_col_min;
133 const int tmp_col_max = x->mv_col_max; 133 const int tmp_col_max = x->mv_col_max;
134 const int tmp_row_min = x->mv_row_min; 134 const int tmp_row_min = x->mv_row_min;
135 const int tmp_row_max = x->mv_row_max; 135 const int tmp_row_max = x->mv_row_max;
136 int rv = 0; 136 int rv = 0;
137 int cost_list[5]; 137 int cost_list[5];
138 const YV12_BUFFER_CONFIG *scaled_ref_frame = vp9_get_scaled_ref_frame(cpi, 138 const YV12_BUFFER_CONFIG *scaled_ref_frame = vp9_get_scaled_ref_frame(cpi,
139 ref); 139 ref);
140 if (cpi->common.show_frame &&
141 (x->pred_mv_sad[ref] >> 3) > x->pred_mv_sad[LAST_FRAME])
142 return rv;
143
144 if (scaled_ref_frame) { 140 if (scaled_ref_frame) {
145 int i; 141 int i;
146 // Swap out the reference frame for a version that's been scaled to 142 // Swap out the reference frame for a version that's been scaled to
147 // match the resolution of the current frame, allowing the existing 143 // match the resolution of the current frame, allowing the existing
148 // motion search code to be used without additional modifications. 144 // motion search code to be used without additional modifications.
149 for (i = 0; i < MAX_MB_PLANE; i++) 145 for (i = 0; i < MAX_MB_PLANE; i++)
150 backup_yv12[i] = xd->plane[i].pre[0]; 146 backup_yv12[i] = xd->plane[i].pre[0];
151 vp9_setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL); 147 vp9_setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL);
152 } 148 }
153 vp9_set_mv_search_range(x, &ref_mv); 149 vp9_set_mv_search_range(x, &ref_mv);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 int rate; 210 int rate;
215 int64_t dist; 211 int64_t dist;
216 struct macroblock_plane *const p = &x->plane[0]; 212 struct macroblock_plane *const p = &x->plane[0];
217 struct macroblockd_plane *const pd = &xd->plane[0]; 213 struct macroblockd_plane *const pd = &xd->plane[0];
218 const int64_t dc_thr = p->quant_thred[0] >> 6; 214 const int64_t dc_thr = p->quant_thred[0] >> 6;
219 const int64_t ac_thr = p->quant_thred[1] >> 6; 215 const int64_t ac_thr = p->quant_thred[1] >> 6;
220 const uint32_t dc_quant = pd->dequant[0]; 216 const uint32_t dc_quant = pd->dequant[0];
221 const uint32_t ac_quant = pd->dequant[1]; 217 const uint32_t ac_quant = pd->dequant[1];
222 unsigned int var = cpi->fn_ptr[bsize].vf(p->src.buf, p->src.stride, 218 unsigned int var = cpi->fn_ptr[bsize].vf(p->src.buf, p->src.stride,
223 pd->dst.buf, pd->dst.stride, &sse); 219 pd->dst.buf, pd->dst.stride, &sse);
220 int skip_dc = 0;
221
224 *var_y = var; 222 *var_y = var;
225 *sse_y = sse; 223 *sse_y = sse;
226 224
227 if (cpi->common.tx_mode == TX_MODE_SELECT) { 225 if (cpi->common.tx_mode == TX_MODE_SELECT) {
228 if (sse > (var << 2)) 226 if (sse > (var << 2))
229 xd->mi[0].src_mi->mbmi.tx_size = 227 xd->mi[0].src_mi->mbmi.tx_size =
230 MIN(max_txsize_lookup[bsize], 228 MIN(max_txsize_lookup[bsize],
231 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); 229 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
232 else 230 else
233 xd->mi[0].src_mi->mbmi.tx_size = TX_8X8; 231 xd->mi[0].src_mi->mbmi.tx_size = TX_8X8;
234 232
235 if (cpi->sf.partition_search_type == VAR_BASED_PARTITION) { 233 if (cpi->sf.partition_search_type == VAR_BASED_PARTITION) {
236 if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && 234 if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ &&
237 xd->mi[0].src_mi->mbmi.segment_id != CR_SEGMENT_ID_BASE) 235 cyclic_refresh_segment_id_boosted(xd->mi[0].src_mi->mbmi.segment_id))
238 xd->mi[0].src_mi->mbmi.tx_size = TX_8X8; 236 xd->mi[0].src_mi->mbmi.tx_size = TX_8X8;
239 else if (xd->mi[0].src_mi->mbmi.tx_size > TX_16X16) 237 else if (xd->mi[0].src_mi->mbmi.tx_size > TX_16X16)
240 xd->mi[0].src_mi->mbmi.tx_size = TX_16X16; 238 xd->mi[0].src_mi->mbmi.tx_size = TX_16X16;
241 } 239 }
242 } else { 240 } else {
243 xd->mi[0].src_mi->mbmi.tx_size = 241 xd->mi[0].src_mi->mbmi.tx_size =
244 MIN(max_txsize_lookup[bsize], 242 MIN(max_txsize_lookup[bsize],
245 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); 243 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
246 } 244 }
247 245
248 // Evaluate if the partition block is a skippable block in Y plane. 246 // Evaluate if the partition block is a skippable block in Y plane.
249 { 247 {
250 const BLOCK_SIZE unit_size = 248 const BLOCK_SIZE unit_size =
251 txsize_to_bsize[xd->mi[0].src_mi->mbmi.tx_size]; 249 txsize_to_bsize[xd->mi[0].src_mi->mbmi.tx_size];
252 const unsigned int num_blk_log2 = 250 const unsigned int num_blk_log2 =
253 (b_width_log2_lookup[bsize] - b_width_log2_lookup[unit_size]) + 251 (b_width_log2_lookup[bsize] - b_width_log2_lookup[unit_size]) +
254 (b_height_log2_lookup[bsize] - b_height_log2_lookup[unit_size]); 252 (b_height_log2_lookup[bsize] - b_height_log2_lookup[unit_size]);
255 const unsigned int sse_tx = sse >> num_blk_log2; 253 const unsigned int sse_tx = sse >> num_blk_log2;
256 const unsigned int var_tx = var >> num_blk_log2; 254 const unsigned int var_tx = var >> num_blk_log2;
257 255
258 x->skip_txfm[0] = 0; 256 x->skip_txfm[0] = 0;
259 // Check if all ac coefficients can be quantized to zero. 257 // Check if all ac coefficients can be quantized to zero.
260 if (var_tx < ac_thr || var == 0) { 258 if (var_tx < ac_thr || var == 0) {
261 x->skip_txfm[0] = 2; 259 x->skip_txfm[0] = 2;
262 // Check if dc coefficient can be quantized to zero. 260 // Check if dc coefficient can be quantized to zero.
263 if (sse_tx - var_tx < dc_thr || sse == var) 261 if (sse_tx - var_tx < dc_thr || sse == var)
264 x->skip_txfm[0] = 1; 262 x->skip_txfm[0] = 1;
263 } else {
264 if (sse_tx - var_tx < dc_thr || sse == var)
265 skip_dc = 1;
265 } 266 }
266 } 267 }
267 268
268 if (x->skip_txfm[0] == 1) { 269 if (x->skip_txfm[0] == 1) {
269 *out_rate_sum = 0; 270 *out_rate_sum = 0;
270 *out_dist_sum = sse << 4; 271 *out_dist_sum = sse << 4;
271 return; 272 return;
272 } 273 }
273 274
275 if (!skip_dc) {
276 #if CONFIG_VP9_HIGHBITDEPTH
277 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
278 vp9_model_rd_from_var_lapndz(sse - var, num_pels_log2_lookup[bsize],
279 dc_quant >> (xd->bd - 5), &rate, &dist);
280 } else {
281 vp9_model_rd_from_var_lapndz(sse - var, num_pels_log2_lookup[bsize],
282 dc_quant >> 3, &rate, &dist);
283 }
284 #else
285 vp9_model_rd_from_var_lapndz(sse - var, num_pels_log2_lookup[bsize],
286 dc_quant >> 3, &rate, &dist);
287 #endif // CONFIG_VP9_HIGHBITDEPTH
288 }
289
290 if (!skip_dc) {
291 *out_rate_sum = rate >> 1;
292 *out_dist_sum = dist << 3;
293 } else {
294 *out_rate_sum = 0;
295 *out_dist_sum = (sse - var) << 4;
296 }
297
274 #if CONFIG_VP9_HIGHBITDEPTH 298 #if CONFIG_VP9_HIGHBITDEPTH
275 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { 299 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
276 vp9_model_rd_from_var_lapndz(sse - var, num_pels_log2_lookup[bsize],
277 dc_quant >> (xd->bd - 5), &rate, &dist);
278 } else {
279 vp9_model_rd_from_var_lapndz(sse - var, num_pels_log2_lookup[bsize],
280 dc_quant >> 3, &rate, &dist);
281 }
282 #else
283 vp9_model_rd_from_var_lapndz(sse - var, num_pels_log2_lookup[bsize],
284 dc_quant >> 3, &rate, &dist);
285 #endif // CONFIG_VP9_HIGHBITDEPTH
286
287 *out_rate_sum = rate >> 1;
288 *out_dist_sum = dist << 3;
289
290 #if CONFIG_VP9_HIGHBITDEPTH
291 if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
292 vp9_model_rd_from_var_lapndz(var, num_pels_log2_lookup[bsize], 300 vp9_model_rd_from_var_lapndz(var, num_pels_log2_lookup[bsize],
293 ac_quant >> (xd->bd - 5), &rate, &dist); 301 ac_quant >> (xd->bd - 5), &rate, &dist);
294 } else { 302 } else {
295 vp9_model_rd_from_var_lapndz(var, num_pels_log2_lookup[bsize], 303 vp9_model_rd_from_var_lapndz(var, num_pels_log2_lookup[bsize],
296 ac_quant >> 3, &rate, &dist); 304 ac_quant >> 3, &rate, &dist);
297 } 305 }
298 #else 306 #else
299 vp9_model_rd_from_var_lapndz(var, num_pels_log2_lookup[bsize], 307 vp9_model_rd_from_var_lapndz(var, num_pels_log2_lookup[bsize],
300 ac_quant >> 3, &rate, &dist); 308 ac_quant >> 3, &rate, &dist);
301 #endif // CONFIG_VP9_HIGHBITDEPTH 309 #endif // CONFIG_VP9_HIGHBITDEPTH
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 595
588 if (this_rdc.rdcost < best_rdc.rdcost) { 596 if (this_rdc.rdcost < best_rdc.rdcost) {
589 best_rdc = this_rdc; 597 best_rdc = this_rdc;
590 mbmi->mode = this_mode; 598 mbmi->mode = this_mode;
591 } 599 }
592 } 600 }
593 601
594 *rd_cost = best_rdc; 602 *rd_cost = best_rdc;
595 } 603 }
596 604
597 static const PREDICTION_MODE inter_mode_set[INTER_MODES] = {
598 ZEROMV, NEARESTMV, NEARMV, NEWMV,
599 };
600
601 static const int ref_frame_cost[MAX_REF_FRAMES] = { 605 static const int ref_frame_cost[MAX_REF_FRAMES] = {
602 1235, 229, 530, 615, 606 1235, 229, 530, 615,
603 }; 607 };
608
609 typedef struct {
610 MV_REFERENCE_FRAME ref_frame;
611 PREDICTION_MODE pred_mode;
612 } REF_MODE;
613
614 #define RT_INTER_MODES 8
615 static const REF_MODE ref_mode_set[RT_INTER_MODES] = {
616 {LAST_FRAME, ZEROMV},
617 {LAST_FRAME, NEARESTMV},
618 {LAST_FRAME, NEARMV},
619 {LAST_FRAME, NEWMV},
620 {GOLDEN_FRAME, ZEROMV},
621 {GOLDEN_FRAME, NEARESTMV},
622 {GOLDEN_FRAME, NEARMV},
623 {GOLDEN_FRAME, NEWMV}
624 };
625
604 // TODO(jingning) placeholder for inter-frame non-RD mode decision. 626 // TODO(jingning) placeholder for inter-frame non-RD mode decision.
605 // this needs various further optimizations. to be continued.. 627 // this needs various further optimizations. to be continued..
606 void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, 628 void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
607 TileDataEnc *tile_data, 629 TileDataEnc *tile_data,
608 int mi_row, int mi_col, RD_COST *rd_cost, 630 int mi_row, int mi_col, RD_COST *rd_cost,
609 BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx) { 631 BLOCK_SIZE bsize, PICK_MODE_CONTEXT *ctx) {
610 VP9_COMMON *const cm = &cpi->common; 632 VP9_COMMON *const cm = &cpi->common;
611 TileInfo *const tile_info = &tile_data->tile_info; 633 TileInfo *const tile_info = &tile_data->tile_info;
612 MACROBLOCKD *const xd = &x->e_mbd; 634 MACROBLOCKD *const xd = &x->e_mbd;
613 MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi; 635 MB_MODE_INFO *const mbmi = &xd->mi[0].src_mi->mbmi;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 DECLARE_ALIGNED_ARRAY(16, uint8_t, pred_buf, 3 * 64 * 64); 672 DECLARE_ALIGNED_ARRAY(16, uint8_t, pred_buf, 3 * 64 * 64);
651 #if CONFIG_VP9_HIGHBITDEPTH 673 #if CONFIG_VP9_HIGHBITDEPTH
652 DECLARE_ALIGNED_ARRAY(16, uint16_t, pred_buf_16, 3 * 64 * 64); 674 DECLARE_ALIGNED_ARRAY(16, uint16_t, pred_buf_16, 3 * 64 * 64);
653 #endif 675 #endif
654 struct buf_2d orig_dst = pd->dst; 676 struct buf_2d orig_dst = pd->dst;
655 PRED_BUFFER *best_pred = NULL; 677 PRED_BUFFER *best_pred = NULL;
656 PRED_BUFFER *this_mode_pred = NULL; 678 PRED_BUFFER *this_mode_pred = NULL;
657 const int pixels_in_block = bh * bw; 679 const int pixels_in_block = bh * bw;
658 int reuse_inter_pred = cpi->sf.reuse_inter_pred_sby && ctx->pred_pixel_ready; 680 int reuse_inter_pred = cpi->sf.reuse_inter_pred_sby && ctx->pred_pixel_ready;
659 int ref_frame_skip_mask = 0; 681 int ref_frame_skip_mask = 0;
682 int idx;
660 683
661 if (reuse_inter_pred) { 684 if (reuse_inter_pred) {
662 int i; 685 int i;
663 for (i = 0; i < 3; i++) { 686 for (i = 0; i < 3; i++) {
664 #if CONFIG_VP9_HIGHBITDEPTH 687 #if CONFIG_VP9_HIGHBITDEPTH
665 if (cm->use_highbitdepth) 688 if (cm->use_highbitdepth)
666 tmp[i].data = CONVERT_TO_BYTEPTR(&pred_buf_16[pixels_in_block * i]); 689 tmp[i].data = CONVERT_TO_BYTEPTR(&pred_buf_16[pixels_in_block * i]);
667 else 690 else
668 tmp[i].data = &pred_buf[pixels_in_block * i]; 691 tmp[i].data = &pred_buf[pixels_in_block * i];
669 #else 692 #else
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 vp9_mv_pred(cpi, x, yv12_mb[ref_frame][0].buf, yv12->y_stride, 756 vp9_mv_pred(cpi, x, yv12_mb[ref_frame][0].buf, yv12->y_stride,
734 ref_frame, bsize); 757 ref_frame, bsize);
735 } else { 758 } else {
736 ref_frame_skip_mask |= (1 << ref_frame); 759 ref_frame_skip_mask |= (1 << ref_frame);
737 } 760 }
738 } 761 }
739 762
740 if (cpi->rc.frames_since_golden == 0) 763 if (cpi->rc.frames_since_golden == 0)
741 ref_frame_skip_mask |= (1 << GOLDEN_FRAME); 764 ref_frame_skip_mask |= (1 << GOLDEN_FRAME);
742 765
743 for (ref_frame = LAST_FRAME; ref_frame <= GOLDEN_FRAME; ++ref_frame) { 766 for (idx = 0; idx < RT_INTER_MODES; ++idx) {
744 PREDICTION_MODE this_mode; 767 int rate_mv = 0;
745 int i = (ref_frame == LAST_FRAME) ? GOLDEN_FRAME : LAST_FRAME; 768 int mode_rd_thresh;
769 int mode_index;
770 int i;
771 PREDICTION_MODE this_mode = ref_mode_set[idx].pred_mode;
772
773 ref_frame = ref_mode_set[idx].ref_frame;
774 mode_index = mode_idx[ref_frame][INTER_OFFSET(this_mode)];
775
776 i = (ref_frame == LAST_FRAME) ? GOLDEN_FRAME : LAST_FRAME;
746 777
747 if (!(cpi->ref_frame_flags & flag_list[ref_frame])) 778 if (!(cpi->ref_frame_flags & flag_list[ref_frame]))
748 continue; 779 continue;
749 780
750 if (cpi->ref_frame_flags & flag_list[i]) 781 if (cpi->ref_frame_flags & flag_list[i])
751 if (x->pred_mv_sad[ref_frame] > (x->pred_mv_sad[i] << 1)) 782 if (x->pred_mv_sad[ref_frame] > (x->pred_mv_sad[i] << 1))
752 ref_frame_skip_mask |= (1 << ref_frame); 783 ref_frame_skip_mask |= (1 << ref_frame);
753 784
754 if (ref_frame_skip_mask & (1 << ref_frame)) 785 if (ref_frame_skip_mask & (1 << ref_frame))
755 continue; 786 continue;
756 787
757 // Select prediction reference frames. 788 // Select prediction reference frames.
758 for (i = 0; i < MAX_MB_PLANE; i++) 789 for (i = 0; i < MAX_MB_PLANE; i++)
759 xd->plane[i].pre[0] = yv12_mb[ref_frame][i]; 790 xd->plane[i].pre[0] = yv12_mb[ref_frame][i];
760 791
761 clamp_mv2(&frame_mv[NEARESTMV][ref_frame].as_mv, xd); 792 clamp_mv2(&frame_mv[NEARESTMV][ref_frame].as_mv, xd);
762 clamp_mv2(&frame_mv[NEARMV][ref_frame].as_mv, xd); 793 clamp_mv2(&frame_mv[NEARMV][ref_frame].as_mv, xd);
763 794
764 mbmi->ref_frame[0] = ref_frame; 795 mbmi->ref_frame[0] = ref_frame;
765 set_ref_ptrs(cm, xd, ref_frame, NONE); 796 set_ref_ptrs(cm, xd, ref_frame, NONE);
766 797
767 for (i = 0; i < INTER_MODES; ++i) { 798 if (const_motion[ref_frame] && this_mode == NEARMV)
768 int rate_mv = 0; 799 continue;
769 int mode_rd_thresh;
770 int mode_index;
771 this_mode = inter_mode_set[i];
772 mode_index = mode_idx[ref_frame][INTER_OFFSET(this_mode)];
773 800
774 if (const_motion[ref_frame] && this_mode == NEARMV) 801 if (!(cpi->sf.inter_mode_mask[bsize] & (1 << this_mode)))
802 continue;
803
804 mode_rd_thresh = best_mode_skip_txfm ?
805 rd_threshes[mode_index] << 1 : rd_threshes[mode_index];
806 if (rd_less_than_thresh(best_rdc.rdcost, mode_rd_thresh,
807 rd_thresh_freq_fact[mode_index]))
808 continue;
809
810 if (this_mode == NEWMV) {
811 if (cpi->sf.partition_search_type != VAR_BASED_PARTITION
812 && best_rdc.rdcost < (int64_t) (1 << num_pels_log2_lookup[bsize]))
775 continue; 813 continue;
814 if (ref_frame > LAST_FRAME) {
815 int tmp_sad;
816 int dis, cost_list[5];
776 817
777 if (!(cpi->sf.inter_mode_mask[bsize] & (1 << this_mode))) 818 if (bsize < BLOCK_16X16)
819 continue;
820
821 tmp_sad = vp9_int_pro_motion_estimation(cpi, x, bsize);
822 if (tmp_sad > x->pred_mv_sad[LAST_FRAME])
823 continue;
824
825 frame_mv[NEWMV][ref_frame].as_int = mbmi->mv[0].as_int;
826 rate_mv = vp9_mv_bit_cost(&frame_mv[NEWMV][ref_frame].as_mv,
827 &mbmi->ref_mvs[ref_frame][0].as_mv,
828 x->nmvjointcost, x->mvcost, MV_COST_WEIGHT);
829 frame_mv[NEWMV][ref_frame].as_mv.row >>= 3;
830 frame_mv[NEWMV][ref_frame].as_mv.col >>= 3;
831
832 cpi->find_fractional_mv_step(x, &frame_mv[NEWMV][ref_frame].as_mv,
833 &mbmi->ref_mvs[ref_frame][0].as_mv,
834 cpi->common.allow_high_precision_mv,
835 x->errorperbit,
836 &cpi->fn_ptr[bsize],
837 cpi->sf.mv.subpel_force_stop,
838 cpi->sf.mv.subpel_iters_per_step,
839 cond_cost_list(cpi, cost_list),
840 x->nmvjointcost, x->mvcost, &dis,
841 &x->pred_sse[ref_frame], NULL, 0, 0);
842 } else if (!combined_motion_search(cpi, x, bsize, mi_row, mi_col,
843 &frame_mv[NEWMV][ref_frame], &rate_mv, best_rdc.rdcost)) {
778 continue; 844 continue;
845 }
846 }
779 847
780 mode_rd_thresh = best_mode_skip_txfm ? rd_threshes[mode_index] << 1 : 848 if (this_mode != NEARESTMV && frame_mv[this_mode][ref_frame].as_int ==
781 rd_threshes[mode_index]; 849 frame_mv[NEARESTMV][ref_frame].as_int)
782 if (rd_less_than_thresh(best_rdc.rdcost, mode_rd_thresh, 850 continue;
783 rd_thresh_freq_fact[mode_index]))
784 continue;
785 851
786 if (this_mode == NEWMV) { 852 mbmi->mode = this_mode;
787 if (ref_frame > LAST_FRAME) 853 mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int;
788 continue; 854
789 if (cpi->sf.partition_search_type != VAR_BASED_PARTITION && 855 // Search for the best prediction filter type, when the resulting
790 best_rdc.rdcost < (int64_t)(1 << num_pels_log2_lookup[bsize])) 856 // motion vector is at sub-pixel accuracy level for luma component, i.e.,
791 continue; 857 // the last three bits are all zeros.
792 if (!combined_motion_search(cpi, x, bsize, mi_row, mi_col, 858 if (reuse_inter_pred) {
793 &frame_mv[NEWMV][ref_frame], 859 if (!this_mode_pred) {
794 &rate_mv, best_rdc.rdcost)) 860 this_mode_pred = &tmp[3];
795 continue; 861 } else {
862 this_mode_pred = &tmp[get_pred_buffer(tmp, 3)];
863 pd->dst.buf = this_mode_pred->data;
864 pd->dst.stride = bw;
796 } 865 }
866 }
797 867
798 if (this_mode != NEARESTMV && 868 if ((this_mode == NEWMV || filter_ref == SWITCHABLE) && pred_filter_search
799 frame_mv[this_mode][ref_frame].as_int == 869 && (ref_frame == LAST_FRAME)
800 frame_mv[NEARESTMV][ref_frame].as_int) 870 && (((mbmi->mv[0].as_mv.row | mbmi->mv[0].as_mv.col) & 0x07) != 0)) {
801 continue; 871 int pf_rate[3];
872 int64_t pf_dist[3];
873 unsigned int pf_var[3];
874 unsigned int pf_sse[3];
875 TX_SIZE pf_tx_size[3];
876 int64_t best_cost = INT64_MAX;
877 INTERP_FILTER best_filter = SWITCHABLE, filter;
878 PRED_BUFFER *current_pred = this_mode_pred;
802 879
803 mbmi->mode = this_mode; 880 for (filter = EIGHTTAP; filter <= EIGHTTAP_SHARP; ++filter) {
804 mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int; 881 int64_t cost;
882 mbmi->interp_filter = filter;
883 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize);
884 model_rd_for_sb_y(cpi, bsize, x, xd, &pf_rate[filter], &pf_dist[filter],
885 &pf_var[filter], &pf_sse[filter]);
886 pf_rate[filter] += vp9_get_switchable_rate(cpi, xd);
887 cost = RDCOST(x->rdmult, x->rddiv, pf_rate[filter], pf_dist[filter]);
888 pf_tx_size[filter] = mbmi->tx_size;
889 if (cost < best_cost) {
890 best_filter = filter;
891 best_cost = cost;
892 skip_txfm = x->skip_txfm[0];
805 893
806 // Search for the best prediction filter type, when the resulting 894 if (reuse_inter_pred) {
807 // motion vector is at sub-pixel accuracy level for luma component, i.e., 895 if (this_mode_pred != current_pred) {
808 // the last three bits are all zeros. 896 free_pred_buffer(this_mode_pred);
809 if (reuse_inter_pred) { 897 this_mode_pred = current_pred;
810 if (!this_mode_pred) { 898 }
811 this_mode_pred = &tmp[3]; 899
812 } else { 900 if (filter < EIGHTTAP_SHARP) {
813 this_mode_pred = &tmp[get_pred_buffer(tmp, 3)]; 901 current_pred = &tmp[get_pred_buffer(tmp, 3)];
814 pd->dst.buf = this_mode_pred->data; 902 pd->dst.buf = current_pred->data;
815 pd->dst.stride = bw; 903 pd->dst.stride = bw;
904 }
905 }
816 } 906 }
817 } 907 }
818 908
819 if ((this_mode == NEWMV || filter_ref == SWITCHABLE) && 909 if (reuse_inter_pred && this_mode_pred != current_pred)
820 pred_filter_search && 910 free_pred_buffer(current_pred);
821 ((mbmi->mv[0].as_mv.row & 0x07) != 0 ||
822 (mbmi->mv[0].as_mv.col & 0x07) != 0)) {
823 int pf_rate[3];
824 int64_t pf_dist[3];
825 unsigned int pf_var[3];
826 unsigned int pf_sse[3];
827 TX_SIZE pf_tx_size[3];
828 int64_t best_cost = INT64_MAX;
829 INTERP_FILTER best_filter = SWITCHABLE, filter;
830 PRED_BUFFER *current_pred = this_mode_pred;
831 911
832 for (filter = EIGHTTAP; filter <= EIGHTTAP_SHARP; ++filter) { 912 mbmi->interp_filter = best_filter;
833 int64_t cost; 913 mbmi->tx_size = pf_tx_size[mbmi->interp_filter];
834 mbmi->interp_filter = filter; 914 this_rdc.rate = pf_rate[mbmi->interp_filter];
835 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize); 915 this_rdc.dist = pf_dist[mbmi->interp_filter];
836 model_rd_for_sb_y(cpi, bsize, x, xd, &pf_rate[filter], 916 var_y = pf_var[mbmi->interp_filter];
837 &pf_dist[filter], &pf_var[filter], &pf_sse[filter]); 917 sse_y = pf_sse[mbmi->interp_filter];
838 pf_rate[filter] += vp9_get_switchable_rate(cpi, xd); 918 x->skip_txfm[0] = skip_txfm;
839 cost = RDCOST(x->rdmult, x->rddiv, pf_rate[filter], pf_dist[filter]); 919 } else {
840 pf_tx_size[filter] = mbmi->tx_size; 920 mbmi->interp_filter = (filter_ref == SWITCHABLE) ? EIGHTTAP : filter_ref;
841 if (cost < best_cost) { 921 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize);
842 best_filter = filter; 922 model_rd_for_sb_y(cpi, bsize, x, xd, &this_rdc.rate, &this_rdc.dist,
843 best_cost = cost; 923 &var_y, &sse_y);
844 skip_txfm = x->skip_txfm[0]; 924 this_rdc.rate +=
925 cm->interp_filter == SWITCHABLE ?
926 vp9_get_switchable_rate(cpi, xd) : 0;
927 }
845 928
846 if (reuse_inter_pred) { 929 // chroma component rate-distortion cost modeling
847 if (this_mode_pred != current_pred) { 930 if (x->color_sensitivity[0] || x->color_sensitivity[1]) {
848 free_pred_buffer(this_mode_pred); 931 int uv_rate = 0;
849 this_mode_pred = current_pred; 932 int64_t uv_dist = 0;
850 } 933 if (x->color_sensitivity[0])
934 vp9_build_inter_predictors_sbp(xd, mi_row, mi_col, bsize, 1);
935 if (x->color_sensitivity[1])
936 vp9_build_inter_predictors_sbp(xd, mi_row, mi_col, bsize, 2);
937 model_rd_for_sb_uv(cpi, bsize, x, xd, &uv_rate, &uv_dist, &var_y, &sse_y);
938 this_rdc.rate += uv_rate;
939 this_rdc.dist += uv_dist;
940 }
851 941
852 if (filter < EIGHTTAP_SHARP) { 942 this_rdc.rate += rate_mv;
853 current_pred = &tmp[get_pred_buffer(tmp, 3)]; 943 this_rdc.rate +=
854 pd->dst.buf = current_pred->data; 944 cpi->inter_mode_cost[mbmi->mode_context[ref_frame]][INTER_OFFSET(
855 pd->dst.stride = bw; 945 this_mode)];
856 } 946 this_rdc.rate += ref_frame_cost[ref_frame];
857 } 947 this_rdc.rdcost = RDCOST(x->rdmult, x->rddiv, this_rdc.rate, this_rdc.dist);
858 }
859 }
860 948
861 if (reuse_inter_pred && this_mode_pred != current_pred) 949 // Skipping checking: test to see if this block can be reconstructed by
862 free_pred_buffer(current_pred); 950 // prediction only.
863 951 if (cpi->allow_encode_breakout) {
864 mbmi->interp_filter = best_filter; 952 encode_breakout_test(cpi, x, bsize, mi_row, mi_col, ref_frame, this_mode,
865 mbmi->tx_size = pf_tx_size[mbmi->interp_filter]; 953 var_y, sse_y, yv12_mb, &this_rdc.rate,
866 this_rdc.rate = pf_rate[mbmi->interp_filter]; 954 &this_rdc.dist);
867 this_rdc.dist = pf_dist[mbmi->interp_filter]; 955 if (x->skip) {
868 var_y = pf_var[mbmi->interp_filter]; 956 this_rdc.rate += rate_mv;
869 sse_y = pf_sse[mbmi->interp_filter]; 957 this_rdc.rdcost = RDCOST(x->rdmult, x->rddiv, this_rdc.rate,
870 x->skip_txfm[0] = skip_txfm; 958 this_rdc.dist);
871 } else {
872 mbmi->interp_filter = (filter_ref == SWITCHABLE) ? EIGHTTAP: filter_ref;
873 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize);
874 model_rd_for_sb_y(cpi, bsize, x, xd, &this_rdc.rate, &this_rdc.dist,
875 &var_y, &sse_y);
876 this_rdc.rate += cm->interp_filter == SWITCHABLE ?
877 vp9_get_switchable_rate(cpi, xd) : 0;
878 } 959 }
879 960 }
880 // chroma component rate-distortion cost modeling
881 if (x->color_sensitivity[0] || x->color_sensitivity[1]) {
882 int uv_rate = 0;
883 int64_t uv_dist = 0;
884 if (x->color_sensitivity[0])
885 vp9_build_inter_predictors_sbp(xd, mi_row, mi_col, bsize, 1);
886 if (x->color_sensitivity[1])
887 vp9_build_inter_predictors_sbp(xd, mi_row, mi_col, bsize, 2);
888 model_rd_for_sb_uv(cpi, bsize, x, xd, &uv_rate, &uv_dist,
889 &var_y, &sse_y);
890 this_rdc.rate += uv_rate;
891 this_rdc.dist += uv_dist;
892 }
893
894 this_rdc.rate += rate_mv;
895 this_rdc.rate += cpi->inter_mode_cost[mbmi->mode_context[ref_frame]]
896 [INTER_OFFSET(this_mode)];
897 this_rdc.rate += ref_frame_cost[ref_frame];
898 this_rdc.rdcost = RDCOST(x->rdmult, x->rddiv,
899 this_rdc.rate, this_rdc.dist);
900
901 // Skipping checking: test to see if this block can be reconstructed by
902 // prediction only.
903 if (cpi->allow_encode_breakout) {
904 encode_breakout_test(cpi, x, bsize, mi_row, mi_col, ref_frame,
905 this_mode, var_y, sse_y, yv12_mb,
906 &this_rdc.rate, &this_rdc.dist);
907 if (x->skip) {
908 this_rdc.rate += rate_mv;
909 this_rdc.rdcost = RDCOST(x->rdmult, x->rddiv,
910 this_rdc.rate, this_rdc.dist);
911 }
912 }
913 961
914 #if CONFIG_VP9_TEMPORAL_DENOISING 962 #if CONFIG_VP9_TEMPORAL_DENOISING
915 if (cpi->oxcf.noise_sensitivity > 0) 963 if (cpi->oxcf.noise_sensitivity > 0)
916 vp9_denoiser_update_frame_stats(mbmi, sse_y, this_mode, ctx); 964 vp9_denoiser_update_frame_stats(mbmi, sse_y, this_mode, ctx);
917 #else 965 #else
918 (void)ctx; 966 (void)ctx;
919 #endif 967 #endif
920 968
921 if (this_rdc.rdcost < best_rdc.rdcost || x->skip) { 969 if (this_rdc.rdcost < best_rdc.rdcost || x->skip) {
922 best_rdc = this_rdc; 970 best_rdc = this_rdc;
923 best_mode = this_mode; 971 best_mode = this_mode;
924 best_pred_filter = mbmi->interp_filter; 972 best_pred_filter = mbmi->interp_filter;
925 best_tx_size = mbmi->tx_size; 973 best_tx_size = mbmi->tx_size;
926 best_ref_frame = ref_frame; 974 best_ref_frame = ref_frame;
927 best_mode_skip_txfm = x->skip_txfm[0]; 975 best_mode_skip_txfm = x->skip_txfm[0];
928 976
929 if (reuse_inter_pred) { 977 if (reuse_inter_pred) {
930 free_pred_buffer(best_pred); 978 free_pred_buffer(best_pred);
931 best_pred = this_mode_pred; 979 best_pred = this_mode_pred;
932 }
933 } else {
934 if (reuse_inter_pred)
935 free_pred_buffer(this_mode_pred);
936 } 980 }
937 981 } else {
938 if (x->skip) 982 if (reuse_inter_pred)
939 break; 983 free_pred_buffer(this_mode_pred);
940 } 984 }
941 985
942 // Check that a prediction mode has been selected.
943 assert(best_rdc.rdcost < INT64_MAX);
944
945 if (x->skip) 986 if (x->skip)
946 break; 987 break;
947 } 988 }
948 989
949 mbmi->mode = best_mode; 990 mbmi->mode = best_mode;
950 mbmi->interp_filter = best_pred_filter; 991 mbmi->interp_filter = best_pred_filter;
951 mbmi->tx_size = best_tx_size; 992 mbmi->tx_size = best_tx_size;
952 mbmi->ref_frame[0] = best_ref_frame; 993 mbmi->ref_frame[0] = best_ref_frame;
953 mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int; 994 mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int;
954 xd->mi[0].src_mi->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; 995 xd->mi[0].src_mi->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 #endif // CONFIG_VP9_HIGHBITDEPTH 1086 #endif // CONFIG_VP9_HIGHBITDEPTH
1046 } 1087 }
1047 } 1088 }
1048 1089
1049 if (cpi->sf.adaptive_rd_thresh) { 1090 if (cpi->sf.adaptive_rd_thresh) {
1050 THR_MODES best_mode_idx = is_inter_block(mbmi) ? 1091 THR_MODES best_mode_idx = is_inter_block(mbmi) ?
1051 mode_idx[best_ref_frame][INTER_OFFSET(mbmi->mode)] : 1092 mode_idx[best_ref_frame][INTER_OFFSET(mbmi->mode)] :
1052 mode_idx[INTRA_FRAME][mbmi->mode]; 1093 mode_idx[INTRA_FRAME][mbmi->mode];
1053 PREDICTION_MODE this_mode; 1094 PREDICTION_MODE this_mode;
1054 for (ref_frame = LAST_FRAME; ref_frame <= GOLDEN_FRAME; ++ref_frame) { 1095 for (ref_frame = LAST_FRAME; ref_frame <= GOLDEN_FRAME; ++ref_frame) {
1096 if (best_ref_frame != ref_frame) continue;
1055 for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) { 1097 for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) {
1056 THR_MODES thr_mode_idx = mode_idx[ref_frame][INTER_OFFSET(this_mode)]; 1098 THR_MODES thr_mode_idx = mode_idx[ref_frame][INTER_OFFSET(this_mode)];
1057 int *freq_fact = &tile_data->thresh_freq_fact[bsize][thr_mode_idx]; 1099 int *freq_fact = &tile_data->thresh_freq_fact[bsize][thr_mode_idx];
1058 if (thr_mode_idx == best_mode_idx) 1100 if (thr_mode_idx == best_mode_idx)
1059 *freq_fact -= (*freq_fact >> 4); 1101 *freq_fact -= (*freq_fact >> 4);
1060 else 1102 else
1061 *freq_fact = MIN(*freq_fact + RD_THRESH_INC, 1103 *freq_fact = MIN(*freq_fact + RD_THRESH_INC,
1062 cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT); 1104 cpi->sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT);
1063 } 1105 }
1064 } 1106 }
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
1323 xd->mi[0].bmi[block + 2] = bsi[best_ref_frame][block]; 1365 xd->mi[0].bmi[block + 2] = bsi[best_ref_frame][block];
1324 } 1366 }
1325 } 1367 }
1326 mbmi->mode = xd->mi[0].bmi[3].as_mode; 1368 mbmi->mode = xd->mi[0].bmi[3].as_mode;
1327 ctx->mic = *(xd->mi[0].src_mi); 1369 ctx->mic = *(xd->mi[0].src_mi);
1328 ctx->skip_txfm[0] = 0; 1370 ctx->skip_txfm[0] = 0;
1329 ctx->skip = 0; 1371 ctx->skip = 0;
1330 // Dummy assignment for speed -5. No effect in speed -6. 1372 // Dummy assignment for speed -5. No effect in speed -6.
1331 rd_cost->rdcost = best_rd; 1373 rd_cost->rdcost = best_rd;
1332 } 1374 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_mcomp.c ('k') | source/libvpx/vp9/encoder/vp9_ratectrl.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698