avviddec: Drop decoder stream lock when calling send_packet
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Tue, 14 Mar 2023 18:27:39 +0000 (14:27 -0400)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Thu, 16 Mar 2023 11:17:36 +0000 (11:17 +0000)
This is already done for every other calls to send_packet. The deadlock occures
since FFMPeg 6.0. The decoder tries to get a buffer from a thread during
the draining process, and blocks trying to get the video decoder stream lock
already heald by the drain function.

Fixes #2383

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4187>

subprojects/gst-libav/ext/libav/gstavviddec.c

index 336da5b..ff38742 100644 (file)
@@ -2042,8 +2042,12 @@ gst_ffmpegviddec_drain (GstVideoDecoder * decoder)
   if (!ffmpegdec->opened)
     return GST_FLOW_OK;
 
-  if (avcodec_send_packet (ffmpegdec->context, NULL))
+  GST_VIDEO_DECODER_STREAM_UNLOCK (ffmpegdec);
+  if (avcodec_send_packet (ffmpegdec->context, NULL)) {
+    GST_VIDEO_DECODER_STREAM_LOCK (ffmpegdec);
     goto send_packet_failed;
+  }
+  GST_VIDEO_DECODER_STREAM_LOCK (ffmpegdec);
 
   do {
     got_frame = gst_ffmpegviddec_frame (ffmpegdec, NULL, &ret);