summaryrefslogtreecommitdiffstats
path: root/gst
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2004-10-01 16:01:51 +0000
committerWim Taymans <wim.taymans@gmail.com>2004-10-01 16:01:51 +0000
commit51dacde4f8b554cf5b0553197064cd0817c156e6 (patch)
tree7494df9f41e01a1b039edc171c23510d3be1c4e3 /gst
parent882c6f7f8eb2a543fba12478e7a589def302cdd4 (diff)
gst/wavparse/gstwavparse.*: Added some more debugging info.
Original commit message from CVS: * gst/wavparse/gstwavparse.c: (gst_wavparse_class_init), (gst_wavparse_stream_init), (gst_wavparse_fmt), (gst_wavparse_other), (gst_wavparse_loop), (gst_wavparse_pad_convert), (gst_wavparse_pad_query), (gst_wavparse_srcpad_event): * gst/wavparse/gstwavparse.h: Added some more debugging info. Fix the case where the length of the file is 0. Make sure we seek to sample borders.
Diffstat (limited to 'gst')
-rw-r--r--gst/wavparse/gstwavparse.c83
-rw-r--r--gst/wavparse/gstwavparse.h1
2 files changed, 71 insertions, 13 deletions
diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c
index 49930c67..6aeafc4e 100644
--- a/gst/wavparse/gstwavparse.c
+++ b/gst/wavparse/gstwavparse.c
@@ -28,6 +28,9 @@
#include "gst/riff/riff-ids.h"
#include "gst/riff/riff-media.h"
+GST_DEBUG_CATEGORY (wavparse_debug);
+#define GST_CAT_DEFAULT (wavparse_debug)
+
static void gst_wavparse_base_init (gpointer g_class);
static void gst_wavparse_class_init (GstWavParseClass * klass);
static void gst_wavparse_init (GstWavParse * wavparse);
@@ -161,6 +164,8 @@ gst_wavparse_class_init (GstWavParseClass * klass)
object_class->get_property = gst_wavparse_get_property;
gstelement_class->change_state = gst_wavparse_change_state;
+
+ GST_DEBUG_CATEGORY_INIT (wavparse_debug, "wavparse", 0, "WAV parser");
}
static void
@@ -509,8 +514,10 @@ gst_wavparse_stream_init (GstWavParse * wav)
GstRiffRead *riff = GST_RIFF_READ (wav);
guint32 doctype;
- if (!gst_riff_read_header (riff, &doctype))
+ if (!gst_riff_read_header (riff, &doctype)) {
+ GST_WARNING_OBJECT (wav, "could not read header");
return FALSE;
+ }
if (doctype != GST_RIFF_RIFF_WAVE) {
GST_ELEMENT_ERROR (wav, STREAM, WRONG_TYPE, (NULL), (NULL));
@@ -536,6 +543,7 @@ gst_wavparse_fmt (GstWavParse * wav)
wav->format = header->format;
wav->rate = header->rate;
wav->channels = header->channels;
+ wav->blockalign = header->blockalign;
wav->width = (header->blockalign * 8) / header->channels;
wav->depth = header->size;
wav->bps = header->av_bps;
@@ -567,49 +575,93 @@ gst_wavparse_other (GstWavParse * wav)
guint32 tag, length;
if (!gst_riff_peek_head (riff, &tag, &length, NULL)) {
+ GST_WARNING_OBJECT (wav, "could not peek head");
return FALSE;
}
+ GST_DEBUG_OBJECT (wav, "got tag (%08x) %4.4s, length %d", tag,
+ (gchar *) & tag, length);
switch (tag) {
case GST_RIFF_TAG_LIST:
if (!(tag = gst_riff_peek_list (riff))) {
+ GST_WARNING_OBJECT (wav, "could not peek list");
return FALSE;
}
switch (tag) {
case GST_RIFF_LIST_INFO:
- if (!gst_riff_read_list (riff, &tag) || !gst_riff_read_info (riff))
+ if (!gst_riff_read_list (riff, &tag) || !gst_riff_read_info (riff)) {
+ GST_WARNING_OBJECT (wav, "could not read list");
return FALSE;
+ }
break;
case GST_RIFF_LIST_adtl:
- if (!gst_riff_read_skip (riff))
+ if (!gst_riff_read_skip (riff)) {
+ GST_WARNING_OBJECT (wav, "could not read skip");
return FALSE;
+ }
break;
default:
- if (!gst_riff_read_skip (riff))
+ GST_DEBUG_OBJECT (wav, "skipping tag (%08x) %4.4s", tag,
+ (gchar *) & tag);
+ if (!gst_riff_read_skip (riff)) {
+ GST_WARNING_OBJECT (wav, "could not read skip");
return FALSE;
+ }
break;
}
break;
case GST_RIFF_TAG_data:
- if (!gst_bytestream_flush (riff->bs, 8))
+ if (!gst_bytestream_flush (riff->bs, 8)) {
+ GST_WARNING_OBJECT (wav, "could not flush 8 bytes");
return FALSE;
+ }
+ GST_DEBUG_OBJECT (wav, "switching to data mode");
wav->state = GST_WAVPARSE_DATA;
- wav->dataleft = wav->datasize = (guint64) length;
wav->datastart = gst_bytestream_tell (riff->bs);
+ if (length == 0) {
+ guint64 file_length;
+
+ /* length is 0, data probably stretches to the end
+ * of file */
+ GST_DEBUG_OBJECT (wav, "length is 0 trying to find length");
+ /* get length of file */
+ file_length = gst_bytestream_length (riff->bs);
+ if (file_length == -1) {
+ GST_DEBUG_OBJECT (wav,
+ "could not get file length, assuming data to eof");
+ /* could not get length, assuming till eof */
+ length = G_MAXUINT32;
+ }
+ if (file_length > G_MAXUINT32) {
+ GST_DEBUG_OBJECT (wav, "file length %lld, clipping to 32 bits");
+ /* could not get length, assuming till eof */
+ length = G_MAXUINT32;
+ } else {
+ GST_DEBUG_OBJECT (wav, "file length %lld, datalength", file_length,
+ length);
+ /* substract offset of datastart from length */
+ length = file_length - wav->datastart;
+ GST_DEBUG_OBJECT (wav, "datalength %lld", length);
+ }
+ }
+ wav->dataleft = wav->datasize = (guint64) length;
break;
case GST_RIFF_TAG_cue:
- if (!gst_riff_read_skip (riff))
+ if (!gst_riff_read_skip (riff)) {
+ GST_WARNING_OBJECT (wav, "could not read skip");
return FALSE;
+ }
break;
default:
+ GST_DEBUG_OBJECT (wav, "skipping tag (%08x) %4.4s", tag, (gchar *) & tag);
if (!gst_riff_read_skip (riff))
return FALSE;
break;
@@ -685,8 +737,12 @@ gst_wavparse_loop (GstElement * element)
GstBuffer *buf = NULL;
desired = MIN (wav->dataleft, MAX_BUFFER_SIZE);
- if (!(buf = gst_riff_read_element_data (riff, desired, &got_bytes)))
+ if (!(buf = gst_riff_read_element_data (riff, desired, &got_bytes))) {
+ GST_WARNING_OBJECT (wav, "trying to read %d bytes failed", desired);
return;
+ }
+ GST_DEBUG_OBJECT (wav, "read %d bytes, got %d bytes", desired, got_bytes);
+
GST_BUFFER_TIMESTAMP (buf) = GST_SECOND *
(wav->datasize - wav->dataleft) / wav->bps;
GST_BUFFER_DURATION (buf) = GST_SECOND * got_bytes / wav->bps;
@@ -805,7 +861,9 @@ gst_wavparse_pad_convert (GstPad * pad,
case GST_FORMAT_TIME:
switch (*dest_format) {
case GST_FORMAT_BYTES:
- *dest_value = src_value * byterate / GST_SECOND;
+ /* make sure we end up on a sample boundary */
+ *dest_value =
+ (src_value * wavparse->rate / GST_SECOND) * wavparse->blockalign;
break;
case GST_FORMAT_DEFAULT:
*dest_value = src_value * wavparse->rate / GST_SECOND;
@@ -862,8 +920,8 @@ gst_wavparse_pad_query (GstPad * pad, GstQueryType type,
return TRUE;
}
- return gst_pad_convert (wav->sinkpad, bytevalue,
- GST_FORMAT_BYTES, format, value);
+ return gst_pad_convert (wav->sinkpad, GST_FORMAT_BYTES,
+ bytevalue, format, value);
}
static const GstEventMask *
@@ -891,8 +949,7 @@ gst_wavparse_srcpad_event (GstPad * pad, GstEvent * event)
gint64 byteoffset;
GstFormat format;
- /* bring format to bytes for the peer element,
- * FIXME be smarter here */
+ /* bring format to samples for the peer element, */
format = GST_FORMAT_BYTES;
res = gst_pad_convert (pad,
GST_EVENT_SEEK_FORMAT (event),
diff --git a/gst/wavparse/gstwavparse.h b/gst/wavparse/gstwavparse.h
index 13ae5eab..05810748 100644
--- a/gst/wavparse/gstwavparse.h
+++ b/gst/wavparse/gstwavparse.h
@@ -68,6 +68,7 @@ struct _GstWavParse {
guint16 depth;
gint rate;
guint16 channels;
+ guint16 blockalign;
guint16 width;
guint32 bps;