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 "
libavcodec/mpeg4audio.h
"
30
#include "
libavcodec/mpegaudiodata.h
"
31
32
/* http://www.mp4ra.org */
33
/* ordered by muxing preference */
34
const
AVCodecTag
ff_mp4_obj_type
[] = {
35
{
AV_CODEC_ID_MOV_TEXT
, 0x08 },
36
{
AV_CODEC_ID_MPEG4
, 0x20 },
37
{
AV_CODEC_ID_H264
, 0x21 },
38
{
AV_CODEC_ID_AAC
, 0x40 },
39
{
AV_CODEC_ID_MP4ALS
, 0x40 },
/* 14496-3 ALS */
40
{
AV_CODEC_ID_MPEG2VIDEO
, 0x61 },
/* MPEG2 Main */
41
{
AV_CODEC_ID_MPEG2VIDEO
, 0x60 },
/* MPEG2 Simple */
42
{
AV_CODEC_ID_MPEG2VIDEO
, 0x62 },
/* MPEG2 SNR */
43
{
AV_CODEC_ID_MPEG2VIDEO
, 0x63 },
/* MPEG2 Spatial */
44
{
AV_CODEC_ID_MPEG2VIDEO
, 0x64 },
/* MPEG2 High */
45
{
AV_CODEC_ID_MPEG2VIDEO
, 0x65 },
/* MPEG2 422 */
46
{
AV_CODEC_ID_AAC
, 0x66 },
/* MPEG2 AAC Main */
47
{
AV_CODEC_ID_AAC
, 0x67 },
/* MPEG2 AAC Low */
48
{
AV_CODEC_ID_AAC
, 0x68 },
/* MPEG2 AAC SSR */
49
{
AV_CODEC_ID_MP3
, 0x69 },
/* 13818-3 */
50
{
AV_CODEC_ID_MP2
, 0x69 },
/* 11172-3 */
51
{
AV_CODEC_ID_MPEG1VIDEO
, 0x6A },
/* 11172-2 */
52
{
AV_CODEC_ID_MP3
, 0x6B },
/* 11172-3 */
53
{
AV_CODEC_ID_MJPEG
, 0x6C },
/* 10918-1 */
54
{
AV_CODEC_ID_PNG
, 0x6D },
55
{
AV_CODEC_ID_JPEG2000
, 0x6E },
/* 15444-1 */
56
{
AV_CODEC_ID_VC1
, 0xA3 },
57
{
AV_CODEC_ID_DIRAC
, 0xA4 },
58
{
AV_CODEC_ID_AC3
, 0xA5 },
59
{
AV_CODEC_ID_DTS
, 0xA9 },
/* mp4ra.org */
60
{
AV_CODEC_ID_VORBIS
, 0xDD },
/* non standard, gpac uses it */
61
{
AV_CODEC_ID_DVD_SUBTITLE
, 0xE0 },
/* non standard, see unsupported-embedded-subs-2.mp4 */
62
{
AV_CODEC_ID_QCELP
, 0xE1 },
63
{
AV_CODEC_ID_MPEG4SYSTEMS
, 0x01 },
64
{
AV_CODEC_ID_MPEG4SYSTEMS
, 0x02 },
65
{
AV_CODEC_ID_NONE
, 0 },
66
};
67
68
const
AVCodecTag
ff_codec_movvideo_tags
[] = {
69
/* { AV_CODEC_ID_, MKTAG('I', 'V', '5', '0') }, */
/* Indeo 5.0 */
70
71
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'r'
,
'a'
,
'w'
,
' '
) },
/* Uncompressed RGB */
72
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'y'
,
'u'
,
'v'
,
'2'
) },
/* Uncompressed YUV422 */
73
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'V'
,
'U'
,
'I'
) },
/* YUV with alpha-channel (AVID Uncompressed) */
74
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'2'
,
'v'
,
'u'
,
'y'
) },
/* UNCOMPRESSED 8BIT 4:2:2 */
75
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'y'
,
'u'
,
'v'
,
's'
) },
/* same as 2vuy but byte swapped */
76
77
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'L'
,
'5'
,
'5'
,
'5'
) },
78
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'L'
,
'5'
,
'6'
,
'5'
) },
79
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'5'
,
'6'
,
'5'
) },
80
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'2'
,
'4'
,
'B'
,
'G'
) },
81
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'B'
,
'G'
,
'R'
,
'A'
) },
82
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'R'
,
'G'
,
'B'
,
'A'
) },
83
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'B'
,
'G'
,
'R'
) },
84
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'b'
,
'1'
,
'6'
,
'g'
) },
85
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'b'
,
'4'
,
'8'
,
'r'
) },
86
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'D'
,
'V'
,
'O'
,
'O'
) },
/* Digital Voodoo SD 8 Bit */
87
88
{
AV_CODEC_ID_R10K
,
MKTAG
(
'R'
,
'1'
,
'0'
,
'k'
) },
/* UNCOMPRESSED 10BIT RGB */
89
{
AV_CODEC_ID_R10K
,
MKTAG
(
'R'
,
'1'
,
'0'
,
'g'
) },
/* UNCOMPRESSED 10BIT RGB */
90
{
AV_CODEC_ID_R210
,
MKTAG
(
'r'
,
'2'
,
'1'
,
'0'
) },
/* UNCOMPRESSED 10BIT RGB */
91
{
AV_CODEC_ID_V210
,
MKTAG
(
'v'
,
'2'
,
'1'
,
'0'
) },
/* UNCOMPRESSED 10BIT 4:2:2 */
92
{
AV_CODEC_ID_V410
,
MKTAG
(
'v'
,
'4'
,
'1'
,
'0'
) },
/* UNCOMPRESSED 10BIT 4:4:4 */
93
94
{
AV_CODEC_ID_MJPEG
,
MKTAG
(
'j'
,
'p'
,
'e'
,
'g'
) },
/* PhotoJPEG */
95
{
AV_CODEC_ID_MJPEG
,
MKTAG
(
'm'
,
'j'
,
'p'
,
'a'
) },
/* Motion-JPEG (format A) */
96
{
AV_CODEC_ID_MJPEG
,
MKTAG
(
'A'
,
'V'
,
'D'
,
'J'
) },
/* MJPEG with alpha-channel (AVID JFIF meridien compressed) */
97
/* { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') }, */
/* MJPEG with alpha-channel (AVID ABVB/Truevision NuVista) */
98
{
AV_CODEC_ID_MJPEG
,
MKTAG
(
'd'
,
'm'
,
'b'
,
'1'
) },
/* Motion JPEG OpenDML */
99
{
AV_CODEC_ID_MJPEGB
,
MKTAG
(
'm'
,
'j'
,
'p'
,
'b'
) },
/* Motion-JPEG (format B) */
100
101
{
AV_CODEC_ID_SVQ1
,
MKTAG
(
'S'
,
'V'
,
'Q'
,
'1'
) },
/* Sorenson Video v1 */
102
{
AV_CODEC_ID_SVQ1
,
MKTAG
(
's'
,
'v'
,
'q'
,
'1'
) },
/* Sorenson Video v1 */
103
{
AV_CODEC_ID_SVQ1
,
MKTAG
(
's'
,
'v'
,
'q'
,
'i'
) },
/* Sorenson Video v1 (from QT specs)*/
104
{
AV_CODEC_ID_SVQ3
,
MKTAG
(
'S'
,
'V'
,
'Q'
,
'3'
) },
/* Sorenson Video v3 */
105
106
{
AV_CODEC_ID_MPEG4
,
MKTAG
(
'm'
,
'p'
,
'4'
,
'v'
) },
107
{
AV_CODEC_ID_MPEG4
,
MKTAG
(
'D'
,
'I'
,
'V'
,
'X'
) },
/* OpenDiVX */
/* sample files at http://heroinewarrior.com/xmovie.php3 use this tag */
108
{
AV_CODEC_ID_MPEG4
,
MKTAG
(
'X'
,
'V'
,
'I'
,
'D'
) },
109
{
AV_CODEC_ID_MPEG4
,
MKTAG
(
'3'
,
'I'
,
'V'
,
'2'
) },
/* experimental: 3IVX files before ivx D4 4.5.1 */
110
111
{
AV_CODEC_ID_H263
,
MKTAG
(
'h'
,
'2'
,
'6'
,
'3'
) },
/* H263 */
112
{
AV_CODEC_ID_H263
,
MKTAG
(
's'
,
'2'
,
'6'
,
'3'
) },
/* H263 ?? works */
113
114
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'c'
,
'p'
) },
/* DV PAL */
115
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'c'
,
' '
) },
/* DV NTSC */
116
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'p'
,
'p'
) },
/* DVCPRO PAL produced by FCP */
117
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'5'
,
'p'
) },
/* DVCPRO50 PAL produced by FCP */
118
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'5'
,
'n'
) },
/* DVCPRO50 NTSC produced by FCP */
119
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'A'
,
'V'
,
'd'
,
'v'
) },
/* AVID DV */
120
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'A'
,
'V'
,
'd'
,
'1'
) },
/* AVID DV100 */
121
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'q'
) },
/* DVCPRO HD 720p50 */
122
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'p'
) },
/* DVCPRO HD 720p60 */
123
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'1'
) },
124
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'2'
) },
125
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'4'
) },
126
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'5'
) },
/* DVCPRO HD 50i produced by FCP */
127
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'6'
) },
/* DVCPRO HD 60i produced by FCP */
128
{
AV_CODEC_ID_DVVIDEO
,
MKTAG
(
'd'
,
'v'
,
'h'
,
'3'
) },
/* DVCPRO HD 30p produced by FCP */
129
130
{
AV_CODEC_ID_VP3
,
MKTAG
(
'V'
,
'P'
,
'3'
,
'1'
) },
/* On2 VP3 */
131
{
AV_CODEC_ID_RPZA
,
MKTAG
(
'r'
,
'p'
,
'z'
,
'a'
) },
/* Apple Video (RPZA) */
132
{
AV_CODEC_ID_CINEPAK
,
MKTAG
(
'c'
,
'v'
,
'i'
,
'd'
) },
/* Cinepak */
133
{
AV_CODEC_ID_8BPS
,
MKTAG
(
'8'
,
'B'
,
'P'
,
'S'
) },
/* Planar RGB (8BPS) */
134
{
AV_CODEC_ID_SMC
,
MKTAG
(
's'
,
'm'
,
'c'
,
' '
) },
/* Apple Graphics (SMC) */
135
{
AV_CODEC_ID_QTRLE
,
MKTAG
(
'r'
,
'l'
,
'e'
,
' '
) },
/* Apple Animation (RLE) */
136
{
AV_CODEC_ID_MSRLE
,
MKTAG
(
'W'
,
'R'
,
'L'
,
'E'
) },
137
{
AV_CODEC_ID_QDRAW
,
MKTAG
(
'q'
,
'd'
,
'r'
,
'w'
) },
/* QuickDraw */
138
139
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'W'
,
'R'
,
'A'
,
'W'
) },
140
141
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'v'
,
'c'
,
'1'
) },
/* AVC-1/H.264 */
142
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'5'
,
'p'
) },
/* AVC-Intra 50M 720p24/30/60 */
143
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'5'
,
'q'
) },
/* AVC-Intra 50M 720p25/50 */
144
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'5'
,
'2'
) },
/* AVC-Intra 50M 1080p25/50 */
145
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'5'
,
'3'
) },
/* AVC-Intra 50M 1080p24/30/60 */
146
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'5'
,
'5'
) },
/* AVC-Intra 50M 1080i50 */
147
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'5'
,
'6'
) },
/* AVC-Intra 50M 1080i60 */
148
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'1'
,
'p'
) },
/* AVC-Intra 100M 720p24/30/60 */
149
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'1'
,
'q'
) },
/* AVC-Intra 100M 720p25/50 */
150
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'1'
,
'2'
) },
/* AVC-Intra 100M 1080p25/50 */
151
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'1'
,
'3'
) },
/* AVC-Intra 100M 1080p24/30/60 */
152
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'1'
,
'5'
) },
/* AVC-Intra 100M 1080i50 */
153
{
AV_CODEC_ID_H264
,
MKTAG
(
'a'
,
'i'
,
'1'
,
'6'
) },
/* AVC-Intra 100M 1080i60 */
154
155
{
AV_CODEC_ID_MPEG1VIDEO
,
MKTAG
(
'm'
,
'1'
,
'v'
,
'1'
) },
/* Apple MPEG-1 Camcorder */
156
{
AV_CODEC_ID_MPEG1VIDEO
,
MKTAG
(
'm'
,
'p'
,
'e'
,
'g'
) },
/* MPEG */
157
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'2'
,
'v'
,
'1'
) },
/* Apple MPEG-2 Camcorder */
158
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'1'
) },
/* MPEG2 HDV 720p30 */
159
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'2'
) },
/* MPEG2 HDV 1080i60 */
160
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'3'
) },
/* MPEG2 HDV 1080i50 */
161
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'4'
) },
/* MPEG2 HDV 720p24 */
162
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'5'
) },
/* MPEG2 HDV 720p25 */
163
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'6'
) },
/* MPEG2 HDV 1080p24 */
164
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'7'
) },
/* MPEG2 HDV 1080p25 */
165
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'8'
) },
/* MPEG2 HDV 1080p30 */
166
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'9'
) },
/* MPEG2 HDV 720p60 JVC */
167
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'h'
,
'd'
,
'v'
,
'a'
) },
/* MPEG2 HDV 720p50 */
168
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'x'
,
'5'
,
'n'
) },
/* MPEG2 IMX NTSC 525/60 50mb/s produced by FCP */
169
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'x'
,
'5'
,
'p'
) },
/* MPEG2 IMX PAL 625/50 50mb/s produced by FCP */
170
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'x'
,
'4'
,
'n'
) },
/* MPEG2 IMX NTSC 525/60 40mb/s produced by FCP */
171
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'x'
,
'4'
,
'p'
) },
/* MPEG2 IMX PAL 625/50 40mb/s produced by FCP */
172
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'x'
,
'3'
,
'n'
) },
/* MPEG2 IMX NTSC 525/60 30mb/s produced by FCP */
173
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'm'
,
'x'
,
'3'
,
'p'
) },
/* MPEG2 IMX PAL 625/50 30mb/s produced by FCP */
174
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'4'
) },
/* XDCAM HD422 720p24 CBR */
175
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'5'
) },
/* XDCAM HD422 720p25 CBR */
176
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'9'
) },
/* XDCAM HD422 720p60 CBR */
177
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'a'
) },
/* XDCAM HD422 720p50 CBR */
178
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'b'
) },
/* XDCAM HD422 1080i60 CBR */
179
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'c'
) },
/* XDCAM HD422 1080i50 CBR */
180
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'd'
) },
/* XDCAM HD422 1080p24 CBR */
181
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'e'
) },
/* XDCAM HD422 1080p25 CBR */
182
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'5'
,
'f'
) },
/* XDCAM HD422 1080p30 CBR */
183
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'1'
) },
/* XDCAM EX 720p30 VBR */
184
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'2'
) },
/* XDCAM HD 1080i60 */
185
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'3'
) },
/* XDCAM HD 1080i50 VBR */
186
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'4'
) },
/* XDCAM EX 720p24 VBR */
187
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'5'
) },
/* XDCAM EX 720p25 VBR */
188
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'6'
) },
/* XDCAM HD 1080p24 VBR */
189
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'7'
) },
/* XDCAM HD 1080p25 VBR */
190
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'8'
) },
/* XDCAM HD 1080p30 VBR */
191
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'9'
) },
/* XDCAM EX 720p60 VBR */
192
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'a'
) },
/* XDCAM EX 720p50 VBR */
193
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'b'
) },
/* XDCAM EX 1080i60 VBR */
194
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'c'
) },
/* XDCAM EX 1080i50 VBR */
195
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'd'
) },
/* XDCAM EX 1080p24 VBR */
196
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'e'
) },
/* XDCAM EX 1080p25 VBR */
197
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'v'
,
'f'
) },
/* XDCAM EX 1080p30 VBR */
198
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'h'
,
'd'
) },
/* XDCAM HD 540p */
199
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'x'
,
'd'
,
'h'
,
'2'
) },
/* XDCAM HD422 540p */
200
{
AV_CODEC_ID_MPEG2VIDEO
,
MKTAG
(
'A'
,
'V'
,
'm'
,
'p'
) },
/* AVID IMX PAL */
201
202
{
AV_CODEC_ID_JPEG2000
,
MKTAG
(
'm'
,
'j'
,
'p'
,
'2'
) },
/* JPEG 2000 produced by FCP */
203
204
{
AV_CODEC_ID_TARGA
,
MKTAG
(
't'
,
'g'
,
'a'
,
' '
) },
/* Truevision Targa */
205
{
AV_CODEC_ID_TIFF
,
MKTAG
(
't'
,
'i'
,
'f'
,
'f'
) },
/* TIFF embedded in MOV */
206
{
AV_CODEC_ID_GIF
,
MKTAG
(
'g'
,
'i'
,
'f'
,
' '
) },
/* embedded gif files as frames (usually one "click to play movie" frame) */
207
{
AV_CODEC_ID_PNG
,
MKTAG
(
'p'
,
'n'
,
'g'
,
' '
) },
208
209
{
AV_CODEC_ID_VC1
,
MKTAG
(
'v'
,
'c'
,
'-'
,
'1'
) },
/* SMPTE RP 2025 */
210
{
AV_CODEC_ID_CAVS
,
MKTAG
(
'a'
,
'v'
,
's'
,
'2'
) },
211
212
{
AV_CODEC_ID_DIRAC
,
MKTAG
(
'd'
,
'r'
,
'a'
,
'c'
) },
213
{
AV_CODEC_ID_DNXHD
,
MKTAG
(
'A'
,
'V'
,
'd'
,
'n'
) },
/* AVID DNxHD */
214
{
AV_CODEC_ID_H263
,
MKTAG
(
'H'
,
'2'
,
'6'
,
'3'
) },
215
{
AV_CODEC_ID_MSMPEG4V3
,
MKTAG
(
'3'
,
'I'
,
'V'
,
'D'
) },
/* 3ivx DivX Doctor */
216
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'V'
,
'1'
,
'x'
) },
/* AVID 1:1x */
217
{
AV_CODEC_ID_RAWVIDEO
,
MKTAG
(
'A'
,
'V'
,
'u'
,
'p'
) },
218
{
AV_CODEC_ID_SGI
,
MKTAG
(
's'
,
'g'
,
'i'
,
' '
) },
/* SGI */
219
{
AV_CODEC_ID_DPX
,
MKTAG
(
'd'
,
'p'
,
'x'
,
' '
) },
/* DPX */
220
221
{
AV_CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'c'
,
'h'
) },
/* Apple ProRes 422 High Quality */
222
{
AV_CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'c'
,
'n'
) },
/* Apple ProRes 422 Standard Definition */
223
{
AV_CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'c'
,
's'
) },
/* Apple ProRes 422 LT */
224
{
AV_CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'c'
,
'o'
) },
/* Apple ProRes 422 Proxy */
225
{
AV_CODEC_ID_PRORES
,
MKTAG
(
'a'
,
'p'
,
'4'
,
'h'
) },
/* Apple ProRes 4444 */
226
227
{
AV_CODEC_ID_NONE
, 0 },
228
};
229
230
const
AVCodecTag
ff_codec_movaudio_tags
[] = {
231
{
AV_CODEC_ID_AAC
,
MKTAG
(
'm'
,
'p'
,
'4'
,
'a'
) },
232
{
AV_CODEC_ID_AC3
,
MKTAG
(
'a'
,
'c'
,
'-'
,
'3'
) },
/* ETSI TS 102 366 Annex F */
233
{
AV_CODEC_ID_AC3
,
MKTAG
(
's'
,
'a'
,
'c'
,
'3'
) },
/* Nero Recode */
234
{
AV_CODEC_ID_ADPCM_IMA_QT
,
MKTAG
(
'i'
,
'm'
,
'a'
,
'4'
) },
235
{
AV_CODEC_ID_ALAC
,
MKTAG
(
'a'
,
'l'
,
'a'
,
'c'
) },
236
{
AV_CODEC_ID_AMR_NB
,
MKTAG
(
's'
,
'a'
,
'm'
,
'r'
) },
/* AMR-NB 3gp */
237
{
AV_CODEC_ID_AMR_WB
,
MKTAG
(
's'
,
'a'
,
'w'
,
'b'
) },
/* AMR-WB 3gp */
238
{
AV_CODEC_ID_DTS
,
MKTAG
(
'd'
,
't'
,
's'
,
'c'
) },
/* DTS formats prior to DTS-HD */
239
{
AV_CODEC_ID_DTS
,
MKTAG
(
'd'
,
't'
,
's'
,
'h'
) },
/* DTS-HD audio formats */
240
{
AV_CODEC_ID_DTS
,
MKTAG
(
'd'
,
't'
,
's'
,
'l'
) },
/* DTS-HD Lossless formats */
241
{
AV_CODEC_ID_DTS
,
MKTAG
(
'D'
,
'T'
,
'S'
,
' '
) },
/* non-standard */
242
{
AV_CODEC_ID_EAC3
,
MKTAG
(
'e'
,
'c'
,
'-'
,
'3'
) },
/* ETSI TS 102 366 Annex F (only valid in ISOBMFF) */
243
{
AV_CODEC_ID_DVAUDIO
,
MKTAG
(
'v'
,
'd'
,
'v'
,
'a'
) },
244
{
AV_CODEC_ID_DVAUDIO
,
MKTAG
(
'd'
,
'v'
,
'c'
,
'a'
) },
245
{
AV_CODEC_ID_GSM
,
MKTAG
(
'a'
,
'g'
,
's'
,
'm'
) },
246
{
AV_CODEC_ID_ILBC
,
MKTAG
(
'i'
,
'l'
,
'b'
,
'c'
) },
247
{
AV_CODEC_ID_MACE3
,
MKTAG
(
'M'
,
'A'
,
'C'
,
'3'
) },
248
{
AV_CODEC_ID_MACE6
,
MKTAG
(
'M'
,
'A'
,
'C'
,
'6'
) },
249
{
AV_CODEC_ID_MP1
,
MKTAG
(
'.'
,
'm'
,
'p'
,
'1'
) },
250
{
AV_CODEC_ID_MP2
,
MKTAG
(
'.'
,
'm'
,
'p'
,
'2'
) },
251
{
AV_CODEC_ID_MP3
,
MKTAG
(
'.'
,
'm'
,
'p'
,
'3'
) },
252
{
AV_CODEC_ID_MP3
, 0x6D730055 },
253
{
AV_CODEC_ID_NELLYMOSER
,
MKTAG
(
'n'
,
'm'
,
'o'
,
's'
) },
/* Flash Media Server */
254
{
AV_CODEC_ID_PCM_ALAW
,
MKTAG
(
'a'
,
'l'
,
'a'
,
'w'
) },
255
{
AV_CODEC_ID_PCM_F32BE
,
MKTAG
(
'f'
,
'l'
,
'3'
,
'2'
) },
256
{
AV_CODEC_ID_PCM_F32LE
,
MKTAG
(
'f'
,
'l'
,
'3'
,
'2'
) },
257
{
AV_CODEC_ID_PCM_F64BE
,
MKTAG
(
'f'
,
'l'
,
'6'
,
'4'
) },
258
{
AV_CODEC_ID_PCM_F64LE
,
MKTAG
(
'f'
,
'l'
,
'6'
,
'4'
) },
259
{
AV_CODEC_ID_PCM_MULAW
,
MKTAG
(
'u'
,
'l'
,
'a'
,
'w'
) },
260
{
AV_CODEC_ID_PCM_S16BE
,
MKTAG
(
't'
,
'w'
,
'o'
,
's'
) },
261
{
AV_CODEC_ID_PCM_S16LE
,
MKTAG
(
's'
,
'o'
,
'w'
,
't'
) },
262
{
AV_CODEC_ID_PCM_S16LE
,
MKTAG
(
'l'
,
'p'
,
'c'
,
'm'
) },
263
{
AV_CODEC_ID_PCM_S24BE
,
MKTAG
(
'i'
,
'n'
,
'2'
,
'4'
) },
264
{
AV_CODEC_ID_PCM_S24LE
,
MKTAG
(
'i'
,
'n'
,
'2'
,
'4'
) },
265
{
AV_CODEC_ID_PCM_S32BE
,
MKTAG
(
'i'
,
'n'
,
'3'
,
'2'
) },
266
{
AV_CODEC_ID_PCM_S32LE
,
MKTAG
(
'i'
,
'n'
,
'3'
,
'2'
) },
267
{
AV_CODEC_ID_PCM_S8
,
MKTAG
(
's'
,
'o'
,
'w'
,
't'
) },
268
{
AV_CODEC_ID_PCM_U8
,
MKTAG
(
'r'
,
'a'
,
'w'
,
' '
) },
269
{
AV_CODEC_ID_PCM_U8
,
MKTAG
(
'N'
,
'O'
,
'N'
,
'E'
) },
270
{
AV_CODEC_ID_QCELP
,
MKTAG
(
'Q'
,
'c'
,
'l'
,
'p'
) },
271
{
AV_CODEC_ID_QCELP
,
MKTAG
(
'Q'
,
'c'
,
'l'
,
'q'
) },
272
{
AV_CODEC_ID_QCELP
,
MKTAG
(
's'
,
'q'
,
'c'
,
'p'
) },
/* ISO Media fourcc */
273
{
AV_CODEC_ID_QDM2
,
MKTAG
(
'Q'
,
'D'
,
'M'
,
'2'
) },
274
{
AV_CODEC_ID_QDMC
,
MKTAG
(
'Q'
,
'D'
,
'M'
,
'C'
) },
275
{
AV_CODEC_ID_SPEEX
,
MKTAG
(
's'
,
'p'
,
'e'
,
'x'
) },
/* Flash Media Server */
276
{
AV_CODEC_ID_WMAV2
,
MKTAG
(
'W'
,
'M'
,
'A'
,
'2'
) },
277
{
AV_CODEC_ID_NONE
, 0 },
278
};
279
280
const
AVCodecTag
ff_codec_movsubtitle_tags
[] = {
281
{
AV_CODEC_ID_MOV_TEXT
,
MKTAG
(
't'
,
'e'
,
'x'
,
't'
) },
282
{
AV_CODEC_ID_MOV_TEXT
,
MKTAG
(
't'
,
'x'
,
'3'
,
'g'
) },
283
{
AV_CODEC_ID_NONE
, 0 },
284
};
285
286
/* map numeric codes from mdhd atom to ISO 639 */
287
/* cf. QTFileFormat.pdf p253, qtff.pdf p205 */
288
/* http://developer.apple.com/documentation/mac/Text/Text-368.html */
289
/* deprecated by putting the code as 3*5bit ascii */
290
static
const
char
mov_mdhd_language_map
[][4] = {
291
/* 0-9 */
292
"eng"
,
"fra"
,
"ger"
,
"ita"
,
"dut"
,
"sve"
,
"spa"
,
"dan"
,
"por"
,
"nor"
,
293
"heb"
,
"jpn"
,
"ara"
,
"fin"
,
"gre"
,
"ice"
,
"mlt"
,
"tur"
,
"hr "
/*scr*/
,
"chi"
/*ace?*/
,
294
"urd"
,
"hin"
,
"tha"
,
"kor"
,
"lit"
,
"pol"
,
"hun"
,
"est"
,
"lav"
,
""
,
295
"fo "
,
""
,
"rus"
,
"chi"
,
""
,
"iri"
,
"alb"
,
"ron"
,
"ces"
,
"slk"
,
296
"slv"
,
"yid"
,
"sr "
,
"mac"
,
"bul"
,
"ukr"
,
"bel"
,
"uzb"
,
"kaz"
,
"aze"
,
297
/*?*/
298
"aze"
,
"arm"
,
"geo"
,
"mol"
,
"kir"
,
"tgk"
,
"tuk"
,
"mon"
,
""
,
"pus"
,
299
"kur"
,
"kas"
,
"snd"
,
"tib"
,
"nep"
,
"san"
,
"mar"
,
"ben"
,
"asm"
,
"guj"
,
300
"pa "
,
"ori"
,
"mal"
,
"kan"
,
"tam"
,
"tel"
,
""
,
"bur"
,
"khm"
,
"lao"
,
301
/* roman? arabic? */
302
"vie"
,
"ind"
,
"tgl"
,
"may"
,
"may"
,
"amh"
,
"tir"
,
"orm"
,
"som"
,
"swa"
,
303
/*==rundi?*/
304
""
,
"run"
,
""
,
"mlg"
,
"epo"
,
""
,
""
,
""
,
""
,
""
,
305
/* 100 */
306
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
307
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
308
""
,
""
,
""
,
""
,
""
,
""
,
""
,
""
,
"wel"
,
"baq"
,
309
"cat"
,
"lat"
,
"que"
,
"grn"
,
"aym"
,
"tat"
,
"uig"
,
"dzo"
,
"jav"
310
};
311
312
int
ff_mov_iso639_to_lang
(
const
char
lang[4],
int
mp4)
313
{
314
int
i, code = 0;
315
316
/* old way, only for QT? */
317
for
(i = 0; lang[0] && !mp4 && i <
FF_ARRAY_ELEMS
(
mov_mdhd_language_map
); i++) {
318
if
(!strcmp(lang,
mov_mdhd_language_map
[i]))
319
return
i;
320
}
321
/* XXX:can we do that in mov too? */
322
if
(!mp4)
323
return
-1;
324
/* handle undefined as such */
325
if
(lang[0] ==
'\0'
)
326
lang =
"und"
;
327
/* 5bit ascii */
328
for
(i = 0; i < 3; i++) {
329
uint8_t
c = lang[i];
330
c -= 0x60;
331
if
(c > 0x1f)
332
return
-1;
333
code <<= 5;
334
code |= c;
335
}
336
return
code;
337
}
338
339
int
ff_mov_lang_to_iso639
(
unsigned
code,
char
to[4])
340
{
341
int
i;
342
memset(to, 0, 4);
343
/* is it the mangled iso code? */
344
/* see http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt */
345
if
(code > 138) {
346
for
(i = 2; i >= 0; i--) {
347
to[i] = 0x60 + (code & 0x1f);
348
code >>= 5;
349
}
350
return
1;
351
}
352
/* old fashion apple lang code */
353
if
(code >=
FF_ARRAY_ELEMS
(
mov_mdhd_language_map
))
354
return
0;
355
if
(!
mov_mdhd_language_map
[code][0])
356
return
0;
357
memcpy(to,
mov_mdhd_language_map
[code], 4);
358
return
1;
359
}
360
361
int
ff_mp4_read_descr_len
(
AVIOContext
*pb)
362
{
363
int
len
= 0;
364
int
count = 4;
365
while
(count--) {
366
int
c =
avio_r8
(pb);
367
len = (len << 7) | (c & 0x7f);
368
if
(!(c & 0x80))
369
break
;
370
}
371
return
len
;
372
}
373
374
int
ff_mp4_read_descr
(
AVFormatContext
*fc,
AVIOContext
*pb,
int
*
tag
)
375
{
376
int
len
;
377
*tag =
avio_r8
(pb);
378
len =
ff_mp4_read_descr_len
(pb);
379
av_dlog
(fc,
"MPEG4 description: tag=0x%02x len=%d\n"
, *tag, len);
380
return
len
;
381
}
382
383
void
ff_mp4_parse_es_descr
(
AVIOContext
*pb,
int
*es_id)
384
{
385
int
flags
;
386
if
(es_id) *es_id =
avio_rb16
(pb);
387
else
avio_rb16
(pb);
388
flags =
avio_r8
(pb);
389
if
(flags & 0x80)
//streamDependenceFlag
390
avio_rb16
(pb);
391
if
(flags & 0x40) {
//URL_Flag
392
int
len
=
avio_r8
(pb);
393
avio_skip
(pb, len);
394
}
395
if
(flags & 0x20)
//OCRstreamFlag
396
avio_rb16
(pb);
397
}
398
399
static
const
AVCodecTag
mp4_audio_types
[] = {
400
{
AV_CODEC_ID_MP3ON4
,
AOT_PS
},
/* old mp3on4 draft */
401
{
AV_CODEC_ID_MP3ON4
,
AOT_L1
},
/* layer 1 */
402
{
AV_CODEC_ID_MP3ON4
,
AOT_L2
},
/* layer 2 */
403
{
AV_CODEC_ID_MP3ON4
,
AOT_L3
},
/* layer 3 */
404
{
AV_CODEC_ID_MP4ALS
,
AOT_ALS
},
/* MPEG-4 ALS */
405
{
AV_CODEC_ID_NONE
,
AOT_NULL
},
406
};
407
408
int
ff_mp4_read_dec_config_descr
(
AVFormatContext
*fc,
AVStream
*st,
AVIOContext
*pb)
409
{
410
int
len
,
tag
;
411
int
object_type_id =
avio_r8
(pb);
412
avio_r8
(pb);
/* stream type */
413
avio_rb24
(pb);
/* buffer size db */
414
avio_rb32
(pb);
/* max bitrate */
415
avio_rb32
(pb);
/* avg bitrate */
416
417
st->
codec
->
codec_id
=
ff_codec_get_id
(ff_mp4_obj_type, object_type_id);
418
av_dlog
(fc,
"esds object type id 0x%02x\n"
, object_type_id);
419
len =
ff_mp4_read_descr
(fc, pb, &tag);
420
if
(tag ==
MP4DecSpecificDescrTag
) {
421
av_dlog
(fc,
"Specific MPEG4 header len=%d\n"
, len);
422
if
(!len || (uint64_t)len > (1<<30))
423
return
-1;
424
av_free
(st->
codec
->
extradata
);
425
st->
codec
->
extradata
=
av_mallocz
(len +
FF_INPUT_BUFFER_PADDING_SIZE
);
426
if
(!st->
codec
->
extradata
)
427
return
AVERROR
(ENOMEM);
428
avio_read
(pb, st->
codec
->
extradata
, len);
429
st->
codec
->
extradata_size
=
len
;
430
if
(st->
codec
->
codec_id
==
AV_CODEC_ID_AAC
) {
431
MPEG4AudioConfig
cfg;
432
avpriv_mpeg4audio_get_config
(&cfg, st->
codec
->
extradata
,
433
st->
codec
->
extradata_size
* 8, 1);
434
st->
codec
->
channels
= cfg.
channels
;
435
if
(cfg.
object_type
== 29 && cfg.
sampling_index
< 3)
// old mp3on4
436
st->
codec
->
sample_rate
=
avpriv_mpa_freq_tab
[cfg.
sampling_index
];
437
else
if
(cfg.
ext_sample_rate
)
438
st->
codec
->
sample_rate
= cfg.
ext_sample_rate
;
439
else
440
st->
codec
->
sample_rate
= cfg.
sample_rate
;
441
av_dlog
(fc,
"mp4a config channels %d obj %d ext obj %d "
442
"sample rate %d ext sample rate %d\n"
, st->
codec
->
channels
,
443
cfg.
object_type
, cfg.
ext_object_type
,
444
cfg.
sample_rate
, cfg.
ext_sample_rate
);
445
if
(!(st->
codec
->
codec_id
=
ff_codec_get_id
(mp4_audio_types,
446
cfg.
object_type
)))
447
st->
codec
->
codec_id
=
AV_CODEC_ID_AAC
;
448
}
449
}
450
return
0;
451
}