summaryrefslogtreecommitdiffstats
path: root/demux/demux_mkv.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-03-15 07:49:47 +0100
committerwm4 <wm4@nowhere>2013-03-15 12:17:39 +0100
commite837d8ddaca6f72e29c69833bd46a0454d36221f (patch)
tree30d4d6d55cec81881ac7e695e66708f870891341 /demux/demux_mkv.c
parentdf4b31c869593d889a172c4e79dda6303d0b5dda (diff)
downloadmpv-e837d8ddaca6f72e29c69833bd46a0454d36221f.tar.bz2
mpv-e837d8ddaca6f72e29c69833bd46a0454d36221f.tar.xz
demux_mkv: support ALAC
Test sample was produced with ffmpeg. Extradata handling closely follows libavformat/matroskadec.c.
Diffstat (limited to 'demux/demux_mkv.c')
-rw-r--r--demux/demux_mkv.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c
index 012ddba516..3917621384 100644
--- a/demux/demux_mkv.c
+++ b/demux/demux_mkv.c
@@ -1321,6 +1321,7 @@ static struct mkv_audio_tag {
{ MKV_A_WAVPACK, 0, mmioFOURCC('W', 'V', 'P', 'K') },
{ MKV_A_TRUEHD, 0, mmioFOURCC('T', 'R', 'H', 'D') },
{ MKV_A_FLAC, 0, mmioFOURCC('f', 'L', 'a', 'C') },
+ { MKV_A_ALAC, 0, mmioFOURCC('a', 'L', 'a', 'C') },
{ MKV_A_REAL28, 0, mmioFOURCC('2', '8', '_', '8') },
{ MKV_A_REALATRC, 0, mmioFOURCC('a', 't', 'r', 'c') },
{ MKV_A_REALCOOK, 0, mmioFOURCC('c', 'o', 'o', 'k') },
@@ -1549,6 +1550,16 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track,
sh_a->codecdata_len = size;
memcpy(sh_a->codecdata, ptr, size);
}
+ } else if (!strcmp(track->codec_id, MKV_A_ALAC)) {
+ if (track->private_size && track->private_size < 10000000) {
+ sh_a->codecdata_len = track->private_size + 12;
+ sh_a->codecdata = malloc(sh_a->codecdata_len);
+ char *data = sh_a->codecdata;
+ AV_WB32(data + 0, sh_a->codecdata_len);
+ memcpy(data + 4, "alac", 4);
+ AV_WB32(data + 8, 0);
+ memcpy(data + 12, track->private_data, track->private_size);
+ }
} else if (track->a_formattag == mmioFOURCC('W', 'V', 'P', 'K') ||
track->a_formattag == mmioFOURCC('T', 'R', 'H', 'D')) {
copy_private_data: