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,