summaryrefslogtreecommitdiffstats
path: root/gst/wavparse/gstwavparse.c
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2007-05-02 17:19:36 +0000
committerWim Taymans <wim.taymans@gmail.com>2007-05-02 17:19:36 +0000
commit64e0ee90f6a3e9a7ea173af0141eac20303dcc84 (patch)
treed827b829343cec276a841418a06160f7d8374f51 /gst/wavparse/gstwavparse.c
parentb64fd034a58ad433ad489d2748a72abfc3ef0d6a (diff)
gst/wavparse/gstwavparse.*: Be a bit more clever when dealing with VBR files with FACT tags, we don't want to timesta...
Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_perform_seek), (gst_wavparse_stream_headers), (gst_wavparse_add_src_pad), (gst_wavparse_stream_data): * gst/wavparse/gstwavparse.h: Be a bit more clever when dealing with VBR files with FACT tags, we don't want to timestamp buffers in that case but the estimated BPS can be used for seeking. Only send close segment in the streaming thread.
Diffstat (limited to 'gst/wavparse/gstwavparse.c')
-rw-r--r--gst/wavparse/gstwavparse.c53
1 files changed, 33 insertions, 20 deletions
diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c
index be62a6e2..81c62c19 100644
--- a/gst/wavparse/gstwavparse.c
+++ b/gst/wavparse/gstwavparse.c
@@ -873,10 +873,12 @@ gst_wavparse_perform_seek (GstWavParse * wav, GstEvent * event)
GST_DEBUG_OBJECT (wav, "closing running segment %" G_GINT64_FORMAT
" to %" G_GINT64_FORMAT, wav->segment.accum, wav->segment.last_stop);
- gst_pad_push_event (wav->srcpad,
- gst_event_new_new_segment (TRUE,
- wav->segment.rate, wav->segment.format,
- wav->segment.accum, wav->segment.last_stop, wav->segment.accum));
+ /* queue the segment for sending in the stream thread */
+ if (wav->close_segment)
+ gst_event_unref (wav->close_segment);
+ wav->close_segment = gst_event_new_new_segment (TRUE,
+ wav->segment.rate, wav->segment.format,
+ wav->segment.accum, wav->segment.last_stop, wav->segment.accum);
/* keep track of our last_stop */
seeksegment.accum = wav->segment.last_stop;
@@ -898,9 +900,9 @@ gst_wavparse_perform_seek (GstWavParse * wav, GstEvent * event)
" to %" G_GINT64_FORMAT, wav->segment.last_stop, stop);
/* store the newsegment event so it can be sent from the streaming thread. */
- if (wav->newsegment)
- gst_event_unref (wav->newsegment);
- wav->newsegment =
+ if (wav->start_segment)
+ gst_event_unref (wav->start_segment);
+ wav->start_segment =
gst_event_new_new_segment (FALSE, wav->segment.rate,
wav->segment.format, wav->segment.last_stop, stop,
wav->segment.last_stop);
@@ -1087,6 +1089,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
wav->blockalign = header->blockalign;
wav->depth = header->size;
wav->av_bps = header->av_bps;
+ wav->vbr = FALSE;
g_free (header);
@@ -1260,6 +1263,7 @@ gst_wavparse_stream_headers (GstWavParse * wav)
(guint32) gst_util_uint64_scale ((guint64) wav->rate, wav->datasize,
(guint64) wav->fact);
GST_DEBUG_OBJECT (wav, "calculated bps : %d", wav->bps);
+ wav->vbr = TRUE;
}
if (wav->bps > 0) {
@@ -1457,10 +1461,15 @@ gst_wavparse_add_src_pad (GstWavParse * wav, GstBuffer * buf)
gst_element_add_pad (GST_ELEMENT_CAST (wav), wav->srcpad);
gst_element_no_more_pads (GST_ELEMENT_CAST (wav));
- GST_DEBUG_OBJECT (wav, "Send newsegment event on newpad");
- if (wav->newsegment) {
- gst_pad_push_event (wav->srcpad, wav->newsegment);
- wav->newsegment = NULL;
+ if (wav->close_segment) {
+ GST_DEBUG_OBJECT (wav, "Send close segment event on newpad");
+ gst_pad_push_event (wav->srcpad, wav->close_segment);
+ wav->close_segment = NULL;
+ }
+ if (wav->start_segment) {
+ GST_DEBUG_OBJECT (wav, "Send start segment event on newpad");
+ gst_pad_push_event (wav->srcpad, wav->start_segment);
+ wav->start_segment = NULL;
}
if (wav->tags) {
@@ -1521,13 +1530,18 @@ iterate_adapter:
* we can detect broken .wav files with dts disguised as raw PCM (sigh) */
if (G_UNLIKELY (wav->first)) {
wav->first = FALSE;
+ /* this will also push the segment events */
gst_wavparse_add_src_pad (wav, buf);
- }
-
- /* If we have a pending newsegment send it now. */
- if (G_UNLIKELY (wav->newsegment != NULL)) {
- gst_pad_push_event (wav->srcpad, wav->newsegment);
- wav->newsegment = NULL;
+ } else {
+ /* If we have a pending close/start segment, send it now. */
+ if (G_UNLIKELY (wav->close_segment != NULL)) {
+ gst_pad_push_event (wav->srcpad, wav->close_segment);
+ wav->close_segment = NULL;
+ }
+ if (G_UNLIKELY (wav->start_segment != NULL)) {
+ gst_pad_push_event (wav->srcpad, wav->start_segment);
+ wav->start_segment = NULL;
+ }
}
obtained = GST_BUFFER_SIZE (buf);
@@ -1549,12 +1563,11 @@ iterate_adapter:
/* update current running segment position */
gst_segment_set_last_stop (&wav->segment, GST_FORMAT_TIME, next_timestamp);
- /* only apply the timestamp to the first DISCONT buffer because we might be
- * dealing with VBR data that can make the timestamps drift a lot */
if (wav->discont) {
GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
wav->discont = FALSE;
- } else {
+ } else if (wav->vbr) {
+ /* don't set timestamps for VBR files if it's not the first buffer */
timestamp = GST_CLOCK_TIME_NONE;
duration = GST_CLOCK_TIME_NONE;
}