Commit 538b1c6d authored by Yaowu Xu's avatar Yaowu Xu Committed by Gerrit Code Review

Only allow interp_filter change in SWITCHABLE mode

This commit added a logic to prevent the inter_filter type from being
changed if the default interp_filter mode is not switchable. Also, it
sets the default interp_filter to BILINEAR at very and super fast rtc
encoding modes

Change-Id: Ic41e6d31de29795a4ce536ec79afb01cab6daad3
parent 6a4e2dda
......@@ -2411,15 +2411,15 @@ static void reset_skip_txfm_size(VP9_COMMON *cm, TX_SIZE txfm_max) {
}
}
static int get_frame_type(VP9_COMP *cpi) {
static MV_REFERENCE_FRAME get_frame_type(VP9_COMP *cpi) {
if (frame_is_intra_only(&cpi->common))
return 0;
return INTRA_FRAME;
else if (cpi->rc.is_src_frame_alt_ref && cpi->refresh_golden_frame)
return 3;
return ALTREF_FRAME;
else if (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)
return 1;
return LAST_FRAME;
else
return 2;
return GOLDEN_FRAME;
}
static void select_tx_mode(VP9_COMP *cpi) {
......@@ -2734,7 +2734,6 @@ void vp9_encode_frame(VP9_COMP *cpi) {
if (cpi->sf.RD) {
int i;
REFERENCE_MODE reference_mode;
INTERP_FILTER interp_filter;
/*
* This code does a single RD pass over the whole frame assuming
* either compound, single or hybrid prediction as per whatever has
......@@ -2744,7 +2743,7 @@ void vp9_encode_frame(VP9_COMP *cpi) {
* that for subsequent frames.
* It does the same analysis for transform size selection also.
*/
const int frame_type = get_frame_type(cpi);
const MV_REFERENCE_FRAME frame_type = get_frame_type(cpi);
const int64_t *mode_thresh = cpi->rd_prediction_type_threshes[frame_type];
const int64_t *filter_thresh = cpi->rd_filter_threshes[frame_type];
......@@ -2762,22 +2761,18 @@ void vp9_encode_frame(VP9_COMP *cpi) {
else
reference_mode = REFERENCE_MODE_SELECT;
/* filter type selection */
// FIXME(rbultje) for some odd reason, we often select smooth_filter
// as default filter for ARF overlay frames. This is a REALLY BAD
// IDEA so we explicitly disable it here.
if (frame_type != 3 &&
filter_thresh[EIGHTTAP_SMOOTH] > filter_thresh[EIGHTTAP] &&
filter_thresh[EIGHTTAP_SMOOTH] > filter_thresh[EIGHTTAP_SHARP] &&
filter_thresh[EIGHTTAP_SMOOTH] > filter_thresh[SWITCHABLE - 1]) {
interp_filter = EIGHTTAP_SMOOTH;
} else if (filter_thresh[EIGHTTAP_SHARP] > filter_thresh[EIGHTTAP] &&
filter_thresh[EIGHTTAP_SHARP] > filter_thresh[SWITCHABLE - 1]) {
interp_filter = EIGHTTAP_SHARP;
} else if (filter_thresh[EIGHTTAP] > filter_thresh[SWITCHABLE - 1]) {
interp_filter = EIGHTTAP;
} else {
interp_filter = SWITCHABLE;
if (cm->interp_filter == SWITCHABLE) {
if (frame_type != ALTREF_FRAME &&
filter_thresh[EIGHTTAP_SMOOTH] > filter_thresh[EIGHTTAP] &&
filter_thresh[EIGHTTAP_SMOOTH] > filter_thresh[EIGHTTAP_SHARP] &&
filter_thresh[EIGHTTAP_SMOOTH] > filter_thresh[SWITCHABLE - 1]) {
cm->interp_filter = EIGHTTAP_SMOOTH;
} else if (filter_thresh[EIGHTTAP_SHARP] > filter_thresh[EIGHTTAP] &&
filter_thresh[EIGHTTAP_SHARP] > filter_thresh[SWITCHABLE - 1]) {
cm->interp_filter = EIGHTTAP_SHARP;
} else if (filter_thresh[EIGHTTAP] > filter_thresh[SWITCHABLE - 1]) {
cm->interp_filter = EIGHTTAP;
}
}
cpi->mb.e_mbd.lossless = cpi->oxcf.lossless;
......@@ -2785,7 +2780,6 @@ void vp9_encode_frame(VP9_COMP *cpi) {
/* transform size selection (4x4, 8x8, 16x16 or select-per-mb) */
select_tx_mode(cpi);
cm->reference_mode = reference_mode;
cm->interp_filter = interp_filter;
if (cpi->sf.super_fast_rtc)
encode_rtc_frame_internal(cpi);
......@@ -2868,6 +2862,8 @@ void vp9_encode_frame(VP9_COMP *cpi) {
}
}
} else {
// Force the usage of the BILINEAR interp_filter.
cm->interp_filter = BILINEAR;
if (cpi->sf.super_fast_rtc)
encode_rtc_frame_internal(cpi);
else
......
......@@ -850,6 +850,7 @@ static void set_rt_speed_feature(VP9_COMMON *cm,
sf->intra_uv_mode_mask[i] = INTRA_DC_ONLY;
}
sf->use_fast_lpf_pick = 2;
sf->RD = 0;
}
if (speed >= 6) {
sf->super_fast_rtc = 1;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment