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:
parent
ba48156d08
commit
6da2ab35a9
@ -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>
|
2008-07-01 Edward Hervey <edward.hervey@collabora.co.uk>
|
||||||
|
|
||||||
Patch by : Michael Smith <msmith @ xiph dot org>
|
Patch by : Michael Smith <msmith @ xiph dot org>
|
||||||
|
@ -98,6 +98,9 @@ static GstStateChangeReturn
|
|||||||
gst_mpegvideoparse_change_state (GstElement * element,
|
gst_mpegvideoparse_change_state (GstElement * element,
|
||||||
GstStateChange transition);
|
GstStateChange transition);
|
||||||
|
|
||||||
|
static void mpv_send_pending_segs (MpegVideoParse * mpegvideoparse);
|
||||||
|
static void mpv_clear_pending_segs (MpegVideoParse * mpegvideoparse);
|
||||||
|
|
||||||
static GstElementClass *parent_class = NULL;
|
static GstElementClass *parent_class = NULL;
|
||||||
|
|
||||||
/*static guint gst_mpegvideoparse_signals[LAST_SIGNAL] = { 0 }; */
|
/*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.width = mpegvideoparse->seq_hdr.height = -1;
|
||||||
mpegvideoparse->seq_hdr.fps_n = mpegvideoparse->seq_hdr.par_w = 0;
|
mpegvideoparse->seq_hdr.fps_n = mpegvideoparse->seq_hdr.par_w = 0;
|
||||||
mpegvideoparse->seq_hdr.fps_d = mpegvideoparse->seq_hdr.par_h = 1;
|
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
|
static void
|
||||||
@ -310,6 +343,8 @@ gst_mpegvideoparse_flush (MpegVideoParse * mpegvideoparse)
|
|||||||
g_list_free (mpegvideoparse->decode);
|
g_list_free (mpegvideoparse->decode);
|
||||||
mpegvideoparse->decode = NULL;
|
mpegvideoparse->decode = NULL;
|
||||||
mpeg_packetiser_flush (&mpegvideoparse->packer);
|
mpeg_packetiser_flush (&mpegvideoparse->packer);
|
||||||
|
|
||||||
|
mpv_clear_pending_segs (mpegvideoparse);
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
@ -377,6 +412,9 @@ mpegvideoparse_drain_avail (MpegVideoParse * mpegvideoparse)
|
|||||||
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
|
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
|
||||||
mpegvideoparse->need_discont = FALSE;
|
mpegvideoparse->need_discont = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mpv_send_pending_segs (mpegvideoparse);
|
||||||
|
|
||||||
res = gst_pad_push (mpegvideoparse->srcpad, buf);
|
res = gst_pad_push (mpegvideoparse->srcpad, buf);
|
||||||
buf = NULL;
|
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,
|
G_GINT64_FORMAT ", stop %" G_GINT64_FORMAT ", pos %" G_GINT64_FORMAT,
|
||||||
rate, applied_rate, format, start, stop, pos);
|
rate, applied_rate, format, start, stop, pos);
|
||||||
|
|
||||||
|
/* 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);
|
res = gst_pad_push_event (mpegvideoparse->srcpad, event);
|
||||||
|
else {
|
||||||
|
res = TRUE;
|
||||||
|
mpegvideoparse->pending_segs =
|
||||||
|
g_list_append (mpegvideoparse->pending_segs, event);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GST_EVENT_FLUSH_STOP:
|
case GST_EVENT_FLUSH_STOP:
|
||||||
|
@ -44,6 +44,7 @@ struct _MpegVideoParse {
|
|||||||
|
|
||||||
GstPad *sinkpad, *srcpad;
|
GstPad *sinkpad, *srcpad;
|
||||||
GstSegment segment;
|
GstSegment segment;
|
||||||
|
GList *pending_segs;
|
||||||
|
|
||||||
gint64 next_offset;
|
gint64 next_offset;
|
||||||
gboolean need_discont;
|
gboolean need_discont;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user