Allocate loop restoration buffers conditionally
The buffers required for loop restoration search and filtering are
allocated and initialized only when loop restoration is used.
BUG=aomedia:2963
Change-Id: Id9af97d706519a13686b9331933c9365bf2e5f08
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index b6b26f0..bbabffe 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -1884,6 +1884,7 @@
}
}
+#if !CONFIG_REALTIME_ONLY
#define COUPLED_CHROMA_FROM_LUMA_RESTORATION 0
static void set_restoration_unit_size(int width, int height, int sx, int sy,
RestorationInfo *rst) {
@@ -1904,6 +1905,7 @@
rst[1].restoration_unit_size = rst[0].restoration_unit_size >> s;
rst[2].restoration_unit_size = rst[1].restoration_unit_size;
}
+#endif
static void init_ref_frame_bufs(AV1_COMP *cpi) {
AV1_COMMON *const cm = &cpi->common;
@@ -2052,16 +2054,21 @@
aom_internal_error(&cm->error, AOM_CODEC_MEM_ERROR,
"Failed to allocate frame buffer");
- const int frame_width = cm->superres_upscaled_width;
- const int frame_height = cm->superres_upscaled_height;
- set_restoration_unit_size(frame_width, frame_height,
- seq_params->subsampling_x,
- seq_params->subsampling_y, cm->rst_info);
- for (int i = 0; i < num_planes; ++i)
- cm->rst_info[i].frame_restoration_type = RESTORE_NONE;
-
#if !CONFIG_REALTIME_ONLY
- av1_alloc_restoration_buffers(cm);
+ const int use_restoration = cm->seq_params.enable_restoration &&
+ !cm->features.all_lossless &&
+ !cm->tiles.large_scale;
+ if (use_restoration) {
+ const int frame_width = cm->superres_upscaled_width;
+ const int frame_height = cm->superres_upscaled_height;
+ set_restoration_unit_size(frame_width, frame_height,
+ seq_params->subsampling_x,
+ seq_params->subsampling_y, cm->rst_info);
+ for (int i = 0; i < num_planes; ++i)
+ cm->rst_info[i].frame_restoration_type = RESTORE_NONE;
+
+ av1_alloc_restoration_buffers(cm);
+ }
#endif
if (!is_stat_generation_stage(cpi)) alloc_util_frame_buffers(cpi);
init_motion_estimation(cpi);
diff --git a/av1/encoder/encoder_alloc.h b/av1/encoder/encoder_alloc.h
index cdb5e1e..15f4ac9 100644
--- a/av1/encoder/encoder_alloc.h
+++ b/av1/encoder/encoder_alloc.h
@@ -383,13 +383,20 @@
aom_internal_error(&cm->error, AOM_CODEC_MEM_ERROR,
"Failed to allocate last frame buffer");
- if (aom_realloc_frame_buffer(
- &cpi->trial_frame_rst, cm->superres_upscaled_width,
- cm->superres_upscaled_height, seq_params->subsampling_x,
- seq_params->subsampling_y, seq_params->use_highbitdepth,
- AOM_RESTORATION_FRAME_BORDER, byte_alignment, NULL, NULL, NULL))
- aom_internal_error(&cm->error, AOM_CODEC_MEM_ERROR,
- "Failed to allocate trial restored frame buffer");
+ // The frame buffer trial_frame_rst is used during loop restoration filter
+ // search. Hence it is allocated only when loop restoration is used.
+ const int use_restoration = cm->seq_params.enable_restoration &&
+ !cm->features.all_lossless &&
+ !cm->tiles.large_scale;
+ if (use_restoration) {
+ if (aom_realloc_frame_buffer(
+ &cpi->trial_frame_rst, cm->superres_upscaled_width,
+ cm->superres_upscaled_height, seq_params->subsampling_x,
+ seq_params->subsampling_y, seq_params->use_highbitdepth,
+ AOM_RESTORATION_FRAME_BORDER, byte_alignment, NULL, NULL, NULL))
+ aom_internal_error(&cm->error, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate trial restored frame buffer");
+ }
if (aom_realloc_frame_buffer(
&cpi->scaled_source, cm->width, cm->height, seq_params->subsampling_x,