Handle allocation failure in smooth_filter_noise()
This CL handles the allocation failure of 'smooth_noise' buffer in
'smooth_filter_noise()' by calling 'aom_internal_error()' in the
caller function using 'error_info' derived from 'cpi->common'.
Bug: aomedia:3276
Change-Id: Id72a406f0fbedd307c44c0835532922e1351509e
diff --git a/av1/encoder/pass2_strategy.c b/av1/encoder/pass2_strategy.c
index 3641c8b..cb9a8c8 100644
--- a/av1/encoder/pass2_strategy.c
+++ b/av1/encoder/pass2_strategy.c
@@ -3536,12 +3536,13 @@
}
// Smooth-out the noise variance so it is more stable
+// Returns 0 on success, -1 on memory allocation failure.
// TODO(bohanli): Use a better low-pass filter than averaging
-static void smooth_filter_noise(FIRSTPASS_STATS *first_stats,
- FIRSTPASS_STATS *last_stats) {
+static int smooth_filter_noise(FIRSTPASS_STATS *first_stats,
+ FIRSTPASS_STATS *last_stats) {
int len = (int)(last_stats - first_stats);
double *smooth_noise = aom_malloc(len * sizeof(*smooth_noise));
- if (!smooth_noise) return;
+ if (!smooth_noise) return -1;
for (int i = 0; i < len; i++) {
double total_noise = 0;
@@ -3566,11 +3567,13 @@
}
aom_free(smooth_noise);
+ return 0;
}
// Estimate the noise variance of each frame from the first pass stats
void av1_estimate_noise(FIRSTPASS_STATS *first_stats,
- FIRSTPASS_STATS *last_stats) {
+ FIRSTPASS_STATS *last_stats,
+ struct aom_internal_error_info *error_info) {
FIRSTPASS_STATS *this_stats, *next_stats;
double C1, C2, C3, noise;
for (this_stats = first_stats + 2; this_stats < last_stats; this_stats++) {
@@ -3656,7 +3659,10 @@
this_stats->noise_var = (first_stats + 2)->noise_var;
}
- smooth_filter_noise(first_stats, last_stats);
+ if (smooth_filter_noise(first_stats, last_stats) == -1) {
+ aom_internal_error(error_info, AOM_CODEC_MEM_ERROR,
+ "Error allocating buffers in smooth_filter_noise()");
+ }
}
// Estimate correlation coefficient of each frame with its previous frame.
@@ -3823,7 +3829,8 @@
av1_mark_flashes(twopass->stats_buf_ctx->stats_in_start,
twopass->stats_buf_ctx->stats_in_end);
av1_estimate_noise(twopass->stats_buf_ctx->stats_in_start,
- twopass->stats_buf_ctx->stats_in_end);
+ twopass->stats_buf_ctx->stats_in_end,
+ cpi->common.error);
av1_estimate_coeff(twopass->stats_buf_ctx->stats_in_start,
twopass->stats_buf_ctx->stats_in_end);
ret = identify_regions(cpi->twopass_frame.stats_in, rest_frames,
@@ -3997,7 +4004,7 @@
av1_mark_flashes(twopass->stats_buf_ctx->stats_in_start,
twopass->stats_buf_ctx->stats_in_end);
av1_estimate_noise(twopass->stats_buf_ctx->stats_in_start,
- twopass->stats_buf_ctx->stats_in_end);
+ twopass->stats_buf_ctx->stats_in_end, cpi->common.error);
av1_estimate_coeff(twopass->stats_buf_ctx->stats_in_start,
twopass->stats_buf_ctx->stats_in_end);
diff --git a/av1/encoder/pass2_strategy.h b/av1/encoder/pass2_strategy.h
index ff1591c..5987a78 100644
--- a/av1/encoder/pass2_strategy.h
+++ b/av1/encoder/pass2_strategy.h
@@ -137,7 +137,8 @@
void av1_mark_flashes(FIRSTPASS_STATS *first_stats,
FIRSTPASS_STATS *last_stats);
void av1_estimate_noise(FIRSTPASS_STATS *first_stats,
- FIRSTPASS_STATS *last_stats);
+ FIRSTPASS_STATS *last_stats,
+ struct aom_internal_error_info *error_info);
void av1_estimate_coeff(FIRSTPASS_STATS *first_stats,
FIRSTPASS_STATS *last_stats);