[FFmpeg-cvslog] matroskadec: Implement support for ALAC

Moritz Bunkus git at videolan.org
Sun Aug 5 18:02:51 CEST 2012


ffmpeg | branch: master | Moritz Bunkus <moritz at bunkus.org> | Sun Aug  5 16:25:48 2012 +0200| [bc3b4220296e24e2cdd1213208a470853fcb76c3] | committer: Michael Niedermayer

matroskadec: Implement support for ALAC

This patch implements support reading ALAC from Matroska files. The
only non-trivial thing about it is that only the ALAC magic cookie is
stored in Matroska's CodecPrivate element but not the "atom size",
"tag" and "tag version" fields that FFMPEG's ALAC decoder
expects. However, those are trivial to re-create.

Sample files are available:
http://www.bunkus.org/videotools/mkvtoolnix/samples/alac/alac-in-matroska.mka
and the CoreAudio file it was created from with today's mkvmerge:
http://www.bunkus.org/videotools/mkvtoolnix/samples/alac/alac-in-matroska-source.caf

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=bc3b4220296e24e2cdd1213208a470853fcb76c3
---

 libavformat/matroska.c    |    1 +
 libavformat/matroskadec.c |   12 ++++++++++++
 2 files changed, 13 insertions(+)

diff --git a/libavformat/matroska.c b/libavformat/matroska.c
index 5e9a6ca..ea91ed7 100644
--- a/libavformat/matroska.c
+++ b/libavformat/matroska.c
@@ -24,6 +24,7 @@
 const CodecTags ff_mkv_codec_tags[]={
     {"A_AAC"            , CODEC_ID_AAC},
     {"A_AC3"            , CODEC_ID_AC3},
+    {"A_ALAC"           , CODEC_ID_ALAC},
     {"A_DTS"            , CODEC_ID_DTS},
     {"A_EAC3"           , CODEC_ID_EAC3},
     {"A_FLAC"           , CODEC_ID_FLAC},
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 2c954af..0f18087 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -1580,6 +1580,18 @@ static int matroska_read_header(AVFormatContext *s)
                    && (track->codec_priv.data != NULL)) {
             fourcc = AV_RL32(track->codec_priv.data);
             codec_id = ff_codec_get_id(ff_codec_movvideo_tags, fourcc);
+        } else if (codec_id == CODEC_ID_ALAC && track->codec_priv.size) {
+            /* Only ALAC's magic cookie is stored in Matroska's track headers.
+               Create the "atom size", "tag", and "tag version" fields the
+               decoder expects manually. */
+            extradata_size = 12 + track->codec_priv.size;
+            extradata = av_mallocz(extradata_size);
+            if (extradata == NULL)
+                return AVERROR(ENOMEM);
+            AV_WB32(extradata, extradata_size);
+            memcpy(&extradata[4], "alac", 4);
+            AV_WB32(&extradata[8], 0);
+            memcpy(&extradata[12], track->codec_priv.data, track->codec_priv.size);
         } else if (codec_id == CODEC_ID_PCM_S16BE) {
             switch (track->audio.bitdepth) {
             case  8:  codec_id = CODEC_ID_PCM_U8;     break;



More information about the ffmpeg-cvslog mailing list