summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2017-01-20 12:41:16 +0200
committerSebastian Dröge <sebastian@centricular.com>2017-01-25 14:24:18 +0200
commite10b20fec14f6265c91056b22417e2a85c878575 (patch)
tree0aeb1ca70f883bc9c3dfc1953883928b9bf67e9d
parentcb6cbf4d6ca4e4815322976e9e119cd492ad8c34 (diff)
downloadgstreamer-plugins-base-e10b20fec14f6265c91056b22417e2a85c878575.tar.gz
riff-media: Don't divide block align by zero channels
https://bugzilla.gnome.org/show_bug.cgi?id=777525
-rw-r--r--gst-libs/gst/riff/riff-media.c36
1 files changed, 21 insertions, 15 deletions
diff --git a/gst-libs/gst/riff/riff-media.c b/gst-libs/gst/riff/riff-media.c
index 3b6a48f5c..a6c2bad20 100644
--- a/gst-libs/gst/riff/riff-media.c
+++ b/gst-libs/gst/riff/riff-media.c
@@ -1299,22 +1299,28 @@ gst_riff_create_audio_caps (guint16 codec_id,
if (strf != NULL) {
gint ba = strf->blockalign;
gint ch = strf->channels;
- gint wd = ba * 8 / ch;
- caps = gst_caps_new_simple ("audio/x-raw",
- "format", G_TYPE_STRING, wd == 64 ? "F64LE" : "F32LE",
- "layout", G_TYPE_STRING, "interleaved",
- "channels", G_TYPE_INT, ch, NULL);
-
- /* Add default channel layout. We know no default layout for more than
- * 8 channels. */
- if (ch > 8)
- GST_WARNING ("don't know default layout for %d channels", ch);
- else if (gst_riff_wave_add_default_channel_mask (caps, ch,
- channel_reorder_map))
- GST_DEBUG ("using default channel layout for %d channels", ch);
- else
- GST_WARNING ("failed to add channel layout");
+ if (ba > 0 && ch > 0 && (ba == (64 / 8) * ch || ba == (32 / 8) * ch)) {
+ gint wd = ba * 8 / ch;
+
+ caps = gst_caps_new_simple ("audio/x-raw",
+ "format", G_TYPE_STRING, wd == 64 ? "F64LE" : "F32LE",
+ "layout", G_TYPE_STRING, "interleaved",
+ "channels", G_TYPE_INT, ch, NULL);
+
+ /* Add default channel layout. We know no default layout for more than
+ * 8 channels. */
+ if (ch > 8)
+ GST_WARNING ("don't know default layout for %d channels", ch);
+ else if (gst_riff_wave_add_default_channel_mask (caps, ch,
+ channel_reorder_map))
+ GST_DEBUG ("using default channel layout for %d channels", ch);
+ else
+ GST_WARNING ("failed to add channel layout");
+ } else {
+ GST_WARNING ("invalid block align %d or channel count %d", ba, ch);
+ return NULL;
+ }
} else {
/* FIXME: this is pretty useless - we need fixed caps */
caps = gst_caps_from_string ("audio/x-raw, "