gst-libs/gst/riff/riff-media.c: Add DIB fourcc (raw, palettized 8-bit RGB).
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>
Sat, 2 Oct 2004 14:10:19 +0000 (14:10 +0000)
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>
Sat, 2 Oct 2004 14:10:19 +0000 (14:10 +0000)
Original commit message from CVS:
* gst-libs/gst/riff/riff-media.c:
(gst_riff_create_video_caps_with_data),
(gst_riff_create_video_template_caps):
Add DIB fourcc (raw, palettized 8-bit RGB).
* gst-libs/gst/riff/riff-read.c:
(gst_riff_read_strf_vids_with_data):
Oops, fix strf_data reading bug.
* gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
Use a non-NULL tag.
* gst/qtdemux/qtdemux.c: (qtdemux_parse_trak):
Time for hacks. Sorry Dave. At least one quicktime movie (a
trailer) that I've encountered contains multiple video tracks.
One of those is the actual video track, the other are one-frame
tracks (images). Unfortunately, the number of frames according
to the trak header is 1 for each, so that doesn't help. So
instead, I look at the duration and discard tracks with a
duration shorter than 20% of the length of the stream. Better
than nothing.

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

index 754fc27614f9577b7ceabcf4a52d74d2196b68c8..828166a264b7186ca0a241f91cd3cfb42f97002b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2004-10-02  Ronald S. Bultje  <rbultje@ronald.bitfreak.net>
+
+       * gst-libs/gst/riff/riff-media.c:
+       (gst_riff_create_video_caps_with_data),
+       (gst_riff_create_video_template_caps):
+         Add DIB fourcc (raw, palettized 8-bit RGB).
+       * gst-libs/gst/riff/riff-read.c:
+       (gst_riff_read_strf_vids_with_data):
+         Oops, fix strf_data reading bug.
+       * gst/avi/gstavidemux.c: (gst_avi_demux_add_stream):
+         Use a non-NULL tag.
+       * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak):
+         Time for hacks. Sorry Dave. At least one quicktime movie (a
+         trailer) that I've encountered contains multiple video tracks.
+         One of those is the actual video track, the other are one-frame
+         tracks (images). Unfortunately, the number of frames according
+         to the trak header is 1 for each, so that doesn't help. So
+         instead, I look at the duration and discard tracks with a
+         duration shorter than 20% of the length of the stream. Better
+         than nothing.
+
 2004-10-01  Christian Schaller <christian@fluendo.com>
 
        * Patch fra Phil Blundell 
index 040f203dc838a92b0ce0fd815a3c599f6e1184d2..7e6c4dbc4c50884cd439a04e32c364bd2005f2ba 100644 (file)
@@ -46,8 +46,19 @@ gst_riff_create_video_caps_with_data (guint32 codec_fcc,
     GstBuffer * strf_data, GstBuffer * strd_data, char **codec_name)
 {
   GstCaps *caps = NULL;
+  GstBuffer *palette = NULL;
 
   switch (codec_fcc) {
+    case GST_MAKE_FOURCC ('D', 'I', 'B', ' '):
+      caps = gst_caps_new_simple ("video/x-raw-rgb",
+          "bpp", G_TYPE_INT, 8,
+          "depth", G_TYPE_INT, 8, "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL);
+      palette = strf_data;
+      strf_data = NULL;
+      if (codec_name)
+        *codec_name = g_strdup ("Palettized 8-bit RGB");
+      break;
+
     case GST_MAKE_FOURCC ('I', '4', '2', '0'):
       caps = gst_caps_new_simple ("video/x-raw-yuv",
           "format", GST_TYPE_FOURCC, codec_fcc, NULL);
@@ -267,26 +278,8 @@ gst_riff_create_video_caps_with_data (guint32 codec_fcc,
     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);
-        strf_data = NULL;       /* used */
-      }
+      palette = strf_data;
+      strf_data = NULL;
       if (strf) {
         gst_caps_set_simple (caps,
             "depth", G_TYPE_INT, (gint) strf->bit_cnt, NULL);
@@ -328,6 +321,22 @@ gst_riff_create_video_caps_with_data (guint32 codec_fcc,
         strf_data ? strf_data : strd_data, NULL);
   }
 
+  /* palette */
+  if (palette && GST_BUFFER_SIZE (palette) >= 256 * 4) {
+    GstBuffer *copy = gst_buffer_copy (palette);
+
+#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
+    gst_caps_set_simple (caps, "palette_data", GST_TYPE_BUFFER, copy, NULL);
+    gst_buffer_unref (copy);
+  }
+
   return caps;
 }
 
@@ -557,6 +566,7 @@ gst_riff_create_video_template_caps (void)
     GST_MAKE_FOURCC ('c', 'v', 'i', 'd'),
     GST_MAKE_FOURCC ('m', 's', 'v', 'c'),
     GST_MAKE_FOURCC ('R', 'L', 'E', ' '),
+    GST_MAKE_FOURCC ('D', 'I', 'B', ' '),
     /* FILL ME */
     0
   };
index 54e79ff073e0e084017db4927f117d89ccfd5ad5..97c51f0d4362222589a8844c87021c4cf82a9980 100644 (file)
@@ -582,9 +582,9 @@ gst_riff_read_strf_vids_with_data (GstRiffRead * riff,
   } else if (strf->size < GST_BUFFER_SIZE (buf)) {
     gint len;
 
-    len = GST_BUFFER_SIZE (buf) - strf->size - 2;
+    len = GST_BUFFER_SIZE (buf) - strf->size;
     if (len > 0) {
-      *extradata = gst_buffer_create_sub (buf, strf->size + 2, len);
+      *extradata = gst_buffer_create_sub (buf, strf->size, len);
     }
   }