summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeungha Yang <seungha@centricular.com>2020-06-08 23:46:43 +0900
committerSeungha Yang <seungha@centricular.com>2020-06-08 23:46:43 +0900
commit52a82f5b84c74d3e1b94c44d7ee8391be9512551 (patch)
treee4a1a4eb570f71f7cbfc33a5e2dd7669a0ac310a
parent309c679c43a1ea3df5ab34a8d0d9f1f369f3dcc5 (diff)
downloadgstreamer-plugins-bad-52a82f5b84c74d3e1b94c44d7ee8391be9512551.tar.gz
mftransform: Fix deadlock when MFT requests processing output twice
This sequence of event/data flow might happen 1) Initially we have one pending output event 1-1) Then, process the pending output data 2) No pending input event, then we should wait new pending input event 2-1) Wakeup by new pending event (but it's pending output event) In above case, MFT will not report new pending input event if pending output is not processed. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1325>
-rw-r--r--sys/mediafoundation/gstmftransform.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/sys/mediafoundation/gstmftransform.cpp b/sys/mediafoundation/gstmftransform.cpp
index 17c38b98e..ee30c2e90 100644
--- a/sys/mediafoundation/gstmftransform.cpp
+++ b/sys/mediafoundation/gstmftransform.cpp
@@ -539,6 +539,8 @@ gst_mf_transform_process_input (GstMFTransform * object,
gst_mf_transform_drain_all_events (object);
if (object->hardware) {
+ process_output:
+ /* Process pending output first */
while (object->pending_have_output > 0) {
GST_TRACE_OBJECT (object,
"Pending have output %d", object->pending_have_output);
@@ -581,6 +583,14 @@ gst_mf_transform_process_input (GstMFTransform * object,
GST_DEBUG_OBJECT (object, "Unhandled event %d", type);
break;
}
+
+ /* If MFT doesn't want to handle input yet but we have pending output,
+ * process output again */
+ if (object->pending_have_output > 0 && object->pending_need_input == 0) {
+ GST_TRACE_OBJECT (object,
+ "Only have pending output, process output again");
+ goto process_output;
+ }
}
}