gst/: Add MS RLE support. I added some functions to read out strf chunks into strf...
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>
Fri, 16 Apr 2004 01:20:43 +0000 (01:20 +0000)
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>
Fri, 16 Apr 2004 01:20:43 +0000 (01:20 +0000)
Original commit message from CVS:
reviewed by: <delete if not using a buddy>
* gst-libs/gst/riff/riff-media.c:
(gst_riff_create_video_caps_with_data),
(gst_riff_create_video_caps), (gst_riff_create_audio_caps),
(gst_riff_create_video_template_caps),
(gst_riff_create_audio_template_caps):
* gst-libs/gst/riff/riff-media.h:
* gst-libs/gst/riff/riff-read.c:
(gst_riff_read_strf_vids_with_data), (gst_riff_read_strf_vids):
* gst-libs/gst/riff/riff-read.h:
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
Add MS RLE support. I added some functions to read out strf chunks
into strf chunks and the data behind it. This is usually color
palettes (as in RLE, but also in 8-bit RGB). Also use those during
caps creation. Lastly, add ADPCM (similar to wavparse - which
should eventually be rifflib based).
* gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init),
(gst_matroska_demux_init), (gst_matroska_demux_reset):
* gst/matroska/matroska-demux.h:
Remove placeholders for some prehistoric tagging system. Didn't add
support for any tag system really anyway.
* gst/qtdemux/qtdemux.c:
Add support for audio/x-m4a (MPEG-4) through spider.
* gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt),
(gst_wavparse_loop):
ADPCM support (#135862). Increase max. buffer size because we
cannot split buffers for ADPCM (screws references) and I've seen
files with 2048 byte chunks. 4096 seems safe for now.

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

index e098e2b..4c4bd4c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,35 @@
+2004-04-15  Ronald Bultje  <rbultje@ronald.bitfreak.net>
+
+       reviewed by: <delete if not using a buddy>
+
+       * gst-libs/gst/riff/riff-media.c:
+       (gst_riff_create_video_caps_with_data),
+       (gst_riff_create_video_caps), (gst_riff_create_audio_caps),
+       (gst_riff_create_video_template_caps),
+       (gst_riff_create_audio_template_caps):
+       * gst-libs/gst/riff/riff-media.h:
+       * gst-libs/gst/riff/riff-read.c:
+       (gst_riff_read_strf_vids_with_data), (gst_riff_read_strf_vids):
+       * gst-libs/gst/riff/riff-read.h:
+       * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
+         Add MS RLE support. I added some functions to read out strf chunks
+         into strf chunks and the data behind it. This is usually color
+         palettes (as in RLE, but also in 8-bit RGB). Also use those during
+         caps creation. Lastly, add ADPCM (similar to wavparse - which
+         should eventually be rifflib based).
+       * gst/matroska/matroska-demux.c: (gst_matroska_demux_class_init),
+       (gst_matroska_demux_init), (gst_matroska_demux_reset):
+       * gst/matroska/matroska-demux.h:
+         Remove placeholders for some prehistoric tagging system. Didn't add
+         support for any tag system really anyway.
+       * gst/qtdemux/qtdemux.c:
+         Add support for audio/x-m4a (MPEG-4) through spider.
+       * gst/wavparse/gstwavparse.c: (gst_wavparse_parse_fmt),
+       (gst_wavparse_loop):
+         ADPCM support (#135862). Increase max. buffer size because we
+         cannot split buffers for ADPCM (screws references) and I've seen
+         files with 2048 byte chunks. 4096 seems safe for now.
+
 2004-04-15  Thomas Vander Stichele  <thomas at apestaart dot org>
 
        * configure.ac: bump nano to 1
index 4da3697..621b05e 100644 (file)
 #include "riff-ids.h"
 #include "riff-media.h"
 
+/**
+ * gst_riff_create_video_caps_with_data:
+ * @codec_fcc: fourCC codec for this codec.
+ * @strh: pointer to the strh stream header structure.
+ * @strf: pointer to the strf stream header structure, including any
+ *        data that is within the range of strf.size, but excluding any
+ *        additional data withint this chunk but outside strf.size.
+ * @strf_data: a #GstBuffer containing the additional data in the strf
+ *             chunk outside reach of strf.size. Ususally a palette.
+ * @strd_data: a #GstBuffer containing the data in the strd stream header
+ *             chunk. Usually codec initialization data.
+ * @codec_name: if given, will be filled with a human-readable codec name.
+ */
+
 GstCaps *
-gst_riff_create_video_caps (guint32 codec_fcc,
-    gst_riff_strh * strh, gst_riff_strf_vids * strf, char **codec_name)
+gst_riff_create_video_caps_with_data (guint32 codec_fcc,
+    gst_riff_strh * strh, gst_riff_strf_vids * strf,
+    GstBuffer * strf_data, GstBuffer * strd_data, char **codec_name)
 {
   GstCaps *caps = NULL;
 
@@ -39,6 +54,7 @@ gst_riff_create_video_caps (guint32 codec_fcc,
       if (codec_name)
         *codec_name = g_strdup ("Uncompressed planar YUV 4:2:0");
       break;
+
     case GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'):
       caps = gst_caps_new_simple ("video/x-raw-yuv",
           "format", GST_TYPE_FOURCC, codec_fcc, NULL);
@@ -51,6 +67,7 @@ gst_riff_create_video_caps (guint32 codec_fcc,
       if (codec_name)
         *codec_name = g_strdup ("Motion JPEG");
       break;
+
     case GST_MAKE_FOURCC ('J', 'P', 'E', 'G'): /* generic (mostly RGB) MJPEG */
       caps = gst_caps_new_simple ("image/jpeg", NULL);
       if (codec_name)
@@ -84,31 +101,37 @@ gst_riff_create_video_caps (guint32 codec_fcc,
       if (codec_name)
         *codec_name = g_strdup ("ITU H.26n");
       break;
+
     case GST_MAKE_FOURCC ('i', '2', '6', '3'):
       caps = gst_caps_new_simple ("video/x-h263", NULL);
       if (codec_name)
         *codec_name = g_strdup ("ITU H.263");
       break;
+
     case GST_MAKE_FOURCC ('L', '2', '6', '3'):
       caps = gst_caps_new_simple ("video/x-h263", NULL);
       if (codec_name)
         *codec_name = g_strdup ("Lead H.263");
       break;
+
     case GST_MAKE_FOURCC ('M', '2', '6', '3'):
       caps = gst_caps_new_simple ("video/x-h263", NULL);
       if (codec_name)
         *codec_name = g_strdup ("Microsoft H.263");
       break;
+
     case GST_MAKE_FOURCC ('V', 'D', 'O', 'W'):
       caps = gst_caps_new_simple ("video/x-h263", NULL);
       if (codec_name)
         *codec_name = g_strdup ("VDOLive");
       break;
+
     case GST_MAKE_FOURCC ('V', 'I', 'V', 'O'):
       caps = gst_caps_new_simple ("video/x-h263", NULL);
       if (codec_name)
         *codec_name = g_strdup ("Vivo H.263");
       break;
+
     case GST_MAKE_FOURCC ('x', '2', '6', '3'):
       caps = gst_caps_new_simple ("video/x-h263", NULL);
       if (codec_name)
@@ -124,6 +147,7 @@ gst_riff_create_video_caps (guint32 codec_fcc,
       if (codec_name)
         *codec_name = g_strdup ("DivX MS-MPEG-4 Version 3");
       break;
+
     case GST_MAKE_FOURCC ('d', 'i', 'v', 'x'):
     case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'):
       caps = gst_caps_new_simple ("video/x-divx",
@@ -131,6 +155,7 @@ gst_riff_create_video_caps (guint32 codec_fcc,
       if (codec_name)
         *codec_name = g_strdup ("DivX MPEG-4 Version 4");
       break;
+
     case GST_MAKE_FOURCC ('D', 'X', '5', '0'):
       caps = gst_caps_new_simple ("video/x-divx",
           "divxversion", G_TYPE_INT, 5, NULL);
@@ -220,6 +245,40 @@ gst_riff_create_video_caps (guint32 codec_fcc,
         *codec_name = g_strdup ("MS video v1");
       break;
 
+    case GST_MAKE_FOURCC ('R', 'L', 'E', ' '):
+    case GST_MAKE_FOURCC ('m', 'r', 'l', 'e'):
+    case GST_MAKE_FOURCC (0x1, 0x0, 0x0, 0x0): /* why, why, why? */
+      caps = gst_caps_new_simple ("video/x-rle",
+          "layout", G_TYPE_STRING, "microsoft", NULL);
+      if (strf_data && GST_BUFFER_SIZE (strf_data) >= 256 * 4) {
+        GstBuffer *copy = gst_buffer_copy (strf_data);
+        GValue value = { 0 };
+
+#if (G_BYTE_ORDER == G_BIG_ENDIAN)
+        gint n;
+        guint32 *data = (guint32 *) GST_BUFFER_DATA (copy);
+
+        /* own endianness */
+        for (n = 0; n < 256; n++)
+          data[n] = GUINT32_FROM_LE (data[n]);
+#endif
+        g_value_init (&value, GST_TYPE_BUFFER);
+        g_value_set_boxed (&value, copy);
+        gst_structure_set_value (gst_caps_get_structure (caps, 0),
+            "palette_data", &value);
+        g_value_unset (&value);
+        gst_buffer_unref (copy);
+      }
+      if (strf) {
+        gst_caps_set_simple (caps,
+            "depth", G_TYPE_INT, (gint) strf->bit_cnt, NULL);
+      } else {
+        gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 1, 64, NULL);
+      }
+      if (codec_name)
+        *codec_name = g_strdup ("Mcrosoft RLE");
+      break;
+
     default:
       GST_WARNING ("Unkown video fourcc " GST_FOURCC_FORMAT,
           GST_FOURCC_ARGS (codec_fcc));
@@ -249,6 +308,14 @@ gst_riff_create_video_caps (guint32 codec_fcc,
 }
 
 GstCaps *
+gst_riff_create_video_caps (guint32 codec_fcc,
+    gst_riff_strh * strh, gst_riff_strf_vids * strf, char **codec_name)
+{
+  return gst_riff_create_video_caps_with_data (codec_fcc,
+      strh, strf, NULL, NULL, codec_name);
+}
+
+GstCaps *
 gst_riff_create_audio_caps (guint16 codec_id,
     gst_riff_strh * strh, gst_riff_strf_auds * strf, char **codec_name)
 {
@@ -289,6 +356,13 @@ gst_riff_create_audio_caps (guint16 codec_id,
         *codec_name = g_strdup ("Uncompressed PCM audio");
       break;
 
+    case GST_RIFF_WAVE_FORMAT_ADPCM:
+      caps = gst_caps_new_simple ("audio/x-adpcm",
+          "layout", G_TYPE_STRING, "microsoft", NULL);
+      if (codec_name)
+        *codec_name = g_strdup ("ADPCM audio");
+      break;
+
     case GST_RIFF_WAVE_FORMAT_MULAW:
       if (strf != NULL && strf->size != 8) {
         GST_WARNING ("invalid depth (%d) of mulaw audio, overwriting.",
@@ -394,6 +468,7 @@ gst_riff_create_video_template_caps (void)
     GST_MAKE_FOURCC ('3', 'I', 'V', '1'),
     GST_MAKE_FOURCC ('c', 'v', 'i', 'd'),
     GST_MAKE_FOURCC ('m', 's', 'v', 'c'),
+    GST_MAKE_FOURCC ('R', 'L', 'E', ' '),
     /* FILL ME */
     0
   };
@@ -421,6 +496,7 @@ gst_riff_create_audio_template_caps (void)
     GST_RIFF_WAVE_FORMAT_A52,
     GST_RIFF_WAVE_FORMAT_ALAW,
     GST_RIFF_WAVE_FORMAT_MULAW,
+    GST_RIFF_WAVE_FORMAT_ADPCM,
     /* FILL ME */
     0
   };
index 220671a..22c72fe 100644 (file)
@@ -46,6 +46,18 @@ GstCaps *gst_riff_create_iavs_caps  (guint32             codec_fcc,
                                     char **codec_name);
 
 /*
+ * Extended...
+ */
+
+GstCaps *
+gst_riff_create_video_caps_with_data (guint32              codec_fcc,
+                                     gst_riff_strh      * strh,
+                                     gst_riff_strf_vids * strf,
+                                     GstBuffer          * strf_data,
+                                     GstBuffer          * strd_data,
+                                     char              ** codec_name);
+
+/*
  * Create template caps (includes all known types).
  */
 
index 0eed624..a86ec86 100644 (file)
@@ -458,7 +458,8 @@ gst_riff_read_strh (GstRiffRead * riff, gst_riff_strh ** header)
 }
 
 gboolean
-gst_riff_read_strf_vids (GstRiffRead * riff, gst_riff_strf_vids ** header)
+gst_riff_read_strf_vids_with_data (GstRiffRead * riff,
+    gst_riff_strf_vids ** header, GstBuffer ** extradata)
 {
   guint32 tag;
   GstBuffer *buf;
@@ -496,10 +497,14 @@ gst_riff_read_strf_vids (GstRiffRead * riff, gst_riff_strf_vids ** header)
 #endif
 
   /* size checking */
+  *extradata = NULL;
   if (strf->size > GST_BUFFER_SIZE (buf)) {
     g_warning ("strf_vids header gave %d bytes data, only %d available",
         strf->size, GST_BUFFER_SIZE (buf));
     strf->size = GST_BUFFER_SIZE (buf);
+  } else if (strf->size < GST_BUFFER_SIZE (buf)) {
+    *extradata = gst_buffer_create_sub (buf, strf->size,
+        GST_BUFFER_SIZE (buf) - strf->size);
   }
 
   /* debug */
@@ -516,6 +521,8 @@ gst_riff_read_strf_vids (GstRiffRead * riff, gst_riff_strf_vids ** header)
   GST_INFO (" ypels_meter %d", strf->ypels_meter);
   GST_INFO (" num_colors  %d", strf->num_colors);
   GST_INFO (" imp_colors  %d", strf->imp_colors);
+  if (*extradata)
+    GST_INFO (" %d bytes extra_data", GST_BUFFER_SIZE (*extradata));
 
   gst_buffer_unref (buf);
 
@@ -524,6 +531,23 @@ gst_riff_read_strf_vids (GstRiffRead * riff, gst_riff_strf_vids ** header)
   return TRUE;
 }
 
+/*
+ * Obsolete, use gst_riff_read_strf_vids_with_data ().
+ */
+
+gboolean
+gst_riff_read_strf_vids (GstRiffRead * riff, gst_riff_strf_vids ** header)
+{
+  GstBuffer *data = NULL;
+  gboolean ret;
+
+  ret = gst_riff_read_strf_vids_with_data (riff, header, &data);
+  if (data)
+    gst_buffer_unref (data);
+
+  return ret;
+}
+
 gboolean
 gst_riff_read_strf_auds (GstRiffRead * riff, gst_riff_strf_auds ** header)
 {
index 9c663cc..d0c09b8 100644 (file)
@@ -86,6 +86,10 @@ gboolean gst_riff_read_strh      (GstRiffRead *riff,
                                  gst_riff_strh **header);
 gboolean gst_riff_read_strf_vids (GstRiffRead *riff,
                                  gst_riff_strf_vids **header);
+gboolean gst_riff_read_strf_vids_with_data
+                                (GstRiffRead *riff,
+                                 gst_riff_strf_vids **header,
+                                 GstBuffer  **extradata);
 gboolean gst_riff_read_strf_auds (GstRiffRead *riff,
                                  gst_riff_strf_auds **header);
 gboolean gst_riff_read_strf_iavs (GstRiffRead *riff,