Rewrote wavparse to use riff-read instead of doing bytestream stuff by hand.
authorIain Holmes <iain@prettypeople.org>
Sat, 8 May 2004 00:33:39 +0000 (00:33 +0000)
committerIain Holmes <iain@prettypeople.org>
Sat, 8 May 2004 00:33:39 +0000 (00:33 +0000)
Original commit message from CVS:
Rewrote wavparse to use riff-read instead of doing bytestream stuff by hand.
Made some useful functions in riff-read non-static.

ChangeLog
gst-libs/gst/riff/riff-ids.h
gst-libs/gst/riff/riff-read.c
gst-libs/gst/riff/riff-read.h

index f68af3f3b85e50f4f52242f0840cd0865ee5aa55..20809c5ce58bd91c36724747f3587729b6d2fd1c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2004-05-08 Iain <iain@prettypeople.org>
+
+       * gst/wavparse/gstwavparse.[ch]: Rewrote to use RiffRead instead.
+       * gst-libs/gst/riff/riff-read.c (gst_riff_read_peek_head): Unstatic it
+       (gst_riff_read_element_data): Ditto, and added a got_bytes argument to
+       return the length that was read.
+       (gst_riff_read_strf_auds): Allow fmt tags as well.
+
 2004-05-07  David Schleef  <ds@schleef.org>
 
        * ext/faad/gstfaad.c: (gst_faad_sinkconnect): HACK to correct
index da465c2dfd29898f59f1d332135db24ff63ebee8..65fbd30f92cdebb70d37de17460e32b6cb2d545e 100644 (file)
@@ -44,7 +44,7 @@
 /* WAV stuff */
 #define GST_RIFF_TAG_fmt  GST_MAKE_FOURCC ('f','m','t',' ')
 #define GST_RIFF_TAG_data GST_MAKE_FOURCC ('d','a','t','a')
-
+#define GST_RIFF_TAG_cue  GST_MAKE_FOURCC ('c','u','e',' ')
 /* LIST types */
 #define GST_RIFF_LIST_movi GST_MAKE_FOURCC ('m','o','v','i')
 #define GST_RIFF_LIST_hdrl GST_MAKE_FOURCC ('h','d','r','l')
@@ -52,6 +52,7 @@
 #define GST_RIFF_LIST_strl GST_MAKE_FOURCC ('s','t','r','l')
 #define GST_RIFF_LIST_INFO GST_MAKE_FOURCC ('I','N','F','O')
 #define GST_RIFF_LIST_AVIX GST_MAKE_FOURCC ('A','V','I','X')
+#define GST_RIFF_LIST_adtl GST_MAKE_FOURCC ('a','d','t','l')
 
 /* fcc types */
 #define GST_RIFF_FCC_vids GST_MAKE_FOURCC ('v','i','d','s')
index fa153e68239d8a3570de9a68f3d1af86a8b657c6..388ea7539ff4a7a277afe61dfb5bfa3443aa6546 100644 (file)
@@ -150,7 +150,7 @@ gst_riff_read_element_level_up (GstRiffRead * riff)
  * TRUE on success or FALSE on failure.
  */
 
-static gboolean
+gboolean
 gst_riff_peek_head (GstRiffRead * riff,
     guint32 * tag, guint32 * length, guint * level_up)
 {
@@ -190,16 +190,40 @@ gst_riff_peek_head (GstRiffRead * riff,
  * Return: the data, as a GstBuffer.
  */
 
-static GstBuffer *
-gst_riff_read_element_data (GstRiffRead * riff, guint length)
+GstBuffer *
+gst_riff_read_element_data (GstRiffRead * riff, guint length, guint * got_bytes)
 {
   GstBuffer *buf = NULL;
+  guint32 got;
 
-  if (gst_bytestream_peek (riff->bs, &buf, length) != length) {
-    GST_ELEMENT_ERROR (riff, RESOURCE, READ, (NULL), (NULL));
-    if (buf)
-      gst_buffer_unref (buf);
-    return NULL;
+  while ((got = gst_bytestream_peek (riff->bs, &buf, length)) != length) {
+    /*GST_ELEMENT_ERROR (riff, RESOURCE, READ, (NULL), (NULL)); */
+    GstEvent *event = NULL;
+    guint32 remaining;
+
+    gst_bytestream_get_status (riff->bs, &remaining, &event);
+    if (GST_IS_EVENT (event)) {
+      gst_pad_event_default (riff->sinkpad, event);
+      if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
+
+        if (buf)
+          gst_buffer_unref (buf);
+
+        if (got_bytes)
+          *got_bytes = got;
+
+        return NULL;
+      }
+    } else {
+      GST_ELEMENT_ERROR (riff, RESOURCE, READ, (NULL), (NULL));
+      if (buf)
+        gst_buffer_unref (buf);
+
+      if (got_bytes)
+        *got_bytes = got;
+
+      return NULL;
+    }
   }
 
   /* we need 16-bit alignment */
@@ -208,6 +232,9 @@ gst_riff_read_element_data (GstRiffRead * riff, guint length)
 
   gst_bytestream_flush (riff->bs, length);
 
+  if (got_bytes)
+    *got_bytes = got;
+
   return buf;
 }
 
@@ -363,7 +390,7 @@ gst_riff_read_data (GstRiffRead * riff, guint32 * tag, GstBuffer ** buf)
     return FALSE;
   gst_bytestream_flush_fast (riff->bs, 8);
 
-  return ((*buf = gst_riff_read_element_data (riff, length)) != NULL);
+  return ((*buf = gst_riff_read_element_data (riff, length, NULL)) != NULL);
 }
 
 /*
@@ -559,7 +586,7 @@ gst_riff_read_strf_auds (GstRiffRead * riff, gst_riff_strf_auds ** header)
   if (!gst_riff_read_data (riff, &tag, &buf))
     return FALSE;
 
-  if (tag != GST_RIFF_TAG_strf) {
+  if (tag != GST_RIFF_TAG_strf && tag != GST_RIFF_TAG_fmt) {
     g_warning ("Not a strf chunk");
     gst_buffer_unref (buf);
     return FALSE;
index d0c09b8ca873c60c409f50d1eab017e0e3527955..f3a6feb927273ca2fccc0c6a60562d5592d98b4b 100644 (file)
@@ -64,6 +64,10 @@ GType    gst_riff_read_get_type  (void);
 guint32  gst_riff_peek_tag       (GstRiffRead *riff,
                                  guint       *level_up);
 guint32  gst_riff_peek_list      (GstRiffRead *riff);
+gboolean gst_riff_peek_head      (GstRiffRead *riff,
+                                 guint32     *tag,
+                                 guint32     *length,
+                                 guint       *level_up);
 
 GstEvent *gst_riff_read_seek      (GstRiffRead *riff,
                                  guint64      offset);
@@ -78,7 +82,9 @@ gboolean gst_riff_read_list      (GstRiffRead *riff,
                                  guint32     *tag);
 gboolean gst_riff_read_header    (GstRiffRead *read,
                                  guint32     *doctype);
-
+GstBuffer *gst_riff_read_element_data (GstRiffRead *riff,
+                                      guint        length,
+                                      guint       *got_bytes);
 /*
  * Utility functions (including byteswapping).
  */