matroska: add support for most variants of PCM
authorAurelien Jacobs <aurel@gnuage.org>
Wed, 20 Aug 2008 00:49:45 +0000 (00:49 +0000)
committerAurelien Jacobs <aurel@gnuage.org>
Wed, 20 Aug 2008 00:49:45 +0000 (00:49 +0000)
Originally committed as revision 14862 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/matroska.c
libavformat/matroskadec.c

index 01e9dec..8862d7c 100644 (file)
@@ -41,9 +41,15 @@ const CodecTags ff_mkv_codec_tags[]={
     {"A_MPEG/L3"        , CODEC_ID_MP3},
     {"A_MPEG/L2"        , CODEC_ID_MP2},
     {"A_MPEG/L1"        , CODEC_ID_MP2},
     {"A_MPEG/L3"        , CODEC_ID_MP3},
     {"A_MPEG/L2"        , CODEC_ID_MP2},
     {"A_MPEG/L1"        , CODEC_ID_MP2},
-    {"A_PCM/INT/BIG"    , CODEC_ID_PCM_U16BE},
-    {"A_PCM/INT/LIT"    , CODEC_ID_PCM_U16LE},
-//    {"A_PCM/FLOAT/IEEE" , CODEC_ID_NONE},
+    {"A_PCM/INT/BIG"    , CODEC_ID_PCM_S16BE},
+    {"A_PCM/INT/BIG"    , CODEC_ID_PCM_S24BE},
+    {"A_PCM/INT/BIG"    , CODEC_ID_PCM_S32BE},
+    {"A_PCM/INT/LIT"    , CODEC_ID_PCM_S16LE},
+    {"A_PCM/INT/LIT"    , CODEC_ID_PCM_S24LE},
+    {"A_PCM/INT/LIT"    , CODEC_ID_PCM_S32LE},
+    {"A_PCM/INT/LIT"    , CODEC_ID_PCM_U8},
+    {"A_PCM/FLOAT/IEEE" , CODEC_ID_PCM_F32LE},
+    {"A_PCM/FLOAT/IEEE" , CODEC_ID_PCM_F64LE},
     {"A_AC3"            , CODEC_ID_AC3},
 //    {"A_EAC3"           , CODEC_ID_EAC3},
     {"A_DTS"            , CODEC_ID_DTS},
     {"A_AC3"            , CODEC_ID_AC3},
 //    {"A_EAC3"           , CODEC_ID_EAC3},
     {"A_DTS"            , CODEC_ID_DTS},
index e7819f9..4f8bbbe 100644 (file)
@@ -1162,6 +1162,20 @@ static int matroska_read_header(AVFormatContext *s, AVFormatParameters *ap)
                    && (track->codec_priv.data != NULL)) {
             track->video.fourcc = AV_RL32(track->codec_priv.data);
             codec_id=codec_get_id(codec_movvideo_tags, track->video.fourcc);
                    && (track->codec_priv.data != NULL)) {
             track->video.fourcc = AV_RL32(track->codec_priv.data);
             codec_id=codec_get_id(codec_movvideo_tags, track->video.fourcc);
+        } else if (codec_id == CODEC_ID_PCM_S16BE) {
+            switch (track->audio.bitdepth) {
+            case  8:  codec_id = CODEC_ID_PCM_U8;     break;
+            case 24:  codec_id = CODEC_ID_PCM_S24BE;  break;
+            case 32:  codec_id = CODEC_ID_PCM_S32BE;  break;
+            }
+        } else if (codec_id == CODEC_ID_PCM_S16LE) {
+            switch (track->audio.bitdepth) {
+            case  8:  codec_id = CODEC_ID_PCM_U8;     break;
+            case 24:  codec_id = CODEC_ID_PCM_S24LE;  break;
+            case 32:  codec_id = CODEC_ID_PCM_S32LE;  break;
+            }
+        } else if (codec_id==CODEC_ID_PCM_F32LE && track->audio.bitdepth==64) {
+            codec_id = CODEC_ID_PCM_F64LE;
         } else if (codec_id == CODEC_ID_AAC && !track->codec_priv.size) {
             int profile = matroska_aac_profile(track->codec_id);
             int sri = matroska_aac_sri(track->audio.samplerate);
         } else if (codec_id == CODEC_ID_AAC && !track->codec_priv.size) {
             int profile = matroska_aac_profile(track->codec_id);
             int sri = matroska_aac_sri(track->audio.samplerate);