Handle calls to av1_alloc_pmc() for error propagation
This CL checks the return status of av1_alloc_pmc()
calls and invokes aom_internal_error using the correct
error info in case of memory allocation failures.
Bug: aomedia:3276
Change-Id: I143b44a596fe1db04cae87c763a93dfdae153aac
diff --git a/av1/encoder/encoder_alloc.h b/av1/encoder/encoder_alloc.h
index 2f79c909..712dc31 100644
--- a/av1/encoder/encoder_alloc.h
+++ b/av1/encoder/encoder_alloc.h
@@ -82,6 +82,9 @@
av1_setup_sms_tree(cpi, &cpi->td);
cpi->td.firstpass_ctx =
av1_alloc_pmc(cpi, BLOCK_16X16, &cpi->td.shared_coeff_buf);
+ if (!cpi->td.firstpass_ctx)
+ aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
}
// Allocate mbmi buffers which are used to store mode information at block
diff --git a/av1/encoder/ethread.c b/av1/encoder/ethread.c
index 81404c9..3a205597 100644
--- a/av1/encoder/ethread.c
+++ b/av1/encoder/ethread.c
@@ -960,6 +960,9 @@
// Set up firstpass PICK_MODE_CONTEXT.
thread_data->td->firstpass_ctx = av1_alloc_pmc(
ppi->cpi, BLOCK_16X16, &thread_data->td->shared_coeff_buf);
+ if (!thread_data->td->firstpass_ctx)
+ aom_internal_error(&ppi->error, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
}
if (!is_first_pass && i < num_enc_workers) {
diff --git a/av1/encoder/partition_search.c b/av1/encoder/partition_search.c
index 8cfc792..945f819 100644
--- a/av1/encoder/partition_search.c
+++ b/av1/encoder/partition_search.c
@@ -1772,6 +1772,9 @@
if (pc_tree->none == NULL) {
pc_tree->none = av1_alloc_pmc(cpi, bsize, &td->shared_coeff_buf);
+ if (!pc_tree->none)
+ aom_internal_error(xd->error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
}
PICK_MODE_CONTEXT *ctx_none = pc_tree->none;
@@ -1848,6 +1851,9 @@
for (int i = 0; i < SUB_PARTITIONS_RECT; ++i) {
pc_tree->horizontal[i] =
av1_alloc_pmc(cpi, subsize, &td->shared_coeff_buf);
+ if (!pc_tree->horizontal[i])
+ aom_internal_error(xd->error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
}
pick_sb_modes(cpi, tile_data, x, mi_row, mi_col, &last_part_rdc,
PARTITION_HORZ, subsize, pc_tree->horizontal[0],
@@ -1881,6 +1887,9 @@
for (int i = 0; i < SUB_PARTITIONS_RECT; ++i) {
pc_tree->vertical[i] =
av1_alloc_pmc(cpi, subsize, &td->shared_coeff_buf);
+ if (!pc_tree->vertical[i])
+ aom_internal_error(xd->error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
}
pick_sb_modes(cpi, tile_data, x, mi_row, mi_col, &last_part_rdc,
PARTITION_VERT, subsize, pc_tree->vertical[0], invalid_rdc);
@@ -1981,6 +1990,9 @@
if (pc_tree->split[i]->none == NULL)
pc_tree->split[i]->none =
av1_alloc_pmc(cpi, split_subsize, &td->shared_coeff_buf);
+ if (!pc_tree->split[i]->none)
+ aom_internal_error(xd->error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
pick_sb_modes(cpi, tile_data, x, mi_row + y_idx, mi_col + x_idx, &tmp_rdc,
PARTITION_SPLIT, split_subsize, pc_tree->split[i]->none,
invalid_rdc);
@@ -2399,6 +2411,9 @@
av1_set_offsets(cpi, tile_info, x, mi_row, mi_col, bsize);
if (!pc_tree->none) {
pc_tree->none = av1_alloc_pmc(cpi, bsize, &td->shared_coeff_buf);
+ if (!pc_tree->none)
+ aom_internal_error(xd->error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
} else {
av1_reset_pmc(pc_tree->none);
}
@@ -2437,6 +2452,9 @@
if (!pc_tree->split[i]->none) {
pc_tree->split[i]->none =
av1_alloc_pmc(cpi, subsize, &td->shared_coeff_buf);
+ if (!pc_tree->split[i]->none)
+ aom_internal_error(xd->error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
} else {
av1_reset_pmc(pc_tree->split[i]->none);
}
@@ -2571,6 +2589,9 @@
pc_tree->partitioning = PARTITION_NONE;
if (!pc_tree->none) {
pc_tree->none = av1_alloc_pmc(cpi, bsize, &td->shared_coeff_buf);
+ if (!pc_tree->none)
+ aom_internal_error(xd->error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
} else {
av1_reset_pmc(pc_tree->none);
}
@@ -2602,6 +2623,9 @@
if (!pc_tree->split[i]->none) {
pc_tree->split[i]->none =
av1_alloc_pmc(cpi, subsize, &td->shared_coeff_buf);
+ if (!pc_tree->split[i]->none)
+ aom_internal_error(xd->error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
} else {
av1_reset_pmc(pc_tree->split[i]->none);
}
@@ -2662,6 +2686,9 @@
if (!pc_tree->split[i]->none) {
pc_tree->split[i]->none =
av1_alloc_pmc(cpi, subsize, &td->shared_coeff_buf);
+ if (!pc_tree->split[i]->none)
+ aom_internal_error(xd->error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
}
encode_b_nonrd(cpi, tile_data, td, tp, mi_row + y_idx, mi_col + x_idx, 0,
subsize, PARTITION_NONE, pc_tree->split[i]->none, NULL);
@@ -2948,6 +2975,9 @@
case PARTITION_NONE:
if (!pc_tree->none) {
pc_tree->none = av1_alloc_pmc(cpi, bsize, &td->shared_coeff_buf);
+ if (!pc_tree->none)
+ aom_internal_error(xd->error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
} else {
av1_reset_pmc(pc_tree->none);
}
@@ -2961,6 +2991,9 @@
if (!pc_tree->vertical[i]) {
pc_tree->vertical[i] =
av1_alloc_pmc(cpi, subsize, &td->shared_coeff_buf);
+ if (!pc_tree->vertical[i])
+ aom_internal_error(xd->error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
} else {
av1_reset_pmc(pc_tree->vertical[i]);
}
@@ -2981,6 +3014,9 @@
if (!pc_tree->horizontal[i]) {
pc_tree->horizontal[i] =
av1_alloc_pmc(cpi, subsize, &td->shared_coeff_buf);
+ if (!pc_tree->horizontal[i])
+ aom_internal_error(xd->error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
} else {
av1_reset_pmc(pc_tree->horizontal[i]);
}
@@ -3497,6 +3533,9 @@
if (cur_ctx[i][j][0] == NULL) {
cur_ctx[i][j][0] =
av1_alloc_pmc(cpi, blk_params.subsize, &td->shared_coeff_buf);
+ if (!cur_ctx[i][j][0])
+ aom_internal_error(x->e_mbd.error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
}
}
sum_rdc->rate = part_search_state->partition_cost[partition_type];
@@ -3762,6 +3801,9 @@
// Set AB partition context.
cur_part_ctxs[ab_part_type][i] = av1_alloc_pmc(
cpi, ab_subsize[ab_part_type][i], &td->shared_coeff_buf);
+ if (!cur_part_ctxs[ab_part_type][i])
+ aom_internal_error(x->e_mbd.error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
// Set mode as not ready.
cur_part_ctxs[ab_part_type][i]->rd_mode_is_ready = 0;
}
@@ -3821,8 +3863,12 @@
part_search_state->partition_cost[partition_type];
part_search_state->sum_rdc.rdcost =
RDCOST(x->rdmult, part_search_state->sum_rdc.rate, 0);
- for (PART4_TYPES i = 0; i < SUB_PARTITIONS_PART4; ++i)
+ for (PART4_TYPES i = 0; i < SUB_PARTITIONS_PART4; ++i) {
cur_part_ctx[i] = av1_alloc_pmc(cpi, subsize, &td->shared_coeff_buf);
+ if (!cur_part_ctx[i])
+ aom_internal_error(x->e_mbd.error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
+ }
}
// Partition search of HORZ4 / VERT4 partition types.
@@ -4043,6 +4089,9 @@
// Set PARTITION_NONE context.
if (pc_tree->none == NULL)
pc_tree->none = av1_alloc_pmc(cpi, blk_params.bsize, &td->shared_coeff_buf);
+ if (!pc_tree->none)
+ aom_internal_error(x->e_mbd.error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
// Set PARTITION_NONE type cost.
if (part_search_state->partition_none_allowed) {
@@ -5994,6 +6043,9 @@
// PARTITION_NONE
if (partition_none_allowed) {
pc_tree->none = av1_alloc_pmc(cpi, bsize, &td->shared_coeff_buf);
+ if (!pc_tree->none)
+ aom_internal_error(xd->error_info, AOM_CODEC_MEM_ERROR,
+ "Failed to allocate PICK_MODE_CONTEXT");
PICK_MODE_CONTEXT *ctx = pc_tree->none;
// Flip for RDO based pick mode