summaryrefslogtreecommitdiff
path: root/gst-libs
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-10-02 14:10:19 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-10-02 14:10:19 +0000
commitc0f56f20024306a195fbc76b0ee1787a75c108e2 (patch)
tree7478209aaf7c93b8b8fd762f667c533481312ae5 /gst-libs
parentc75f21b6b75442847d34875d7fc19024eed36742 (diff)
gst-libs/gst/riff/riff-media.c: Add DIB fourcc (raw, palettized 8-bit RGB).
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.
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/riff/riff-media.c50
-rw-r--r--gst-libs/gst/riff/riff-read.c4
2 files changed, 32 insertions, 22 deletions
diff --git a/gst-libs/gst/riff/riff-media.c b/gst-libs/gst/riff/riff-media.c
index 040f203d..7e6c4dbc 100644
--- a/gst-libs/gst/riff/riff-media.c
+++ b/gst-libs/gst/riff/riff-media.c
@@ -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
};
diff --git a/gst-libs/gst/riff/riff-read.c b/gst-libs/gst/riff/riff-read.c
index 54e79ff0..97c51f0d 100644
--- a/gst-libs/gst/riff/riff-read.c
+++ b/gst-libs/gst/riff/riff-read.c
@@ -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);
}
}