2014-03-28 18:30:28 +01: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 03:27:47 +02:00
|
|
|
#include "vp9/encoder/vp9_encoder.h"
|
2014-03-28 18:30:28 +01:00
|
|
|
#include "vp9/encoder/vp9_speed_features.h"
|
|
|
|
|
2014-08-19 01:32:40 +02: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 19:52:20 +02:00
|
|
|
static void set_good_speed_feature(VP9_COMP *cpi, VP9_COMMON *cm,
|
|
|
|
SPEED_FEATURES *sf, int speed) {
|
2014-08-19 01:32:40 +02:00
|
|
|
const int boosted = frame_is_boosted(cpi);
|
|
|
|
|
2014-03-28 18:30:28 +01: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 19:52:20 +02:00
|
|
|
sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
|
|
|
|
: DISABLE_ALL_INTER_SPLIT;
|
2014-03-28 18:30:28 +01:00
|
|
|
else
|
|
|
|
sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
|
|
|
|
sf->use_rd_breakout = 1;
|
|
|
|
sf->adaptive_motion_search = 1;
|
2014-06-12 21:35:57 +02:00
|
|
|
sf->mv.auto_mv_step_size = 1;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->adaptive_rd_thresh = 2;
|
2014-06-12 21:35:57 +02:00
|
|
|
sf->mv.subpel_iters_per_step = 1;
|
2014-03-28 18:30:28 +01: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-12 23:36:42 +02: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 02:25:21 +02: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);
|
Rework partition search skip scheme
This commit enables the encoder to skip split partition search if
the bigger block size has all non-zero quantized coefficients in low
frequency area and the total rate cost is below a certain threshold.
It logarithmatically scales the rate threshold according to the
current block size. For speed 3, the compression performance loss:
derf -0.093%
stdhd -0.066%
Local experiments show 4% - 20% encoding speed-up for speed 3.
blue_sky_1080p, 1500 kbps
51051 b/f, 35.891 dB, 67236 ms ->
50554 b/f, 35.857 dB, 59270 ms (12% speed-up)
old_town_cross_720p, 1500 kbps
14431 b/f, 36.249 dB, 57687 ms ->
14108 b/f, 36.172 dB, 46586 ms (19% speed-up)
pedestrian_area_1080p, 1500 kbps
50812 b/f, 40.124 dB, 100439 ms ->
50755 b/f, 40.118 dB, 96549 ms (4% speed-up)
mobile_calendar_720p, 1000 kbps
10352 b/f, 35.055 dB, 51837 ms ->
10172 b/f, 35.003 dB, 44076 ms (15% speed-up)
Change-Id: I412e34db49060775b3b89ba1738522317c3239c8
2014-10-03 02:49:00 +02:00
|
|
|
sf->partition_search_breakout_rate_thr = 80;
|
2014-03-28 18:30:28 +01:00
|
|
|
}
|
2014-04-04 19:52:20 +02:00
|
|
|
|
2014-03-28 18:30:28 +01: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-12 23:36:42 +02:00
|
|
|
sf->tx_size_search_method = frame_is_boosted(cpi) ? USE_FULL_RD
|
|
|
|
: USE_LARGESTALL;
|
|
|
|
|
2014-05-20 20:36:44 +02:00
|
|
|
if (MIN(cm->width, cm->height) >= 720) {
|
2014-04-04 19:52:20 +02:00
|
|
|
sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
|
|
|
|
: DISABLE_ALL_INTER_SPLIT;
|
2014-07-22 01:22:56 +02:00
|
|
|
sf->adaptive_pred_interp_filter = 0;
|
Rework partition search skip scheme
This commit enables the encoder to skip split partition search if
the bigger block size has all non-zero quantized coefficients in low
frequency area and the total rate cost is below a certain threshold.
It logarithmatically scales the rate threshold according to the
current block size. For speed 3, the compression performance loss:
derf -0.093%
stdhd -0.066%
Local experiments show 4% - 20% encoding speed-up for speed 3.
blue_sky_1080p, 1500 kbps
51051 b/f, 35.891 dB, 67236 ms ->
50554 b/f, 35.857 dB, 59270 ms (12% speed-up)
old_town_cross_720p, 1500 kbps
14431 b/f, 36.249 dB, 57687 ms ->
14108 b/f, 36.172 dB, 46586 ms (19% speed-up)
pedestrian_area_1080p, 1500 kbps
50812 b/f, 40.124 dB, 100439 ms ->
50755 b/f, 40.118 dB, 96549 ms (4% speed-up)
mobile_calendar_720p, 1000 kbps
10352 b/f, 35.055 dB, 51837 ms ->
10172 b/f, 35.003 dB, 44076 ms (15% speed-up)
Change-Id: I412e34db49060775b3b89ba1738522317c3239c8
2014-10-03 02:49:00 +02:00
|
|
|
sf->partition_search_breakout_dist_thr = (1 << 24);
|
|
|
|
sf->partition_search_breakout_rate_thr = 120;
|
2014-05-20 20:36:44 +02:00
|
|
|
} else {
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;
|
Rework partition search skip scheme
This commit enables the encoder to skip split partition search if
the bigger block size has all non-zero quantized coefficients in low
frequency area and the total rate cost is below a certain threshold.
It logarithmatically scales the rate threshold according to the
current block size. For speed 3, the compression performance loss:
derf -0.093%
stdhd -0.066%
Local experiments show 4% - 20% encoding speed-up for speed 3.
blue_sky_1080p, 1500 kbps
51051 b/f, 35.891 dB, 67236 ms ->
50554 b/f, 35.857 dB, 59270 ms (12% speed-up)
old_town_cross_720p, 1500 kbps
14431 b/f, 36.249 dB, 57687 ms ->
14108 b/f, 36.172 dB, 46586 ms (19% speed-up)
pedestrian_area_1080p, 1500 kbps
50812 b/f, 40.124 dB, 100439 ms ->
50755 b/f, 40.118 dB, 96549 ms (4% speed-up)
mobile_calendar_720p, 1000 kbps
10352 b/f, 35.055 dB, 51837 ms ->
10172 b/f, 35.003 dB, 44076 ms (15% speed-up)
Change-Id: I412e34db49060775b3b89ba1738522317c3239c8
2014-10-03 02:49:00 +02:00
|
|
|
sf->partition_search_breakout_dist_thr = (1 << 22);
|
|
|
|
sf->partition_search_breakout_rate_thr = 100;
|
2014-05-20 20:36:44 +02:00
|
|
|
}
|
2014-06-17 16:31:24 +02:00
|
|
|
|
2014-03-28 18:30:28 +01: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 05:07:39 +02: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 02:25:21 +02:00
|
|
|
|
2014-09-24 21:12:25 +02:00
|
|
|
sf->allow_partition_search_skip = 1;
|
2014-03-28 18:30:28 +01:00
|
|
|
}
|
2014-04-04 19:52:20 +02:00
|
|
|
|
2014-03-28 18:30:28 +01:00
|
|
|
if (speed >= 3) {
|
2014-04-21 21:04:59 +02:00
|
|
|
sf->tx_size_search_method = frame_is_intra_only(cm) ? USE_FULL_RD
|
|
|
|
: USE_LARGESTALL;
|
2014-08-14 00:07:16 +02:00
|
|
|
if (MIN(cm->width, cm->height) >= 720) {
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->disable_split_mask = DISABLE_ALL_SPLIT;
|
Adaptive mode search scheduling
This commit enables an adaptive mode search order scheduling scheme
in the rate-distortion optimization. It changes the compression
performance by -0.433% and -0.420% for derf and stdhd respectively.
It provides speed improvement for speed 3:
bus CIF 1000 kbps
24590 b/f, 35.513 dB, 7864 ms ->
24696 b/f, 35.491 dB, 7408 ms (6% speed-up)
stockholm 720p 1000 kbps
8983 b/f, 35.078 dB, 65698 ms ->
8962 b/f, 35.054 dB, 60298 ms (8%)
old_town_cross 720p 1000 kbps
11804 b/f, 35.666 dB, 62492 ms ->
11778 b/f, 35.609 dB, 56040 ms (10%)
blue_sky 1080p 1500 kbps
57173 b/f, 36.179 dB, 77879 ms ->
57199 b/f, 36.131 dB, 69821 ms (10%)
pedestrian_area 1080p 2000 kbps
74241 b/f, 41.105 dB, 144031 ms ->
74271 b/f, 41.091 dB, 133614 ms (8%)
Change-Id: Iaad28cbc99399030fc5f9951eb5aa7fa633f320e
2014-09-18 22:37:20 +02:00
|
|
|
sf->schedule_mode_search = cm->base_qindex < 220 ? 1 : 0;
|
2014-09-23 21:14:51 +02:00
|
|
|
sf->partition_search_breakout_dist_thr = (1 << 25);
|
Rework partition search skip scheme
This commit enables the encoder to skip split partition search if
the bigger block size has all non-zero quantized coefficients in low
frequency area and the total rate cost is below a certain threshold.
It logarithmatically scales the rate threshold according to the
current block size. For speed 3, the compression performance loss:
derf -0.093%
stdhd -0.066%
Local experiments show 4% - 20% encoding speed-up for speed 3.
blue_sky_1080p, 1500 kbps
51051 b/f, 35.891 dB, 67236 ms ->
50554 b/f, 35.857 dB, 59270 ms (12% speed-up)
old_town_cross_720p, 1500 kbps
14431 b/f, 36.249 dB, 57687 ms ->
14108 b/f, 36.172 dB, 46586 ms (19% speed-up)
pedestrian_area_1080p, 1500 kbps
50812 b/f, 40.124 dB, 100439 ms ->
50755 b/f, 40.118 dB, 96549 ms (4% speed-up)
mobile_calendar_720p, 1000 kbps
10352 b/f, 35.055 dB, 51837 ms ->
10172 b/f, 35.003 dB, 44076 ms (15% speed-up)
Change-Id: I412e34db49060775b3b89ba1738522317c3239c8
2014-10-03 02:49:00 +02:00
|
|
|
sf->partition_search_breakout_rate_thr = 200;
|
2014-08-14 00:07:16 +02:00
|
|
|
} else {
|
|
|
|
sf->max_intra_bsize = BLOCK_32X32;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT;
|
Adaptive mode search scheduling
This commit enables an adaptive mode search order scheduling scheme
in the rate-distortion optimization. It changes the compression
performance by -0.433% and -0.420% for derf and stdhd respectively.
It provides speed improvement for speed 3:
bus CIF 1000 kbps
24590 b/f, 35.513 dB, 7864 ms ->
24696 b/f, 35.491 dB, 7408 ms (6% speed-up)
stockholm 720p 1000 kbps
8983 b/f, 35.078 dB, 65698 ms ->
8962 b/f, 35.054 dB, 60298 ms (8%)
old_town_cross 720p 1000 kbps
11804 b/f, 35.666 dB, 62492 ms ->
11778 b/f, 35.609 dB, 56040 ms (10%)
blue_sky 1080p 1500 kbps
57173 b/f, 36.179 dB, 77879 ms ->
57199 b/f, 36.131 dB, 69821 ms (10%)
pedestrian_area 1080p 2000 kbps
74241 b/f, 41.105 dB, 144031 ms ->
74271 b/f, 41.091 dB, 133614 ms (8%)
Change-Id: Iaad28cbc99399030fc5f9951eb5aa7fa633f320e
2014-09-18 22:37:20 +02:00
|
|
|
sf->schedule_mode_search = cm->base_qindex < 175 ? 1 : 0;
|
2014-09-23 21:14:51 +02:00
|
|
|
sf->partition_search_breakout_dist_thr = (1 << 23);
|
Rework partition search skip scheme
This commit enables the encoder to skip split partition search if
the bigger block size has all non-zero quantized coefficients in low
frequency area and the total rate cost is below a certain threshold.
It logarithmatically scales the rate threshold according to the
current block size. For speed 3, the compression performance loss:
derf -0.093%
stdhd -0.066%
Local experiments show 4% - 20% encoding speed-up for speed 3.
blue_sky_1080p, 1500 kbps
51051 b/f, 35.891 dB, 67236 ms ->
50554 b/f, 35.857 dB, 59270 ms (12% speed-up)
old_town_cross_720p, 1500 kbps
14431 b/f, 36.249 dB, 57687 ms ->
14108 b/f, 36.172 dB, 46586 ms (19% speed-up)
pedestrian_area_1080p, 1500 kbps
50812 b/f, 40.124 dB, 100439 ms ->
50755 b/f, 40.118 dB, 96549 ms (4% speed-up)
mobile_calendar_720p, 1000 kbps
10352 b/f, 35.055 dB, 51837 ms ->
10172 b/f, 35.003 dB, 44076 ms (15% speed-up)
Change-Id: I412e34db49060775b3b89ba1738522317c3239c8
2014-10-03 02:49:00 +02:00
|
|
|
sf->partition_search_breakout_rate_thr = 120;
|
2014-08-14 00:07:16 +02:00
|
|
|
}
|
2014-09-23 20:21:36 +02:00
|
|
|
sf->mv.subpel_search_method = SUBPEL_TREE_PRUNED;
|
2014-07-22 01:22:56 +02:00
|
|
|
sf->adaptive_pred_interp_filter = 0;
|
2014-08-29 07:58:30 +02:00
|
|
|
sf->adaptive_mode_search = 1;
|
2014-08-19 01:32:40 +02:00
|
|
|
sf->cb_partition_search = !boosted;
|
2014-07-23 01:32:20 +02:00
|
|
|
sf->cb_pred_filter_search = 1;
|
2014-08-18 19:42:23 +02:00
|
|
|
sf->alt_ref_search_fp = 1;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->recode_loop = ALLOW_RECODE_KFMAXBW;
|
|
|
|
sf->adaptive_rd_thresh = 3;
|
|
|
|
sf->mode_skip_start = 6;
|
2014-08-14 02:05:57 +02:00
|
|
|
sf->intra_y_mode_mask[TX_32X32] = INTRA_DC;
|
|
|
|
sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC;
|
2014-08-20 20:17:05 +02:00
|
|
|
sf->adaptive_interp_filter_search = 1;
|
2014-03-28 18:30:28 +01:00
|
|
|
}
|
2014-04-04 19:52:20 +02:00
|
|
|
|
2014-03-28 18:30:28 +01: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 05:07:11 +02:00
|
|
|
sf->mv.search_method = BIGDIA;
|
2014-10-07 11:48:08 +02:00
|
|
|
sf->mv.subpel_search_method = SUBPEL_TREE_PRUNED_MORE;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->adaptive_rd_thresh = 4;
|
2014-09-12 00:54:53 +02:00
|
|
|
sf->mode_search_skip_flags |= FLAG_EARLY_TERMINATE;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->disable_filter_search_var_thresh = 200;
|
|
|
|
sf->use_lp32x32fdct = 1;
|
2014-08-13 19:38:21 +02:00
|
|
|
sf->use_fast_coef_updates = ONE_LOOP_REDUCED;
|
|
|
|
sf->use_fast_coef_costing = 1;
|
2014-09-23 21:14:51 +02:00
|
|
|
sf->motion_field_mode_search = !boosted;
|
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 02:25:21 +02: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);
|
Rework partition search skip scheme
This commit enables the encoder to skip split partition search if
the bigger block size has all non-zero quantized coefficients in low
frequency area and the total rate cost is below a certain threshold.
It logarithmatically scales the rate threshold according to the
current block size. For speed 3, the compression performance loss:
derf -0.093%
stdhd -0.066%
Local experiments show 4% - 20% encoding speed-up for speed 3.
blue_sky_1080p, 1500 kbps
51051 b/f, 35.891 dB, 67236 ms ->
50554 b/f, 35.857 dB, 59270 ms (12% speed-up)
old_town_cross_720p, 1500 kbps
14431 b/f, 36.249 dB, 57687 ms ->
14108 b/f, 36.172 dB, 46586 ms (19% speed-up)
pedestrian_area_1080p, 1500 kbps
50812 b/f, 40.124 dB, 100439 ms ->
50755 b/f, 40.118 dB, 96549 ms (4% speed-up)
mobile_calendar_720p, 1000 kbps
10352 b/f, 35.055 dB, 51837 ms ->
10172 b/f, 35.003 dB, 44076 ms (15% speed-up)
Change-Id: I412e34db49060775b3b89ba1738522317c3239c8
2014-10-03 02:49:00 +02:00
|
|
|
sf->partition_search_breakout_rate_thr = 300;
|
2014-03-28 18:30:28 +01:00
|
|
|
}
|
2014-04-04 19:52:20 +02:00
|
|
|
|
2014-03-28 18:30:28 +01:00
|
|
|
if (speed >= 5) {
|
2014-04-04 19:52:20 +02:00
|
|
|
int i;
|
|
|
|
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->partition_search_type = FIXED_PARTITION;
|
|
|
|
sf->optimize_coefficients = 0;
|
2014-06-12 21:35:57 +02:00
|
|
|
sf->mv.search_method = HEX;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->disable_filter_search_var_thresh = 500;
|
2014-04-04 19:52:20 +02:00
|
|
|
for (i = 0; i < TX_SIZES; ++i) {
|
2014-05-29 21:11:02 +02:00
|
|
|
sf->intra_y_mode_mask[i] = INTRA_DC;
|
|
|
|
sf->intra_uv_mode_mask[i] = INTRA_DC;
|
2014-03-28 18:30:28 +01:00
|
|
|
}
|
|
|
|
}
|
2014-07-01 22:02:05 +02:00
|
|
|
if (speed >= 6) {
|
|
|
|
sf->mv.reduce_first_step_size = 1;
|
|
|
|
}
|
2014-03-28 18:30:28 +01:00
|
|
|
}
|
|
|
|
|
2014-05-23 00:27:35 +02:00
|
|
|
static void set_rt_speed_feature(VP9_COMP *cpi, SPEED_FEATURES *sf,
|
2014-07-19 00:10:56 +02:00
|
|
|
int speed, vp9e_tune_content content) {
|
2014-05-23 00:27:35 +02:00
|
|
|
VP9_COMMON *const cm = &cpi->common;
|
2014-08-22 02:40:07 +02: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 18:30:28 +01:00
|
|
|
sf->static_segmentation = 0;
|
|
|
|
sf->adaptive_rd_thresh = 1;
|
|
|
|
sf->use_fast_coef_costing = 1;
|
|
|
|
|
2014-05-29 20:11:50 +02:00
|
|
|
if (speed >= 1) {
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->use_square_partition_only = !frame_is_intra_only(cm);
|
|
|
|
sf->less_rectangular_check = 1;
|
2014-04-04 19:52:20 +02:00
|
|
|
sf->tx_size_search_method = frame_is_intra_only(cm) ? USE_FULL_RD
|
|
|
|
: USE_LARGESTALL;
|
2014-03-28 18:30:28 +01:00
|
|
|
|
|
|
|
if (MIN(cm->width, cm->height) >= 720)
|
2014-04-04 19:52:20 +02:00
|
|
|
sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
|
|
|
|
: DISABLE_ALL_INTER_SPLIT;
|
2014-03-28 18:30:28 +01:00
|
|
|
else
|
|
|
|
sf->disable_split_mask = DISABLE_COMPOUND_SPLIT;
|
|
|
|
|
|
|
|
sf->use_rd_breakout = 1;
|
2014-08-14 00:07:16 +02:00
|
|
|
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->adaptive_motion_search = 1;
|
|
|
|
sf->adaptive_pred_interp_filter = 1;
|
2014-06-12 21:35:57 +02:00
|
|
|
sf->mv.auto_mv_step_size = 1;
|
2014-03-28 18:30:28 +01: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 19:52:20 +02:00
|
|
|
|
2014-03-28 18:30:28 +01:00
|
|
|
if (speed >= 2) {
|
|
|
|
if (MIN(cm->width, cm->height) >= 720)
|
2014-05-29 20:11:50 +02:00
|
|
|
sf->disable_split_mask = cm->show_frame ? DISABLE_ALL_SPLIT
|
|
|
|
: DISABLE_ALL_INTER_SPLIT;
|
2014-03-28 18:30:28 +01:00
|
|
|
else
|
|
|
|
sf->disable_split_mask = LAST_AND_INTRA_SPLIT_ONLY;
|
|
|
|
|
2014-04-04 19:52:20 +02: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 18:30:28 +01: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 16:31:24 +02:00
|
|
|
sf->lf_motion_threshold = LOW_MOTION_THRESHOLD;
|
2014-03-28 18:30:28 +01: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 19:52:20 +02:00
|
|
|
|
2014-03-28 18:30:28 +01: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 00:10:14 +02:00
|
|
|
sf->constrain_copy_partition = 1;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->use_uv_intra_rd_estimate = 1;
|
|
|
|
sf->skip_encode_sb = 1;
|
2014-06-12 21:35:57 +02:00
|
|
|
sf->mv.subpel_iters_per_step = 1;
|
2014-04-04 19:31:34 +02:00
|
|
|
sf->use_fast_coef_updates = ONE_LOOP_REDUCED;
|
2014-03-28 18:30:28 +01: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 19:52:20 +02:00
|
|
|
|
2014-03-27 00:15:00 +01:00
|
|
|
if (speed >= 4) {
|
2014-03-28 18:30:28 +01: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 00:27:35 +02:00
|
|
|
(frames_since_key + 1) % sf->last_partitioning_redo_frequency);
|
2014-06-12 21:35:57 +02:00
|
|
|
sf->mv.subpel_force_stop = 1;
|
2014-03-28 18:30:28 +01:00
|
|
|
for (i = 0; i < TX_SIZES; i++) {
|
|
|
|
sf->intra_y_mode_mask[i] = INTRA_DC_H_V;
|
2014-05-29 21:11:02 +02:00
|
|
|
sf->intra_uv_mode_mask[i] = INTRA_DC;
|
2014-03-28 18:30:28 +01:00
|
|
|
}
|
2014-05-29 21:11:02 +02:00
|
|
|
sf->intra_y_mode_mask[TX_32X32] = INTRA_DC;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->frame_parameter_update = 0;
|
2014-06-12 21:35:57 +02:00
|
|
|
sf->mv.search_method = FAST_HEX;
|
2014-10-08 01:36:14 +02:00
|
|
|
|
2014-05-29 21:25:41 +02: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 18:30:28 +01:00
|
|
|
sf->max_intra_bsize = BLOCK_32X32;
|
|
|
|
sf->allow_skip_recode = 1;
|
|
|
|
}
|
2014-04-04 19:52:20 +02:00
|
|
|
|
2014-03-27 00:15:00 +01:00
|
|
|
if (speed >= 5) {
|
2014-08-22 02:40:07 +02: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 18:30:28 +01:00
|
|
|
sf->max_partition_size = BLOCK_32X32;
|
|
|
|
sf->min_partition_size = BLOCK_8X8;
|
|
|
|
sf->partition_check =
|
2014-05-23 00:27:35 +02:00
|
|
|
(frames_since_key % sf->last_partitioning_redo_frequency == 1);
|
2014-08-22 02:40:07 +02: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 18:30:28 +01:00
|
|
|
sf->partition_search_type = REFERENCE_PARTITION;
|
|
|
|
sf->use_nonrd_pick_mode = 1;
|
|
|
|
sf->allow_skip_recode = 0;
|
2014-10-15 20:37:20 +02:00
|
|
|
sf->inter_mode_mask[BLOCK_32X32] = INTER_NEAREST_NEW_ZERO;
|
|
|
|
sf->inter_mode_mask[BLOCK_32X64] = INTER_NEAREST_NEW_ZERO;
|
|
|
|
sf->inter_mode_mask[BLOCK_64X32] = INTER_NEAREST_NEW_ZERO;
|
|
|
|
sf->inter_mode_mask[BLOCK_64X64] = INTER_NEAREST_NEW_ZERO;
|
2014-10-15 21:18:48 +02: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 = 200;
|
2014-03-28 18:30:28 +01:00
|
|
|
}
|
2014-04-04 19:52:20 +02:00
|
|
|
|
2014-03-27 00:15:00 +01:00
|
|
|
if (speed >= 6) {
|
2014-07-19 00:10:56 +02: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)
|
2014-10-08 01:36:14 +02:00
|
|
|
sf->inter_mode_mask[i] = INTER_NEAREST_NEAR_NEW;
|
2014-07-19 00:10:56 +02:00
|
|
|
}
|
|
|
|
|
2014-04-02 02:32:20 +02:00
|
|
|
// Adaptively switch between SOURCE_VAR_BASED_PARTITION and FIXED_PARTITION.
|
2014-10-08 01:36:14 +02:00
|
|
|
sf->partition_search_type = VAR_BASED_PARTITION;
|
2014-04-02 02:32:20 +02:00
|
|
|
sf->search_type_check_frequency = 50;
|
2014-10-08 01:36:14 +02:00
|
|
|
sf->mv.search_method = NSTEP;
|
2014-05-30 01:53:23 +02:00
|
|
|
|
2014-08-22 02:40:07 +02:00
|
|
|
sf->tx_size_search_method = is_keyframe ? USE_LARGESTALL : USE_TX_8X8;
|
2014-06-20 19:11:34 +02:00
|
|
|
|
|
|
|
// This feature is only enabled when partition search is disabled.
|
|
|
|
sf->reuse_inter_pred_sby = 1;
|
2014-07-01 21:18:27 +02:00
|
|
|
|
|
|
|
// Increase mode checking threshold for NEWMV.
|
2014-10-08 01:36:14 +02:00
|
|
|
sf->elevate_newmv_thresh = 1000;
|
2014-07-01 22:02:05 +02:00
|
|
|
|
|
|
|
sf->mv.reduce_first_step_size = 1;
|
2014-03-28 18:30:28 +01:00
|
|
|
}
|
2014-08-22 02:40:07 +02:00
|
|
|
|
2014-03-27 00:15:00 +01:00
|
|
|
if (speed >= 7) {
|
2014-07-08 23:52:47 +02:00
|
|
|
sf->mv.search_method = FAST_DIAMOND;
|
2014-07-01 19:52:17 +02:00
|
|
|
sf->mv.fullpel_search_step_param = 10;
|
2014-06-28 00:23:02 +02:00
|
|
|
sf->lpf_pick = LPF_PICK_MINIMAL_LPF;
|
2014-06-28 02:44:32 +02:00
|
|
|
sf->encode_breakout_thresh = (MIN(cm->width, cm->height) >= 720) ?
|
|
|
|
800 : 300;
|
2014-07-01 21:18:27 +02:00
|
|
|
sf->elevate_newmv_thresh = 2500;
|
2014-06-27 19:05:24 +02:00
|
|
|
}
|
2014-08-22 02:40:07 +02:00
|
|
|
|
2014-07-16 00:29:52 +02:00
|
|
|
if (speed >= 12) {
|
|
|
|
sf->elevate_newmv_thresh = 4000;
|
|
|
|
sf->mv.subpel_force_stop = 2;
|
|
|
|
}
|
2014-08-22 02:40:07 +02:00
|
|
|
|
2014-07-16 00:29:52 +02:00
|
|
|
if (speed >= 13) {
|
2014-03-28 18:30:28 +01:00
|
|
|
int i;
|
2014-07-11 22:37:28 +02:00
|
|
|
sf->max_intra_bsize = BLOCK_32X32;
|
2014-03-28 18:30:28 +01:00
|
|
|
for (i = 0; i < BLOCK_SIZES; ++i)
|
2014-05-29 21:25:41 +02:00
|
|
|
sf->inter_mode_mask[i] = INTER_NEAREST;
|
2014-03-28 18:30:28 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void vp9_set_speed_features(VP9_COMP *cpi) {
|
|
|
|
SPEED_FEATURES *const sf = &cpi->sf;
|
|
|
|
VP9_COMMON *const cm = &cpi->common;
|
2014-04-18 20:01:36 +02:00
|
|
|
const VP9EncoderConfig *const oxcf = &cpi->oxcf;
|
2014-03-28 18:30:28 +01:00
|
|
|
int i;
|
|
|
|
|
|
|
|
// best quality defaults
|
|
|
|
sf->frame_parameter_update = 1;
|
2014-06-12 21:35:57 +02:00
|
|
|
sf->mv.search_method = NSTEP;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->recode_loop = ALLOW_RECODE;
|
2014-06-12 21:35:57 +02:00
|
|
|
sf->mv.subpel_search_method = SUBPEL_TREE;
|
|
|
|
sf->mv.subpel_iters_per_step = 2;
|
|
|
|
sf->mv.subpel_force_stop = 0;
|
2014-06-03 21:52:49 +02:00
|
|
|
sf->optimize_coefficients = !is_lossless_requested(&cpi->oxcf);
|
2014-06-12 21:35:57 +02:00
|
|
|
sf->mv.reduce_first_step_size = 0;
|
|
|
|
sf->mv.auto_mv_step_size = 0;
|
2014-07-01 19:52:17 +02:00
|
|
|
sf->mv.fullpel_search_step_param = 6;
|
2014-03-28 18:30:28 +01: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 07:58:30 +02:00
|
|
|
sf->adaptive_mode_search = 0;
|
2014-07-23 01:32:20 +02:00
|
|
|
sf->cb_pred_filter_search = 0;
|
2014-07-29 18:50:03 +02: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 02:48:14 +02:00
|
|
|
sf->motion_field_mode_search = 0;
|
2014-08-18 19:42:23 +02:00
|
|
|
sf->alt_ref_search_fp = 0;
|
2014-07-02 01:10:44 +02:00
|
|
|
sf->use_quant_fp = 0;
|
2014-03-28 18:30:28 +01: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 00:10:14 +02:00
|
|
|
sf->constrain_copy_partition = 0;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->disable_split_mask = 0;
|
|
|
|
sf->mode_search_skip_flags = 0;
|
2014-04-04 00:49:03 +02:00
|
|
|
sf->force_frame_boost = 0;
|
2014-04-02 00:52:38 +02:00
|
|
|
sf->max_delta_qindex = 0;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->disable_filter_search_var_thresh = 0;
|
2014-08-20 20:17:05 +02:00
|
|
|
sf->adaptive_interp_filter_search = 0;
|
2014-09-24 21:12:25 +02:00
|
|
|
sf->allow_partition_search_skip = 0;
|
2014-08-20 20:17:05 +02:00
|
|
|
|
2014-03-28 18:30:28 +01:00
|
|
|
for (i = 0; i < TX_SIZES; i++) {
|
2014-05-29 21:11:02 +02:00
|
|
|
sf->intra_y_mode_mask[i] = INTRA_ALL;
|
|
|
|
sf->intra_uv_mode_mask[i] = INTRA_ALL;
|
2014-03-28 18:30:28 +01: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 19:31:34 +02:00
|
|
|
sf->use_fast_coef_updates = TWO_LOOP;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->use_fast_coef_costing = 0;
|
|
|
|
sf->mode_skip_start = MAX_MODES; // Mode index at which mode skip mask set
|
Adaptive mode search scheduling
This commit enables an adaptive mode search order scheduling scheme
in the rate-distortion optimization. It changes the compression
performance by -0.433% and -0.420% for derf and stdhd respectively.
It provides speed improvement for speed 3:
bus CIF 1000 kbps
24590 b/f, 35.513 dB, 7864 ms ->
24696 b/f, 35.491 dB, 7408 ms (6% speed-up)
stockholm 720p 1000 kbps
8983 b/f, 35.078 dB, 65698 ms ->
8962 b/f, 35.054 dB, 60298 ms (8%)
old_town_cross 720p 1000 kbps
11804 b/f, 35.666 dB, 62492 ms ->
11778 b/f, 35.609 dB, 56040 ms (10%)
blue_sky 1080p 1500 kbps
57173 b/f, 36.179 dB, 77879 ms ->
57199 b/f, 36.131 dB, 69821 ms (10%)
pedestrian_area 1080p 2000 kbps
74241 b/f, 41.105 dB, 144031 ms ->
74271 b/f, 41.091 dB, 133614 ms (8%)
Change-Id: Iaad28cbc99399030fc5f9951eb5aa7fa633f320e
2014-09-18 22:37:20 +02:00
|
|
|
sf->schedule_mode_search = 0;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->use_nonrd_pick_mode = 0;
|
|
|
|
for (i = 0; i < BLOCK_SIZES; ++i)
|
2014-05-29 21:25:41 +02:00
|
|
|
sf->inter_mode_mask[i] = INTER_ALL;
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->max_intra_bsize = BLOCK_64X64;
|
2014-06-20 19:11:34 +02:00
|
|
|
sf->reuse_inter_pred_sby = 0;
|
2014-03-28 18:30:28 +01: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 02:32:20 +02:00
|
|
|
sf->search_type_check_frequency = 50;
|
2014-06-28 02:44:32 +02:00
|
|
|
sf->encode_breakout_thresh = 0;
|
2014-07-01 21:18:27 +02:00
|
|
|
sf->elevate_newmv_thresh = 0;
|
2014-03-31 17:58:39 +02:00
|
|
|
// Recode loop tolerence %.
|
|
|
|
sf->recode_tolerance = 25;
|
2014-07-16 23:28:51 +02: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-12 23:36:42 +02: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 02:25:21 +02:00
|
|
|
sf->partition_search_breakout_dist_thr = 0;
|
|
|
|
sf->partition_search_breakout_rate_thr = 0;
|
2014-03-31 17:58:39 +02:00
|
|
|
|
2014-08-21 20:30:52 +02:00
|
|
|
if (oxcf->mode == REALTIME)
|
2014-08-09 01:29:24 +02:00
|
|
|
set_rt_speed_feature(cpi, sf, oxcf->speed, oxcf->content);
|
2014-08-21 20:30:52 +02:00
|
|
|
else if (oxcf->mode == GOOD)
|
|
|
|
set_good_speed_feature(cpi, cm, sf, oxcf->speed);
|
2014-03-28 18:30:28 +01:00
|
|
|
|
2014-08-09 01:29:24 +02:00
|
|
|
cpi->full_search_sad = vp9_full_search_sad;
|
2014-08-21 20:30:52 +02:00
|
|
|
cpi->diamond_search_sad = oxcf->mode == BEST ? vp9_full_range_search
|
|
|
|
: vp9_diamond_search_sad;
|
2014-08-09 01:29:24 +02:00
|
|
|
cpi->refining_search_sad = vp9_refining_search_sad;
|
|
|
|
|
|
|
|
|
2014-03-28 18:30:28 +01:00
|
|
|
// Slow quant, dct and trellis not worthwhile for first pass
|
|
|
|
// so make sure they are always turned off.
|
2014-08-08 23:27:34 +02:00
|
|
|
if (oxcf->pass == 1)
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->optimize_coefficients = 0;
|
|
|
|
|
|
|
|
// No recode for 1 pass.
|
2014-08-08 23:27:34 +02:00
|
|
|
if (oxcf->pass == 0) {
|
2014-03-28 18:30:28 +01:00
|
|
|
sf->recode_loop = DISALLOW_RECODE;
|
|
|
|
sf->optimize_coefficients = 0;
|
|
|
|
}
|
|
|
|
|
2014-06-12 21:35:57 +02:00
|
|
|
if (sf->mv.subpel_search_method == SUBPEL_TREE) {
|
2014-03-28 18:30:28 +01:00
|
|
|
cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree;
|
2014-08-27 23:06:30 +02:00
|
|
|
} else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED) {
|
|
|
|
cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned;
|
2014-09-24 22:25:34 +02:00
|
|
|
} else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED_MORE) {
|
|
|
|
cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned_more;
|
2014-10-07 11:48:08 +02:00
|
|
|
} else if (sf->mv.subpel_search_method == SUBPEL_TREE_PRUNED_EVENMORE) {
|
|
|
|
cpi->find_fractional_mv_step = vp9_find_best_sub_pixel_tree_pruned_evenmore;
|
2014-03-28 18:30:28 +01:00
|
|
|
}
|
|
|
|
|
2014-08-08 23:27:34 +02:00
|
|
|
cpi->mb.optimize = sf->optimize_coefficients == 1 && oxcf->pass != 1;
|
2014-03-28 18:30:28 +01:00
|
|
|
|
|
|
|
if (sf->disable_split_mask == DISABLE_ALL_SPLIT)
|
|
|
|
sf->adaptive_pred_interp_filter = 0;
|
2014-04-04 00:49:03 +02:00
|
|
|
|
|
|
|
if (!cpi->oxcf.frame_periodic_boost) {
|
|
|
|
sf->max_delta_qindex = 0;
|
|
|
|
}
|
2014-06-28 02:44:32 +02: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 18:30:28 +01:00
|
|
|
}
|