blob: 98689f3fb959d460bce977c4cb5cd0d99a7f8860 [file] [log] [blame]
Patrick Williams8b8bc412016-08-17 15:02:23 -05001From 80dddfd13aaf2fe7272765f8cf291215fe375e28 Mon Sep 17 00:00:00 2001
2From: =?UTF-8?q?Enrique=20Oca=C3=B1a=20Gonz=C3=A1lez?= <eocanha@igalia.com>
3Date: Tue, 17 Nov 2015 16:51:27 +0000
4Subject: [PATCH] Properly handle drain requests while flushing
5
6Without this commit the decoder streaming thread stops without ever attending
7the drain request, leaving the decoder input thread waiting forever.
8---
9 omx/gstomx.c | 7 +++++++
10 omx/gstomxvideodec.c | 13 +++++++++++++
11 2 files changed, 20 insertions(+)
12
13diff --git a/omx/gstomx.c b/omx/gstomx.c
14index 69696c4..f0cd890 100644
15--- a/omx/gstomx.c
16+++ b/omx/gstomx.c
17@@ -830,6 +830,13 @@ gst_omx_component_set_state (GstOMXComponent * comp, OMX_STATETYPE state)
18 done:
19
20 gst_omx_component_handle_messages (comp);
21+
22+ if (err != OMX_ErrorNone && comp->last_error == OMX_ErrorNone) {
23+ GST_ERROR_OBJECT (comp->parent,
24+ "Last operation returned an error. Setting last_error manually.");
25+ comp->last_error = err;
26+ }
27+
28 g_mutex_unlock (&comp->lock);
29
30 if (err != OMX_ErrorNone) {
31diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c
32index d531f75..a26c4a6 100644
33--- a/omx/gstomxvideodec.c
34+++ b/omx/gstomxvideodec.c
35@@ -1539,9 +1539,16 @@ component_error:
36 flushing:
37 {
38 GST_DEBUG_OBJECT (self, "Flushing -- stopping task");
39+
40+ g_mutex_lock (&self->drain_lock);
41+ if (self->draining) {
42+ self->draining = FALSE;
43+ g_cond_broadcast (&self->drain_cond);
44+ }
45 gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (self));
46 self->downstream_flow_ret = GST_FLOW_FLUSHING;
47 self->started = FALSE;
48+ g_mutex_unlock (&self->drain_lock);
49 return;
50 }
51
52@@ -1599,8 +1606,14 @@ flow_error:
53 self->started = FALSE;
54 } else if (flow_ret == GST_FLOW_FLUSHING) {
55 GST_DEBUG_OBJECT (self, "Flushing -- stopping task");
56+ g_mutex_lock (&self->drain_lock);
57+ if (self->draining) {
58+ self->draining = FALSE;
59+ g_cond_broadcast (&self->drain_cond);
60+ }
61 gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (self));
62 self->started = FALSE;
63+ g_mutex_unlock (&self->drain_lock);
64 }
65 GST_VIDEO_DECODER_STREAM_UNLOCK (self);
66 return;
67--
681.8.3.2
69