00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "avformat.h"
00027 #include "internal.h"
00028 #include "isom.h"
00029 #include "riff.h"
00030 #include "libavcodec/mpeg4audio.h"
00031 #include "libavcodec/mpegaudiodata.h"
00032
00033
00034
00035 const AVCodecTag ff_mp4_obj_type[] = {
00036 { CODEC_ID_MOV_TEXT , 0x08 },
00037 { CODEC_ID_MPEG4 , 0x20 },
00038 { CODEC_ID_H264 , 0x21 },
00039 { CODEC_ID_AAC , 0x40 },
00040 { CODEC_ID_MP4ALS , 0x40 },
00041 { CODEC_ID_MPEG2VIDEO, 0x61 },
00042 { CODEC_ID_MPEG2VIDEO, 0x60 },
00043 { CODEC_ID_MPEG2VIDEO, 0x62 },
00044 { CODEC_ID_MPEG2VIDEO, 0x63 },
00045 { CODEC_ID_MPEG2VIDEO, 0x64 },
00046 { CODEC_ID_MPEG2VIDEO, 0x65 },
00047 { CODEC_ID_AAC , 0x66 },
00048 { CODEC_ID_AAC , 0x67 },
00049 { CODEC_ID_AAC , 0x68 },
00050 { CODEC_ID_MP3 , 0x69 },
00051 { CODEC_ID_MP2 , 0x69 },
00052 { CODEC_ID_MPEG1VIDEO, 0x6A },
00053 { CODEC_ID_MP3 , 0x6B },
00054 { CODEC_ID_MJPEG , 0x6C },
00055 { CODEC_ID_PNG , 0x6D },
00056 { CODEC_ID_JPEG2000 , 0x6E },
00057 { CODEC_ID_VC1 , 0xA3 },
00058 { CODEC_ID_DIRAC , 0xA4 },
00059 { CODEC_ID_AC3 , 0xA5 },
00060 { CODEC_ID_DTS , 0xA9 },
00061 { CODEC_ID_VORBIS , 0xDD },
00062 { CODEC_ID_DVD_SUBTITLE, 0xE0 },
00063 { CODEC_ID_QCELP , 0xE1 },
00064 { CODEC_ID_MPEG4SYSTEMS, 0x01 },
00065 { CODEC_ID_MPEG4SYSTEMS, 0x02 },
00066 { CODEC_ID_NONE , 0 },
00067 };
00068
00069 const AVCodecTag codec_movvideo_tags[] = {
00070
00071
00072 { CODEC_ID_RAWVIDEO, MKTAG('r', 'a', 'w', ' ') },
00073 { CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') },
00074 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', 'U', 'I') },
00075 { CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') },
00076 { CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', 's') },
00077
00078 { CODEC_ID_RAWVIDEO, MKTAG('L', '5', '5', '5') },
00079 { CODEC_ID_RAWVIDEO, MKTAG('L', '5', '6', '5') },
00080 { CODEC_ID_RAWVIDEO, MKTAG('B', '5', '6', '5') },
00081 { CODEC_ID_RAWVIDEO, MKTAG('2', '4', 'B', 'G') },
00082 { CODEC_ID_RAWVIDEO, MKTAG('B', 'G', 'R', 'A') },
00083 { CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', 'A') },
00084 { CODEC_ID_RAWVIDEO, MKTAG('A', 'B', 'G', 'R') },
00085 { CODEC_ID_RAWVIDEO, MKTAG('b', '1', '6', 'g') },
00086 { CODEC_ID_RAWVIDEO, MKTAG('b', '4', '8', 'r') },
00087 { CODEC_ID_RAWVIDEO, MKTAG('D', 'V', 'O', 'O') },
00088
00089 { CODEC_ID_R10K, MKTAG('R', '1', '0', 'k') },
00090 { CODEC_ID_R10K, MKTAG('R', '1', '0', 'g') },
00091 { CODEC_ID_R210, MKTAG('r', '2', '1', '0') },
00092 { CODEC_ID_V210, MKTAG('v', '2', '1', '0') },
00093 { CODEC_ID_V410, MKTAG('v', '4', '1', '0') },
00094
00095 { CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') },
00096 { CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') },
00097 { CODEC_ID_MJPEG, MKTAG('A', 'V', 'D', 'J') },
00098
00099 { CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') },
00100 { CODEC_ID_MJPEGB, MKTAG('m', 'j', 'p', 'b') },
00101
00102 { CODEC_ID_SVQ1, MKTAG('S', 'V', 'Q', '1') },
00103 { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') },
00104 { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', 'i') },
00105 { CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') },
00106
00107 { CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
00108 { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') },
00109 { CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
00110 { CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') },
00111
00112 { CODEC_ID_H263, MKTAG('h', '2', '6', '3') },
00113 { CODEC_ID_H263, MKTAG('s', '2', '6', '3') },
00114
00115 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 'p') },
00116 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') },
00117 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'p', 'p') },
00118 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'p') },
00119 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'n') },
00120 { CODEC_ID_DVVIDEO, MKTAG('A', 'V', 'd', 'v') },
00121 { CODEC_ID_DVVIDEO, MKTAG('A', 'V', 'd', '1') },
00122 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'q') },
00123 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'p') },
00124 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
00125 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '2') },
00126 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '4') },
00127 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '5') },
00128 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '6') },
00129 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '3') },
00130
00131 { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
00132 { CODEC_ID_RPZA, MKTAG('r', 'p', 'z', 'a') },
00133 { CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') },
00134 { CODEC_ID_8BPS, MKTAG('8', 'B', 'P', 'S') },
00135 { CODEC_ID_SMC, MKTAG('s', 'm', 'c', ' ') },
00136 { CODEC_ID_QTRLE, MKTAG('r', 'l', 'e', ' ') },
00137 { CODEC_ID_MSRLE, MKTAG('W', 'R', 'L', 'E') },
00138 { CODEC_ID_QDRAW, MKTAG('q', 'd', 'r', 'w') },
00139
00140 { CODEC_ID_RAWVIDEO, MKTAG('W', 'R', 'A', 'W') },
00141
00142 { CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') },
00143 { CODEC_ID_H264, MKTAG('a', 'i', '5', 'p') },
00144 { CODEC_ID_H264, MKTAG('a', 'i', '5', 'q') },
00145 { CODEC_ID_H264, MKTAG('a', 'i', '5', '2') },
00146 { CODEC_ID_H264, MKTAG('a', 'i', '5', '3') },
00147 { CODEC_ID_H264, MKTAG('a', 'i', '5', '5') },
00148 { CODEC_ID_H264, MKTAG('a', 'i', '5', '6') },
00149 { CODEC_ID_H264, MKTAG('a', 'i', '1', 'p') },
00150 { CODEC_ID_H264, MKTAG('a', 'i', '1', 'q') },
00151 { CODEC_ID_H264, MKTAG('a', 'i', '1', '2') },
00152 { CODEC_ID_H264, MKTAG('a', 'i', '1', '3') },
00153 { CODEC_ID_H264, MKTAG('a', 'i', '1', '5') },
00154 { CODEC_ID_H264, MKTAG('a', 'i', '1', '6') },
00155
00156 { CODEC_ID_MPEG1VIDEO, MKTAG('m', '1', 'v', '1') },
00157 { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'e', 'g') },
00158 { CODEC_ID_MPEG2VIDEO, MKTAG('m', '2', 'v', '1') },
00159 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '1') },
00160 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '2') },
00161 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '3') },
00162 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '5') },
00163 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '6') },
00164 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '7') },
00165 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '8') },
00166 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'n') },
00167 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'p') },
00168 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'n') },
00169 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'p') },
00170 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'n') },
00171 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'p') },
00172 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '4') },
00173 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '5') },
00174 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '9') },
00175 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'a') },
00176 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'b') },
00177 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'c') },
00178 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'd') },
00179 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'e') },
00180 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'f') },
00181 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '1') },
00182 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '2') },
00183 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '3') },
00184 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '4') },
00185 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '5') },
00186 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '6') },
00187 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '7') },
00188 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '8') },
00189 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '9') },
00190 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'a') },
00191 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'b') },
00192 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'c') },
00193 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'd') },
00194 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'e') },
00195 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'f') },
00196 { CODEC_ID_MPEG2VIDEO, MKTAG('A', 'V', 'm', 'p') },
00197
00198 { CODEC_ID_JPEG2000, MKTAG('m', 'j', 'p', '2') },
00199
00200 { CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') },
00201 { CODEC_ID_TIFF, MKTAG('t', 'i', 'f', 'f') },
00202 { CODEC_ID_GIF, MKTAG('g', 'i', 'f', ' ') },
00203 { CODEC_ID_PNG, MKTAG('p', 'n', 'g', ' ') },
00204
00205 { CODEC_ID_VC1, MKTAG('v', 'c', '-', '1') },
00206 { CODEC_ID_CAVS, MKTAG('a', 'v', 's', '2') },
00207
00208 { CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') },
00209 { CODEC_ID_DNXHD, MKTAG('A', 'V', 'd', 'n') },
00210 { CODEC_ID_FLV1, MKTAG('H', '2', '6', '3') },
00211 { CODEC_ID_MSMPEG4V3, MKTAG('3', 'I', 'V', 'D') },
00212 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', '1', 'x') },
00213 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', 'u', 'p') },
00214 { CODEC_ID_SGI, MKTAG('s', 'g', 'i', ' ') },
00215 { CODEC_ID_DPX, MKTAG('d', 'p', 'x', ' ') },
00216
00217 { CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 'h') },
00218 { CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 'n') },
00219 { CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 's') },
00220 { CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 'o') },
00221 { CODEC_ID_PRORES, MKTAG('a', 'p', '4', 'h') },
00222
00223 { CODEC_ID_NONE, 0 },
00224 };
00225
00226 const AVCodecTag codec_movaudio_tags[] = {
00227 { CODEC_ID_AAC, MKTAG('m', 'p', '4', 'a') },
00228 { CODEC_ID_AC3, MKTAG('a', 'c', '-', '3') },
00229 { CODEC_ID_AC3, MKTAG('s', 'a', 'c', '3') },
00230 { CODEC_ID_ADPCM_IMA_QT, MKTAG('i', 'm', 'a', '4') },
00231 { CODEC_ID_ALAC, MKTAG('a', 'l', 'a', 'c') },
00232 { CODEC_ID_AMR_NB, MKTAG('s', 'a', 'm', 'r') },
00233 { CODEC_ID_AMR_WB, MKTAG('s', 'a', 'w', 'b') },
00234 { CODEC_ID_DTS, MKTAG('d', 't', 's', 'c') },
00235 { CODEC_ID_DTS, MKTAG('D', 'T', 'S', ' ') },
00236 { CODEC_ID_DVAUDIO, MKTAG('v', 'd', 'v', 'a') },
00237 { CODEC_ID_DVAUDIO, MKTAG('d', 'v', 'c', 'a') },
00238 { CODEC_ID_GSM, MKTAG('a', 'g', 's', 'm') },
00239 { CODEC_ID_MACE3, MKTAG('M', 'A', 'C', '3') },
00240 { CODEC_ID_MACE6, MKTAG('M', 'A', 'C', '6') },
00241 { CODEC_ID_MP1, MKTAG('.', 'm', 'p', '1') },
00242 { CODEC_ID_MP2, MKTAG('.', 'm', 'p', '2') },
00243 { CODEC_ID_MP3, MKTAG('.', 'm', 'p', '3') },
00244 { CODEC_ID_MP3, 0x6D730055 },
00245 { CODEC_ID_NELLYMOSER, MKTAG('n', 'm', 'o', 's') },
00246 { CODEC_ID_PCM_ALAW, MKTAG('a', 'l', 'a', 'w') },
00247 { CODEC_ID_PCM_F32BE, MKTAG('f', 'l', '3', '2') },
00248 { CODEC_ID_PCM_F32LE, MKTAG('f', 'l', '3', '2') },
00249 { CODEC_ID_PCM_F64BE, MKTAG('f', 'l', '6', '4') },
00250 { CODEC_ID_PCM_F64LE, MKTAG('f', 'l', '6', '4') },
00251 { CODEC_ID_PCM_MULAW, MKTAG('u', 'l', 'a', 'w') },
00252 { CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's') },
00253 { CODEC_ID_PCM_S16LE, MKTAG('s', 'o', 'w', 't') },
00254 { CODEC_ID_PCM_S16LE, MKTAG('l', 'p', 'c', 'm') },
00255 { CODEC_ID_PCM_S24BE, MKTAG('i', 'n', '2', '4') },
00256 { CODEC_ID_PCM_S24LE, MKTAG('i', 'n', '2', '4') },
00257 { CODEC_ID_PCM_S32BE, MKTAG('i', 'n', '3', '2') },
00258 { CODEC_ID_PCM_S32LE, MKTAG('i', 'n', '3', '2') },
00259 { CODEC_ID_PCM_S8, MKTAG('s', 'o', 'w', 't') },
00260 { CODEC_ID_PCM_U8, MKTAG('r', 'a', 'w', ' ') },
00261 { CODEC_ID_PCM_U8, MKTAG('N', 'O', 'N', 'E') },
00262 { CODEC_ID_QCELP, MKTAG('Q', 'c', 'l', 'p') },
00263 { CODEC_ID_QCELP, MKTAG('Q', 'c', 'l', 'q') },
00264 { CODEC_ID_QCELP, MKTAG('s', 'q', 'c', 'p') },
00265 { CODEC_ID_QDM2, MKTAG('Q', 'D', 'M', '2') },
00266 { CODEC_ID_QDMC, MKTAG('Q', 'D', 'M', 'C') },
00267 { CODEC_ID_SPEEX, MKTAG('s', 'p', 'e', 'x') },
00268 { CODEC_ID_WMAV2, MKTAG('W', 'M', 'A', '2') },
00269 { CODEC_ID_NONE, 0 },
00270 };
00271
00272 const AVCodecTag ff_codec_movsubtitle_tags[] = {
00273 { CODEC_ID_MOV_TEXT, MKTAG('t', 'e', 'x', 't') },
00274 { CODEC_ID_MOV_TEXT, MKTAG('t', 'x', '3', 'g') },
00275 { CODEC_ID_NONE, 0 },
00276 };
00277
00278
00279
00280
00281
00282 static const char mov_mdhd_language_map[][4] = {
00283
00284 "eng", "fra", "ger", "ita", "dut", "sve", "spa", "dan", "por", "nor",
00285 "heb", "jpn", "ara", "fin", "gre", "ice", "mlt", "tur", "hr ", "chi",
00286 "urd", "hin", "tha", "kor", "lit", "pol", "hun", "est", "lav", "",
00287 "fo ", "", "rus", "chi", "", "iri", "alb", "ron", "ces", "slk",
00288 "slv", "yid", "sr ", "mac", "bul", "ukr", "bel", "uzb", "kaz", "aze",
00289
00290 "aze", "arm", "geo", "mol", "kir", "tgk", "tuk", "mon", "", "pus",
00291 "kur", "kas", "snd", "tib", "nep", "san", "mar", "ben", "asm", "guj",
00292 "pa ", "ori", "mal", "kan", "tam", "tel", "", "bur", "khm", "lao",
00293
00294 "vie", "ind", "tgl", "may", "may", "amh", "tir", "orm", "som", "swa",
00295
00296 "", "run", "", "mlg", "epo", "", "", "", "", "",
00297
00298 "", "", "", "", "", "", "", "", "", "",
00299 "", "", "", "", "", "", "", "", "", "",
00300 "", "", "", "", "", "", "", "", "wel", "baq",
00301 "cat", "lat", "que", "grn", "aym", "tat", "uig", "dzo", "jav"
00302 };
00303
00304 int ff_mov_iso639_to_lang(const char lang[4], int mp4)
00305 {
00306 int i, code = 0;
00307
00308
00309 for (i = 0; lang[0] && !mp4 && i < FF_ARRAY_ELEMS(mov_mdhd_language_map); i++) {
00310 if (!strcmp(lang, mov_mdhd_language_map[i]))
00311 return i;
00312 }
00313
00314 if (!mp4)
00315 return -1;
00316
00317 if (lang[0] == '\0')
00318 lang = "und";
00319
00320 for (i = 0; i < 3; i++) {
00321 uint8_t c = lang[i];
00322 c -= 0x60;
00323 if (c > 0x1f)
00324 return -1;
00325 code <<= 5;
00326 code |= c;
00327 }
00328 return code;
00329 }
00330
00331 int ff_mov_lang_to_iso639(unsigned code, char to[4])
00332 {
00333 int i;
00334 memset(to, 0, 4);
00335
00336
00337 if (code > 138) {
00338 for (i = 2; i >= 0; i--) {
00339 to[i] = 0x60 + (code & 0x1f);
00340 code >>= 5;
00341 }
00342 return 1;
00343 }
00344
00345 if (code >= FF_ARRAY_ELEMS(mov_mdhd_language_map))
00346 return 0;
00347 if (!mov_mdhd_language_map[code][0])
00348 return 0;
00349 memcpy(to, mov_mdhd_language_map[code], 4);
00350 return 1;
00351 }
00352
00353 int ff_mp4_read_descr_len(AVIOContext *pb)
00354 {
00355 int len = 0;
00356 int count = 4;
00357 while (count--) {
00358 int c = avio_r8(pb);
00359 len = (len << 7) | (c & 0x7f);
00360 if (!(c & 0x80))
00361 break;
00362 }
00363 return len;
00364 }
00365
00366 int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag)
00367 {
00368 int len;
00369 *tag = avio_r8(pb);
00370 len = ff_mp4_read_descr_len(pb);
00371 av_dlog(fc, "MPEG4 description: tag=0x%02x len=%d\n", *tag, len);
00372 return len;
00373 }
00374
00375 void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id)
00376 {
00377 int flags;
00378 if (es_id) *es_id = avio_rb16(pb);
00379 else avio_rb16(pb);
00380 flags = avio_r8(pb);
00381 if (flags & 0x80)
00382 avio_rb16(pb);
00383 if (flags & 0x40) {
00384 int len = avio_r8(pb);
00385 avio_skip(pb, len);
00386 }
00387 if (flags & 0x20)
00388 avio_rb16(pb);
00389 }
00390
00391 static const AVCodecTag mp4_audio_types[] = {
00392 { CODEC_ID_MP3ON4, AOT_PS },
00393 { CODEC_ID_MP3ON4, AOT_L1 },
00394 { CODEC_ID_MP3ON4, AOT_L2 },
00395 { CODEC_ID_MP3ON4, AOT_L3 },
00396 { CODEC_ID_MP4ALS, AOT_ALS },
00397 { CODEC_ID_NONE, AOT_NULL },
00398 };
00399
00400 int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb)
00401 {
00402 int len, tag;
00403 int object_type_id = avio_r8(pb);
00404 avio_r8(pb);
00405 avio_rb24(pb);
00406 avio_rb32(pb);
00407 avio_rb32(pb);
00408
00409 st->codec->codec_id= ff_codec_get_id(ff_mp4_obj_type, object_type_id);
00410 av_dlog(fc, "esds object type id 0x%02x\n", object_type_id);
00411 len = ff_mp4_read_descr(fc, pb, &tag);
00412 if (tag == MP4DecSpecificDescrTag) {
00413 av_dlog(fc, "Specific MPEG4 header len=%d\n", len);
00414 if (!len || (uint64_t)len > (1<<30))
00415 return -1;
00416 av_free(st->codec->extradata);
00417 st->codec->extradata = av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);
00418 if (!st->codec->extradata)
00419 return AVERROR(ENOMEM);
00420 avio_read(pb, st->codec->extradata, len);
00421 st->codec->extradata_size = len;
00422 if (st->codec->codec_id == CODEC_ID_AAC) {
00423 MPEG4AudioConfig cfg;
00424 avpriv_mpeg4audio_get_config(&cfg, st->codec->extradata,
00425 st->codec->extradata_size * 8, 1);
00426 st->codec->channels = cfg.channels;
00427 if (cfg.object_type == 29 && cfg.sampling_index < 3)
00428 st->codec->sample_rate = avpriv_mpa_freq_tab[cfg.sampling_index];
00429 else if (cfg.ext_sample_rate)
00430 st->codec->sample_rate = cfg.ext_sample_rate;
00431 else
00432 st->codec->sample_rate = cfg.sample_rate;
00433 av_dlog(fc, "mp4a config channels %d obj %d ext obj %d "
00434 "sample rate %d ext sample rate %d\n", st->codec->channels,
00435 cfg.object_type, cfg.ext_object_type,
00436 cfg.sample_rate, cfg.ext_sample_rate);
00437 if (!(st->codec->codec_id = ff_codec_get_id(mp4_audio_types,
00438 cfg.object_type)))
00439 st->codec->codec_id = CODEC_ID_AAC;
00440 }
00441 }
00442 return 0;
00443 }