mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-18 14:26:43 +00:00
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.
This commit is contained in:
parent
7cc3870176
commit
a9619b37f2
3 changed files with 53 additions and 22 deletions
21
ChangeLog
21
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>
|
2004-10-01 Christian Schaller <christian@fluendo.com>
|
||||||
|
|
||||||
* Patch fra Phil Blundell
|
* Patch fra Phil Blundell
|
||||||
|
|
|
@ -46,8 +46,19 @@ gst_riff_create_video_caps_with_data (guint32 codec_fcc,
|
||||||
GstBuffer * strf_data, GstBuffer * strd_data, char **codec_name)
|
GstBuffer * strf_data, GstBuffer * strd_data, char **codec_name)
|
||||||
{
|
{
|
||||||
GstCaps *caps = NULL;
|
GstCaps *caps = NULL;
|
||||||
|
GstBuffer *palette = NULL;
|
||||||
|
|
||||||
switch (codec_fcc) {
|
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'):
|
case GST_MAKE_FOURCC ('I', '4', '2', '0'):
|
||||||
caps = gst_caps_new_simple ("video/x-raw-yuv",
|
caps = gst_caps_new_simple ("video/x-raw-yuv",
|
||||||
"format", GST_TYPE_FOURCC, codec_fcc, NULL);
|
"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? */
|
case GST_MAKE_FOURCC (0x1, 0x0, 0x0, 0x0): /* why, why, why? */
|
||||||
caps = gst_caps_new_simple ("video/x-rle",
|
caps = gst_caps_new_simple ("video/x-rle",
|
||||||
"layout", G_TYPE_STRING, "microsoft", NULL);
|
"layout", G_TYPE_STRING, "microsoft", NULL);
|
||||||
if (strf_data && GST_BUFFER_SIZE (strf_data) >= 256 * 4) {
|
palette = strf_data;
|
||||||
GstBuffer *copy = gst_buffer_copy (strf_data);
|
strf_data = NULL;
|
||||||
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 */
|
|
||||||
}
|
|
||||||
if (strf) {
|
if (strf) {
|
||||||
gst_caps_set_simple (caps,
|
gst_caps_set_simple (caps,
|
||||||
"depth", G_TYPE_INT, (gint) strf->bit_cnt, NULL);
|
"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);
|
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;
|
return caps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -557,6 +566,7 @@ gst_riff_create_video_template_caps (void)
|
||||||
GST_MAKE_FOURCC ('c', 'v', 'i', 'd'),
|
GST_MAKE_FOURCC ('c', 'v', 'i', 'd'),
|
||||||
GST_MAKE_FOURCC ('m', 's', 'v', 'c'),
|
GST_MAKE_FOURCC ('m', 's', 'v', 'c'),
|
||||||
GST_MAKE_FOURCC ('R', 'L', 'E', ' '),
|
GST_MAKE_FOURCC ('R', 'L', 'E', ' '),
|
||||||
|
GST_MAKE_FOURCC ('D', 'I', 'B', ' '),
|
||||||
/* FILL ME */
|
/* FILL ME */
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
|
@ -582,9 +582,9 @@ gst_riff_read_strf_vids_with_data (GstRiffRead * riff,
|
||||||
} else if (strf->size < GST_BUFFER_SIZE (buf)) {
|
} else if (strf->size < GST_BUFFER_SIZE (buf)) {
|
||||||
gint len;
|
gint len;
|
||||||
|
|
||||||
len = GST_BUFFER_SIZE (buf) - strf->size - 2;
|
len = GST_BUFFER_SIZE (buf) - strf->size;
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
*extradata = gst_buffer_create_sub (buf, strf->size + 2, len);
|
*extradata = gst_buffer_create_sub (buf, strf->size, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue