From e837d8ddaca6f72e29c69833bd46a0454d36221f Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 15 Mar 2013 07:49:47 +0100 Subject: demux_mkv: support ALAC Test sample was produced with ffmpeg. Extradata handling closely follows libavformat/matroskadec.c. --- demux/demux_mkv.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'demux/demux_mkv.c') 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: -- cgit v1.2.3