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 (cherry picked from commit f053a0a2b5bf2dfe52d24fc3ffc6b3a070551cfd)
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c index 160f186..5b350aa 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,