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