summaryrefslogtreecommitdiffstats
path: root/demux
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2016-02-14 12:42:24 +0100
committerwm4 <wm4@nowhere>2016-02-14 12:42:24 +0100
commitfa821de8b2b11c0c5e378342e0d56d16366cd96f (patch)
tree4f5484ea6cd031984cced55c554684c3b02e348a /demux
parentd3ed550792eb93fcc82dcf8ce73b678a35fe1349 (diff)
downloadmpv-fa821de8b2b11c0c5e378342e0d56d16366cd96f.tar.bz2
mpv-fa821de8b2b11c0c5e378342e0d56d16366cd96f.tar.xz
demux_mkv: support channel layout in VfW muxed PCM
Fixes #2820.
Diffstat (limited to 'demux')
-rw-r--r--demux/demux_mkv.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c
index 9e8346e6ac..4eb4df260f 100644
--- a/demux/demux_mkv.c
+++ b/demux/demux_mkv.c
@@ -1484,6 +1484,7 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track)
unsigned char *extradata = track->private_data;
unsigned int extradata_len = track->private_size;
+ uint64_t chmask = 0;
if (!track->a_osfreq)
track->a_osfreq = track->a_sfreq;
@@ -1516,6 +1517,9 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track)
extradata_len = track->private_size - 18;
sh_a->bits_per_coded_sample = track->a_bps;
mp_set_codec_from_tag(sh_a);
+ // WAVEFORMATEXTENSIBLE.dwChannelMask
+ if (sh_a->codec_tag == 0xfffe && extradata_len >= 6)
+ chmask = AV_RL32(extradata + 2);
} else if (!strcmp(track->codec_id, "A_PCM/INT/LIT")) {
bool sign = sh_a->bits_per_coded_sample > 8;
mp_set_pcm_codec(sh_a, sign, false, sh_a->bits_per_coded_sample, false);
@@ -1635,7 +1639,9 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track)
if (!sh_a->codec)
goto error;
- mp_chmap_set_unknown(&sh_a->channels, track->a_channels);
+ mp_chmap_from_waveext(&sh_a->channels, chmask);
+ if (sh_a->channels.num != track->a_channels)
+ mp_chmap_set_unknown(&sh_a->channels, track->a_channels);
const char *codec = sh_a->codec;
if (!strcmp(codec, "mp3") || !strcmp(codec, "truehd")) {