Statistics
| Branch: | Revision:

ffmpeg / libavformat / isom.c @ 92ccdfb8

History | View | Annotate | Download (23.4 KB)

1
/*
2
 * ISO Media common code
3
 * Copyright (c) 2001 Fabrice Bellard
4
 * Copyright (c) 2002 Francois Revol <revol@free.fr>
5
 * Copyright (c) 2006 Baptiste Coudurier <baptiste.coudurier@free.fr>
6
 *
7
 * This file is part of FFmpeg.
8
 *
9
 * FFmpeg is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU Lesser General Public
11
 * License as published by the Free Software Foundation; either
12
 * version 2.1 of the License, or (at your option) any later version.
13
 *
14
 * FFmpeg is distributed in the hope that it will be useful,
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
20
 * License along with FFmpeg; if not, write to the Free Software
21
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22
 */
23

    
24
//#define DEBUG
25

    
26
#include "avformat.h"
27
#include "internal.h"
28
#include "isom.h"
29
#include "riff.h"
30
#include "libavcodec/mpeg4audio.h"
31
#include "libavcodec/mpegaudiodata.h"
32

    
33
/* http://www.mp4ra.org */
34
/* ordered by muxing preference */
35
const AVCodecTag ff_mp4_obj_type[] = {
36
    { CODEC_ID_MOV_TEXT  , 0x08 },
37
    { CODEC_ID_MPEG4     , 0x20 },
38
    { CODEC_ID_H264      , 0x21 },
39
    { CODEC_ID_AAC       , 0x40 },
40
    { CODEC_ID_MP4ALS    , 0x40 }, /* 14496-3 ALS */
41
    { CODEC_ID_MPEG2VIDEO, 0x61 }, /* MPEG2 Main */
42
    { CODEC_ID_MPEG2VIDEO, 0x60 }, /* MPEG2 Simple */
43
    { CODEC_ID_MPEG2VIDEO, 0x62 }, /* MPEG2 SNR */
44
    { CODEC_ID_MPEG2VIDEO, 0x63 }, /* MPEG2 Spatial */
45
    { CODEC_ID_MPEG2VIDEO, 0x64 }, /* MPEG2 High */
46
    { CODEC_ID_MPEG2VIDEO, 0x65 }, /* MPEG2 422 */
47
    { CODEC_ID_AAC       , 0x66 }, /* MPEG2 AAC Main */
48
    { CODEC_ID_AAC       , 0x67 }, /* MPEG2 AAC Low */
49
    { CODEC_ID_AAC       , 0x68 }, /* MPEG2 AAC SSR */
50
    { CODEC_ID_MP3       , 0x69 }, /* 13818-3 */
51
    { CODEC_ID_MP2       , 0x69 }, /* 11172-3 */
52
    { CODEC_ID_MPEG1VIDEO, 0x6A }, /* 11172-2 */
53
    { CODEC_ID_MP3       , 0x6B }, /* 11172-3 */
54
    { CODEC_ID_MJPEG     , 0x6C }, /* 10918-1 */
55
    { CODEC_ID_PNG       , 0x6D },
56
    { CODEC_ID_JPEG2000  , 0x6E }, /* 15444-1 */
57
    { CODEC_ID_VC1       , 0xA3 },
58
    { CODEC_ID_DIRAC     , 0xA4 },
59
    { CODEC_ID_AC3       , 0xA5 },
60
    { CODEC_ID_VORBIS    , 0xDD }, /* non standard, gpac uses it */
61
    { CODEC_ID_DVD_SUBTITLE, 0xE0 }, /* non standard, see unsupported-embedded-subs-2.mp4 */
62
    { CODEC_ID_QCELP     , 0xE1 },
63
    { CODEC_ID_NONE      ,    0 },
64
};
65

    
66
const AVCodecTag codec_movvideo_tags[] = {
67
/*  { CODEC_ID_, MKTAG('I', 'V', '5', '0') }, *//* Indeo 5.0 */
68

    
69
    { CODEC_ID_RAWVIDEO, MKTAG('r', 'a', 'w', ' ') }, /* Uncompressed RGB */
70
    { CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') }, /* Uncompressed YUV422 */
71
    { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', 'U', 'I') }, /* YUV with alpha-channel (AVID Uncompressed) */
72
    { CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') }, /* UNCOMPRESSED 8BIT 4:2:2 */
73
    { CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', 's') }, /* same as 2vuy but byte swapped */
74

    
75
    { CODEC_ID_RAWVIDEO, MKTAG('L', '5', '5', '5') },
76
    { CODEC_ID_RAWVIDEO, MKTAG('L', '5', '6', '5') },
77
    { CODEC_ID_RAWVIDEO, MKTAG('B', '5', '6', '5') },
78
    { CODEC_ID_RAWVIDEO, MKTAG('2', '4', 'B', 'G') },
79
    { CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 'A') },
80
    { CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 'A') },
81
    { CODEC_ID_RAWVIDEO, MKTAG('A', 'B', 'G', 'R') },
82
    { CODEC_ID_RAWVIDEO, MKTAG('b', '1', '6', 'g') },
83
    { CODEC_ID_RAWVIDEO, MKTAG('b', '4', '8', 'r') },
84

    
85
    { CODEC_ID_R10K,   MKTAG('R', '1', '0', 'k') }, /* UNCOMPRESSED 10BIT RGB */
86
    { CODEC_ID_R10K,   MKTAG('R', '1', '0', 'g') }, /* UNCOMPRESSED 10BIT RGB */
87
    { CODEC_ID_R210,   MKTAG('r', '2', '1', '0') }, /* UNCOMPRESSED 10BIT RGB */
88
    { CODEC_ID_V210,   MKTAG('v', '2', '1', '0') }, /* UNCOMPRESSED 10BIT 4:2:2 */
89

    
90
    { CODEC_ID_MJPEG,  MKTAG('j', 'p', 'e', 'g') }, /* PhotoJPEG */
91
    { CODEC_ID_MJPEG,  MKTAG('m', 'j', 'p', 'a') }, /* Motion-JPEG (format A) */
92
    { CODEC_ID_MJPEG,  MKTAG('A', 'V', 'D', 'J') }, /* MJPEG with alpha-channel (AVID JFIF meridien compressed) */
93
/*  { CODEC_ID_MJPEG,  MKTAG('A', 'V', 'R', 'n') }, *//* MJPEG with alpha-channel (AVID ABVB/Truevision NuVista) */
94
    { CODEC_ID_MJPEG,  MKTAG('d', 'm', 'b', '1') }, /* Motion JPEG OpenDML */
95
    { CODEC_ID_MJPEGB, MKTAG('m', 'j', 'p', 'b') }, /* Motion-JPEG (format B) */
96

    
97
    { CODEC_ID_SVQ1, MKTAG('S', 'V', 'Q', '1') }, /* Sorenson Video v1 */
98
    { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') }, /* Sorenson Video v1 */
99
    { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', 'i') }, /* Sorenson Video v1 (from QT specs)*/
100
    { CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') }, /* Sorenson Video v3 */
101

    
102
    { CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
103
    { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') }, /* OpenDiVX *//* sample files at http://heroinewarrior.com/xmovie.php3 use this tag */
104
    { CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
105
    { CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') }, /* experimental: 3IVX files before ivx D4 4.5.1 */
106

    
107
    { CODEC_ID_H263, MKTAG('h', '2', '6', '3') }, /* H263 */
108
    { CODEC_ID_H263, MKTAG('s', '2', '6', '3') }, /* H263 ?? works */
109

    
110
    { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 'p') }, /* DV PAL */
111
    { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') }, /* DV NTSC */
112
    { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'p', 'p') }, /* DVCPRO PAL produced by FCP */
113
    { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'p') }, /* DVCPRO50 PAL produced by FCP */
114
    { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'n') }, /* DVCPRO50 NTSC produced by FCP */
115
    { CODEC_ID_DVVIDEO, MKTAG('A', 'V', 'd', 'v') }, /* AVID DV */
116
    { CODEC_ID_DVVIDEO, MKTAG('A', 'V', 'd', '1') }, /* AVID DV100 */
117
    { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'q') }, /* DVCPRO HD 720p50 */
118
    { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'p') }, /* DVCPRO HD 720p60 */
119
    { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
120
    { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '2') },
121
    { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '4') },
122
    { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '5') }, /* DVCPRO HD 50i produced by FCP */
123
    { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '6') }, /* DVCPRO HD 60i produced by FCP */
124
    { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '3') }, /* DVCPRO HD 30p produced by FCP */
125

    
126
    { CODEC_ID_VP3,     MKTAG('V', 'P', '3', '1') }, /* On2 VP3 */
127
    { CODEC_ID_RPZA,    MKTAG('r', 'p', 'z', 'a') }, /* Apple Video (RPZA) */
128
    { CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') }, /* Cinepak */
129
    { CODEC_ID_8BPS,    MKTAG('8', 'B', 'P', 'S') }, /* Planar RGB (8BPS) */
130
    { CODEC_ID_SMC,     MKTAG('s', 'm', 'c', ' ') }, /* Apple Graphics (SMC) */
131
    { CODEC_ID_QTRLE,   MKTAG('r', 'l', 'e', ' ') }, /* Apple Animation (RLE) */
132
    { CODEC_ID_MSRLE,   MKTAG('W', 'R', 'L', 'E') },
133
    { CODEC_ID_QDRAW,   MKTAG('q', 'd', 'r', 'w') }, /* QuickDraw */
134

    
135
    { CODEC_ID_RAWVIDEO, MKTAG('W', 'R', 'A', 'W') },
136

    
137
    { CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') }, /* AVC-1/H.264 */
138
    { CODEC_ID_H264, MKTAG('a', 'i', '5', '5') }, /* AVC Intra  50 / 1080 interlace */
139
    { CODEC_ID_H264, MKTAG('a', 'i', '5', 'q') }, /* AVC Intra  50 /  720 */
140
    { CODEC_ID_H264, MKTAG('a', 'i', '1', '5') }, /* AVC Intra 100 / 1080 interlace */
141
    { CODEC_ID_H264, MKTAG('a', 'i', '1', 'q') }, /* AVC Intra 100 /  720 */
142
    { CODEC_ID_H264, MKTAG('a', 'i', '1', '2') }, /* AVC Intra 100 / 1080 */
143

    
144
    { CODEC_ID_MPEG1VIDEO, MKTAG('m', '1', 'v', '1') }, /* Apple MPEG-1 Camcorder */
145
    { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'e', 'g') }, /* MPEG */
146
    { CODEC_ID_MPEG2VIDEO, MKTAG('m', '2', 'v', '1') }, /* Apple MPEG-2 Camcorder */
147
    { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '1') }, /* MPEG2 HDV 720p30 */
148
    { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '2') }, /* MPEG2 HDV 1080i60 */
149
    { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '3') }, /* MPEG2 HDV 1080i50 */
150
    { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '5') }, /* MPEG2 HDV 720p25 */
151
    { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '6') }, /* MPEG2 HDV 1080p24 */
152
    { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '7') }, /* MPEG2 HDV 1080p25 */
153
    { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '8') }, /* MPEG2 HDV 1080p30 */
154
    { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'n') }, /* MPEG2 IMX NTSC 525/60 50mb/s produced by FCP */
155
    { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'p') }, /* MPEG2 IMX PAL 625/50 50mb/s produced by FCP */
156
    { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'n') }, /* MPEG2 IMX NTSC 525/60 40mb/s produced by FCP */
157
    { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'p') }, /* MPEG2 IMX PAL 625/50 40mb/s produced by FCP */
158
    { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'n') }, /* MPEG2 IMX NTSC 525/60 30mb/s produced by FCP */
159
    { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'p') }, /* MPEG2 IMX PAL 625/50 30mb/s produced by FCP */
160
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '4') }, /* XDCAM HD422 720p24 CBR */
161
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '5') }, /* XDCAM HD422 720p25 CBR */
162
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '9') }, /* XDCAM HD422 720p60 CBR */
163
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'a') }, /* XDCAM HD422 720p50 CBR */
164
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'b') }, /* XDCAM HD422 1080i60 CBR */
165
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'c') }, /* XDCAM HD422 1080i50 CBR */
166
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'd') }, /* XDCAM HD422 1080p24 CBR */
167
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'e') }, /* XDCAM HD422 1080p25 CBR */
168
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'f') }, /* XDCAM HD422 1080p30 CBR */
169
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '1') }, /* XDCAM EX 720p30 VBR */
170
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '2') }, /* XDCAM HD 1080i60 */
171
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '3') }, /* XDCAM HD 1080i50 VBR */
172
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '4') }, /* XDCAM EX 720p24 VBR */
173
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '5') }, /* XDCAM EX 720p25 VBR */
174
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '6') }, /* XDCAM HD 1080p24 VBR */
175
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '7') }, /* XDCAM HD 1080p25 VBR */
176
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '8') }, /* XDCAM HD 1080p30 VBR */
177
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '9') }, /* XDCAM EX 720p60 VBR */
178
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'a') }, /* XDCAM EX 720p50 VBR */
179
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'b') }, /* XDCAM EX 1080i60 VBR */
180
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'c') }, /* XDCAM EX 1080i50 VBR */
181
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'd') }, /* XDCAM EX 1080p24 VBR */
182
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'e') }, /* XDCAM EX 1080p25 VBR */
183
    { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'f') }, /* XDCAM EX 1080p30 VBR */
184
    { CODEC_ID_MPEG2VIDEO, MKTAG('A', 'V', 'm', 'p') }, /* AVID IMX PAL */
185

    
186
    { CODEC_ID_JPEG2000, MKTAG('m', 'j', 'p', '2') }, /* JPEG 2000 produced by FCP */
187

    
188
    { CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') }, /* Truevision Targa */
189
    { CODEC_ID_TIFF,  MKTAG('t', 'i', 'f', 'f') }, /* TIFF embedded in MOV */
190
    { CODEC_ID_GIF,   MKTAG('g', 'i', 'f', ' ') }, /* embedded gif files as frames (usually one "click to play movie" frame) */
191
    { CODEC_ID_PNG,   MKTAG('p', 'n', 'g', ' ') },
192

    
193
    { CODEC_ID_VC1, MKTAG('v', 'c', '-', '1') }, /* SMPTE RP 2025 */
194
    { CODEC_ID_CAVS, MKTAG('a', 'v', 's', '2') },
195

    
196
    { CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') },
197
    { CODEC_ID_DNXHD, MKTAG('A', 'V', 'd', 'n') }, /* AVID DNxHD */
198
    { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', '1', 'x') }, /* AVID 1:1x */
199
    { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', 'u', 'p') },
200
    { CODEC_ID_SGI,   MKTAG('s', 'g', 'i', ' ') }, /* SGI  */
201
    { CODEC_ID_DPX,   MKTAG('d', 'p', 'x', ' ') }, /* DPX */
202

    
203
    { CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 'h') }, /* Apple ProRes 422 High Quality */
204
    { CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 'n') }, /* Apple ProRes 422 Standard Definition */
205
    { CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 's') }, /* Apple ProRes 422 LT */
206
    { CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 'o') }, /* Apple ProRes 422 Proxy */
207
    { CODEC_ID_PRORES, MKTAG('a', 'p', '4', 'h') }, /* Apple ProRes 4444 */
208

    
209
    { CODEC_ID_NONE, 0 },
210
};
211

    
212
const AVCodecTag codec_movaudio_tags[] = {
213
    { CODEC_ID_PCM_S32BE, MKTAG('i', 'n', '3', '2') },
214
    { CODEC_ID_PCM_S32LE, MKTAG('i', 'n', '3', '2') },
215
    { CODEC_ID_PCM_S24BE, MKTAG('i', 'n', '2', '4') },
216
    { CODEC_ID_PCM_S24LE, MKTAG('i', 'n', '2', '4') },
217
    { CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's') }, /* 16 bits */
218
    { CODEC_ID_PCM_S16LE, MKTAG('s', 'o', 'w', 't') }, /*  */
219
    { CODEC_ID_PCM_S16LE, MKTAG('l', 'p', 'c', 'm') },
220
    { CODEC_ID_PCM_F32BE, MKTAG('f', 'l', '3', '2') },
221
    { CODEC_ID_PCM_F32LE, MKTAG('f', 'l', '3', '2') },
222
    { CODEC_ID_PCM_F64BE, MKTAG('f', 'l', '6', '4') },
223
    { CODEC_ID_PCM_F64LE, MKTAG('f', 'l', '6', '4') },
224
    { CODEC_ID_PCM_S8,    MKTAG('s', 'o', 'w', 't') },
225
    { CODEC_ID_PCM_U8,    MKTAG('r', 'a', 'w', ' ') }, /* 8 bits unsigned */
226
    { CODEC_ID_PCM_U8,    MKTAG('N', 'O', 'N', 'E') }, /* uncompressed */
227
    { CODEC_ID_PCM_MULAW, MKTAG('u', 'l', 'a', 'w') }, /*  */
228
    { CODEC_ID_PCM_ALAW,  MKTAG('a', 'l', 'a', 'w') }, /*  */
229

    
230
    { CODEC_ID_ADPCM_IMA_QT, MKTAG('i', 'm', 'a', '4') }, /* IMA-4 ADPCM */
231

    
232
    { CODEC_ID_MACE3, MKTAG('M', 'A', 'C', '3') }, /* Macintosh Audio Compression and Expansion 3:1 */
233
    { CODEC_ID_MACE6, MKTAG('M', 'A', 'C', '6') }, /* Macintosh Audio Compression and Expansion 6:1 */
234

    
235
    { CODEC_ID_MP1, MKTAG('.', 'm', 'p', '1') }, /* MPEG layer 1 */
236
    { CODEC_ID_MP2, MKTAG('.', 'm', 'p', '2') }, /* MPEG layer 2 */
237

    
238
    { CODEC_ID_MP3, MKTAG('.', 'm', 'p', '3') }, /* MPEG layer 3 */ /* sample files at http://www.3ivx.com/showcase.html use this tag */
239
    { CODEC_ID_MP3, 0x6D730055 }, /* MPEG layer 3 */
240

    
241
/*  { CODEC_ID_OGG_VORBIS, MKTAG('O', 'g', 'g', 'S') }, *//* sample files at http://heroinewarrior.com/xmovie.php3 use this tag */
242

    
243
    { CODEC_ID_AAC, MKTAG('m', 'p', '4', 'a') }, /* MPEG-4 AAC */
244
    { CODEC_ID_AC3, MKTAG('a', 'c', '-', '3') }, /* ETSI TS 102 366 Annex F */
245
    { CODEC_ID_AC3, MKTAG('s', 'a', 'c', '3') }, /* Nero Recode */
246

    
247
    { CODEC_ID_AMR_NB, MKTAG('s', 'a', 'm', 'r') }, /* AMR-NB 3gp */
248
    { CODEC_ID_AMR_WB, MKTAG('s', 'a', 'w', 'b') }, /* AMR-WB 3gp */
249

    
250
    { CODEC_ID_GSM,  MKTAG('a', 'g', 's', 'm') },
251
    { CODEC_ID_ALAC, MKTAG('a', 'l', 'a', 'c') }, /* Apple Lossless */
252

    
253
    { CODEC_ID_QCELP, MKTAG('Q','c','l','p') },
254
    { CODEC_ID_QCELP, MKTAG('Q','c','l','q') },
255
    { CODEC_ID_QCELP, MKTAG('s','q','c','p') }, /* ISO Media fourcc */
256

    
257
    { CODEC_ID_QDMC, MKTAG('Q', 'D', 'M', 'C') }, /* QDMC */
258
    { CODEC_ID_QDM2, MKTAG('Q', 'D', 'M', '2') }, /* QDM2 */
259

    
260
    { CODEC_ID_DVAUDIO, MKTAG('v', 'd', 'v', 'a') },
261
    { CODEC_ID_DVAUDIO, MKTAG('d', 'v', 'c', 'a') },
262

    
263
    { CODEC_ID_WMAV2, MKTAG('W', 'M', 'A', '2') },
264

    
265
    { CODEC_ID_NONE, 0 },
266
};
267

    
268
const AVCodecTag ff_codec_movsubtitle_tags[] = {
269
    { CODEC_ID_MOV_TEXT, MKTAG('t', 'e', 'x', 't') },
270
    { CODEC_ID_MOV_TEXT, MKTAG('t', 'x', '3', 'g') },
271
    { CODEC_ID_NONE, 0 },
272
};
273

    
274
/* map numeric codes from mdhd atom to ISO 639 */
275
/* cf. QTFileFormat.pdf p253, qtff.pdf p205 */
276
/* http://developer.apple.com/documentation/mac/Text/Text-368.html */
277
/* deprecated by putting the code as 3*5bit ascii */
278
static const char mov_mdhd_language_map[][4] = {
279
    /* 0-9 */
280
    "eng", "fra", "ger", "ita", "dut", "sve", "spa", "dan", "por", "nor",
281
    "heb", "jpn", "ara", "fin", "gre", "ice", "mlt", "tur", "hr "/*scr*/, "chi"/*ace?*/,
282
    "urd", "hin", "tha", "kor", "lit", "pol", "hun", "est", "lav",    "",
283
    "fo ",    "", "rus", "chi",    "", "iri", "alb", "ron", "ces", "slk",
284
    "slv", "yid", "sr ", "mac", "bul", "ukr", "bel", "uzb", "kaz", "aze",
285
    /*?*/
286
    "aze", "arm", "geo", "mol", "kir", "tgk", "tuk", "mon",    "", "pus",
287
    "kur", "kas", "snd", "tib", "nep", "san", "mar", "ben", "asm", "guj",
288
    "pa ", "ori", "mal", "kan", "tam", "tel",    "", "bur", "khm", "lao",
289
    /*                   roman? arabic? */
290
    "vie", "ind", "tgl", "may", "may", "amh", "tir", "orm", "som", "swa",
291
    /*==rundi?*/
292
       "", "run",    "", "mlg", "epo",    "",    "",    "",    "",    "",
293
    /* 100 */
294
       "",    "",    "",    "",    "",    "",    "",    "",    "",    "",
295
       "",    "",    "",    "",    "",    "",    "",    "",    "",    "",
296
       "",    "",    "",    "",    "",    "",    "",    "", "wel", "baq",
297
    "cat", "lat", "que", "grn", "aym", "tat", "uig", "dzo", "jav"
298
};
299

    
300
int ff_mov_iso639_to_lang(const char lang[4], int mp4)
301
{
302
    int i, code = 0;
303

    
304
    /* old way, only for QT? */
305
    for (i = 0; lang[0] && !mp4 && i < FF_ARRAY_ELEMS(mov_mdhd_language_map); i++) {
306
        if (!strcmp(lang, mov_mdhd_language_map[i]))
307
            return i;
308
    }
309
    /* XXX:can we do that in mov too? */
310
    if (!mp4)
311
        return -1;
312
    /* handle undefined as such */
313
    if (lang[0] == '\0')
314
        lang = "und";
315
    /* 5bit ascii */
316
    for (i = 0; i < 3; i++) {
317
        uint8_t c = lang[i];
318
        c -= 0x60;
319
        if (c > 0x1f)
320
            return -1;
321
        code <<= 5;
322
        code |= c;
323
    }
324
    return code;
325
}
326

    
327
int ff_mov_lang_to_iso639(unsigned code, char to[4])
328
{
329
    int i;
330
    memset(to, 0, 4);
331
    /* is it the mangled iso code? */
332
    /* see http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt */
333
    if (code > 138) {
334
        for (i = 2; i >= 0; i--) {
335
            to[i] = 0x60 + (code & 0x1f);
336
            code >>= 5;
337
        }
338
        return 1;
339
    }
340
    /* old fashion apple lang code */
341
    if (code >= FF_ARRAY_ELEMS(mov_mdhd_language_map))
342
        return 0;
343
    if (!mov_mdhd_language_map[code][0])
344
        return 0;
345
    memcpy(to, mov_mdhd_language_map[code], 4);
346
    return 1;
347
}
348

    
349
int ff_mp4_read_descr_len(AVIOContext *pb)
350
{
351
    int len = 0;
352
    int count = 4;
353
    while (count--) {
354
        int c = avio_r8(pb);
355
        len = (len << 7) | (c & 0x7f);
356
        if (!(c & 0x80))
357
            break;
358
    }
359
    return len;
360
}
361

    
362
int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag)
363
{
364
    int len;
365
    *tag = avio_r8(pb);
366
    len = ff_mp4_read_descr_len(pb);
367
    av_dlog(fc, "MPEG4 description: tag=0x%02x len=%d\n", *tag, len);
368
    return len;
369
}
370

    
371
static const AVCodecTag mp4_audio_types[] = {
372
    { CODEC_ID_MP3ON4, AOT_PS   }, /* old mp3on4 draft */
373
    { CODEC_ID_MP3ON4, AOT_L1   }, /* layer 1 */
374
    { CODEC_ID_MP3ON4, AOT_L2   }, /* layer 2 */
375
    { CODEC_ID_MP3ON4, AOT_L3   }, /* layer 3 */
376
    { CODEC_ID_MP4ALS, AOT_ALS  }, /* MPEG-4 ALS */
377
    { CODEC_ID_NONE,   AOT_NULL },
378
};
379

    
380
int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb)
381
{
382
    int len, tag;
383
    int object_type_id = avio_r8(pb);
384
    avio_r8(pb); /* stream type */
385
    avio_rb24(pb); /* buffer size db */
386
    avio_rb32(pb); /* max bitrate */
387
    avio_rb32(pb); /* avg bitrate */
388

    
389
    st->codec->codec_id= ff_codec_get_id(ff_mp4_obj_type, object_type_id);
390
    av_dlog(fc, "esds object type id 0x%02x\n", object_type_id);
391
    len = ff_mp4_read_descr(fc, pb, &tag);
392
    if (tag == MP4DecSpecificDescrTag) {
393
        av_dlog(fc, "Specific MPEG4 header len=%d\n", len);
394
        if((uint64_t)len > (1<<30))
395
            return -1;
396
        av_free(st->codec->extradata);
397
        st->codec->extradata = av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);
398
        if (!st->codec->extradata)
399
            return AVERROR(ENOMEM);
400
        avio_read(pb, st->codec->extradata, len);
401
        st->codec->extradata_size = len;
402
        if (st->codec->codec_id == CODEC_ID_AAC) {
403
            MPEG4AudioConfig cfg;
404
            ff_mpeg4audio_get_config(&cfg, st->codec->extradata,
405
                                     st->codec->extradata_size);
406
            st->codec->channels = cfg.channels;
407
            if (cfg.object_type == 29 && cfg.sampling_index < 3) // old mp3on4
408
                st->codec->sample_rate = ff_mpa_freq_tab[cfg.sampling_index];
409
            else if (cfg.ext_sample_rate)
410
                st->codec->sample_rate = cfg.ext_sample_rate;
411
            else
412
                st->codec->sample_rate = cfg.sample_rate;
413
            av_dlog(fc, "mp4a config channels %d obj %d ext obj %d "
414
                    "sample rate %d ext sample rate %d\n", st->codec->channels,
415
                    cfg.object_type, cfg.ext_object_type,
416
                    cfg.sample_rate, cfg.ext_sample_rate);
417
            if (!(st->codec->codec_id = ff_codec_get_id(mp4_audio_types,
418
                                                        cfg.object_type)))
419
                st->codec->codec_id = CODEC_ID_AAC;
420
        }
421
    }
422
    return 0;
423
}
424

    
425
typedef struct MovChannelLayout {
426
    int64_t  channel_layout;
427
    uint32_t layout_tag;
428
} MovChannelLayout;
429

    
430
static const MovChannelLayout mov_channel_layout[] = {
431
    { AV_CH_LAYOUT_MONO,                         (100<<16) | 1}, //< kCAFChannelLayoutTag_Mono
432
    { AV_CH_LAYOUT_STEREO,                       (101<<16) | 2}, //< kCAFChannelLayoutTag_Stereo
433
    { AV_CH_LAYOUT_STEREO,                       (102<<16) | 2}, //< kCAFChannelLayoutTag_StereoHeadphones
434
    { AV_CH_LAYOUT_2_1,                          (131<<16) | 3}, //< kCAFChannelLayoutTag_ITU_2_1
435
    { AV_CH_LAYOUT_QUAD,                         (132<<16) | 4}, //< kCAFChannelLayoutTag_ITU_2_2
436
    { AV_CH_LAYOUT_2_2,                          (132<<16) | 4}, //< kCAFChannelLayoutTag_ITU_2_2
437
    { AV_CH_LAYOUT_QUAD,                         (108<<16) | 4}, //< kCAFChannelLayoutTag_Quadraphonic
438
    { AV_CH_LAYOUT_SURROUND,                     (113<<16) | 3}, //< kCAFChannelLayoutTag_MPEG_3_0_A
439
    { AV_CH_LAYOUT_4POINT0,                      (115<<16) | 4}, //< kCAFChannelLayoutTag_MPEG_4_0_A
440
    { AV_CH_LAYOUT_5POINT0_BACK,                 (117<<16) | 5}, //< kCAFChannelLayoutTag_MPEG_5_0_A
441
    { AV_CH_LAYOUT_5POINT0,                      (117<<16) | 5}, //< kCAFChannelLayoutTag_MPEG_5_0_A
442
    { AV_CH_LAYOUT_5POINT1_BACK,                 (121<<16) | 6}, //< kCAFChannelLayoutTag_MPEG_5_1_A
443
    { AV_CH_LAYOUT_5POINT1,                      (121<<16) | 6}, //< kCAFChannelLayoutTag_MPEG_5_1_A
444
    { AV_CH_LAYOUT_7POINT1,                      (128<<16) | 8}, //< kCAFChannelLayoutTag_MPEG_7_1_C
445
    { AV_CH_LAYOUT_7POINT1_WIDE,                 (126<<16) | 8}, //< kCAFChannelLayoutTag_MPEG_7_1_A
446
    { AV_CH_LAYOUT_5POINT1_BACK|AV_CH_LAYOUT_STEREO_DOWNMIX, (130<<16) | 8}, //< kCAFChannelLayoutTag_SMPTE_DTV
447
    { AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY,   (133<<16) | 3}, //< kCAFChannelLayoutTag_DVD_4
448
    { AV_CH_LAYOUT_2_1|AV_CH_LOW_FREQUENCY,      (134<<16) | 4}, //< kCAFChannelLayoutTag_DVD_5
449
    { AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY,     (135<<16) | 4}, //< kCAFChannelLayoutTag_DVD_6
450
    { AV_CH_LAYOUT_2_2|AV_CH_LOW_FREQUENCY,      (135<<16) | 4}, //< kCAFChannelLayoutTag_DVD_6
451
    { AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY, (136<<16) | 4}, //< kCAFChannelLayoutTag_DVD_10
452
    { AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY,  (137<<16) | 5}, //< kCAFChannelLayoutTag_DVD_11
453
    { 0, 0},
454
};
455

    
456
void ff_mov_read_chan(AVFormatContext *s, int64_t size, AVCodecContext *codec)
457
{
458
    uint32_t layout_tag;
459
    AVIOContext *pb = s->pb;
460
    const MovChannelLayout *layouts = mov_channel_layout;
461
    if (size != 12) {
462
        // Channel descriptions not implemented
463
        av_log_ask_for_sample(s, "Unimplemented container channel layout.\n");
464
        avio_skip(pb, size);
465
        return;
466
    }
467
    layout_tag = avio_rb32(pb);
468
    if (layout_tag == 0x10000) { //< kCAFChannelLayoutTag_UseChannelBitmap
469
        codec->channel_layout = avio_rb32(pb);
470
        avio_skip(pb, 4);
471
        return;
472
    }
473
    while (layouts->channel_layout) {
474
        if (layout_tag == layouts->layout_tag) {
475
            codec->channel_layout = layouts->channel_layout;
476
            break;
477
        }
478
        layouts++;
479
    }
480
    if (!codec->channel_layout)
481
        av_log(s, AV_LOG_WARNING, "Unknown container channel layout.\n");
482
    avio_skip(pb, 8);
483
}
484