Improve error checking in several ctrl_get_* funcs Improve error checking in several ctrl_get_*() functions. They all have the following error-checking logic: 1. If the output parameter is a null pointer, return AOM_CODEC_INVALID_PARAM. 2. If ctx->frame_worker is a null pointer (i.e., the decoder is not initialized), return AOM_CODEC_ERROR. 3. Otherwise, return AOM_CODEC_OK. The error-checking logic is realized in two ways to preserve the original control structures in these functions. To fix the crash in bug aomedia:2905, only the change to the ctrl_get_last_quantizer() function is needed. I took the opportunity to review the enture av1/av1_dx_iface.c file. BUG=aomedia:2905 Change-Id: I66e48dd21fec1102567aad22608673945d5743c7
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c index 888060c..21050cd 100644 --- a/av1/av1_dx_iface.c +++ b/av1/av1_dx_iface.c
@@ -967,6 +967,7 @@ va_list args) { int *const arg = va_arg(args, int *); if (arg == NULL) return AOM_CODEC_INVALID_PARAM; + if (ctx->frame_worker == NULL) return AOM_CODEC_ERROR; *arg = ((FrameWorkerData *)ctx->frame_worker->data1) ->pbi->common.quant_params.base_qindex; return AOM_CODEC_OK; @@ -976,6 +977,7 @@ va_list args) { int *const arg = va_arg(args, int *); if (arg == NULL) return AOM_CODEC_INVALID_PARAM; + if (ctx->frame_worker == NULL) return AOM_CODEC_ERROR; *arg = ((FrameWorkerData *)ctx->frame_worker->data1)->pbi->is_fwd_kf_present; return AOM_CODEC_OK; } @@ -984,6 +986,7 @@ va_list args) { int *const arg = va_arg(args, int *); if (arg == NULL) return AOM_CODEC_INVALID_PARAM; + if (ctx->frame_worker == NULL) return AOM_CODEC_ERROR; *arg = ((FrameWorkerData *)ctx->frame_worker->data1)->pbi->is_arf_frame_present; return AOM_CODEC_OK; @@ -993,6 +996,7 @@ va_list args) { int *const arg = va_arg(args, int *); if (arg == NULL) return AOM_CODEC_INVALID_PARAM; + if (ctx->frame_worker == NULL) return AOM_CODEC_ERROR; AV1Decoder *pbi = ((FrameWorkerData *)ctx->frame_worker->data1)->pbi; *arg = 0; switch (pbi->common.current_frame.frame_type) { @@ -1096,7 +1100,7 @@ return AOM_CODEC_ERROR; } } - return AOM_CODEC_OK; + return AOM_CODEC_INVALID_PARAM; } static aom_codec_err_t ctrl_get_sb_size(aom_codec_alg_priv_t *ctx, @@ -1125,6 +1129,7 @@ aom_codec_alg_priv_t *ctx, va_list args) { int *const arg = va_arg(args, int *); if (arg == NULL) return AOM_CODEC_INVALID_PARAM; + if (ctx->frame_worker == NULL) return AOM_CODEC_ERROR; *arg = ((FrameWorkerData *)ctx->frame_worker->data1) ->pbi->common.show_existing_frame; return AOM_CODEC_OK; @@ -1147,7 +1152,7 @@ return AOM_CODEC_ERROR; } } - return AOM_CODEC_OK; + return AOM_CODEC_INVALID_PARAM; } static aom_codec_err_t ctrl_get_frame_corrupted(aom_codec_alg_priv_t *ctx, @@ -1207,6 +1212,7 @@ frame_header_info->coded_tile_data_size = pbi->obu_size_hdr.size; frame_header_info->coded_tile_data = pbi->obu_size_hdr.data; frame_header_info->extra_size = pbi->frame_header_size; + return AOM_CODEC_OK; } else { return AOM_CODEC_ERROR; } @@ -1433,17 +1439,25 @@ (void)args; return AOM_CODEC_INCAPABLE; #else - if (ctx->frame_worker) { - AVxWorker *const worker = ctx->frame_worker; - FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1; - AV1Decoder *pbi = frame_worker_data->pbi; - Accounting **acct = va_arg(args, Accounting **); - *acct = &pbi->accounting; - return AOM_CODEC_OK; + Accounting **acct = va_arg(args, Accounting **); + + if (acct) { + if (ctx->frame_worker) { + AVxWorker *const worker = ctx->frame_worker; + FrameWorkerData *const frame_worker_data = + (FrameWorkerData *)worker->data1; + AV1Decoder *pbi = frame_worker_data->pbi; + *acct = &pbi->accounting; + return AOM_CODEC_OK; + } else { + return AOM_CODEC_ERROR; + } } - return AOM_CODEC_ERROR; + + return AOM_CODEC_INVALID_PARAM; #endif } + static aom_codec_err_t ctrl_set_decode_tile_row(aom_codec_alg_priv_t *ctx, va_list args) { ctx->decode_tile_row = va_arg(args, int);