From 9251e0004c5d614f977028a6d6cec6d9b90292be Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 8 Nov 2011 10:46:36 +0100 Subject: [PATCH] omxvideodec: Don't try to drain the component after EOS And don't send EOS twice in any case. This most likely will cause the component to not output it again and is not necessary anyway. --- omx/gstomxvideodec.c | 38 +++++++++++++++++++++++++++++++------- omx/gstomxvideodec.h | 3 +++ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c index 9e7da44..4876522 100644 --- a/omx/gstomxvideodec.c +++ b/omx/gstomxvideodec.c @@ -793,6 +793,7 @@ component_error: gst_event_new_eos ()); gst_pad_pause_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self)); self->downstream_flow_ret = GST_FLOW_ERROR; + self->started = FALSE; return; } @@ -801,6 +802,7 @@ flushing: GST_DEBUG_OBJECT (self, "Flushing -- stopping task"); gst_pad_pause_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self)); self->downstream_flow_ret = GST_FLOW_WRONG_STATE; + self->started = FALSE; return; } @@ -821,6 +823,7 @@ flow_error: gst_event_new_eos ()); gst_pad_pause_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self)); } + self->started = FALSE; return; } @@ -832,6 +835,7 @@ reconfigure_error: gst_event_new_eos ()); gst_pad_pause_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self)); self->downstream_flow_ret = GST_FLOW_ERROR; + self->started = FALSE; return; } @@ -843,6 +847,7 @@ invalid_buffer: gst_event_new_eos ()); gst_pad_pause_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self)); self->downstream_flow_ret = GST_FLOW_NOT_NEGOTIATED; + self->started = FALSE; return; } @@ -853,6 +858,7 @@ caps_failed: gst_event_new_eos ()); gst_pad_pause_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self)); self->downstream_flow_ret = GST_FLOW_NOT_NEGOTIATED; + self->started = FALSE; return; } } @@ -865,6 +871,7 @@ gst_omx_video_dec_start (GstBaseVideoDecoder * decoder) self = GST_OMX_VIDEO_DEC (decoder); + self->eos = FALSE; self->downstream_flow_ret = GST_FLOW_OK; ret = gst_pad_start_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self), @@ -888,6 +895,8 @@ gst_omx_video_dec_stop (GstBaseVideoDecoder * decoder) gst_omx_component_set_state (self->component, OMX_StateIdle); self->downstream_flow_ret = GST_FLOW_WRONG_STATE; + self->started = FALSE; + self->eos = FALSE; g_mutex_lock (self->drain_lock); self->draining = FALSE; @@ -1068,10 +1077,7 @@ gst_omx_video_dec_set_format (GstBaseVideoDecoder * decoder, } if (needs_disable && is_format_change) { - if (self->started) { - gst_omx_video_dec_drain (self); - self->started = FALSE; - } + gst_omx_video_dec_drain (self); /* FIXME: Workaround for * https://bugzilla.gnome.org/show_bug.cgi?id=654529 @@ -1182,8 +1188,7 @@ gst_omx_video_dec_reset (GstBaseVideoDecoder * decoder) GST_DEBUG_OBJECT (self, "Resetting decoder"); - if (self->started) - gst_omx_video_dec_drain (self); + gst_omx_video_dec_drain (self); /* FIXME: Workaround for * https://bugzilla.gnome.org/show_bug.cgi?id=654529 @@ -1214,6 +1219,7 @@ gst_omx_video_dec_reset (GstBaseVideoDecoder * decoder) } /* Start the srcpad loop again */ + self->eos = FALSE; self->downstream_flow_ret = GST_FLOW_OK; gst_pad_start_task (GST_BASE_VIDEO_CODEC_SRC_PAD (self), (GstTaskFunction) gst_omx_video_dec_loop, decoder); @@ -1246,6 +1252,11 @@ gst_omx_video_dec_handle_frame (GstBaseVideoDecoder * decoder, GST_DEBUG_OBJECT (self, "Handling frame"); + if (self->eos) { + GST_WARNING_OBJECT (self, "Got frame after EOS"); + return GST_FLOW_UNEXPECTED; + } + timestamp = frame->presentation_timestamp; duration = frame->presentation_duration; @@ -1430,6 +1441,11 @@ gst_omx_video_dec_finish (GstBaseVideoDecoder * decoder) GST_DEBUG_OBJECT (self, "Sending EOS to the component"); + /* Don't send EOS buffer twice, this doesn't work */ + if (self->eos) + return GST_BASE_VIDEO_DECODER_FLOW_DROPPED; + self->eos = TRUE; + /* Send an EOS buffer to the component and let the base * class drop the EOS event. We will send it later when * the EOS buffer arrives on the output port. */ @@ -1450,7 +1466,13 @@ gst_omx_video_dec_drain (GstOMXVideoDec * self) GST_DEBUG_OBJECT (self, "Draining component"); - g_assert (self->started); + if (!self->started) + return GST_FLOW_OK; + self->started = FALSE; + + /* Don't send EOS buffer twice, this doesn't work */ + if (self->eos) + return GST_FLOW_OK; /* Send an EOS buffer to the component and let the base * class drop the EOS event. We will send it later when @@ -1470,5 +1492,7 @@ gst_omx_video_dec_drain (GstOMXVideoDec * self) g_mutex_unlock (self->drain_lock); GST_BASE_VIDEO_CODEC_STREAM_LOCK (self); + self->started = FALSE; + return GST_FLOW_OK; } diff --git a/omx/gstomxvideodec.h b/omx/gstomxvideodec.h index 5d3fd32..afbd4db 100644 --- a/omx/gstomxvideodec.h +++ b/omx/gstomxvideodec.h @@ -65,6 +65,9 @@ struct _GstOMXVideoDec /* TRUE if EOS buffers shouldn't be forwarded */ gboolean draining; + /* TRUE if upstream is EOS */ + gboolean eos; + GstFlowReturn downstream_flow_ret; }; -- 2.7.4