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

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

Issue 341293003: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 6 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
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <limits.h> 11 #include <limits.h>
12 12
13 #include "vp9/encoder/vp9_encoder.h" 13 #include "vp9/encoder/vp9_encoder.h"
14 #include "vp9/encoder/vp9_speed_features.h" 14 #include "vp9/encoder/vp9_speed_features.h"
15 15
16 enum { 16 enum {
17 ALL_INTRA_MODES = (1 << DC_PRED) | 17 INTRA_ALL = (1 << DC_PRED) |
18 (1 << V_PRED) | (1 << H_PRED) | 18 (1 << V_PRED) | (1 << H_PRED) |
19 (1 << D45_PRED) | (1 << D135_PRED) | 19 (1 << D45_PRED) | (1 << D135_PRED) |
20 (1 << D117_PRED) | (1 << D153_PRED) | 20 (1 << D117_PRED) | (1 << D153_PRED) |
21 (1 << D207_PRED) | (1 << D63_PRED) | 21 (1 << D207_PRED) | (1 << D63_PRED) |
22 (1 << TM_PRED), 22 (1 << TM_PRED),
23 23 INTRA_DC = (1 << DC_PRED),
24 INTRA_DC_ONLY = (1 << DC_PRED), 24 INTRA_DC_TM = (1 << DC_PRED) | (1 << TM_PRED),
25
26 INTRA_DC_TM = (1 << TM_PRED) | (1 << DC_PRED),
27
28 INTRA_DC_H_V = (1 << DC_PRED) | (1 << V_PRED) | (1 << H_PRED), 25 INTRA_DC_H_V = (1 << DC_PRED) | (1 << V_PRED) | (1 << H_PRED),
29 26 INTRA_DC_TM_H_V = (1 << DC_PRED) | (1 << TM_PRED) | (1 << V_PRED) |
30 INTRA_DC_TM_H_V = INTRA_DC_TM | (1 << V_PRED) | (1 << H_PRED) 27 (1 << H_PRED)
31 }; 28 };
32 29
33 enum { 30 enum {
31 INTER_ALL = (1 << NEARESTMV) | (1 << NEARMV) | (1 << ZEROMV) | (1 << NEWMV),
32 INTER_NEAREST = (1 << NEARESTMV),
33 INTER_NEAREST_NEAR_NEW = (1 << NEARESTMV) | (1 << NEARMV) | (1 << NEWMV)
34 };
35
36 enum {
34 DISABLE_ALL_INTER_SPLIT = (1 << THR_COMP_GA) | 37 DISABLE_ALL_INTER_SPLIT = (1 << THR_COMP_GA) |
35 (1 << THR_COMP_LA) | 38 (1 << THR_COMP_LA) |
36 (1 << THR_ALTR) | 39 (1 << THR_ALTR) |
37 (1 << THR_GOLD) | 40 (1 << THR_GOLD) |
38 (1 << THR_LAST), 41 (1 << THR_LAST),
39 42
40 DISABLE_ALL_SPLIT = (1 << THR_INTRA) | DISABLE_ALL_INTER_SPLIT, 43 DISABLE_ALL_SPLIT = (1 << THR_INTRA) | DISABLE_ALL_INTER_SPLIT,
41 44
42 DISABLE_COMPOUND_SPLIT = (1 << THR_COMP_GA) | (1 << THR_COMP_LA), 45 DISABLE_COMPOUND_SPLIT = (1 << THR_COMP_GA) | (1 << THR_COMP_LA),
43 46
(...skipping 15 matching lines...) Expand all
59 sf->tx_size_search_method = frame_is_boosted(cpi) ? USE_FULL_RD 62 sf->tx_size_search_method = frame_is_boosted(cpi) ? USE_FULL_RD
60 : USE_LARGESTALL; 63 : USE_LARGESTALL;
61 64
62 if (MIN(cm->width, cm->height) >= 720) 65 if (MIN(cm->width, cm->height) >= 720)
63 sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT 66 sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
64 : DISABLE_ALL_INTER_SPLIT; 67 : DISABLE_ALL_INTER_SPLIT;
65 else 68 else
66 sf->disable_split_mask = DISABLE_COMPOUND_SPLIT; 69 sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
67 sf->use_rd_breakout = 1; 70 sf->use_rd_breakout = 1;
68 sf->adaptive_motion_search = 1; 71 sf->adaptive_motion_search = 1;
69 sf->auto_mv_step_size = 1; 72 sf->mv.auto_mv_step_size = 1;
70 sf->adaptive_rd_thresh = 2; 73 sf->adaptive_rd_thresh = 2;
71 sf->subpel_iters_per_step = 1; 74 sf->mv.subpel_iters_per_step = 1;
72 sf->mode_skip_start = 10; 75 sf->mode_skip_start = 10;
73 sf->adaptive_pred_interp_filter = 1; 76 sf->adaptive_pred_interp_filter = 1;
74 77
75 sf->recode_loop = ALLOW_RECODE_KFARFGF; 78 sf->recode_loop = ALLOW_RECODE_KFARFGF;
76 sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V; 79 sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
77 sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V; 80 sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V;
78 sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V; 81 sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V;
79 sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V; 82 sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
80 } 83 }
81 84
82 if (speed >= 2) { 85 if (speed >= 2) {
83 if (MIN(cm->width, cm->height) >= 720) 86 if (MIN(cm->width, cm->height) >= 720) {
87 sf->lf_motion_threshold = LOW_MOITION_THRESHOLD;
88 sf->last_partitioning_redo_frequency = 3;
84 sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT 89 sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
85 : DISABLE_ALL_INTER_SPLIT; 90 : DISABLE_ALL_INTER_SPLIT;
86 else 91 } else {
87 sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY; 92 sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;
88 93 sf->last_partitioning_redo_frequency = 2;
94 sf->lf_motion_threshold = NO_MOITION_THRESHOLD;
95 }
89 sf->adaptive_pred_interp_filter = 2; 96 sf->adaptive_pred_interp_filter = 2;
90 sf->reference_masking = 1; 97 sf->reference_masking = 1;
91 sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH | 98 sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
92 FLAG_SKIP_INTRA_BESTINTER | 99 FLAG_SKIP_INTRA_BESTINTER |
93 FLAG_SKIP_COMP_BESTINTRA | 100 FLAG_SKIP_COMP_BESTINTRA |
94 FLAG_SKIP_INTRA_LOWVAR; 101 FLAG_SKIP_INTRA_LOWVAR;
95 sf->disable_filter_search_var_thresh = 100; 102 sf->disable_filter_search_var_thresh = 100;
96 sf->comp_inter_joint_search_thresh = BLOCK_SIZES; 103 sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
97 sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX; 104 sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
98 sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_LOW_MOTION; 105 sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_LOW_MOTION;
99 sf->adjust_partitioning_from_last_frame = 1; 106 sf->adjust_partitioning_from_last_frame = 1;
100 sf->last_partitioning_redo_frequency = 3;
101 } 107 }
102 108
103 if (speed >= 3) { 109 if (speed >= 3) {
104 sf->tx_size_search_method = frame_is_intra_only(cm) ? USE_FULL_RD 110 sf->tx_size_search_method = frame_is_intra_only(cm) ? USE_FULL_RD
105 : USE_LARGESTALL; 111 : USE_LARGESTALL;
106 if (MIN(cm->width, cm->height) >= 720) 112 if (MIN(cm->width, cm->height) >= 720)
107 sf->disable_split_mask = DISABLE_ALL_SPLIT; 113 sf->disable_split_mask = DISABLE_ALL_SPLIT;
108 else 114 else
109 sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT; 115 sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT;
110 116
117 sf->lf_motion_threshold = LOW_MOITION_THRESHOLD;
118 sf->last_partitioning_redo_frequency = 3;
111 sf->recode_loop = ALLOW_RECODE_KFMAXBW; 119 sf->recode_loop = ALLOW_RECODE_KFMAXBW;
112 sf->adaptive_rd_thresh = 3; 120 sf->adaptive_rd_thresh = 3;
113 sf->mode_skip_start = 6; 121 sf->mode_skip_start = 6;
114 sf->use_fast_coef_updates = ONE_LOOP_REDUCED; 122 sf->use_fast_coef_updates = ONE_LOOP_REDUCED;
115 sf->use_fast_coef_costing = 1; 123 sf->use_fast_coef_costing = 1;
116 } 124 }
117 125
118 if (speed >= 4) { 126 if (speed >= 4) {
119 sf->use_square_partition_only = 1; 127 sf->use_square_partition_only = 1;
120 sf->tx_size_search_method = USE_LARGESTALL; 128 sf->tx_size_search_method = USE_LARGESTALL;
121 sf->disable_split_mask = DISABLE_ALL_SPLIT; 129 sf->disable_split_mask = DISABLE_ALL_SPLIT;
122 sf->adaptive_rd_thresh = 4; 130 sf->adaptive_rd_thresh = 4;
123 sf->mode_search_skip_flags |= FLAG_SKIP_COMP_REFMISMATCH | 131 sf->mode_search_skip_flags |= FLAG_SKIP_COMP_REFMISMATCH |
124 FLAG_EARLY_TERMINATE; 132 FLAG_EARLY_TERMINATE;
125 sf->disable_filter_search_var_thresh = 200; 133 sf->disable_filter_search_var_thresh = 200;
126 sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL; 134 sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL;
127 sf->use_lp32x32fdct = 1; 135 sf->use_lp32x32fdct = 1;
128 } 136 }
129 137
130 if (speed >= 5) { 138 if (speed >= 5) {
131 int i; 139 int i;
132 140
133 sf->partition_search_type = FIXED_PARTITION; 141 sf->partition_search_type = FIXED_PARTITION;
134 sf->optimize_coefficients = 0; 142 sf->optimize_coefficients = 0;
135 sf->search_method = HEX; 143 sf->mv.search_method = HEX;
136 sf->disable_filter_search_var_thresh = 500; 144 sf->disable_filter_search_var_thresh = 500;
137 for (i = 0; i < TX_SIZES; ++i) { 145 for (i = 0; i < TX_SIZES; ++i) {
138 sf->intra_y_mode_mask[i] = INTRA_DC_ONLY; 146 sf->intra_y_mode_mask[i] = INTRA_DC;
139 sf->intra_uv_mode_mask[i] = INTRA_DC_ONLY; 147 sf->intra_uv_mode_mask[i] = INTRA_DC;
140 } 148 }
141 cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED; 149 cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
142 } 150 }
143 } 151 }
144 152
145 static void set_rt_speed_feature(VP9_COMMON *cm, SPEED_FEATURES *sf, 153 static void set_rt_speed_feature(VP9_COMP *cpi, SPEED_FEATURES *sf,
146 int speed) { 154 int speed) {
155 VP9_COMMON *const cm = &cpi->common;
156 const int frames_since_key =
157 cm->frame_type == KEY_FRAME ? 0 : cpi->rc.frames_since_key;
147 sf->static_segmentation = 0; 158 sf->static_segmentation = 0;
148 sf->adaptive_rd_thresh = 1; 159 sf->adaptive_rd_thresh = 1;
149 sf->encode_breakout_thresh = 1;
150 sf->use_fast_coef_costing = 1; 160 sf->use_fast_coef_costing = 1;
151 161
152 if (speed == 1) { 162 if (speed >= 1) {
153 sf->use_square_partition_only = !frame_is_intra_only(cm); 163 sf->use_square_partition_only = !frame_is_intra_only(cm);
154 sf->less_rectangular_check = 1; 164 sf->less_rectangular_check = 1;
155 sf->tx_size_search_method = frame_is_intra_only(cm) ? USE_FULL_RD 165 sf->tx_size_search_method = frame_is_intra_only(cm) ? USE_FULL_RD
156 : USE_LARGESTALL; 166 : USE_LARGESTALL;
157 167
158 if (MIN(cm->width, cm->height) >= 720) 168 if (MIN(cm->width, cm->height) >= 720)
159 sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT 169 sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
160 : DISABLE_ALL_INTER_SPLIT; 170 : DISABLE_ALL_INTER_SPLIT;
161 else 171 else
162 sf->disable_split_mask = DISABLE_COMPOUND_SPLIT; 172 sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
163 173
164 sf->use_rd_breakout = 1; 174 sf->use_rd_breakout = 1;
165 sf->adaptive_motion_search = 1; 175 sf->adaptive_motion_search = 1;
166 sf->adaptive_pred_interp_filter = 1; 176 sf->adaptive_pred_interp_filter = 1;
167 sf->auto_mv_step_size = 1; 177 sf->mv.auto_mv_step_size = 1;
168 sf->adaptive_rd_thresh = 2; 178 sf->adaptive_rd_thresh = 2;
169 sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V; 179 sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
170 sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V; 180 sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V;
171 sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V; 181 sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
172 sf->encode_breakout_thresh = 8;
173 } 182 }
174 183
175 if (speed >= 2) { 184 if (speed >= 2) {
176 sf->use_square_partition_only = !frame_is_intra_only(cm);
177 sf->less_rectangular_check = 1;
178 sf->tx_size_search_method = frame_is_intra_only(cm) ? USE_FULL_RD
179 : USE_LARGESTALL;
180 if (MIN(cm->width, cm->height) >= 720) 185 if (MIN(cm->width, cm->height) >= 720)
181 sf->disable_split_mask = cm->show_frame ? 186 sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
182 DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT; 187 : DISABLE_ALL_INTER_SPLIT;
183 else 188 else
184 sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY; 189 sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;
185 190
186 sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH | 191 sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
187 FLAG_SKIP_INTRA_BESTINTER | 192 FLAG_SKIP_INTRA_BESTINTER |
188 FLAG_SKIP_COMP_BESTINTRA | 193 FLAG_SKIP_COMP_BESTINTRA |
189 FLAG_SKIP_INTRA_LOWVAR; 194 FLAG_SKIP_INTRA_LOWVAR;
190 sf->use_rd_breakout = 1;
191 sf->adaptive_motion_search = 1;
192 sf->adaptive_pred_interp_filter = 2; 195 sf->adaptive_pred_interp_filter = 2;
193 sf->auto_mv_step_size = 1;
194 sf->reference_masking = 1; 196 sf->reference_masking = 1;
195
196 sf->disable_filter_search_var_thresh = 50; 197 sf->disable_filter_search_var_thresh = 50;
197 sf->comp_inter_joint_search_thresh = BLOCK_SIZES; 198 sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
198
199 sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX; 199 sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
200 sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_LOW_MOTION; 200 sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_LOW_MOTION;
201 sf->lf_motion_threshold = LOW_MOITION_THRESHOLD;
201 sf->adjust_partitioning_from_last_frame = 1; 202 sf->adjust_partitioning_from_last_frame = 1;
202 sf->last_partitioning_redo_frequency = 3; 203 sf->last_partitioning_redo_frequency = 3;
203
204 sf->adaptive_rd_thresh = 2;
205 sf->use_lp32x32fdct = 1; 204 sf->use_lp32x32fdct = 1;
206 sf->mode_skip_start = 11; 205 sf->mode_skip_start = 11;
207 sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
208 sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V; 206 sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V;
209 sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V;
210 sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
211 sf->encode_breakout_thresh = 200;
212 } 207 }
213 208
214 if (speed >= 3) { 209 if (speed >= 3) {
215 sf->use_square_partition_only = 1; 210 sf->use_square_partition_only = 1;
216 sf->disable_filter_search_var_thresh = 100; 211 sf->disable_filter_search_var_thresh = 100;
217 sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL; 212 sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL;
218 sf->constrain_copy_partition = 1; 213 sf->constrain_copy_partition = 1;
219 sf->use_uv_intra_rd_estimate = 1; 214 sf->use_uv_intra_rd_estimate = 1;
220 sf->skip_encode_sb = 1; 215 sf->skip_encode_sb = 1;
221 sf->subpel_iters_per_step = 1; 216 sf->mv.subpel_iters_per_step = 1;
222 sf->use_fast_coef_updates = ONE_LOOP_REDUCED; 217 sf->use_fast_coef_updates = ONE_LOOP_REDUCED;
223 sf->adaptive_rd_thresh = 4; 218 sf->adaptive_rd_thresh = 4;
224 sf->mode_skip_start = 6; 219 sf->mode_skip_start = 6;
225 sf->allow_skip_recode = 0; 220 sf->allow_skip_recode = 0;
226 sf->optimize_coefficients = 0; 221 sf->optimize_coefficients = 0;
227 sf->disable_split_mask = DISABLE_ALL_SPLIT; 222 sf->disable_split_mask = DISABLE_ALL_SPLIT;
228 sf->lpf_pick = LPF_PICK_FROM_Q; 223 sf->lpf_pick = LPF_PICK_FROM_Q;
229 sf->encode_breakout_thresh = 700;
230 } 224 }
231 225
232 if (speed >= 4) { 226 if (speed >= 4) {
233 int i; 227 int i;
234 sf->last_partitioning_redo_frequency = 4; 228 sf->last_partitioning_redo_frequency = 4;
235 sf->adaptive_rd_thresh = 5; 229 sf->adaptive_rd_thresh = 5;
236 sf->use_fast_coef_costing = 0; 230 sf->use_fast_coef_costing = 0;
237 sf->auto_min_max_partition_size = STRICT_NEIGHBORING_MIN_MAX; 231 sf->auto_min_max_partition_size = STRICT_NEIGHBORING_MIN_MAX;
238 sf->adjust_partitioning_from_last_frame = 232 sf->adjust_partitioning_from_last_frame =
239 cm->last_frame_type != cm->frame_type || (0 == 233 cm->last_frame_type != cm->frame_type || (0 ==
240 (cm->current_video_frame + 1) % sf->last_partitioning_redo_frequency); 234 (frames_since_key + 1) % sf->last_partitioning_redo_frequency);
241 sf->subpel_force_stop = 1; 235 sf->mv.subpel_force_stop = 1;
242 for (i = 0; i < TX_SIZES; i++) { 236 for (i = 0; i < TX_SIZES; i++) {
243 sf->intra_y_mode_mask[i] = INTRA_DC_H_V; 237 sf->intra_y_mode_mask[i] = INTRA_DC_H_V;
244 sf->intra_uv_mode_mask[i] = INTRA_DC_ONLY; 238 sf->intra_uv_mode_mask[i] = INTRA_DC;
245 } 239 }
246 sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_ONLY; 240 sf->intra_y_mode_mask[TX_32X32] = INTRA_DC;
247 sf->frame_parameter_update = 0; 241 sf->frame_parameter_update = 0;
248 sf->encode_breakout_thresh = 1000; 242 sf->mv.search_method = FAST_HEX;
249 sf->search_method = FAST_HEX; 243 sf->inter_mode_mask[BLOCK_32X32] = INTER_NEAREST_NEAR_NEW;
250 sf->disable_inter_mode_mask[BLOCK_32X32] = 1 << INTER_OFFSET(ZEROMV); 244 sf->inter_mode_mask[BLOCK_32X64] = INTER_NEAREST;
251 sf->disable_inter_mode_mask[BLOCK_32X64] = ~(1 << INTER_OFFSET(NEARESTMV)); 245 sf->inter_mode_mask[BLOCK_64X32] = INTER_NEAREST;
252 sf->disable_inter_mode_mask[BLOCK_64X32] = ~(1 << INTER_OFFSET(NEARESTMV)); 246 sf->inter_mode_mask[BLOCK_64X64] = INTER_NEAREST;
253 sf->disable_inter_mode_mask[BLOCK_64X64] = ~(1 << INTER_OFFSET(NEARESTMV));
254 sf->max_intra_bsize = BLOCK_32X32; 247 sf->max_intra_bsize = BLOCK_32X32;
255 sf->allow_skip_recode = 1; 248 sf->allow_skip_recode = 1;
256 } 249 }
257 250
258 if (speed >= 5) { 251 if (speed >= 5) {
252 sf->auto_min_max_partition_size = (cm->frame_type == KEY_FRAME) ?
253 RELAXED_NEIGHBORING_MIN_MAX : STRICT_NEIGHBORING_MIN_MAX;
259 sf->max_partition_size = BLOCK_32X32; 254 sf->max_partition_size = BLOCK_32X32;
260 sf->min_partition_size = BLOCK_8X8; 255 sf->min_partition_size = BLOCK_8X8;
261 sf->partition_check = 256 sf->partition_check =
262 (cm->current_video_frame % sf->last_partitioning_redo_frequency == 1); 257 (frames_since_key % sf->last_partitioning_redo_frequency == 1);
263 sf->force_frame_boost = cm->frame_type == KEY_FRAME || 258 sf->force_frame_boost = cm->frame_type == KEY_FRAME ||
264 (cm->current_video_frame % 259 (frames_since_key %
265 (sf->last_partitioning_redo_frequency << 1) == 1); 260 (sf->last_partitioning_redo_frequency << 1) == 1);
266 sf->max_delta_qindex = (cm->frame_type == KEY_FRAME) ? 20 : 15; 261 sf->max_delta_qindex = (cm->frame_type == KEY_FRAME) ? 20 : 15;
267 sf->partition_search_type = REFERENCE_PARTITION; 262 sf->partition_search_type = REFERENCE_PARTITION;
268 sf->use_nonrd_pick_mode = 1; 263 sf->use_nonrd_pick_mode = 1;
269 sf->search_method = FAST_DIAMOND; 264 sf->mv.search_method = FAST_DIAMOND;
270 sf->allow_skip_recode = 0; 265 sf->allow_skip_recode = 0;
271 sf->chessboard_index = cm->current_video_frame & 0x01;
272 } 266 }
273 267
274 if (speed >= 6) { 268 if (speed >= 6) {
275 // Adaptively switch between SOURCE_VAR_BASED_PARTITION and FIXED_PARTITION. 269 // Adaptively switch between SOURCE_VAR_BASED_PARTITION and FIXED_PARTITION.
276 sf->partition_search_type = SOURCE_VAR_BASED_PARTITION; 270 sf->partition_search_type = SOURCE_VAR_BASED_PARTITION;
277 sf->search_type_check_frequency = 50; 271 sf->search_type_check_frequency = 50;
278 sf->source_var_thresh = 360; 272 sf->source_var_thresh = 360;
273
274 sf->tx_size_search_method = USE_TX_8X8;
275 // TODO(yunqingwang): max_intra_bsize is used to decide if DC_PRED mode
276 // is checked for a partition block. Later, we can try to allow large
277 // partitions to do intra mode checking.
278 sf->max_intra_bsize = BLOCK_8X8;
279 } 279 }
280 280
281 if (speed >= 7) { 281 if (speed >= 7) {
282 int i; 282 int i;
283 for (i = 0; i < BLOCK_SIZES; ++i) 283 for (i = 0; i < BLOCK_SIZES; ++i)
284 sf->disable_inter_mode_mask[i] = ~(1 << INTER_OFFSET(NEARESTMV)); 284 sf->inter_mode_mask[i] = INTER_NEAREST;
285 } 285 }
286 } 286 }
287 287
288 void vp9_set_speed_features(VP9_COMP *cpi) { 288 void vp9_set_speed_features(VP9_COMP *cpi) {
289 SPEED_FEATURES *const sf = &cpi->sf; 289 SPEED_FEATURES *const sf = &cpi->sf;
290 VP9_COMMON *const cm = &cpi->common; 290 VP9_COMMON *const cm = &cpi->common;
291 const VP9EncoderConfig *const oxcf = &cpi->oxcf; 291 const VP9EncoderConfig *const oxcf = &cpi->oxcf;
292 int i; 292 int i;
293 293
294 // best quality defaults 294 // best quality defaults
295 sf->frame_parameter_update = 1; 295 sf->frame_parameter_update = 1;
296 sf->search_method = NSTEP; 296 sf->mv.search_method = NSTEP;
297 sf->recode_loop = ALLOW_RECODE; 297 sf->recode_loop = ALLOW_RECODE;
298 sf->subpel_search_method = SUBPEL_TREE; 298 sf->mv.subpel_search_method = SUBPEL_TREE;
299 sf->subpel_iters_per_step = 2; 299 sf->mv.subpel_iters_per_step = 2;
300 sf->subpel_force_stop = 0; 300 sf->mv.subpel_force_stop = 0;
301 sf->optimize_coefficients = !oxcf->lossless; 301 sf->optimize_coefficients = !is_lossless_requested(&cpi->oxcf);
302 sf->reduce_first_step_size = 0; 302 sf->mv.reduce_first_step_size = 0;
303 sf->auto_mv_step_size = 0; 303 sf->mv.auto_mv_step_size = 0;
304 sf->max_step_search_steps = MAX_MVSEARCH_STEPS; 304 sf->mv.max_step_search_steps = MAX_MVSEARCH_STEPS;
305 sf->comp_inter_joint_search_thresh = BLOCK_4X4; 305 sf->comp_inter_joint_search_thresh = BLOCK_4X4;
306 sf->adaptive_rd_thresh = 0; 306 sf->adaptive_rd_thresh = 0;
307 sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_OFF; 307 sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_OFF;
308 sf->tx_size_search_method = USE_FULL_RD; 308 sf->tx_size_search_method = USE_FULL_RD;
309 sf->use_lp32x32fdct = 0; 309 sf->use_lp32x32fdct = 0;
310 sf->adaptive_motion_search = 0; 310 sf->adaptive_motion_search = 0;
311 sf->adaptive_pred_interp_filter = 0; 311 sf->adaptive_pred_interp_filter = 0;
312 sf->reference_masking = 0; 312 sf->reference_masking = 0;
313 sf->partition_search_type = SEARCH_PARTITION; 313 sf->partition_search_type = SEARCH_PARTITION;
314 sf->less_rectangular_check = 0; 314 sf->less_rectangular_check = 0;
315 sf->use_square_partition_only = 0; 315 sf->use_square_partition_only = 0;
316 sf->auto_min_max_partition_size = NOT_IN_USE; 316 sf->auto_min_max_partition_size = NOT_IN_USE;
317 sf->max_partition_size = BLOCK_64X64; 317 sf->max_partition_size = BLOCK_64X64;
318 sf->min_partition_size = BLOCK_4X4; 318 sf->min_partition_size = BLOCK_4X4;
319 sf->adjust_partitioning_from_last_frame = 0; 319 sf->adjust_partitioning_from_last_frame = 0;
320 sf->last_partitioning_redo_frequency = 4; 320 sf->last_partitioning_redo_frequency = 4;
321 sf->constrain_copy_partition = 0; 321 sf->constrain_copy_partition = 0;
322 sf->disable_split_mask = 0; 322 sf->disable_split_mask = 0;
323 sf->mode_search_skip_flags = 0; 323 sf->mode_search_skip_flags = 0;
324 sf->force_frame_boost = 0; 324 sf->force_frame_boost = 0;
325 sf->max_delta_qindex = 0; 325 sf->max_delta_qindex = 0;
326 sf->disable_split_var_thresh = 0; 326 sf->disable_split_var_thresh = 0;
327 sf->disable_filter_search_var_thresh = 0; 327 sf->disable_filter_search_var_thresh = 0;
328 for (i = 0; i < TX_SIZES; i++) { 328 for (i = 0; i < TX_SIZES; i++) {
329 sf->intra_y_mode_mask[i] = ALL_INTRA_MODES; 329 sf->intra_y_mode_mask[i] = INTRA_ALL;
330 sf->intra_uv_mode_mask[i] = ALL_INTRA_MODES; 330 sf->intra_uv_mode_mask[i] = INTRA_ALL;
331 } 331 }
332 sf->use_rd_breakout = 0; 332 sf->use_rd_breakout = 0;
333 sf->skip_encode_sb = 0; 333 sf->skip_encode_sb = 0;
334 sf->use_uv_intra_rd_estimate = 0; 334 sf->use_uv_intra_rd_estimate = 0;
335 sf->allow_skip_recode = 0; 335 sf->allow_skip_recode = 0;
336 sf->lpf_pick = LPF_PICK_FROM_FULL_IMAGE; 336 sf->lpf_pick = LPF_PICK_FROM_FULL_IMAGE;
337 sf->use_fast_coef_updates = TWO_LOOP; 337 sf->use_fast_coef_updates = TWO_LOOP;
338 sf->use_fast_coef_costing = 0; 338 sf->use_fast_coef_costing = 0;
339 sf->mode_skip_start = MAX_MODES; // Mode index at which mode skip mask set 339 sf->mode_skip_start = MAX_MODES; // Mode index at which mode skip mask set
340 sf->use_nonrd_pick_mode = 0; 340 sf->use_nonrd_pick_mode = 0;
341 sf->encode_breakout_thresh = 0;
342 for (i = 0; i < BLOCK_SIZES; ++i) 341 for (i = 0; i < BLOCK_SIZES; ++i)
343 sf->disable_inter_mode_mask[i] = 0; 342 sf->inter_mode_mask[i] = INTER_ALL;
344 sf->max_intra_bsize = BLOCK_64X64; 343 sf->max_intra_bsize = BLOCK_64X64;
345 // This setting only takes effect when partition_search_type is set 344 // This setting only takes effect when partition_search_type is set
346 // to FIXED_PARTITION. 345 // to FIXED_PARTITION.
347 sf->always_this_block_size = BLOCK_16X16; 346 sf->always_this_block_size = BLOCK_16X16;
348 sf->search_type_check_frequency = 50; 347 sf->search_type_check_frequency = 50;
349 sf->source_var_thresh = 100; 348 sf->source_var_thresh = 100;
350 349
351 // Recode loop tolerence %. 350 // Recode loop tolerence %.
352 sf->recode_tolerance = 25; 351 sf->recode_tolerance = 25;
353 352
354 switch (oxcf->mode) { 353 switch (oxcf->mode) {
355 case ONE_PASS_BEST: 354 case ONE_PASS_BEST:
356 case TWO_PASS_SECOND_BEST: // This is the best quality mode. 355 case TWO_PASS_SECOND_BEST: // This is the best quality mode.
357 cpi->diamond_search_sad = vp9_full_range_search; 356 cpi->diamond_search_sad = vp9_full_range_search;
358 break; 357 break;
359 case TWO_PASS_FIRST: 358 case TWO_PASS_FIRST:
360 case ONE_PASS_GOOD: 359 case ONE_PASS_GOOD:
361 case TWO_PASS_SECOND_GOOD: 360 case TWO_PASS_SECOND_GOOD:
362 set_good_speed_feature(cpi, cm, sf, oxcf->speed); 361 set_good_speed_feature(cpi, cm, sf, oxcf->speed);
363 break; 362 break;
364 case REALTIME: 363 case REALTIME:
365 set_rt_speed_feature(cm, sf, oxcf->speed); 364 set_rt_speed_feature(cpi, sf, oxcf->speed);
366 break; 365 break;
367 } 366 }
368 367
369 // Slow quant, dct and trellis not worthwhile for first pass 368 // Slow quant, dct and trellis not worthwhile for first pass
370 // so make sure they are always turned off. 369 // so make sure they are always turned off.
371 if (cpi->pass == 1) 370 if (cpi->pass == 1)
372 sf->optimize_coefficients = 0; 371 sf->optimize_coefficients = 0;
373 372
374 // No recode for 1 pass. 373 // No recode for 1 pass.
375 if (cpi->pass == 0) { 374 if (cpi->pass == 0) {
376 sf->recode_loop = DISALLOW_RECODE; 375 sf->recode_loop = DISALLOW_RECODE;
377 sf->optimize_coefficients = 0; 376 sf->optimize_coefficients = 0;
378 } 377 }
379 378
380 if (sf->subpel_search_method == SUBPEL_TREE) { 379 if (sf->mv.subpel_search_method == SUBPEL_TREE) {
381 cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree; 380 cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree;
382 cpi->find_fractional_mv_step_comp = vp9_find_best_sub_pixel_comp_tree; 381 cpi->find_fractional_mv_step_comp = vp9_find_best_sub_pixel_comp_tree;
383 } 382 }
384 383
385 cpi->mb.optimize = sf->optimize_coefficients == 1 && cpi->pass != 1; 384 cpi->mb.optimize = sf->optimize_coefficients == 1 && cpi->pass != 1;
386 385
387 if (cpi->encode_breakout && oxcf->mode == REALTIME &&
388 sf->encode_breakout_thresh > cpi->encode_breakout)
389 cpi->encode_breakout = sf->encode_breakout_thresh;
390
391 if (sf->disable_split_mask == DISABLE_ALL_SPLIT) 386 if (sf->disable_split_mask == DISABLE_ALL_SPLIT)
392 sf->adaptive_pred_interp_filter = 0; 387 sf->adaptive_pred_interp_filter = 0;
393 388
394 if (!cpi->oxcf.frame_periodic_boost) { 389 if (!cpi->oxcf.frame_periodic_boost) {
395 sf->max_delta_qindex = 0; 390 sf->max_delta_qindex = 0;
396 } 391 }
397 } 392 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_speed_features.h ('k') | source/libvpx/vp9/encoder/vp9_svc_layercontext.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698