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

Side by Side Diff: source/libvpx/vp9/encoder/vp9_pickmode.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_picklpf.c ('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
11 #include <assert.h> 11 #include <assert.h>
12 #include <limits.h> 12 #include <limits.h>
13 #include <math.h> 13 #include <math.h>
14 #include <stdio.h> 14 #include <stdio.h>
15 15
16 #include "./vp9_rtcd.h" 16 #include "./vp9_rtcd.h"
17 17
18 #include "vpx_mem/vpx_mem.h" 18 #include "vpx_mem/vpx_mem.h"
19 19
20 #include "vp9/common/vp9_common.h" 20 #include "vp9/common/vp9_common.h"
21 #include "vp9/common/vp9_mvref_common.h" 21 #include "vp9/common/vp9_mvref_common.h"
22 #include "vp9/common/vp9_reconinter.h" 22 #include "vp9/common/vp9_reconinter.h"
23 #include "vp9/common/vp9_reconintra.h" 23 #include "vp9/common/vp9_reconintra.h"
24 24
25 #include "vp9/encoder/vp9_onyx_int.h" 25 #include "vp9/encoder/vp9_onyx_int.h"
26 #include "vp9/encoder/vp9_ratectrl.h" 26 #include "vp9/encoder/vp9_ratectrl.h"
27 #include "vp9/encoder/vp9_rdopt.h" 27 #include "vp9/encoder/vp9_rdopt.h"
28 28
29 static int full_pixel_motion_search(VP9_COMP *cpi, MACROBLOCK *x, 29 static void full_pixel_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
30 const TileInfo *const tile, 30 const TileInfo *const tile,
31 BLOCK_SIZE bsize, int mi_row, int mi_col, 31 BLOCK_SIZE bsize, int mi_row, int mi_col,
32 int_mv *tmp_mv, int *rate_mv) { 32 int_mv *tmp_mv, int *rate_mv) {
33 MACROBLOCKD *xd = &x->e_mbd; 33 MACROBLOCKD *xd = &x->e_mbd;
34 MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; 34 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
35 struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}}; 35 struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}};
36 int bestsme = INT_MAX; 36 int step_param;
37 int further_steps, step_param;
38 int sadpb = x->sadperbit16; 37 int sadpb = x->sadperbit16;
39 MV mvp_full; 38 MV mvp_full;
40 int ref = mbmi->ref_frame[0]; 39 int ref = mbmi->ref_frame[0];
41 int_mv ref_mv = mbmi->ref_mvs[ref][0]; 40 const MV ref_mv = mbmi->ref_mvs[ref][0].as_mv;
42 int i; 41 int i;
43 42
44 int tmp_col_min = x->mv_col_min; 43 int tmp_col_min = x->mv_col_min;
45 int tmp_col_max = x->mv_col_max; 44 int tmp_col_max = x->mv_col_max;
46 int tmp_row_min = x->mv_row_min; 45 int tmp_row_min = x->mv_row_min;
47 int tmp_row_max = x->mv_row_max; 46 int tmp_row_max = x->mv_row_max;
48 47
49 int buf_offset;
50 int stride = xd->plane[0].pre[0].stride;
51
52 const YV12_BUFFER_CONFIG *scaled_ref_frame = vp9_get_scaled_ref_frame(cpi, 48 const YV12_BUFFER_CONFIG *scaled_ref_frame = vp9_get_scaled_ref_frame(cpi,
53 ref); 49 ref);
54 if (scaled_ref_frame) { 50 if (scaled_ref_frame) {
55 int i; 51 int i;
56 // Swap out the reference frame for a version that's been scaled to 52 // Swap out the reference frame for a version that's been scaled to
57 // match the resolution of the current frame, allowing the existing 53 // match the resolution of the current frame, allowing the existing
58 // motion search code to be used without additional modifications. 54 // motion search code to be used without additional modifications.
59 for (i = 0; i < MAX_MB_PLANE; i++) 55 for (i = 0; i < MAX_MB_PLANE; i++)
60 backup_yv12[i] = xd->plane[i].pre[0]; 56 backup_yv12[i] = xd->plane[i].pre[0];
61 57
62 setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL); 58 vp9_setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL);
63 } 59 }
64 60
65 vp9_set_mv_search_range(x, &ref_mv.as_mv); 61 vp9_set_mv_search_range(x, &ref_mv);
66 62
67 // TODO(jingning) exploiting adaptive motion search control in non-RD 63 // TODO(jingning) exploiting adaptive motion search control in non-RD
68 // mode decision too. 64 // mode decision too.
69 step_param = 6; 65 step_param = 6;
70 further_steps = (cpi->sf.max_step_search_steps - 1) - step_param;
71 66
72 for (i = LAST_FRAME; i <= LAST_FRAME && cpi->common.show_frame; ++i) { 67 for (i = LAST_FRAME; i <= LAST_FRAME && cpi->common.show_frame; ++i) {
73 if ((x->pred_mv_sad[ref] >> 3) > x->pred_mv_sad[i]) { 68 if ((x->pred_mv_sad[ref] >> 3) > x->pred_mv_sad[i]) {
74 tmp_mv->as_int = INVALID_MV; 69 tmp_mv->as_int = INVALID_MV;
75 70
76 if (scaled_ref_frame) { 71 if (scaled_ref_frame) {
77 int i; 72 int i;
78 for (i = 0; i < MAX_MB_PLANE; i++) 73 for (i = 0; i < MAX_MB_PLANE; i++)
79 xd->plane[i].pre[0] = backup_yv12[i]; 74 xd->plane[i].pre[0] = backup_yv12[i];
80 } 75 }
81 return INT_MAX; 76 return;
82 } 77 }
83 } 78 }
84 79 assert(x->mv_best_ref_index[ref] <= 2);
85 mvp_full = mbmi->ref_mvs[ref][x->mv_best_ref_index[ref]].as_mv; 80 if (x->mv_best_ref_index[ref] < 2)
81 mvp_full = mbmi->ref_mvs[ref][x->mv_best_ref_index[ref]].as_mv;
82 else
83 mvp_full = x->pred_mv[ref].as_mv;
86 84
87 mvp_full.col >>= 3; 85 mvp_full.col >>= 3;
88 mvp_full.row >>= 3; 86 mvp_full.row >>= 3;
89 87
90 if (cpi->sf.search_method == FAST_HEX) { 88 if (cpi->sf.search_method == FAST_DIAMOND) {
91 bestsme = vp9_fast_hex_search(x, &mvp_full, step_param, sadpb, 89 // NOTE: this returns SAD
92 &cpi->fn_ptr[bsize], 1, 90 vp9_fast_dia_search(x, &mvp_full, step_param, sadpb, 0,
93 &ref_mv.as_mv, &tmp_mv->as_mv); 91 &cpi->fn_ptr[bsize], 1,
92 &ref_mv, &tmp_mv->as_mv);
93 } else if (cpi->sf.search_method == FAST_HEX) {
94 // NOTE: this returns SAD
95 vp9_fast_hex_search(x, &mvp_full, step_param, sadpb, 0,
96 &cpi->fn_ptr[bsize], 1,
97 &ref_mv, &tmp_mv->as_mv);
94 } else if (cpi->sf.search_method == HEX) { 98 } else if (cpi->sf.search_method == HEX) {
95 bestsme = vp9_hex_search(x, &mvp_full, step_param, sadpb, 1, 99 // NOTE: this returns SAD
96 &cpi->fn_ptr[bsize], 1, 100 vp9_hex_search(x, &mvp_full, step_param, sadpb, 1,
97 &ref_mv.as_mv, &tmp_mv->as_mv); 101 &cpi->fn_ptr[bsize], 1,
102 &ref_mv, &tmp_mv->as_mv);
98 } else if (cpi->sf.search_method == SQUARE) { 103 } else if (cpi->sf.search_method == SQUARE) {
99 bestsme = vp9_square_search(x, &mvp_full, step_param, sadpb, 1, 104 // NOTE: this returns SAD
100 &cpi->fn_ptr[bsize], 1, 105 vp9_square_search(x, &mvp_full, step_param, sadpb, 1,
101 &ref_mv.as_mv, &tmp_mv->as_mv); 106 &cpi->fn_ptr[bsize], 1,
107 &ref_mv, &tmp_mv->as_mv);
102 } else if (cpi->sf.search_method == BIGDIA) { 108 } else if (cpi->sf.search_method == BIGDIA) {
103 bestsme = vp9_bigdia_search(x, &mvp_full, step_param, sadpb, 1, 109 // NOTE: this returns SAD
104 &cpi->fn_ptr[bsize], 1, 110 vp9_bigdia_search(x, &mvp_full, step_param, sadpb, 1,
105 &ref_mv.as_mv, &tmp_mv->as_mv); 111 &cpi->fn_ptr[bsize], 1,
112 &ref_mv, &tmp_mv->as_mv);
106 } else { 113 } else {
107 bestsme = vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param, 114 int further_steps = (cpi->sf.max_step_search_steps - 1) - step_param;
108 sadpb, further_steps, 1, 115 // NOTE: this returns variance
109 &cpi->fn_ptr[bsize], 116 vp9_full_pixel_diamond(cpi, x, &mvp_full, step_param,
110 &ref_mv.as_mv, &tmp_mv->as_mv); 117 sadpb, further_steps, 1,
118 &cpi->fn_ptr[bsize],
119 &ref_mv, &tmp_mv->as_mv);
111 } 120 }
112 x->mv_col_min = tmp_col_min; 121 x->mv_col_min = tmp_col_min;
113 x->mv_col_max = tmp_col_max; 122 x->mv_col_max = tmp_col_max;
114 x->mv_row_min = tmp_row_min; 123 x->mv_row_min = tmp_row_min;
115 x->mv_row_max = tmp_row_max; 124 x->mv_row_max = tmp_row_max;
116 125
117 if (scaled_ref_frame) { 126 if (scaled_ref_frame) {
118 int i; 127 int i;
119 for (i = 0; i < MAX_MB_PLANE; i++) 128 for (i = 0; i < MAX_MB_PLANE; i++)
120 xd->plane[i].pre[0] = backup_yv12[i]; 129 xd->plane[i].pre[0] = backup_yv12[i];
121 } 130 }
122 131
123 // TODO(jingning) This step can be merged into full pixel search step in the
124 // re-designed log-diamond search
125 buf_offset = tmp_mv->as_mv.row * stride + tmp_mv->as_mv.col;
126
127 // Find sad for current vector.
128 bestsme = cpi->fn_ptr[bsize].sdf(x->plane[0].src.buf, x->plane[0].src.stride,
129 xd->plane[0].pre[0].buf + buf_offset,
130 stride, 0x7fffffff);
131
132 // scale to 1/8 pixel resolution
133 tmp_mv->as_mv.row = tmp_mv->as_mv.row * 8;
134 tmp_mv->as_mv.col = tmp_mv->as_mv.col * 8;
135
136 // calculate the bit cost on motion vector 132 // calculate the bit cost on motion vector
137 *rate_mv = vp9_mv_bit_cost(&tmp_mv->as_mv, &ref_mv.as_mv, 133 mvp_full.row = tmp_mv->as_mv.row * 8;
134 mvp_full.col = tmp_mv->as_mv.col * 8;
135 *rate_mv = vp9_mv_bit_cost(&mvp_full, &ref_mv,
138 x->nmvjointcost, x->mvcost, MV_COST_WEIGHT); 136 x->nmvjointcost, x->mvcost, MV_COST_WEIGHT);
139 return bestsme;
140 } 137 }
141 138
142 static void sub_pixel_motion_search(VP9_COMP *cpi, MACROBLOCK *x, 139 static void sub_pixel_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
143 const TileInfo *const tile, 140 const TileInfo *const tile,
144 BLOCK_SIZE bsize, int mi_row, int mi_col, 141 BLOCK_SIZE bsize, int mi_row, int mi_col,
145 MV *tmp_mv) { 142 MV *tmp_mv) {
146 MACROBLOCKD *xd = &x->e_mbd; 143 MACROBLOCKD *xd = &x->e_mbd;
147 MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; 144 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
148 struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}}; 145 struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}};
149 int ref = mbmi->ref_frame[0]; 146 int ref = mbmi->ref_frame[0];
150 MV ref_mv = mbmi->ref_mvs[ref][0].as_mv; 147 MV ref_mv = mbmi->ref_mvs[ref][0].as_mv;
151 int dis; 148 int dis;
152 149
153 const YV12_BUFFER_CONFIG *scaled_ref_frame = vp9_get_scaled_ref_frame(cpi, 150 const YV12_BUFFER_CONFIG *scaled_ref_frame = vp9_get_scaled_ref_frame(cpi,
154 ref); 151 ref);
155 if (scaled_ref_frame) { 152 if (scaled_ref_frame) {
156 int i; 153 int i;
157 // Swap out the reference frame for a version that's been scaled to 154 // Swap out the reference frame for a version that's been scaled to
158 // match the resolution of the current frame, allowing the existing 155 // match the resolution of the current frame, allowing the existing
159 // motion search code to be used without additional modifications. 156 // motion search code to be used without additional modifications.
160 for (i = 0; i < MAX_MB_PLANE; i++) 157 for (i = 0; i < MAX_MB_PLANE; i++)
161 backup_yv12[i] = xd->plane[i].pre[0]; 158 backup_yv12[i] = xd->plane[i].pre[0];
162 159
163 setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL); 160 vp9_setup_pre_planes(xd, 0, scaled_ref_frame, mi_row, mi_col, NULL);
164 } 161 }
165 162
166 tmp_mv->col >>= 3;
167 tmp_mv->row >>= 3;
168
169 cpi->find_fractional_mv_step(x, tmp_mv, &ref_mv, 163 cpi->find_fractional_mv_step(x, tmp_mv, &ref_mv,
170 cpi->common.allow_high_precision_mv, 164 cpi->common.allow_high_precision_mv,
171 x->errorperbit, 165 x->errorperbit,
172 &cpi->fn_ptr[bsize], 166 &cpi->fn_ptr[bsize],
173 cpi->sf.subpel_force_stop, 167 cpi->sf.subpel_force_stop,
174 cpi->sf.subpel_iters_per_step, 168 cpi->sf.subpel_iters_per_step,
175 x->nmvjointcost, x->mvcost, 169 x->nmvjointcost, x->mvcost,
176 &dis, &x->pred_sse[ref]); 170 &dis, &x->pred_sse[ref]);
177 171
178 if (scaled_ref_frame) { 172 if (scaled_ref_frame) {
179 int i; 173 int i;
180 for (i = 0; i < MAX_MB_PLANE; i++) 174 for (i = 0; i < MAX_MB_PLANE; i++)
181 xd->plane[i].pre[0] = backup_yv12[i]; 175 xd->plane[i].pre[0] = backup_yv12[i];
182 } 176 }
177
178 x->pred_mv[ref].as_mv = *tmp_mv;
179 }
180
181 static void model_rd_for_sb_y(VP9_COMP *cpi, BLOCK_SIZE bsize,
182 MACROBLOCK *x, MACROBLOCKD *xd,
183 int *out_rate_sum, int64_t *out_dist_sum) {
184 // Note our transform coeffs are 8 times an orthogonal transform.
185 // Hence quantizer step is also 8 times. To get effective quantizer
186 // we need to divide by 8 before sending to modeling function.
187 unsigned int sse;
188 int rate;
189 int64_t dist;
190
191 struct macroblock_plane *const p = &x->plane[0];
192 struct macroblockd_plane *const pd = &xd->plane[0];
193
194 int var = cpi->fn_ptr[bsize].vf(p->src.buf, p->src.stride,
195 pd->dst.buf, pd->dst.stride, &sse);
196
197 vp9_model_rd_from_var_lapndz(sse + var, 1 << num_pels_log2_lookup[bsize],
198 pd->dequant[1] >> 3, &rate, &dist);
199 *out_rate_sum = rate;
200 *out_dist_sum = dist << 3;
183 } 201 }
184 202
185 // TODO(jingning) placeholder for inter-frame non-RD mode decision. 203 // TODO(jingning) placeholder for inter-frame non-RD mode decision.
186 // this needs various further optimizations. to be continued.. 204 // this needs various further optimizations. to be continued..
187 int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, 205 int64_t vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
188 const TileInfo *const tile, 206 const TileInfo *const tile,
189 int mi_row, int mi_col, 207 int mi_row, int mi_col,
190 int *returnrate, 208 int *returnrate,
191 int64_t *returndistortion, 209 int64_t *returndistortion,
192 BLOCK_SIZE bsize) { 210 BLOCK_SIZE bsize) {
193 MACROBLOCKD *xd = &x->e_mbd; 211 MACROBLOCKD *xd = &x->e_mbd;
194 MB_MODE_INFO *mbmi = &xd->mi_8x8[0]->mbmi; 212 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
195 struct macroblock_plane *const p = &x->plane[0]; 213 struct macroblock_plane *const p = &x->plane[0];
196 struct macroblockd_plane *const pd = &xd->plane[0]; 214 struct macroblockd_plane *const pd = &xd->plane[0];
197 const BLOCK_SIZE block_size = get_plane_block_size(bsize, &xd->plane[0]);
198 MB_PREDICTION_MODE this_mode, best_mode = ZEROMV; 215 MB_PREDICTION_MODE this_mode, best_mode = ZEROMV;
199 MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME; 216 MV_REFERENCE_FRAME ref_frame, best_ref_frame = LAST_FRAME;
217 INTERP_FILTER best_pred_filter = EIGHTTAP;
200 int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES]; 218 int_mv frame_mv[MB_MODE_COUNT][MAX_REF_FRAMES];
201 struct buf_2d yv12_mb[4][MAX_MB_PLANE]; 219 struct buf_2d yv12_mb[4][MAX_MB_PLANE];
202 static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG, 220 static const int flag_list[4] = { 0, VP9_LAST_FLAG, VP9_GOLD_FLAG,
203 VP9_ALT_FLAG }; 221 VP9_ALT_FLAG };
204 int64_t best_rd = INT64_MAX; 222 int64_t best_rd = INT64_MAX;
205 int64_t this_rd = INT64_MAX; 223 int64_t this_rd = INT64_MAX;
206 static const int cost[4]= { 0, 2, 4, 6 };
207 224
208 const int64_t inter_mode_thresh = 300; 225 int rate = INT_MAX;
226 int64_t dist = INT64_MAX;
227
228 VP9_COMMON *cm = &cpi->common;
229 int intra_cost_penalty = 20 * vp9_dc_quant(cm->base_qindex, cm->y_dc_delta_q);
230
231 const int64_t inter_mode_thresh = RDCOST(x->rdmult, x->rddiv,
232 intra_cost_penalty, 0);
209 const int64_t intra_mode_cost = 50; 233 const int64_t intra_mode_cost = 50;
210 234
235 unsigned char segment_id = mbmi->segment_id;
236 const int *const rd_threshes = cpi->rd_threshes[segment_id][bsize];
237 const int *const rd_thresh_freq_fact = cpi->rd_thresh_freq_fact[bsize];
238 // Mode index conversion form THR_MODES to MB_PREDICTION_MODE for a ref frame.
239 int mode_idx[MB_MODE_COUNT] = {0};
240 INTERP_FILTER filter_ref = SWITCHABLE;
241
211 x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH; 242 x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH;
212 243
213 x->skip = 0; 244 x->skip = 0;
214 if (cpi->active_map_enabled && x->active_ptr[0] == 0) 245 if (!x->in_active_map)
215 x->skip = 1; 246 x->skip = 1;
216
217 // initialize mode decisions 247 // initialize mode decisions
218 *returnrate = INT_MAX; 248 *returnrate = INT_MAX;
219 *returndistortion = INT64_MAX; 249 *returndistortion = INT64_MAX;
220 vpx_memset(mbmi, 0, sizeof(MB_MODE_INFO)); 250 vpx_memset(mbmi, 0, sizeof(MB_MODE_INFO));
221 mbmi->sb_type = bsize; 251 mbmi->sb_type = bsize;
222 mbmi->ref_frame[0] = NONE; 252 mbmi->ref_frame[0] = NONE;
223 mbmi->ref_frame[1] = NONE; 253 mbmi->ref_frame[1] = NONE;
224 mbmi->tx_size = MIN(max_txsize_lookup[bsize], 254 mbmi->tx_size = MIN(max_txsize_lookup[bsize],
225 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); 255 tx_mode_to_biggest_tx_size[cpi->common.tx_mode]);
226 mbmi->interp_filter = cpi->common.interp_filter == SWITCHABLE ? 256 mbmi->interp_filter = cpi->common.interp_filter == SWITCHABLE ?
227 EIGHTTAP : cpi->common.interp_filter; 257 EIGHTTAP : cpi->common.interp_filter;
228 mbmi->skip = 0; 258 mbmi->skip = 0;
229 mbmi->segment_id = 0; 259 mbmi->segment_id = segment_id;
230 260
231 for (ref_frame = LAST_FRAME; ref_frame <= LAST_FRAME ; ++ref_frame) { 261 for (ref_frame = LAST_FRAME; ref_frame <= LAST_FRAME ; ++ref_frame) {
232 x->pred_mv_sad[ref_frame] = INT_MAX; 262 x->pred_mv_sad[ref_frame] = INT_MAX;
233 if (cpi->ref_frame_flags & flag_list[ref_frame]) { 263 if (cpi->ref_frame_flags & flag_list[ref_frame]) {
234 vp9_setup_buffer_inter(cpi, x, tile, 264 vp9_setup_buffer_inter(cpi, x, tile,
235 ref_frame, block_size, mi_row, mi_col, 265 ref_frame, bsize, mi_row, mi_col,
236 frame_mv[NEARESTMV], frame_mv[NEARMV], yv12_mb); 266 frame_mv[NEARESTMV], frame_mv[NEARMV], yv12_mb);
237 } 267 }
238 frame_mv[NEWMV][ref_frame].as_int = INVALID_MV; 268 frame_mv[NEWMV][ref_frame].as_int = INVALID_MV;
239 frame_mv[ZEROMV][ref_frame].as_int = 0; 269 frame_mv[ZEROMV][ref_frame].as_int = 0;
240 } 270 }
241 271
272 if (xd->up_available)
273 filter_ref = xd->mi[-xd->mi_stride]->mbmi.interp_filter;
274 else if (xd->left_available)
275 filter_ref = xd->mi[-1]->mbmi.interp_filter;
276
242 for (ref_frame = LAST_FRAME; ref_frame <= LAST_FRAME ; ++ref_frame) { 277 for (ref_frame = LAST_FRAME; ref_frame <= LAST_FRAME ; ++ref_frame) {
243 int rate_mv = 0;
244 if (!(cpi->ref_frame_flags & flag_list[ref_frame])) 278 if (!(cpi->ref_frame_flags & flag_list[ref_frame]))
245 continue; 279 continue;
246 280
247 // Select prediction reference frames. 281 // Select prediction reference frames.
248 xd->plane[0].pre[0] = yv12_mb[ref_frame][0]; 282 xd->plane[0].pre[0] = yv12_mb[ref_frame][0];
249 283
250 clamp_mv2(&frame_mv[NEARESTMV][ref_frame].as_mv, xd); 284 clamp_mv2(&frame_mv[NEARESTMV][ref_frame].as_mv, xd);
251 clamp_mv2(&frame_mv[NEARMV][ref_frame].as_mv, xd); 285 clamp_mv2(&frame_mv[NEARMV][ref_frame].as_mv, xd);
252 286
253 mbmi->ref_frame[0] = ref_frame; 287 mbmi->ref_frame[0] = ref_frame;
254 288
289 // Set conversion index for LAST_FRAME.
290 if (ref_frame == LAST_FRAME) {
291 mode_idx[NEARESTMV] = THR_NEARESTMV; // LAST_FRAME, NEARESTMV
292 mode_idx[NEARMV] = THR_NEARMV; // LAST_FRAME, NEARMV
293 mode_idx[ZEROMV] = THR_ZEROMV; // LAST_FRAME, ZEROMV
294 mode_idx[NEWMV] = THR_NEWMV; // LAST_FRAME, NEWMV
295 }
296
255 for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) { 297 for (this_mode = NEARESTMV; this_mode <= NEWMV; ++this_mode) {
256 int rate = cost[INTER_OFFSET(this_mode)] 298 int rate_mv = 0;
257 << (num_pels_log2_lookup[bsize] - 4); 299
258 int64_t dist;
259 if (cpi->sf.disable_inter_mode_mask[bsize] & 300 if (cpi->sf.disable_inter_mode_mask[bsize] &
260 (1 << INTER_OFFSET(this_mode))) 301 (1 << INTER_OFFSET(this_mode)))
261 continue; 302 continue;
262 303
304 if (best_rd < ((int64_t)rd_threshes[mode_idx[this_mode]] *
305 rd_thresh_freq_fact[this_mode] >> 5) ||
306 rd_threshes[mode_idx[this_mode]] == INT_MAX)
307 continue;
308
263 if (this_mode == NEWMV) { 309 if (this_mode == NEWMV) {
310 int rate_mode = 0;
264 if (this_rd < (int64_t)(1 << num_pels_log2_lookup[bsize])) 311 if (this_rd < (int64_t)(1 << num_pels_log2_lookup[bsize]))
265 continue; 312 continue;
266 313
267 x->mode_sad[ref_frame][INTER_OFFSET(NEWMV)] = 314 full_pixel_motion_search(cpi, x, tile, bsize, mi_row, mi_col,
268 full_pixel_motion_search(cpi, x, tile, bsize, mi_row, mi_col, 315 &frame_mv[NEWMV][ref_frame], &rate_mv);
269 &frame_mv[NEWMV][ref_frame], &rate_mv);
270 316
271 if (frame_mv[NEWMV][ref_frame].as_int == INVALID_MV) 317 if (frame_mv[NEWMV][ref_frame].as_int == INVALID_MV)
272 continue; 318 continue;
273 319
320 rate_mode = x->inter_mode_cost[mbmi->mode_context[ref_frame]]
321 [INTER_OFFSET(this_mode)];
322 if (RDCOST(x->rdmult, x->rddiv, rate_mv + rate_mode, 0) > best_rd)
323 continue;
324
274 sub_pixel_motion_search(cpi, x, tile, bsize, mi_row, mi_col, 325 sub_pixel_motion_search(cpi, x, tile, bsize, mi_row, mi_col,
275 &frame_mv[NEWMV][ref_frame].as_mv); 326 &frame_mv[NEWMV][ref_frame].as_mv);
276 } 327 }
277 328
278 if (frame_mv[this_mode][ref_frame].as_int == 0) { 329 if (this_mode != NEARESTMV)
279 dist = x->mode_sad[ref_frame][INTER_OFFSET(ZEROMV)]; 330 if (frame_mv[this_mode][ref_frame].as_int ==
280 } else if (this_mode != NEARESTMV && 331 frame_mv[NEARESTMV][ref_frame].as_int)
281 frame_mv[NEARESTMV][ref_frame].as_int == 332 continue;
282 frame_mv[this_mode][ref_frame].as_int) { 333
283 dist = x->mode_sad[ref_frame][INTER_OFFSET(NEARESTMV)]; 334 mbmi->mode = this_mode;
335 mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int;
336
337 // Search for the best prediction filter type, when the resulting
338 // motion vector is at sub-pixel accuracy level for luma component, i.e.,
339 // the last three bits are all zeros.
340 if ((this_mode == NEWMV || filter_ref == SWITCHABLE) &&
341 ((mbmi->mv[0].as_mv.row & 0x07) != 0 ||
342 (mbmi->mv[0].as_mv.col & 0x07) != 0)) {
343 int64_t tmp_rdcost1 = INT64_MAX;
344 int64_t tmp_rdcost2 = INT64_MAX;
345 int64_t tmp_rdcost3 = INT64_MAX;
346 int pf_rate[3];
347 int64_t pf_dist[3];
348
349 mbmi->interp_filter = EIGHTTAP;
350 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize);
351 model_rd_for_sb_y(cpi, bsize, x, xd, &pf_rate[EIGHTTAP],
352 &pf_dist[EIGHTTAP]);
353 tmp_rdcost1 = RDCOST(x->rdmult, x->rddiv,
354 vp9_get_switchable_rate(x) + pf_rate[EIGHTTAP],
355 pf_dist[EIGHTTAP]);
356
357 mbmi->interp_filter = EIGHTTAP_SHARP;
358 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize);
359 model_rd_for_sb_y(cpi, bsize, x, xd, &pf_rate[EIGHTTAP_SHARP],
360 &pf_dist[EIGHTTAP_SHARP]);
361 tmp_rdcost2 = RDCOST(x->rdmult, x->rddiv,
362 vp9_get_switchable_rate(x) + pf_rate[EIGHTTAP_SHARP],
363 pf_dist[EIGHTTAP_SHARP]);
364
365 mbmi->interp_filter = EIGHTTAP_SMOOTH;
366 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize);
367 model_rd_for_sb_y(cpi, bsize, x, xd, &pf_rate[EIGHTTAP_SMOOTH],
368 &pf_dist[EIGHTTAP_SMOOTH]);
369 tmp_rdcost3 = RDCOST(x->rdmult, x->rddiv,
370 vp9_get_switchable_rate(x) + pf_rate[EIGHTTAP_SMOOTH],
371 pf_dist[EIGHTTAP_SMOOTH]);
372
373 if (tmp_rdcost2 < tmp_rdcost1) {
374 if (tmp_rdcost2 < tmp_rdcost3)
375 mbmi->interp_filter = EIGHTTAP_SHARP;
376 else
377 mbmi->interp_filter = EIGHTTAP_SMOOTH;
378 } else {
379 if (tmp_rdcost1 < tmp_rdcost3)
380 mbmi->interp_filter = EIGHTTAP;
381 else
382 mbmi->interp_filter = EIGHTTAP_SMOOTH;
383 }
384
385 rate = pf_rate[mbmi->interp_filter];
386 dist = pf_dist[mbmi->interp_filter];
284 } else { 387 } else {
285 mbmi->mode = this_mode; 388 mbmi->interp_filter = (filter_ref == SWITCHABLE) ? EIGHTTAP: filter_ref;
286 mbmi->mv[0].as_int = frame_mv[this_mode][ref_frame].as_int;
287 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize); 389 vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize);
288 dist = x->mode_sad[ref_frame][INTER_OFFSET(this_mode)] = 390 model_rd_for_sb_y(cpi, bsize, x, xd, &rate, &dist);
289 cpi->fn_ptr[bsize].sdf(p->src.buf, p->src.stride,
290 pd->dst.buf, pd->dst.stride, INT_MAX);
291 } 391 }
292 392
293 this_rd = rate + dist; 393 rate += rate_mv;
394 rate += x->inter_mode_cost[mbmi->mode_context[ref_frame]]
395 [INTER_OFFSET(this_mode)];
396 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist);
294 397
295 if (this_rd < best_rd) { 398 if (this_rd < best_rd) {
296 best_rd = this_rd; 399 best_rd = this_rd;
400 *returnrate = rate;
401 *returndistortion = dist;
297 best_mode = this_mode; 402 best_mode = this_mode;
403 best_pred_filter = mbmi->interp_filter;
298 best_ref_frame = ref_frame; 404 best_ref_frame = ref_frame;
299 } 405 }
300 } 406 }
301 } 407 }
302 408
303 mbmi->mode = best_mode; 409 mbmi->mode = best_mode;
410 mbmi->interp_filter = best_pred_filter;
304 mbmi->ref_frame[0] = best_ref_frame; 411 mbmi->ref_frame[0] = best_ref_frame;
305 mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int; 412 mbmi->mv[0].as_int = frame_mv[best_mode][best_ref_frame].as_int;
306 xd->mi_8x8[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int; 413 xd->mi[0]->bmi[0].as_mv[0].as_int = mbmi->mv[0].as_int;
307 414
308 // Perform intra prediction search, if the best SAD is above a certain 415 // Perform intra prediction search, if the best SAD is above a certain
309 // threshold. 416 // threshold.
310 if (best_rd > inter_mode_thresh) { 417 if (best_rd > inter_mode_thresh) {
311 for (this_mode = DC_PRED; this_mode <= DC_PRED; ++this_mode) { 418 for (this_mode = DC_PRED; this_mode <= DC_PRED; ++this_mode) {
312 vp9_predict_intra_block(xd, 0, b_width_log2(bsize), 419 vp9_predict_intra_block(xd, 0, b_width_log2(bsize),
313 mbmi->tx_size, this_mode, 420 mbmi->tx_size, this_mode,
314 &p->src.buf[0], p->src.stride, 421 &p->src.buf[0], p->src.stride,
315 &pd->dst.buf[0], pd->dst.stride, 0, 0, 0); 422 &pd->dst.buf[0], pd->dst.stride, 0, 0, 0);
316 423
317 this_rd = cpi->fn_ptr[bsize].sdf(p->src.buf, 424 model_rd_for_sb_y(cpi, bsize, x, xd, &rate, &dist);
318 p->src.stride, 425 rate += x->mbmode_cost[this_mode];
319 pd->dst.buf, 426 rate += intra_cost_penalty;
320 pd->dst.stride, INT_MAX); 427 this_rd = RDCOST(x->rdmult, x->rddiv, rate, dist);
321 428
322 if (this_rd + intra_mode_cost < best_rd) { 429 if (this_rd + intra_mode_cost < best_rd) {
323 best_rd = this_rd; 430 best_rd = this_rd;
431 *returnrate = rate;
432 *returndistortion = dist;
324 mbmi->mode = this_mode; 433 mbmi->mode = this_mode;
325 mbmi->ref_frame[0] = INTRA_FRAME; 434 mbmi->ref_frame[0] = INTRA_FRAME;
326 mbmi->uv_mode = this_mode; 435 mbmi->uv_mode = this_mode;
327 mbmi->mv[0].as_int = INVALID_MV; 436 mbmi->mv[0].as_int = INVALID_MV;
328 } 437 }
329 } 438 }
330 } 439 }
440
331 return INT64_MAX; 441 return INT64_MAX;
332 } 442 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_picklpf.c ('k') | source/libvpx/vp9/encoder/vp9_quantize.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698