From 351405d8a096fb04a7d2278eabf00a7bce00f14e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 8 May 2013 15:56:34 +0200 Subject: [PATCH] audio: Make sure to push pre-caps events before the caps event --- gst-libs/gst/audio/gstaudiodecoder.c | 71 ++++++++++++++++++---------- gst-libs/gst/audio/gstaudioencoder.c | 26 +++++++++- 2 files changed, 72 insertions(+), 25 deletions(-) diff --git a/gst-libs/gst/audio/gstaudiodecoder.c b/gst-libs/gst/audio/gstaudiodecoder.c index 53d1aa1252..d9bfe95b4d 100644 --- a/gst-libs/gst/audio/gstaudiodecoder.c +++ b/gst-libs/gst/audio/gstaudiodecoder.c @@ -533,6 +533,29 @@ gst_audio_decoder_finalize (GObject * object) G_OBJECT_CLASS (parent_class)->finalize (object); } +static gboolean +gst_audio_decoder_push_event (GstAudioDecoder * dec, GstEvent * event) +{ + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_SEGMENT:{ + GstSegment seg; + + GST_AUDIO_DECODER_STREAM_LOCK (dec); + gst_event_copy_segment (event, &seg); + + GST_DEBUG_OBJECT (dec, "starting segment %" GST_SEGMENT_FORMAT, &seg); + + dec->output_segment = seg; + GST_AUDIO_DECODER_STREAM_UNLOCK (dec); + break; + } + default: + break; + } + + return gst_pad_push_event (dec->srcpad, event); +} + static gboolean gst_audio_decoder_negotiate_default (GstAudioDecoder * dec) { @@ -552,7 +575,30 @@ gst_audio_decoder_negotiate_default (GstAudioDecoder * dec) GST_DEBUG_OBJECT (dec, "setting src caps %" GST_PTR_FORMAT, caps); - res = gst_pad_set_caps (dec->srcpad, caps); + if (dec->priv->pending_events) { + GList *pending_events, *l; + gboolean set_caps = FALSE; + + pending_events = dec->priv->pending_events; + dec->priv->pending_events = NULL; + + GST_DEBUG_OBJECT (dec, "Pushing pending events"); + for (l = pending_events; l; l = l->next) { + GstEvent *event = GST_EVENT (l->data); + + if (GST_EVENT_TYPE (event) > GST_EVENT_CAPS && !set_caps) { + res = gst_pad_set_caps (dec->srcpad, caps); + set_caps = TRUE; + } + gst_audio_decoder_push_event (dec, l->data); + } + g_list_free (pending_events); + if (!set_caps) { + res = gst_pad_set_caps (dec->srcpad, caps); + } + } else { + res = gst_pad_set_caps (dec->srcpad, caps); + } if (!res) goto done; @@ -917,29 +963,6 @@ again: return ret; } -static gboolean -gst_audio_decoder_push_event (GstAudioDecoder * dec, GstEvent * event) -{ - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_SEGMENT:{ - GstSegment seg; - - GST_AUDIO_DECODER_STREAM_LOCK (dec); - gst_event_copy_segment (event, &seg); - - GST_DEBUG_OBJECT (dec, "starting segment %" GST_SEGMENT_FORMAT, &seg); - - dec->output_segment = seg; - GST_AUDIO_DECODER_STREAM_UNLOCK (dec); - break; - } - default: - break; - } - - return gst_pad_push_event (dec->srcpad, event); -} - static void send_pending_events (GstAudioDecoder * dec) { diff --git a/gst-libs/gst/audio/gstaudioencoder.c b/gst-libs/gst/audio/gstaudioencoder.c index 108e10bfa3..9ed59242dc 100644 --- a/gst-libs/gst/audio/gstaudioencoder.c +++ b/gst-libs/gst/audio/gstaudioencoder.c @@ -2560,7 +2560,31 @@ gst_audio_encoder_negotiate_default (GstAudioEncoder * enc) GST_DEBUG_OBJECT (enc, "Setting srcpad caps %" GST_PTR_FORMAT, caps); - res = gst_pad_set_caps (enc->srcpad, caps); + if (enc->priv->pending_events) { + GList *pending_events, *l; + gboolean set_caps = FALSE; + + pending_events = enc->priv->pending_events; + enc->priv->pending_events = NULL; + + GST_DEBUG_OBJECT (enc, "Pushing pending events"); + for (l = pending_events; l; l = l->next) { + GstEvent *event = GST_EVENT (l->data); + + if (GST_EVENT_TYPE (event) > GST_EVENT_CAPS && !set_caps) { + res = gst_pad_set_caps (enc->srcpad, caps); + set_caps = TRUE; + } + gst_audio_encoder_push_event (enc, l->data); + } + g_list_free (pending_events); + if (!set_caps) { + res = gst_pad_set_caps (enc->srcpad, caps); + } + } else { + res = gst_pad_set_caps (enc->srcpad, caps); + } + if (!res) goto done; enc->priv->ctx.output_caps_changed = FALSE;