Move buffer_pool lock/unlock inside av1_superres_upscale In case of errors in av1_superres_upscale(), aom_internal_error() was called without unlocking the buffer pool mutex. This would result in a deadlock when release_frame_buffers() attempts to lock the mutex. Now buffer_pool lock/unlocks are moved inside av1_superres_upscale() and in case of errors, mutex is unlocked before calling aom_internal_error(). BUG=aomedia:2401 Change-Id: Ic4616a8d431ca611b1187976b0ca4558e71ccec8
diff --git a/av1/common/resize.c b/av1/common/resize.c index d668eae..ae6698f 100644 --- a/av1/common/resize.c +++ b/av1/common/resize.c
@@ -1383,21 +1383,26 @@ aom_get_frame_buffer_cb_fn_t cb = pool->get_fb_cb; void *cb_priv = pool->cb_priv; + lock_buffer_pool(pool); // Realloc with callback does not release the frame buffer - release first. - if (release_fb_cb(cb_priv, fb)) + if (release_fb_cb(cb_priv, fb)) { + unlock_buffer_pool(pool); aom_internal_error( &cm->error, AOM_CODEC_MEM_ERROR, "Failed to free current frame buffer before superres upscaling"); - + } // aom_realloc_frame_buffer() leaves config data for frame_to_show intact if (aom_realloc_frame_buffer( frame_to_show, cm->superres_upscaled_width, cm->superres_upscaled_height, seq_params->subsampling_x, seq_params->subsampling_y, seq_params->use_highbitdepth, - AOM_BORDER_IN_PIXELS, cm->byte_alignment, fb, cb, cb_priv)) + AOM_BORDER_IN_PIXELS, cm->byte_alignment, fb, cb, cb_priv)) { + unlock_buffer_pool(pool); aom_internal_error( &cm->error, AOM_CODEC_MEM_ERROR, "Failed to allocate current frame buffer for superres upscaling"); + } + unlock_buffer_pool(pool); } else { // Make a copy of the config data for frame_to_show in copy_buffer copy_buffer_config(frame_to_show, ©_buffer);
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index 8bed2ad..08ac271 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -5284,9 +5284,7 @@ if (!av1_superres_scaled(cm)) return; assert(!cm->all_lossless); - lock_buffer_pool(pool); av1_superres_upscale(cm, pool); - unlock_buffer_pool(pool); } uint32_t av1_decode_frame_headers_and_setup(AV1Decoder *pbi,