16ac915abcdb404a00d927fe6308a47fcf09d9519hkuang/*
26ac915abcdb404a00d927fe6308a47fcf09d9519hkuang *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
36ac915abcdb404a00d927fe6308a47fcf09d9519hkuang *
46ac915abcdb404a00d927fe6308a47fcf09d9519hkuang *  Use of this source code is governed by a BSD-style license
56ac915abcdb404a00d927fe6308a47fcf09d9519hkuang *  that can be found in the LICENSE file in the root of the source
66ac915abcdb404a00d927fe6308a47fcf09d9519hkuang *  tree. An additional intellectual property rights grant can be found
76ac915abcdb404a00d927fe6308a47fcf09d9519hkuang *  in the file PATENTS.  All contributing project authors may
86ac915abcdb404a00d927fe6308a47fcf09d9519hkuang *  be found in the AUTHORS file in the root of the source tree.
96ac915abcdb404a00d927fe6308a47fcf09d9519hkuang */
106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
116ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include <limits.h>
126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
136ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_onyx_int.h"
146ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#include "vp9/encoder/vp9_speed_features.h"
156ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
166ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#define ALL_INTRA_MODES ((1 << DC_PRED) | \
176ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                         (1 << V_PRED) | (1 << H_PRED) | \
186ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                         (1 << D45_PRED) | (1 << D135_PRED) | \
196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                         (1 << D117_PRED) | (1 << D153_PRED) | \
206ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                         (1 << D207_PRED) | (1 << D63_PRED) | \
216ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                         (1 << TM_PRED))
226ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#define INTRA_DC_ONLY   (1 << DC_PRED)
236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#define INTRA_DC_TM     ((1 << TM_PRED) | (1 << DC_PRED))
246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#define INTRA_DC_H_V    ((1 << DC_PRED) | (1 << V_PRED) | (1 << H_PRED))
256ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#define INTRA_DC_TM_H_V (INTRA_DC_TM | (1 << V_PRED) | (1 << H_PRED))
266ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang// Masks for partially or completely disabling split mode
286ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#define DISABLE_ALL_INTER_SPLIT   ((1 << THR_COMP_GA) | \
296ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                   (1 << THR_COMP_LA) | \
306ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                   (1 << THR_ALTR) | \
316ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                   (1 << THR_GOLD) | \
326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                   (1 << THR_LAST))
336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#define DISABLE_ALL_SPLIT         ((1 << THR_INTRA) | DISABLE_ALL_INTER_SPLIT)
356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#define DISABLE_COMPOUND_SPLIT    ((1 << THR_COMP_GA) | (1 << THR_COMP_LA))
376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang#define LAST_AND_INTRA_SPLIT_ONLY ((1 << THR_COMP_GA) | \
396ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                   (1 << THR_COMP_LA) | \
406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                   (1 << THR_ALTR) | \
416ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                   (1 << THR_GOLD))
426ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
436ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic void set_good_speed_feature(VP9_COMP *cpi, VP9_COMMON *cm,
446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                   SPEED_FEATURES *sf, int speed) {
456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->adaptive_rd_thresh = 1;
466ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->recode_loop = (speed < 1) ? ALLOW_RECODE : ALLOW_RECODE_KFMAXBW;
476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->allow_skip_recode = 1;
486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (speed >= 1) {
506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_square_partition_only = !frame_is_intra_only(cm);
516ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->less_rectangular_check  = 1;
526ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->tx_size_search_method = vp9_frame_is_boosted(cpi) ? USE_FULL_RD
536ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                                          : USE_LARGESTALL;
546ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
556ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    if (MIN(cm->width, cm->height) >= 720)
566ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
576ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                              : DISABLE_ALL_INTER_SPLIT;
586ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    else
596ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
606ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_rd_breakout = 1;
616ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_motion_search = 1;
626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->auto_mv_step_size = 1;
636ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_rd_thresh = 2;
646ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->subpel_iters_per_step = 1;
656ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->mode_skip_start = 10;
666ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_pred_interp_filter = 1;
676ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
686ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->recode_loop = ALLOW_RECODE_KFARFGF;
696ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
706ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V;
716ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V;
726ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
736ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
746ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
756ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (speed >= 2) {
766ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->tx_size_search_method = vp9_frame_is_boosted(cpi) ? USE_FULL_RD
776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                                          : USE_LARGESTALL;
786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    if (MIN(cm->width, cm->height) >= 720)
806ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
816ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                              : DISABLE_ALL_INTER_SPLIT;
826ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    else
836ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;
846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_pred_interp_filter = 2;
866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->reference_masking = 1;
876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                 FLAG_SKIP_INTRA_BESTINTER |
896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                 FLAG_SKIP_COMP_BESTINTRA |
906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                 FLAG_SKIP_INTRA_LOWVAR;
916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->disable_filter_search_var_thresh = 100;
926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
946ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_LOW_MOTION;
956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adjust_partitioning_from_last_frame = 1;
966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->last_partitioning_redo_frequency = 3;
976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (speed >= 3) {
1006ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    if (MIN(cm->width, cm->height) >= 720)
1016ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->disable_split_mask = DISABLE_ALL_SPLIT;
1026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    else
1036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT;
1046ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1056ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->recode_loop = ALLOW_RECODE_KFMAXBW;
1066ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_rd_thresh = 3;
1076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->mode_skip_start = 6;
1086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_fast_coef_updates = ONE_LOOP_REDUCED;
1096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_fast_coef_costing = 1;
1106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
1116ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (speed >= 4) {
1136ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_square_partition_only = 1;
1146ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->tx_size_search_method = USE_LARGESTALL;
1156ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->disable_split_mask = DISABLE_ALL_SPLIT;
1166ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_rd_thresh = 4;
1176ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->mode_search_skip_flags |= FLAG_SKIP_COMP_REFMISMATCH |
1186ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                  FLAG_EARLY_TERMINATE;
1196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->disable_filter_search_var_thresh = 200;
1206ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL;
1216ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_lp32x32fdct = 1;
1226ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
1236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (speed >= 5) {
1256ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    int i;
1266ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->partition_search_type = FIXED_PARTITION;
1286ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->optimize_coefficients = 0;
1296ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->search_method = HEX;
1306ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->disable_filter_search_var_thresh = 500;
1316ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    for (i = 0; i < TX_SIZES; ++i) {
1326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->intra_y_mode_mask[i] = INTRA_DC_ONLY;
1336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->intra_uv_mode_mask[i] = INTRA_DC_ONLY;
1346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    }
1356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
1366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
1376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang}
1386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1396ac915abcdb404a00d927fe6308a47fcf09d9519hkuangstatic void set_rt_speed_feature(VP9_COMMON *cm, SPEED_FEATURES *sf,
1406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                 int speed) {
1416ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->static_segmentation = 0;
1426ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->adaptive_rd_thresh = 1;
1436ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->encode_breakout_thresh = 1;
1446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->use_fast_coef_costing = 1;
1456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1466ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (speed == 1) {
1476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_square_partition_only = !frame_is_intra_only(cm);
1486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->less_rectangular_check = 1;
1496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->tx_size_search_method = frame_is_intra_only(cm) ? USE_FULL_RD
1506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                                        : USE_LARGESTALL;
1516ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1526ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    if (MIN(cm->width, cm->height) >= 720)
1536ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
1546ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                              : DISABLE_ALL_INTER_SPLIT;
1556ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    else
1566ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
1576ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1586ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_rd_breakout = 1;
1596ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_motion_search = 1;
1606ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_pred_interp_filter = 1;
1616ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->auto_mv_step_size = 1;
1626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_rd_thresh = 2;
1636ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
1646ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V;
1656ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
1666ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->encode_breakout_thresh = 8;
1676ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
1686ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1696ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (speed >= 2) {
1706ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_square_partition_only = !frame_is_intra_only(cm);
1716ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->less_rectangular_check = 1;
1726ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->tx_size_search_method = frame_is_intra_only(cm) ? USE_FULL_RD
1736ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                                        : USE_LARGESTALL;
1746ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    if (MIN(cm->width, cm->height) >= 720)
1756ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->disable_split_mask = cm->show_frame ?
1766ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        DISABLE_ALL_SPLIT : DISABLE_ALL_INTER_SPLIT;
1776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    else
1786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;
1796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1806ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
1816ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                 FLAG_SKIP_INTRA_BESTINTER |
1826ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                 FLAG_SKIP_COMP_BESTINTRA |
1836ac915abcdb404a00d927fe6308a47fcf09d9519hkuang                                 FLAG_SKIP_INTRA_LOWVAR;
1846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_rd_breakout = 1;
1856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_motion_search = 1;
1866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_pred_interp_filter = 2;
1876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->auto_mv_step_size = 1;
1886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->reference_masking = 1;
1896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->disable_filter_search_var_thresh = 50;
1916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
1926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
1946ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_LOW_MOTION;
1956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adjust_partitioning_from_last_frame = 1;
1966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->last_partitioning_redo_frequency = 3;
1976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
1986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_rd_thresh = 2;
1996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_lp32x32fdct = 1;
2006ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->mode_skip_start = 11;
2016ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
2026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V;
2036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V;
2046ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
2056ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->encode_breakout_thresh = 200;
2066ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
2076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
2086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (speed >= 3) {
2096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_square_partition_only = 1;
2106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->disable_filter_search_var_thresh = 100;
2116ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL;
2126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->constrain_copy_partition = 1;
2136ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_uv_intra_rd_estimate = 1;
2146ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->skip_encode_sb = 1;
2156ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->subpel_iters_per_step = 1;
2166ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_fast_coef_updates = ONE_LOOP_REDUCED;
2176ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_rd_thresh = 4;
2186ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->mode_skip_start = 6;
2196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->allow_skip_recode = 0;
2206ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->optimize_coefficients = 0;
2216ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->disable_split_mask = DISABLE_ALL_SPLIT;
2226ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->lpf_pick = LPF_PICK_FROM_Q;
2236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->encode_breakout_thresh = 700;
2246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
2256ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
2266ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (speed >= 4) {
2276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    int i;
2286ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->last_partitioning_redo_frequency = 4;
2296ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_rd_thresh = 5;
2306ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_fast_coef_costing = 0;
2316ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->auto_min_max_partition_size = STRICT_NEIGHBORING_MIN_MAX;
2326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adjust_partitioning_from_last_frame =
2336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        cm->last_frame_type != cm->frame_type || (0 ==
2346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        (cm->current_video_frame + 1) % sf->last_partitioning_redo_frequency);
2356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->subpel_force_stop = 1;
2366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    for (i = 0; i < TX_SIZES; i++) {
2376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->intra_y_mode_mask[i] = INTRA_DC_H_V;
2386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->intra_uv_mode_mask[i] = INTRA_DC_ONLY;
2396ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    }
2406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_ONLY;
2416ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->frame_parameter_update = 0;
2426ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->encode_breakout_thresh = 1000;
2436ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->search_method = FAST_HEX;
2446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->disable_inter_mode_mask[BLOCK_32X32] = 1 << INTER_OFFSET(ZEROMV);
2456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->disable_inter_mode_mask[BLOCK_32X64] = ~(1 << INTER_OFFSET(NEARESTMV));
2466ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->disable_inter_mode_mask[BLOCK_64X32] = ~(1 << INTER_OFFSET(NEARESTMV));
2476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->disable_inter_mode_mask[BLOCK_64X64] = ~(1 << INTER_OFFSET(NEARESTMV));
2486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->max_intra_bsize = BLOCK_32X32;
2496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->allow_skip_recode = 1;
2506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
2516ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
2526ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (speed >= 5) {
2536ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->max_partition_size = BLOCK_32X32;
2546ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->min_partition_size = BLOCK_8X8;
2556ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->partition_check =
2566ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        (cm->current_video_frame % sf->last_partitioning_redo_frequency == 1);
2576ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->force_frame_boost = cm->frame_type == KEY_FRAME ||
2586ac915abcdb404a00d927fe6308a47fcf09d9519hkuang        (cm->current_video_frame %
2596ac915abcdb404a00d927fe6308a47fcf09d9519hkuang            (sf->last_partitioning_redo_frequency << 1) == 1);
2606ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->max_delta_qindex = (cm->frame_type == KEY_FRAME) ? 20 : 15;
2616ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->partition_search_type = REFERENCE_PARTITION;
2626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_nonrd_pick_mode = 1;
2636ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->search_method = FAST_DIAMOND;
2646ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->allow_skip_recode = 0;
2656ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
2666ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
2676ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (speed >= 6) {
2686ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    // Adaptively switch between SOURCE_VAR_BASED_PARTITION and FIXED_PARTITION.
2696ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->partition_search_type = SOURCE_VAR_BASED_PARTITION;
2706ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->search_type_check_frequency = 50;
2716ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->source_var_thresh = 360;
2726ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
2736ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->use_nonrd_pick_mode = 1;
2746ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->search_method = FAST_DIAMOND;
2756ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
2766ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
2776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (speed >= 7) {
2786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    int i;
2796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    for (i = 0; i < BLOCK_SIZES; ++i)
2806ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->disable_inter_mode_mask[i] = ~(1 << INTER_OFFSET(NEARESTMV));
2816ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
2826ac915abcdb404a00d927fe6308a47fcf09d9519hkuang}
2836ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
2846ac915abcdb404a00d927fe6308a47fcf09d9519hkuangvoid vp9_set_speed_features(VP9_COMP *cpi) {
2856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  SPEED_FEATURES *const sf = &cpi->sf;
2866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  VP9_COMMON *const cm = &cpi->common;
2876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  const VP9_CONFIG *const oxcf = &cpi->oxcf;
2886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  const int speed = cpi->speed < 0 ? -cpi->speed : cpi->speed;
2896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  int i;
2906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
2916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // best quality defaults
2926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->frame_parameter_update = 1;
2936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->search_method = NSTEP;
2946ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->recode_loop = ALLOW_RECODE;
2956ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->subpel_search_method = SUBPEL_TREE;
2966ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->subpel_iters_per_step = 2;
2976ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->subpel_force_stop = 0;
2986ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->optimize_coefficients = !oxcf->lossless;
2996ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->reduce_first_step_size = 0;
3006ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->auto_mv_step_size = 0;
3016ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
3026ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->comp_inter_joint_search_thresh = BLOCK_4X4;
3036ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->adaptive_rd_thresh = 0;
3046ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_OFF;
3056ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->tx_size_search_method = USE_FULL_RD;
3066ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->use_lp32x32fdct = 0;
3076ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->adaptive_motion_search = 0;
3086ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->adaptive_pred_interp_filter = 0;
3096ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->reference_masking = 0;
3106ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->partition_search_type = SEARCH_PARTITION;
3116ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->less_rectangular_check = 0;
3126ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->use_square_partition_only = 0;
3136ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->auto_min_max_partition_size = NOT_IN_USE;
3146ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->max_partition_size = BLOCK_64X64;
3156ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->min_partition_size = BLOCK_4X4;
3166ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->adjust_partitioning_from_last_frame = 0;
3176ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->last_partitioning_redo_frequency = 4;
3186ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->constrain_copy_partition = 0;
3196ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->disable_split_mask = 0;
3206ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->mode_search_skip_flags = 0;
3216ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->force_frame_boost = 0;
3226ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->max_delta_qindex = 0;
3236ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->disable_split_var_thresh = 0;
3246ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->disable_filter_search_var_thresh = 0;
3256ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  for (i = 0; i < TX_SIZES; i++) {
3266ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_y_mode_mask[i] = ALL_INTRA_MODES;
3276ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->intra_uv_mode_mask[i] = ALL_INTRA_MODES;
3286ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
3296ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->use_rd_breakout = 0;
3306ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->skip_encode_sb = 0;
3316ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->use_uv_intra_rd_estimate = 0;
3326ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->allow_skip_recode = 0;
3336ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->lpf_pick = LPF_PICK_FROM_FULL_IMAGE;
3346ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->use_fast_coef_updates = TWO_LOOP;
3356ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->use_fast_coef_costing = 0;
3366ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->mode_skip_start = MAX_MODES;  // Mode index at which mode skip mask set
3376ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->use_nonrd_pick_mode = 0;
3386ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->encode_breakout_thresh = 0;
3396ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  for (i = 0; i < BLOCK_SIZES; ++i)
3406ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->disable_inter_mode_mask[i] = 0;
3416ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->max_intra_bsize = BLOCK_64X64;
3426ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // This setting only takes effect when partition_search_type is set
3436ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // to FIXED_PARTITION.
3446ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->always_this_block_size = BLOCK_16X16;
3456ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->search_type_check_frequency = 50;
3466ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->source_var_thresh = 100;
3476ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
3486ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // Recode loop tolerence %.
3496ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  sf->recode_tolerance = 25;
3506ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
3516ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  switch (oxcf->mode) {
3526ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    case MODE_BESTQUALITY:
3536ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    case MODE_SECONDPASS_BEST:  // This is the best quality mode.
3546ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      cpi->diamond_search_sad = vp9_full_range_search;
3556ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      break;
3566ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    case MODE_FIRSTPASS:
3576ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    case MODE_GOODQUALITY:
3586ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    case MODE_SECONDPASS:
3596ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      set_good_speed_feature(cpi, cm, sf, speed);
3606ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      break;
3616ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    case MODE_REALTIME:
3626ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      set_rt_speed_feature(cm, sf, speed);
3636ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      break;
3646ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
3656ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
3666ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // Slow quant, dct and trellis not worthwhile for first pass
3676ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // so make sure they are always turned off.
3686ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (cpi->pass == 1)
3696ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->optimize_coefficients = 0;
3706ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
3716ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  // No recode for 1 pass.
3726ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (cpi->pass == 0) {
3736ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->recode_loop = DISALLOW_RECODE;
3746ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->optimize_coefficients = 0;
3756ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
3766ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
3776ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (sf->subpel_search_method == SUBPEL_TREE) {
3786ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree;
3796ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->find_fractional_mv_step_comp = vp9_find_best_sub_pixel_comp_tree;
3806ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
3816ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
3826ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  cpi->mb.optimize = sf->optimize_coefficients == 1 && cpi->pass != 1;
3836ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
3846ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (cpi->encode_breakout && oxcf->mode == MODE_REALTIME &&
3856ac915abcdb404a00d927fe6308a47fcf09d9519hkuang      sf->encode_breakout_thresh > cpi->encode_breakout)
3866ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    cpi->encode_breakout = sf->encode_breakout_thresh;
3876ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
3886ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (sf->disable_split_mask == DISABLE_ALL_SPLIT)
3896ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->adaptive_pred_interp_filter = 0;
3906ac915abcdb404a00d927fe6308a47fcf09d9519hkuang
3916ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  if (!cpi->oxcf.frame_periodic_boost) {
3926ac915abcdb404a00d927fe6308a47fcf09d9519hkuang    sf->max_delta_qindex = 0;
3936ac915abcdb404a00d927fe6308a47fcf09d9519hkuang  }
3946ac915abcdb404a00d927fe6308a47fcf09d9519hkuang}
395