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