From 2cc6a62b315ad5eb64305574a87b0fbbd7033a48 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 9 May 2013 15:42:49 +0200 Subject: [PATCH] videoencoder: Make sure to push any pre-caps events before the caps are set --- gst-libs/gst/video/gstvideoencoder.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/gst-libs/gst/video/gstvideoencoder.c b/gst-libs/gst/video/gstvideoencoder.c index fc2b3dc..155173a 100644 --- a/gst-libs/gst/video/gstvideoencoder.c +++ b/gst-libs/gst/video/gstvideoencoder.c @@ -1481,22 +1481,31 @@ gst_video_encoder_negotiate_default (GstVideoEncoder * encoder) /* Push all pending pre-caps events of the oldest frame before * setting caps */ frame = encoder->priv->frames ? encoder->priv->frames->data : NULL; - if (frame && frame->events) { - GList *l; + if (frame || encoder->priv->current_frame_events) { + GList **events, *l; gboolean set_caps = FALSE; + if (frame) { + events = &frame->events; + } else { + events = &encoder->priv->current_frame_events; + } + ret = FALSE; - for (l = g_list_last (frame->events); l; l = l->prev) { + for (l = g_list_last (*events); l;) { GstEvent *event = GST_EVENT (l->data); + GList *tmp; if (GST_EVENT_TYPE (event) > GST_EVENT_CAPS && !set_caps) { ret = gst_pad_set_caps (encoder->srcpad, state->caps); set_caps = TRUE; + break; } gst_video_encoder_push_event (encoder, event); + tmp = l; + l = l->prev; + *events = g_list_delete_link (*events, tmp); } - g_list_free (frame->events); - frame->events = NULL; if (!set_caps) { ret = gst_pad_set_caps (encoder->srcpad, state->caps); } @@ -1707,7 +1716,6 @@ gst_video_encoder_finish_frame (GstVideoEncoder * encoder, && gst_pad_check_reconfigure (encoder->srcpad)))) gst_video_encoder_negotiate (encoder); - if (G_UNLIKELY (priv->output_state == NULL)) goto no_output_state; -- 2.7.4