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