PageRenderTime 37ms CodeModel.GetById 13ms app.highlight 19ms RepoModel.GetById 1ms app.codeStats 1ms

/libavformat/matroska.c

http://github.com/FFmpeg/FFmpeg
C | 206 lines | 163 code | 19 blank | 24 comment | 3 complexity | a5958ee20ef3bdb5101467c463540644 MD5 | raw file
  1/*
  2 * Matroska common data
  3 * Copyright (c) 2003-2004 The FFmpeg project
  4 *
  5 * This file is part of FFmpeg.
  6 *
  7 * FFmpeg is free software; you can redistribute it and/or
  8 * modify it under the terms of the GNU Lesser General Public
  9 * License as published by the Free Software Foundation; either
 10 * version 2.1 of the License, or (at your option) any later version.
 11 *
 12 * FFmpeg is distributed in the hope that it will be useful,
 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 15 * Lesser General Public License for more details.
 16 *
 17 * You should have received a copy of the GNU Lesser General Public
 18 * License along with FFmpeg; if not, write to the Free Software
 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 20 */
 21
 22#include "libavutil/stereo3d.h"
 23
 24#include "matroska.h"
 25
 26/* If you add a tag here that is not in ff_codec_bmp_tags[]
 27   or ff_codec_wav_tags[], add it also to additional_audio_tags[]
 28   or additional_video_tags[] in matroskaenc.c */
 29const CodecTags ff_mkv_codec_tags[]={
 30    {"A_AAC"            , AV_CODEC_ID_AAC},
 31    {"A_AC3"            , AV_CODEC_ID_AC3},
 32    {"A_ALAC"           , AV_CODEC_ID_ALAC},
 33    {"A_DTS"            , AV_CODEC_ID_DTS},
 34    {"A_EAC3"           , AV_CODEC_ID_EAC3},
 35    {"A_FLAC"           , AV_CODEC_ID_FLAC},
 36    {"A_MLP"            , AV_CODEC_ID_MLP},
 37    {"A_MPEG/L2"        , AV_CODEC_ID_MP2},
 38    {"A_MPEG/L1"        , AV_CODEC_ID_MP1},
 39    {"A_MPEG/L3"        , AV_CODEC_ID_MP3},
 40    {"A_OPUS"           , AV_CODEC_ID_OPUS},
 41    {"A_OPUS/EXPERIMENTAL",AV_CODEC_ID_OPUS},
 42    {"A_PCM/FLOAT/IEEE" , AV_CODEC_ID_PCM_F32LE},
 43    {"A_PCM/FLOAT/IEEE" , AV_CODEC_ID_PCM_F64LE},
 44    {"A_PCM/INT/BIG"    , AV_CODEC_ID_PCM_S16BE},
 45    {"A_PCM/INT/BIG"    , AV_CODEC_ID_PCM_S24BE},
 46    {"A_PCM/INT/BIG"    , AV_CODEC_ID_PCM_S32BE},
 47    {"A_PCM/INT/LIT"    , AV_CODEC_ID_PCM_S16LE},
 48    {"A_PCM/INT/LIT"    , AV_CODEC_ID_PCM_S24LE},
 49    {"A_PCM/INT/LIT"    , AV_CODEC_ID_PCM_S32LE},
 50    {"A_PCM/INT/LIT"    , AV_CODEC_ID_PCM_U8},
 51    {"A_QUICKTIME/QDMC" , AV_CODEC_ID_QDMC},
 52    {"A_QUICKTIME/QDM2" , AV_CODEC_ID_QDM2},
 53    {"A_REAL/14_4"      , AV_CODEC_ID_RA_144},
 54    {"A_REAL/28_8"      , AV_CODEC_ID_RA_288},
 55    {"A_REAL/ATRC"      , AV_CODEC_ID_ATRAC3},
 56    {"A_REAL/COOK"      , AV_CODEC_ID_COOK},
 57    {"A_REAL/SIPR"      , AV_CODEC_ID_SIPR},
 58    {"A_TRUEHD"         , AV_CODEC_ID_TRUEHD},
 59    {"A_TTA1"           , AV_CODEC_ID_TTA},
 60    {"A_VORBIS"         , AV_CODEC_ID_VORBIS},
 61    {"A_WAVPACK4"       , AV_CODEC_ID_WAVPACK},
 62
 63    {"D_WEBVTT/SUBTITLES"   , AV_CODEC_ID_WEBVTT},
 64    {"D_WEBVTT/CAPTIONS"    , AV_CODEC_ID_WEBVTT},
 65    {"D_WEBVTT/DESCRIPTIONS", AV_CODEC_ID_WEBVTT},
 66    {"D_WEBVTT/METADATA"    , AV_CODEC_ID_WEBVTT},
 67
 68    {"S_TEXT/UTF8"      , AV_CODEC_ID_SUBRIP},
 69    {"S_TEXT/UTF8"      , AV_CODEC_ID_TEXT},
 70    {"S_TEXT/ASCII"     , AV_CODEC_ID_TEXT},
 71    {"S_TEXT/ASS"       , AV_CODEC_ID_ASS},
 72    {"S_TEXT/SSA"       , AV_CODEC_ID_ASS},
 73    {"S_ASS"            , AV_CODEC_ID_ASS},
 74    {"S_SSA"            , AV_CODEC_ID_ASS},
 75    {"S_VOBSUB"         , AV_CODEC_ID_DVD_SUBTITLE},
 76    {"S_DVBSUB"         , AV_CODEC_ID_DVB_SUBTITLE},
 77    {"S_HDMV/PGS"       , AV_CODEC_ID_HDMV_PGS_SUBTITLE},
 78    {"S_HDMV/TEXTST"    , AV_CODEC_ID_HDMV_TEXT_SUBTITLE},
 79
 80    {"V_AV1"            , AV_CODEC_ID_AV1},
 81    {"V_DIRAC"          , AV_CODEC_ID_DIRAC},
 82    {"V_FFV1"           , AV_CODEC_ID_FFV1},
 83    {"V_MJPEG"          , AV_CODEC_ID_MJPEG},
 84    {"V_MPEG1"          , AV_CODEC_ID_MPEG1VIDEO},
 85    {"V_MPEG2"          , AV_CODEC_ID_MPEG2VIDEO},
 86    {"V_MPEG4/ISO/ASP"  , AV_CODEC_ID_MPEG4},
 87    {"V_MPEG4/ISO/AP"   , AV_CODEC_ID_MPEG4},
 88    {"V_MPEG4/ISO/SP"   , AV_CODEC_ID_MPEG4},
 89    {"V_MPEG4/ISO/AVC"  , AV_CODEC_ID_H264},
 90    {"V_MPEGH/ISO/HEVC" , AV_CODEC_ID_HEVC},
 91    {"V_MPEG4/MS/V3"    , AV_CODEC_ID_MSMPEG4V3},
 92    {"V_PRORES"         , AV_CODEC_ID_PRORES},
 93    {"V_REAL/RV10"      , AV_CODEC_ID_RV10},
 94    {"V_REAL/RV20"      , AV_CODEC_ID_RV20},
 95    {"V_REAL/RV30"      , AV_CODEC_ID_RV30},
 96    {"V_REAL/RV40"      , AV_CODEC_ID_RV40},
 97    {"V_SNOW"           , AV_CODEC_ID_SNOW},
 98    {"V_THEORA"         , AV_CODEC_ID_THEORA},
 99    {"V_UNCOMPRESSED"   , AV_CODEC_ID_RAWVIDEO},
100    {"V_VP8"            , AV_CODEC_ID_VP8},
101    {"V_VP9"            , AV_CODEC_ID_VP9},
102
103    {""                 , AV_CODEC_ID_NONE}
104};
105
106const CodecTags ff_webm_codec_tags[] = {
107    {"V_VP8"            , AV_CODEC_ID_VP8},
108    {"V_VP9"            , AV_CODEC_ID_VP9},
109    {"V_AV1"            , AV_CODEC_ID_AV1},
110
111    {"A_VORBIS"         , AV_CODEC_ID_VORBIS},
112    {"A_OPUS"           , AV_CODEC_ID_OPUS},
113
114    {"D_WEBVTT/SUBTITLES"   , AV_CODEC_ID_WEBVTT},
115    {"D_WEBVTT/CAPTIONS"    , AV_CODEC_ID_WEBVTT},
116    {"D_WEBVTT/DESCRIPTIONS", AV_CODEC_ID_WEBVTT},
117    {"D_WEBVTT/METADATA"    , AV_CODEC_ID_WEBVTT},
118
119    {""                 , AV_CODEC_ID_NONE}
120};
121
122const AVMetadataConv ff_mkv_metadata_conv[] = {
123    { "LEAD_PERFORMER", "performer" },
124    { "PART_NUMBER"   , "track"  },
125    { 0 }
126};
127
128const char * const ff_matroska_video_stereo_mode[MATROSKA_VIDEO_STEREOMODE_TYPE_NB] = {
129    "mono",
130    "left_right",
131    "bottom_top",
132    "top_bottom",
133    "checkerboard_rl",
134    "checkerboard_lr",
135    "row_interleaved_rl",
136    "row_interleaved_lr",
137    "col_interleaved_rl",
138    "col_interleaved_lr",
139    "anaglyph_cyan_red",
140    "right_left",
141    "anaglyph_green_magenta",
142    "block_lr",
143    "block_rl",
144};
145
146const char * const ff_matroska_video_stereo_plane[MATROSKA_VIDEO_STEREO_PLANE_COUNT] = {
147    "left",
148    "right",
149    "background",
150};
151
152int ff_mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mode)
153{
154    AVStereo3D *stereo;
155    int ret;
156
157    stereo = av_stereo3d_alloc();
158    if (!stereo)
159        return AVERROR(ENOMEM);
160
161    // note: the missing breaks are intentional
162    switch (stereo_mode) {
163    case MATROSKA_VIDEO_STEREOMODE_TYPE_MONO:
164        stereo->type = AV_STEREO3D_2D;
165        break;
166    case MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT:
167        stereo->flags |= AV_STEREO3D_FLAG_INVERT;
168    case MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT:
169        stereo->type = AV_STEREO3D_SIDEBYSIDE;
170        break;
171    case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTTOM_TOP:
172        stereo->flags |= AV_STEREO3D_FLAG_INVERT;
173    case MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM:
174        stereo->type = AV_STEREO3D_TOPBOTTOM;
175        break;
176    case MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_RL:
177        stereo->flags |= AV_STEREO3D_FLAG_INVERT;
178    case MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR:
179        stereo->type = AV_STEREO3D_CHECKERBOARD;
180        break;
181    case MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_RL:
182        stereo->flags |= AV_STEREO3D_FLAG_INVERT;
183    case MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR:
184        stereo->type = AV_STEREO3D_LINES;
185        break;
186    case MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_RL:
187        stereo->flags |= AV_STEREO3D_FLAG_INVERT;
188    case MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR:
189        stereo->type = AV_STEREO3D_COLUMNS;
190        break;
191    case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL:
192        stereo->flags |= AV_STEREO3D_FLAG_INVERT;
193    case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR:
194        stereo->type = AV_STEREO3D_FRAMESEQUENCE;
195        break;
196    }
197
198    ret = av_stream_add_side_data(st, AV_PKT_DATA_STEREO3D, (uint8_t *)stereo,
199                                  sizeof(*stereo));
200    if (ret < 0) {
201        av_freep(&stereo);
202        return ret;
203    }
204
205    return 0;
206}