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', '4') },
00163 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '5') },
00164 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '6') },
00165 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '7') },
00166 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '8') },
00167 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '9') },
00168 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', 'a') },
00169 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'n') },
00170 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'p') },
00171 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'n') },
00172 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'p') },
00173 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'n') },
00174 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'p') },
00175 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '4') },
00176 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '5') },
00177 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '9') },
00178 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'a') },
00179 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'b') },
00180 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'c') },
00181 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'd') },
00182 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'e') },
00183 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'f') },
00184 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '1') },
00185 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '2') },
00186 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '3') },
00187 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '4') },
00188 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '5') },
00189 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '6') },
00190 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '7') },
00191 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '8') },
00192 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '9') },
00193 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'a') },
00194 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'b') },
00195 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'c') },
00196 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'd') },
00197 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'e') },
00198 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'f') },
00199 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'h', 'd') },
00200 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'h', '2') },
00201 { CODEC_ID_MPEG2VIDEO, MKTAG('A', 'V', 'm', 'p') },
00202
00203 { CODEC_ID_JPEG2000, MKTAG('m', 'j', 'p', '2') },
00204
00205 { CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') },
00206 { CODEC_ID_TIFF, MKTAG('t', 'i', 'f', 'f') },
00207 { CODEC_ID_GIF, MKTAG('g', 'i', 'f', ' ') },
00208 { CODEC_ID_PNG, MKTAG('p', 'n', 'g', ' ') },
00209
00210 { CODEC_ID_VC1, MKTAG('v', 'c', '-', '1') },
00211 { CODEC_ID_CAVS, MKTAG('a', 'v', 's', '2') },
00212
00213 { CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') },
00214 { CODEC_ID_DNXHD, MKTAG('A', 'V', 'd', 'n') },
00215 { CODEC_ID_FLV1, MKTAG('H', '2', '6', '3') },
00216 { CODEC_ID_MSMPEG4V3, MKTAG('3', 'I', 'V', 'D') },
00217 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', '1', 'x') },
00218 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', 'u', 'p') },
00219 { CODEC_ID_SGI, MKTAG('s', 'g', 'i', ' ') },
00220 { CODEC_ID_DPX, MKTAG('d', 'p', 'x', ' ') },
00221
00222 { CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 'h') },
00223 { CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 'n') },
00224 { CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 's') },
00225 { CODEC_ID_PRORES, MKTAG('a', 'p', 'c', 'o') },
00226 { CODEC_ID_PRORES, MKTAG('a', 'p', '4', 'h') },
00227
00228 { CODEC_ID_NONE, 0 },
00229 };
00230
00231 const AVCodecTag codec_movaudio_tags[] = {
00232 { CODEC_ID_AAC, MKTAG('m', 'p', '4', 'a') },
00233 { CODEC_ID_AC3, MKTAG('a', 'c', '-', '3') },
00234 { CODEC_ID_AC3, MKTAG('s', 'a', 'c', '3') },
00235 { CODEC_ID_ADPCM_IMA_QT, MKTAG('i', 'm', 'a', '4') },
00236 { CODEC_ID_ALAC, MKTAG('a', 'l', 'a', 'c') },
00237 { CODEC_ID_AMR_NB, MKTAG('s', 'a', 'm', 'r') },
00238 { CODEC_ID_AMR_WB, MKTAG('s', 'a', 'w', 'b') },
00239 { CODEC_ID_DTS, MKTAG('d', 't', 's', 'c') },
00240 { CODEC_ID_DTS, MKTAG('D', 'T', 'S', ' ') },
00241 { CODEC_ID_DVAUDIO, MKTAG('v', 'd', 'v', 'a') },
00242 { CODEC_ID_DVAUDIO, MKTAG('d', 'v', 'c', 'a') },
00243 { CODEC_ID_GSM, MKTAG('a', 'g', 's', 'm') },
00244 { CODEC_ID_MACE3, MKTAG('M', 'A', 'C', '3') },
00245 { CODEC_ID_MACE6, MKTAG('M', 'A', 'C', '6') },
00246 { CODEC_ID_MP1, MKTAG('.', 'm', 'p', '1') },
00247 { CODEC_ID_MP2, MKTAG('.', 'm', 'p', '2') },
00248 { CODEC_ID_MP3, MKTAG('.', 'm', 'p', '3') },
00249 { CODEC_ID_MP3, 0x6D730055 },
00250 { CODEC_ID_NELLYMOSER, MKTAG('n', 'm', 'o', 's') },
00251 { CODEC_ID_PCM_ALAW, MKTAG('a', 'l', 'a', 'w') },
00252 { CODEC_ID_PCM_F32BE, MKTAG('f', 'l', '3', '2') },
00253 { CODEC_ID_PCM_F32LE, MKTAG('f', 'l', '3', '2') },
00254 { CODEC_ID_PCM_F64BE, MKTAG('f', 'l', '6', '4') },
00255 { CODEC_ID_PCM_F64LE, MKTAG('f', 'l', '6', '4') },
00256 { CODEC_ID_PCM_MULAW, MKTAG('u', 'l', 'a', 'w') },
00257 { CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's') },
00258 { CODEC_ID_PCM_S16LE, MKTAG('s', 'o', 'w', 't') },
00259 { CODEC_ID_PCM_S16LE, MKTAG('l', 'p', 'c', 'm') },
00260 { CODEC_ID_PCM_S24BE, MKTAG('i', 'n', '2', '4') },
00261 { CODEC_ID_PCM_S24LE, MKTAG('i', 'n', '2', '4') },
00262 { CODEC_ID_PCM_S32BE, MKTAG('i', 'n', '3', '2') },
00263 { CODEC_ID_PCM_S32LE, MKTAG('i', 'n', '3', '2') },
00264 { CODEC_ID_PCM_S8, MKTAG('s', 'o', 'w', 't') },
00265 { CODEC_ID_PCM_U8, MKTAG('r', 'a', 'w', ' ') },
00266 { CODEC_ID_PCM_U8, MKTAG('N', 'O', 'N', 'E') },
00267 { CODEC_ID_QCELP, MKTAG('Q', 'c', 'l', 'p') },
00268 { CODEC_ID_QCELP, MKTAG('Q', 'c', 'l', 'q') },
00269 { CODEC_ID_QCELP, MKTAG('s', 'q', 'c', 'p') },
00270 { CODEC_ID_QDM2, MKTAG('Q', 'D', 'M', '2') },
00271 { CODEC_ID_QDMC, MKTAG('Q', 'D', 'M', 'C') },
00272 { CODEC_ID_SPEEX, MKTAG('s', 'p', 'e', 'x') },
00273 { CODEC_ID_WMAV2, MKTAG('W', 'M', 'A', '2') },
00274 { CODEC_ID_NONE, 0 },
00275 };
00276
00277 const AVCodecTag ff_codec_movsubtitle_tags[] = {
00278 { CODEC_ID_MOV_TEXT, MKTAG('t', 'e', 'x', 't') },
00279 { CODEC_ID_MOV_TEXT, MKTAG('t', 'x', '3', 'g') },
00280 { CODEC_ID_NONE, 0 },
00281 };
00282
00283
00284
00285
00286
00287 static const char mov_mdhd_language_map[][4] = {
00288
00289 "eng", "fra", "ger", "ita", "dut", "sve", "spa", "dan", "por", "nor",
00290 "heb", "jpn", "ara", "fin", "gre", "ice", "mlt", "tur", "hr ", "chi",
00291 "urd", "hin", "tha", "kor", "lit", "pol", "hun", "est", "lav", "",
00292 "fo ", "", "rus", "chi", "", "iri", "alb", "ron", "ces", "slk",
00293 "slv", "yid", "sr ", "mac", "bul", "ukr", "bel", "uzb", "kaz", "aze",
00294
00295 "aze", "arm", "geo", "mol", "kir", "tgk", "tuk", "mon", "", "pus",
00296 "kur", "kas", "snd", "tib", "nep", "san", "mar", "ben", "asm", "guj",
00297 "pa ", "ori", "mal", "kan", "tam", "tel", "", "bur", "khm", "lao",
00298
00299 "vie", "ind", "tgl", "may", "may", "amh", "tir", "orm", "som", "swa",
00300
00301 "", "run", "", "mlg", "epo", "", "", "", "", "",
00302
00303 "", "", "", "", "", "", "", "", "", "",
00304 "", "", "", "", "", "", "", "", "", "",
00305 "", "", "", "", "", "", "", "", "wel", "baq",
00306 "cat", "lat", "que", "grn", "aym", "tat", "uig", "dzo", "jav"
00307 };
00308
00309 int ff_mov_iso639_to_lang(const char lang[4], int mp4)
00310 {
00311 int i, code = 0;
00312
00313
00314 for (i = 0; lang[0] && !mp4 && i < FF_ARRAY_ELEMS(mov_mdhd_language_map); i++) {
00315 if (!strcmp(lang, mov_mdhd_language_map[i]))
00316 return i;
00317 }
00318
00319 if (!mp4)
00320 return -1;
00321
00322 if (lang[0] == '\0')
00323 lang = "und";
00324
00325 for (i = 0; i < 3; i++) {
00326 uint8_t c = lang[i];
00327 c -= 0x60;
00328 if (c > 0x1f)
00329 return -1;
00330 code <<= 5;
00331 code |= c;
00332 }
00333 return code;
00334 }
00335
00336 int ff_mov_lang_to_iso639(unsigned code, char to[4])
00337 {
00338 int i;
00339 memset(to, 0, 4);
00340
00341
00342 if (code > 138) {
00343 for (i = 2; i >= 0; i--) {
00344 to[i] = 0x60 + (code & 0x1f);
00345 code >>= 5;
00346 }
00347 return 1;
00348 }
00349
00350 if (code >= FF_ARRAY_ELEMS(mov_mdhd_language_map))
00351 return 0;
00352 if (!mov_mdhd_language_map[code][0])
00353 return 0;
00354 memcpy(to, mov_mdhd_language_map[code], 4);
00355 return 1;
00356 }
00357
00358 int ff_mp4_read_descr_len(AVIOContext *pb)
00359 {
00360 int len = 0;
00361 int count = 4;
00362 while (count--) {
00363 int c = avio_r8(pb);
00364 len = (len << 7) | (c & 0x7f);
00365 if (!(c & 0x80))
00366 break;
00367 }
00368 return len;
00369 }
00370
00371 int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag)
00372 {
00373 int len;
00374 *tag = avio_r8(pb);
00375 len = ff_mp4_read_descr_len(pb);
00376 av_dlog(fc, "MPEG4 description: tag=0x%02x len=%d\n", *tag, len);
00377 return len;
00378 }
00379
00380 void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id)
00381 {
00382 int flags;
00383 if (es_id) *es_id = avio_rb16(pb);
00384 else avio_rb16(pb);
00385 flags = avio_r8(pb);
00386 if (flags & 0x80)
00387 avio_rb16(pb);
00388 if (flags & 0x40) {
00389 int len = avio_r8(pb);
00390 avio_skip(pb, len);
00391 }
00392 if (flags & 0x20)
00393 avio_rb16(pb);
00394 }
00395
00396 static const AVCodecTag mp4_audio_types[] = {
00397 { CODEC_ID_MP3ON4, AOT_PS },
00398 { CODEC_ID_MP3ON4, AOT_L1 },
00399 { CODEC_ID_MP3ON4, AOT_L2 },
00400 { CODEC_ID_MP3ON4, AOT_L3 },
00401 { CODEC_ID_MP4ALS, AOT_ALS },
00402 { CODEC_ID_NONE, AOT_NULL },
00403 };
00404
00405 int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb)
00406 {
00407 int len, tag;
00408 int object_type_id = avio_r8(pb);
00409 avio_r8(pb);
00410 avio_rb24(pb);
00411 avio_rb32(pb);
00412 avio_rb32(pb);
00413
00414 st->codec->codec_id= ff_codec_get_id(ff_mp4_obj_type, object_type_id);
00415 av_dlog(fc, "esds object type id 0x%02x\n", object_type_id);
00416 len = ff_mp4_read_descr(fc, pb, &tag);
00417 if (tag == MP4DecSpecificDescrTag) {
00418 av_dlog(fc, "Specific MPEG4 header len=%d\n", len);
00419 if (!len || (uint64_t)len > (1<<30))
00420 return -1;
00421 av_free(st->codec->extradata);
00422 st->codec->extradata = av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);
00423 if (!st->codec->extradata)
00424 return AVERROR(ENOMEM);
00425 avio_read(pb, st->codec->extradata, len);
00426 st->codec->extradata_size = len;
00427 if (st->codec->codec_id == CODEC_ID_AAC) {
00428 MPEG4AudioConfig cfg;
00429 avpriv_mpeg4audio_get_config(&cfg, st->codec->extradata,
00430 st->codec->extradata_size * 8, 1);
00431 st->codec->channels = cfg.channels;
00432 if (cfg.object_type == 29 && cfg.sampling_index < 3)
00433 st->codec->sample_rate = avpriv_mpa_freq_tab[cfg.sampling_index];
00434 else if (cfg.ext_sample_rate)
00435 st->codec->sample_rate = cfg.ext_sample_rate;
00436 else
00437 st->codec->sample_rate = cfg.sample_rate;
00438 av_dlog(fc, "mp4a config channels %d obj %d ext obj %d "
00439 "sample rate %d ext sample rate %d\n", st->codec->channels,
00440 cfg.object_type, cfg.ext_object_type,
00441 cfg.sample_rate, cfg.ext_sample_rate);
00442 if (!(st->codec->codec_id = ff_codec_get_id(mp4_audio_types,
00443 cfg.object_type)))
00444 st->codec->codec_id = CODEC_ID_AAC;
00445 }
00446 }
00447 return 0;
00448 }