Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavformat
isom.c
Go to the documentation of this file.
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 Libav.
8
*
9
* Libav 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
* Libav 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 Libav; 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_DTS
, 0xA9 },
/* mp4ra.org */
61
{
CODEC_ID_VORBIS
, 0xDD },
/* non standard, gpac uses it */
62
{
CODEC_ID_DVD_SUBTITLE
, 0xE0 },
/* non standard, see unsupported-embedded-subs-2.mp4 */
63
{
CODEC_ID_QCELP
, 0xE1 },
64
{
CODEC_ID_MPEG4SYSTEMS
, 0x01 },
65
{
CODEC_ID_MPEG4SYSTEMS
, 0x02 },
66
{
CODEC_ID_NONE
, 0 },
67
};
68
69
const
AVCodecTag
codec_movvideo_tags
[] = {
70
/* { CODEC_ID_, MKTAG('I', 'V', '5', '0') }, */
/* Indeo 5.0 */
71
72
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'r'
,
'a'
,
'w'
,
' '
) },
/* Uncompressed RGB */
73
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'y'
,
'u'
,
'v'
,
'2'
) },
/* Uncompressed YUV422 */
74
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'V'
,
'U'
,
'I'
) },
/* YUV with alpha-channel (AVID Uncompressed) */
75
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'2'
,
'v'
,
'u'
,
'y'
) },
/* UNCOMPRESSED 8BIT 4:2:2 */
76
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'y'
,
'u'
,
'v'
,
's'
) },
/* same as 2vuy but byte swapped */
77
78
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'L'
,
'5'
,
'5'
,
'5'
) },
79
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'L'
,
'5'
,
'6'
,
'5'
) },
80
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'5'
,
'6'
,
'5'
) },
81
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'2'
,
'4'
,
'B'
,
'G'
) },
82
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
,
'A'
) },
83
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
,
'A'
) },
84
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'B'
,
'G'
,
'R'
) },
85
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'b'
,
'1'
,
'6'
,
'g'
) },
86
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'b'
,
'4'
,
'8'
,
'r'
) },
87
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'D'
,
'V'
,
'O'
,
'O'
) },
/* Digital Voodoo SD 8 Bit */
88
89
{
CODEC_ID_R10K
,
MKTAG
(
'R'
,
'1'
,
'0'
,
'k'
) },
/* UNCOMPRESSED 10BIT RGB */
90
{
CODEC_ID_R10K
,
MKTAG
(
'R'
,
'1'
,
'0'
,
'g'
) },
/* UNCOMPRESSED 10BIT RGB */
91
{
CODEC_ID_R210
,
MKTAG
(
'r'
,
'2'
,
'1'
,
'0'
) },
/* UNCOMPRESSED 10BIT RGB */
92
{
CODEC_ID_V210
,
MKTAG
(
'v'
,
'2'
,
'1'
,
'0'
) },
/* UNCOMPRESSED 10BIT 4:2:2 */
93
{
CODEC_ID_V410
,
MKTAG
(
'v'
,
'4'
,
'1'
,
'0'
) },
/* UNCOMPRESSED 10BIT 4:4:4 */
94
95
{
CODEC_ID_MJPEG
,
MKTAG
(
'j'
,
'p'
,
'e'
,
'g'
) },
/* PhotoJPEG */
96
{
CODEC_ID_MJPEG
,
MKTAG
(
'm'
,
'j'
,
'p'
,
'a'
) },
/* Motion-JPEG (format A) */
97
{
CODEC_ID_MJPEG
,
MKTAG
(
'A'
,
'V'
,
'D'
,
'J'
) },
/* MJPEG with alpha-channel (AVID JFIF meridien compressed) */
98
/* { CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') }, */
/* MJPEG with alpha-channel (AVID ABVB/Truevision NuVista) */
99
{
CODEC_ID_MJPEG
,
MKTAG
(
'd'
,
'm'
,
'b'
,
'1'
) },
/* Motion JPEG OpenDML */
100
{
CODEC_ID_MJPEGB
,
MKTAG
(
'm'
,
'j'
,
'p'
,
'b'
) },
/* Motion-JPEG (format B) */
101
102
{
CODEC_ID_SVQ1
,
MKTAG
(
'S'
,
'V'
,
'Q'
,
'1'
) },
/* Sorenson Video v1 */
103
{
CODEC_ID_SVQ1
,
MKTAG
(
's'
,
'v'
,
'q'
,
'1'
) },
/* Sorenson Video v1 */
104
{
CODEC_ID_SVQ1
,
MKTAG
(
's'
,
'v'
,
'q'
,
'i'
) },
/* Sorenson Video v1 (from QT specs)*/
105
{
CODEC_ID_SVQ3
,
MKTAG
(
'S'
,
'V'
,
'Q'
,
'3'
) },
/* Sorenson Video v3 */
106
107
{
CODEC_ID_MPEG4
,
MKTAG
(
'm'
,
'p'
,
'4'
,
'v'
) },
108
{
CODEC_ID_MPEG4
,
MKTAG
(
'D'
,
'I'
,
'V'
,
'X'
) },
/* OpenDiVX */
/* sample files at http://heroinewarrior.com/xmovie.php3 use this tag */
109
{
CODEC_ID_MPEG4
,
MKTAG
(
'X'
,
'V'
,
'I'
,
'D'
) },
110
{
CODEC_ID_MPEG4
,
MKTAG
(
'3'
,
'I'
,
'V'
,
'2'
) },
/* experimental: 3IVX files before ivx D4 4.5.1 */
111
112
{
CODEC_ID_H263
,
MKTAG
(
'h'
,
'2'
,
'6'
,
'3'
) },
/* H263 */
113
{
CODEC_ID_H263
,
MKTAG
(
's'
,
'2'
,
'6'
,
'3'
) },
/* H263 ?? works */
114
115
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'c'
,
'p'
) },
/* DV PAL */
116
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'c'
,
' '
) },
/* DV NTSC */
117
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'p'
,
'p'
) },
/* DVCPRO PAL produced by FCP */
118
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'5'
,
'p'
) },
/* DVCPRO50 PAL produced by FCP */
119
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'5'
,
'n'
) },
/* DVCPRO50 NTSC produced by FCP */
120
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'A'
,
'V'
,
'd'
,
'v'
) },
/* AVID DV */
121
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'A'
,
'V'
,
'd'
,
'1'
) },
/* AVID DV100 */
122
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'q'
) },
/* DVCPRO HD 720p50 */
123
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'p'
) },
/* DVCPRO HD 720p60 */
124
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'1'
) },
125
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'2'
) },
126
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'4'
) },
127
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'5'
) },
/* DVCPRO HD 50i produced by FCP */
128
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'6'
) },
/* DVCPRO HD 60i produced by FCP */
129
{
CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'3'
) },
/* DVCPRO HD 30p produced by FCP */
130
131
{
CODEC_ID_VP3
,
MKTAG
(
'V'
,
'P'
,
'3'
,
'1'
) },
/* On2 VP3 */
132
{
CODEC_ID_RPZA
,
MKTAG
(
'r'
,
'p'
,
'z'
,
'a'
) },
/* Apple Video (RPZA) */
133
{
CODEC_ID_CINEPAK
,
MKTAG
(
'c'
,
'v'
,
'i'
,
'd'
) },
/* Cinepak */
134
{
CODEC_ID_8BPS
,
MKTAG
(
'8'
,
'B'
,
'P'
,
'S'
) },
/* Planar RGB (8BPS) */
135
{
CODEC_ID_SMC
,
MKTAG
(
's'
,
'm'
,
'c'
,
' '
) },
/* Apple Graphics (SMC) */
136
{
CODEC_ID_QTRLE
,
MKTAG
(
'r'
,
'l'
,
'e'
,
' '
) },
/* Apple Animation (RLE) */
137
{
CODEC_ID_MSRLE
,
MKTAG
(
'W'
,
'R'
,
'L'
,
'E'
) },
138
{
CODEC_ID_QDRAW
,
MKTAG
(
'q'
,
'd'
,
'r'
,
'w'
) },
/* QuickDraw */
139
140
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'W'
,
'R'
,
'A'
,
'W'
) },
141
142
{
CODEC_ID_H264
,
MKTAG
(
'a'
,
'v'
,
'c'
,
'1'
) },
/* AVC-1/H.264 */
143
{
CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'5'
,
'p'
) },
/* AVC-Intra 50M 720p24/30/60 */
144
{
CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'5'
,
'q'
) },
/* AVC-Intra 50M 720p25/50 */
145
{
CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'5'
,
'2'
) },
/* AVC-Intra 50M 1080p25/50 */
146
{
CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'5'
,
'3'
) },
/* AVC-Intra 50M 1080p24/30/60 */
147
{
CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'5'
,
'5'
) },
/* AVC-Intra 50M 1080i50 */
148
{
CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'5'
,
'6'
) },
/* AVC-Intra 50M 1080i60 */
149
{
CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'1'
,
'p'
) },
/* AVC-Intra 100M 720p24/30/60 */
150
{
CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'1'
,
'q'
) },
/* AVC-Intra 100M 720p25/50 */
151
{
CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'1'
,
'2'
) },
/* AVC-Intra 100M 1080p25/50 */
152
{
CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'1'
,
'3'
) },
/* AVC-Intra 100M 1080p24/30/60 */
153
{
CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'1'
,
'5'
) },
/* AVC-Intra 100M 1080i50 */
154
{
CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'1'
,
'6'
) },
/* AVC-Intra 100M 1080i60 */
155
156
{
CODEC_ID_MPEG1VIDEO
,
MKTAG
(
'm'
,
'1'
,
'v'
,
'1'
) },
/* Apple MPEG-1 Camcorder */
157
{
CODEC_ID_MPEG1VIDEO
,
MKTAG
(
'm'
,
'p'
,
'e'
,
'g'
) },
/* MPEG */
158
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'2'
,
'v'
,
'1'
) },
/* Apple MPEG-2 Camcorder */
159
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'1'
) },
/* MPEG2 HDV 720p30 */
160
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'2'
) },
/* MPEG2 HDV 1080i60 */
161
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'3'
) },
/* MPEG2 HDV 1080i50 */
162
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'4'
) },
/* MPEG2 HDV 720p24 */
163
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'5'
) },
/* MPEG2 HDV 720p25 */
164
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'6'
) },
/* MPEG2 HDV 1080p24 */
165
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'7'
) },
/* MPEG2 HDV 1080p25 */
166
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'8'
) },
/* MPEG2 HDV 1080p30 */
167
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'9'
) },
/* MPEG2 HDV 720p60 JVC */
168
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'a'
) },
/* MPEG2 HDV 720p50 */
169
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'x'
,
'5'
,
'n'
) },
/* MPEG2 IMX NTSC 525/60 50mb/s produced by FCP */
170
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'x'
,
'5'
,
'p'
) },
/* MPEG2 IMX PAL 625/50 50mb/s produced by FCP */
171
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'x'
,
'4'
,
'n'
) },
/* MPEG2 IMX NTSC 525/60 40mb/s produced by FCP */
172
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'x'
,
'4'
,
'p'
) },
/* MPEG2 IMX PAL 625/50 40mb/s produced by FCP */
173
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'x'
,
'3'
,
'n'
) },
/* MPEG2 IMX NTSC 525/60 30mb/s produced by FCP */
174
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'x'
,
'3'
,
'p'
) },
/* MPEG2 IMX PAL 625/50 30mb/s produced by FCP */
175
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'4'
) },
/* XDCAM HD422 720p24 CBR */
176
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'5'
) },
/* XDCAM HD422 720p25 CBR */
177
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'9'
) },
/* XDCAM HD422 720p60 CBR */
178
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'a'
) },
/* XDCAM HD422 720p50 CBR */
179
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'b'
) },
/* XDCAM HD422 1080i60 CBR */
180
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'c'
) },
/* XDCAM HD422 1080i50 CBR */
181
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'd'
) },
/* XDCAM HD422 1080p24 CBR */
182
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'e'
) },
/* XDCAM HD422 1080p25 CBR */
183
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'f'
) },
/* XDCAM HD422 1080p30 CBR */
184
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'1'
) },
/* XDCAM EX 720p30 VBR */
185
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'2'
) },
/* XDCAM HD 1080i60 */
186
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'3'
) },
/* XDCAM HD 1080i50 VBR */
187
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'4'
) },
/* XDCAM EX 720p24 VBR */
188
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'5'
) },
/* XDCAM EX 720p25 VBR */
189
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'6'
) },
/* XDCAM HD 1080p24 VBR */
190
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'7'
) },
/* XDCAM HD 1080p25 VBR */
191
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'8'
) },
/* XDCAM HD 1080p30 VBR */
192
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'9'
) },
/* XDCAM EX 720p60 VBR */
193
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'a'
) },
/* XDCAM EX 720p50 VBR */
194
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'b'
) },
/* XDCAM EX 1080i60 VBR */
195
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'c'
) },
/* XDCAM EX 1080i50 VBR */
196
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'd'
) },
/* XDCAM EX 1080p24 VBR */
197
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'e'
) },
/* XDCAM EX 1080p25 VBR */
198
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'f'
) },
/* XDCAM EX 1080p30 VBR */
199
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'h'
,
'd'
) },
/* XDCAM HD 540p */
200
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'h'
,
'2'
) },
/* XDCAM HD422 540p */
201
{
CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'A'
,
'V'
,
'm'
,
'p'
) },
/* AVID IMX PAL */
202
203
{
CODEC_ID_JPEG2000
,
MKTAG
(
'm'
,
'j'
,
'p'
,
'2'
) },
/* JPEG 2000 produced by FCP */
204
205
{
CODEC_ID_TARGA
,
MKTAG
(
't'
,
'g'
,
'a'
,
' '
) },
/* Truevision Targa */
206
{
CODEC_ID_TIFF
,
MKTAG
(
't'
,
'i'
,
'f'
,
'f'
) },
/* TIFF embedded in MOV */
207
{
CODEC_ID_GIF
,
MKTAG
(
'g'
,
'i'
,
'f'
,
' '
) },
/* embedded gif files as frames (usually one "click to play movie" frame) */
208
{
CODEC_ID_PNG
,
MKTAG
(
'p'
,
'n'
,
'g'
,
' '
) },
209
210
{
CODEC_ID_VC1
,
MKTAG
(
'v'
,
'c'
,
'-'
,
'1'
) },
/* SMPTE RP 2025 */
211
{
CODEC_ID_CAVS
,
MKTAG
(
'a'
,
'v'
,
's'
,
'2'
) },
212
213
{
CODEC_ID_DIRAC
,
MKTAG
(
'd'
,
'r'
,
'a'
,
'c'
) },
214
{
CODEC_ID_DNXHD
,
MKTAG
(
'A'
,
'V'
,
'd'
,
'n'
) },
/* AVID DNxHD */
215
{
CODEC_ID_FLV1
,
MKTAG
(
'H'
,
'2'
,
'6'
,
'3'
) },
/* Flash Media Server */
216
{
CODEC_ID_MSMPEG4V3
,
MKTAG
(
'3'
,
'I'
,
'V'
,
'D'
) },
/* 3ivx DivX Doctor */
217
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'V'
,
'1'
,
'x'
) },
/* AVID 1:1x */
218
{
CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'V'
,
'u'
,
'p'
) },
219
{
CODEC_ID_SGI
,
MKTAG
(
's'
,
'g'
,
'i'
,
' '
) },
/* SGI */
220
{
CODEC_ID_DPX
,
MKTAG
(
'd'
,
'p'
,
'x'
,
' '
) },
/* DPX */
221
222
{
CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'c'
,
'h'
) },
/* Apple ProRes 422 High Quality */
223
{
CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'c'
,
'n'
) },
/* Apple ProRes 422 Standard Definition */
224
{
CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'c'
,
's'
) },
/* Apple ProRes 422 LT */
225
{
CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'c'
,
'o'
) },
/* Apple ProRes 422 Proxy */
226
{
CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'4'
,
'h'
) },
/* Apple ProRes 4444 */
227
228
{
CODEC_ID_NONE
, 0 },
229
};
230
231
const
AVCodecTag
codec_movaudio_tags
[] = {
232
{
CODEC_ID_AAC
,
MKTAG
(
'm'
,
'p'
,
'4'
,
'a'
) },
233
{
CODEC_ID_AC3
,
MKTAG
(
'a'
,
'c'
,
'-'
,
'3'
) },
/* ETSI TS 102 366 Annex F */
234
{
CODEC_ID_AC3
,
MKTAG
(
's'
,
'a'
,
'c'
,
'3'
) },
/* Nero Recode */
235
{
CODEC_ID_ADPCM_IMA_QT
,
MKTAG
(
'i'
,
'm'
,
'a'
,
'4'
) },
236
{
CODEC_ID_ALAC
,
MKTAG
(
'a'
,
'l'
,
'a'
,
'c'
) },
237
{
CODEC_ID_AMR_NB
,
MKTAG
(
's'
,
'a'
,
'm'
,
'r'
) },
/* AMR-NB 3gp */
238
{
CODEC_ID_AMR_WB
,
MKTAG
(
's'
,
'a'
,
'w'
,
'b'
) },
/* AMR-WB 3gp */
239
{
CODEC_ID_DTS
,
MKTAG
(
'd'
,
't'
,
's'
,
'c'
) },
/* mp4ra.org */
240
{
CODEC_ID_DTS
,
MKTAG
(
'D'
,
'T'
,
'S'
,
' '
) },
/* non-standard */
241
{
CODEC_ID_DVAUDIO
,
MKTAG
(
'v'
,
'd'
,
'v'
,
'a'
) },
242
{
CODEC_ID_DVAUDIO
,
MKTAG
(
'd'
,
'v'
,
'c'
,
'a'
) },
243
{
CODEC_ID_GSM
,
MKTAG
(
'a'
,
'g'
,
's'
,
'm'
) },
244
{
CODEC_ID_MACE3
,
MKTAG
(
'M'
,
'A'
,
'C'
,
'3'
) },
245
{
CODEC_ID_MACE6
,
MKTAG
(
'M'
,
'A'
,
'C'
,
'6'
) },
246
{
CODEC_ID_MP1
,
MKTAG
(
'.'
,
'm'
,
'p'
,
'1'
) },
247
{
CODEC_ID_MP2
,
MKTAG
(
'.'
,
'm'
,
'p'
,
'2'
) },
248
{
CODEC_ID_MP3
,
MKTAG
(
'.'
,
'm'
,
'p'
,
'3'
) },
249
{
CODEC_ID_MP3
, 0x6D730055 },
250
{
CODEC_ID_NELLYMOSER
,
MKTAG
(
'n'
,
'm'
,
'o'
,
's'
) },
/* Flash Media Server */
251
{
CODEC_ID_PCM_ALAW
,
MKTAG
(
'a'
,
'l'
,
'a'
,
'w'
) },
252
{
CODEC_ID_PCM_F32BE
,
MKTAG
(
'f'
,
'l'
,
'3'
,
'2'
) },
253
{
CODEC_ID_PCM_F32LE
,
MKTAG
(
'f'
,
'l'
,
'3'
,
'2'
) },
254
{
CODEC_ID_PCM_F64BE
,
MKTAG
(
'f'
,
'l'
,
'6'
,
'4'
) },
255
{
CODEC_ID_PCM_F64LE
,
MKTAG
(
'f'
,
'l'
,
'6'
,
'4'
) },
256
{
CODEC_ID_PCM_MULAW
,
MKTAG
(
'u'
,
'l'
,
'a'
,
'w'
) },
257
{
CODEC_ID_PCM_S16BE
,
MKTAG
(
't'
,
'w'
,
'o'
,
's'
) },
258
{
CODEC_ID_PCM_S16LE
,
MKTAG
(
's'
,
'o'
,
'w'
,
't'
) },
259
{
CODEC_ID_PCM_S16LE
,
MKTAG
(
'l'
,
'p'
,
'c'
,
'm'
) },
260
{
CODEC_ID_PCM_S24BE
,
MKTAG
(
'i'
,
'n'
,
'2'
,
'4'
) },
261
{
CODEC_ID_PCM_S24LE
,
MKTAG
(
'i'
,
'n'
,
'2'
,
'4'
) },
262
{
CODEC_ID_PCM_S32BE
,
MKTAG
(
'i'
,
'n'
,
'3'
,
'2'
) },
263
{
CODEC_ID_PCM_S32LE
,
MKTAG
(
'i'
,
'n'
,
'3'
,
'2'
) },
264
{
CODEC_ID_PCM_S8
,
MKTAG
(
's'
,
'o'
,
'w'
,
't'
) },
265
{
CODEC_ID_PCM_U8
,
MKTAG
(
'r'
,
'a'
,
'w'
,
' '
) },
266
{
CODEC_ID_PCM_U8
,
MKTAG
(
'N'
,
'O'
,
'N'
,
'E'
) },
267
{
CODEC_ID_QCELP
,
MKTAG
(
'Q'
,
'c'
,
'l'
,
'p'
) },
268
{
CODEC_ID_QCELP
,
MKTAG
(
'Q'
,
'c'
,
'l'
,
'q'
) },
269
{
CODEC_ID_QCELP
,
MKTAG
(
's'
,
'q'
,
'c'
,
'p'
) },
/* ISO Media fourcc */
270
{
CODEC_ID_QDM2
,
MKTAG
(
'Q'
,
'D'
,
'M'
,
'2'
) },
271
{
CODEC_ID_QDMC
,
MKTAG
(
'Q'
,
'D'
,
'M'
,
'C'
) },
272
{
CODEC_ID_SPEEX
,
MKTAG
(
's'
,
'p'
,
'e'
,
'x'
) },
/* Flash Media Server */
273
{
CODEC_ID_WMAV2
,
MKTAG
(
'W'
,
'M'
,
'A'
,
'2'
) },
274
{
CODEC_ID_NONE
, 0 },
275
};
276
277
const
AVCodecTag
ff_codec_movsubtitle_tags
[] = {
278
{
CODEC_ID_MOV_TEXT
,
MKTAG
(
't'
,
'e'
,
'x'
,
't'
) },
279
{
CODEC_ID_MOV_TEXT
,
MKTAG
(
't'
,
'x'
,
'3'
,
'g'
) },
280
{
CODEC_ID_NONE
, 0 },
281
};
282
283
/* map numeric codes from mdhd atom to ISO 639 */
284
/* cf. QTFileFormat.pdf p253, qtff.pdf p205 */
285
/* http://developer.apple.com/documentation/mac/Text/Text-368.html */
286
/* deprecated by putting the code as 3*5bit ascii */
287
static
const
char
mov_mdhd_language_map
[][4] = {
288
/* 0-9 */
289
"eng"
,
"fra"
,
"ger"
,
"ita"
,
"dut"
,
"sve"
,
"spa"
,
"dan"
,
"por"
,
"nor"
,
290
"heb"
,
"jpn"
,
"ara"
,
"fin"
,
"gre"
,
"ice"
,
"mlt"
,
"tur"
,
"hr "
/*scr*/
,
"chi"
/*ace?*/
,
291
"urd"
,
"hin"
,
"tha"
,
"kor"
,
"lit"
,
"pol"
,
"hun"
,
"est"
,
"lav"
,
""
,
292
"fo "
,
""
,
"rus"
,
"chi"
,
""
,
"iri"
,
"alb"
,
"ron"
,
"ces"
,
"slk"
,
293
"slv"
,
"yid"
,
"sr "
,
"mac"
,
"bul"
,
"ukr"
,
"bel"
,
"uzb"
,
"kaz"
,
"aze"
,
294
/*?*/
295
"aze"
,
"arm"
,
"geo"
,
"mol"
,
"kir"
,
"tgk"
,
"tuk"
,
"mon"
,
""
,
"pus"
,
296
"kur"
,
"kas"
,
"snd"
,
"tib"
,
"nep"
,
"san"
,
"mar"
,
"ben"
,
"asm"
,
"guj"
,
297
"pa "
,
"ori"
,
"mal"
,
"kan"
,
"tam"
,
"tel"
,
""
,
"bur"
,
"khm"
,
"lao"
,
298
/* roman? arabic? */
299
"vie"
,
"ind"
,
"tgl"
,
"may"
,
"may"
,
"amh"
,
"tir"
,
"orm"
,
"som"
,
"swa"
,
300
/*==rundi?*/
301
""
,
"run"
,
""
,
"mlg"
,
"epo"
,
""
,
""
,
""
,
""
,
""
,
302
/* 100 */
303
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
304
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
305
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
"wel"
,
"baq"
,
306
"cat"
,
"lat"
,
"que"
,
"grn"
,
"aym"
,
"tat"
,
"uig"
,
"dzo"
,
"jav"
307
};
308
309
int
ff_mov_iso639_to_lang
(
const
char
lang[4],
int
mp4)
310
{
311
int
i, code = 0;
312
313
/* old way, only for QT? */
314
for
(i = 0; lang[0] && !mp4 && i <
FF_ARRAY_ELEMS
(
mov_mdhd_language_map
); i++) {
315
if
(!strcmp(lang,
mov_mdhd_language_map
[i]))
316
return
i;
317
}
318
/* XXX:can we do that in mov too? */
319
if
(!mp4)
320
return
-1;
321
/* handle undefined as such */
322
if
(lang[0] ==
'\0'
)
323
lang =
"und"
;
324
/* 5bit ascii */
325
for
(i = 0; i < 3; i++) {
326
uint8_t c = lang[i];
327
c -= 0x60;
328
if
(c > 0x1f)
329
return
-1;
330
code <<= 5;
331
code |= c;
332
}
333
return
code;
334
}
335
336
int
ff_mov_lang_to_iso639
(
unsigned
code,
char
to[4])
337
{
338
int
i;
339
memset(to, 0, 4);
340
/* is it the mangled iso code? */
341
/* see http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt */
342
if
(code > 138) {
343
for
(i = 2; i >= 0; i--) {
344
to[i] = 0x60 + (code & 0x1f);
345
code >>= 5;
346
}
347
return
1;
348
}
349
/* old fashion apple lang code */
350
if
(code >=
FF_ARRAY_ELEMS
(
mov_mdhd_language_map
))
351
return
0;
352
if
(!
mov_mdhd_language_map
[code][0])
353
return
0;
354
memcpy(to,
mov_mdhd_language_map
[code], 4);
355
return
1;
356
}
357
358
int
ff_mp4_read_descr_len
(
AVIOContext
*pb)
359
{
360
int
len
= 0;
361
int
count = 4;
362
while
(count--) {
363
int
c =
avio_r8
(pb);
364
len = (len << 7) | (c & 0x7f);
365
if
(!(c & 0x80))
366
break
;
367
}
368
return
len
;
369
}
370
371
int
ff_mp4_read_descr
(
AVFormatContext
*fc,
AVIOContext
*pb,
int
*
tag
)
372
{
373
int
len
;
374
*tag =
avio_r8
(pb);
375
len =
ff_mp4_read_descr_len
(pb);
376
av_dlog
(fc,
"MPEG4 description: tag=0x%02x len=%d\n"
, *tag, len);
377
return
len
;
378
}
379
380
void
ff_mp4_parse_es_descr
(
AVIOContext
*pb,
int
*es_id)
381
{
382
int
flags
;
383
if
(es_id) *es_id =
avio_rb16
(pb);
384
else
avio_rb16
(pb);
385
flags =
avio_r8
(pb);
386
if
(flags & 0x80)
//streamDependenceFlag
387
avio_rb16
(pb);
388
if
(flags & 0x40) {
//URL_Flag
389
int
len
=
avio_r8
(pb);
390
avio_skip
(pb, len);
391
}
392
if
(flags & 0x20)
//OCRstreamFlag
393
avio_rb16
(pb);
394
}
395
396
static
const
AVCodecTag
mp4_audio_types
[] = {
397
{
CODEC_ID_MP3ON4
,
AOT_PS
},
/* old mp3on4 draft */
398
{
CODEC_ID_MP3ON4
,
AOT_L1
},
/* layer 1 */
399
{
CODEC_ID_MP3ON4
,
AOT_L2
},
/* layer 2 */
400
{
CODEC_ID_MP3ON4
,
AOT_L3
},
/* layer 3 */
401
{
CODEC_ID_MP4ALS
,
AOT_ALS
},
/* MPEG-4 ALS */
402
{
CODEC_ID_NONE
,
AOT_NULL
},
403
};
404
405
int
ff_mp4_read_dec_config_descr
(
AVFormatContext
*fc,
AVStream
*st,
AVIOContext
*pb)
406
{
407
int
len
,
tag
;
408
int
object_type_id =
avio_r8
(pb);
409
avio_r8
(pb);
/* stream type */
410
avio_rb24
(pb);
/* buffer size db */
411
avio_rb32
(pb);
/* max bitrate */
412
avio_rb32
(pb);
/* avg bitrate */
413
414
st->
codec
->
codec_id
=
ff_codec_get_id
(ff_mp4_obj_type, object_type_id);
415
av_dlog
(fc,
"esds object type id 0x%02x\n"
, object_type_id);
416
len =
ff_mp4_read_descr
(fc, pb, &tag);
417
if
(tag ==
MP4DecSpecificDescrTag
) {
418
av_dlog
(fc,
"Specific MPEG4 header len=%d\n"
, len);
419
if
(!len || (uint64_t)len > (1<<30))
420
return
-1;
421
av_free
(st->
codec
->
extradata
);
422
st->
codec
->
extradata
=
av_mallocz
(len +
FF_INPUT_BUFFER_PADDING_SIZE
);
423
if
(!st->
codec
->
extradata
)
424
return
AVERROR
(ENOMEM);
425
avio_read
(pb, st->
codec
->
extradata
, len);
426
st->
codec
->
extradata_size
=
len
;
427
if
(st->
codec
->
codec_id
==
CODEC_ID_AAC
) {
428
MPEG4AudioConfig
cfg;
429
avpriv_mpeg4audio_get_config
(&cfg, st->
codec
->
extradata
,
430
st->
codec
->
extradata_size
* 8, 1);
431
st->
codec
->
channels
= cfg.
channels
;
432
if
(cfg.
object_type
== 29 && cfg.
sampling_index
< 3)
// old mp3on4
433
st->
codec
->
sample_rate
=
avpriv_mpa_freq_tab
[cfg.
sampling_index
];
434
else
if
(cfg.
ext_sample_rate
)
435
st->
codec
->
sample_rate
= cfg.
ext_sample_rate
;
436
else
437
st->
codec
->
sample_rate
= cfg.
sample_rate
;
438
av_dlog
(fc,
"mp4a config channels %d obj %d ext obj %d "
439
"sample rate %d ext sample rate %d\n"
, st->
codec
->
channels
,
440
cfg.
object_type
, cfg.
ext_object_type
,
441
cfg.
sample_rate
, cfg.
ext_sample_rate
);
442
if
(!(st->
codec
->
codec_id
=
ff_codec_get_id
(mp4_audio_types,
443
cfg.
object_type
)))
444
st->
codec
->
codec_id
=
CODEC_ID_AAC
;
445
}
446
}
447
return
0;
448
}