mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-20 00:31:13 +00:00
plugins: encode: unlock the stream lock before _flush()
The current encoder will hang when EOS comes. When we call the gst_vaapi_encoder_encode_and_queue(), we should release the stream lock, just like what we do in gst_vaapiencode_handle_frame(). The deadlock happens when: The input thread holding the stream lock is using gst_vaapi_encoder_create_coded_buffer() to acquire a coded buffer, while the output thread which holding the coded buffer resource is acquiring the stream lock in _push_frame() to push the data to down stream element. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-vaapi/-/merge_requests/404>
This commit is contained in:
parent
5997093ba1
commit
5bee089331
1 changed files with 6 additions and 1 deletions
|
@ -565,7 +565,10 @@ gst_vaapiencode_drain (GstVaapiEncode * encode)
|
||||||
if (!encode->encoder)
|
if (!encode->encoder)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
GST_VIDEO_ENCODER_STREAM_UNLOCK (encode);
|
||||||
status = gst_vaapi_encoder_flush (encode->encoder);
|
status = gst_vaapi_encoder_flush (encode->encoder);
|
||||||
|
GST_VIDEO_ENCODER_STREAM_LOCK (encode);
|
||||||
|
|
||||||
if (status != GST_VAAPI_ENCODER_STATUS_SUCCESS)
|
if (status != GST_VAAPI_ENCODER_STATUS_SUCCESS)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
gst_vaapiencode_purge (encode);
|
gst_vaapiencode_purge (encode);
|
||||||
|
@ -722,10 +725,12 @@ gst_vaapiencode_finish (GstVideoEncoder * venc)
|
||||||
if (!encode->encoder)
|
if (!encode->encoder)
|
||||||
return GST_FLOW_NOT_NEGOTIATED;
|
return GST_FLOW_NOT_NEGOTIATED;
|
||||||
|
|
||||||
|
GST_VIDEO_ENCODER_STREAM_UNLOCK (encode);
|
||||||
|
|
||||||
status = gst_vaapi_encoder_flush (encode->encoder);
|
status = gst_vaapi_encoder_flush (encode->encoder);
|
||||||
|
|
||||||
GST_VIDEO_ENCODER_STREAM_UNLOCK (encode);
|
|
||||||
gst_pad_stop_task (GST_VAAPI_PLUGIN_BASE_SRC_PAD (encode));
|
gst_pad_stop_task (GST_VAAPI_PLUGIN_BASE_SRC_PAD (encode));
|
||||||
|
|
||||||
GST_VIDEO_ENCODER_STREAM_LOCK (encode);
|
GST_VIDEO_ENCODER_STREAM_LOCK (encode);
|
||||||
|
|
||||||
while (status == GST_VAAPI_ENCODER_STATUS_SUCCESS && ret == GST_FLOW_OK)
|
while (status == GST_VAAPI_ENCODER_STATUS_SUCCESS && ret == GST_FLOW_OK)
|
||||||
|
|
Loading…
Reference in a new issue