summaryrefslogtreecommitdiffstats
path: root/gst/avi/gstavidemux.c
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-04-16 01:20:44 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-04-16 01:20:44 +0000
commit26fe995a13344eb94b444b6356192681df7e41d4 (patch)
tree29efb3fbf2b506f5eafc0df146e4a851dd18314b /gst/avi/gstavidemux.c
parent9369abcfa0aaee7626751778e98743817a42258a (diff)
gst/: Add MS RLE support. I added some functions to read out strf chunks into strf chunks and the data behind it. Thi...
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.
Diffstat (limited to 'gst/avi/gstavidemux.c')
-rw-r--r--gst/avi/gstavidemux.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c
index 23956e42..11f09daf 100644
--- a/gst/avi/gstavidemux.c
+++ b/gst/avi/gstavidemux.c
@@ -742,6 +742,7 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
GstRiffRead *riff = GST_RIFF_READ (avi);
guint32 tag;
gst_riff_strh *strh;
+ GstBuffer *extradata = NULL, *initdata = NULL;
gchar *name = NULL, *padname = NULL;
GstCaps *caps = NULL;
GstPadTemplate *templ = NULL;
@@ -775,7 +776,7 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
}
switch (strh->type) {
case GST_RIFF_FCC_vids:
- if (!gst_riff_read_strf_vids (riff, &strf.vids))
+ if (!gst_riff_read_strf_vids_with_data (riff, &strf.vids, &extradata))
return FALSE;
break;
case GST_RIFF_FCC_auds:
@@ -802,6 +803,13 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
}
switch (tag) {
+ case GST_RIFF_TAG_strd:
+ if (initdata)
+ gst_buffer_unref (initdata);
+ if (!gst_riff_read_data (riff, &tag, &initdata))
+ return FALSE;
+ break;
+
case GST_RIFF_TAG_strn:
if (name)
g_free (name);
@@ -814,7 +822,6 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
GST_FOURCC_ARGS (tag));
/* fall-through */
- case GST_RIFF_TAG_strd: /* what is this? */
case GST_RIFF_TAG_JUNK:
if (!gst_riff_read_skip (riff))
return FALSE;
@@ -836,8 +843,8 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
padname = g_strdup_printf ("video_%02d", avi->num_v_streams);
templ = gst_element_class_get_pad_template (klass, "video_%02d");
- caps = gst_riff_create_video_caps (strf.vids->compression, strh,
- strf.vids, &codec_name);
+ caps = gst_riff_create_video_caps_with_data (strf.vids->compression,
+ strh, strf.vids, extradata, initdata, &codec_name);
gst_tag_list_add (list, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
codec_name, NULL);
gst_element_found_tags (GST_ELEMENT (avi), list);
@@ -920,6 +927,12 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
/* auto-negotiates */
gst_element_add_pad (GST_ELEMENT (avi), pad);
+ /* clean something up */
+ if (initdata)
+ gst_buffer_unref (initdata);
+ if (extradata)
+ gst_buffer_unref (extradata);
+
return TRUE;
skip_stream: