rtc: Refactor usage of svc_ref_frame_config/comp
Rename all internal parameters for setting the reference
structure to rtc_ref (instead of svc), since this may be
used for 1 layer/non-svc.
For now keep the two enocder controls, SET_SVC_REF_FRAME_CONFIG
and SET_SVC_REF_FRAME_COMP_PRED, as is to avoid breakage.
Future CL will rename the api from SET_SVC_ to SET_RTC_.
Change-Id: Icddb55be98ddb29b31ca3aa82ae00be3149af65c
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index b82489c..85ab9f3 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -3404,13 +3404,13 @@
AV1_COMP *const cpi = ctx->ppi->cpi;
aom_svc_ref_frame_config_t *const data =
va_arg(args, aom_svc_ref_frame_config_t *);
- cpi->svc.set_ref_frame_config = 1;
+ cpi->rtc_ref.set_ref_frame_config = 1;
for (unsigned int i = 0; i < INTER_REFS_PER_FRAME; ++i) {
- cpi->svc.reference[i] = data->reference[i];
- cpi->svc.ref_idx[i] = data->ref_idx[i];
+ cpi->rtc_ref.reference[i] = data->reference[i];
+ cpi->rtc_ref.ref_idx[i] = data->ref_idx[i];
}
for (unsigned int i = 0; i < REF_FRAMES; ++i)
- cpi->svc.refresh[i] = data->refresh[i];
+ cpi->rtc_ref.refresh[i] = data->refresh[i];
cpi->svc.use_flexible_mode = 1;
cpi->svc.ksvc_fixed_mode = 0;
return AOM_CODEC_OK;
@@ -3421,9 +3421,9 @@
AV1_COMP *const cpi = ctx->ppi->cpi;
aom_svc_ref_frame_comp_pred_t *const data =
va_arg(args, aom_svc_ref_frame_comp_pred_t *);
- cpi->svc.ref_frame_comp[0] = data->use_comp_pred[0];
- cpi->svc.ref_frame_comp[1] = data->use_comp_pred[1];
- cpi->svc.ref_frame_comp[2] = data->use_comp_pred[2];
+ cpi->rtc_ref.ref_frame_comp[0] = data->use_comp_pred[0];
+ cpi->rtc_ref.ref_frame_comp[1] = data->use_comp_pred[1];
+ cpi->rtc_ref.ref_frame_comp[2] = data->use_comp_pred[2];
return AOM_CODEC_OK;
}
diff --git a/av1/encoder/av1_temporal_denoiser.c b/av1/encoder/av1_temporal_denoiser.c
index 9a182c2..6194925 100644
--- a/av1/encoder/av1_temporal_denoiser.c
+++ b/av1/encoder/av1_temporal_denoiser.c
@@ -348,7 +348,7 @@
decision = perform_motion_compensation(
&cpi->common, denoiser, mb, bs, increase_denoising, mi_row, mi_col, ctx,
motion_magnitude, &zeromv_filter, cpi->svc.number_spatial_layers,
- cpi->source->y_width, cpi->svc.ref_idx[0], cpi->svc.ref_idx[3],
+ cpi->source->y_width, cpi->rtc_ref.ref_idx[0], cpi->rtc_ref.ref_idx[3],
cpi->ppi->use_svc, cpi->svc.spatial_layer_id, use_gf_temporal_ref);
if (decision == FILTER_BLOCK) {
@@ -395,10 +395,11 @@
}
void av1_denoiser_update_frame_info(
- AV1_DENOISER *denoiser, YV12_BUFFER_CONFIG src, struct SVC *svc,
- FRAME_TYPE frame_type, int refresh_alt_ref_frame, int refresh_golden_frame,
- int refresh_last_frame, int alt_fb_idx, int gld_fb_idx, int lst_fb_idx,
- int resized, int svc_refresh_denoiser_buffers, int second_spatial_layer) {
+ AV1_DENOISER *denoiser, YV12_BUFFER_CONFIG src, struct RTC_REF *rtc_ref,
+ struct SVC *svc, FRAME_TYPE frame_type, int refresh_alt_ref_frame,
+ int refresh_golden_frame, int refresh_last_frame, int alt_fb_idx,
+ int gld_fb_idx, int lst_fb_idx, int resized,
+ int svc_refresh_denoiser_buffers, int second_spatial_layer) {
const int shift = second_spatial_layer ? denoiser->num_ref_frames : 0;
// Copy source into denoised reference buffers on KEY_FRAME or
// if the just encoded frame was resized. For SVC, copy source if the base
@@ -415,10 +416,10 @@
return;
}
- if (svc->set_ref_frame_config) {
+ if (rtc_ref->set_ref_frame_config) {
int i;
for (i = 0; i < REF_FRAMES; i++) {
- if (svc->refresh[svc->spatial_layer_id] & (1 << i))
+ if (rtc_ref->refresh[svc->spatial_layer_id] & (1 << i))
copy_frame(&denoiser->running_avg_y[i + 1 + shift],
&denoiser->running_avg_y[INTRA_FRAME + shift]);
}
@@ -497,15 +498,16 @@
}
int av1_denoiser_realloc_svc(AV1_COMMON *cm, AV1_DENOISER *denoiser,
- struct SVC *svc, int svc_buf_shift,
- int refresh_alt, int refresh_gld, int refresh_lst,
- int alt_fb_idx, int gld_fb_idx, int lst_fb_idx) {
+ struct RTC_REF *rtc_ref, struct SVC *svc,
+ int svc_buf_shift, int refresh_alt,
+ int refresh_gld, int refresh_lst, int alt_fb_idx,
+ int gld_fb_idx, int lst_fb_idx) {
int fail = 0;
- if (svc->set_ref_frame_config) {
+ if (rtc_ref->set_ref_frame_config) {
int i;
for (i = 0; i < REF_FRAMES; i++) {
if (cm->current_frame.frame_type == KEY_FRAME ||
- svc->refresh[svc->spatial_layer_id] & (1 << i)) {
+ rtc_ref->refresh[svc->spatial_layer_id] & (1 << i)) {
fail = av1_denoiser_realloc_svc_helper(cm, denoiser,
i + 1 + svc_buf_shift);
}
@@ -710,6 +712,7 @@
void av1_denoiser_update_ref_frame(AV1_COMP *const cpi) {
AV1_COMMON *const cm = &cpi->common;
+ RTC_REF *const rtc_ref = &cpi->rtc_ref;
SVC *const svc = &cpi->svc;
if (cpi->oxcf.noise_sensitivity > 0 && denoise_svc(cpi) &&
@@ -739,7 +742,8 @@
svc->number_spatial_layers - svc->spatial_layer_id == 2 ? 1 : 0;
// Check if we need to allocate extra buffers in the denoiser
// for refreshed frames.
- if (av1_denoiser_realloc_svc(cm, &cpi->denoiser, svc, svc_buf_shift,
+ if (av1_denoiser_realloc_svc(cm, &cpi->denoiser, rtc_ref,
+ svc, svc_buf_shift,
cpi->refresh_alt_ref_frame,
cpi->refresh_golden_frame,
cpi->refresh_last_frame, cpi->alt_fb_idx,
@@ -749,10 +753,10 @@
#endif
}
av1_denoiser_update_frame_info(
- &cpi->denoiser, *cpi->source, svc, frame_type,
+ &cpi->denoiser, *cpi->source, rtc_ref, svc, frame_type,
cpi->refresh_frame.alt_ref_frame, cpi->refresh_frame.golden_frame, 1,
- svc->ref_idx[6], svc->ref_idx[3], svc->ref_idx[0], resize_pending,
- svc_refresh_denoiser_buffers, denoise_svc_second_layer);
+ rtc_ref->ref_idx[6], rtc_ref->ref_idx[3], rtc_ref->ref_idx[0],
+ resize_pending, svc_refresh_denoiser_buffers, denoise_svc_second_layer);
}
}
diff --git a/av1/encoder/av1_temporal_denoiser.h b/av1/encoder/av1_temporal_denoiser.h
index 71c8c1c..14dcccc 100644
--- a/av1/encoder/av1_temporal_denoiser.h
+++ b/av1/encoder/av1_temporal_denoiser.h
@@ -69,12 +69,14 @@
struct AV1_COMP;
struct SVC;
+struct RTC_REF;
void av1_denoiser_update_frame_info(
- AV1_DENOISER *denoiser, YV12_BUFFER_CONFIG src, struct SVC *svc,
- FRAME_TYPE frame_type, int refresh_alt_ref_frame, int refresh_golden_frame,
- int refresh_last_frame, int alt_fb_idx, int gld_fb_idx, int lst_fb_idx,
- int resized, int svc_refresh_denoiser_buffers, int second_spatial_layer);
+ AV1_DENOISER *denoiser, YV12_BUFFER_CONFIG src, struct RTC_REF *rtc_ref,
+ struct SVC *svc, FRAME_TYPE frame_type, int refresh_alt_ref_frame,
+ int refresh_golden_frame, int refresh_last_frame, int alt_fb_idx,
+ int gld_fb_idx, int lst_fb_idx, int resized,
+ int svc_refresh_denoiser_buffers, int second_spatial_layer);
void av1_denoiser_denoise(struct AV1_COMP *cpi, MACROBLOCK *mb, int mi_row,
int mi_col, BLOCK_SIZE bs, PICK_MODE_CONTEXT *ctx,
@@ -88,9 +90,10 @@
PICK_MODE_CONTEXT *ctx);
int av1_denoiser_realloc_svc(AV1_COMMON *cm, AV1_DENOISER *denoiser,
- struct SVC *svc, int svc_buf_shift,
- int refresh_alt, int refresh_gld, int refresh_lst,
- int alt_fb_idx, int gld_fb_idx, int lst_fb_idx);
+ struct RTC_REF *rtc, struct SVC *svc,
+ int svc_buf_shift, int refresh_alt,
+ int refresh_gld, int refresh_lst, int alt_fb_idx,
+ int gld_fb_idx, int lst_fb_idx);
int av1_denoiser_alloc(AV1_COMMON *cm, struct SVC *svc, AV1_DENOISER *denoiser,
int use_svc, int noise_sen, int width, int height,
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index b70b602..a90661a 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -616,8 +616,8 @@
// flags to 0 to keep things consistent.
if (frame_params->show_existing_frame) return 0;
- const SVC *const svc = &cpi->svc;
- if (is_frame_droppable(svc, ext_refresh_frame_flags)) return 0;
+ const RTC_REF *const rtc_ref = &cpi->rtc_ref;
+ if (is_frame_droppable(rtc_ref, ext_refresh_frame_flags)) return 0;
#if !CONFIG_REALTIME_ONLY
if (cpi->use_ducky_encode &&
@@ -630,11 +630,12 @@
int refresh_mask = 0;
if (ext_refresh_frame_flags->update_pending) {
- if (svc->set_ref_frame_config ||
+ if (rtc_ref->set_ref_frame_config ||
use_rtc_reference_structure_one_layer(cpi)) {
for (unsigned int i = 0; i < INTER_REFS_PER_FRAME; i++) {
- int ref_frame_map_idx = svc->ref_idx[i];
- refresh_mask |= svc->refresh[ref_frame_map_idx] << ref_frame_map_idx;
+ int ref_frame_map_idx = rtc_ref->ref_idx[i];
+ refresh_mask |= rtc_ref->refresh[ref_frame_map_idx]
+ << ref_frame_map_idx;
}
return refresh_mask;
}
@@ -1516,10 +1517,10 @@
if (!ext_flags->refresh_frame.update_pending) {
av1_get_ref_frames(ref_frame_map_pairs, cur_frame_disp, cpi,
cpi->gf_frame_index, 1, cm->remapped_ref_idx);
- } else if (cpi->svc.set_ref_frame_config ||
+ } else if (cpi->rtc_ref.set_ref_frame_config ||
use_rtc_reference_structure_one_layer(cpi)) {
for (unsigned int i = 0; i < INTER_REFS_PER_FRAME; i++)
- cm->remapped_ref_idx[i] = cpi->svc.ref_idx[i];
+ cm->remapped_ref_idx[i] = cpi->rtc_ref.ref_idx[i];
}
}
@@ -1654,7 +1655,8 @@
// Leave a signal for a higher level caller about if this frame is droppable
if (*size > 0) {
- cpi->droppable = is_frame_droppable(&cpi->svc, &ext_flags->refresh_frame);
+ cpi->droppable =
+ is_frame_droppable(&cpi->rtc_ref, &ext_flags->refresh_frame);
}
return AOM_CODEC_OK;
diff --git a/av1/encoder/encode_strategy.h b/av1/encoder/encode_strategy.h
index 45f774d..c1d14d1 100644
--- a/av1/encoder/encode_strategy.h
+++ b/av1/encoder/encode_strategy.h
@@ -95,12 +95,12 @@
const COMPRESSOR_STAGE compressor_stage);
static AOM_INLINE int is_frame_droppable(
- const SVC *const svc,
+ const RTC_REF *const rtc_ref,
const ExtRefreshFrameFlagsInfo *const ext_refresh_frame_flags) {
// Droppable frame is only used by external refresh flags. VoD setting won't
// trigger its use case.
- if (svc->set_ref_frame_config)
- return svc->non_reference_frame;
+ if (rtc_ref->set_ref_frame_config)
+ return rtc_ref->non_reference_frame;
else if (ext_refresh_frame_flags->update_pending)
return !(ext_refresh_frame_flags->alt_ref_frame ||
ext_refresh_frame_flags->alt2_ref_frame ||
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index fd97821..82e7452 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -596,13 +596,17 @@
// Single thread case: use counts in common.
cpi->td.counts = &cpi->counts;
- // Set init SVC parameters.
- cpi->svc.set_ref_frame_config = 0;
- cpi->svc.non_reference_frame = 0;
+ // Init SVC parameters.
cpi->svc.number_spatial_layers = 1;
cpi->svc.number_temporal_layers = 1;
cm->spatial_layer_id = 0;
cm->temporal_layer_id = 0;
+ // Init rtc_ref parameters.
+ cpi->rtc_ref.set_ref_frame_config = 0;
+ cpi->rtc_ref.non_reference_frame = 0;
+ cpi->rtc_ref.ref_frame_comp[0] = 0;
+ cpi->rtc_ref.ref_frame_comp[1] = 0;
+ cpi->rtc_ref.ref_frame_comp[2] = 0;
// change includes all joint functionality
av1_change_config(cpi, oxcf, false);
@@ -852,7 +856,7 @@
set_tile_info(cm, &cpi->oxcf.tile_cfg);
- if (!cpi->svc.set_ref_frame_config)
+ if (!cpi->rtc_ref.set_ref_frame_config)
cpi->ext_flags.refresh_frame.update_pending = 0;
cpi->ext_flags.refresh_frame_context_pending = 0;
@@ -2185,10 +2189,10 @@
av1_cdef_search(&cpi->mt_info, &cm->cur_frame->buf, cpi->source, cm, xd,
cpi->sf.lpf_sf.cdef_pick_method, cpi->td.mb.rdmult,
cpi->sf.rt_sf.skip_cdef_sb, cpi->oxcf.tool_cfg.cdef_control,
- use_screen_content_model, cpi->svc.non_reference_frame);
+ use_screen_content_model, cpi->rtc_ref.non_reference_frame);
// Apply the filter
- if (!cpi->svc.non_reference_frame) {
+ if (!cpi->rtc_ref.non_reference_frame) {
if (num_workers > 1) {
av1_cdef_frame_mt(cm, xd, cpi->mt_info.cdef_worker,
cpi->mt_info.workers, &cpi->mt_info.cdef_sync,
@@ -2284,7 +2288,7 @@
}
if ((lf->filter_level[0] || lf->filter_level[1]) &&
- !cpi->svc.non_reference_frame) {
+ !cpi->rtc_ref.non_reference_frame) {
av1_loop_filter_frame_mt(&cm->cur_frame->buf, cm, xd, 0, num_planes, 0,
mt_info->workers, num_workers,
&mt_info->lf_row_sync, lpf_opt_level);
@@ -3640,7 +3644,7 @@
break;
case 1: // Enable CDF update for all frames.
if (cpi->sf.rt_sf.disable_cdf_update_non_reference_frame &&
- cpi->svc.non_reference_frame && cpi->rc.frames_since_key > 2)
+ cpi->rtc_ref.non_reference_frame && cpi->rc.frames_since_key > 2)
features->disable_cdf_update = 1;
else
features->disable_cdf_update = 0;
@@ -4253,7 +4257,7 @@
// We should fix the cpi->common.show_frame flag
// instead of checking the other condition to update the counter properly.
if (cpi->common.show_frame ||
- is_frame_droppable(&cpi->svc, &cpi->ext_flags.refresh_frame)) {
+ is_frame_droppable(&cpi->rtc_ref, &cpi->ext_flags.refresh_frame)) {
// Decrement count down till next gf
if (cpi->rc.frames_till_gf_update_due > 0)
cpi->rc.frames_till_gf_update_due--;
@@ -5019,29 +5023,33 @@
return AOM_CODEC_OK;
}
-static void svc_set_updates_ref_frame_config(
- ExtRefreshFrameFlagsInfo *const ext_refresh_frame_flags, SVC *const svc) {
+static void rtc_set_updates_ref_frame_config(
+ ExtRefreshFrameFlagsInfo *const ext_refresh_frame_flags,
+ RTC_REF *const rtc_ref) {
ext_refresh_frame_flags->update_pending = 1;
- ext_refresh_frame_flags->last_frame = svc->refresh[svc->ref_idx[0]];
- ext_refresh_frame_flags->golden_frame = svc->refresh[svc->ref_idx[3]];
- ext_refresh_frame_flags->bwd_ref_frame = svc->refresh[svc->ref_idx[4]];
- ext_refresh_frame_flags->alt2_ref_frame = svc->refresh[svc->ref_idx[5]];
- ext_refresh_frame_flags->alt_ref_frame = svc->refresh[svc->ref_idx[6]];
- svc->non_reference_frame = 1;
+ ext_refresh_frame_flags->last_frame = rtc_ref->refresh[rtc_ref->ref_idx[0]];
+ ext_refresh_frame_flags->golden_frame = rtc_ref->refresh[rtc_ref->ref_idx[3]];
+ ext_refresh_frame_flags->bwd_ref_frame =
+ rtc_ref->refresh[rtc_ref->ref_idx[4]];
+ ext_refresh_frame_flags->alt2_ref_frame =
+ rtc_ref->refresh[rtc_ref->ref_idx[5]];
+ ext_refresh_frame_flags->alt_ref_frame =
+ rtc_ref->refresh[rtc_ref->ref_idx[6]];
+ rtc_ref->non_reference_frame = 1;
for (int i = 0; i < REF_FRAMES; i++) {
- if (svc->refresh[i] == 1) {
- svc->non_reference_frame = 0;
+ if (rtc_ref->refresh[i] == 1) {
+ rtc_ref->non_reference_frame = 0;
break;
}
}
}
-static int svc_set_references_external_ref_frame_config(AV1_COMP *cpi) {
+static int rtc_set_references_external_ref_frame_config(AV1_COMP *cpi) {
// LAST_FRAME (0), LAST2_FRAME(1), LAST3_FRAME(2), GOLDEN_FRAME(3),
// BWDREF_FRAME(4), ALTREF2_FRAME(5), ALTREF_FRAME(6).
int ref = AOM_REFFRAME_ALL;
for (int i = 0; i < INTER_REFS_PER_FRAME; i++) {
- if (!cpi->svc.reference[i]) ref ^= (1 << i);
+ if (!cpi->rtc_ref.reference[i]) ref ^= (1 << i);
}
return ref;
}
@@ -5080,8 +5088,8 @@
av1_use_as_reference(&ext_flags->ref_frame_flags, ref);
} else {
- if (cpi->svc.set_ref_frame_config) {
- int ref = svc_set_references_external_ref_frame_config(cpi);
+ if (cpi->rtc_ref.set_ref_frame_config) {
+ int ref = rtc_set_references_external_ref_frame_config(cpi);
av1_use_as_reference(&ext_flags->ref_frame_flags, ref);
}
}
@@ -5108,8 +5116,8 @@
ext_refresh_frame_flags->alt2_ref_frame = (upd & AOM_ALT2_FLAG) != 0;
ext_refresh_frame_flags->update_pending = 1;
} else {
- if (cpi->svc.set_ref_frame_config)
- svc_set_updates_ref_frame_config(ext_refresh_frame_flags, &cpi->svc);
+ if (cpi->rtc_ref.set_ref_frame_config)
+ rtc_set_updates_ref_frame_config(ext_refresh_frame_flags, &cpi->rtc_ref);
else
ext_refresh_frame_flags->update_pending = 0;
}
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 23825bf..a5a83f4 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -2351,6 +2351,22 @@
/*!\endcond */
#endif
+/*!\cond */
+typedef struct RTC_REF {
+ /*!
+ * LAST_FRAME (0), LAST2_FRAME(1), LAST3_FRAME(2), GOLDEN_FRAME(3),
+ * BWDREF_FRAME(4), ALTREF2_FRAME(5), ALTREF_FRAME(6).
+ */
+ int reference[INTER_REFS_PER_FRAME];
+ int ref_idx[INTER_REFS_PER_FRAME];
+ int refresh[REF_FRAMES];
+ int set_ref_frame_config;
+ int non_reference_frame;
+ int ref_frame_comp[3];
+ int gld_idx_1layer;
+} RTC_REF;
+/*!\endcond */
+
/*!
* \brief Structure to hold data corresponding to an encoded frame.
*/
@@ -3390,6 +3406,11 @@
* Frames since last frame with cdf update.
*/
int frames_since_last_update;
+
+ /*!
+ * Struct for the reference structure for RTC.
+ */
+ RTC_REF rtc_ref;
} AV1_COMP;
/*!
@@ -3823,10 +3844,11 @@
cpi->oxcf.gf_cfg.lag_in_frames == 0;
}
+// Use default/internal reference structure for single-layer RTC.
static INLINE int use_rtc_reference_structure_one_layer(const AV1_COMP *cpi) {
return is_one_pass_rt_params(cpi) && cpi->ppi->number_spatial_layers == 1 &&
cpi->ppi->number_temporal_layers == 1 &&
- !cpi->svc.set_ref_frame_config;
+ !cpi->rtc_ref.set_ref_frame_config;
}
// Function return size of frame stats buffer
diff --git a/av1/encoder/picklpf.c b/av1/encoder/picklpf.c
index 3d3020a..47d007e 100644
--- a/av1/encoder/picklpf.c
+++ b/av1/encoder/picklpf.c
@@ -212,7 +212,7 @@
if (disable_filter_rt_screen ||
cpi->oxcf.algo_cfg.loopfilter_control == LOOPFILTER_NONE ||
(cpi->oxcf.algo_cfg.loopfilter_control == LOOPFILTER_REFERENCE &&
- cpi->svc.non_reference_frame)) {
+ cpi->rtc_ref.non_reference_frame)) {
lf->filter_level[0] = 0;
lf->filter_level[1] = 0;
return;
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c
index d1618c0..7f66b8e 100644
--- a/av1/encoder/ratectrl.c
+++ b/av1/encoder/ratectrl.c
@@ -2536,7 +2536,7 @@
void av1_adjust_gf_refresh_qp_one_pass_rt(AV1_COMP *cpi) {
AV1_COMMON *const cm = &cpi->common;
RATE_CONTROL *const rc = &cpi->rc;
- SVC *const svc = &cpi->svc;
+ RTC_REF *const rtc_ref = &cpi->rtc_ref;
const int resize_pending = is_frame_resize_pending(cpi);
if (!resize_pending && !rc->high_source_sad) {
// Check if we should disable GF refresh (if period is up),
@@ -2551,7 +2551,7 @@
if (rc->frames_till_gf_update_due == 1 &&
cm->quant_params.base_qindex > avg_qp) {
// Disable GF refresh since QP is above the runninhg average QP.
- svc->refresh[svc->gld_idx_1layer] = 0;
+ rtc_ref->refresh[rtc_ref->gld_idx_1layer] = 0;
gf_update_changed = 1;
cpi->refresh_frame.golden_frame = 0;
} else if (allow_gf_update &&
@@ -2559,7 +2559,7 @@
(rc->avg_frame_low_motion && rc->avg_frame_low_motion < 20))) {
// Force refresh since QP is well below average QP or this is a high
// motion frame.
- svc->refresh[svc->gld_idx_1layer] = 1;
+ rtc_ref->refresh[rtc_ref->gld_idx_1layer] = 1;
gf_update_changed = 1;
cpi->refresh_frame.golden_frame = 1;
}
@@ -2567,8 +2567,9 @@
set_baseline_gf_interval(cpi, INTER_FRAME);
int refresh_mask = 0;
for (unsigned int i = 0; i < INTER_REFS_PER_FRAME; i++) {
- int ref_frame_map_idx = svc->ref_idx[i];
- refresh_mask |= svc->refresh[ref_frame_map_idx] << ref_frame_map_idx;
+ int ref_frame_map_idx = rtc_ref->ref_idx[i];
+ refresh_mask |= rtc_ref->refresh[ref_frame_map_idx]
+ << ref_frame_map_idx;
}
cm->current_frame.refresh_frame_flags = refresh_mask;
}
@@ -2598,7 +2599,7 @@
RATE_CONTROL *const rc = &cpi->rc;
ExtRefreshFrameFlagsInfo *const ext_refresh_frame_flags =
&ext_flags->refresh_frame;
- SVC *const svc = &cpi->svc;
+ RTC_REF *const rtc_ref = &cpi->rtc_ref;
unsigned int lag_alt = 4;
int last_idx = 0;
int last_idx_refresh = 0;
@@ -2634,8 +2635,8 @@
// external control SET_SVC_REF_FRAME_CONFIG.
// TODO(marpan): rename that control and the related internal parameters
// to rtc_ref.
- for (int i = 0; i < INTER_REFS_PER_FRAME; ++i) svc->ref_idx[i] = 7;
- for (int i = 0; i < REF_FRAMES; ++i) svc->refresh[i] = 0;
+ for (int i = 0; i < INTER_REFS_PER_FRAME; ++i) rtc_ref->ref_idx[i] = 7;
+ for (int i = 0; i < REF_FRAMES; ++i) rtc_ref->refresh[i] = 0;
// Set the reference frame flags.
ext_flags->ref_frame_flags ^= AOM_LAST_FLAG;
ext_flags->ref_frame_flags ^= AOM_ALT_FLAG;
@@ -2658,31 +2659,31 @@
if (cm->current_frame.frame_number > 2)
last2_idx = ((cm->current_frame.frame_number - 2) % sh);
}
- svc->ref_idx[0] = last_idx; // LAST
- svc->ref_idx[1] = last_idx_refresh; // LAST2 (for refresh of last).
+ rtc_ref->ref_idx[0] = last_idx; // LAST
+ rtc_ref->ref_idx[1] = last_idx_refresh; // LAST2 (for refresh of last).
if (cpi->sf.rt_sf.ref_frame_comp_nonrd[1]) {
- svc->ref_idx[1] = last2_idx; // LAST2
- svc->ref_idx[2] = last_idx_refresh; // LAST3 (for refresh of last).
+ rtc_ref->ref_idx[1] = last2_idx; // LAST2
+ rtc_ref->ref_idx[2] = last_idx_refresh; // LAST3 (for refresh of last).
}
- svc->ref_idx[3] = gld_idx; // GOLDEN
- svc->ref_idx[6] = alt_ref_idx; // ALT_REF
+ rtc_ref->ref_idx[3] = gld_idx; // GOLDEN
+ rtc_ref->ref_idx[6] = alt_ref_idx; // ALT_REF
// Refresh this slot, which will become LAST on next frame.
- svc->refresh[last_idx_refresh] = 1;
+ rtc_ref->refresh[last_idx_refresh] = 1;
// Update GOLDEN on period for fixed slot case.
if (gf_update && cm->current_frame.frame_type != KEY_FRAME) {
ext_refresh_frame_flags->golden_frame = 1;
- svc->refresh[gld_idx] = 1;
+ rtc_ref->refresh[gld_idx] = 1;
}
- svc->gld_idx_1layer = gld_idx;
+ rtc_ref->gld_idx_1layer = gld_idx;
// Set the flag to reduce the number of reference frame buffers used.
// This assumes that slot 7 is never used.
cpi->rt_reduce_num_ref_buffers = 1;
- cpi->rt_reduce_num_ref_buffers &= (svc->ref_idx[0] < 7);
- cpi->rt_reduce_num_ref_buffers &= (svc->ref_idx[1] < 7);
- cpi->rt_reduce_num_ref_buffers &= (svc->ref_idx[3] < 7);
- cpi->rt_reduce_num_ref_buffers &= (svc->ref_idx[6] < 7);
+ cpi->rt_reduce_num_ref_buffers &= (rtc_ref->ref_idx[0] < 7);
+ cpi->rt_reduce_num_ref_buffers &= (rtc_ref->ref_idx[1] < 7);
+ cpi->rt_reduce_num_ref_buffers &= (rtc_ref->ref_idx[3] < 7);
+ cpi->rt_reduce_num_ref_buffers &= (rtc_ref->ref_idx[6] < 7);
if (cpi->sf.rt_sf.ref_frame_comp_nonrd[1])
- cpi->rt_reduce_num_ref_buffers &= (svc->ref_idx[2] < 7);
+ cpi->rt_reduce_num_ref_buffers &= (rtc_ref->ref_idx[2] < 7);
}
/*!\brief Check for scene detection, for 1 pass real-time mode.
@@ -3081,12 +3082,13 @@
svc->spatial_layer_id == 0
? 0
: svc->layer_context[svc->temporal_layer_id].is_key_frame;
- // If the user is setting the SVC pattern with set_ref_frame_config and
- // did not set any references, set the frame type to Intra-only.
- if (svc->set_ref_frame_config) {
+ // If the user is setting the reference structure with
+ // set_ref_frame_config and did not set any references, set the
+ // frame type to Intra-only.
+ if (cpi->rtc_ref.set_ref_frame_config) {
int no_references_set = 1;
for (int i = 0; i < INTER_REFS_PER_FRAME; i++) {
- if (svc->reference[i]) {
+ if (cpi->rtc_ref.reference[i]) {
no_references_set = 0;
break;
}
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index becb2d0..64b5ee0 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1354,8 +1354,10 @@
sf->rt_sf.reduce_mv_pel_precision = 2;
}
}
- // SVC settings.
- if (cpi->ppi->use_svc) {
+ // Setting for SVC, or when the ref_frame_config control is
+ // used to set the reference structure.
+ if (cpi->ppi->use_svc || cpi->rtc_ref.set_ref_frame_config) {
+ const RTC_REF *const rtc_ref = &cpi->rtc_ref;
// For SVC: for greater than 2 temporal layers, use better mv search on
// base temporal layers, and only on base spatial layer if highest
// resolution is above 640x360.
@@ -1372,7 +1374,7 @@
if (speed >= 8) {
sf->rt_sf.disable_cdf_update_non_reference_frame = true;
sf->rt_sf.reduce_mv_pel_precision = 2;
- if (cpi->svc.non_reference_frame) {
+ if (rtc_ref->non_reference_frame) {
sf->rt_sf.nonrd_agressive_skip = 1;
sf->mv_sf.subpel_search_method = SUBPEL_TREE_PRUNED_MORE;
}
@@ -1385,15 +1387,15 @@
if (cpi->svc.number_temporal_layers > 1 && cpi->svc.temporal_layer_id == 0)
sf->rt_sf.source_metrics_sb_nonrd = 0;
// Compound mode enabling.
- if (cpi->svc.ref_frame_comp[0] || cpi->svc.ref_frame_comp[1] ||
- cpi->svc.ref_frame_comp[2]) {
+ if (rtc_ref->ref_frame_comp[0] || rtc_ref->ref_frame_comp[1] ||
+ rtc_ref->ref_frame_comp[2]) {
sf->rt_sf.use_comp_ref_nonrd = 1;
sf->rt_sf.ref_frame_comp_nonrd[0] =
- cpi->svc.ref_frame_comp[0] && cpi->svc.reference[GOLDEN_FRAME - 1];
+ rtc_ref->ref_frame_comp[0] && rtc_ref->reference[GOLDEN_FRAME - 1];
sf->rt_sf.ref_frame_comp_nonrd[1] =
- cpi->svc.ref_frame_comp[1] && cpi->svc.reference[LAST2_FRAME - 1];
+ rtc_ref->ref_frame_comp[1] && rtc_ref->reference[LAST2_FRAME - 1];
sf->rt_sf.ref_frame_comp_nonrd[2] =
- cpi->svc.ref_frame_comp[2] && cpi->svc.reference[ALTREF_FRAME - 1];
+ rtc_ref->ref_frame_comp[2] && rtc_ref->reference[ALTREF_FRAME - 1];
} else {
sf->rt_sf.use_comp_ref_nonrd = 0;
}
diff --git a/av1/encoder/svc_layercontext.c b/av1/encoder/svc_layercontext.c
index d5f5353..cb396b4 100644
--- a/av1/encoder/svc_layercontext.c
+++ b/av1/encoder/svc_layercontext.c
@@ -79,9 +79,6 @@
if (svc->number_spatial_layers == 3) {
svc->downsample_filter_type[0] = EIGHTTAP_SMOOTH;
}
- svc->ref_frame_comp[0] = 0;
- svc->ref_frame_comp[1] = 0;
- svc->ref_frame_comp[2] = 0;
}
// Update the layer context from a change_config() call.
@@ -166,14 +163,15 @@
}
static AOM_INLINE bool check_ref_is_low_spatial_res_super_frame(
- int ref_frame, const SVC *svc) {
- int ref_frame_idx = svc->ref_idx[ref_frame - 1];
+ int ref_frame, const SVC *svc, const RTC_REF *rtc_ref) {
+ int ref_frame_idx = rtc_ref->ref_idx[ref_frame - 1];
return svc->buffer_time_index[ref_frame_idx] == svc->current_superframe &&
svc->buffer_spatial_layer[ref_frame_idx] <= svc->spatial_layer_id - 1;
}
void av1_restore_layer_context(AV1_COMP *const cpi) {
SVC *const svc = &cpi->svc;
+ RTC_REF *const rtc_ref = &cpi->rtc_ref;
const AV1_COMMON *const cm = &cpi->common;
LAYER_CONTEXT *const lc = get_layer_context(cpi);
const int old_frame_since_key = cpi->rc.frames_since_key;
@@ -207,14 +205,14 @@
// This is to skip searching mv for that reference if it was last
// refreshed (i.e., buffer slot holding that reference was refreshed) on the
// previous spatial layer(s) at the same time (current_superframe).
- if (svc->set_ref_frame_config && svc->force_zero_mode_spatial_ref) {
- if (check_ref_is_low_spatial_res_super_frame(LAST_FRAME, svc)) {
+ if (rtc_ref->set_ref_frame_config && svc->force_zero_mode_spatial_ref) {
+ if (check_ref_is_low_spatial_res_super_frame(LAST_FRAME, svc, rtc_ref)) {
svc->skip_mvsearch_last = 1;
}
- if (check_ref_is_low_spatial_res_super_frame(GOLDEN_FRAME, svc)) {
+ if (check_ref_is_low_spatial_res_super_frame(GOLDEN_FRAME, svc, rtc_ref)) {
svc->skip_mvsearch_gf = 1;
}
- if (check_ref_is_low_spatial_res_super_frame(ALTREF_FRAME, svc)) {
+ if (check_ref_is_low_spatial_res_super_frame(ALTREF_FRAME, svc, rtc_ref)) {
svc->skip_mvsearch_altref = 1;
}
}
@@ -250,10 +248,10 @@
svc->buffer_time_index[i] = svc->current_superframe;
svc->buffer_spatial_layer[i] = svc->spatial_layer_id;
}
- } else if (cpi->svc.set_ref_frame_config) {
+ } else if (cpi->rtc_ref.set_ref_frame_config) {
for (unsigned int i = 0; i < INTER_REFS_PER_FRAME; i++) {
- int ref_frame_map_idx = svc->ref_idx[i];
- if (cpi->svc.refresh[ref_frame_map_idx]) {
+ int ref_frame_map_idx = cpi->rtc_ref.ref_idx[i];
+ if (cpi->rtc_ref.refresh[ref_frame_map_idx]) {
svc->buffer_time_index[ref_frame_map_idx] = svc->current_superframe;
svc->buffer_spatial_layer[ref_frame_map_idx] = svc->spatial_layer_id;
}
@@ -361,42 +359,43 @@
// spatial and temporal layers, and the ksvc_fixed_mode.
void av1_set_svc_fixed_mode(AV1_COMP *const cpi) {
SVC *const svc = &cpi->svc;
+ RTC_REF *const rtc_ref = &cpi->rtc_ref;
int i;
assert(svc->use_flexible_mode == 0);
// Fixed SVC mode only supports at most 3 spatial or temporal layers.
assert(svc->number_spatial_layers >= 1 && svc->number_spatial_layers <= 3 &&
svc->number_temporal_layers >= 1 && svc->number_temporal_layers <= 3);
- svc->set_ref_frame_config = 1;
+ rtc_ref->set_ref_frame_config = 1;
int superframe_cnt = svc->current_superframe;
// Set the reference map buffer idx for the 7 references:
// LAST_FRAME (0), LAST2_FRAME(1), LAST3_FRAME(2), GOLDEN_FRAME(3),
// BWDREF_FRAME(4), ALTREF2_FRAME(5), ALTREF_FRAME(6).
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->ref_idx[i] = i;
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->reference[i] = 0;
- for (i = 0; i < REF_FRAMES; i++) svc->refresh[i] = 0;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->ref_idx[i] = i;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->reference[i] = 0;
+ for (i = 0; i < REF_FRAMES; i++) rtc_ref->refresh[i] = 0;
// Always reference LAST, and reference GOLDEN on SL > 0.
// For KSVC: GOLDEN reference will be removed on INTER_FRAMES later
// when frame_type is set.
- svc->reference[SVC_LAST_FRAME] = 1;
- if (svc->spatial_layer_id > 0) svc->reference[SVC_GOLDEN_FRAME] = 1;
+ rtc_ref->reference[SVC_LAST_FRAME] = 1;
+ if (svc->spatial_layer_id > 0) rtc_ref->reference[SVC_GOLDEN_FRAME] = 1;
if (svc->temporal_layer_id == 0) {
// Base temporal layer.
if (svc->spatial_layer_id == 0) {
// Set all buffer_idx to 0. Update slot 0 (LAST).
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->ref_idx[i] = 0;
- svc->refresh[0] = 1;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->ref_idx[i] = 0;
+ rtc_ref->refresh[0] = 1;
} else if (svc->spatial_layer_id == 1) {
// Set buffer_idx for LAST to slot 1, GOLDEN (and all other refs) to
// slot 0. Update slot 1 (LAST).
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->ref_idx[i] = 0;
- svc->ref_idx[SVC_LAST_FRAME] = 1;
- svc->refresh[1] = 1;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->ref_idx[i] = 0;
+ rtc_ref->ref_idx[SVC_LAST_FRAME] = 1;
+ rtc_ref->refresh[1] = 1;
} else if (svc->spatial_layer_id == 2) {
// Set buffer_idx for LAST to slot 2, GOLDEN (and all other refs) to
// slot 1. Update slot 2 (LAST).
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->ref_idx[i] = 1;
- svc->ref_idx[SVC_LAST_FRAME] = 2;
- svc->refresh[2] = 1;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->ref_idx[i] = 1;
+ rtc_ref->ref_idx[SVC_LAST_FRAME] = 2;
+ rtc_ref->refresh[2] = 1;
}
} else if (svc->temporal_layer_id == 2 && (superframe_cnt - 1) % 4 == 0) {
// First top temporal enhancement layer.
@@ -404,27 +403,27 @@
// Reference LAST (slot 0).
// Set GOLDEN to slot 3 and update slot 3.
// Set all other buffer_idx to slot 0.
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->ref_idx[i] = 0;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->ref_idx[i] = 0;
if (svc->spatial_layer_id < svc->number_spatial_layers - 1) {
- svc->ref_idx[SVC_GOLDEN_FRAME] = 3;
- svc->refresh[3] = 1;
+ rtc_ref->ref_idx[SVC_GOLDEN_FRAME] = 3;
+ rtc_ref->refresh[3] = 1;
}
} else if (svc->spatial_layer_id == 1) {
// Reference LAST and GOLDEN. Set buffer_idx for LAST to slot 1,
// GOLDEN (and all other refs) to slot 3.
// Set LAST2 to slot 4 and Update slot 4.
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->ref_idx[i] = 3;
- svc->ref_idx[SVC_LAST_FRAME] = 1;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->ref_idx[i] = 3;
+ rtc_ref->ref_idx[SVC_LAST_FRAME] = 1;
if (svc->spatial_layer_id < svc->number_spatial_layers - 1) {
- svc->ref_idx[SVC_LAST2_FRAME] = 4;
- svc->refresh[4] = 1;
+ rtc_ref->ref_idx[SVC_LAST2_FRAME] = 4;
+ rtc_ref->refresh[4] = 1;
}
} else if (svc->spatial_layer_id == 2) {
// Reference LAST and GOLDEN. Set buffer_idx for LAST to slot 2,
// GOLDEN (and all other refs) to slot 4.
// No update.
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->ref_idx[i] = 4;
- svc->ref_idx[SVC_LAST_FRAME] = 2;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->ref_idx[i] = 4;
+ rtc_ref->ref_idx[SVC_LAST_FRAME] = 2;
}
} else if (svc->temporal_layer_id == 1) {
// Middle temporal enhancement layer.
@@ -432,30 +431,30 @@
// Reference LAST.
// Set all buffer_idx to 0.
// Set GOLDEN to slot 5 and update slot 5.
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->ref_idx[i] = 0;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->ref_idx[i] = 0;
if (svc->temporal_layer_id < svc->number_temporal_layers - 1) {
- svc->ref_idx[SVC_GOLDEN_FRAME] = 5;
- svc->refresh[5] = 1;
+ rtc_ref->ref_idx[SVC_GOLDEN_FRAME] = 5;
+ rtc_ref->refresh[5] = 1;
}
} else if (svc->spatial_layer_id == 1) {
// Reference LAST and GOLDEN. Set buffer_idx for LAST to slot 1,
// GOLDEN (and all other refs) to slot 5.
// Set LAST3 to slot 6 and update slot 6.
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->ref_idx[i] = 5;
- svc->ref_idx[SVC_LAST_FRAME] = 1;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->ref_idx[i] = 5;
+ rtc_ref->ref_idx[SVC_LAST_FRAME] = 1;
if (svc->temporal_layer_id < svc->number_temporal_layers - 1) {
- svc->ref_idx[SVC_LAST3_FRAME] = 6;
- svc->refresh[6] = 1;
+ rtc_ref->ref_idx[SVC_LAST3_FRAME] = 6;
+ rtc_ref->refresh[6] = 1;
}
} else if (svc->spatial_layer_id == 2) {
// Reference LAST and GOLDEN. Set buffer_idx for LAST to slot 2,
// GOLDEN (and all other refs) to slot 6.
// Set LAST3 to slot 7 and update slot 7.
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->ref_idx[i] = 6;
- svc->ref_idx[SVC_LAST_FRAME] = 2;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->ref_idx[i] = 6;
+ rtc_ref->ref_idx[SVC_LAST_FRAME] = 2;
if (svc->temporal_layer_id < svc->number_temporal_layers - 1) {
- svc->ref_idx[SVC_LAST3_FRAME] = 7;
- svc->refresh[7] = 1;
+ rtc_ref->ref_idx[SVC_LAST3_FRAME] = 7;
+ rtc_ref->refresh[7] = 1;
}
}
} else if (svc->temporal_layer_id == 2 && (superframe_cnt - 3) % 4 == 0) {
@@ -464,28 +463,28 @@
// Set LAST to slot 5 and reference LAST.
// Set GOLDEN to slot 3 and update slot 3.
// Set all other buffer_idx to 0.
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->ref_idx[i] = 0;
- svc->ref_idx[SVC_LAST_FRAME] = 5;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->ref_idx[i] = 0;
+ rtc_ref->ref_idx[SVC_LAST_FRAME] = 5;
if (svc->spatial_layer_id < svc->number_spatial_layers - 1) {
- svc->ref_idx[SVC_GOLDEN_FRAME] = 3;
- svc->refresh[3] = 1;
+ rtc_ref->ref_idx[SVC_GOLDEN_FRAME] = 3;
+ rtc_ref->refresh[3] = 1;
}
} else if (svc->spatial_layer_id == 1) {
// Reference LAST and GOLDEN. Set buffer_idx for LAST to slot 6,
// GOLDEN to slot 3. Set LAST2 to slot 4 and update slot 4.
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->ref_idx[i] = 0;
- svc->ref_idx[SVC_LAST_FRAME] = 6;
- svc->ref_idx[SVC_GOLDEN_FRAME] = 3;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->ref_idx[i] = 0;
+ rtc_ref->ref_idx[SVC_LAST_FRAME] = 6;
+ rtc_ref->ref_idx[SVC_GOLDEN_FRAME] = 3;
if (svc->spatial_layer_id < svc->number_spatial_layers - 1) {
- svc->ref_idx[SVC_LAST2_FRAME] = 4;
- svc->refresh[4] = 1;
+ rtc_ref->ref_idx[SVC_LAST2_FRAME] = 4;
+ rtc_ref->refresh[4] = 1;
}
} else if (svc->spatial_layer_id == 2) {
// Reference LAST and GOLDEN. Set buffer_idx for LAST to slot 7,
// GOLDEN to slot 4. No update.
- for (i = 0; i < INTER_REFS_PER_FRAME; i++) svc->ref_idx[i] = 0;
- svc->ref_idx[SVC_LAST_FRAME] = 7;
- svc->ref_idx[SVC_GOLDEN_FRAME] = 4;
+ for (i = 0; i < INTER_REFS_PER_FRAME; i++) rtc_ref->ref_idx[i] = 0;
+ rtc_ref->ref_idx[SVC_LAST_FRAME] = 7;
+ rtc_ref->ref_idx[SVC_GOLDEN_FRAME] = 4;
}
}
}
diff --git a/av1/encoder/svc_layercontext.h b/av1/encoder/svc_layercontext.h
index da8cd3e..844d393 100644
--- a/av1/encoder/svc_layercontext.h
+++ b/av1/encoder/svc_layercontext.h
@@ -90,22 +90,11 @@
int temporal_layer_id;
int number_spatial_layers;
int number_temporal_layers;
- int set_ref_frame_config;
- int non_reference_frame;
int use_flexible_mode;
int ksvc_fixed_mode;
- int ref_frame_comp[3];
/*!\endcond */
- /*!
- * LAST_FRAME (0), LAST2_FRAME(1), LAST3_FRAME(2), GOLDEN_FRAME(3),
- * BWDREF_FRAME(4), ALTREF2_FRAME(5), ALTREF_FRAME(6).
- */
- int reference[INTER_REFS_PER_FRAME];
/*!\cond */
- int ref_idx[INTER_REFS_PER_FRAME];
- int refresh[REF_FRAMES];
- int gld_idx_1layer;
double base_framerate;
unsigned int current_superframe;
unsigned int buffer_time_index[REF_FRAMES];
diff --git a/av1/encoder/var_based_part.c b/av1/encoder/var_based_part.c
index 7135f37..0092294 100644
--- a/av1/encoder/var_based_part.c
+++ b/av1/encoder/var_based_part.c
@@ -508,12 +508,12 @@
else
threshold_base =
scale_part_thresh_content(threshold_base, cpi->oxcf.speed, cm->width,
- cm->height, cpi->svc.non_reference_frame);
+ cm->height, cpi->rtc_ref.non_reference_frame);
#else
// Increase base variance threshold based on content_state/sum_diff level.
threshold_base =
scale_part_thresh_content(threshold_base, cpi->oxcf.speed, cm->width,
- cm->height, cpi->svc.non_reference_frame);
+ cm->height, cpi->rtc_ref.non_reference_frame);
#endif
thresholds[0] = threshold_base >> 1;
thresholds[1] = threshold_base;