1/* 2 * ISO Media common code 3 * Copyright (c) 2001 Fabrice Bellard 4 * Copyright (c) 2002 Francois Revol <revol@free.fr> 5 * Copyright (c) 2006 Baptiste Coudurier <baptiste.coudurier@free.fr> 6 * 7 * This file is part of FFmpeg. 8 * 9 * FFmpeg is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Lesser General Public 11 * License as published by the Free Software Foundation; either 12 * version 2.1 of the License, or (at your option) any later version. 13 * 14 * FFmpeg is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Lesser General Public License for more details. 18 * 19 * You should have received a copy of the GNU Lesser General Public 20 * License along with FFmpeg; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22 */ 23 24#include "avformat.h" 25#include "demux.h" 26#include "internal.h" 27#include "isom.h" 28#include "libavcodec/mpeg4audio.h" 29#include "libavcodec/mpegaudiodata.h" 30#include "libavutil/channel_layout.h" 31 32/* http://www.mp4ra.org */ 33/* ordered by muxing preference */ 34const AVCodecTag ff_mp4_obj_type[] = { 35 { AV_CODEC_ID_MOV_TEXT , 0x08 }, 36 { AV_CODEC_ID_MPEG4 , 0x20 }, 37 { AV_CODEC_ID_H264 , 0x21 }, 38 { AV_CODEC_ID_HEVC , 0x23 }, 39#ifdef OHOS_OPT_COMPAT 40 { AV_CODEC_ID_VVC , 0x33 }, 41#endif 42 { AV_CODEC_ID_AAC , 0x40 }, 43 { AV_CODEC_ID_MP4ALS , 0x40 }, /* 14496-3 ALS */ 44 { AV_CODEC_ID_MPEG2VIDEO , 0x61 }, /* MPEG-2 Main */ 45 { AV_CODEC_ID_MPEG2VIDEO , 0x60 }, /* MPEG-2 Simple */ 46 { AV_CODEC_ID_MPEG2VIDEO , 0x62 }, /* MPEG-2 SNR */ 47 { AV_CODEC_ID_MPEG2VIDEO , 0x63 }, /* MPEG-2 Spatial */ 48 { AV_CODEC_ID_MPEG2VIDEO , 0x64 }, /* MPEG-2 High */ 49 { AV_CODEC_ID_MPEG2VIDEO , 0x65 }, /* MPEG-2 422 */ 50 { AV_CODEC_ID_AAC , 0x66 }, /* MPEG-2 AAC Main */ 51 { AV_CODEC_ID_AAC , 0x67 }, /* MPEG-2 AAC Low */ 52 { AV_CODEC_ID_AAC , 0x68 }, /* MPEG-2 AAC SSR */ 53 { AV_CODEC_ID_MP3 , 0x69 }, /* 13818-3 */ 54 { AV_CODEC_ID_MP2 , 0x69 }, /* 11172-3 */ 55 { AV_CODEC_ID_MPEG1VIDEO , 0x6A }, /* 11172-2 */ 56 { AV_CODEC_ID_MP3 , 0x6B }, /* 11172-3 */ 57 { AV_CODEC_ID_MJPEG , 0x6C }, /* 10918-1 */ 58 { AV_CODEC_ID_PNG , 0x6D }, 59 { AV_CODEC_ID_JPEG2000 , 0x6E }, /* 15444-1 */ 60 { AV_CODEC_ID_VC1 , 0xA3 }, 61 { AV_CODEC_ID_DIRAC , 0xA4 }, 62 { AV_CODEC_ID_AC3 , 0xA5 }, 63 { AV_CODEC_ID_EAC3 , 0xA6 }, 64 { AV_CODEC_ID_DTS , 0xA9 }, /* mp4ra.org */ 65 { AV_CODEC_ID_OPUS , 0xAD }, /* mp4ra.org */ 66 { AV_CODEC_ID_VP9 , 0xB1 }, /* mp4ra.org */ 67 { AV_CODEC_ID_FLAC , 0xC1 }, /* nonstandard, update when there is a standard value */ 68 { AV_CODEC_ID_TSCC2 , 0xD0 }, /* nonstandard, camtasia uses it */ 69 { AV_CODEC_ID_EVRC , 0xD1 }, /* nonstandard, pvAuthor uses it */ 70 { AV_CODEC_ID_VORBIS , 0xDD }, /* nonstandard, gpac uses it */ 71 { AV_CODEC_ID_DVD_SUBTITLE, 0xE0 }, /* nonstandard, see unsupported-embedded-subs-2.mp4 */ 72 { AV_CODEC_ID_QCELP , 0xE1 }, 73 { AV_CODEC_ID_MPEG4SYSTEMS, 0x01 }, 74 { AV_CODEC_ID_MPEG4SYSTEMS, 0x02 }, 75 { AV_CODEC_ID_NONE , 0 }, 76}; 77 78const AVCodecTag ff_codec_movsubtitle_tags[] = { 79 { AV_CODEC_ID_MOV_TEXT, MKTAG('t', 'e', 'x', 't') }, 80 { AV_CODEC_ID_MOV_TEXT, MKTAG('t', 'x', '3', 'g') }, 81 { AV_CODEC_ID_EIA_608, MKTAG('c', '6', '0', '8') }, 82#ifdef OHOS_SUBTITLE_DEMUXER 83 { AV_CODEC_ID_WEBVTT, MKTAG('w', 'v', 't', 't') }, 84#endif 85 { AV_CODEC_ID_NONE, 0 }, 86}; 87 88const AVCodecTag ff_codec_movdata_tags[] = { 89 { AV_CODEC_ID_BIN_DATA, MKTAG('g', 'p', 'm', 'd') }, 90 { AV_CODEC_ID_NONE, 0 }, 91}; 92 93/* map numeric codes from mdhd atom to ISO 639 */ 94/* cf. QTFileFormat.pdf p253, qtff.pdf p205 */ 95/* http://developer.apple.com/documentation/mac/Text/Text-368.html */ 96/* deprecated by putting the code as 3*5 bits ASCII */ 97static const char mov_mdhd_language_map[][4] = { 98 "eng", /* 0 English */ 99 "fra", /* 1 French */ 100 "ger", /* 2 German */ 101 "ita", /* 3 Italian */ 102 "dut", /* 4 Dutch */ 103 "sve", /* 5 Swedish */ 104 "spa", /* 6 Spanish */ 105 "dan", /* 7 Danish */ 106 "por", /* 8 Portuguese */ 107 "nor", /* 9 Norwegian */ 108 "heb", /* 10 Hebrew */ 109 "jpn", /* 11 Japanese */ 110 "ara", /* 12 Arabic */ 111 "fin", /* 13 Finnish */ 112 "gre", /* 14 Greek */ 113 "ice", /* 15 Icelandic */ 114 "mlt", /* 16 Maltese */ 115 "tur", /* 17 Turkish */ 116 "hr ", /* 18 Croatian */ 117 "chi", /* 19 Traditional Chinese */ 118 "urd", /* 20 Urdu */ 119 "hin", /* 21 Hindi */ 120 "tha", /* 22 Thai */ 121 "kor", /* 23 Korean */ 122 "lit", /* 24 Lithuanian */ 123 "pol", /* 25 Polish */ 124 "hun", /* 26 Hungarian */ 125 "est", /* 27 Estonian */ 126 "lav", /* 28 Latvian */ 127 "smi", /* 29 Sami */ 128 "fo ", /* 30 Faroese */ 129 "per", /* 31 Farsi */ 130 "rus", /* 32 Russian */ 131 "chi", /* 33 Simplified Chinese */ 132 "", /* 34 Flemish */ 133 "iri", /* 35 Irish */ 134 "alb", /* 36 Albanian */ 135 "ron", /* 37 Romanian */ 136 "ces", /* 38 Czech */ 137 "slk", /* 39 Slovak */ 138 "slv", /* 40 Slovenian */ 139 "yid", /* 41 Yiddish */ 140 "sr ", /* 42 Serbian */ 141 "mac", /* 43 Macedonian */ 142 "bul", /* 44 Bulgarian */ 143 "ukr", /* 45 Ukrainian */ 144 "bel", /* 46 Belarusian */ 145 "uzb", /* 47 Uzbek */ 146 "kaz", /* 48 Kazakh */ 147 "aze", /* 49 Azerbaijani */ 148 "aze", /* 50 AzerbaijanAr */ 149 "arm", /* 51 Armenian */ 150 "geo", /* 52 Georgian */ 151 "mol", /* 53 Moldavian */ 152 "kir", /* 54 Kirghiz */ 153 "tgk", /* 55 Tajiki */ 154 "tuk", /* 56 Turkmen */ 155 "mon", /* 57 Mongolian */ 156 "", /* 58 MongolianCyr */ 157 "pus", /* 59 Pashto */ 158 "kur", /* 60 Kurdish */ 159 "kas", /* 61 Kashmiri */ 160 "snd", /* 62 Sindhi */ 161 "tib", /* 63 Tibetan */ 162 "nep", /* 64 Nepali */ 163 "san", /* 65 Sanskrit */ 164 "mar", /* 66 Marathi */ 165 "ben", /* 67 Bengali */ 166 "asm", /* 68 Assamese */ 167 "guj", /* 69 Gujarati */ 168 "pa ", /* 70 Punjabi */ 169 "ori", /* 71 Oriya */ 170 "mal", /* 72 Malayalam */ 171 "kan", /* 73 Kannada */ 172 "tam", /* 74 Tamil */ 173 "tel", /* 75 Telugu */ 174 "sin", /* 76 Sinhala */ 175 "bur", /* 77 Burmese */ 176 "khm", /* 78 Khmer */ 177 "lao", /* 79 Lao */ 178 "vie", /* 80 Vietnamese */ 179 "ind", /* 81 Indonesian */ 180 "tgl", /* 82 Tagalog */ 181 "may", /* 83 MalayRoman */ 182 "may", /* 84 MalayArabic */ 183 "amh", /* 85 Amharic */ 184 "tir", /* 86 Galla */ 185 "orm", /* 87 Oromo */ 186 "som", /* 88 Somali */ 187 "swa", /* 89 Swahili */ 188 "kin", /* 90 Kinyarwanda */ 189 "run", /* 91 Rundi */ 190 "nya", /* 92 Nyanja */ 191 "mlg", /* 93 Malagasy */ 192 "epo", /* 94 Esperanto */ 193 "", /* 95 */ 194 "", /* 96 */ 195 "", /* 97 */ 196 "", /* 98 */ 197 "", /* 99 */ 198 "", /* 100 */ 199 "", /* 101 */ 200 "", /* 102 */ 201 "", /* 103 */ 202 "", /* 104 */ 203 "", /* 105 */ 204 "", /* 106 */ 205 "", /* 107 */ 206 "", /* 108 */ 207 "", /* 109 */ 208 "", /* 110 */ 209 "", /* 111 */ 210 "", /* 112 */ 211 "", /* 113 */ 212 "", /* 114 */ 213 "", /* 115 */ 214 "", /* 116 */ 215 "", /* 117 */ 216 "", /* 118 */ 217 "", /* 119 */ 218 "", /* 120 */ 219 "", /* 121 */ 220 "", /* 122 */ 221 "", /* 123 */ 222 "", /* 124 */ 223 "", /* 125 */ 224 "", /* 126 */ 225 "", /* 127 */ 226 "wel", /* 128 Welsh */ 227 "baq", /* 129 Basque */ 228 "cat", /* 130 Catalan */ 229 "lat", /* 131 Latin */ 230 "que", /* 132 Quechua */ 231 "grn", /* 133 Guarani */ 232 "aym", /* 134 Aymara */ 233 "tat", /* 135 Tatar */ 234 "uig", /* 136 Uighur */ 235 "dzo", /* 137 Dzongkha */ 236 "jav", /* 138 JavaneseRom */ 237}; 238 239int ff_mov_iso639_to_lang(const char lang[4], int mp4) 240{ 241 int i, code = 0; 242 243 /* old way, only for QT? */ 244 for (i = 0; lang[0] && !mp4 && i < FF_ARRAY_ELEMS(mov_mdhd_language_map); i++) { 245 if (!strcmp(lang, mov_mdhd_language_map[i])) 246 return i; 247 } 248 /* XXX:can we do that in mov too? */ 249 if (!mp4) 250 return -1; 251 /* handle undefined as such */ 252 if (lang[0] == '\0') 253 lang = "und"; 254 /* 5 bits ASCII */ 255 for (i = 0; i < 3; i++) { 256 uint8_t c = lang[i]; 257 c -= 0x60; 258 if (c > 0x1f) 259 return -1; 260 code <<= 5; 261 code |= c; 262 } 263 return code; 264} 265 266int ff_mov_lang_to_iso639(unsigned code, char to[4]) 267{ 268 int i; 269 memset(to, 0, 4); 270 /* is it the mangled iso code? */ 271 /* see http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt */ 272 if (code >= 0x400 && code != 0x7fff) { 273 for (i = 2; i >= 0; i--) { 274 to[i] = 0x60 + (code & 0x1f); 275 code >>= 5; 276 } 277 return 1; 278 } 279 /* old fashion apple lang code */ 280 if (code >= FF_ARRAY_ELEMS(mov_mdhd_language_map)) 281 return 0; 282 if (!mov_mdhd_language_map[code][0]) 283 return 0; 284 memcpy(to, mov_mdhd_language_map[code], 4); 285 return 1; 286} 287 288int ff_mp4_read_descr_len(AVIOContext *pb) 289{ 290 int len = 0; 291 int count = 4; 292 while (count--) { 293 int c = avio_r8(pb); 294 len = (len << 7) | (c & 0x7f); 295 if (!(c & 0x80)) 296 break; 297 } 298 return len; 299} 300 301int ff_mp4_read_descr(AVFormatContext *fc, AVIOContext *pb, int *tag) 302{ 303 int len; 304 *tag = avio_r8(pb); 305 len = ff_mp4_read_descr_len(pb); 306 av_log(fc, AV_LOG_TRACE, "MPEG-4 description: tag=0x%02x len=%d\n", *tag, len); 307 return len; 308} 309 310void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id) 311{ 312 int flags; 313 if (es_id) *es_id = avio_rb16(pb); 314 else avio_rb16(pb); 315 flags = avio_r8(pb); 316 if (flags & 0x80) //streamDependenceFlag 317 avio_rb16(pb); 318 if (flags & 0x40) { //URL_Flag 319 int len = avio_r8(pb); 320 avio_skip(pb, len); 321 } 322 if (flags & 0x20) //OCRstreamFlag 323 avio_rb16(pb); 324} 325 326static const AVCodecTag mp4_audio_types[] = { 327 { AV_CODEC_ID_MP3ON4, AOT_PS }, /* old mp3on4 draft */ 328 { AV_CODEC_ID_MP3ON4, AOT_L1 }, /* layer 1 */ 329 { AV_CODEC_ID_MP3ON4, AOT_L2 }, /* layer 2 */ 330 { AV_CODEC_ID_MP3ON4, AOT_L3 }, /* layer 3 */ 331 { AV_CODEC_ID_MP4ALS, AOT_ALS }, /* MPEG-4 ALS */ 332 { AV_CODEC_ID_NONE, AOT_NULL }, 333}; 334 335int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext *pb) 336{ 337 enum AVCodecID codec_id; 338 int len, tag; 339 int ret; 340 int object_type_id = avio_r8(pb); 341 avio_r8(pb); /* stream type */ 342 avio_rb24(pb); /* buffer size db */ 343 avio_rb32(pb); /* rc_max_rate */ 344 345 st->codecpar->bit_rate = avio_rb32(pb); /* avg bitrate */ 346 347 codec_id= ff_codec_get_id(ff_mp4_obj_type, object_type_id); 348 if (codec_id) 349 st->codecpar->codec_id = codec_id; 350 av_log(fc, AV_LOG_TRACE, "esds object type id 0x%02x\n", object_type_id); 351 len = ff_mp4_read_descr(fc, pb, &tag); 352 if (tag == MP4DecSpecificDescrTag) { 353 av_log(fc, AV_LOG_TRACE, "Specific MPEG-4 header len=%d\n", len); 354 /* As per 14496-3:2009 9.D.2.2, No decSpecificInfo is defined 355 for MPEG-1 Audio or MPEG-2 Audio; MPEG-2 AAC excluded. */ 356 if (object_type_id == 0x69 || object_type_id == 0x6b) 357 return 0; 358 if (!len || (uint64_t)len > (1<<30)) 359 return AVERROR_INVALIDDATA; 360 if ((ret = ff_get_extradata(fc, st->codecpar, pb, len)) < 0) 361 return ret; 362 if (st->codecpar->codec_id == AV_CODEC_ID_AAC) { 363 MPEG4AudioConfig cfg = {0}; 364 ret = avpriv_mpeg4audio_get_config2(&cfg, st->codecpar->extradata, 365 st->codecpar->extradata_size, 1, fc); 366 if (ret < 0) 367 return ret; 368 st->codecpar->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC; 369 st->codecpar->ch_layout.nb_channels = cfg.channels; 370 if (cfg.object_type == 29 && cfg.sampling_index < 3) // old mp3on4 371 st->codecpar->sample_rate = ff_mpa_freq_tab[cfg.sampling_index]; 372 else if (cfg.ext_sample_rate) 373 st->codecpar->sample_rate = cfg.ext_sample_rate; 374 else 375 st->codecpar->sample_rate = cfg.sample_rate; 376 av_log(fc, AV_LOG_TRACE, "mp4a config channels %d obj %d ext obj %d " 377 "sample rate %d ext sample rate %d\n", cfg.channels, 378 cfg.object_type, cfg.ext_object_type, 379 cfg.sample_rate, cfg.ext_sample_rate); 380 if (!(st->codecpar->codec_id = ff_codec_get_id(mp4_audio_types, 381 cfg.object_type))) 382 st->codecpar->codec_id = AV_CODEC_ID_AAC; 383 } 384 } 385 return 0; 386} 387 388typedef struct MovChannelLayout { 389 int64_t channel_layout; 390 uint32_t layout_tag; 391} MovChannelLayout; 392 393static const MovChannelLayout mov_channel_layout[] = { 394 { AV_CH_LAYOUT_MONO, (100<<16) | 1}, // kCAFChannelLayoutTag_Mono 395 { AV_CH_LAYOUT_STEREO, (101<<16) | 2}, // kCAFChannelLayoutTag_Stereo 396 { AV_CH_LAYOUT_STEREO, (102<<16) | 2}, // kCAFChannelLayoutTag_StereoHeadphones 397 { AV_CH_LAYOUT_2_1, (131<<16) | 3}, // kCAFChannelLayoutTag_ITU_2_1 398 { AV_CH_LAYOUT_QUAD, (132<<16) | 4}, // kCAFChannelLayoutTag_ITU_2_2 399 { AV_CH_LAYOUT_2_2, (132<<16) | 4}, // kCAFChannelLayoutTag_ITU_2_2 400 { AV_CH_LAYOUT_QUAD, (108<<16) | 4}, // kCAFChannelLayoutTag_Quadraphonic 401 { AV_CH_LAYOUT_SURROUND, (113<<16) | 3}, // kCAFChannelLayoutTag_MPEG_3_0_A 402 { AV_CH_LAYOUT_4POINT0, (115<<16) | 4}, // kCAFChannelLayoutTag_MPEG_4_0_A 403 { AV_CH_LAYOUT_5POINT0_BACK, (117<<16) | 5}, // kCAFChannelLayoutTag_MPEG_5_0_A 404 { AV_CH_LAYOUT_5POINT0, (117<<16) | 5}, // kCAFChannelLayoutTag_MPEG_5_0_A 405 { AV_CH_LAYOUT_5POINT1_BACK, (121<<16) | 6}, // kCAFChannelLayoutTag_MPEG_5_1_A 406 { AV_CH_LAYOUT_5POINT1, (121<<16) | 6}, // kCAFChannelLayoutTag_MPEG_5_1_A 407 { AV_CH_LAYOUT_7POINT1, (128<<16) | 8}, // kCAFChannelLayoutTag_MPEG_7_1_C 408 { AV_CH_LAYOUT_7POINT1_WIDE, (126<<16) | 8}, // kCAFChannelLayoutTag_MPEG_7_1_A 409 { AV_CH_LAYOUT_5POINT1_BACK|AV_CH_LAYOUT_STEREO_DOWNMIX, (130<<16) | 8}, // kCAFChannelLayoutTag_SMPTE_DTV 410 { AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY, (133<<16) | 3}, // kCAFChannelLayoutTag_DVD_4 411 { AV_CH_LAYOUT_2_1|AV_CH_LOW_FREQUENCY, (134<<16) | 4}, // kCAFChannelLayoutTag_DVD_5 412 { AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY, (135<<16) | 4}, // kCAFChannelLayoutTag_DVD_6 413 { AV_CH_LAYOUT_2_2|AV_CH_LOW_FREQUENCY, (135<<16) | 4}, // kCAFChannelLayoutTag_DVD_6 414 { AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY, (136<<16) | 4}, // kCAFChannelLayoutTag_DVD_10 415 { AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY, (137<<16) | 5}, // kCAFChannelLayoutTag_DVD_11 416 { 0, 0}, 417}; 418 419void ff_mov_write_chan(AVIOContext *pb, int64_t channel_layout) 420{ 421 const MovChannelLayout *layouts; 422 uint32_t layout_tag = 0; 423 424 for (layouts = mov_channel_layout; layouts->channel_layout; layouts++) 425 if (channel_layout == layouts->channel_layout) { 426 layout_tag = layouts->layout_tag; 427 break; 428 } 429 430 if (layout_tag) { 431 avio_wb32(pb, layout_tag); // mChannelLayoutTag 432 avio_wb32(pb, 0); // mChannelBitmap 433 } else { 434 avio_wb32(pb, 0x10000); // kCAFChannelLayoutTag_UseChannelBitmap 435 avio_wb32(pb, channel_layout); 436 } 437 avio_wb32(pb, 0); // mNumberChannelDescriptions 438} 439 440static const struct MP4TrackKindValueMapping dash_role_map[] = { 441 { AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_CAPTIONS, 442 "caption" }, 443 { AV_DISPOSITION_COMMENT, 444 "commentary" }, 445 { AV_DISPOSITION_VISUAL_IMPAIRED|AV_DISPOSITION_DESCRIPTIONS, 446 "description" }, 447 { AV_DISPOSITION_DUB, 448 "dub" }, 449 { AV_DISPOSITION_FORCED, 450 "forced-subtitle" }, 451 { 0, NULL } 452}; 453 454const struct MP4TrackKindMapping ff_mov_track_kind_table[] = { 455 { "urn:mpeg:dash:role:2011", dash_role_map }, 456 { 0, NULL } 457};