summaryrefslogtreecommitdiffstats
path: root/gst/matroska/ebml-write.c
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.net>2006-02-06 14:25:34 +0000
committerTim-Philipp Müller <tim@centricular.net>2006-02-06 14:25:34 +0000
commitdce4937fb1e56a67c4c978bf26e7537bd71c2d02 (patch)
treedd0f0ac79d10de13659a68d54b849ad92c4ac8e6 /gst/matroska/ebml-write.c
parent3a27956d47bbf408ad8e0bfd10cfcefb4a5ddc04 (diff)
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).
Diffstat (limited to 'gst/matroska/ebml-write.c')
-rw-r--r--gst/matroska/ebml-write.c36
1 files changed, 26 insertions, 10 deletions
diff --git a/gst/matroska/ebml-write.c b/gst/matroska/ebml-write.c
index c25f76a7..a834f8fc 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;
}