From: Sebastian Dröge Date: Thu, 9 May 2013 13:42:49 +0000 (+0200) Subject: videoencoder: Make sure to push any pre-caps events before the caps are set X-Git-Tag: 1.19.3~511^2~5362 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2cc6a62b315ad5eb64305574a87b0fbbd7033a48;p=platform%2Fupstream%2Fgstreamer.git videoencoder: Make sure to push any pre-caps events before the caps are set --- 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;