avviddec: Unlock video decoder stream lock temporarily while finishing frames
authorSebastian Dröge <sebastian@centricular.com>
Thu, 26 Sep 2024 12:48:54 +0000 (15:48 +0300)
committerBackport Bot <gitlab-backport-bot@gstreamer-foundation.org>
Sun, 29 Sep 2024 14:47:32 +0000 (15:47 +0100)
Temporarily release the video decoder stream lock so that other
threads can continue decoding (e.g. call get_frame()) while data
is being pushed downstream.

At this point it is locked twice, we release one, and then the base class
releases the last one just before pushing the data.

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

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

index fe51832d2350a18fe875596184c23bd7547a00c7..ab77eee67e8d60324263a70873e547f501db71a0 100644 (file)
@@ -2092,9 +2092,16 @@ gst_ffmpegviddec_video_frame (GstFFMpegVidDec * ffmpegdec,
           GST_VIDEO_BUFFER_FLAG_TFF);
     }
   }
+
+  /* Temporarily release the video decoder stream lock so that other
+   * threads can continue decoding (e.g. call get_frame()) while data
+   * is being pushed downstream.
+   */
+  GST_VIDEO_DECODER_STREAM_UNLOCK (ffmpegdec);
   *ret =
       gst_video_decoder_finish_frame (GST_VIDEO_DECODER (ffmpegdec),
       output_frame);
+  GST_VIDEO_DECODER_STREAM_LOCK (ffmpegdec);
 
 beach:
   GST_DEBUG_OBJECT (ffmpegdec, "return flow %s, got frame: %d",