2014-03-28 21:30:28 +04:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by a BSD-style license
|
|
|
|
* that can be found in the LICENSE file in the root of the source
|
|
|
|
* tree. An additional intellectual property rights grant can be found
|
|
|
|
* in the file PATENTS. All contributing project authors may
|
|
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <limits.h>
|
|
|
|
|
2014-04-19 05:27:47 +04:00
|
|
|
#include "vp9/encoder/vp9_encoder.h"
|
2014-03-28 21:30:28 +04:00
|
|
|
#include "vp9/encoder/vp9_speed_features.h"
|
|
|
|
|
2014-08-19 03:32:40 +04:00
|
|
|
// Intra only frames, golden frames (except alt ref overlays) and
|
|
|
|
// alt ref frames tend to be coded at a higher than ambient quality
|
|
|
|
static int frame_is_boosted(const VP9_COMP *cpi) {
|
|
|
|
return frame_is_intra_only(&cpi->common) ||
|
|
|
|
cpi->refresh_alt_ref_frame ||
|
|
|
|
(cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref) ||
|
|
|
|
vp9_is_upper_layer_key_frame(cpi);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-04-04 21:52:20 +04:00
|
|
|
static void set_good_speed_feature(VP9_COMP *cpi, VP9_COMMON *cm,
|
|
|
|
SPEED_FEATURES *sf, int speed) {
|
2014-08-19 03:32:40 +04:00
|
|
|
const int boosted = frame_is_boosted(cpi);
|
|
|
|
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->adaptive_rd_thresh = 1;
|
|
|
|
sf->allow_skip_recode = 1;
|
|
|
|
|
|
|
|
if (speed >= 1) {
|
|
|
|
sf->use_square_partition_only = !frame_is_intra_only(cm);
|
|
|
|
sf->less_rectangular_check = 1;
|
|
|
|
|
|
|
|
if (MIN(cm->width, cm->height) >= 720)
|
2014-04-04 21:52:20 +04:00
|
|
|
sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
|
|
|
|
: DISABLE_ALL_INTER_SPLIT;
|
2014-03-28 21:30:28 +04:00
|
|
|
else
|
|
|
|
sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
|
|
|
|
sf->use_rd_breakout = 1;
|
|
|
|
sf->adaptive_motion_search = 1;
|
2014-06-12 23:35:57 +04:00
|
|
|
sf->mv.auto_mv_step_size = 1;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->adaptive_rd_thresh = 2;
|
2014-06-12 23:35:57 +04:00
|
|
|
sf->mv.subpel_iters_per_step = 1;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->mode_skip_start = 10;
|
|
|
|
sf->adaptive_pred_interp_filter = 1;
|
|
|
|
|
|
|
|
sf->recode_loop = ALLOW_RECODE_KFARFGF;
|
|
|
|
sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
|
|
|
|
sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V;
|
|
|
|
sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V;
|
|
|
|
sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
|
Add early termination in transform size search
In the full-rd transform size search, we go through all transform
sizes to choose the one with best rd score. In this patch, an
early termination is added to stop the search once we see that the
smaller size won't give better rd score than the larger size. Also,
the search starts from largest transform size, then goes down to
smallest size.
A speed feature tx_size_search_breakout is added, which is turned off
at speed 0, and on for other speeds. The transform size search is
turned on at speed 1.
Borg test results:
1. At speed 1,
derf set: psnr gain: 0.618%, ssim gain: 0.377%;
stdhd set: psnr gain: 0.594%, ssim gain: 0.162%;
No noticeable speed change.
3. At speed 2,
derf set: psnr loss: 0.157%, ssim loss: 0.175%;
stdhd set: psnr loss: 0.090%, ssim loss: 0.101%;
speed gain: ~4%.
Change-Id: I22535cd2017b5e54f2a62bb6a38231aea4268b3f
2014-08-13 01:36:42 +04:00
|
|
|
|
|
|
|
sf->tx_size_search_breakout = 1;
|
Early termination in encoding partition search
In the partition search, the encoder checks all possible
partitionings in the superblock's partition search tree.
This patch proposed a set of criteria for partition search
early termination, which effectively decided whether or
not to terminate the search in current branch based on the
"skippable" result of the quantized transform coefficients.
The "skippable" information was gathered during the
partition mode search, and no overhead calculations were
introduced.
This patch gives significant encoding speed gains without
sacrificing the quality.
Borg test results:
1. At speed 1,
stdhd set: psnr: +0.074%, ssim: +0.093%;
derf set: psnr: -0.024%, ssim: +0.011%;
2. At speed 2,
stdhd set: psnr: +0.033%, ssim: +0.100%;
derf set: psnr: -0.062%, ssim: +0.003%;
3. At speed 3,
stdhd set: psnr: +0.060%, ssim: +0.190%;
derf set: psnr: -0.064%, ssim: -0.002%;
4. At speed 4,
stdhd set: psnr: +0.070%, ssim: +0.143%;
derf set: psnr: -0.104%, ssim: +0.039%;
The speedup ranges from several percent to 60+%.
speed1 speed2 speed3 speed4
(1080p, 100f):
old_town_cross: 48.2% 23.9% 20.8% 16.5%
park_joy: 11.4% 17.8% 29.4% 18.2%
pedestrian_area: 10.7% 4.0% 4.2% 2.4%
(720p, 200f):
mobcal: 68.1% 36.3% 34.4% 17.7%
parkrun: 15.8% 24.2% 37.1% 16.8%
shields: 45.1% 32.8% 30.1% 9.6%
(cif, 300f)
bus: 3.7% 10.4% 14.0% 7.9%
deadline: 13.6% 14.8% 12.6% 10.9%
mobile: 5.3% 11.5% 14.7% 10.7%
Change-Id: I246c38fb952ad762ce5e365711235b605f470a66
2014-08-15 04:25:21 +04:00
|
|
|
|
|
|
|
if (MIN(cm->width, cm->height) >= 720)
|
|
|
|
sf->partition_search_breakout_dist_thr = (1 << 23);
|
|
|
|
else
|
|
|
|
sf->partition_search_breakout_dist_thr = (1 << 21);
|
|
|
|
sf->partition_search_breakout_rate_thr = 500;
|
2014-03-28 21:30:28 +04:00
|
|
|
}
|
2014-04-04 21:52:20 +04:00
|
|
|
|
2014-03-28 21:30:28 +04:00
|
|
|
if (speed >= 2) {
|
Add early termination in transform size search
In the full-rd transform size search, we go through all transform
sizes to choose the one with best rd score. In this patch, an
early termination is added to stop the search once we see that the
smaller size won't give better rd score than the larger size. Also,
the search starts from largest transform size, then goes down to
smallest size.
A speed feature tx_size_search_breakout is added, which is turned off
at speed 0, and on for other speeds. The transform size search is
turned on at speed 1.
Borg test results:
1. At speed 1,
derf set: psnr gain: 0.618%, ssim gain: 0.377%;
stdhd set: psnr gain: 0.594%, ssim gain: 0.162%;
No noticeable speed change.
3. At speed 2,
derf set: psnr loss: 0.157%, ssim loss: 0.175%;
stdhd set: psnr loss: 0.090%, ssim loss: 0.101%;
speed gain: ~4%.
Change-Id: I22535cd2017b5e54f2a62bb6a38231aea4268b3f
2014-08-13 01:36:42 +04:00
|
|
|
sf->tx_size_search_method = frame_is_boosted(cpi) ? USE_FULL_RD
|
|
|
|
: USE_LARGESTALL;
|
|
|
|
|
2014-05-20 22:36:44 +04:00
|
|
|
if (MIN(cm->width, cm->height) >= 720) {
|
2014-04-04 21:52:20 +04:00
|
|
|
sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
|
|
|
|
: DISABLE_ALL_INTER_SPLIT;
|
2014-07-22 03:22:56 +04:00
|
|
|
sf->adaptive_pred_interp_filter = 0;
|
2014-05-20 22:36:44 +04:00
|
|
|
} else {
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;
|
2014-05-20 22:36:44 +04:00
|
|
|
}
|
2014-06-17 18:31:24 +04:00
|
|
|
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->reference_masking = 1;
|
|
|
|
sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
|
|
|
|
FLAG_SKIP_INTRA_BESTINTER |
|
|
|
|
FLAG_SKIP_COMP_BESTINTRA |
|
|
|
|
FLAG_SKIP_INTRA_LOWVAR;
|
|
|
|
sf->disable_filter_search_var_thresh = 100;
|
|
|
|
sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
|
2014-08-14 07:07:39 +04:00
|
|
|
sf->auto_min_max_partition_size = CONSTRAIN_NEIGHBORING_MIN_MAX;
|
Early termination in encoding partition search
In the partition search, the encoder checks all possible
partitionings in the superblock's partition search tree.
This patch proposed a set of criteria for partition search
early termination, which effectively decided whether or
not to terminate the search in current branch based on the
"skippable" result of the quantized transform coefficients.
The "skippable" information was gathered during the
partition mode search, and no overhead calculations were
introduced.
This patch gives significant encoding speed gains without
sacrificing the quality.
Borg test results:
1. At speed 1,
stdhd set: psnr: +0.074%, ssim: +0.093%;
derf set: psnr: -0.024%, ssim: +0.011%;
2. At speed 2,
stdhd set: psnr: +0.033%, ssim: +0.100%;
derf set: psnr: -0.062%, ssim: +0.003%;
3. At speed 3,
stdhd set: psnr: +0.060%, ssim: +0.190%;
derf set: psnr: -0.064%, ssim: -0.002%;
4. At speed 4,
stdhd set: psnr: +0.070%, ssim: +0.143%;
derf set: psnr: -0.104%, ssim: +0.039%;
The speedup ranges from several percent to 60+%.
speed1 speed2 speed3 speed4
(1080p, 100f):
old_town_cross: 48.2% 23.9% 20.8% 16.5%
park_joy: 11.4% 17.8% 29.4% 18.2%
pedestrian_area: 10.7% 4.0% 4.2% 2.4%
(720p, 200f):
mobcal: 68.1% 36.3% 34.4% 17.7%
parkrun: 15.8% 24.2% 37.1% 16.8%
shields: 45.1% 32.8% 30.1% 9.6%
(cif, 300f)
bus: 3.7% 10.4% 14.0% 7.9%
deadline: 13.6% 14.8% 12.6% 10.9%
mobile: 5.3% 11.5% 14.7% 10.7%
Change-Id: I246c38fb952ad762ce5e365711235b605f470a66
2014-08-15 04:25:21 +04:00
|
|
|
|
|
|
|
if (MIN(cm->width, cm->height) >= 720)
|
|
|
|
sf->partition_search_breakout_dist_thr = (1 << 24);
|
|
|
|
else
|
|
|
|
sf->partition_search_breakout_dist_thr = (1 << 22);
|
|
|
|
sf->partition_search_breakout_rate_thr = 700;
|
2014-03-28 21:30:28 +04:00
|
|
|
}
|
2014-04-04 21:52:20 +04:00
|
|
|
|
2014-03-28 21:30:28 +04:00
|
|
|
if (speed >= 3) {
|
2014-04-21 23:04:59 +04:00
|
|
|
sf->tx_size_search_method = frame_is_intra_only(cm) ? USE_FULL_RD
|
|
|
|
: USE_LARGESTALL;
|
2014-08-14 02:07:16 +04:00
|
|
|
if (MIN(cm->width, cm->height) >= 720) {
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->disable_split_mask = DISABLE_ALL_SPLIT;
|
2014-08-14 02:07:16 +04:00
|
|
|
} else {
|
|
|
|
sf->max_intra_bsize = BLOCK_32X32;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT;
|
2014-08-14 02:07:16 +04:00
|
|
|
}
|
2014-07-22 03:22:56 +04:00
|
|
|
sf->adaptive_pred_interp_filter = 0;
|
2014-08-29 09:58:30 +04:00
|
|
|
sf->adaptive_mode_search = 1;
|
2014-08-19 03:32:40 +04:00
|
|
|
sf->cb_partition_search = !boosted;
|
2014-07-23 03:32:20 +04:00
|
|
|
sf->cb_pred_filter_search = 1;
|
2014-08-18 21:42:23 +04:00
|
|
|
sf->alt_ref_search_fp = 1;
|
2014-08-19 03:32:40 +04:00
|
|
|
sf->motion_field_mode_search = !boosted;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->recode_loop = ALLOW_RECODE_KFMAXBW;
|
|
|
|
sf->adaptive_rd_thresh = 3;
|
|
|
|
sf->mode_skip_start = 6;
|
2014-08-14 04:05:57 +04:00
|
|
|
sf->intra_y_mode_mask[TX_32X32] = INTRA_DC;
|
|
|
|
sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC;
|
2014-08-20 22:17:05 +04:00
|
|
|
sf->adaptive_interp_filter_search = 1;
|
Early termination in encoding partition search
In the partition search, the encoder checks all possible
partitionings in the superblock's partition search tree.
This patch proposed a set of criteria for partition search
early termination, which effectively decided whether or
not to terminate the search in current branch based on the
"skippable" result of the quantized transform coefficients.
The "skippable" information was gathered during the
partition mode search, and no overhead calculations were
introduced.
This patch gives significant encoding speed gains without
sacrificing the quality.
Borg test results:
1. At speed 1,
stdhd set: psnr: +0.074%, ssim: +0.093%;
derf set: psnr: -0.024%, ssim: +0.011%;
2. At speed 2,
stdhd set: psnr: +0.033%, ssim: +0.100%;
derf set: psnr: -0.062%, ssim: +0.003%;
3. At speed 3,
stdhd set: psnr: +0.060%, ssim: +0.190%;
derf set: psnr: -0.064%, ssim: -0.002%;
4. At speed 4,
stdhd set: psnr: +0.070%, ssim: +0.143%;
derf set: psnr: -0.104%, ssim: +0.039%;
The speedup ranges from several percent to 60+%.
speed1 speed2 speed3 speed4
(1080p, 100f):
old_town_cross: 48.2% 23.9% 20.8% 16.5%
park_joy: 11.4% 17.8% 29.4% 18.2%
pedestrian_area: 10.7% 4.0% 4.2% 2.4%
(720p, 200f):
mobcal: 68.1% 36.3% 34.4% 17.7%
parkrun: 15.8% 24.2% 37.1% 16.8%
shields: 45.1% 32.8% 30.1% 9.6%
(cif, 300f)
bus: 3.7% 10.4% 14.0% 7.9%
deadline: 13.6% 14.8% 12.6% 10.9%
mobile: 5.3% 11.5% 14.7% 10.7%
Change-Id: I246c38fb952ad762ce5e365711235b605f470a66
2014-08-15 04:25:21 +04:00
|
|
|
|
|
|
|
if (MIN(cm->width, cm->height) >= 720)
|
|
|
|
sf->partition_search_breakout_dist_thr = (1 << 25);
|
|
|
|
else
|
|
|
|
sf->partition_search_breakout_dist_thr = (1 << 23);
|
|
|
|
sf->partition_search_breakout_rate_thr = 1000;
|
2014-03-28 21:30:28 +04:00
|
|
|
}
|
2014-04-04 21:52:20 +04:00
|
|
|
|
2014-03-28 21:30:28 +04:00
|
|
|
if (speed >= 4) {
|
|
|
|
sf->use_square_partition_only = 1;
|
|
|
|
sf->tx_size_search_method = USE_LARGESTALL;
|
|
|
|
sf->disable_split_mask = DISABLE_ALL_SPLIT;
|
2014-09-10 07:07:11 +04:00
|
|
|
sf->mv.search_method = BIGDIA;
|
|
|
|
sf->mv.subpel_search_method = SUBPEL_TREE_PRUNED;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->adaptive_rd_thresh = 4;
|
2014-09-12 02:54:53 +04:00
|
|
|
sf->mode_search_skip_flags |= FLAG_EARLY_TERMINATE;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->disable_filter_search_var_thresh = 200;
|
|
|
|
sf->use_lp32x32fdct = 1;
|
2014-08-13 21:38:21 +04:00
|
|
|
sf->use_fast_coef_updates = ONE_LOOP_REDUCED;
|
|
|
|
sf->use_fast_coef_costing = 1;
|
Early termination in encoding partition search
In the partition search, the encoder checks all possible
partitionings in the superblock's partition search tree.
This patch proposed a set of criteria for partition search
early termination, which effectively decided whether or
not to terminate the search in current branch based on the
"skippable" result of the quantized transform coefficients.
The "skippable" information was gathered during the
partition mode search, and no overhead calculations were
introduced.
This patch gives significant encoding speed gains without
sacrificing the quality.
Borg test results:
1. At speed 1,
stdhd set: psnr: +0.074%, ssim: +0.093%;
derf set: psnr: -0.024%, ssim: +0.011%;
2. At speed 2,
stdhd set: psnr: +0.033%, ssim: +0.100%;
derf set: psnr: -0.062%, ssim: +0.003%;
3. At speed 3,
stdhd set: psnr: +0.060%, ssim: +0.190%;
derf set: psnr: -0.064%, ssim: -0.002%;
4. At speed 4,
stdhd set: psnr: +0.070%, ssim: +0.143%;
derf set: psnr: -0.104%, ssim: +0.039%;
The speedup ranges from several percent to 60+%.
speed1 speed2 speed3 speed4
(1080p, 100f):
old_town_cross: 48.2% 23.9% 20.8% 16.5%
park_joy: 11.4% 17.8% 29.4% 18.2%
pedestrian_area: 10.7% 4.0% 4.2% 2.4%
(720p, 200f):
mobcal: 68.1% 36.3% 34.4% 17.7%
parkrun: 15.8% 24.2% 37.1% 16.8%
shields: 45.1% 32.8% 30.1% 9.6%
(cif, 300f)
bus: 3.7% 10.4% 14.0% 7.9%
deadline: 13.6% 14.8% 12.6% 10.9%
mobile: 5.3% 11.5% 14.7% 10.7%
Change-Id: I246c38fb952ad762ce5e365711235b605f470a66
2014-08-15 04:25:21 +04:00
|
|
|
|
|
|
|
if (MIN(cm->width, cm->height) >= 720)
|
|
|
|
sf->partition_search_breakout_dist_thr = (1 << 26);
|
|
|
|
else
|
|
|
|
sf->partition_search_breakout_dist_thr = (1 << 24);
|
|
|
|
sf->partition_search_breakout_rate_thr = 1500;
|
2014-03-28 21:30:28 +04:00
|
|
|
}
|
2014-04-04 21:52:20 +04:00
|
|
|
|
2014-03-28 21:30:28 +04:00
|
|
|
if (speed >= 5) {
|
2014-04-04 21:52:20 +04:00
|
|
|
int i;
|
|
|
|
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->partition_search_type = FIXED_PARTITION;
|
|
|
|
sf->optimize_coefficients = 0;
|
2014-06-12 23:35:57 +04:00
|
|
|
sf->mv.search_method = HEX;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->disable_filter_search_var_thresh = 500;
|
2014-04-04 21:52:20 +04:00
|
|
|
for (i = 0; i < TX_SIZES; ++i) {
|
2014-05-29 23:11:02 +04:00
|
|
|
sf->intra_y_mode_mask[i] = INTRA_DC;
|
|
|
|
sf->intra_uv_mode_mask[i] = INTRA_DC;
|
2014-03-28 21:30:28 +04:00
|
|
|
}
|
|
|
|
cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
|
|
|
|
}
|
2014-07-02 00:02:05 +04:00
|
|
|
if (speed >= 6) {
|
|
|
|
sf->mv.reduce_first_step_size = 1;
|
|
|
|
}
|
2014-03-28 21:30:28 +04:00
|
|
|
}
|
|
|
|
|
2014-05-23 02:27:35 +04:00
|
|
|
static void set_rt_speed_feature(VP9_COMP *cpi, SPEED_FEATURES *sf,
|
2014-07-19 02:10:56 +04:00
|
|
|
int speed, vp9e_tune_content content) {
|
2014-05-23 02:27:35 +04:00
|
|
|
VP9_COMMON *const cm = &cpi->common;
|
2014-08-22 04:40:07 +04:00
|
|
|
const int is_keyframe = cm->frame_type == KEY_FRAME;
|
|
|
|
const int frames_since_key = is_keyframe ? 0 : cpi->rc.frames_since_key;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->static_segmentation = 0;
|
|
|
|
sf->adaptive_rd_thresh = 1;
|
|
|
|
sf->use_fast_coef_costing = 1;
|
|
|
|
|
2014-05-29 22:11:50 +04:00
|
|
|
if (speed >= 1) {
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->use_square_partition_only = !frame_is_intra_only(cm);
|
|
|
|
sf->less_rectangular_check = 1;
|
2014-04-04 21:52:20 +04:00
|
|
|
sf->tx_size_search_method = frame_is_intra_only(cm) ? USE_FULL_RD
|
|
|
|
: USE_LARGESTALL;
|
2014-03-28 21:30:28 +04:00
|
|
|
|
|
|
|
if (MIN(cm->width, cm->height) >= 720)
|
2014-04-04 21:52:20 +04:00
|
|
|
sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
|
|
|
|
: DISABLE_ALL_INTER_SPLIT;
|
2014-03-28 21:30:28 +04:00
|
|
|
else
|
|
|
|
sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
|
|
|
|
|
|
|
|
sf->use_rd_breakout = 1;
|
2014-08-14 02:07:16 +04:00
|
|
|
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->adaptive_motion_search = 1;
|
|
|
|
sf->adaptive_pred_interp_filter = 1;
|
2014-06-12 23:35:57 +04:00
|
|
|
sf->mv.auto_mv_step_size = 1;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->adaptive_rd_thresh = 2;
|
|
|
|
sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
|
|
|
|
sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC_H_V;
|
|
|
|
sf->intra_uv_mode_mask[TX_16X16] = INTRA_DC_H_V;
|
|
|
|
}
|
2014-04-04 21:52:20 +04:00
|
|
|
|
2014-03-28 21:30:28 +04:00
|
|
|
if (speed >= 2) {
|
|
|
|
if (MIN(cm->width, cm->height) >= 720)
|
2014-05-29 22:11:50 +04:00
|
|
|
sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
|
|
|
|
: DISABLE_ALL_INTER_SPLIT;
|
2014-03-28 21:30:28 +04:00
|
|
|
else
|
|
|
|
sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;
|
|
|
|
|
2014-04-04 21:52:20 +04:00
|
|
|
sf->mode_search_skip_flags = FLAG_SKIP_INTRA_DIRMISMATCH |
|
|
|
|
FLAG_SKIP_INTRA_BESTINTER |
|
|
|
|
FLAG_SKIP_COMP_BESTINTRA |
|
|
|
|
FLAG_SKIP_INTRA_LOWVAR;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->adaptive_pred_interp_filter = 2;
|
|
|
|
sf->reference_masking = 1;
|
|
|
|
sf->disable_filter_search_var_thresh = 50;
|
|
|
|
sf->comp_inter_joint_search_thresh = BLOCK_SIZES;
|
|
|
|
sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
|
|
|
|
sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_LOW_MOTION;
|
2014-06-17 18:31:24 +04:00
|
|
|
sf->lf_motion_threshold = LOW_MOTION_THRESHOLD;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->adjust_partitioning_from_last_frame = 1;
|
|
|
|
sf->last_partitioning_redo_frequency = 3;
|
|
|
|
sf->use_lp32x32fdct = 1;
|
|
|
|
sf->mode_skip_start = 11;
|
|
|
|
sf->intra_y_mode_mask[TX_16X16] = INTRA_DC_H_V;
|
|
|
|
}
|
2014-04-04 21:52:20 +04:00
|
|
|
|
2014-03-28 21:30:28 +04:00
|
|
|
if (speed >= 3) {
|
|
|
|
sf->use_square_partition_only = 1;
|
|
|
|
sf->disable_filter_search_var_thresh = 100;
|
|
|
|
sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_ALL;
|
2014-04-05 02:10:14 +04:00
|
|
|
sf->constrain_copy_partition = 1;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->use_uv_intra_rd_estimate = 1;
|
|
|
|
sf->skip_encode_sb = 1;
|
2014-06-12 23:35:57 +04:00
|
|
|
sf->mv.subpel_iters_per_step = 1;
|
2014-04-04 21:31:34 +04:00
|
|
|
sf->use_fast_coef_updates = ONE_LOOP_REDUCED;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->adaptive_rd_thresh = 4;
|
|
|
|
sf->mode_skip_start = 6;
|
|
|
|
sf->allow_skip_recode = 0;
|
|
|
|
sf->optimize_coefficients = 0;
|
|
|
|
sf->disable_split_mask = DISABLE_ALL_SPLIT;
|
|
|
|
sf->lpf_pick = LPF_PICK_FROM_Q;
|
|
|
|
}
|
2014-04-04 21:52:20 +04:00
|
|
|
|
2014-03-27 03:15:00 +04:00
|
|
|
if (speed >= 4) {
|
2014-03-28 21:30:28 +04:00
|
|
|
int i;
|
|
|
|
sf->last_partitioning_redo_frequency = 4;
|
|
|
|
sf->adaptive_rd_thresh = 5;
|
|
|
|
sf->use_fast_coef_costing = 0;
|
|
|
|
sf->auto_min_max_partition_size = STRICT_NEIGHBORING_MIN_MAX;
|
|
|
|
sf->adjust_partitioning_from_last_frame =
|
|
|
|
cm->last_frame_type != cm->frame_type || (0 ==
|
2014-05-23 02:27:35 +04:00
|
|
|
(frames_since_key + 1) % sf->last_partitioning_redo_frequency);
|
2014-06-12 23:35:57 +04:00
|
|
|
sf->mv.subpel_force_stop = 1;
|
2014-03-28 21:30:28 +04:00
|
|
|
for (i = 0; i < TX_SIZES; i++) {
|
|
|
|
sf->intra_y_mode_mask[i] = INTRA_DC_H_V;
|
2014-05-29 23:11:02 +04:00
|
|
|
sf->intra_uv_mode_mask[i] = INTRA_DC;
|
2014-03-28 21:30:28 +04:00
|
|
|
}
|
2014-05-29 23:11:02 +04:00
|
|
|
sf->intra_y_mode_mask[TX_32X32] = INTRA_DC;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->frame_parameter_update = 0;
|
2014-06-12 23:35:57 +04:00
|
|
|
sf->mv.search_method = FAST_HEX;
|
2014-05-29 23:25:41 +04:00
|
|
|
sf->inter_mode_mask[BLOCK_32X32] = INTER_NEAREST_NEAR_NEW;
|
|
|
|
sf->inter_mode_mask[BLOCK_32X64] = INTER_NEAREST;
|
|
|
|
sf->inter_mode_mask[BLOCK_64X32] = INTER_NEAREST;
|
|
|
|
sf->inter_mode_mask[BLOCK_64X64] = INTER_NEAREST;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->max_intra_bsize = BLOCK_32X32;
|
|
|
|
sf->allow_skip_recode = 1;
|
|
|
|
}
|
2014-04-04 21:52:20 +04:00
|
|
|
|
2014-03-27 03:15:00 +04:00
|
|
|
if (speed >= 5) {
|
2014-08-22 04:40:07 +04:00
|
|
|
sf->use_quant_fp = !is_keyframe;
|
|
|
|
sf->auto_min_max_partition_size = is_keyframe ? RELAXED_NEIGHBORING_MIN_MAX
|
|
|
|
: STRICT_NEIGHBORING_MIN_MAX;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->max_partition_size = BLOCK_32X32;
|
|
|
|
sf->min_partition_size = BLOCK_8X8;
|
|
|
|
sf->partition_check =
|
2014-05-23 02:27:35 +04:00
|
|
|
(frames_since_key % sf->last_partitioning_redo_frequency == 1);
|
2014-08-22 04:40:07 +04:00
|
|
|
sf->force_frame_boost = is_keyframe ||
|
|
|
|
(frames_since_key % (sf->last_partitioning_redo_frequency << 1) == 1);
|
|
|
|
sf->max_delta_qindex = is_keyframe ? 20 : 15;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->partition_search_type = REFERENCE_PARTITION;
|
|
|
|
sf->use_nonrd_pick_mode = 1;
|
|
|
|
sf->allow_skip_recode = 0;
|
|
|
|
}
|
2014-04-04 21:52:20 +04:00
|
|
|
|
2014-03-27 03:15:00 +04:00
|
|
|
if (speed >= 6) {
|
2014-07-19 02:10:56 +04:00
|
|
|
if (content == VP9E_CONTENT_SCREEN) {
|
|
|
|
int i;
|
|
|
|
// Allow fancy modes at all sizes since SOURCE_VAR_BASED_PARTITION is used
|
|
|
|
for (i = 0; i < BLOCK_SIZES; ++i)
|
|
|
|
sf->inter_mode_mask[i] = INTER_ALL;
|
|
|
|
}
|
|
|
|
|
2014-04-02 04:32:20 +04:00
|
|
|
// Adaptively switch between SOURCE_VAR_BASED_PARTITION and FIXED_PARTITION.
|
|
|
|
sf->partition_search_type = SOURCE_VAR_BASED_PARTITION;
|
|
|
|
sf->search_type_check_frequency = 50;
|
2014-05-30 03:53:23 +04:00
|
|
|
|
2014-08-22 04:40:07 +04:00
|
|
|
sf->tx_size_search_method = is_keyframe ? USE_LARGESTALL : USE_TX_8X8;
|
2014-06-20 21:11:34 +04:00
|
|
|
|
|
|
|
// This feature is only enabled when partition search is disabled.
|
|
|
|
sf->reuse_inter_pred_sby = 1;
|
2014-07-01 23:18:27 +04:00
|
|
|
|
|
|
|
// Increase mode checking threshold for NEWMV.
|
|
|
|
sf->elevate_newmv_thresh = 2000;
|
2014-07-02 00:02:05 +04:00
|
|
|
|
|
|
|
sf->mv.reduce_first_step_size = 1;
|
2014-03-28 21:30:28 +04:00
|
|
|
}
|
2014-08-22 04:40:07 +04:00
|
|
|
|
2014-03-27 03:15:00 +04:00
|
|
|
if (speed >= 7) {
|
2014-07-09 01:52:47 +04:00
|
|
|
sf->mv.search_method = FAST_DIAMOND;
|
2014-07-01 21:52:17 +04:00
|
|
|
sf->mv.fullpel_search_step_param = 10;
|
2014-06-28 02:23:02 +04:00
|
|
|
sf->lpf_pick = LPF_PICK_MINIMAL_LPF;
|
2014-06-28 04:44:32 +04:00
|
|
|
sf->encode_breakout_thresh = (MIN(cm->width, cm->height) >= 720) ?
|
|
|
|
800 : 300;
|
2014-07-01 23:18:27 +04:00
|
|
|
sf->elevate_newmv_thresh = 2500;
|
2014-06-27 21:05:24 +04:00
|
|
|
}
|
2014-08-22 04:40:07 +04:00
|
|
|
|
2014-07-16 02:29:52 +04:00
|
|
|
if (speed >= 12) {
|
|
|
|
sf->elevate_newmv_thresh = 4000;
|
|
|
|
sf->mv.subpel_force_stop = 2;
|
|
|
|
}
|
2014-08-22 04:40:07 +04:00
|
|
|
|
2014-07-16 02:29:52 +04:00
|
|
|
if (speed >= 13) {
|
2014-03-28 21:30:28 +04:00
|
|
|
int i;
|
2014-07-12 00:37:28 +04:00
|
|
|
sf->max_intra_bsize = BLOCK_32X32;
|
2014-03-28 21:30:28 +04:00
|
|
|
for (i = 0; i < BLOCK_SIZES; ++i)
|
2014-05-29 23:25:41 +04:00
|
|
|
sf->inter_mode_mask[i] = INTER_NEAREST;
|
2014-03-28 21:30:28 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void vp9_set_speed_features(VP9_COMP *cpi) {
|
|
|
|
SPEED_FEATURES *const sf = &cpi->sf;
|
|
|
|
VP9_COMMON *const cm = &cpi->common;
|
2014-04-18 22:01:36 +04:00
|
|
|
const VP9EncoderConfig *const oxcf = &cpi->oxcf;
|
2014-03-28 21:30:28 +04:00
|
|
|
int i;
|
|
|
|
|
|
|
|
// best quality defaults
|
|
|
|
sf->frame_parameter_update = 1;
|
2014-06-12 23:35:57 +04:00
|
|
|
sf->mv.search_method = NSTEP;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->recode_loop = ALLOW_RECODE;
|
2014-06-12 23:35:57 +04:00
|
|
|
sf->mv.subpel_search_method = SUBPEL_TREE;
|
|
|
|
sf->mv.subpel_iters_per_step = 2;
|
|
|
|
sf->mv.subpel_force_stop = 0;
|
2014-06-03 23:52:49 +04:00
|
|
|
sf->optimize_coefficients = !is_lossless_requested(&cpi->oxcf);
|
2014-06-12 23:35:57 +04:00
|
|
|
sf->mv.reduce_first_step_size = 0;
|
|
|
|
sf->mv.auto_mv_step_size = 0;
|
2014-07-01 21:52:17 +04:00
|
|
|
sf->mv.fullpel_search_step_param = 6;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->comp_inter_joint_search_thresh = BLOCK_4X4;
|
|
|
|
sf->adaptive_rd_thresh = 0;
|
|
|
|
sf->use_lastframe_partitioning = LAST_FRAME_PARTITION_OFF;
|
|
|
|
sf->tx_size_search_method = USE_FULL_RD;
|
|
|
|
sf->use_lp32x32fdct = 0;
|
|
|
|
sf->adaptive_motion_search = 0;
|
|
|
|
sf->adaptive_pred_interp_filter = 0;
|
2014-08-29 09:58:30 +04:00
|
|
|
sf->adaptive_mode_search = 0;
|
2014-07-23 03:32:20 +04:00
|
|
|
sf->cb_pred_filter_search = 0;
|
2014-07-29 20:50:03 +04:00
|
|
|
sf->cb_partition_search = 0;
|
Enable motion field based mode seach skip
This commit allows the encoder to check the above and left neighbor
blocks' reference frames and motion vectors. If they are all
consistent, skip checking the NEARMV and ZEROMV modes. This is
enabled in speed 3. The coding performance is improved:
pedestrian area 1080p at 2000 kbps,
from 74773 b/f, 41.101 dB, 198064 ms
to 74795 b/f, 41.099 dB, 193078 ms
park joy 1080p at 15000 kbps,
from 290727 b/f, 30.640 dB, 609113 ms
to 290558 b/f, 30.630 dB, 592815 ms
Overall compression performance of speed 3 is changed
derf -0.171%
stdhd -0.168%
Change-Id: I8d47dd543a5f90d7a1c583f74035b926b6704b95
2014-08-12 04:48:14 +04:00
|
|
|
sf->motion_field_mode_search = 0;
|
2014-08-18 21:42:23 +04:00
|
|
|
sf->alt_ref_search_fp = 0;
|
2014-07-02 03:10:44 +04:00
|
|
|
sf->use_quant_fp = 0;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->reference_masking = 0;
|
|
|
|
sf->partition_search_type = SEARCH_PARTITION;
|
|
|
|
sf->less_rectangular_check = 0;
|
|
|
|
sf->use_square_partition_only = 0;
|
|
|
|
sf->auto_min_max_partition_size = NOT_IN_USE;
|
|
|
|
sf->max_partition_size = BLOCK_64X64;
|
|
|
|
sf->min_partition_size = BLOCK_4X4;
|
|
|
|
sf->adjust_partitioning_from_last_frame = 0;
|
|
|
|
sf->last_partitioning_redo_frequency = 4;
|
2014-04-05 02:10:14 +04:00
|
|
|
sf->constrain_copy_partition = 0;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->disable_split_mask = 0;
|
|
|
|
sf->mode_search_skip_flags = 0;
|
2014-04-04 02:49:03 +04:00
|
|
|
sf->force_frame_boost = 0;
|
2014-04-02 02:52:38 +04:00
|
|
|
sf->max_delta_qindex = 0;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->disable_filter_search_var_thresh = 0;
|
2014-08-20 22:17:05 +04:00
|
|
|
sf->adaptive_interp_filter_search = 0;
|
|
|
|
|
2014-03-28 21:30:28 +04:00
|
|
|
for (i = 0; i < TX_SIZES; i++) {
|
2014-05-29 23:11:02 +04:00
|
|
|
sf->intra_y_mode_mask[i] = INTRA_ALL;
|
|
|
|
sf->intra_uv_mode_mask[i] = INTRA_ALL;
|
2014-03-28 21:30:28 +04:00
|
|
|
}
|
|
|
|
sf->use_rd_breakout = 0;
|
|
|
|
sf->skip_encode_sb = 0;
|
|
|
|
sf->use_uv_intra_rd_estimate = 0;
|
|
|
|
sf->allow_skip_recode = 0;
|
|
|
|
sf->lpf_pick = LPF_PICK_FROM_FULL_IMAGE;
|
2014-04-04 21:31:34 +04:00
|
|
|
sf->use_fast_coef_updates = TWO_LOOP;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->use_fast_coef_costing = 0;
|
|
|
|
sf->mode_skip_start = MAX_MODES; // Mode index at which mode skip mask set
|
|
|
|
sf->use_nonrd_pick_mode = 0;
|
|
|
|
for (i = 0; i < BLOCK_SIZES; ++i)
|
2014-05-29 23:25:41 +04:00
|
|
|
sf->inter_mode_mask[i] = INTER_ALL;
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->max_intra_bsize = BLOCK_64X64;
|
2014-06-20 21:11:34 +04:00
|
|
|
sf->reuse_inter_pred_sby = 0;
|
2014-03-28 21:30:28 +04:00
|
|
|
// This setting only takes effect when partition_search_type is set
|
|
|
|
// to FIXED_PARTITION.
|
|
|
|
sf->always_this_block_size = BLOCK_16X16;
|
2014-04-02 04:32:20 +04:00
|
|
|
sf->search_type_check_frequency = 50;
|
2014-06-28 04:44:32 +04:00
|
|
|
sf->encode_breakout_thresh = 0;
|
2014-07-01 23:18:27 +04:00
|
|
|
sf->elevate_newmv_thresh = 0;
|
2014-03-31 19:58:39 +04:00
|
|
|
// Recode loop tolerence %.
|
|
|
|
sf->recode_tolerance = 25;
|
2014-07-17 01:28:51 +04:00
|
|
|
sf->default_interp_filter = SWITCHABLE;
|
Add early termination in transform size search
In the full-rd transform size search, we go through all transform
sizes to choose the one with best rd score. In this patch, an
early termination is added to stop the search once we see that the
smaller size won't give better rd score than the larger size. Also,
the search starts from largest transform size, then goes down to
smallest size.
A speed feature tx_size_search_breakout is added, which is turned off
at speed 0, and on for other speeds. The transform size search is
turned on at speed 1.
Borg test results:
1. At speed 1,
derf set: psnr gain: 0.618%, ssim gain: 0.377%;
stdhd set: psnr gain: 0.594%, ssim gain: 0.162%;
No noticeable speed change.
3. At speed 2,
derf set: psnr loss: 0.157%, ssim loss: 0.175%;
stdhd set: psnr loss: 0.090%, ssim loss: 0.101%;
speed gain: ~4%.
Change-Id: I22535cd2017b5e54f2a62bb6a38231aea4268b3f
2014-08-13 01:36:42 +04:00
|
|
|
sf->tx_size_search_breakout = 0;
|
Early termination in encoding partition search
In the partition search, the encoder checks all possible
partitionings in the superblock's partition search tree.
This patch proposed a set of criteria for partition search
early termination, which effectively decided whether or
not to terminate the search in current branch based on the
"skippable" result of the quantized transform coefficients.
The "skippable" information was gathered during the
partition mode search, and no overhead calculations were
introduced.
This patch gives significant encoding speed gains without
sacrificing the quality.
Borg test results:
1. At speed 1,
stdhd set: psnr: +0.074%, ssim: +0.093%;
derf set: psnr: -0.024%, ssim: +0.011%;
2. At speed 2,
stdhd set: psnr: +0.033%, ssim: +0.100%;
derf set: psnr: -0.062%, ssim: +0.003%;
3. At speed 3,
stdhd set: psnr: +0.060%, ssim: +0.190%;
derf set: psnr: -0.064%, ssim: -0.002%;
4. At speed 4,
stdhd set: psnr: +0.070%, ssim: +0.143%;
derf set: psnr: -0.104%, ssim: +0.039%;
The speedup ranges from several percent to 60+%.
speed1 speed2 speed3 speed4
(1080p, 100f):
old_town_cross: 48.2% 23.9% 20.8% 16.5%
park_joy: 11.4% 17.8% 29.4% 18.2%
pedestrian_area: 10.7% 4.0% 4.2% 2.4%
(720p, 200f):
mobcal: 68.1% 36.3% 34.4% 17.7%
parkrun: 15.8% 24.2% 37.1% 16.8%
shields: 45.1% 32.8% 30.1% 9.6%
(cif, 300f)
bus: 3.7% 10.4% 14.0% 7.9%
deadline: 13.6% 14.8% 12.6% 10.9%
mobile: 5.3% 11.5% 14.7% 10.7%
Change-Id: I246c38fb952ad762ce5e365711235b605f470a66
2014-08-15 04:25:21 +04:00
|
|
|
sf->partition_search_breakout_dist_thr = 0;
|
|
|
|
sf->partition_search_breakout_rate_thr = 0;
|
2014-03-31 19:58:39 +04:00
|
|
|
|
2014-08-21 22:30:52 +04:00
|
|
|
if (oxcf->mode == REALTIME)
|
2014-08-09 03:29:24 +04:00
|
|
|
set_rt_speed_feature(cpi, sf, oxcf->speed, oxcf->content);
|
2014-08-21 22:30:52 +04:00
|
|
|
else if (oxcf->mode == GOOD)
|
|
|
|
set_good_speed_feature(cpi, cm, sf, oxcf->speed);
|
2014-03-28 21:30:28 +04:00
|
|
|
|
2014-08-09 03:29:24 +04:00
|
|
|
cpi->full_search_sad = vp9_full_search_sad;
|
2014-08-21 22:30:52 +04:00
|
|
|
cpi->diamond_search_sad = oxcf->mode == BEST ? vp9_full_range_search
|
|
|
|
: vp9_diamond_search_sad;
|
2014-08-09 03:29:24 +04:00
|
|
|
cpi->refining_search_sad = vp9_refining_search_sad;
|
|
|
|
|
|
|
|
|
2014-03-28 21:30:28 +04:00
|
|
|
// Slow quant, dct and trellis not worthwhile for first pass
|
|
|
|
// so make sure they are always turned off.
|
2014-08-09 01:27:34 +04:00
|
|
|
if (oxcf->pass == 1)
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->optimize_coefficients = 0;
|
|
|
|
|
|
|
|
// No recode for 1 pass.
|
2014-08-09 01:27:34 +04:00
|
|
|
if (oxcf->pass == 0) {
|
2014-03-28 21:30:28 +04:00
|
|
|
sf->recode_loop = DISALLOW_RECODE;
|
|
|
|
sf->optimize_coefficients = 0;
|
|
|
|
}
|
|
|
|
|
2014-06-12 23:35:57 +04:00
|
|
|
if (sf->mv.subpel_search_method == SUBPEL_TREE) {
|
2014-03-28 21:30:28 +04:00
|
|
|
cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree;
|
2014-08-28 01:06:30 +04:00
|
|
|
} else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED) {
|
|
|
|
cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned;
|
2014-03-28 21:30:28 +04:00
|
|
|
}
|
|
|
|
|
2014-08-09 01:27:34 +04:00
|
|
|
cpi->mb.optimize = sf->optimize_coefficients == 1 && oxcf->pass != 1;
|
2014-03-28 21:30:28 +04:00
|
|
|
|
|
|
|
if (sf->disable_split_mask == DISABLE_ALL_SPLIT)
|
|
|
|
sf->adaptive_pred_interp_filter = 0;
|
2014-04-04 02:49:03 +04:00
|
|
|
|
|
|
|
if (!cpi->oxcf.frame_periodic_boost) {
|
|
|
|
sf->max_delta_qindex = 0;
|
|
|
|
}
|
2014-06-28 04:44:32 +04:00
|
|
|
|
|
|
|
if (cpi->encode_breakout && oxcf->mode == REALTIME &&
|
|
|
|
sf->encode_breakout_thresh > cpi->encode_breakout)
|
|
|
|
cpi->encode_breakout = sf->encode_breakout_thresh;
|
2014-03-28 21:30:28 +04:00
|
|
|
}
|