gst/mpegvideoparse/mpegvideoparse.*: Queue new-segment events and send them after caps have been determined and set, ...

Original commit message from CVS:
* gst/mpegvideoparse/mpegvideoparse.c:
* gst/mpegvideoparse/mpegvideoparse.h:
Queue new-segment events and send them after caps have been
determined and set, so that the decoder will have been auto-plugged.
This commit is contained in:
Jan Schmidt 2008-07-01 21:40:19 +00:00
parent ba48156d08
commit 6da2ab35a9
3 changed files with 55 additions and 1 deletions

View file

@ -1,3 +1,10 @@
2008-07-01 Jan Schmidt <jan.schmidt@sun.com>
* gst/mpegvideoparse/mpegvideoparse.c:
* gst/mpegvideoparse/mpegvideoparse.h:
Queue new-segment events and send them after caps have been
determined and set, so that the decoder will have been auto-plugged.
2008-07-01 Edward Hervey <edward.hervey@collabora.co.uk>
Patch by : Michael Smith <msmith @ xiph dot org>

View file

@ -98,6 +98,9 @@ static GstStateChangeReturn
gst_mpegvideoparse_change_state (GstElement * element,
GstStateChange transition);
static void mpv_send_pending_segs (MpegVideoParse * mpegvideoparse);
static void mpv_clear_pending_segs (MpegVideoParse * mpegvideoparse);
static GstElementClass *parent_class = NULL;
/*static guint gst_mpegvideoparse_signals[LAST_SIGNAL] = { 0 }; */
@ -162,6 +165,36 @@ mpv_parse_reset (MpegVideoParse * mpegvideoparse)
mpegvideoparse->seq_hdr.width = mpegvideoparse->seq_hdr.height = -1;
mpegvideoparse->seq_hdr.fps_n = mpegvideoparse->seq_hdr.par_w = 0;
mpegvideoparse->seq_hdr.fps_d = mpegvideoparse->seq_hdr.par_h = 1;
mpv_clear_pending_segs (mpegvideoparse);
}
static void
mpv_send_pending_segs (MpegVideoParse * mpegvideoparse)
{
while (mpegvideoparse->pending_segs) {
GstEvent *ev = mpegvideoparse->pending_segs->data;
gst_pad_push_event (mpegvideoparse->srcpad, ev);
mpegvideoparse->pending_segs =
g_list_delete_link (mpegvideoparse->pending_segs,
mpegvideoparse->pending_segs);
}
mpegvideoparse->pending_segs = NULL;
}
static void
mpv_clear_pending_segs (MpegVideoParse * mpegvideoparse)
{
while (mpegvideoparse->pending_segs) {
GstEvent *ev = mpegvideoparse->pending_segs->data;
gst_event_unref (ev);
mpegvideoparse->pending_segs =
g_list_delete_link (mpegvideoparse->pending_segs,
mpegvideoparse->pending_segs);
}
}
static void
@ -310,6 +343,8 @@ gst_mpegvideoparse_flush (MpegVideoParse * mpegvideoparse)
g_list_free (mpegvideoparse->decode);
mpegvideoparse->decode = NULL;
mpeg_packetiser_flush (&mpegvideoparse->packer);
mpv_clear_pending_segs (mpegvideoparse);
}
static GstFlowReturn
@ -377,6 +412,9 @@ mpegvideoparse_drain_avail (MpegVideoParse * mpegvideoparse)
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
mpegvideoparse->need_discont = FALSE;
}
mpv_send_pending_segs (mpegvideoparse);
res = gst_pad_push (mpegvideoparse->srcpad, buf);
buf = NULL;
}
@ -778,7 +816,15 @@ mpv_parse_sink_event (GstPad * pad, GstEvent * event)
G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT ", pos %" G_GINT64_FORMAT,
rate, applied_rate, format, start, stop, pos);
res = gst_pad_push_event (mpegvideoparse->srcpad, event);
/* Forward the event if we've seen a sequence header
* and therefore set output caps, otherwise queue it for later */
if (mpegvideoparse->seq_hdr.mpeg_version != 0)
res = gst_pad_push_event (mpegvideoparse->srcpad, event);
else {
res = TRUE;
mpegvideoparse->pending_segs =
g_list_append (mpegvideoparse->pending_segs, event);
}
break;
}
case GST_EVENT_FLUSH_STOP:

View file

@ -44,6 +44,7 @@ struct _MpegVideoParse {
GstPad *sinkpad, *srcpad;
GstSegment segment;
GList *pending_segs;
gint64 next_offset;
gboolean need_discont;