Reindent.
[libav.git] / libavformat / isom.c
CommitLineData
e40ee6a2
BC
1/*
2 * ISO Media common code
406792e7 3 * Copyright (c) 2001 Fabrice Bellard
e40ee6a2
BC
4 * Copyright (c) 2002 Francois Revol <revol@free.fr>
5 * Copyright (c) 2006 Baptiste Coudurier <baptiste.coudurier@free.fr>
6 *
b78e7197
DB
7 * This file is part of FFmpeg.
8 *
9 * FFmpeg is free software; you can redistribute it and/or
e40ee6a2
BC
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
b78e7197 12 * version 2.1 of the License, or (at your option) any later version.
e40ee6a2 13 *
b78e7197 14 * FFmpeg is distributed in the hope that it will be useful,
e40ee6a2
BC
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
b78e7197 20 * License along with FFmpeg; if not, write to the Free Software
e40ee6a2
BC
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24#include "avformat.h"
25#include "riff.h"
26#include "isom.h"
27
7555d2e6 28/* http://www.mp4ra.org */
efc9e44d 29/* ordered by muxing preference */
ccba88d7 30const AVCodecTag ff_mp4_obj_type[] = {
f6204886 31 { CODEC_ID_MOV_TEXT , 0x08 },
2f980d2a
BC
32 { CODEC_ID_MPEG4 , 0x20 },
33 { CODEC_ID_H264 , 0x21 },
34 { CODEC_ID_AAC , 0x40 },
c3988a59 35 { CODEC_ID_MP4ALS , 0x40 }, /* 14496-3 ALS */
2f980d2a
BC
36 { CODEC_ID_MPEG2VIDEO, 0x61 }, /* MPEG2 Main */
37 { CODEC_ID_MPEG2VIDEO, 0x60 }, /* MPEG2 Simple */
38 { CODEC_ID_MPEG2VIDEO, 0x62 }, /* MPEG2 SNR */
39 { CODEC_ID_MPEG2VIDEO, 0x63 }, /* MPEG2 Spatial */
40 { CODEC_ID_MPEG2VIDEO, 0x64 }, /* MPEG2 High */
41 { CODEC_ID_MPEG2VIDEO, 0x65 }, /* MPEG2 422 */
42 { CODEC_ID_AAC , 0x66 }, /* MPEG2 AAC Main */
43 { CODEC_ID_AAC , 0x67 }, /* MPEG2 AAC Low */
44 { CODEC_ID_AAC , 0x68 }, /* MPEG2 AAC SSR */
c4e02d70
BC
45 { CODEC_ID_MP3 , 0x69 }, /* 13818-3 */
46 { CODEC_ID_MP2 , 0x69 }, /* 11172-3 */
5180b027 47 { CODEC_ID_MPEG1VIDEO, 0x6A }, /* 11172-2 */
2f980d2a 48 { CODEC_ID_MP3 , 0x6B }, /* 11172-3 */
2f980d2a
BC
49 { CODEC_ID_MJPEG , 0x6C }, /* 10918-1 */
50 { CODEC_ID_PNG , 0x6D },
51 { CODEC_ID_JPEG2000 , 0x6E }, /* 15444-1 */
52 { CODEC_ID_VC1 , 0xA3 },
c3b13251 53 { CODEC_ID_DIRAC , 0xA4 },
2f980d2a
BC
54 { CODEC_ID_AC3 , 0xA5 },
55 { CODEC_ID_VORBIS , 0xDD }, /* non standard, gpac uses it */
56 { CODEC_ID_DVD_SUBTITLE, 0xE0 }, /* non standard, see unsupported-embedded-subs-2.mp4 */
57 { CODEC_ID_QCELP , 0xE1 },
bc2d2a07 58 { CODEC_ID_NONE , 0 },
e40ee6a2
BC
59};
60
1e5f5e3b
BC
61const AVCodecTag codec_movvideo_tags[] = {
62/* { CODEC_ID_, MKTAG('I', 'V', '5', '0') }, *//* Indeo 5.0 */
63
64 { CODEC_ID_RAWVIDEO, MKTAG('r', 'a', 'w', ' ') }, /* Uncompressed RGB */
3dd2f87e 65 { CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') }, /* Uncompressed YUV422 */
1e5f5e3b
BC
66 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', 'U', 'I') }, /* YUV with alpha-channel (AVID Uncompressed) */
67 { CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') }, /* UNCOMPRESSED 8BIT 4:2:2 */
42022e03 68 { CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', 's') }, /* same as 2vuy but byte swapped */
1e5f5e3b 69
4aaab0a3 70 { CODEC_ID_R210, MKTAG('r', '2', '1', '0') }, /* UNCOMPRESSED 10BIT RGB */
e131922e
BC
71 { CODEC_ID_V210, MKTAG('v', '2', '1', '0') }, /* UNCOMPRESSED 10BIT 4:2:2 */
72
1e5f5e3b
BC
73 { CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') }, /* PhotoJPEG */
74 { CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') }, /* Motion-JPEG (format A) */
75 { CODEC_ID_MJPEG, MKTAG('A', 'V', 'D', 'J') }, /* MJPEG with alpha-channel (AVID JFIF meridien compressed) */
76/* { CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') }, *//* MJPEG with alpha-channel (AVID ABVB/Truevision NuVista) */
c3ebc833 77 { CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') }, /* Motion JPEG OpenDML */
1e5f5e3b
BC
78 { CODEC_ID_MJPEGB, MKTAG('m', 'j', 'p', 'b') }, /* Motion-JPEG (format B) */
79
80 { CODEC_ID_SVQ1, MKTAG('S', 'V', 'Q', '1') }, /* Sorenson Video v1 */
81 { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') }, /* Sorenson Video v1 */
82 { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', 'i') }, /* Sorenson Video v1 (from QT specs)*/
83 { CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') }, /* Sorenson Video v3 */
84
85 { CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
86 { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') }, /* OpenDiVX *//* sample files at http://heroinewarrior.com/xmovie.php3 use this tag */
87 { CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
88 { CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') }, /* experimental: 3IVX files before ivx D4 4.5.1 */
89
90 { CODEC_ID_H263, MKTAG('h', '2', '6', '3') }, /* H263 */
91 { CODEC_ID_H263, MKTAG('s', '2', '6', '3') }, /* H263 ?? works */
92
93 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 'p') }, /* DV PAL */
94 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') }, /* DV NTSC */
95 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'p', 'p') }, /* DVCPRO PAL produced by FCP */
96 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'p') }, /* DVCPRO50 PAL produced by FCP */
97 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'n') }, /* DVCPRO50 NTSC produced by FCP */
98 { CODEC_ID_DVVIDEO, MKTAG('A', 'V', 'd', 'v') }, /* AVID DV */
bea6c1ec 99 { CODEC_ID_DVVIDEO, MKTAG('A', 'V', 'd', '1') }, /* AVID DV100 */
f8007a14
RS
100 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'q') }, /* DVCPRO HD 720p50 */
101 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'p') }, /* DVCPRO HD 720p60 */
c239a65b
BC
102 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
103 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '2') },
104 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '4') },
f8007a14
RS
105 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '5') }, /* DVCPRO HD 50i produced by FCP */
106 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '6') }, /* DVCPRO HD 60i produced by FCP */
107 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '3') }, /* DVCPRO HD 30p produced by FCP */
1e5f5e3b
BC
108
109 { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') }, /* On2 VP3 */
110 { CODEC_ID_RPZA, MKTAG('r', 'p', 'z', 'a') }, /* Apple Video (RPZA) */
111 { CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') }, /* Cinepak */
112 { CODEC_ID_8BPS, MKTAG('8', 'B', 'P', 'S') }, /* Planar RGB (8BPS) */
113 { CODEC_ID_SMC, MKTAG('s', 'm', 'c', ' ') }, /* Apple Graphics (SMC) */
114 { CODEC_ID_QTRLE, MKTAG('r', 'l', 'e', ' ') }, /* Apple Animation (RLE) */
115 { CODEC_ID_MSRLE, MKTAG('W', 'R', 'L', 'E') },
116 { CODEC_ID_QDRAW, MKTAG('q', 'd', 'r', 'w') }, /* QuickDraw */
117
4d35964d
BC
118 { CODEC_ID_RAWVIDEO, MKTAG('W', 'R', 'A', 'W') },
119
1e5f5e3b
BC
120 { CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') }, /* AVC-1/H.264 */
121
122 { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'e', 'g') }, /* MPEG */
67fe5089 123 { CODEC_ID_MPEG1VIDEO, MKTAG('m', '1', 'v', '1') },
138ef0a9
BC
124 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '1') }, /* MPEG2 HDV 720p30 */
125 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '2') }, /* MPEG2 HDV 1080i60 */
126 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '3') }, /* MPEG2 HDV 1080i50 */
127 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '5') }, /* MPEG2 HDV 720p25 */
7fc628ca
BC
128 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '6') }, /* MPEG2 HDV 1080p24 */
129 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '7') }, /* MPEG2 HDV 1080p25 */
130 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '8') }, /* MPEG2 HDV 1080p30 */
1e5f5e3b
BC
131 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'n') }, /* MPEG2 IMX NTSC 525/60 50mb/s produced by FCP */
132 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'p') }, /* MPEG2 IMX PAL 625/50 50mb/s produced by FCP */
d0cbff86
BC
133 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'n') }, /* MPEG2 IMX NTSC 525/60 40mb/s produced by FCP */
134 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'p') }, /* MPEG2 IMX PAL 625/50 40mb/s produced by FCP */
1e5f5e3b
BC
135 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'n') }, /* MPEG2 IMX NTSC 525/60 30mb/s produced by FCP */
136 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'p') }, /* MPEG2 IMX PAL 625/50 30mb/s produced by FCP */
f07fd8c0
BC
137 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '9') }, /* XDCAM HD422 720p60 CBR */
138 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'a') }, /* XDCAM HD422 720p50 CBR */
139 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'b') }, /* XDCAM HD422 1080i60 CBR */
140 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'c') }, /* XDCAM HD422 1080i50 CBR */
141 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'd') }, /* XDCAM HD422 1080p24 CBR */
142 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'e') }, /* XDCAM HD422 1080p25 CBR */
143 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'f') }, /* XDCAM HD422 1080p30 CBR */
144 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '1') }, /* XDCAM EX 720p30 VBR */
8d27c5f8 145 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '2') }, /* XDCAM HD 1080i60 */
f07fd8c0
BC
146 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '3') }, /* XDCAM HD 1080i50 VBR */
147 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '4') }, /* XDCAM EX 720p24 VBR */
148 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '5') }, /* XDCAM EX 720p25 VBR */
149 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '6') }, /* XDCAM HD 1080p24 VBR */
150 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '7') }, /* XDCAM HD 1080p25 VBR */
151 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '8') }, /* XDCAM HD 1080p30 VBR */
152 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '9') }, /* XDCAM EX 720p60 VBR */
153 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'a') }, /* XDCAM EX 720p50 VBR */
154 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'b') }, /* XDCAM EX 1080i60 VBR */
155 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'c') }, /* XDCAM EX 1080i50 VBR */
156 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'd') }, /* XDCAM EX 1080p24 VBR */
157 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'e') }, /* XDCAM EX 1080p25 VBR */
158 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'f') }, /* XDCAM EX 1080p30 VBR */
1e5f5e3b 159 { CODEC_ID_MPEG2VIDEO, MKTAG('A', 'V', 'm', 'p') }, /* AVID IMX PAL */
14ed2d99 160 { CODEC_ID_MPEG2VIDEO, MKTAG('m', '2', 'v', '1') },
1e5f5e3b 161
18cb36fd 162 { CODEC_ID_JPEG2000, MKTAG('m', 'j', 'p', '2') }, /* JPEG 2000 produced by FCP */
1e5f5e3b
BC
163
164 { CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') }, /* Truevision Targa */
165 { CODEC_ID_TIFF, MKTAG('t', 'i', 'f', 'f') }, /* TIFF embedded in MOV */
166 { CODEC_ID_GIF, MKTAG('g', 'i', 'f', ' ') }, /* embedded gif files as frames (usually one "click to play movie" frame) */
167 { CODEC_ID_PNG, MKTAG('p', 'n', 'g', ' ') },
168
169 { CODEC_ID_VC1, MKTAG('v', 'c', '-', '1') }, /* SMPTE RP 2025 */
d4fdba0d 170 { CODEC_ID_CAVS, MKTAG('a', 'v', 's', '2') },
1e5f5e3b 171
c3b13251 172 { CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') },
c06136e0 173 { CODEC_ID_DNXHD, MKTAG('A', 'V', 'd', 'n') }, /* AVID DNxHD */
a0ae3e41 174 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', '1', 'x') }, /* AVID 1:1x */
59ea69ef 175 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', 'u', 'p') },
2d99eed1 176 { CODEC_ID_SGI, MKTAG('s', 'g', 'i', ' ') }, /* SGI */
94d3d6a4 177 { CODEC_ID_DPX, MKTAG('d', 'p', 'x', ' ') }, /* DPX */
c06136e0 178
1e5f5e3b
BC
179 { CODEC_ID_NONE, 0 },
180};
181
182const AVCodecTag codec_movaudio_tags[] = {
183 { CODEC_ID_PCM_S32BE, MKTAG('i', 'n', '3', '2') },
184 { CODEC_ID_PCM_S32LE, MKTAG('i', 'n', '3', '2') },
185 { CODEC_ID_PCM_S24BE, MKTAG('i', 'n', '2', '4') },
186 { CODEC_ID_PCM_S24LE, MKTAG('i', 'n', '2', '4') },
187 { CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's') }, /* 16 bits */
1e5f5e3b
BC
188 { CODEC_ID_PCM_S16LE, MKTAG('s', 'o', 'w', 't') }, /* */
189 { CODEC_ID_PCM_S16LE, MKTAG('l', 'p', 'c', 'm') },
a1ef2c4b 190 { CODEC_ID_PCM_F32BE, MKTAG('f', 'l', '3', '2') },
7c4b7d0f 191 { CODEC_ID_PCM_F32LE, MKTAG('f', 'l', '3', '2') },
a1ef2c4b 192 { CODEC_ID_PCM_F64BE, MKTAG('f', 'l', '6', '4') },
7c4b7d0f 193 { CODEC_ID_PCM_F64LE, MKTAG('f', 'l', '6', '4') },
36264d35 194 { CODEC_ID_PCM_S8, MKTAG('s', 'o', 'w', 't') },
1e5f5e3b 195 { CODEC_ID_PCM_U8, MKTAG('r', 'a', 'w', ' ') }, /* 8 bits unsigned */
bffcf2eb 196 { CODEC_ID_PCM_U8, MKTAG('N', 'O', 'N', 'E') }, /* uncompressed */
1e5f5e3b
BC
197 { CODEC_ID_PCM_MULAW, MKTAG('u', 'l', 'a', 'w') }, /* */
198 { CODEC_ID_PCM_ALAW, MKTAG('a', 'l', 'a', 'w') }, /* */
199
200 { CODEC_ID_ADPCM_IMA_QT, MKTAG('i', 'm', 'a', '4') }, /* IMA-4 ADPCM */
1e5f5e3b
BC
201
202 { CODEC_ID_MACE3, MKTAG('M', 'A', 'C', '3') }, /* Macintosh Audio Compression and Expansion 3:1 */
203 { CODEC_ID_MACE6, MKTAG('M', 'A', 'C', '6') }, /* Macintosh Audio Compression and Expansion 6:1 */
204
0b389aee 205 { CODEC_ID_MP1, MKTAG('.', 'm', 'p', '1') }, /* MPEG layer 1 */
b46f18e5
JGG
206 { CODEC_ID_MP2, MKTAG('.', 'm', 'p', '2') }, /* MPEG layer 2 */
207
1e5f5e3b 208 { CODEC_ID_MP3, MKTAG('.', 'm', 'p', '3') }, /* MPEG layer 3 */ /* sample files at http://www.3ivx.com/showcase.html use this tag */
0174f514 209 { CODEC_ID_MP3, 0x6D730055 }, /* MPEG layer 3 */
1e5f5e3b
BC
210
211/* { CODEC_ID_OGG_VORBIS, MKTAG('O', 'g', 'g', 'S') }, *//* sample files at http://heroinewarrior.com/xmovie.php3 use this tag */
212
213 { CODEC_ID_AAC, MKTAG('m', 'p', '4', 'a') }, /* MPEG-4 AAC */
d4a240cb 214 { CODEC_ID_AC3, MKTAG('a', 'c', '-', '3') }, /* ETSI TS 102 366 Annex F */
34edd994 215 { CODEC_ID_AC3, MKTAG('s', 'a', 'c', '3') }, /* Nero Recode */
1e5f5e3b
BC
216
217 { CODEC_ID_AMR_NB, MKTAG('s', 'a', 'm', 'r') }, /* AMR-NB 3gp */
218 { CODEC_ID_AMR_WB, MKTAG('s', 'a', 'w', 'b') }, /* AMR-WB 3gp */
219
5610f20e 220 { CODEC_ID_GSM, MKTAG('a', 'g', 's', 'm') },
1e5f5e3b 221 { CODEC_ID_ALAC, MKTAG('a', 'l', 'a', 'c') }, /* Apple Lossless */
76f34857
BC
222
223 { CODEC_ID_QCELP, MKTAG('Q','c','l','p') },
be43ae66 224 { CODEC_ID_QCELP, MKTAG('Q','c','l','q') },
76f34857
BC
225 { CODEC_ID_QCELP, MKTAG('s','q','c','p') }, /* ISO Media fourcc */
226
1e5f5e3b
BC
227 { CODEC_ID_QDM2, MKTAG('Q', 'D', 'M', '2') }, /* QDM2 */
228
229 { CODEC_ID_DVAUDIO, MKTAG('v', 'd', 'v', 'a') },
230 { CODEC_ID_DVAUDIO, MKTAG('d', 'v', 'c', 'a') },
231
0c739854
MN
232 { CODEC_ID_WMAV2, MKTAG('W', 'M', 'A', '2') },
233
1e5f5e3b
BC
234 { CODEC_ID_NONE, 0 },
235};
236
1e3c9307 237const AVCodecTag ff_codec_movsubtitle_tags[] = {
cc8c2c6a 238 { CODEC_ID_MOV_TEXT, MKTAG('t', 'e', 'x', 't') },
eb3ba13b 239 { CODEC_ID_MOV_TEXT, MKTAG('t', 'x', '3', 'g') },
1e3c9307
MN
240 { CODEC_ID_NONE, 0 },
241};
242
e40ee6a2
BC
243/* map numeric codes from mdhd atom to ISO 639 */
244/* cf. QTFileFormat.pdf p253, qtff.pdf p205 */
245/* http://developer.apple.com/documentation/mac/Text/Text-368.html */
246/* deprecated by putting the code as 3*5bit ascii */
9b5ede5b 247static const char * const mov_mdhd_language_map[] = {
e40ee6a2
BC
248 /* 0-9 */
249 "eng", "fra", "ger", "ita", "dut", "sve", "spa", "dan", "por", "nor",
250 "heb", "jpn", "ara", "fin", "gre", "ice", "mlt", "tur", "hr "/*scr*/, "chi"/*ace?*/,
251 "urd", "hin", "tha", "kor", "lit", "pol", "hun", "est", "lav", NULL,
252 "fo ", NULL, "rus", "chi", NULL, "iri", "alb", "ron", "ces", "slk",
253 "slv", "yid", "sr ", "mac", "bul", "ukr", "bel", "uzb", "kaz", "aze",
254 /*?*/
255 "aze", "arm", "geo", "mol", "kir", "tgk", "tuk", "mon", NULL, "pus",
256 "kur", "kas", "snd", "tib", "nep", "san", "mar", "ben", "asm", "guj",
257 "pa ", "ori", "mal", "kan", "tam", "tel", NULL, "bur", "khm", "lao",
258 /* roman? arabic? */
259 "vie", "ind", "tgl", "may", "may", "amh", "tir", "orm", "som", "swa",
260 /*==rundi?*/
261 NULL, "run", NULL, "mlg", "epo", NULL, NULL, NULL, NULL, NULL,
262 /* 100 */
263 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
264 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
265 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "wel", "baq",
266 "cat", "lat", "que", "grn", "aym", "tat", "uig", "dzo", "jav"
267};
268
1c90d298 269int ff_mov_iso639_to_lang(const char lang[4], int mp4)
e40ee6a2
BC
270{
271 int i, code = 0;
272
273 /* old way, only for QT? */
37d3e066 274 for (i = 0; !mp4 && i < FF_ARRAY_ELEMS(mov_mdhd_language_map); i++) {
e40ee6a2
BC
275 if (mov_mdhd_language_map[i] && !strcmp(lang, mov_mdhd_language_map[i]))
276 return i;
277 }
278 /* XXX:can we do that in mov too? */
279 if (!mp4)
2904fd39 280 return -1;
e40ee6a2
BC
281 /* handle undefined as such */
282 if (lang[0] == '\0')
283 lang = "und";
284 /* 5bit ascii */
285 for (i = 0; i < 3; i++) {
832ec428
RD
286 uint8_t c = lang[i];
287 c -= 0x60;
288 if (c > 0x1f)
2904fd39 289 return -1;
e40ee6a2 290 code <<= 5;
832ec428 291 code |= c;
e40ee6a2
BC
292 }
293 return code;
294}
295
1c90d298 296int ff_mov_lang_to_iso639(unsigned code, char to[4])
e40ee6a2
BC
297{
298 int i;
1c90d298 299 memset(to, 0, 4);
e40ee6a2
BC
300 /* is it the mangled iso code? */
301 /* see http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt */
302 if (code > 138) {
303 for (i = 2; i >= 0; i--) {
304 to[i] = 0x60 + (code & 0x1f);
305 code >>= 5;
306 }
307 return 1;
308 }
309 /* old fashion apple lang code */
37d3e066 310 if (code >= FF_ARRAY_ELEMS(mov_mdhd_language_map))
e40ee6a2
BC
311 return 0;
312 if (!mov_mdhd_language_map[code])
313 return 0;
314 strncpy(to, mov_mdhd_language_map[code], 4);
315 return 1;
316}