Applied endianess fix and unsigned data fix from Jon Nall
authorChristian Schaller <uraeus@gnome.org>
Sun, 8 Dec 2002 12:23:48 +0000 (12:23 +0000)
committerChristian Schaller <uraeus@gnome.org>
Sun, 8 Dec 2002 12:23:48 +0000 (12:23 +0000)
Original commit message from CVS:
Applied endianess fix and unsigned data fix from Jon Nall

gst/wavparse/gstriff.c
gst/wavparse/gstwavparse.c

index 1d8a7b0..bc4558d 100644 (file)
@@ -69,9 +69,9 @@ gint gst_riff_next_buffer(GstRiff *riff,GstBuffer *buf,gulong off) {
     g_return_val_if_fail(chunk != NULL,0);
     chunk->offset = riff->nextlikely+8;        /* point to the actual data */
     chunk->id = words[0];
-    chunk->size = words[1];
+    chunk->size = GUINT32_FROM_LE(words[1]);
 /*    g_print("chunk id is 0x%08x '%s' and is 0x%08x long\n",words[0], */
-/*            gst_riff_id_to_fourcc(words[0]),words[1]); */
+/*            gst_riff_id_to_fourcc(words[0]),chunk->size); */
     riff->nextlikely += 8 + chunk->size;       /* doesn't include hdr */
     riff->chunks = g_list_prepend(riff->chunks,chunk);
   }
@@ -82,15 +82,15 @@ gint gst_riff_next_buffer(GstRiff *riff,GstBuffer *buf,gulong off) {
 
 gulong gst_riff_fourcc_to_id(gchar *fourcc) {
   g_return_val_if_fail(fourcc != NULL,0);
-
-  return (fourcc[0] << 0) | (fourcc[1] << 8) |
-         (fourcc[2] << 16) | (fourcc[3] << 24);
+  return GUINT32_FROM_LE((gulong)(fourcc[0] << 0) | (fourcc[1] << 8) |
+         (fourcc[2] << 16) | (fourcc[3] << 24));
 }
 
 gchar *gst_riff_id_to_fourcc(gulong id) {
   gchar *fourcc = (gchar *)malloc(5);
 
   g_return_val_if_fail(fourcc != NULL, NULL);
+  id = GUINT32_FROM_LE(id);
 
   fourcc[0] = (id >> 0) & 0xff;
   fourcc[1] = (id >> 8) & 0xff;
index 052f855..27cda78 100644 (file)
@@ -73,7 +73,10 @@ GST_PAD_TEMPLATE_FACTORY (src_template_factory,
       "format",            GST_PROPS_STRING ("int"),
        "law",              GST_PROPS_INT (0),
        "endianness",       GST_PROPS_INT (G_BYTE_ORDER),
-       "signed",           GST_PROPS_BOOLEAN (TRUE),
+       "signed",           GST_PROPS_LIST (
+                                    GST_PROPS_BOOLEAN (FALSE),
+                                    GST_PROPS_BOOLEAN (TRUE)
+                          ),
        "width",            GST_PROPS_LIST (
                             GST_PROPS_INT (8),
                             GST_PROPS_INT (16)
@@ -290,6 +293,11 @@ gst_wavparse_chain (GstPad *pad, GstBuffer *buf)
       /* we can gather format information now */
       format = (GstWavParseFormat *)((guchar *) GST_BUFFER_DATA (buf) + fmt->offset);
 
+      wavparse->bps      = GUINT16_FROM_LE(format->wBlockAlign);
+      wavparse->rate     = GUINT32_FROM_LE(format->dwSamplesPerSec);
+      wavparse->channels = GUINT16_FROM_LE(format->wChannels);
+      wavparse->width    = GUINT16_FROM_LE(format->wBitsPerSample);
+      
       /* set the caps on the src pad */
       caps = GST_CAPS_NEW (
                        "parsewav_src",
@@ -297,11 +305,11 @@ gst_wavparse_chain (GstPad *pad, GstBuffer *buf)
                        "format",       GST_PROPS_STRING ("int"),
                          "law",        GST_PROPS_INT (0),              /*FIXME */
                          "endianness", GST_PROPS_INT (G_BYTE_ORDER),
-                         "signed",     GST_PROPS_BOOLEAN (TRUE), /*FIXME */
-                         "width",      GST_PROPS_INT (format->wBitsPerSample),
-                         "depth",      GST_PROPS_INT (format->wBitsPerSample),
-                         "rate",       GST_PROPS_INT (format->dwSamplesPerSec),
-                         "channels",   GST_PROPS_INT (format->wChannels)
+                         "signed",     GST_PROPS_BOOLEAN ((wavparse->width > 8) ? TRUE : FALSE),
+                         "width",      GST_PROPS_INT (wavparse->width),
+                         "depth",      GST_PROPS_INT (wavparse->width),
+                         "rate",       GST_PROPS_INT (wavparse->rate),
+                         "channels",   GST_PROPS_INT (wavparse->channels)
                      );
 
       if (gst_pad_try_set_caps (wavparse->srcpad, caps) <= 0) {
@@ -309,13 +317,8 @@ gst_wavparse_chain (GstPad *pad, GstBuffer *buf)
         return;
       }
 
-      wavparse->bps = format->wBlockAlign;
-      wavparse->rate = format->dwSamplesPerSec;
-      wavparse->channels = format->wChannels;
-      wavparse->width = format->wBitsPerSample;
-      
       GST_DEBUG (0, "frequency %d, channels %d",
-                format->dwSamplesPerSec, format->wChannels); 
+                wavparse->rate, wavparse->channels); 
 
       /* we're now looking for the data chunk */
       wavparse->state = GST_WAVPARSE_CHUNK_DATA;