audioencoder: Simplify pushing of pending events during negotiation

And also don't send the same caps twice.
This commit is contained in:
Sebastian Dröge 2013-08-23 19:17:16 +02:00
parent daf017ced8
commit 96ab6db422

View file

@ -2529,11 +2529,11 @@ static gboolean
gst_audio_encoder_negotiate_default (GstAudioEncoder * enc) gst_audio_encoder_negotiate_default (GstAudioEncoder * enc)
{ {
GstAudioEncoderClass *klass; GstAudioEncoderClass *klass;
gboolean res = FALSE; gboolean res = TRUE;
GstQuery *query = NULL; GstQuery *query = NULL;
GstAllocator *allocator; GstAllocator *allocator;
GstAllocationParams params; GstAllocationParams params;
GstCaps *caps; GstCaps *caps, *prevcaps;
g_return_val_if_fail (GST_IS_AUDIO_ENCODER (enc), FALSE); g_return_val_if_fail (GST_IS_AUDIO_ENCODER (enc), FALSE);
g_return_val_if_fail (GST_IS_CAPS (enc->priv->ctx.caps), FALSE); g_return_val_if_fail (GST_IS_CAPS (enc->priv->ctx.caps), FALSE);
@ -2545,30 +2545,32 @@ gst_audio_encoder_negotiate_default (GstAudioEncoder * enc)
GST_DEBUG_OBJECT (enc, "Setting srcpad caps %" GST_PTR_FORMAT, caps); GST_DEBUG_OBJECT (enc, "Setting srcpad caps %" GST_PTR_FORMAT, caps);
if (enc->priv->pending_events) { if (enc->priv->pending_events) {
GList *pending_events, *l; GList **pending_events, *l;
gboolean set_caps = FALSE;
pending_events = enc->priv->pending_events; pending_events = &enc->priv->pending_events;
enc->priv->pending_events = NULL;
GST_DEBUG_OBJECT (enc, "Pushing pending events"); GST_DEBUG_OBJECT (enc, "Pushing pending events");
for (l = pending_events; l; l = l->next) { for (l = *pending_events; l;) {
GstEvent *event = GST_EVENT (l->data); GstEvent *event = GST_EVENT (l->data);
GList *tmp;
if (GST_EVENT_TYPE (event) > GST_EVENT_CAPS && !set_caps) { if (GST_EVENT_TYPE (event) < GST_EVENT_CAPS) {
res = gst_pad_set_caps (enc->srcpad, caps); gst_audio_encoder_push_event (enc, l->data);
set_caps = TRUE; tmp = l;
l = l->next;
*pending_events = g_list_delete_link (*pending_events, tmp);
} else {
l = l->next;
} }
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);
} }
prevcaps = gst_pad_get_current_caps (enc->srcpad);
if (!prevcaps || !gst_caps_is_equal (prevcaps, caps))
res = gst_pad_set_caps (enc->srcpad, caps);
if (prevcaps)
gst_caps_unref (prevcaps);
if (!res) if (!res)
goto done; goto done;
enc->priv->ctx.output_caps_changed = FALSE; enc->priv->ctx.output_caps_changed = FALSE;