summaryrefslogtreecommitdiffstats
path: root/gst/avi
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2005-07-16 16:43:53 +0000
committerWim Taymans <wim.taymans@gmail.com>2005-07-16 16:43:53 +0000
commitf6f3418b194c0458edf1a8c46ab2ec578486db27 (patch)
treee0df7447210872ef7cfb75bcadf7941bc78c04ff /gst/avi
parent192edcbeb2a7f12b0b41265eee6dd8beacbec10d (diff)
ext/mad/gstmad.c: Add convert function for proper timestamp calculations.
Original commit message from CVS: * ext/mad/gstmad.c: (gst_mad_src_query), (gst_mad_sink_event), (gst_mad_chain): Add convert function for proper timestamp calculations. * gst/avi/gstavidemux.c: (gst_avi_demux_send_event), (gst_avi_demux_stream_header), (gst_avi_demux_handle_seek), (gst_avi_demux_process_next_entry), (gst_avi_demux_loop): Send out initial discont.
Diffstat (limited to 'gst/avi')
-rw-r--r--gst/avi/gstavidemux.c53
1 files changed, 26 insertions, 27 deletions
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c
index a0606b49..3170b516 100644
--- a/gst/avi/gstavidemux.c
+++ b/gst/avi/gstavidemux.c
@@ -1727,6 +1727,21 @@ gst_avi_demux_massage_index (GstAviDemux * avi,
GST_LOG ("Index massaging done");
}
+static gboolean
+gst_avi_demux_send_event (GstAviDemux * avi, GstEvent * event)
+{
+ gint i;
+
+ for (i = 0; i < avi->num_streams; i++) {
+ avi_stream_context *stream = &avi->stream[i];
+
+ gst_event_ref (event);
+ gst_pad_push_event (stream->pad, event);
+ }
+ gst_event_unref (event);
+ return TRUE;
+}
+
/*
* Read full AVI headers.
*/
@@ -1896,6 +1911,13 @@ done:
return GST_FLOW_ERROR;
}
+ /* send initial discont */
+ avi->seek_event = gst_event_new_discontinuous (1.0,
+ GST_FORMAT_TIME, (gint64) 0,
+ (gint64) (((gfloat) avi->stream[0].strh->scale) *
+ avi->stream[0].strh->length /
+ avi->stream[0].strh->rate) * GST_SECOND, NULL);
+
/* at this point we know all the streams and we can signal the no more
* pads signal */
GST_DEBUG_OBJECT (avi, "signaling no more pads");
@@ -1911,18 +1933,12 @@ done:
static gboolean
gst_avi_demux_handle_seek (GstAviDemux * avi)
{
- guint i;
-
/* FIXME: if we seek in an openDML file, we will have multiple
* primary levels. Seeking in between those will cause havoc. */
GST_LOG ("Seeking to entry %d", avi->seek_entry);
- for (i = 0; i < avi->num_streams; i++) {
- avi_stream_context *stream = &avi->stream[i];
-
- gst_pad_push_event (stream->pad, gst_event_new_flush (FALSE));
- }
+ gst_avi_demux_send_event (avi, gst_event_new_flush (FALSE));
GST_STREAM_LOCK (avi->sinkpad);
@@ -1933,11 +1949,8 @@ gst_avi_demux_handle_seek (GstAviDemux * avi)
avi->stream[0].strh->length /
avi->stream[0].strh->rate) * GST_SECOND, NULL);
- for (i = 0; i < avi->num_streams; i++) {
- avi_stream_context *stream = &avi->stream[i];
+ gst_avi_demux_send_event (avi, gst_event_new_flush (TRUE));
- gst_pad_push_event (stream->pad, gst_event_new_flush (TRUE));
- }
gst_pad_start_task (avi->sinkpad, (GstTaskFunction) gst_avi_demux_loop,
avi->sinkpad);
@@ -1954,15 +1967,9 @@ gst_avi_demux_process_next_entry (GstAviDemux * avi)
do {
if (avi->current_entry >= avi->index_size) {
- gint n;
-
GST_LOG_OBJECT (avi, "Handled last index entry, setting EOS (%d > %d)",
avi->current_entry, avi->index_size);
- for (n = 0; n < avi->num_streams; n++) {
- if (avi->stream[n].pad)
- gst_pad_push_event (avi->stream[n].pad,
- gst_event_new (GST_EVENT_EOS));
- }
+ gst_avi_demux_send_event (avi, gst_event_new (GST_EVENT_EOS));
return GST_FLOW_WRONG_STATE;
} else {
GstBuffer *buf;
@@ -2115,17 +2122,9 @@ gst_avi_demux_loop (GstPad * pad)
break;
case GST_AVI_DEMUX_MOVI:
if (avi->seek_event) {
- gint i;
-
- for (i = 0; i < avi->num_streams; i++) {
- avi_stream_context *stream = &avi->stream[i];
-
- gst_pad_push_event (stream->pad, gst_event_ref (avi->seek_event));
- }
- gst_event_unref (avi->seek_event);
+ gst_avi_demux_send_event (avi, avi->seek_event);
avi->seek_event = NULL;
}
-
if ((res = gst_avi_demux_stream_data (avi)) != GST_FLOW_OK)
goto pause;
break;