From dce4937fb1e56a67c4c978bf26e7537bd71c2d02 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 6 Feb 2006 14:25:34 +0000 Subject: [PATCH] gst/matroska/ebml-write.*: Make sure we send a newsegment event in BYTES format before sending buffers (#328531). Original commit message from CVS: * gst/matroska/ebml-write.c: (gst_ebml_write_reset), (gst_ebml_write_flush_cache), (gst_ebml_write_element_push), (gst_ebml_write_seek): * gst/matroska/ebml-write.h: Make sure we send a newsegment event in BYTES format before sending buffers (#328531). --- ChangeLog | 9 +++++++++ gst/matroska/ebml-write.c | 36 ++++++++++++++++++++++++++---------- gst/matroska/ebml-write.h | 2 ++ 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4159930..3f6e9b9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2006-02-06 Tim-Philipp Müller + * gst/matroska/ebml-write.c: (gst_ebml_write_reset), + (gst_ebml_write_flush_cache), (gst_ebml_write_element_push), + (gst_ebml_write_seek): + * gst/matroska/ebml-write.h: + Make sure we send a newsegment event in BYTES format + before sending buffers (#328531). + +2006-02-06 Tim-Philipp Müller + * ext/dv/gstdvdemux.c: (gst_dvdemux_src_query), (gst_dvdemux_sink_query): * ext/flac/gstflacdec.c: (gst_flac_dec_src_query): diff --git a/gst/matroska/ebml-write.c b/gst/matroska/ebml-write.c index c25f76a..a834f8f 100644 --- a/gst/matroska/ebml-write.c +++ b/gst/matroska/ebml-write.c @@ -115,6 +115,7 @@ gst_ebml_write_reset (GstEbmlWrite * ebml) ebml->cache_size = 0; ebml->last_write_result = GST_FLOW_OK; ebml->timestamp = GST_CLOCK_TIME_NONE; + ebml->need_newsegment = TRUE; } @@ -181,8 +182,17 @@ gst_ebml_write_flush_cache (GstEbmlWrite * ebml) g_assert (GST_BUFFER_SIZE (ebml->cache) + GST_BUFFER_OFFSET (ebml->cache) == ebml->pos); - if (ebml->last_write_result == GST_FLOW_OK) + if (ebml->last_write_result == GST_FLOW_OK) { + if (ebml->need_newsegment) { + GstEvent *ev; + + g_assert (ebml->handled == 0); + ev = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0); + if (gst_pad_push_event (ebml->srcpad, ev)) + ebml->need_newsegment = FALSE; + } ebml->last_write_result = gst_pad_push (ebml->srcpad, ebml->cache); + } ebml->cache = NULL; ebml->cache_size = 0; @@ -348,8 +358,17 @@ gst_ebml_write_element_push (GstEbmlWrite * ebml, GstBuffer * buf) return; } - if (ebml->last_write_result == GST_FLOW_OK) + if (ebml->last_write_result == GST_FLOW_OK) { + if (ebml->need_newsegment) { + GstEvent *ev; + + g_assert (ebml->handled == 0); + ev = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, 0, -1, 0); + if (gst_pad_push_event (ebml->srcpad, ev)) + ebml->need_newsegment = FALSE; + } ebml->last_write_result = gst_pad_push (ebml->srcpad, buf); + } } @@ -363,8 +382,7 @@ gst_ebml_write_element_push (GstEbmlWrite * ebml, GstBuffer * buf) void gst_ebml_write_seek (GstEbmlWrite * ebml, guint64 pos) { - GstEvent *seek; - GstPad *peer_pad; + GstEvent *event; /* Cache seeking. A bit dangerous, we assume the client writer * knows what he's doing... */ @@ -384,14 +402,12 @@ gst_ebml_write_seek (GstEbmlWrite * ebml, guint64 pos) } } - seek = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, pos, -1, 0); - peer_pad = GST_PAD_PEER (ebml->srcpad); - if (peer_pad) { - gst_pad_send_event (peer_pad, seek); + event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_BYTES, pos, -1, 0); + if (gst_pad_push_event (ebml->srcpad, event)) { + GST_DEBUG ("Seek'd to offset %" G_GUINT64_FORMAT, pos); } else { - GST_WARNING_OBJECT (ebml, "Can not seek: no peer pad"); + GST_WARNING ("Seek to offset %" G_GUINT64_FORMAT " failed", pos); } - ebml->pos = pos; } diff --git a/gst/matroska/ebml-write.h b/gst/matroska/ebml-write.h index a0739c0..98286eb 100644 --- a/gst/matroska/ebml-write.h +++ b/gst/matroska/ebml-write.h @@ -54,6 +54,8 @@ typedef struct _GstEbmlWrite { GstFlowReturn last_write_result; + gboolean need_newsegment; + /*< private >*/ gpointer _gst_reserved[GST_PADDING]; } GstEbmlWrite; -- 2.7.4