summaryrefslogtreecommitdiffstats
path: root/gst-libs/gst/riff/riff-media.c
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-05-09 15:49:25 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-05-09 15:49:25 +0000
commit3ce13c7d9989d5376f738c0ef057c206dec29bdf (patch)
tree3d7c5beeda63ad78259ce8fb6a71ce139c480c17 /gst-libs/gst/riff/riff-media.c
parent23c774e5a36df7c98c856d59275f6860a8cd7b8f (diff)
downloadgst-plugins-bad-3ce13c7d9989d5376f738c0ef057c206dec29bdf.tar.gz
gst-plugins-bad-3ce13c7d9989d5376f738c0ef057c206dec29bdf.tar.bz2
gst-plugins-bad-3ce13c7d9989d5376f738c0ef057c206dec29bdf.zip
gst-libs/gst/riff/: Fix for unaligned RIFF files (i.e. where all the chunks together in a LIST chunk are not of the s...
Original commit message from CVS: * gst-libs/gst/riff/riff-media.c: (gst_riff_create_video_caps_with_data), (gst_riff_create_audio_caps), (gst_riff_create_audio_template_caps): * gst-libs/gst/riff/riff-read.c: (gst_riff_peek_head): Fix for unaligned RIFF files (i.e. where all the chunks together in a LIST chunk are not of the same size as the size given in the LIST chunk header). Fixes several odd WAVE files. Also fix ADPCM (block_align property) in audio, so that wavparse based on this works now as it used to stand-alone.
Diffstat (limited to 'gst-libs/gst/riff/riff-media.c')
-rw-r--r--gst-libs/gst/riff/riff-media.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/gst-libs/gst/riff/riff-media.c b/gst-libs/gst/riff/riff-media.c
index 2a7529a9..c4636834 100644
--- a/gst-libs/gst/riff/riff-media.c
+++ b/gst-libs/gst/riff/riff-media.c
@@ -323,6 +323,7 @@ GstCaps *
gst_riff_create_audio_caps (guint16 codec_id,
gst_riff_strh * strh, gst_riff_strf_auds * strf, char **codec_name)
{
+ gboolean block_align = FALSE;
GstCaps *caps = NULL;
switch (codec_id) {
@@ -365,6 +366,15 @@ gst_riff_create_audio_caps (guint16 codec_id,
"layout", G_TYPE_STRING, "microsoft", NULL);
if (codec_name)
*codec_name = g_strdup ("ADPCM audio");
+ block_align = TRUE;
+ break;
+
+ case GST_RIFF_WAVE_FORMAT_DVI_ADPCM:
+ caps = gst_caps_new_simple ("audio/x-adpcm",
+ "layout", G_TYPE_STRING, "dvi", NULL);
+ if (codec_name)
+ *codec_name = g_strdup ("DVI ADPCM audio");
+ block_align = TRUE;
break;
case GST_RIFF_WAVE_FORMAT_MULAW:
@@ -413,10 +423,16 @@ gst_riff_create_audio_caps (guint16 codec_id,
gst_caps_set_simple (caps,
"rate", G_TYPE_INT, strf->rate,
"channels", G_TYPE_INT, strf->channels, NULL);
+ if (block_align)
+ gst_caps_set_simple (caps,
+ "block_align", G_TYPE_INT, strf->blockalign, NULL);
} else {
gst_caps_set_simple (caps,
"rate", GST_TYPE_INT_RANGE, 8000, 96000,
"channels", GST_TYPE_INT_RANGE, 1, 2, NULL);
+ if (block_align)
+ gst_caps_set_simple (caps,
+ "block_align", GST_TYPE_INT_RANGE, 1, 8192, NULL);
}
return caps;
@@ -501,6 +517,7 @@ gst_riff_create_audio_template_caps (void)
GST_RIFF_WAVE_FORMAT_ALAW,
GST_RIFF_WAVE_FORMAT_MULAW,
GST_RIFF_WAVE_FORMAT_ADPCM,
+ GST_RIFF_WAVE_FORMAT_DVI_ADPCM,
/* FILL ME */
0
};