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