Handle allocation failure of buffers in av1_identify_regions()
In this CL, 'error_info' is passed to 'av1_identify_regions()'
to report the error encountered during local buffer allocations.
Also, abstracted the code to free the local buffers into a
function 'free_firstpass_stats_buffers()'.
Bug: aomedia:3276
Change-Id: I3410f3089c9ce9fff5d8023e2b269ec4f7d009ea
diff --git a/av1/encoder/pass2_strategy.c b/av1/encoder/pass2_strategy.c
index 8e3f157..febfd8a 100644
--- a/av1/encoder/pass2_strategy.c
+++ b/av1/encoder/pass2_strategy.c
@@ -1753,22 +1753,43 @@
cleanup_regions(regions, num_regions);
}
-void av1_identify_regions(const FIRSTPASS_STATS *const stats_start,
- int total_frames, int offset, REGIONS *regions,
- int *total_regions) {
+static void free_firstpass_stats_buffers(REGIONS *temp_regions,
+ double *filt_intra_err,
+ double *filt_coded_err,
+ double *grad_coded) {
+ aom_free(temp_regions);
+ aom_free(filt_coded_err);
+ aom_free(filt_intra_err);
+ aom_free(grad_coded);
+}
+
+// Identify stable and unstable regions from first pass stats.
+// stats_start points to the first frame to analyze.
+// |offset| is the offset from the current frame to the frame stats_start is
+// pointing to.
+static void identify_regions(const FIRSTPASS_STATS *const stats_start,
+ int total_frames, int offset, REGIONS *regions,
+ int *total_regions,
+ struct aom_internal_error_info *error_info) {
int k;
if (total_frames <= 1) return;
// store the initial decisions
REGIONS *temp_regions =
(REGIONS *)aom_malloc(total_frames * sizeof(temp_regions[0]));
- av1_zero_array(temp_regions, total_frames);
// buffers for filtered stats
double *filt_intra_err =
(double *)aom_calloc(total_frames, sizeof(*filt_intra_err));
double *filt_coded_err =
(double *)aom_calloc(total_frames, sizeof(*filt_coded_err));
double *grad_coded = (double *)aom_calloc(total_frames, sizeof(*grad_coded));
+ if (!(temp_regions && filt_intra_err && filt_coded_err && grad_coded)) {
+ free_firstpass_stats_buffers(temp_regions, filt_intra_err, filt_coded_err,
+ grad_coded);
+ aom_internal_error(error_info, AOM_CODEC_MEM_ERROR,
+ "Error allocating buffers in identify_regions");
+ }
+ av1_zero_array(temp_regions, total_frames);
int cur_region = 0, this_start = 0, this_last;
@@ -1858,10 +1879,8 @@
regions[k].last += offset;
}
- aom_free(temp_regions);
- aom_free(filt_coded_err);
- aom_free(filt_intra_err);
- aom_free(grad_coded);
+ free_firstpass_stats_buffers(temp_regions, filt_intra_err, filt_coded_err,
+ grad_coded);
}
static int find_regions_index(const REGIONS *regions, int num_regions,
@@ -3806,13 +3825,14 @@
twopass->stats_buf_ctx->stats_in_end);
av1_estimate_coeff(twopass->stats_buf_ctx->stats_in_start,
twopass->stats_buf_ctx->stats_in_end);
- av1_identify_regions(cpi->twopass_frame.stats_in, rest_frames,
- (rc->frames_since_key == 0), p_rc->regions,
- &p_rc->num_regions);
+ identify_regions(cpi->twopass_frame.stats_in, rest_frames,
+ (rc->frames_since_key == 0), p_rc->regions,
+ &p_rc->num_regions, cpi->common.error);
} else {
- av1_identify_regions(
+ identify_regions(
cpi->twopass_frame.stats_in - (rc->frames_since_key == 0),
- rest_frames, 0, p_rc->regions, &p_rc->num_regions);
+ rest_frames, 0, p_rc->regions, &p_rc->num_regions,
+ cpi->common.error);
}
}
diff --git a/av1/encoder/pass2_strategy.h b/av1/encoder/pass2_strategy.h
index e34454e..ff1591c 100644
--- a/av1/encoder/pass2_strategy.h
+++ b/av1/encoder/pass2_strategy.h
@@ -134,14 +134,6 @@
int *num_fpstats_used, int *num_fpstats_required,
int project_gfu_boost);
-// Identify stable and unstable regions from first pass stats.
-// stats_start points to the first frame to analyze.
-// |offset| is the offset from the current frame to the frame stats_start is
-// pointing to.
-void av1_identify_regions(const FIRSTPASS_STATS *const stats_start,
- int total_frames, int offset, REGIONS *regions,
- int *total_regions);
-
void av1_mark_flashes(FIRSTPASS_STATS *first_stats,
FIRSTPASS_STATS *last_stats);
void av1_estimate_noise(FIRSTPASS_STATS *first_stats,