diff options
author | Thomas Vander Stichele <thomas (at) apestaart (dot) org> | 2009-04-01 01:15:31 +0200 |
---|---|---|
committer | Thomas Vander Stichele <thomas@davedina.amantes> | 2009-04-04 15:14:32 +0200 |
commit | 8009fcf547b7caebe407fe272293c733d488ccb4 (patch) | |
tree | 08afeb70eef9ff55c356743514aa9dbfa4e0efaa /ext | |
parent | 5f802dad4eedd54f108aad4eb245467d6ab27024 (diff) |
add pending_samples so that we only update segment's last stop after really sending the samples
Diffstat (limited to 'ext')
-rw-r--r-- | ext/flac/gstflacdec.c | 9 | ||||
-rw-r--r-- | ext/flac/gstflacdec.h | 1 |
2 files changed, 9 insertions, 1 deletions
diff --git a/ext/flac/gstflacdec.c b/ext/flac/gstflacdec.c index b533d0b0..ff3da8b7 100644 --- a/ext/flac/gstflacdec.c +++ b/ext/flac/gstflacdec.c @@ -931,6 +931,8 @@ gst_flac_dec_write (GstFlacDec * flacdec, const FLAC__Frame * frame, GST_TIME_ARGS (GST_BUFFER_DURATION (flacdec->pending))); gst_pad_push (flacdec->srcpad, flacdec->pending); flacdec->pending = NULL; + flacdec->segment.last_stop += flacdec->pending_samples; + flacdec->pending_samples = 0; } ret = gst_pad_alloc_buffer_and_set_caps (flacdec->srcpad, @@ -1003,11 +1005,13 @@ gst_flac_dec_write (GstFlacDec * flacdec, const FLAC__Frame * frame, } ret = gst_pad_push (flacdec->srcpad, outbuf); GST_DEBUG_OBJECT (flacdec, "returned %s", gst_flow_get_name (ret)); + flacdec->segment.last_stop += samples; } else { GST_DEBUG_OBJECT (flacdec, "not pushing %d samples at offset %" G_GINT64_FORMAT " (in seek)", samples, GST_BUFFER_OFFSET (outbuf)); gst_buffer_replace (&flacdec->pending, outbuf); + flacdec->pending_samples = samples; ret = GST_FLOW_OK; } @@ -1018,7 +1022,6 @@ gst_flac_dec_write (GstFlacDec * flacdec, const FLAC__Frame * frame, done: - flacdec->segment.last_stop += samples; /* we act on the flow return value later in the loop function, as we don't * want to mess up the internal decoder state by returning ABORT when the @@ -1761,6 +1764,10 @@ gst_flac_dec_handle_seek_event (GstFlacDec * flacdec, GstEvent * event) flacdec->seeking = FALSE; + GST_DEBUG_OBJECT (flacdec, "performed seek to sample %" G_GINT64_FORMAT, + flacdec->segment.last_stop); + + if (!seek_ok) { GST_WARNING_OBJECT (flacdec, "seek failed"); /* seek failed, restore the segment and start streaming again with diff --git a/ext/flac/gstflacdec.h b/ext/flac/gstflacdec.h index a3be8fe6..a9daf3e9 100644 --- a/ext/flac/gstflacdec.h +++ b/ext/flac/gstflacdec.h @@ -69,6 +69,7 @@ struct _GstFlacDec { gboolean running; gboolean discont; GstBuffer *pending; /* pending buffer, produced in seek */ + guint pending_samples; GstEvent *close_segment; GstEvent *start_segment; GstTagList *tags; |