Commit | Line | Data |
---|---|---|
2ba45a60 DM |
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 */ | |
29 | const 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_MP2}, | |
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/QDM2" , AV_CODEC_ID_QDM2}, | |
52 | {"A_REAL/14_4" , AV_CODEC_ID_RA_144}, | |
53 | {"A_REAL/28_8" , AV_CODEC_ID_RA_288}, | |
54 | {"A_REAL/ATRC" , AV_CODEC_ID_ATRAC3}, | |
55 | {"A_REAL/COOK" , AV_CODEC_ID_COOK}, | |
56 | {"A_REAL/SIPR" , AV_CODEC_ID_SIPR}, | |
57 | {"A_TRUEHD" , AV_CODEC_ID_TRUEHD}, | |
58 | {"A_TTA1" , AV_CODEC_ID_TTA}, | |
59 | {"A_VORBIS" , AV_CODEC_ID_VORBIS}, | |
60 | {"A_WAVPACK4" , AV_CODEC_ID_WAVPACK}, | |
61 | ||
62 | {"D_WEBVTT/SUBTITLES" , AV_CODEC_ID_WEBVTT}, | |
63 | {"D_WEBVTT/CAPTIONS" , AV_CODEC_ID_WEBVTT}, | |
64 | {"D_WEBVTT/DESCRIPTIONS", AV_CODEC_ID_WEBVTT}, | |
65 | {"D_WEBVTT/METADATA" , AV_CODEC_ID_WEBVTT}, | |
66 | ||
67 | {"S_TEXT/UTF8" , AV_CODEC_ID_SUBRIP}, | |
68 | {"S_TEXT/UTF8" , AV_CODEC_ID_TEXT}, | |
2ba45a60 DM |
69 | {"S_TEXT/ASCII" , AV_CODEC_ID_TEXT}, |
70 | {"S_TEXT/ASS" , AV_CODEC_ID_ASS}, | |
71 | {"S_TEXT/SSA" , AV_CODEC_ID_ASS}, | |
72 | {"S_ASS" , AV_CODEC_ID_ASS}, | |
73 | {"S_SSA" , AV_CODEC_ID_ASS}, | |
74 | {"S_VOBSUB" , AV_CODEC_ID_DVD_SUBTITLE}, | |
75 | {"S_DVBSUB" , AV_CODEC_ID_DVB_SUBTITLE}, | |
76 | {"S_HDMV/PGS" , AV_CODEC_ID_HDMV_PGS_SUBTITLE}, | |
77 | ||
78 | {"V_DIRAC" , AV_CODEC_ID_DIRAC}, | |
79 | {"V_MJPEG" , AV_CODEC_ID_MJPEG}, | |
80 | {"V_MPEG1" , AV_CODEC_ID_MPEG1VIDEO}, | |
81 | {"V_MPEG2" , AV_CODEC_ID_MPEG2VIDEO}, | |
82 | {"V_MPEG4/ISO/ASP" , AV_CODEC_ID_MPEG4}, | |
83 | {"V_MPEG4/ISO/AP" , AV_CODEC_ID_MPEG4}, | |
84 | {"V_MPEG4/ISO/SP" , AV_CODEC_ID_MPEG4}, | |
85 | {"V_MPEG4/ISO/AVC" , AV_CODEC_ID_H264}, | |
86 | {"V_MPEGH/ISO/HEVC" , AV_CODEC_ID_HEVC}, | |
87 | {"V_MPEG4/MS/V3" , AV_CODEC_ID_MSMPEG4V3}, | |
88 | {"V_PRORES" , AV_CODEC_ID_PRORES}, | |
89 | {"V_REAL/RV10" , AV_CODEC_ID_RV10}, | |
90 | {"V_REAL/RV20" , AV_CODEC_ID_RV20}, | |
91 | {"V_REAL/RV30" , AV_CODEC_ID_RV30}, | |
92 | {"V_REAL/RV40" , AV_CODEC_ID_RV40}, | |
93 | {"V_SNOW" , AV_CODEC_ID_SNOW}, | |
94 | {"V_THEORA" , AV_CODEC_ID_THEORA}, | |
95 | {"V_UNCOMPRESSED" , AV_CODEC_ID_RAWVIDEO}, | |
96 | {"V_VP8" , AV_CODEC_ID_VP8}, | |
97 | {"V_VP9" , AV_CODEC_ID_VP9}, | |
98 | ||
99 | {"" , AV_CODEC_ID_NONE} | |
100 | }; | |
101 | ||
102 | const CodecMime ff_mkv_mime_tags[] = { | |
103 | {"text/plain" , AV_CODEC_ID_TEXT}, | |
104 | {"image/gif" , AV_CODEC_ID_GIF}, | |
105 | {"image/jpeg" , AV_CODEC_ID_MJPEG}, | |
106 | {"image/png" , AV_CODEC_ID_PNG}, | |
107 | {"image/tiff" , AV_CODEC_ID_TIFF}, | |
108 | {"application/x-truetype-font", AV_CODEC_ID_TTF}, | |
109 | {"application/x-font" , AV_CODEC_ID_TTF}, | |
110 | {"application/vnd.ms-opentype", AV_CODEC_ID_OTF}, | |
111 | {"binary" , AV_CODEC_ID_BIN_DATA}, | |
112 | ||
113 | {"" , AV_CODEC_ID_NONE} | |
114 | }; | |
115 | ||
116 | const AVMetadataConv ff_mkv_metadata_conv[] = { | |
117 | { "LEAD_PERFORMER", "performer" }, | |
118 | { "PART_NUMBER" , "track" }, | |
119 | { 0 } | |
120 | }; | |
121 | ||
122 | const char * const ff_matroska_video_stereo_mode[MATROSKA_VIDEO_STEREOMODE_TYPE_NB] = { | |
123 | "mono", | |
124 | "left_right", | |
125 | "bottom_top", | |
126 | "top_bottom", | |
127 | "checkerboard_rl", | |
128 | "checkerboard_lr", | |
129 | "row_interleaved_rl", | |
130 | "row_interleaved_lr", | |
131 | "col_interleaved_rl", | |
132 | "col_interleaved_lr", | |
133 | "anaglyph_cyan_red", | |
134 | "right_left", | |
135 | "anaglyph_green_magenta", | |
136 | "block_lr", | |
137 | "block_rl", | |
138 | }; | |
139 | ||
140 | const char * const ff_matroska_video_stereo_plane[MATROSKA_VIDEO_STEREO_PLANE_COUNT] = { | |
141 | "left", | |
142 | "right", | |
143 | "background", | |
144 | }; | |
145 | ||
146 | int ff_mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mode) | |
147 | { | |
148 | AVPacketSideData *sd, *tmp; | |
149 | AVStereo3D *stereo; | |
150 | ||
151 | stereo = av_stereo3d_alloc(); | |
152 | if (!stereo) | |
153 | return AVERROR(ENOMEM); | |
154 | ||
155 | tmp = av_realloc_array(st->side_data, st->nb_side_data + 1, sizeof(*tmp)); | |
156 | if (!tmp) { | |
157 | av_freep(&stereo); | |
158 | return AVERROR(ENOMEM); | |
159 | } | |
160 | st->side_data = tmp; | |
161 | st->nb_side_data++; | |
162 | ||
163 | sd = &st->side_data[st->nb_side_data - 1]; | |
164 | sd->type = AV_PKT_DATA_STEREO3D; | |
165 | sd->data = (uint8_t *)stereo; | |
166 | sd->size = sizeof(*stereo); | |
167 | ||
168 | // note: the missing breaks are intentional | |
169 | switch (stereo_mode) { | |
170 | case MATROSKA_VIDEO_STEREOMODE_TYPE_MONO: | |
171 | stereo->type = AV_STEREO3D_2D; | |
172 | break; | |
173 | case MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT: | |
174 | stereo->flags |= AV_STEREO3D_FLAG_INVERT; | |
175 | case MATROSKA_VIDEO_STEREOMODE_TYPE_LEFT_RIGHT: | |
176 | stereo->type = AV_STEREO3D_SIDEBYSIDE; | |
177 | break; | |
178 | case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTTOM_TOP: | |
179 | stereo->flags |= AV_STEREO3D_FLAG_INVERT; | |
180 | case MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM: | |
181 | stereo->type = AV_STEREO3D_TOPBOTTOM; | |
182 | break; | |
183 | case MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_RL: | |
184 | stereo->flags |= AV_STEREO3D_FLAG_INVERT; | |
185 | case MATROSKA_VIDEO_STEREOMODE_TYPE_CHECKERBOARD_LR: | |
186 | stereo->type = AV_STEREO3D_CHECKERBOARD; | |
187 | break; | |
188 | case MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_RL: | |
189 | stereo->flags |= AV_STEREO3D_FLAG_INVERT; | |
190 | case MATROSKA_VIDEO_STEREOMODE_TYPE_ROW_INTERLEAVED_LR: | |
191 | stereo->type = AV_STEREO3D_LINES; | |
192 | break; | |
193 | case MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_RL: | |
194 | stereo->flags |= AV_STEREO3D_FLAG_INVERT; | |
195 | case MATROSKA_VIDEO_STEREOMODE_TYPE_COL_INTERLEAVED_LR: | |
196 | stereo->type = AV_STEREO3D_COLUMNS; | |
197 | break; | |
198 | case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL: | |
199 | stereo->flags |= AV_STEREO3D_FLAG_INVERT; | |
200 | case MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_LR: | |
201 | stereo->type = AV_STEREO3D_FRAMESEQUENCE; | |
202 | break; | |
203 | } | |
204 | ||
205 | return 0; | |
206 | } |