[FFmpeg-devel] [RFC] lavf: add CoreMedia AVCodecTag mappings

Josh de Kock josh at itanimul.li
Sat Nov 19 18:37:00 EET 2016


I've mapped a fair amount of the CoreMedia FourCCs to their respective
AVCodecIDs. The ones I didn't know or thought didn't exist in FFmpeg
have been mapped to AV_CODEC_ID_NONE.

Signed-off-by: Josh de Kock <josh at itanimul.li>
---
 libavformat/Makefile    |   1 +
 libavformat/avformat.h  |  32 ++++++++++
 libavformat/coremedia.c | 165 ++++++++++++++++++++++++++++++++++++++++++++++++
 libavformat/coremedia.h |  36 +++++++++++
 4 files changed, 234 insertions(+)
 create mode 100644 libavformat/coremedia.c
 create mode 100644 libavformat/coremedia.h

diff --git a/libavformat/Makefile b/libavformat/Makefile
index f93658d..89ba8c7 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -10,6 +10,7 @@ OBJS = allformats.o         \
        avio.o               \
        aviobuf.o            \
        cutils.o             \
+       coremedia.o          \
        dump.o               \
        format.o             \
        id3v1.o              \
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index f9f4d72..a29e892 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -2865,6 +2865,38 @@ const struct AVCodecTag *avformat_get_mov_video_tags(void);
  * @return the table mapping MOV FourCCs for audio to AVCodecID.
  */
 const struct AVCodecTag *avformat_get_mov_audio_tags(void);
+/**
+ * @return the table mapping Apple's CoreMedia FourCCs for video to AVCodecID.
+ */
+const struct AVCodecTag *avformat_get_coremedia_video_tags(void);
+/**
+ * @return the table mapping Apple's CoreMedia FourCCs for audio to AVCodecID.
+ */
+const struct AVCodecTag *avformat_get_coremedia_audio_tags(void);
+/**
+ * @return the table mapping Apple's CoreMedia FourCCs for muxed data to AVCodecID.
+ */
+const struct AVCodecTag *avformat_get_coremedia_muxed_tags(void);
+/**
+ * @return the table mapping Apple's CoreMedia FourCCs for subtitle to AVCodecID.
+ */
+const struct AVCodecTag *avformat_get_coremedia_subtitle_tags(void);
+/**
+ * @return the table mapping Apple's CoreMedia FourCCs for closed captions to AVCodecID.
+ */
+const struct AVCodecTag *avformat_get_coremedia_closedcaption_tags(void);
+/**
+ * @return the table mapping Apple's CoreMedia FourCCs for metadata to AVCodecID.
+ */
+const struct AVCodecTag *avformat_get_coremedia_metadata_tags(void);
+/**
+ * @return the table mapping Apple's CoreMedia FourCCs for text to AVCodecID.
+ */
+const struct AVCodecTag *avformat_get_coremedia_text_tags(void);
+/**
+ * @return the table mapping Apple's CoreMedia FourCCs for timecode to AVCodecID.
+ */
+const struct AVCodecTag *avformat_get_coremedia_timecode_tags(void);
 
 /**
  * @}
diff --git a/libavformat/coremedia.c b/libavformat/coremedia.c
new file mode 100644
index 0000000..16eb2bd
--- /dev/null
+++ b/libavformat/coremedia.c
@@ -0,0 +1,165 @@
+/*
+ * CoreMedia routines
+ * Copyright (c) 2016 Josh de Kock <josh at itanimul.li>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavcodec/avcodec.h"
+#include "avformat.h"
+#include "libavformat/coremedia.h"
+
+const AVCodecTag ff_coremedia_muxed_tags[] = {
+    { AV_CODEC_ID_DVVIDEO, MKBETAG('d','v',' ',' ') },
+    /**< MPEG-1 System stream */
+    { AV_CODEC_ID_NONE, MKBETAG('m','p','1','s') },
+    /**< MPEG-2 Transport stream */
+    { AV_CODEC_ID_MPEG2TS, MKBETAG('m','p','2','t') },
+    /**< MPEG-2 Program stream */
+    { AV_CODEC_ID_NONE, MKBETAG('m','p','2','p') },
+    /**< DV stream */
+    { AV_CODEC_ID_DVVIDEO, MKBETAG('d','v',' ',' ') },
+    { 0 }
+};
+
+const AVCodecTag ff_coremedia_video_tags[] = {
+    /**< Component Y'CbCr 8-bit 4:2:2 ordered Cb Y'0 Cr Y'1 */
+    { AV_CODEC_ID_NONE, MKBETAG('2','v','u','y') },
+    /**< Apple Animation format */
+    { AV_CODEC_ID_QTRLE, MKBETAG('r','l','e',' ') },
+    /**< Cinepak format */
+    { AV_CODEC_ID_CINEPAK, MKBETAG('c','v','i','d') },
+    /**< Joint Photographic Experts Group (JPEG) format */
+    { AV_CODEC_ID_MJPEG, MKBETAG('j','p','e','g') },
+    /**< JPEG format with Open-DML extensions */
+    { AV_CODEC_ID_NONE, MKBETAG('d','m','b','1') },
+    /**< Sorenson video format */
+    { AV_CODEC_ID_SVQ1, MKBETAG('S','V','Q','1') },
+    /**< Sorenson 3 video format */
+    { AV_CODEC_ID_SVQ3, MKBETAG('S','V','Q','3') },
+    /**< ITU-T H.263 format */
+    { AV_CODEC_ID_H263, MKBETAG('h','2','6','3') },
+    /**< ITU-T H.264 format (AKA ISO/IEC 14496-10 - MPEG-4 Part 10, Advanced Video Coding format) */
+    { AV_CODEC_ID_H264, MKBETAG('a','v','c','1') },
+    /**< ITU-T HEVC format */
+    { AV_CODEC_ID_HEVC, MKBETAG('h','v','c','1') },
+    /**< ISO/IEC Moving Picture Experts Group (MPEG) MPEG-4 Part 2 video format */
+    { AV_CODEC_ID_MPEG4, MKBETAG('m','p','4','v') },
+    /**< MPEG-2 video format */
+    { AV_CODEC_ID_MPEG2VIDEO, MKBETAG('m','p','2','v') },
+    /**< MPEG-1 video format */
+    { AV_CODEC_ID_MPEG1VIDEO, MKBETAG('m','p','1','v') },
+    /**< DV NTSC format */
+    { AV_CODEC_ID_DVVIDEO, MKBETAG('d','v','c',' ') },
+    /**< DV PAL format */
+    { AV_CODEC_ID_DVVIDEO, MKBETAG('d','v','c','p') },
+    /**< Panasonic DVCPro PAL format */
+    { AV_CODEC_ID_DVVIDEO, MKBETAG('d','v','p','p') },
+    /**< Panasonic DVCPro-50 NTSC format */
+    { AV_CODEC_ID_DVVIDEO, MKBETAG('d','v','5','n') },
+    /**< Panasonic DVCPro-50 PAL format */
+    { AV_CODEC_ID_DVVIDEO, MKBETAG('d','v','5','p') },
+    /**< Panasonic DVCPro-HD 720p60 format */
+    { AV_CODEC_ID_DVVIDEO, MKBETAG('d','v','h','p') },
+    /**< Panasonic DVCPro-HD 720p50 format */
+    { AV_CODEC_ID_DVVIDEO, MKBETAG('d','v','h','q') },
+    /**< Panasonic DVCPro-HD 1080i60 format */
+    { AV_CODEC_ID_DVVIDEO, MKBETAG('d','v','h','6') },
+    /**< Panasonic DVCPro-HD 1080i50 format */
+    { AV_CODEC_ID_DVVIDEO, MKBETAG('d','v','h','5') },
+    /**< Panasonic DVCPro-HD 1080p30 format */
+    { AV_CODEC_ID_DVVIDEO, MKBETAG('d','v','h','3') },
+    /**< Panasonic DVCPro-HD 1080p25 format */
+    { AV_CODEC_ID_DVVIDEO, MKBETAG('d','v','h','2') },
+    /**< Apple ProRes 4444 format */
+    { AV_CODEC_ID_PRORES, MKBETAG('a','p','4','h') },
+    /**< Apple ProRes 422 HQ format */
+    { AV_CODEC_ID_PRORES, MKBETAG('a','p','c','h') },
+    /**< Apple ProRes 422 format */
+    { AV_CODEC_ID_PRORES, MKBETAG('a','p','c','n') },
+    /**< Apple ProRes 422 LT format */
+    { AV_CODEC_ID_PRORES, MKBETAG('a','p','c','s') },
+    /**< Apple ProRes 422 Proxy format */
+    { AV_CODEC_ID_PRORES, MKBETAG('a','p','c','o') },
+    { 0 }
+};
+const AVCodecTag ff_coremedia_audio_tags[] = {
+    /**< iTMS protected low-complexity AAC */
+    { AV_CODEC_ID_NONE, MKBETAG('p','a','a','c') },
+    /**< Audible's protected AAC */
+    { AV_CODEC_ID_NONE, MKBETAG('a','a','a','c') },
+    { 0 }
+};
+const AVCodecTag ff_coremedia_metadata_tags[] = {
+    /**< SHOUTCast format */
+    { AV_CODEC_ID_NONE, MKBETAG('i','c','y',' ') },
+    /**< ID3 format */
+    { AV_CODEC_ID_TIMED_ID3, MKBETAG('i','d','3',' ') },
+    /**< Boxed format */
+    { AV_CODEC_ID_NONE, MKBETAG('m','e','b','x') },
+};
+const AVCodecTag ff_coremedia_timecode_tags[] = {
+    /**< 32-bit timeCode sample */
+    { AV_CODEC_ID_NONE, MKBETAG('t','m','c','d') },
+    /**< 64-bit timeCode sample */
+    { AV_CODEC_ID_NONE, MKBETAG('t','c','6','4') },
+    /**< 32-bit counter-mode sample */
+    { AV_CODEC_ID_NONE, MKBETAG('c','n','3','2') },
+    /**< 64-bit counter-mode sample */
+    { AV_CODEC_ID_NONE, MKBETAG('c','n','6','4') },
+    { 0 }
+};
+const AVCodecTag ff_coremedia_subtitle_tags[] = {
+    /**< 3GPP Text media/MPEG-4 Part 17 */
+    { AV_CODEC_ID_MOV_TEXT, MKBETAG('t','x','3','g') },
+    /**< WebVTT (Web Video Text Tracks) */
+    { AV_CODEC_ID_WEBVTT, MKBETAG('w','v','t','t') },
+    { 0 }
+};
+const AVCodecTag ff_coremedia_closedcaption_tags[] = {
+    /**< CEA 608-compliant samples */
+    { AV_CODEC_ID_EIA_608, MKBETAG('c','6','0','8') },
+    /**< CEA 708-compliant samples */
+    { AV_CODEC_ID_NONE, MKBETAG('c','7','0','8') },
+    /**< ATSC/52 part-4 compliant samples */
+    { AV_CODEC_ID_NONE, MKBETAG('a','t','c','c') },
+    { 0 }
+};
+const AVCodecTag ff_coremedia_text_tags[] = {
+    /**< QuickTime Text media */
+    { AV_CODEC_ID_NONE, MKBETAG('t','e','x','t') },
+    /**< 3GPP Text media/MPEG-4 Part 17 */
+    { AV_CODEC_ID_MOV_TEXT, MKBETAG('t','x','3','g') },
+    { 0 }
+};
+
+
+#define avformat_get_coremedia_tags(type)                                     \
+    const struct AVCodecTag *avformat_get_coremedia_ ## type ## _tags(void) { \
+        return ff_coremedia_ ## type ## _tags;                                \
+    }
+
+avformat_get_coremedia_tags(muxed);
+avformat_get_coremedia_tags(video);
+avformat_get_coremedia_tags(audio);
+avformat_get_coremedia_tags(subtitle);
+avformat_get_coremedia_tags(timecode);
+avformat_get_coremedia_tags(text);
+avformat_get_coremedia_tags(metadata);
+avformat_get_coremedia_tags(closedcaption);
+
+#undef avformat_get_coremedia_tags
diff --git a/libavformat/coremedia.h b/libavformat/coremedia.h
new file mode 100644
index 0000000..20e99c5
--- /dev/null
+++ b/libavformat/coremedia.h
@@ -0,0 +1,36 @@
+/*
+ * CoreMedia routines
+ * Copyright (c) 2016 Josh de Kock <josh at itanimul.li>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVFORMAT_COREMEDIA_H
+#define AVFORMAT_COREMEDIA_H
+
+#include "internal.h"
+
+extern const struct AVCodecTag ff_coremedia_muxed_tags[];
+extern const struct AVCodecTag ff_coremedia_video_tags[];
+extern const struct AVCodecTag ff_coremedia_audio_tags[];
+extern const struct AVCodecTag ff_coremedia_subtitle_tags[];
+extern const struct AVCodecTag ff_coremedia_closedcaption_tags[];
+extern const struct AVCodecTag ff_coremedia_text_tags[];
+extern const struct AVCodecTag ff_coremedia_subtitle_tags[];
+extern const struct AVCodecTag ff_coremedia_metadata_tags[];
+
+#endif /* AVFORMAT_COREMEDIA_H */
-- 
2.9.3 (Apple Git-75)



More information about the ffmpeg-devel mailing list