block_align = (int) g_ascii_strtoull (block_align_str, NULL, 10);
if (!codec_data) {
- GstMapInfo mapinfo;
+ gint codec_data_len;
codec_data_str = (gchar *) xmlGetProp (node, (xmlChar *) "WaveFormatEx");
- if (codec_data_str && strlen (codec_data_str)) {
+ codec_data_len = strlen (codec_data_str) / 2;
+
+ /* a WAVEFORMATEX structure is 18 bytes */
+ if (codec_data_str && codec_data_len >= 18) {
+ GstMapInfo mapinfo;
codec_data = gst_buffer_from_hex_string ((gchar *) codec_data_str);
- /* since this is a waveformatex, try to get the block_align and rate */
+ /* since this is a WAVEFORMATEX, try to get the block_align and rate */
gst_buffer_map (codec_data, &mapinfo, GST_MAP_READ);
- if (mapinfo.size >= 14) {
- if (!channels_str) {
- channels = GST_READ_UINT16_LE (mapinfo.data + 2);
- }
- if (!rate_str) {
- rate = GST_READ_UINT32_LE (mapinfo.data + 4);
- }
+ if (!channels_str) {
+ channels = GST_READ_UINT16_LE (mapinfo.data + 2);
+ }
+ if (!rate_str) {
+ rate = GST_READ_UINT32_LE (mapinfo.data + 4);
+ }
+ if (!block_align) {
block_align = GST_READ_UINT16_LE (mapinfo.data + 12);
}
gst_buffer_unmap (codec_data, &mapinfo);
+
+ /* Consume all the WAVEFORMATEX structure, and pass only the rest of
+ * the data as the codec private data */
+ gst_buffer_resize (codec_data, 18, -1);
+ } else {
+ GST_WARNING ("Dropping WaveFormatEx: data is %d bytes, "
+ "but at least 18 bytes are expected", codec_data_len);
}
}