gst/wavparse/gstwavparse.*: Added some more debugging info.
authorWim Taymans <wim.taymans@gmail.com>
Fri, 1 Oct 2004 16:01:51 +0000 (16:01 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Fri, 1 Oct 2004 16:01:51 +0000 (16:01 +0000)
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.

ChangeLog
gst/wavparse/gstwavparse.c
gst/wavparse/gstwavparse.h

index 090b37e..fc8f0b8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2004-10-01  Wim Taymans  <wim@fluendo.com>
 
+       * 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.
+
+2004-10-01  Wim Taymans  <wim@fluendo.com>
+
        * gst/playback/README:
        * gst/playback/gstdecodebin.c: (gst_decode_bin_factory_filter),
        (gst_decode_bin_init), (find_compatibles), (close_pad_link),
index 49930c6..6aeafc4 100644 (file)
@@ -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),
index 13ae5ea..0581074 100644 (file)
@@ -68,6 +68,7 @@ struct _GstWavParse {
   guint16 depth;
   gint rate;
   guint16 channels;
+  guint16 blockalign;
   guint16 width;
   guint32 bps;