• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "avformat.h"
25 #include "internal.h"
26 #include "isom.h"
27 #include "libavcodec/mpeg4audio.h"
28 #include "libavcodec/mpegaudiodata.h"
29 #include "libavutil/avstring.h"
30 #include "libavutil/intreadwrite.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_HEVC        , 0x23 },
39     { AV_CODEC_ID_AAC         , 0x40 },
40     { AV_CODEC_ID_MP4ALS      , 0x40 }, /* 14496-3 ALS */
41     { AV_CODEC_ID_MPEG2VIDEO  , 0x61 }, /* MPEG-2 Main */
42     { AV_CODEC_ID_MPEG2VIDEO  , 0x60 }, /* MPEG-2 Simple */
43     { AV_CODEC_ID_MPEG2VIDEO  , 0x62 }, /* MPEG-2 SNR */
44     { AV_CODEC_ID_MPEG2VIDEO  , 0x63 }, /* MPEG-2 Spatial */
45     { AV_CODEC_ID_MPEG2VIDEO  , 0x64 }, /* MPEG-2 High */
46     { AV_CODEC_ID_MPEG2VIDEO  , 0x65 }, /* MPEG-2 422 */
47     { AV_CODEC_ID_AAC         , 0x66 }, /* MPEG-2 AAC Main */
48     { AV_CODEC_ID_AAC         , 0x67 }, /* MPEG-2 AAC Low */
49     { AV_CODEC_ID_AAC         , 0x68 }, /* MPEG-2 AAC SSR */
50     { AV_CODEC_ID_MP3         , 0x69 }, /* 13818-3 */
51     { AV_CODEC_ID_MP2         , 0x69 }, /* 11172-3 */
52     { AV_CODEC_ID_MPEG1VIDEO  , 0x6A }, /* 11172-2 */
53     { AV_CODEC_ID_MP3         , 0x6B }, /* 11172-3 */
54     { AV_CODEC_ID_MJPEG       , 0x6C }, /* 10918-1 */
55     { AV_CODEC_ID_PNG         , 0x6D },
56     { AV_CODEC_ID_JPEG2000    , 0x6E }, /* 15444-1 */
57     { AV_CODEC_ID_VC1         , 0xA3 },
58     { AV_CODEC_ID_DIRAC       , 0xA4 },
59     { AV_CODEC_ID_AC3         , 0xA5 },
60     { AV_CODEC_ID_EAC3        , 0xA6 },
61     { AV_CODEC_ID_DTS         , 0xA9 }, /* mp4ra.org */
62     { AV_CODEC_ID_OPUS        , 0xAD }, /* mp4ra.org */
63     { AV_CODEC_ID_VP9         , 0xB1 }, /* mp4ra.org */
64     { AV_CODEC_ID_FLAC        , 0xC1 }, /* nonstandard, update when there is a standard value */
65     { AV_CODEC_ID_TSCC2       , 0xD0 }, /* nonstandard, camtasia uses it */
66     { AV_CODEC_ID_EVRC        , 0xD1 }, /* nonstandard, pvAuthor uses it */
67     { AV_CODEC_ID_VORBIS      , 0xDD }, /* nonstandard, gpac uses it */
68     { AV_CODEC_ID_DVD_SUBTITLE, 0xE0 }, /* nonstandard, see unsupported-embedded-subs-2.mp4 */
69     { AV_CODEC_ID_QCELP       , 0xE1 },
70     { AV_CODEC_ID_MPEG4SYSTEMS, 0x01 },
71     { AV_CODEC_ID_MPEG4SYSTEMS, 0x02 },
72     { AV_CODEC_ID_NONE        ,    0 },
73 };
74 
75 const AVCodecTag ff_codec_movvideo_tags[] = {
76 /*  { AV_CODEC_ID_, MKTAG('I', 'V', '5', '0') }, *//* Indeo 5.0 */
77 
78     { AV_CODEC_ID_RAWVIDEO, MKTAG('r', 'a', 'w', ' ') }, /* uncompressed RGB */
79     { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') }, /* uncompressed YUV422 */
80     { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') }, /* uncompressed 8-bit 4:2:2 */
81     { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', 's') }, /* same as 2VUY but byte-swapped */
82 
83     { AV_CODEC_ID_RAWVIDEO, MKTAG('L', '5', '5', '5') },
84     { AV_CODEC_ID_RAWVIDEO, MKTAG('L', '5', '6', '5') },
85     { AV_CODEC_ID_RAWVIDEO, MKTAG('B', '5', '6', '5') },
86     { AV_CODEC_ID_RAWVIDEO, MKTAG('2', '4', 'B', 'G') },
87     { AV_CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 'A') },
88     { AV_CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 'A') },
89     { AV_CODEC_ID_RAWVIDEO, MKTAG('A', 'B', 'G', 'R') },
90     { AV_CODEC_ID_RAWVIDEO, MKTAG('b', '1', '6', 'g') },
91     { AV_CODEC_ID_RAWVIDEO, MKTAG('b', '4', '8', 'r') },
92     { AV_CODEC_ID_RAWVIDEO, MKTAG('b', '6', '4', 'a') },
93     { AV_CODEC_ID_RAWVIDEO, MKTAG('b', 'x', 'b', 'g') }, /* BOXX */
94     { AV_CODEC_ID_RAWVIDEO, MKTAG('b', 'x', 'r', 'g') },
95     { AV_CODEC_ID_RAWVIDEO, MKTAG('b', 'x', 'y', 'v') },
96     { AV_CODEC_ID_RAWVIDEO, MKTAG('N', 'O', '1', '6') },
97     { AV_CODEC_ID_RAWVIDEO, MKTAG('D', 'V', 'O', 'O') }, /* Digital Voodoo SD 8 Bit */
98     { AV_CODEC_ID_RAWVIDEO, MKTAG('R', '4', '2', '0') }, /* Radius DV YUV PAL */
99     { AV_CODEC_ID_RAWVIDEO, MKTAG('R', '4', '1', '1') }, /* Radius DV YUV NTSC */
100 
101     { AV_CODEC_ID_R10K,   MKTAG('R', '1', '0', 'k') }, /* uncompressed 10-bit RGB */
102     { AV_CODEC_ID_R10K,   MKTAG('R', '1', '0', 'g') }, /* uncompressed 10-bit RGB */
103     { AV_CODEC_ID_R210,   MKTAG('r', '2', '1', '0') }, /* uncompressed 10-bit RGB */
104     { AV_CODEC_ID_AVUI,   MKTAG('A', 'V', 'U', 'I') }, /* AVID Uncompressed deinterleaved UYVY422 */
105     { AV_CODEC_ID_AVRP,   MKTAG('A', 'V', 'r', 'p') }, /* Avid 1:1 10-bit RGB Packer */
106     { AV_CODEC_ID_AVRP,   MKTAG('S', 'U', 'D', 'S') }, /* Avid DS Uncompressed */
107     { AV_CODEC_ID_V210,   MKTAG('v', '2', '1', '0') }, /* uncompressed 10-bit 4:2:2 */
108     { AV_CODEC_ID_V210,   MKTAG('b', 'x', 'y', '2') }, /* BOXX 10-bit 4:2:2 */
109     { AV_CODEC_ID_V308,   MKTAG('v', '3', '0', '8') }, /* uncompressed  8-bit 4:4:4 */
110     { AV_CODEC_ID_V408,   MKTAG('v', '4', '0', '8') }, /* uncompressed  8-bit 4:4:4:4 */
111     { AV_CODEC_ID_V410,   MKTAG('v', '4', '1', '0') }, /* uncompressed 10-bit 4:4:4 */
112     { AV_CODEC_ID_Y41P,   MKTAG('Y', '4', '1', 'P') }, /* uncompressed 12-bit 4:1:1 */
113     { AV_CODEC_ID_YUV4,   MKTAG('y', 'u', 'v', '4') }, /* libquicktime packed yuv420p */
114     { AV_CODEC_ID_TARGA_Y216, MKTAG('Y', '2', '1', '6') },
115 
116     { AV_CODEC_ID_MJPEG,  MKTAG('j', 'p', 'e', 'g') }, /* PhotoJPEG */
117     { AV_CODEC_ID_MJPEG,  MKTAG('m', 'j', 'p', 'a') }, /* Motion-JPEG (format A) */
118     { AV_CODEC_ID_AVRN ,  MKTAG('A', 'V', 'D', 'J') }, /* MJPEG with alpha-channel (AVID JFIF meridien compressed) */
119 /*  { AV_CODEC_ID_MJPEG,  MKTAG('A', 'V', 'R', 'n') }, *//* MJPEG with alpha-channel (AVID ABVB/Truevision NuVista) */
120     { AV_CODEC_ID_MJPEG,  MKTAG('d', 'm', 'b', '1') }, /* Motion JPEG OpenDML */
121     { AV_CODEC_ID_MJPEGB, MKTAG('m', 'j', 'p', 'b') }, /* Motion-JPEG (format B) */
122 
123     { AV_CODEC_ID_SVQ1, MKTAG('S', 'V', 'Q', '1') }, /* Sorenson Video v1 */
124     { AV_CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') }, /* Sorenson Video v1 */
125     { AV_CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', 'i') }, /* Sorenson Video v1 (from QT specs)*/
126     { AV_CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') }, /* Sorenson Video v3 */
127 
128     { AV_CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
129     { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') }, /* OpenDiVX *//* sample files at http://heroinewarrior.com/xmovie.php3 use this tag */
130     { AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
131     { AV_CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') }, /* experimental: 3IVX files before ivx D4 4.5.1 */
132 
133     { AV_CODEC_ID_H263, MKTAG('h', '2', '6', '3') }, /* H.263 */
134     { AV_CODEC_ID_H263, MKTAG('s', '2', '6', '3') }, /* H.263 ?? works */
135 
136     { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 'p') }, /* DV PAL */
137     { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') }, /* DV NTSC */
138     { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'p', 'p') }, /* DVCPRO PAL produced by FCP */
139     { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'p') }, /* DVCPRO50 PAL produced by FCP */
140     { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'n') }, /* DVCPRO50 NTSC produced by FCP */
141     { AV_CODEC_ID_DVVIDEO, MKTAG('A', 'V', 'd', 'v') }, /* AVID DV */
142     { AV_CODEC_ID_DVVIDEO, MKTAG('A', 'V', 'd', '1') }, /* AVID DV100 */
143     { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'q') }, /* DVCPRO HD 720p50 */
144     { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'p') }, /* DVCPRO HD 720p60 */
145     { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
146     { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '2') },
147     { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '4') },
148     { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '5') }, /* DVCPRO HD 50i produced by FCP */
149     { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '6') }, /* DVCPRO HD 60i produced by FCP */
150     { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '3') }, /* DVCPRO HD 30p produced by FCP */
151 
152     { AV_CODEC_ID_VP3,     MKTAG('V', 'P', '3', '1') }, /* On2 VP3 */
153     { AV_CODEC_ID_RPZA,    MKTAG('r', 'p', 'z', 'a') }, /* Apple Video (RPZA) */
154     { AV_CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') }, /* Cinepak */
155     { AV_CODEC_ID_8BPS,    MKTAG('8', 'B', 'P', 'S') }, /* Planar RGB (8BPS) */
156     { AV_CODEC_ID_SMC,     MKTAG('s', 'm', 'c', ' ') }, /* Apple Graphics (SMC) */
157     { AV_CODEC_ID_QTRLE,   MKTAG('r', 'l', 'e', ' ') }, /* Apple Animation (RLE) */
158     { AV_CODEC_ID_SGIRLE,  MKTAG('r', 'l', 'e', '1') }, /* SGI RLE 8-bit */
159     { AV_CODEC_ID_MSRLE,   MKTAG('W', 'R', 'L', 'E') },
160     { AV_CODEC_ID_QDRAW,   MKTAG('q', 'd', 'r', 'w') }, /* QuickDraw */
161     { AV_CODEC_ID_CDTOONS, MKTAG('Q', 'k', 'B', 'k') }, /* CDToons */
162 
163     { AV_CODEC_ID_RAWVIDEO, MKTAG('W', 'R', 'A', 'W') },
164 
165     { AV_CODEC_ID_HEVC, MKTAG('h', 'e', 'v', '1') }, /* HEVC/H.265 which indicates parameter sets may be in ES */
166     { AV_CODEC_ID_HEVC, MKTAG('h', 'v', 'c', '1') }, /* HEVC/H.265 which indicates parameter sets shall not be in ES */
167     { AV_CODEC_ID_HEVC, MKTAG('d', 'v', 'h', 'e') }, /* HEVC-based Dolby Vision derived from hev1 */
168                                                      /* dvh1 is handled within mov.c */
169 
170     { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') }, /* AVC-1/H.264 */
171     { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '2') },
172     { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '3') },
173     { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '4') },
174     { AV_CODEC_ID_H264, MKTAG('a', 'i', '5', 'p') }, /* AVC-Intra  50M 720p24/30/60 */
175     { AV_CODEC_ID_H264, MKTAG('a', 'i', '5', 'q') }, /* AVC-Intra  50M 720p25/50 */
176     { AV_CODEC_ID_H264, MKTAG('a', 'i', '5', '2') }, /* AVC-Intra  50M 1080p25/50 */
177     { AV_CODEC_ID_H264, MKTAG('a', 'i', '5', '3') }, /* AVC-Intra  50M 1080p24/30/60 */
178     { AV_CODEC_ID_H264, MKTAG('a', 'i', '5', '5') }, /* AVC-Intra  50M 1080i50 */
179     { AV_CODEC_ID_H264, MKTAG('a', 'i', '5', '6') }, /* AVC-Intra  50M 1080i60 */
180     { AV_CODEC_ID_H264, MKTAG('a', 'i', '1', 'p') }, /* AVC-Intra 100M 720p24/30/60 */
181     { AV_CODEC_ID_H264, MKTAG('a', 'i', '1', 'q') }, /* AVC-Intra 100M 720p25/50 */
182     { AV_CODEC_ID_H264, MKTAG('a', 'i', '1', '2') }, /* AVC-Intra 100M 1080p25/50 */
183     { AV_CODEC_ID_H264, MKTAG('a', 'i', '1', '3') }, /* AVC-Intra 100M 1080p24/30/60 */
184     { AV_CODEC_ID_H264, MKTAG('a', 'i', '1', '5') }, /* AVC-Intra 100M 1080i50 */
185     { AV_CODEC_ID_H264, MKTAG('a', 'i', '1', '6') }, /* AVC-Intra 100M 1080i60 */
186     { AV_CODEC_ID_H264, MKTAG('A', 'V', 'i', 'n') }, /* AVC-Intra with implicit SPS/PPS */
187     { AV_CODEC_ID_H264, MKTAG('a', 'i', 'v', 'x') }, /* XAVC 10-bit 4:2:2 */
188     { AV_CODEC_ID_H264, MKTAG('r', 'v', '6', '4') }, /* X-Com Radvision */
189     { AV_CODEC_ID_H264, MKTAG('x', 'a', 'l', 'g') }, /* XAVC-L HD422 produced by FCP */
190     { AV_CODEC_ID_H264, MKTAG('a', 'v', 'l', 'g') }, /* Panasonic P2 AVC-LongG */
191     { AV_CODEC_ID_H264, MKTAG('d', 'v', 'a', '1') }, /* AVC-based Dolby Vision derived from avc1 */
192     { AV_CODEC_ID_H264, MKTAG('d', 'v', 'a', 'v') }, /* AVC-based Dolby Vision derived from avc3 */
193 
194     { AV_CODEC_ID_VP8,  MKTAG('v', 'p', '0', '8') }, /* VP8 */
195     { AV_CODEC_ID_VP9,  MKTAG('v', 'p', '0', '9') }, /* VP9 */
196     { AV_CODEC_ID_AV1,  MKTAG('a', 'v', '0', '1') }, /* AV1 */
197 
198     { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', '1', 'v', ' ') },
199     { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', '1', 'v', '1') }, /* Apple MPEG-1 Camcorder */
200     { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'e', 'g') }, /* MPEG */
201     { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', '1', 'v') }, /* CoreMedia CMVideoCodecType */
202     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', '2', 'v', '1') }, /* Apple MPEG-2 Camcorder */
203     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '1') }, /* MPEG-2 HDV 720p30 */
204     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '2') }, /* MPEG-2 HDV 1080i60 */
205     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '3') }, /* MPEG-2 HDV 1080i50 */
206     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '4') }, /* MPEG-2 HDV 720p24 */
207     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '5') }, /* MPEG-2 HDV 720p25 */
208     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '6') }, /* MPEG-2 HDV 1080p24 */
209     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '7') }, /* MPEG-2 HDV 1080p25 */
210     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '8') }, /* MPEG-2 HDV 1080p30 */
211     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '9') }, /* MPEG-2 HDV 720p60 JVC */
212     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', 'a') }, /* MPEG-2 HDV 720p50 */
213     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'n') }, /* MPEG-2 IMX NTSC 525/60 50mb/s produced by FCP */
214     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'p') }, /* MPEG-2 IMX PAL 625/50 50mb/s produced by FCP */
215     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'n') }, /* MPEG-2 IMX NTSC 525/60 40mb/s produced by FCP */
216     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'p') }, /* MPEG-2 IMX PAL 625/50 40mb/s produced by FCP */
217     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'n') }, /* MPEG-2 IMX NTSC 525/60 30mb/s produced by FCP */
218     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'p') }, /* MPEG-2 IMX PAL 625/50 30mb/s produced by FCP */
219     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '1') }, /* XDCAM HD422 720p30 CBR */
220     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '4') }, /* XDCAM HD422 720p24 CBR */
221     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '5') }, /* XDCAM HD422 720p25 CBR */
222     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '9') }, /* XDCAM HD422 720p60 CBR */
223     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'a') }, /* XDCAM HD422 720p50 CBR */
224     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'b') }, /* XDCAM HD422 1080i60 CBR */
225     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'c') }, /* XDCAM HD422 1080i50 CBR */
226     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'd') }, /* XDCAM HD422 1080p24 CBR */
227     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'e') }, /* XDCAM HD422 1080p25 CBR */
228     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'f') }, /* XDCAM HD422 1080p30 CBR */
229     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '1') }, /* XDCAM EX 720p30 VBR */
230     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '2') }, /* XDCAM HD 1080i60 */
231     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '3') }, /* XDCAM HD 1080i50 VBR */
232     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '4') }, /* XDCAM EX 720p24 VBR */
233     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '5') }, /* XDCAM EX 720p25 VBR */
234     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '6') }, /* XDCAM HD 1080p24 VBR */
235     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '7') }, /* XDCAM HD 1080p25 VBR */
236     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '8') }, /* XDCAM HD 1080p30 VBR */
237     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '9') }, /* XDCAM EX 720p60 VBR */
238     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'a') }, /* XDCAM EX 720p50 VBR */
239     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'b') }, /* XDCAM EX 1080i60 VBR */
240     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'c') }, /* XDCAM EX 1080i50 VBR */
241     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'd') }, /* XDCAM EX 1080p24 VBR */
242     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'e') }, /* XDCAM EX 1080p25 VBR */
243     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'f') }, /* XDCAM EX 1080p30 VBR */
244     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'h', 'd') }, /* XDCAM HD 540p */
245     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'h', '2') }, /* XDCAM HD422 540p */
246     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('A', 'V', 'm', 'p') }, /* AVID IMX PAL */
247     { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', '2', 'v') }, /* FCP5 */
248 
249     { AV_CODEC_ID_JPEG2000, MKTAG('m', 'j', 'p', '2') }, /* JPEG 2000 produced by FCP */
250 
251     { AV_CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') }, /* Truevision Targa */
252     { AV_CODEC_ID_TIFF,  MKTAG('t', 'i', 'f', 'f') }, /* TIFF embedded in MOV */
253     { AV_CODEC_ID_GIF,   MKTAG('g', 'i', 'f', ' ') }, /* embedded gif files as frames (usually one "click to play movie" frame) */
254     { AV_CODEC_ID_PNG,   MKTAG('p', 'n', 'g', ' ') },
255     { AV_CODEC_ID_PNG,   MKTAG('M', 'N', 'G', ' ') },
256 
257     { AV_CODEC_ID_VC1, MKTAG('v', 'c', '-', '1') }, /* SMPTE RP 2025 */
258     { AV_CODEC_ID_CAVS, MKTAG('a', 'v', 's', '2') },
259 
260     { AV_CODEC_ID_DIRAC,     MKTAG('d', 'r', 'a', 'c') },
261     { AV_CODEC_ID_DNXHD,     MKTAG('A', 'V', 'd', 'n') }, /* AVID DNxHD */
262     { AV_CODEC_ID_DNXHD,     MKTAG('A', 'V', 'd', 'h') }, /* AVID DNxHR */
263     { AV_CODEC_ID_H263,      MKTAG('H', '2', '6', '3') },
264     { AV_CODEC_ID_MSMPEG4V3, MKTAG('3', 'I', 'V', 'D') }, /* 3ivx DivX Doctor */
265     { AV_CODEC_ID_RAWVIDEO,  MKTAG('A', 'V', '1', 'x') }, /* AVID 1:1x */
266     { AV_CODEC_ID_RAWVIDEO,  MKTAG('A', 'V', 'u', 'p') },
267     { AV_CODEC_ID_SGI,       MKTAG('s', 'g', 'i', ' ') }, /* SGI  */
268     { AV_CODEC_ID_DPX,       MKTAG('d', 'p', 'x', ' ') }, /* DPX */
269     { AV_CODEC_ID_EXR,       MKTAG('e', 'x', 'r', ' ') }, /* OpenEXR */
270 
271     { AV_CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 'h') }, /* Apple ProRes 422 High Quality */
272     { AV_CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 'n') }, /* Apple ProRes 422 Standard Definition */
273     { AV_CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 's') }, /* Apple ProRes 422 LT */
274     { AV_CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 'o') }, /* Apple ProRes 422 Proxy */
275     { AV_CODEC_ID_PRORES, MKTAG('a', 'p', '4', 'h') }, /* Apple ProRes 4444 */
276     { AV_CODEC_ID_PRORES, MKTAG('a', 'p', '4', 'x') }, /* Apple ProRes 4444 XQ */
277     { AV_CODEC_ID_FLIC,   MKTAG('f', 'l', 'i', 'c') },
278 
279     { AV_CODEC_ID_AIC, MKTAG('i', 'c', 'o', 'd') },
280 
281     { AV_CODEC_ID_HAP, MKTAG('H', 'a', 'p', '1') },
282     { AV_CODEC_ID_HAP, MKTAG('H', 'a', 'p', '5') },
283     { AV_CODEC_ID_HAP, MKTAG('H', 'a', 'p', 'Y') },
284     { AV_CODEC_ID_HAP, MKTAG('H', 'a', 'p', 'A') },
285     { AV_CODEC_ID_HAP, MKTAG('H', 'a', 'p', 'M') },
286 
287     { AV_CODEC_ID_DXV, MKTAG('D', 'X', 'D', '3') },
288     { AV_CODEC_ID_DXV, MKTAG('D', 'X', 'D', 'I') },
289 
290     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'R', '0') },
291     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'R', 'A') },
292     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'R', 'G') },
293     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'Y', '2') },
294     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '0', 'Y', '4') },
295     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '8', 'R', 'G') },
296     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '8', 'R', 'A') },
297     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '8', 'G', '0') },
298     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '8', 'Y', '0') },
299     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '8', 'Y', '2') },
300     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '8', 'Y', '4') },
301     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '8', 'Y', 'A') },
302     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '2', 'R', 'A') },
303     { AV_CODEC_ID_MAGICYUV, MKTAG('M', '2', 'R', 'G') },
304 
305     { AV_CODEC_ID_SHEERVIDEO, MKTAG('S', 'h', 'r', '0') },
306     { AV_CODEC_ID_SHEERVIDEO, MKTAG('S', 'h', 'r', '1') },
307     { AV_CODEC_ID_SHEERVIDEO, MKTAG('S', 'h', 'r', '2') },
308     { AV_CODEC_ID_SHEERVIDEO, MKTAG('S', 'h', 'r', '3') },
309     { AV_CODEC_ID_SHEERVIDEO, MKTAG('S', 'h', 'r', '4') },
310     { AV_CODEC_ID_SHEERVIDEO, MKTAG('S', 'h', 'r', '5') },
311     { AV_CODEC_ID_SHEERVIDEO, MKTAG('S', 'h', 'r', '6') },
312     { AV_CODEC_ID_SHEERVIDEO, MKTAG('S', 'h', 'r', '7') },
313 
314     { AV_CODEC_ID_PIXLET, MKTAG('p', 'x', 'l', 't') },
315 
316     { AV_CODEC_ID_NOTCHLC, MKTAG('n', 'c', 'l', 'c') },
317 
318     { AV_CODEC_ID_NONE, 0 },
319 };
320 
321 const AVCodecTag ff_codec_movaudio_tags[] = {
322     { AV_CODEC_ID_AAC,             MKTAG('m', 'p', '4', 'a') },
323     { AV_CODEC_ID_AC3,             MKTAG('a', 'c', '-', '3') }, /* ETSI TS 102 366 Annex F */
324     { AV_CODEC_ID_AC3,             MKTAG('s', 'a', 'c', '3') }, /* Nero Recode */
325     { AV_CODEC_ID_ADPCM_IMA_QT,    MKTAG('i', 'm', 'a', '4') },
326     { AV_CODEC_ID_ALAC,            MKTAG('a', 'l', 'a', 'c') },
327     { AV_CODEC_ID_AMR_NB,          MKTAG('s', 'a', 'm', 'r') }, /* AMR-NB 3gp */
328     { AV_CODEC_ID_AMR_WB,          MKTAG('s', 'a', 'w', 'b') }, /* AMR-WB 3gp */
329     { AV_CODEC_ID_DTS,             MKTAG('d', 't', 's', 'c') }, /* DTS formats prior to DTS-HD */
330     { AV_CODEC_ID_DTS,             MKTAG('d', 't', 's', 'h') }, /* DTS-HD audio formats */
331     { AV_CODEC_ID_DTS,             MKTAG('d', 't', 's', 'l') }, /* DTS-HD Lossless formats */
332     { AV_CODEC_ID_DTS,             MKTAG('d', 't', 's', 'e') }, /* DTS Express */
333     { AV_CODEC_ID_DTS,             MKTAG('D', 'T', 'S', ' ') }, /* non-standard */
334     { AV_CODEC_ID_EAC3,            MKTAG('e', 'c', '-', '3') }, /* ETSI TS 102 366 Annex F (only valid in ISOBMFF) */
335     { AV_CODEC_ID_DVAUDIO,         MKTAG('v', 'd', 'v', 'a') },
336     { AV_CODEC_ID_DVAUDIO,         MKTAG('d', 'v', 'c', 'a') },
337     { AV_CODEC_ID_GSM,             MKTAG('a', 'g', 's', 'm') },
338     { AV_CODEC_ID_ILBC,            MKTAG('i', 'l', 'b', 'c') },
339     { AV_CODEC_ID_MACE3,           MKTAG('M', 'A', 'C', '3') },
340     { AV_CODEC_ID_MACE6,           MKTAG('M', 'A', 'C', '6') },
341     { AV_CODEC_ID_MP1,             MKTAG('.', 'm', 'p', '1') },
342     { AV_CODEC_ID_MP2,             MKTAG('.', 'm', 'p', '2') },
343     { AV_CODEC_ID_MP3,             MKTAG('.', 'm', 'p', '3') },
344     { AV_CODEC_ID_MP3,             MKTAG('m', 'p', '3', ' ') }, /* vlc */
345     { AV_CODEC_ID_MP3,             0x6D730055                },
346     { AV_CODEC_ID_NELLYMOSER,      MKTAG('n', 'm', 'o', 's') }, /* Flash Media Server */
347     { AV_CODEC_ID_NELLYMOSER,      MKTAG('N', 'E', 'L', 'L') }, /* Perian */
348     { AV_CODEC_ID_PCM_ALAW,        MKTAG('a', 'l', 'a', 'w') },
349     { AV_CODEC_ID_PCM_F32BE,       MKTAG('f', 'l', '3', '2') },
350     { AV_CODEC_ID_PCM_F32LE,       MKTAG('f', 'l', '3', '2') },
351     { AV_CODEC_ID_PCM_F64BE,       MKTAG('f', 'l', '6', '4') },
352     { AV_CODEC_ID_PCM_F64LE,       MKTAG('f', 'l', '6', '4') },
353     { AV_CODEC_ID_PCM_MULAW,       MKTAG('u', 'l', 'a', 'w') },
354     { AV_CODEC_ID_PCM_S16BE,       MKTAG('t', 'w', 'o', 's') },
355     { AV_CODEC_ID_PCM_S16LE,       MKTAG('s', 'o', 'w', 't') },
356     { AV_CODEC_ID_PCM_S16BE,       MKTAG('l', 'p', 'c', 'm') },
357     { AV_CODEC_ID_PCM_S16LE,       MKTAG('l', 'p', 'c', 'm') },
358     { AV_CODEC_ID_PCM_S24BE,       MKTAG('i', 'n', '2', '4') },
359     { AV_CODEC_ID_PCM_S24LE,       MKTAG('i', 'n', '2', '4') },
360     { AV_CODEC_ID_PCM_S32BE,       MKTAG('i', 'n', '3', '2') },
361     { AV_CODEC_ID_PCM_S32LE,       MKTAG('i', 'n', '3', '2') },
362     { AV_CODEC_ID_PCM_S8,          MKTAG('s', 'o', 'w', 't') },
363     { AV_CODEC_ID_PCM_U8,          MKTAG('r', 'a', 'w', ' ') },
364     { AV_CODEC_ID_PCM_U8,          MKTAG('N', 'O', 'N', 'E') },
365     { AV_CODEC_ID_QCELP,           MKTAG('Q', 'c', 'l', 'p') },
366     { AV_CODEC_ID_QCELP,           MKTAG('Q', 'c', 'l', 'q') },
367     { AV_CODEC_ID_QCELP,           MKTAG('s', 'q', 'c', 'p') }, /* ISO Media fourcc */
368     { AV_CODEC_ID_QDM2,            MKTAG('Q', 'D', 'M', '2') },
369     { AV_CODEC_ID_QDMC,            MKTAG('Q', 'D', 'M', 'C') },
370     { AV_CODEC_ID_SPEEX,           MKTAG('s', 'p', 'e', 'x') }, /* Flash Media Server */
371     { AV_CODEC_ID_SPEEX,           MKTAG('S', 'P', 'X', 'N') }, /* ZygoAudio (quality 10 mode) */
372     { AV_CODEC_ID_EVRC,            MKTAG('s', 'e', 'v', 'c') }, /* 3GPP2 */
373     { AV_CODEC_ID_SMV,             MKTAG('s', 's', 'm', 'v') }, /* 3GPP2 */
374     { AV_CODEC_ID_FLAC,            MKTAG('f', 'L', 'a', 'C') }, /* nonstandard */
375     { AV_CODEC_ID_TRUEHD,          MKTAG('m', 'l', 'p', 'a') }, /* mp4ra.org */
376     { AV_CODEC_ID_OPUS,            MKTAG('O', 'p', 'u', 's') }, /* mp4ra.org */
377     { AV_CODEC_ID_MPEGH_3D_AUDIO,  MKTAG('m', 'h', 'm', '1') }, /* MPEG-H 3D Audio bitstream */
378     { AV_CODEC_ID_NONE, 0 },
379 };
380 
381 const AVCodecTag ff_codec_movsubtitle_tags[] = {
382     { AV_CODEC_ID_MOV_TEXT, MKTAG('t', 'e', 'x', 't') },
383     { AV_CODEC_ID_MOV_TEXT, MKTAG('t', 'x', '3', 'g') },
384     { AV_CODEC_ID_EIA_608,  MKTAG('c', '6', '0', '8') },
385     { AV_CODEC_ID_NONE, 0 },
386 };
387 
388 const AVCodecTag ff_codec_movdata_tags[] = {
389     { AV_CODEC_ID_BIN_DATA, MKTAG('g', 'p', 'm', 'd') },
390     { AV_CODEC_ID_NONE, 0 },
391 };
392 
393 /* map numeric codes from mdhd atom to ISO 639 */
394 /* cf. QTFileFormat.pdf p253, qtff.pdf p205 */
395 /* http://developer.apple.com/documentation/mac/Text/Text-368.html */
396 /* deprecated by putting the code as 3*5 bits ASCII */
397 static const char mov_mdhd_language_map[][4] = {
398     /* 0-9 */
399     "eng", "fra", "ger", "ita", "dut", "sve", "spa", "dan", "por", "nor",
400     "heb", "jpn", "ara", "fin", "gre", "ice", "mlt", "tur", "hr "/*scr*/, "chi"/*ace?*/,
401     "urd", "hin", "tha", "kor", "lit", "pol", "hun", "est", "lav",    "",
402     "fo ",    "", "rus", "chi",    "", "iri", "alb", "ron", "ces", "slk",
403     "slv", "yid", "sr ", "mac", "bul", "ukr", "bel", "uzb", "kaz", "aze",
404     /*?*/
405     "aze", "arm", "geo", "mol", "kir", "tgk", "tuk", "mon",    "", "pus",
406     "kur", "kas", "snd", "tib", "nep", "san", "mar", "ben", "asm", "guj",
407     "pa ", "ori", "mal", "kan", "tam", "tel",    "", "bur", "khm", "lao",
408     /*                   roman? arabic? */
409     "vie", "ind", "tgl", "may", "may", "amh", "tir", "orm", "som", "swa",
410     /*==rundi?*/
411        "", "run",    "", "mlg", "epo",    "",    "",    "",    "",    "",
412     /* 100 */
413        "",    "",    "",    "",    "",    "",    "",    "",    "",    "",
414        "",    "",    "",    "",    "",    "",    "",    "",    "",    "",
415        "",    "",    "",    "",    "",    "",    "",    "", "wel", "baq",
416     "cat", "lat", "que", "grn", "aym", "tat", "uig", "dzo", "jav"
417 };
418 
ff_mov_iso639_to_lang(const char lang[4],int mp4)419 int ff_mov_iso639_to_lang(const char lang[4], int mp4)
420 {
421     int i, code = 0;
422 
423     /* old way, only for QT? */
424     for (i = 0; lang[0] && !mp4 && i < FF_ARRAY_ELEMS(mov_mdhd_language_map); i++) {
425         if (!strcmp(lang, mov_mdhd_language_map[i]))
426             return i;
427     }
428     /* XXX:can we do that in mov too? */
429     if (!mp4)
430         return -1;
431     /* handle undefined as such */
432     if (lang[0] == '\0')
433         lang = "und";
434     /* 5 bits ASCII */
435     for (i = 0; i < 3; i++) {
436         uint8_t c = lang[i];
437         c -= 0x60;
438         if (c > 0x1f)
439             return -1;
440         code <<= 5;
441         code |= c;
442     }
443     return code;
444 }
445 
ff_mov_lang_to_iso639(unsigned code,char to[4])446 int ff_mov_lang_to_iso639(unsigned code, char to[4])
447 {
448     int i;
449     memset(to, 0, 4);
450     /* is it the mangled iso code? */
451     /* see http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt */
452     if (code >= 0x400 && code != 0x7fff) {
453         for (i = 2; i >= 0; i--) {
454             to[i] = 0x60 + (code & 0x1f);
455             code >>= 5;
456         }
457         return 1;
458     }
459     /* old fashion apple lang code */
460     if (code >= FF_ARRAY_ELEMS(mov_mdhd_language_map))
461         return 0;
462     if (!mov_mdhd_language_map[code][0])
463         return 0;
464     memcpy(to, mov_mdhd_language_map[code], 4);
465     return 1;
466 }
467 
ff_mp4_read_descr_len(AVIOContext * pb)468 int ff_mp4_read_descr_len(AVIOContext *pb)
469 {
470     int len = 0;
471     int count = 4;
472     while (count--) {
473         int c = avio_r8(pb);
474         len = (len << 7) | (c & 0x7f);
475         if (!(c & 0x80))
476             break;
477     }
478     return len;
479 }
480 
ff_mp4_read_descr(AVFormatContext * fc,AVIOContext * pb,int * tag)481 int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag)
482 {
483     int len;
484     *tag = avio_r8(pb);
485     len = ff_mp4_read_descr_len(pb);
486     av_log(fc, AV_LOG_TRACE, "MPEG-4 description: tag=0x%02x len=%d\n", *tag, len);
487     return len;
488 }
489 
ff_mp4_parse_es_descr(AVIOContext * pb,int * es_id)490 void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id)
491 {
492      int flags;
493      if (es_id) *es_id = avio_rb16(pb);
494      else                avio_rb16(pb);
495      flags = avio_r8(pb);
496      if (flags & 0x80) //streamDependenceFlag
497          avio_rb16(pb);
498      if (flags & 0x40) { //URL_Flag
499          int len = avio_r8(pb);
500          avio_skip(pb, len);
501      }
502      if (flags & 0x20) //OCRstreamFlag
503          avio_rb16(pb);
504 }
505 
506 static const AVCodecTag mp4_audio_types[] = {
507     { AV_CODEC_ID_MP3ON4, AOT_PS   }, /* old mp3on4 draft */
508     { AV_CODEC_ID_MP3ON4, AOT_L1   }, /* layer 1 */
509     { AV_CODEC_ID_MP3ON4, AOT_L2   }, /* layer 2 */
510     { AV_CODEC_ID_MP3ON4, AOT_L3   }, /* layer 3 */
511     { AV_CODEC_ID_MP4ALS, AOT_ALS  }, /* MPEG-4 ALS */
512     { AV_CODEC_ID_NONE,   AOT_NULL },
513 };
514 
ff_mp4_read_dec_config_descr(AVFormatContext * fc,AVStream * st,AVIOContext * pb)515 int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb)
516 {
517     enum AVCodecID codec_id;
518     unsigned v;
519     int len, tag;
520     int ret;
521     int object_type_id = avio_r8(pb);
522     avio_r8(pb); /* stream type */
523     avio_rb24(pb); /* buffer size db */
524 
525     v = avio_rb32(pb);
526 
527     // TODO: fix this with codecpar
528 #if FF_API_LAVF_AVCTX
529 FF_DISABLE_DEPRECATION_WARNINGS
530     if (v < INT32_MAX)
531         st->codec->rc_max_rate = v;
532 FF_ENABLE_DEPRECATION_WARNINGS
533 #endif
534 
535     st->codecpar->bit_rate = avio_rb32(pb); /* avg bitrate */
536 
537     codec_id= ff_codec_get_id(ff_mp4_obj_type, object_type_id);
538     if (codec_id)
539         st->codecpar->codec_id = codec_id;
540     av_log(fc, AV_LOG_TRACE, "esds object type id 0x%02x\n", object_type_id);
541     len = ff_mp4_read_descr(fc, pb, &tag);
542     if (tag == MP4DecSpecificDescrTag) {
543         av_log(fc, AV_LOG_TRACE, "Specific MPEG-4 header len=%d\n", len);
544         /* As per 14496-3:2009 9.D.2.2, No decSpecificInfo is defined
545            for MPEG-1 Audio or MPEG-2 Audio; MPEG-2 AAC excluded. */
546         if (object_type_id == 0x69 || object_type_id == 0x6b)
547             return 0;
548         if (!len || (uint64_t)len > (1<<30))
549             return AVERROR_INVALIDDATA;
550         if ((ret = ff_get_extradata(fc, st->codecpar, pb, len)) < 0)
551             return ret;
552         if (st->codecpar->codec_id == AV_CODEC_ID_AAC) {
553             MPEG4AudioConfig cfg = {0};
554             ret = avpriv_mpeg4audio_get_config2(&cfg, st->codecpar->extradata,
555                                                 st->codecpar->extradata_size, 1, fc);
556             if (ret < 0)
557                 return ret;
558             st->codecpar->channels = cfg.channels;
559             if (cfg.object_type == 29 && cfg.sampling_index < 3) // old mp3on4
560                 st->codecpar->sample_rate = avpriv_mpa_freq_tab[cfg.sampling_index];
561             else if (cfg.ext_sample_rate)
562                 st->codecpar->sample_rate = cfg.ext_sample_rate;
563             else
564                 st->codecpar->sample_rate = cfg.sample_rate;
565             av_log(fc, AV_LOG_TRACE, "mp4a config channels %d obj %d ext obj %d "
566                     "sample rate %d ext sample rate %d\n", st->codecpar->channels,
567                     cfg.object_type, cfg.ext_object_type,
568                     cfg.sample_rate, cfg.ext_sample_rate);
569             if (!(st->codecpar->codec_id = ff_codec_get_id(mp4_audio_types,
570                                                         cfg.object_type)))
571                 st->codecpar->codec_id = AV_CODEC_ID_AAC;
572         }
573     }
574     return 0;
575 }
576 
577 typedef struct MovChannelLayout {
578     int64_t  channel_layout;
579     uint32_t layout_tag;
580 } MovChannelLayout;
581 
582 static const MovChannelLayout mov_channel_layout[] = {
583     { AV_CH_LAYOUT_MONO,                         (100<<16) | 1}, // kCAFChannelLayoutTag_Mono
584     { AV_CH_LAYOUT_STEREO,                       (101<<16) | 2}, // kCAFChannelLayoutTag_Stereo
585     { AV_CH_LAYOUT_STEREO,                       (102<<16) | 2}, // kCAFChannelLayoutTag_StereoHeadphones
586     { AV_CH_LAYOUT_2_1,                          (131<<16) | 3}, // kCAFChannelLayoutTag_ITU_2_1
587     { AV_CH_LAYOUT_QUAD,                         (132<<16) | 4}, // kCAFChannelLayoutTag_ITU_2_2
588     { AV_CH_LAYOUT_2_2,                          (132<<16) | 4}, // kCAFChannelLayoutTag_ITU_2_2
589     { AV_CH_LAYOUT_QUAD,                         (108<<16) | 4}, // kCAFChannelLayoutTag_Quadraphonic
590     { AV_CH_LAYOUT_SURROUND,                     (113<<16) | 3}, // kCAFChannelLayoutTag_MPEG_3_0_A
591     { AV_CH_LAYOUT_4POINT0,                      (115<<16) | 4}, // kCAFChannelLayoutTag_MPEG_4_0_A
592     { AV_CH_LAYOUT_5POINT0_BACK,                 (117<<16) | 5}, // kCAFChannelLayoutTag_MPEG_5_0_A
593     { AV_CH_LAYOUT_5POINT0,                      (117<<16) | 5}, // kCAFChannelLayoutTag_MPEG_5_0_A
594     { AV_CH_LAYOUT_5POINT1_BACK,                 (121<<16) | 6}, // kCAFChannelLayoutTag_MPEG_5_1_A
595     { AV_CH_LAYOUT_5POINT1,                      (121<<16) | 6}, // kCAFChannelLayoutTag_MPEG_5_1_A
596     { AV_CH_LAYOUT_7POINT1,                      (128<<16) | 8}, // kCAFChannelLayoutTag_MPEG_7_1_C
597     { AV_CH_LAYOUT_7POINT1_WIDE,                 (126<<16) | 8}, // kCAFChannelLayoutTag_MPEG_7_1_A
598     { AV_CH_LAYOUT_5POINT1_BACK|AV_CH_LAYOUT_STEREO_DOWNMIX, (130<<16) | 8}, // kCAFChannelLayoutTag_SMPTE_DTV
599     { AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY,   (133<<16) | 3}, // kCAFChannelLayoutTag_DVD_4
600     { AV_CH_LAYOUT_2_1|AV_CH_LOW_FREQUENCY,      (134<<16) | 4}, // kCAFChannelLayoutTag_DVD_5
601     { AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY,     (135<<16) | 4}, // kCAFChannelLayoutTag_DVD_6
602     { AV_CH_LAYOUT_2_2|AV_CH_LOW_FREQUENCY,      (135<<16) | 4}, // kCAFChannelLayoutTag_DVD_6
603     { AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY, (136<<16) | 4}, // kCAFChannelLayoutTag_DVD_10
604     { AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY,  (137<<16) | 5}, // kCAFChannelLayoutTag_DVD_11
605     { 0, 0},
606 };
607 #if 0
608 int ff_mov_read_chan(AVFormatContext *s, AVStream *st, int64_t size)
609 {
610     AVCodecContext *codec= st->codec;
611     uint32_t layout_tag;
612     AVIOContext *pb = s->pb;
613     const MovChannelLayout *layouts = mov_channel_layout;
614 
615     if (size < 12)
616         return AVERROR_INVALIDDATA;
617 
618     layout_tag = avio_rb32(pb);
619     size -= 4;
620     if (layout_tag == 0) { // kCAFChannelLayoutTag_UseChannelDescriptions
621         // Channel descriptions not implemented
622         av_log_ask_for_sample(s, "Unimplemented container channel layout.\n");
623         avio_skip(pb, size);
624         return 0;
625     }
626     if (layout_tag == 0x10000) { // kCAFChannelLayoutTag_UseChannelBitmap
627         codec->channel_layout = avio_rb32(pb);
628         size -= 4;
629         avio_skip(pb, size);
630         return 0;
631     }
632     while (layouts->channel_layout) {
633         if (layout_tag == layouts->layout_tag) {
634             codec->channel_layout = layouts->channel_layout;
635             break;
636         }
637         layouts++;
638     }
639     if (!codec->channel_layout)
640         av_log(s, AV_LOG_WARNING, "Unknown container channel layout.\n");
641     avio_skip(pb, size);
642 
643     return 0;
644 }
645 #endif
646 
ff_mov_write_chan(AVIOContext * pb,int64_t channel_layout)647 void ff_mov_write_chan(AVIOContext *pb, int64_t channel_layout)
648 {
649     const MovChannelLayout *layouts;
650     uint32_t layout_tag = 0;
651 
652     for (layouts = mov_channel_layout; layouts->channel_layout; layouts++)
653         if (channel_layout == layouts->channel_layout) {
654             layout_tag = layouts->layout_tag;
655             break;
656         }
657 
658     if (layout_tag) {
659         avio_wb32(pb, layout_tag); // mChannelLayoutTag
660         avio_wb32(pb, 0);          // mChannelBitmap
661     } else {
662         avio_wb32(pb, 0x10000);    // kCAFChannelLayoutTag_UseChannelBitmap
663         avio_wb32(pb, channel_layout);
664     }
665     avio_wb32(pb, 0);              // mNumberChannelDescriptions
666 }
667 
avformat_get_mov_video_tags(void)668 const struct AVCodecTag *avformat_get_mov_video_tags(void)
669 {
670     return ff_codec_movvideo_tags;
671 }
672 
avformat_get_mov_audio_tags(void)673 const struct AVCodecTag *avformat_get_mov_audio_tags(void)
674 {
675     return ff_codec_movaudio_tags;
676 }
677