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

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

Issue 375983002: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 5 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_rd.h ('k') | source/libvpx/vp9/encoder/vp9_rdopt.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include <assert.h>
12 #include <math.h>
13 #include <stdio.h>
14
15 #include "./vp9_rtcd.h"
16
17 #include "vpx_mem/vpx_mem.h"
18
19 #include "vp9/common/vp9_common.h"
20 #include "vp9/common/vp9_entropy.h"
21 #include "vp9/common/vp9_entropymode.h"
22 #include "vp9/common/vp9_mvref_common.h"
23 #include "vp9/common/vp9_pred_common.h"
24 #include "vp9/common/vp9_quant_common.h"
25 #include "vp9/common/vp9_reconinter.h"
26 #include "vp9/common/vp9_reconintra.h"
27 #include "vp9/common/vp9_seg_common.h"
28 #include "vp9/common/vp9_systemdependent.h"
29
30 #include "vp9/encoder/vp9_cost.h"
31 #include "vp9/encoder/vp9_encodemb.h"
32 #include "vp9/encoder/vp9_encodemv.h"
33 #include "vp9/encoder/vp9_encoder.h"
34 #include "vp9/encoder/vp9_mcomp.h"
35 #include "vp9/encoder/vp9_quantize.h"
36 #include "vp9/encoder/vp9_ratectrl.h"
37 #include "vp9/encoder/vp9_rd.h"
38 #include "vp9/encoder/vp9_tokenize.h"
39 #include "vp9/encoder/vp9_variance.h"
40
41 #define RD_THRESH_POW 1.25
42 #define RD_MULT_EPB_RATIO 64
43
44 // Factor to weigh the rate for switchable interp filters.
45 #define SWITCHABLE_INTERP_RATE_FACTOR 1
46
47 // The baseline rd thresholds for breaking out of the rd loop for
48 // certain modes are assumed to be based on 8x8 blocks.
49 // This table is used to correct for block size.
50 // The factors here are << 2 (2 = x0.5, 32 = x8 etc).
51 static const uint8_t rd_thresh_block_size_factor[BLOCK_SIZES] = {
52 2, 3, 3, 4, 6, 6, 8, 12, 12, 16, 24, 24, 32
53 };
54
55 static void fill_mode_costs(VP9_COMP *cpi) {
56 const FRAME_CONTEXT *const fc = &cpi->common.fc;
57 int i, j;
58
59 for (i = 0; i < INTRA_MODES; ++i)
60 for (j = 0; j < INTRA_MODES; ++j)
61 vp9_cost_tokens(cpi->y_mode_costs[i][j], vp9_kf_y_mode_prob[i][j],
62 vp9_intra_mode_tree);
63
64 vp9_cost_tokens(cpi->mbmode_cost, fc->y_mode_prob[1], vp9_intra_mode_tree);
65 vp9_cost_tokens(cpi->intra_uv_mode_cost[KEY_FRAME],
66 vp9_kf_uv_mode_prob[TM_PRED], vp9_intra_mode_tree);
67 vp9_cost_tokens(cpi->intra_uv_mode_cost[INTER_FRAME],
68 fc->uv_mode_prob[TM_PRED], vp9_intra_mode_tree);
69
70 for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i)
71 vp9_cost_tokens(cpi->switchable_interp_costs[i],
72 fc->switchable_interp_prob[i], vp9_switchable_interp_tree);
73 }
74
75 static void fill_token_costs(vp9_coeff_cost *c,
76 vp9_coeff_probs_model (*p)[PLANE_TYPES]) {
77 int i, j, k, l;
78 TX_SIZE t;
79 for (t = TX_4X4; t <= TX_32X32; ++t)
80 for (i = 0; i < PLANE_TYPES; ++i)
81 for (j = 0; j < REF_TYPES; ++j)
82 for (k = 0; k < COEF_BANDS; ++k)
83 for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) {
84 vp9_prob probs[ENTROPY_NODES];
85 vp9_model_to_full_probs(p[t][i][j][k][l], probs);
86 vp9_cost_tokens((int *)c[t][i][j][k][0][l], probs,
87 vp9_coef_tree);
88 vp9_cost_tokens_skip((int *)c[t][i][j][k][1][l], probs,
89 vp9_coef_tree);
90 assert(c[t][i][j][k][0][l][EOB_TOKEN] ==
91 c[t][i][j][k][1][l][EOB_TOKEN]);
92 }
93 }
94
95 static const uint8_t rd_iifactor[32] = {
96 4, 4, 3, 2, 1, 0, 0, 0,
97 0, 0, 0, 0, 0, 0, 0, 0,
98 0, 0, 0, 0, 0, 0, 0, 0,
99 0, 0, 0, 0, 0, 0, 0, 0,
100 };
101
102 // Values are now correlated to quantizer.
103 static int sad_per_bit16lut[QINDEX_RANGE];
104 static int sad_per_bit4lut[QINDEX_RANGE];
105
106 void vp9_init_me_luts() {
107 int i;
108
109 // Initialize the sad lut tables using a formulaic calculation for now.
110 // This is to make it easier to resolve the impact of experimental changes
111 // to the quantizer tables.
112 for (i = 0; i < QINDEX_RANGE; ++i) {
113 const double q = vp9_convert_qindex_to_q(i);
114 sad_per_bit16lut[i] = (int)(0.0418 * q + 2.4107);
115 sad_per_bit4lut[i] = (int)(0.063 * q + 2.742);
116 }
117 }
118
119 int vp9_compute_rd_mult(const VP9_COMP *cpi, int qindex) {
120 const int q = vp9_dc_quant(qindex, 0);
121 // TODO(debargha): Adjust the function below.
122 int rdmult = 88 * q * q / 25;
123 if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME)) {
124 if (cpi->twopass.next_iiratio > 31)
125 rdmult += (rdmult * rd_iifactor[31]) >> 4;
126 else
127 rdmult += (rdmult * rd_iifactor[cpi->twopass.next_iiratio]) >> 4;
128 }
129 return rdmult;
130 }
131
132 static int compute_rd_thresh_factor(int qindex) {
133 // TODO(debargha): Adjust the function below.
134 const int q = (int)(pow(vp9_dc_quant(qindex, 0) / 4.0, RD_THRESH_POW) * 5.12);
135 return MAX(q, 8);
136 }
137
138 void vp9_initialize_me_consts(VP9_COMP *cpi, int qindex) {
139 cpi->mb.sadperbit16 = sad_per_bit16lut[qindex];
140 cpi->mb.sadperbit4 = sad_per_bit4lut[qindex];
141 }
142
143 static void set_block_thresholds(const VP9_COMMON *cm, RD_OPT *rd) {
144 int i, bsize, segment_id;
145
146 for (segment_id = 0; segment_id < MAX_SEGMENTS; ++segment_id) {
147 const int qindex =
148 clamp(vp9_get_qindex(&cm->seg, segment_id, cm->base_qindex) +
149 cm->y_dc_delta_q,
150 0, MAXQ);
151 const int q = compute_rd_thresh_factor(qindex);
152
153 for (bsize = 0; bsize < BLOCK_SIZES; ++bsize) {
154 // Threshold here seems unnecessarily harsh but fine given actual
155 // range of values used for cpi->sf.thresh_mult[].
156 const int t = q * rd_thresh_block_size_factor[bsize];
157 const int thresh_max = INT_MAX / t;
158
159 if (bsize >= BLOCK_8X8) {
160 for (i = 0; i < MAX_MODES; ++i)
161 rd->threshes[segment_id][bsize][i] =
162 rd->thresh_mult[i] < thresh_max
163 ? rd->thresh_mult[i] * t / 4
164 : INT_MAX;
165 } else {
166 for (i = 0; i < MAX_REFS; ++i)
167 rd->threshes[segment_id][bsize][i] =
168 rd->thresh_mult_sub8x8[i] < thresh_max
169 ? rd->thresh_mult_sub8x8[i] * t / 4
170 : INT_MAX;
171 }
172 }
173 }
174 }
175
176 void vp9_initialize_rd_consts(VP9_COMP *cpi) {
177 VP9_COMMON *const cm = &cpi->common;
178 MACROBLOCK *const x = &cpi->mb;
179 RD_OPT *const rd = &cpi->rd;
180 int i;
181
182 vp9_clear_system_state();
183
184 rd->RDDIV = RDDIV_BITS; // In bits (to multiply D by 128).
185 rd->RDMULT = vp9_compute_rd_mult(cpi, cm->base_qindex + cm->y_dc_delta_q);
186
187 x->errorperbit = rd->RDMULT / RD_MULT_EPB_RATIO;
188 x->errorperbit += (x->errorperbit == 0);
189
190 x->select_tx_size = (cpi->sf.tx_size_search_method == USE_LARGESTALL &&
191 cm->frame_type != KEY_FRAME) ? 0 : 1;
192
193 set_block_thresholds(cm, rd);
194
195 if (!cpi->sf.use_nonrd_pick_mode || cm->frame_type == KEY_FRAME) {
196 fill_token_costs(x->token_costs, cm->fc.coef_probs);
197
198 for (i = 0; i < PARTITION_CONTEXTS; ++i)
199 vp9_cost_tokens(cpi->partition_cost[i], get_partition_probs(cm, i),
200 vp9_partition_tree);
201 }
202
203 if (!cpi->sf.use_nonrd_pick_mode || (cm->current_video_frame & 0x07) == 1 ||
204 cm->frame_type == KEY_FRAME) {
205 fill_mode_costs(cpi);
206
207 if (!frame_is_intra_only(cm)) {
208 vp9_build_nmv_cost_table(x->nmvjointcost,
209 cm->allow_high_precision_mv ? x->nmvcost_hp
210 : x->nmvcost,
211 &cm->fc.nmvc, cm->allow_high_precision_mv);
212
213 for (i = 0; i < INTER_MODE_CONTEXTS; ++i)
214 vp9_cost_tokens((int *)cpi->inter_mode_cost[i],
215 cm->fc.inter_mode_probs[i], vp9_inter_mode_tree);
216 }
217 }
218 }
219
220 static const int MAX_XSQ_Q10 = 245727;
221
222 static void model_rd_norm(int xsq_q10, int *r_q10, int *d_q10) {
223 // NOTE: The tables below must be of the same size.
224
225 // The functions described below are sampled at the four most significant
226 // bits of x^2 + 8 / 256.
227
228 // Normalized rate:
229 // This table models the rate for a Laplacian source with given variance
230 // when quantized with a uniform quantizer with given stepsize. The
231 // closed form expression is:
232 // Rn(x) = H(sqrt(r)) + sqrt(r)*[1 + H(r)/(1 - r)],
233 // where r = exp(-sqrt(2) * x) and x = qpstep / sqrt(variance),
234 // and H(x) is the binary entropy function.
235 static const int rate_tab_q10[] = {
236 65536, 6086, 5574, 5275, 5063, 4899, 4764, 4651,
237 4553, 4389, 4255, 4142, 4044, 3958, 3881, 3811,
238 3748, 3635, 3538, 3453, 3376, 3307, 3244, 3186,
239 3133, 3037, 2952, 2877, 2809, 2747, 2690, 2638,
240 2589, 2501, 2423, 2353, 2290, 2232, 2179, 2130,
241 2084, 2001, 1928, 1862, 1802, 1748, 1698, 1651,
242 1608, 1530, 1460, 1398, 1342, 1290, 1243, 1199,
243 1159, 1086, 1021, 963, 911, 864, 821, 781,
244 745, 680, 623, 574, 530, 490, 455, 424,
245 395, 345, 304, 269, 239, 213, 190, 171,
246 154, 126, 104, 87, 73, 61, 52, 44,
247 38, 28, 21, 16, 12, 10, 8, 6,
248 5, 3, 2, 1, 1, 1, 0, 0,
249 };
250 // Normalized distortion:
251 // This table models the normalized distortion for a Laplacian source
252 // with given variance when quantized with a uniform quantizer
253 // with given stepsize. The closed form expression is:
254 // Dn(x) = 1 - 1/sqrt(2) * x / sinh(x/sqrt(2))
255 // where x = qpstep / sqrt(variance).
256 // Note the actual distortion is Dn * variance.
257 static const int dist_tab_q10[] = {
258 0, 0, 1, 1, 1, 2, 2, 2,
259 3, 3, 4, 5, 5, 6, 7, 7,
260 8, 9, 11, 12, 13, 15, 16, 17,
261 18, 21, 24, 26, 29, 31, 34, 36,
262 39, 44, 49, 54, 59, 64, 69, 73,
263 78, 88, 97, 106, 115, 124, 133, 142,
264 151, 167, 184, 200, 215, 231, 245, 260,
265 274, 301, 327, 351, 375, 397, 418, 439,
266 458, 495, 528, 559, 587, 613, 637, 659,
267 680, 717, 749, 777, 801, 823, 842, 859,
268 874, 899, 919, 936, 949, 960, 969, 977,
269 983, 994, 1001, 1006, 1010, 1013, 1015, 1017,
270 1018, 1020, 1022, 1022, 1023, 1023, 1023, 1024,
271 };
272 static const int xsq_iq_q10[] = {
273 0, 4, 8, 12, 16, 20, 24, 28,
274 32, 40, 48, 56, 64, 72, 80, 88,
275 96, 112, 128, 144, 160, 176, 192, 208,
276 224, 256, 288, 320, 352, 384, 416, 448,
277 480, 544, 608, 672, 736, 800, 864, 928,
278 992, 1120, 1248, 1376, 1504, 1632, 1760, 1888,
279 2016, 2272, 2528, 2784, 3040, 3296, 3552, 3808,
280 4064, 4576, 5088, 5600, 6112, 6624, 7136, 7648,
281 8160, 9184, 10208, 11232, 12256, 13280, 14304, 15328,
282 16352, 18400, 20448, 22496, 24544, 26592, 28640, 30688,
283 32736, 36832, 40928, 45024, 49120, 53216, 57312, 61408,
284 65504, 73696, 81888, 90080, 98272, 106464, 114656, 122848,
285 131040, 147424, 163808, 180192, 196576, 212960, 229344, 245728,
286 };
287 const int tmp = (xsq_q10 >> 2) + 8;
288 const int k = get_msb(tmp) - 3;
289 const int xq = (k << 3) + ((tmp >> k) & 0x7);
290 const int one_q10 = 1 << 10;
291 const int a_q10 = ((xsq_q10 - xsq_iq_q10[xq]) << 10) >> (2 + k);
292 const int b_q10 = one_q10 - a_q10;
293 *r_q10 = (rate_tab_q10[xq] * b_q10 + rate_tab_q10[xq + 1] * a_q10) >> 10;
294 *d_q10 = (dist_tab_q10[xq] * b_q10 + dist_tab_q10[xq + 1] * a_q10) >> 10;
295 }
296
297 void vp9_model_rd_from_var_lapndz(unsigned int var, unsigned int n,
298 unsigned int qstep, int *rate,
299 int64_t *dist) {
300 // This function models the rate and distortion for a Laplacian
301 // source with given variance when quantized with a uniform quantizer
302 // with given stepsize. The closed form expressions are in:
303 // Hang and Chen, "Source Model for transform video coder and its
304 // application - Part I: Fundamental Theory", IEEE Trans. Circ.
305 // Sys. for Video Tech., April 1997.
306 if (var == 0) {
307 *rate = 0;
308 *dist = 0;
309 } else {
310 int d_q10, r_q10;
311 const uint64_t xsq_q10_64 =
312 ((((uint64_t)qstep * qstep * n) << 10) + (var >> 1)) / var;
313 const int xsq_q10 = xsq_q10_64 > MAX_XSQ_Q10 ?
314 MAX_XSQ_Q10 : (int)xsq_q10_64;
315 model_rd_norm(xsq_q10, &r_q10, &d_q10);
316 *rate = (n * r_q10 + 2) >> 2;
317 *dist = (var * (int64_t)d_q10 + 512) >> 10;
318 }
319 }
320
321 void vp9_get_entropy_contexts(BLOCK_SIZE bsize, TX_SIZE tx_size,
322 const struct macroblockd_plane *pd,
323 ENTROPY_CONTEXT t_above[16],
324 ENTROPY_CONTEXT t_left[16]) {
325 const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd);
326 const int num_4x4_w = num_4x4_blocks_wide_lookup[plane_bsize];
327 const int num_4x4_h = num_4x4_blocks_high_lookup[plane_bsize];
328 const ENTROPY_CONTEXT *const above = pd->above_context;
329 const ENTROPY_CONTEXT *const left = pd->left_context;
330
331 int i;
332 switch (tx_size) {
333 case TX_4X4:
334 vpx_memcpy(t_above, above, sizeof(ENTROPY_CONTEXT) * num_4x4_w);
335 vpx_memcpy(t_left, left, sizeof(ENTROPY_CONTEXT) * num_4x4_h);
336 break;
337 case TX_8X8:
338 for (i = 0; i < num_4x4_w; i += 2)
339 t_above[i] = !!*(const uint16_t *)&above[i];
340 for (i = 0; i < num_4x4_h; i += 2)
341 t_left[i] = !!*(const uint16_t *)&left[i];
342 break;
343 case TX_16X16:
344 for (i = 0; i < num_4x4_w; i += 4)
345 t_above[i] = !!*(const uint32_t *)&above[i];
346 for (i = 0; i < num_4x4_h; i += 4)
347 t_left[i] = !!*(const uint32_t *)&left[i];
348 break;
349 case TX_32X32:
350 for (i = 0; i < num_4x4_w; i += 8)
351 t_above[i] = !!*(const uint64_t *)&above[i];
352 for (i = 0; i < num_4x4_h; i += 8)
353 t_left[i] = !!*(const uint64_t *)&left[i];
354 break;
355 default:
356 assert(0 && "Invalid transform size.");
357 }
358 }
359
360 void vp9_mv_pred(VP9_COMP *cpi, MACROBLOCK *x,
361 uint8_t *ref_y_buffer, int ref_y_stride,
362 int ref_frame, BLOCK_SIZE block_size) {
363 MACROBLOCKD *xd = &x->e_mbd;
364 MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
365 int_mv this_mv;
366 int i;
367 int zero_seen = 0;
368 int best_index = 0;
369 int best_sad = INT_MAX;
370 int this_sad = INT_MAX;
371 int max_mv = 0;
372
373 uint8_t *src_y_ptr = x->plane[0].src.buf;
374 uint8_t *ref_y_ptr;
375 int row_offset, col_offset;
376 int num_mv_refs = MAX_MV_REF_CANDIDATES +
377 (cpi->sf.adaptive_motion_search &&
378 cpi->common.show_frame &&
379 block_size < cpi->sf.max_partition_size);
380
381 MV pred_mv[3];
382 pred_mv[0] = mbmi->ref_mvs[ref_frame][0].as_mv;
383 pred_mv[1] = mbmi->ref_mvs[ref_frame][1].as_mv;
384 pred_mv[2] = x->pred_mv[ref_frame];
385
386 // Get the sad for each candidate reference mv.
387 for (i = 0; i < num_mv_refs; ++i) {
388 this_mv.as_mv = pred_mv[i];
389
390 max_mv = MAX(max_mv,
391 MAX(abs(this_mv.as_mv.row), abs(this_mv.as_mv.col)) >> 3);
392 // Only need to check zero mv once.
393 if (!this_mv.as_int && zero_seen)
394 continue;
395
396 zero_seen = zero_seen || !this_mv.as_int;
397
398 row_offset = this_mv.as_mv.row >> 3;
399 col_offset = this_mv.as_mv.col >> 3;
400 ref_y_ptr = ref_y_buffer + (ref_y_stride * row_offset) + col_offset;
401
402 // Find sad for current vector.
403 this_sad = cpi->fn_ptr[block_size].sdf(src_y_ptr, x->plane[0].src.stride,
404 ref_y_ptr, ref_y_stride);
405
406 // Note if it is the best so far.
407 if (this_sad < best_sad) {
408 best_sad = this_sad;
409 best_index = i;
410 }
411 }
412
413 // Note the index of the mv that worked best in the reference list.
414 x->mv_best_ref_index[ref_frame] = best_index;
415 x->max_mv_context[ref_frame] = max_mv;
416 x->pred_mv_sad[ref_frame] = best_sad;
417 }
418
419 void vp9_setup_pred_block(const MACROBLOCKD *xd,
420 struct buf_2d dst[MAX_MB_PLANE],
421 const YV12_BUFFER_CONFIG *src,
422 int mi_row, int mi_col,
423 const struct scale_factors *scale,
424 const struct scale_factors *scale_uv) {
425 int i;
426
427 dst[0].buf = src->y_buffer;
428 dst[0].stride = src->y_stride;
429 dst[1].buf = src->u_buffer;
430 dst[2].buf = src->v_buffer;
431 dst[1].stride = dst[2].stride = src->uv_stride;
432 #if CONFIG_ALPHA
433 dst[3].buf = src->alpha_buffer;
434 dst[3].stride = src->alpha_stride;
435 #endif
436
437 for (i = 0; i < MAX_MB_PLANE; ++i) {
438 setup_pred_plane(dst + i, dst[i].buf, dst[i].stride, mi_row, mi_col,
439 i ? scale_uv : scale,
440 xd->plane[i].subsampling_x, xd->plane[i].subsampling_y);
441 }
442 }
443
444 const YV12_BUFFER_CONFIG *vp9_get_scaled_ref_frame(const VP9_COMP *cpi,
445 int ref_frame) {
446 const VP9_COMMON *const cm = &cpi->common;
447 const int ref_idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)];
448 const int scaled_idx = cpi->scaled_ref_idx[ref_frame - 1];
449 return (scaled_idx != ref_idx) ? &cm->frame_bufs[scaled_idx].buf : NULL;
450 }
451
452 int vp9_get_switchable_rate(const VP9_COMP *cpi) {
453 const MACROBLOCKD *const xd = &cpi->mb.e_mbd;
454 const MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi;
455 const int ctx = vp9_get_pred_context_switchable_interp(xd);
456 return SWITCHABLE_INTERP_RATE_FACTOR *
457 cpi->switchable_interp_costs[ctx][mbmi->interp_filter];
458 }
459
460 void vp9_set_rd_speed_thresholds(VP9_COMP *cpi) {
461 int i;
462 RD_OPT *const rd = &cpi->rd;
463 SPEED_FEATURES *const sf = &cpi->sf;
464
465 // Set baseline threshold values.
466 for (i = 0; i < MAX_MODES; ++i)
467 rd->thresh_mult[i] = is_best_mode(cpi->oxcf.mode) ? -500 : 0;
468
469 rd->thresh_mult[THR_NEARESTMV] = 0;
470 rd->thresh_mult[THR_NEARESTG] = 0;
471 rd->thresh_mult[THR_NEARESTA] = 0;
472
473 rd->thresh_mult[THR_DC] += 1000;
474
475 rd->thresh_mult[THR_NEWMV] += 1000;
476 rd->thresh_mult[THR_NEWA] += 1000;
477 rd->thresh_mult[THR_NEWG] += 1000;
478
479 // Adjust threshold only in real time mode, which only uses last
480 // reference frame.
481 rd->thresh_mult[THR_NEWMV] += sf->elevate_newmv_thresh;
482
483 rd->thresh_mult[THR_NEARMV] += 1000;
484 rd->thresh_mult[THR_NEARA] += 1000;
485 rd->thresh_mult[THR_COMP_NEARESTLA] += 1000;
486 rd->thresh_mult[THR_COMP_NEARESTGA] += 1000;
487
488 rd->thresh_mult[THR_TM] += 1000;
489
490 rd->thresh_mult[THR_COMP_NEARLA] += 1500;
491 rd->thresh_mult[THR_COMP_NEWLA] += 2000;
492 rd->thresh_mult[THR_NEARG] += 1000;
493 rd->thresh_mult[THR_COMP_NEARGA] += 1500;
494 rd->thresh_mult[THR_COMP_NEWGA] += 2000;
495
496 rd->thresh_mult[THR_ZEROMV] += 2000;
497 rd->thresh_mult[THR_ZEROG] += 2000;
498 rd->thresh_mult[THR_ZEROA] += 2000;
499 rd->thresh_mult[THR_COMP_ZEROLA] += 2500;
500 rd->thresh_mult[THR_COMP_ZEROGA] += 2500;
501
502 rd->thresh_mult[THR_H_PRED] += 2000;
503 rd->thresh_mult[THR_V_PRED] += 2000;
504 rd->thresh_mult[THR_D45_PRED ] += 2500;
505 rd->thresh_mult[THR_D135_PRED] += 2500;
506 rd->thresh_mult[THR_D117_PRED] += 2500;
507 rd->thresh_mult[THR_D153_PRED] += 2500;
508 rd->thresh_mult[THR_D207_PRED] += 2500;
509 rd->thresh_mult[THR_D63_PRED] += 2500;
510
511 // Disable frame modes if flags not set.
512 if (!(cpi->ref_frame_flags & VP9_LAST_FLAG)) {
513 rd->thresh_mult[THR_NEWMV ] = INT_MAX;
514 rd->thresh_mult[THR_NEARESTMV] = INT_MAX;
515 rd->thresh_mult[THR_ZEROMV ] = INT_MAX;
516 rd->thresh_mult[THR_NEARMV ] = INT_MAX;
517 }
518 if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG)) {
519 rd->thresh_mult[THR_NEARESTG ] = INT_MAX;
520 rd->thresh_mult[THR_ZEROG ] = INT_MAX;
521 rd->thresh_mult[THR_NEARG ] = INT_MAX;
522 rd->thresh_mult[THR_NEWG ] = INT_MAX;
523 }
524 if (!(cpi->ref_frame_flags & VP9_ALT_FLAG)) {
525 rd->thresh_mult[THR_NEARESTA ] = INT_MAX;
526 rd->thresh_mult[THR_ZEROA ] = INT_MAX;
527 rd->thresh_mult[THR_NEARA ] = INT_MAX;
528 rd->thresh_mult[THR_NEWA ] = INT_MAX;
529 }
530
531 if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
532 (VP9_LAST_FLAG | VP9_ALT_FLAG)) {
533 rd->thresh_mult[THR_COMP_ZEROLA ] = INT_MAX;
534 rd->thresh_mult[THR_COMP_NEARESTLA] = INT_MAX;
535 rd->thresh_mult[THR_COMP_NEARLA ] = INT_MAX;
536 rd->thresh_mult[THR_COMP_NEWLA ] = INT_MAX;
537 }
538 if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
539 (VP9_GOLD_FLAG | VP9_ALT_FLAG)) {
540 rd->thresh_mult[THR_COMP_ZEROGA ] = INT_MAX;
541 rd->thresh_mult[THR_COMP_NEARESTGA] = INT_MAX;
542 rd->thresh_mult[THR_COMP_NEARGA ] = INT_MAX;
543 rd->thresh_mult[THR_COMP_NEWGA ] = INT_MAX;
544 }
545 }
546
547 void vp9_set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) {
548 const SPEED_FEATURES *const sf = &cpi->sf;
549 RD_OPT *const rd = &cpi->rd;
550 int i;
551
552 for (i = 0; i < MAX_REFS; ++i)
553 rd->thresh_mult_sub8x8[i] = is_best_mode(cpi->oxcf.mode) ? -500 : 0;
554
555 rd->thresh_mult_sub8x8[THR_LAST] += 2500;
556 rd->thresh_mult_sub8x8[THR_GOLD] += 2500;
557 rd->thresh_mult_sub8x8[THR_ALTR] += 2500;
558 rd->thresh_mult_sub8x8[THR_INTRA] += 2500;
559 rd->thresh_mult_sub8x8[THR_COMP_LA] += 4500;
560 rd->thresh_mult_sub8x8[THR_COMP_GA] += 4500;
561
562 // Check for masked out split cases.
563 for (i = 0; i < MAX_REFS; ++i)
564 if (sf->disable_split_mask & (1 << i))
565 rd->thresh_mult_sub8x8[i] = INT_MAX;
566
567 // Disable mode test if frame flag is not set.
568 if (!(cpi->ref_frame_flags & VP9_LAST_FLAG))
569 rd->thresh_mult_sub8x8[THR_LAST] = INT_MAX;
570 if (!(cpi->ref_frame_flags & VP9_GOLD_FLAG))
571 rd->thresh_mult_sub8x8[THR_GOLD] = INT_MAX;
572 if (!(cpi->ref_frame_flags & VP9_ALT_FLAG))
573 rd->thresh_mult_sub8x8[THR_ALTR] = INT_MAX;
574 if ((cpi->ref_frame_flags & (VP9_LAST_FLAG | VP9_ALT_FLAG)) !=
575 (VP9_LAST_FLAG | VP9_ALT_FLAG))
576 rd->thresh_mult_sub8x8[THR_COMP_LA] = INT_MAX;
577 if ((cpi->ref_frame_flags & (VP9_GOLD_FLAG | VP9_ALT_FLAG)) !=
578 (VP9_GOLD_FLAG | VP9_ALT_FLAG))
579 rd->thresh_mult_sub8x8[THR_COMP_GA] = INT_MAX;
580 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_rd.h ('k') | source/libvpx/vp9/encoder/vp9_rdopt.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698