summaryrefslogtreecommitdiffstats
path: root/gst-libs
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2004-07-13 10:24:29 +0000
committerWim Taymans <wim.taymans@gmail.com>2004-07-13 10:24:29 +0000
commit666cacd22f4789e97a1f225a3dd1a893953c3086 (patch)
tree059fa72a3d62e27a95c82a8671ae2912c13a0d76 /gst-libs
parent072d23cfb4b55fbece3714dc2491ad52e7accdef (diff)
downloadgst-plugins-bad-666cacd22f4789e97a1f225a3dd1a893953c3086.tar.gz
gst-plugins-bad-666cacd22f4789e97a1f225a3dd1a893953c3086.tar.bz2
gst-plugins-bad-666cacd22f4789e97a1f225a3dd1a893953c3086.zip
gst/: Set codec_data on caps for avidemuxer.
Original commit message from CVS: * gst-libs/gst/riff/riff-media.c: (gst_riff_create_audio_caps_with_data), (gst_riff_create_audio_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_auds_with_data), (gst_riff_read_strf_auds): * gst-libs/gst/riff/riff-read.h: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), (gst_avi_demux_add_stream): Set codec_data on caps for avidemuxer.
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/riff/riff-media.c64
-rw-r--r--gst-libs/gst/riff/riff-media.h7
-rw-r--r--gst-libs/gst/riff/riff-read.c37
-rw-r--r--gst-libs/gst/riff/riff-read.h4
4 files changed, 97 insertions, 15 deletions
diff --git a/gst-libs/gst/riff/riff-media.c b/gst-libs/gst/riff/riff-media.c
index 4a9ad87f..313c9594 100644
--- a/gst-libs/gst/riff/riff-media.c
+++ b/gst-libs/gst/riff/riff-media.c
@@ -330,10 +330,11 @@ gst_riff_create_video_caps (guint32 codec_fcc,
}
GstCaps *
-gst_riff_create_audio_caps (guint16 codec_id,
- gst_riff_strh * strh, gst_riff_strf_auds * strf, char **codec_name)
+gst_riff_create_audio_caps_with_data (guint16 codec_id,
+ gst_riff_strh * strh, gst_riff_strf_auds * strf,
+ GstBuffer * strf_data, GstBuffer * strd_data, char **codec_name)
{
- gboolean block_align = FALSE;
+ gboolean block_align = FALSE, rate_chan = TRUE;
GstCaps *caps = NULL;
gint rate_min = 8000, rate_max = 96000;
gint channels_max = 2;
@@ -426,32 +427,71 @@ gst_riff_create_audio_caps (guint16 codec_id,
if (codec_name)
*codec_name = g_strdup ("AC3");
break;
+ case GST_RIFF_WAVE_FORMAT_WMAV1:
+ case GST_RIFF_WAVE_FORMAT_WMAV2:
+ {
+ gint version = codec_id == GST_RIFF_WAVE_FORMAT_WMAV1 ? 1 : 2;
+
+ block_align = TRUE;
+
+ caps = gst_caps_new_simple ("audio/x-wma",
+ "wmaversion", G_TYPE_INT, version, NULL);
+
+ if (codec_name)
+ *codec_name = g_strdup_printf ("WMA Version %d", version);
+ if (strf != NULL) {
+ gst_caps_set_simple (caps,
+ "bitrate", G_TYPE_INT, strf->av_bps * 8, NULL);
+ } else {
+ gst_caps_set_simple (caps,
+ "bitrate", GST_TYPE_INT_RANGE, 0, G_MAXINT, NULL);
+ }
+ if (strf_data) {
+ gst_caps_set_simple (caps,
+ "codec_data", GST_TYPE_BUFFER, strf_data, NULL);
+ }
+ break;
+ }
default:
GST_WARNING ("Unknown audio tag 0x%04x", codec_id);
return NULL;
}
if (strf != NULL) {
- gst_caps_set_simple (caps,
- "rate", G_TYPE_INT, strf->rate,
- "channels", G_TYPE_INT, strf->channels, NULL);
- if (block_align)
+ if (rate_chan) {
+ 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, rate_min, rate_max,
- "channels", GST_TYPE_INT_RANGE, 1, channels_max, NULL);
- if (block_align)
+ if (rate_chan) {
+ gst_caps_set_simple (caps,
+ "rate", GST_TYPE_INT_RANGE, rate_min, rate_max,
+ "channels", GST_TYPE_INT_RANGE, 1, channels_max, NULL);
+ }
+ if (block_align) {
gst_caps_set_simple (caps,
"block_align", GST_TYPE_INT_RANGE, 1, 8192, NULL);
+ }
}
return caps;
}
GstCaps *
+gst_riff_create_audio_caps (guint16 codec_id,
+ gst_riff_strh * strh, gst_riff_strf_auds * strf, char **codec_name)
+{
+ return gst_riff_create_audio_caps_with_data (codec_id,
+ strh, strf, NULL, NULL, codec_name);
+}
+
+GstCaps *
gst_riff_create_iavs_caps (guint32 codec_fcc,
gst_riff_strh * strh, gst_riff_strf_iavs * strf, char **codec_name)
{
@@ -533,6 +573,8 @@ gst_riff_create_audio_template_caps (void)
GST_RIFF_WAVE_FORMAT_MULAW,
GST_RIFF_WAVE_FORMAT_ADPCM,
GST_RIFF_WAVE_FORMAT_DVI_ADPCM,
+ GST_RIFF_WAVE_FORMAT_WMAV1,
+ GST_RIFF_WAVE_FORMAT_WMAV2,
/* FILL ME */
0
};
diff --git a/gst-libs/gst/riff/riff-media.h b/gst-libs/gst/riff/riff-media.h
index 22c72fe6..6ff3ea1b 100644
--- a/gst-libs/gst/riff/riff-media.h
+++ b/gst-libs/gst/riff/riff-media.h
@@ -57,6 +57,13 @@ gst_riff_create_video_caps_with_data (guint32 codec_fcc,
GstBuffer * strd_data,
char ** codec_name);
+GstCaps *
+gst_riff_create_audio_caps_with_data (guint16 codec_id,
+ gst_riff_strh * strh,
+ gst_riff_strf_auds * strf,
+ GstBuffer * strf_data,
+ GstBuffer * strd_data,
+ char ** codec_name);
/*
* Create template caps (includes all known types).
*/
diff --git a/gst-libs/gst/riff/riff-read.c b/gst-libs/gst/riff/riff-read.c
index be3e10da..405324ab 100644
--- a/gst-libs/gst/riff/riff-read.c
+++ b/gst-libs/gst/riff/riff-read.c
@@ -551,8 +551,8 @@ gst_riff_read_strf_vids_with_data (GstRiffRead * riff,
strf->size, GST_BUFFER_SIZE (buf));
strf->size = GST_BUFFER_SIZE (buf);
} else if (strf->size < GST_BUFFER_SIZE (buf)) {
- *extradata = gst_buffer_create_sub (buf, strf->size,
- GST_BUFFER_SIZE (buf) - strf->size);
+ *extradata = gst_buffer_create_sub (buf, strf->size + 2,
+ GST_BUFFER_SIZE (buf) - strf->size - 2);
}
/* debug */
@@ -582,7 +582,6 @@ gst_riff_read_strf_vids_with_data (GstRiffRead * riff,
/*
* Obsolete, use gst_riff_read_strf_vids_with_data ().
*/
-
gboolean
gst_riff_read_strf_vids (GstRiffRead * riff, gst_riff_strf_vids ** header)
{
@@ -597,7 +596,8 @@ gst_riff_read_strf_vids (GstRiffRead * riff, gst_riff_strf_vids ** header)
}
gboolean
-gst_riff_read_strf_auds (GstRiffRead * riff, gst_riff_strf_auds ** header)
+gst_riff_read_strf_auds_with_data (GstRiffRead * riff,
+ gst_riff_strf_auds ** header, GstBuffer ** extradata)
{
guint32 tag;
GstBuffer *buf;
@@ -629,6 +629,17 @@ gst_riff_read_strf_auds (GstRiffRead * riff, gst_riff_strf_auds ** header)
strf->size = GUINT16_FROM_LE (strf->size);
#endif
+ /* size checking */
+ *extradata = NULL;
+ if (strf->size > GST_BUFFER_SIZE (buf)) {
+ g_warning ("strf_auds header gave %d bytes data, only %d available",
+ strf->size, GST_BUFFER_SIZE (buf));
+ strf->size = GST_BUFFER_SIZE (buf);
+ } else if (strf->size < GST_BUFFER_SIZE (buf)) {
+ *extradata = gst_buffer_create_sub (buf, strf->size + 2,
+ GST_BUFFER_SIZE (buf) - strf->size - 2);
+ }
+
/* debug */
GST_INFO ("strf tag found in context auds:");
GST_INFO (" format %d", strf->format);
@@ -637,6 +648,8 @@ gst_riff_read_strf_auds (GstRiffRead * riff, gst_riff_strf_auds ** header)
GST_INFO (" av_bps %d", strf->av_bps);
GST_INFO (" blockalign %d", strf->blockalign);
GST_INFO (" size %d", strf->size); /* wordsize, not extrasize! */
+ if (*extradata)
+ GST_INFO (" %d bytes extra_data", GST_BUFFER_SIZE (*extradata));
gst_buffer_unref (buf);
@@ -645,6 +658,22 @@ gst_riff_read_strf_auds (GstRiffRead * riff, gst_riff_strf_auds ** header)
return TRUE;
}
+/*
+ * Obsolete, use gst_riff_read_strf_auds_with_data ().
+ */
+gboolean
+gst_riff_read_strf_auds (GstRiffRead * riff, gst_riff_strf_auds ** header)
+{
+ GstBuffer *data = NULL;
+ gboolean ret;
+
+ ret = gst_riff_read_strf_auds_with_data (riff, header, &data);
+ if (data)
+ gst_buffer_unref (data);
+
+ return ret;
+}
+
gboolean
gst_riff_read_strf_iavs (GstRiffRead * riff, gst_riff_strf_iavs ** header)
{
diff --git a/gst-libs/gst/riff/riff-read.h b/gst-libs/gst/riff/riff-read.h
index f3a6feb9..d44c4ed7 100644
--- a/gst-libs/gst/riff/riff-read.h
+++ b/gst-libs/gst/riff/riff-read.h
@@ -98,6 +98,10 @@ gboolean gst_riff_read_strf_vids_with_data
GstBuffer **extradata);
gboolean gst_riff_read_strf_auds (GstRiffRead *riff,
gst_riff_strf_auds **header);
+gboolean gst_riff_read_strf_auds_with_data
+ (GstRiffRead *riff,
+ gst_riff_strf_auds **header,
+ GstBuffer **extradata);
gboolean gst_riff_read_strf_iavs (GstRiffRead *riff,
gst_riff_strf_iavs **header);
gboolean gst_riff_read_info (GstRiffRead *riff);