+ } else if (!strcmp (mimetype, "audio/x-wma")
+ || !strcmp (mimetype, "audio/x-alaw")
+ || !strcmp (mimetype, "audio/x-mulaw")) {
+ guint8 *codec_priv;
+ guint codec_priv_size;
+ guint16 format = 0;
+ gint block_align;
+ gint bitrate;
+
+ if (samplerate == 0 || channels == 0) {
+ GST_WARNING_OBJECT (mux, "Missing channels/samplerate on caps");
+ goto refuse_caps;
+ }
+
+ if (!strcmp (mimetype, "audio/x-wma")) {
+ gint wmaversion;
+ gint depth;
+
+ if (!gst_structure_get_int (structure, "wmaversion", &wmaversion)
+ || !gst_structure_get_int (structure, "block_align", &block_align)
+ || !gst_structure_get_int (structure, "bitrate", &bitrate)) {
+ GST_WARNING_OBJECT (mux, "Missing wmaversion/block_align/bitrate"
+ " on WMA caps");
+ goto refuse_caps;
+ }
+
+ switch (wmaversion) {
+ case 1:
+ format = GST_RIFF_WAVE_FORMAT_WMAV1;
+ break;
+ case 2:
+ format = GST_RIFF_WAVE_FORMAT_WMAV2;
+ break;
+ case 3:
+ format = GST_RIFF_WAVE_FORMAT_WMAV3;
+ break;
+ default:
+ GST_WARNING_OBJECT (mux, "Unexpected WMA version: %d", wmaversion);
+ goto refuse_caps;
+ }
+
+ if (gst_structure_get_int (structure, "depth", &depth))
+ audiocontext->bitdepth = depth;
+ } else if (!strcmp (mimetype, "audio/x-alaw")
+ || !strcmp (mimetype, "audio/x-mulaw")) {
+ audiocontext->bitdepth = 8;
+ if (!strcmp (mimetype, "audio/x-alaw"))
+ format = GST_RIFF_WAVE_FORMAT_ALAW;
+ else
+ format = GST_RIFF_WAVE_FORMAT_MULAW;
+
+ block_align = channels;
+ bitrate = block_align * samplerate;
+ }
+ g_assert (format != 0);
+
+ codec_priv_size = WAVEFORMATEX_SIZE;
+ if (buf)
+ codec_priv_size += GST_BUFFER_SIZE (buf);
+
+ /* serialize waveformatex structure */
+ codec_priv = g_malloc0 (codec_priv_size);
+ GST_WRITE_UINT16_LE (codec_priv, format);
+ GST_WRITE_UINT16_LE (codec_priv + 2, channels);
+ GST_WRITE_UINT32_LE (codec_priv + 4, samplerate);
+ GST_WRITE_UINT32_LE (codec_priv + 8, bitrate / 8);
+ GST_WRITE_UINT16_LE (codec_priv + 12, block_align);
+ GST_WRITE_UINT16_LE (codec_priv + 14, 0);
+ if (buf)
+ GST_WRITE_UINT16_LE (codec_priv + 16, GST_BUFFER_SIZE (buf));
+ else
+ GST_WRITE_UINT16_LE (codec_priv + 16, 0);
+
+ /* process codec private/initialization data, if any */
+ if (buf) {
+ memcpy ((guint8 *) codec_priv + WAVEFORMATEX_SIZE,
+ GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
+ }
+
+ context->codec_id = g_strdup (GST_MATROSKA_CODEC_ID_AUDIO_ACM);
+ context->codec_priv = (gpointer) codec_priv;
+ context->codec_priv_size = codec_priv_size;