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_S16BE, MKTAG('l', 'p', 'c', 'm') },
00260 { CODEC_ID_PCM_S16LE, MKTAG('l', 'p', 'c', 'm') },
00261 { CODEC_ID_PCM_S24BE, MKTAG('i', 'n', '2', '4') },
00262 { CODEC_ID_PCM_S24LE, MKTAG('i', 'n', '2', '4') },
00263 { CODEC_ID_PCM_S32BE, MKTAG('i', 'n', '3', '2') },
00264 { CODEC_ID_PCM_S32LE, MKTAG('i', 'n', '3', '2') },
00265 { CODEC_ID_PCM_S8, MKTAG('s', 'o', 'w', 't') },
00266 { CODEC_ID_PCM_U8, MKTAG('r', 'a', 'w', ' ') },
00267 { CODEC_ID_PCM_U8, MKTAG('N', 'O', 'N', 'E') },
00268 { CODEC_ID_QCELP, MKTAG('Q', 'c', 'l', 'p') },
00269 { CODEC_ID_QCELP, MKTAG('Q', 'c', 'l', 'q') },
00270 { CODEC_ID_QCELP, MKTAG('s', 'q', 'c', 'p') },
00271 { CODEC_ID_QDM2, MKTAG('Q', 'D', 'M', '2') },
00272 { CODEC_ID_QDMC, MKTAG('Q', 'D', 'M', 'C') },
00273 { CODEC_ID_SPEEX, MKTAG('s', 'p', 'e', 'x') },
00274 { CODEC_ID_WMAV2, MKTAG('W', 'M', 'A', '2') },
00275 { CODEC_ID_NONE, 0 },
00276 };
00277
00278 const AVCodecTag ff_codec_movsubtitle_tags[] = {
00279 { CODEC_ID_MOV_TEXT, MKTAG('t', 'e', 'x', 't') },
00280 { CODEC_ID_MOV_TEXT, MKTAG('t', 'x', '3', 'g') },
00281 { CODEC_ID_NONE, 0 },
00282 };
00283
00284
00285
00286
00287
00288 static const char mov_mdhd_language_map[][4] = {
00289
00290 "eng", "fra", "ger", "ita", "dut", "sve", "spa", "dan", "por", "nor",
00291 "heb", "jpn", "ara", "fin", "gre", "ice", "mlt", "tur", "hr ", "chi",
00292 "urd", "hin", "tha", "kor", "lit", "pol", "hun", "est", "lav", "",
00293 "fo ", "", "rus", "chi", "", "iri", "alb", "ron", "ces", "slk",
00294 "slv", "yid", "sr ", "mac", "bul", "ukr", "bel", "uzb", "kaz", "aze",
00295
00296 "aze", "arm", "geo", "mol", "kir", "tgk", "tuk", "mon", "", "pus",
00297 "kur", "kas", "snd", "tib", "nep", "san", "mar", "ben", "asm", "guj",
00298 "pa ", "ori", "mal", "kan", "tam", "tel", "", "bur", "khm", "lao",
00299
00300 "vie", "ind", "tgl", "may", "may", "amh", "tir", "orm", "som", "swa",
00301
00302 "", "run", "", "mlg", "epo", "", "", "", "", "",
00303
00304 "", "", "", "", "", "", "", "", "", "",
00305 "", "", "", "", "", "", "", "", "", "",
00306 "", "", "", "", "", "", "", "", "wel", "baq",
00307 "cat", "lat", "que", "grn", "aym", "tat", "uig", "dzo", "jav"
00308 };
00309
00310 int ff_mov_iso639_to_lang(const char lang[4], int mp4)
00311 {
00312 int i, code = 0;
00313
00314
00315 for (i = 0; lang[0] && !mp4 && i < FF_ARRAY_ELEMS(mov_mdhd_language_map); i++) {
00316 if (!strcmp(lang, mov_mdhd_language_map[i]))
00317 return i;
00318 }
00319
00320 if (!mp4)
00321 return -1;
00322
00323 if (lang[0] == '\0')
00324 lang = "und";
00325
00326 for (i = 0; i < 3; i++) {
00327 uint8_t c = lang[i];
00328 c -= 0x60;
00329 if (c > 0x1f)
00330 return -1;
00331 code <<= 5;
00332 code |= c;
00333 }
00334 return code;
00335 }
00336
00337 int ff_mov_lang_to_iso639(unsigned code, char to[4])
00338 {
00339 int i;
00340 memset(to, 0, 4);
00341
00342
00343 if (code >= 0x400 && code != 0x7fff) {
00344 for (i = 2; i >= 0; i--) {
00345 to[i] = 0x60 + (code & 0x1f);
00346 code >>= 5;
00347 }
00348 return 1;
00349 }
00350
00351 if (code >= FF_ARRAY_ELEMS(mov_mdhd_language_map))
00352 return 0;
00353 if (!mov_mdhd_language_map[code][0])
00354 return 0;
00355 memcpy(to, mov_mdhd_language_map[code], 4);
00356 return 1;
00357 }
00358
00359 int ff_mp4_read_descr_len(AVIOContext *pb)
00360 {
00361 int len = 0;
00362 int count = 4;
00363 while (count--) {
00364 int c = avio_r8(pb);
00365 len = (len << 7) | (c & 0x7f);
00366 if (!(c & 0x80))
00367 break;
00368 }
00369 return len;
00370 }
00371
00372 int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag)
00373 {
00374 int len;
00375 *tag = avio_r8(pb);
00376 len = ff_mp4_read_descr_len(pb);
00377 av_dlog(fc, "MPEG4 description: tag=0x%02x len=%d\n", *tag, len);
00378 return len;
00379 }
00380
00381 void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id)
00382 {
00383 int flags;
00384 if (es_id) *es_id = avio_rb16(pb);
00385 else avio_rb16(pb);
00386 flags = avio_r8(pb);
00387 if (flags & 0x80)
00388 avio_rb16(pb);
00389 if (flags & 0x40) {
00390 int len = avio_r8(pb);
00391 avio_skip(pb, len);
00392 }
00393 if (flags & 0x20)
00394 avio_rb16(pb);
00395 }
00396
00397 static const AVCodecTag mp4_audio_types[] = {
00398 { CODEC_ID_MP3ON4, AOT_PS },
00399 { CODEC_ID_MP3ON4, AOT_L1 },
00400 { CODEC_ID_MP3ON4, AOT_L2 },
00401 { CODEC_ID_MP3ON4, AOT_L3 },
00402 { CODEC_ID_MP4ALS, AOT_ALS },
00403 { CODEC_ID_NONE, AOT_NULL },
00404 };
00405
00406 int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb)
00407 {
00408 int len, tag;
00409 int object_type_id = avio_r8(pb);
00410 avio_r8(pb);
00411 avio_rb24(pb);
00412 avio_rb32(pb);
00413 avio_rb32(pb);
00414
00415 st->codec->codec_id= ff_codec_get_id(ff_mp4_obj_type, object_type_id);
00416 av_dlog(fc, "esds object type id 0x%02x\n", object_type_id);
00417 len = ff_mp4_read_descr(fc, pb, &tag);
00418 if (tag == MP4DecSpecificDescrTag) {
00419 av_dlog(fc, "Specific MPEG4 header len=%d\n", len);
00420 if (!len || (uint64_t)len > (1<<30))
00421 return -1;
00422 av_free(st->codec->extradata);
00423 st->codec->extradata = av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);
00424 if (!st->codec->extradata)
00425 return AVERROR(ENOMEM);
00426 avio_read(pb, st->codec->extradata, len);
00427 st->codec->extradata_size = len;
00428 if (st->codec->codec_id == CODEC_ID_AAC) {
00429 MPEG4AudioConfig cfg;
00430 avpriv_mpeg4audio_get_config(&cfg, st->codec->extradata,
00431 st->codec->extradata_size * 8, 1);
00432 st->codec->channels = cfg.channels;
00433 if (cfg.object_type == 29 && cfg.sampling_index < 3)
00434 st->codec->sample_rate = avpriv_mpa_freq_tab[cfg.sampling_index];
00435 else if (cfg.ext_sample_rate)
00436 st->codec->sample_rate = cfg.ext_sample_rate;
00437 else
00438 st->codec->sample_rate = cfg.sample_rate;
00439 av_dlog(fc, "mp4a config channels %d obj %d ext obj %d "
00440 "sample rate %d ext sample rate %d\n", st->codec->channels,
00441 cfg.object_type, cfg.ext_object_type,
00442 cfg.sample_rate, cfg.ext_sample_rate);
00443 if (!(st->codec->codec_id = ff_codec_get_id(mp4_audio_types,
00444 cfg.object_type)))
00445 st->codec->codec_id = CODEC_ID_AAC;
00446 }
00447 }
00448 return 0;
00449 }