Refactor: Move code updating ref frames for svc & denoiser.
Make new functions and move them to vp9_denoiser.c and vp9_svc_layercontext.c Change-Id: Ia34266ee2831d0f1316b7a641cbbf40fe64e1a0c
This commit is contained in:
@@ -717,6 +717,44 @@ int64_t vp9_scale_acskip_thresh(int64_t threshold,
|
|||||||
return threshold;
|
return threshold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vp9_denoiser_update_ref_frame(VP9_COMP *const cpi) {
|
||||||
|
VP9_COMMON *const cm = &cpi->common;
|
||||||
|
SVC *const svc = &cpi->svc;
|
||||||
|
if (cpi->oxcf.noise_sensitivity > 0 && denoise_svc(cpi) &&
|
||||||
|
cpi->denoiser.denoising_level > kDenLowLow) {
|
||||||
|
int svc_refresh_denoiser_buffers = 0;
|
||||||
|
int denoise_svc_second_layer = 0;
|
||||||
|
FRAME_TYPE frame_type = cm->intra_only ? KEY_FRAME : cm->frame_type;
|
||||||
|
if (cpi->use_svc) {
|
||||||
|
const int svc_buf_shift =
|
||||||
|
svc->number_spatial_layers - svc->spatial_layer_id == 2
|
||||||
|
? cpi->denoiser.num_ref_frames
|
||||||
|
: 0;
|
||||||
|
int layer =
|
||||||
|
LAYER_IDS_TO_IDX(svc->spatial_layer_id, svc->temporal_layer_id,
|
||||||
|
svc->number_temporal_layers);
|
||||||
|
LAYER_CONTEXT *const lc = &svc->layer_context[layer];
|
||||||
|
svc_refresh_denoiser_buffers =
|
||||||
|
lc->is_key_frame || svc->spatial_layer_sync[svc->spatial_layer_id];
|
||||||
|
denoise_svc_second_layer =
|
||||||
|
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 (vp9_denoiser_realloc_svc(
|
||||||
|
cm, &cpi->denoiser, svc_buf_shift, cpi->refresh_alt_ref_frame,
|
||||||
|
cpi->refresh_golden_frame, cpi->refresh_last_frame,
|
||||||
|
cpi->alt_fb_idx, cpi->gld_fb_idx, cpi->lst_fb_idx))
|
||||||
|
vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
|
||||||
|
"Failed to re-allocate denoiser for SVC");
|
||||||
|
}
|
||||||
|
vp9_denoiser_update_frame_info(
|
||||||
|
&cpi->denoiser, *cpi->Source, frame_type, cpi->refresh_alt_ref_frame,
|
||||||
|
cpi->refresh_golden_frame, cpi->refresh_last_frame, cpi->alt_fb_idx,
|
||||||
|
cpi->gld_fb_idx, cpi->lst_fb_idx, cpi->resize_pending,
|
||||||
|
svc_refresh_denoiser_buffers, denoise_svc_second_layer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef OUTPUT_YUV_DENOISED
|
#ifdef OUTPUT_YUV_DENOISED
|
||||||
static void make_grayscale(YV12_BUFFER_CONFIG *yuv) {
|
static void make_grayscale(YV12_BUFFER_CONFIG *yuv) {
|
||||||
int r, c;
|
int r, c;
|
||||||
|
|||||||
@@ -120,6 +120,8 @@ int64_t vp9_scale_acskip_thresh(int64_t threshold,
|
|||||||
VP9_DENOISER_LEVEL noise_level, int abs_sumdiff,
|
VP9_DENOISER_LEVEL noise_level, int abs_sumdiff,
|
||||||
int temporal_layer_id);
|
int temporal_layer_id);
|
||||||
|
|
||||||
|
void vp9_denoiser_update_ref_frame(struct VP9_COMP *const cpi);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -3228,87 +3228,16 @@ void update_ref_frames(VP9_COMP *cpi) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void vp9_update_reference_frames(VP9_COMP *cpi) {
|
void vp9_update_reference_frames(VP9_COMP *cpi) {
|
||||||
VP9_COMMON *const cm = &cpi->common;
|
|
||||||
BufferPool *const pool = cm->buffer_pool;
|
|
||||||
SVC *const svc = &cpi->svc;
|
|
||||||
|
|
||||||
if (cpi->extra_arf_allowed)
|
if (cpi->extra_arf_allowed)
|
||||||
update_multi_arf_ref_frames(cpi);
|
update_multi_arf_ref_frames(cpi);
|
||||||
else
|
else
|
||||||
update_ref_frames(cpi);
|
update_ref_frames(cpi);
|
||||||
|
|
||||||
#if CONFIG_VP9_TEMPORAL_DENOISING
|
#if CONFIG_VP9_TEMPORAL_DENOISING
|
||||||
if (cpi->oxcf.noise_sensitivity > 0 && denoise_svc(cpi) &&
|
vp9_denoiser_update_ref_frame(cpi);
|
||||||
cpi->denoiser.denoising_level > kDenLowLow) {
|
|
||||||
int svc_refresh_denoiser_buffers = 0;
|
|
||||||
int denoise_svc_second_layer = 0;
|
|
||||||
FRAME_TYPE frame_type = cm->intra_only ? KEY_FRAME : cm->frame_type;
|
|
||||||
if (cpi->use_svc) {
|
|
||||||
int realloc_fail = 0;
|
|
||||||
const int svc_buf_shift =
|
|
||||||
svc->number_spatial_layers - svc->spatial_layer_id == 2
|
|
||||||
? cpi->denoiser.num_ref_frames
|
|
||||||
: 0;
|
|
||||||
int layer =
|
|
||||||
LAYER_IDS_TO_IDX(svc->spatial_layer_id, svc->temporal_layer_id,
|
|
||||||
svc->number_temporal_layers);
|
|
||||||
LAYER_CONTEXT *const lc = &svc->layer_context[layer];
|
|
||||||
svc_refresh_denoiser_buffers =
|
|
||||||
lc->is_key_frame || svc->spatial_layer_sync[svc->spatial_layer_id];
|
|
||||||
denoise_svc_second_layer =
|
|
||||||
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.
|
|
||||||
realloc_fail = vp9_denoiser_realloc_svc(
|
|
||||||
cm, &cpi->denoiser, svc_buf_shift, cpi->refresh_alt_ref_frame,
|
|
||||||
cpi->refresh_golden_frame, cpi->refresh_last_frame, cpi->alt_fb_idx,
|
|
||||||
cpi->gld_fb_idx, cpi->lst_fb_idx);
|
|
||||||
if (realloc_fail)
|
|
||||||
vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
|
|
||||||
"Failed to re-allocate denoiser for SVC");
|
|
||||||
}
|
|
||||||
vp9_denoiser_update_frame_info(
|
|
||||||
&cpi->denoiser, *cpi->Source, frame_type, cpi->refresh_alt_ref_frame,
|
|
||||||
cpi->refresh_golden_frame, cpi->refresh_last_frame, cpi->alt_fb_idx,
|
|
||||||
cpi->gld_fb_idx, cpi->lst_fb_idx, cpi->resize_pending,
|
|
||||||
svc_refresh_denoiser_buffers, denoise_svc_second_layer);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (is_one_pass_cbr_svc(cpi)) {
|
if (is_one_pass_cbr_svc(cpi)) vp9_svc_update_ref_frame(cpi);
|
||||||
if (svc->temporal_layering_mode == VP9E_TEMPORAL_LAYERING_MODE_BYPASS) {
|
|
||||||
vp9_svc_update_ref_frame_bypass_mode(cpi);
|
|
||||||
} else if (cm->frame_type == KEY_FRAME) {
|
|
||||||
// Keep track of frame index for each reference frame.
|
|
||||||
int i;
|
|
||||||
// On key frame update all reference frame slots.
|
|
||||||
for (i = 0; i < REF_FRAMES; i++) {
|
|
||||||
svc->fb_idx_spatial_layer_id[i] = svc->spatial_layer_id;
|
|
||||||
svc->fb_idx_temporal_layer_id[i] = svc->temporal_layer_id;
|
|
||||||
// LAST/GOLDEN/ALTREF is already updated above.
|
|
||||||
if (i != cpi->lst_fb_idx && i != cpi->gld_fb_idx &&
|
|
||||||
i != cpi->alt_fb_idx)
|
|
||||||
ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[i], cm->new_fb_idx);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (cpi->refresh_last_frame) {
|
|
||||||
svc->fb_idx_spatial_layer_id[cpi->lst_fb_idx] = svc->spatial_layer_id;
|
|
||||||
svc->fb_idx_temporal_layer_id[cpi->lst_fb_idx] = svc->temporal_layer_id;
|
|
||||||
}
|
|
||||||
if (cpi->refresh_golden_frame) {
|
|
||||||
svc->fb_idx_spatial_layer_id[cpi->gld_fb_idx] = svc->spatial_layer_id;
|
|
||||||
svc->fb_idx_temporal_layer_id[cpi->gld_fb_idx] = svc->temporal_layer_id;
|
|
||||||
}
|
|
||||||
if (cpi->refresh_alt_ref_frame) {
|
|
||||||
svc->fb_idx_spatial_layer_id[cpi->alt_fb_idx] = svc->spatial_layer_id;
|
|
||||||
svc->fb_idx_temporal_layer_id[cpi->alt_fb_idx] = svc->temporal_layer_id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Copy flags from encoder to SVC struct.
|
|
||||||
vp9_copy_flags_ref_update_idx(cpi);
|
|
||||||
vp9_svc_update_ref_frame_buffer_idx(cpi);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
|
static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
|
||||||
|
|||||||
@@ -1126,7 +1126,7 @@ void vp9_svc_update_ref_frame_buffer_idx(VP9_COMP *const cpi) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void vp9_svc_update_ref_frame_bypass_mode(VP9_COMP *const cpi) {
|
static void vp9_svc_update_ref_frame_bypass_mode(VP9_COMP *const cpi) {
|
||||||
// For non-flexible/bypass SVC mode: check for refreshing other buffer
|
// For non-flexible/bypass SVC mode: check for refreshing other buffer
|
||||||
// slots.
|
// slots.
|
||||||
SVC *const svc = &cpi->svc;
|
SVC *const svc = &cpi->svc;
|
||||||
@@ -1142,3 +1142,40 @@ void vp9_svc_update_ref_frame_bypass_mode(VP9_COMP *const cpi) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vp9_svc_update_ref_frame(VP9_COMP *const cpi) {
|
||||||
|
VP9_COMMON *const cm = &cpi->common;
|
||||||
|
SVC *const svc = &cpi->svc;
|
||||||
|
BufferPool *const pool = cm->buffer_pool;
|
||||||
|
|
||||||
|
if (svc->temporal_layering_mode == VP9E_TEMPORAL_LAYERING_MODE_BYPASS) {
|
||||||
|
vp9_svc_update_ref_frame_bypass_mode(cpi);
|
||||||
|
} else if (cm->frame_type == KEY_FRAME) {
|
||||||
|
// Keep track of frame index for each reference frame.
|
||||||
|
int i;
|
||||||
|
// On key frame update all reference frame slots.
|
||||||
|
for (i = 0; i < REF_FRAMES; i++) {
|
||||||
|
svc->fb_idx_spatial_layer_id[i] = svc->spatial_layer_id;
|
||||||
|
svc->fb_idx_temporal_layer_id[i] = svc->temporal_layer_id;
|
||||||
|
// LAST/GOLDEN/ALTREF is already updated above.
|
||||||
|
if (i != cpi->lst_fb_idx && i != cpi->gld_fb_idx && i != cpi->alt_fb_idx)
|
||||||
|
ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[i], cm->new_fb_idx);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (cpi->refresh_last_frame) {
|
||||||
|
svc->fb_idx_spatial_layer_id[cpi->lst_fb_idx] = svc->spatial_layer_id;
|
||||||
|
svc->fb_idx_temporal_layer_id[cpi->lst_fb_idx] = svc->temporal_layer_id;
|
||||||
|
}
|
||||||
|
if (cpi->refresh_golden_frame) {
|
||||||
|
svc->fb_idx_spatial_layer_id[cpi->gld_fb_idx] = svc->spatial_layer_id;
|
||||||
|
svc->fb_idx_temporal_layer_id[cpi->gld_fb_idx] = svc->temporal_layer_id;
|
||||||
|
}
|
||||||
|
if (cpi->refresh_alt_ref_frame) {
|
||||||
|
svc->fb_idx_spatial_layer_id[cpi->alt_fb_idx] = svc->spatial_layer_id;
|
||||||
|
svc->fb_idx_temporal_layer_id[cpi->alt_fb_idx] = svc->temporal_layer_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Copy flags from encoder to SVC struct.
|
||||||
|
vp9_copy_flags_ref_update_idx(cpi);
|
||||||
|
vp9_svc_update_ref_frame_buffer_idx(cpi);
|
||||||
|
}
|
||||||
|
|||||||
@@ -232,7 +232,7 @@ void vp9_svc_check_spatial_layer_sync(struct VP9_COMP *const cpi);
|
|||||||
|
|
||||||
void vp9_svc_update_ref_frame_buffer_idx(struct VP9_COMP *const cpi);
|
void vp9_svc_update_ref_frame_buffer_idx(struct VP9_COMP *const cpi);
|
||||||
|
|
||||||
void vp9_svc_update_ref_frame_bypass_mode(struct VP9_COMP *const cpi);
|
void vp9_svc_update_ref_frame(struct VP9_COMP *const cpi);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
Reference in New Issue
Block a user