00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "avformat.h"
00025 #include "riff.h"
00026 #include "isom.h"
00027
00028
00029
00030 const AVCodecTag ff_mp4_obj_type[] = {
00031 { CODEC_ID_MOV_TEXT , 0x08 },
00032 { CODEC_ID_MPEG4 , 0x20 },
00033 { CODEC_ID_H264 , 0x21 },
00034 { CODEC_ID_AAC , 0x40 },
00035 { CODEC_ID_MP4ALS , 0x40 },
00036 { CODEC_ID_MPEG2VIDEO, 0x61 },
00037 { CODEC_ID_MPEG2VIDEO, 0x60 },
00038 { CODEC_ID_MPEG2VIDEO, 0x62 },
00039 { CODEC_ID_MPEG2VIDEO, 0x63 },
00040 { CODEC_ID_MPEG2VIDEO, 0x64 },
00041 { CODEC_ID_MPEG2VIDEO, 0x65 },
00042 { CODEC_ID_AAC , 0x66 },
00043 { CODEC_ID_AAC , 0x67 },
00044 { CODEC_ID_AAC , 0x68 },
00045 { CODEC_ID_MP3 , 0x69 },
00046 { CODEC_ID_MP2 , 0x69 },
00047 { CODEC_ID_MPEG1VIDEO, 0x6A },
00048 { CODEC_ID_MP3 , 0x6B },
00049 { CODEC_ID_MJPEG , 0x6C },
00050 { CODEC_ID_PNG , 0x6D },
00051 { CODEC_ID_JPEG2000 , 0x6E },
00052 { CODEC_ID_VC1 , 0xA3 },
00053 { CODEC_ID_DIRAC , 0xA4 },
00054 { CODEC_ID_AC3 , 0xA5 },
00055 { CODEC_ID_VORBIS , 0xDD },
00056 { CODEC_ID_DVD_SUBTITLE, 0xE0 },
00057 { CODEC_ID_QCELP , 0xE1 },
00058 { CODEC_ID_NONE , 0 },
00059 };
00060
00061 const AVCodecTag codec_movvideo_tags[] = {
00062
00063
00064 { CODEC_ID_RAWVIDEO, MKTAG('r', 'a', 'w', ' ') },
00065 { CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') },
00066 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', 'U', 'I') },
00067 { CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') },
00068 { CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', 's') },
00069
00070 { CODEC_ID_R210, MKTAG('r', '2', '1', '0') },
00071 { CODEC_ID_V210, MKTAG('v', '2', '1', '0') },
00072
00073 { CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') },
00074 { CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') },
00075 { CODEC_ID_MJPEG, MKTAG('A', 'V', 'D', 'J') },
00076
00077 { CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') },
00078 { CODEC_ID_MJPEGB, MKTAG('m', 'j', 'p', 'b') },
00079
00080 { CODEC_ID_SVQ1, MKTAG('S', 'V', 'Q', '1') },
00081 { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') },
00082 { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', 'i') },
00083 { CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') },
00084
00085 { CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
00086 { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') },
00087 { CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
00088 { CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') },
00089
00090 { CODEC_ID_H263, MKTAG('h', '2', '6', '3') },
00091 { CODEC_ID_H263, MKTAG('s', '2', '6', '3') },
00092
00093 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 'p') },
00094 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') },
00095 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'p', 'p') },
00096 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'p') },
00097 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'n') },
00098 { CODEC_ID_DVVIDEO, MKTAG('A', 'V', 'd', 'v') },
00099 { CODEC_ID_DVVIDEO, MKTAG('A', 'V', 'd', '1') },
00100 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'q') },
00101 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'p') },
00102 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
00103 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '2') },
00104 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '4') },
00105 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '5') },
00106 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '6') },
00107 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '3') },
00108
00109 { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
00110 { CODEC_ID_RPZA, MKTAG('r', 'p', 'z', 'a') },
00111 { CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') },
00112 { CODEC_ID_8BPS, MKTAG('8', 'B', 'P', 'S') },
00113 { CODEC_ID_SMC, MKTAG('s', 'm', 'c', ' ') },
00114 { CODEC_ID_QTRLE, MKTAG('r', 'l', 'e', ' ') },
00115 { CODEC_ID_MSRLE, MKTAG('W', 'R', 'L', 'E') },
00116 { CODEC_ID_QDRAW, MKTAG('q', 'd', 'r', 'w') },
00117
00118 { CODEC_ID_RAWVIDEO, MKTAG('W', 'R', 'A', 'W') },
00119
00120 { CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') },
00121
00122 { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'e', 'g') },
00123 { CODEC_ID_MPEG1VIDEO, MKTAG('m', '1', 'v', '1') },
00124 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '1') },
00125 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '2') },
00126 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '3') },
00127 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '5') },
00128 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '6') },
00129 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '7') },
00130 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '8') },
00131 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'n') },
00132 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'p') },
00133 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'n') },
00134 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'p') },
00135 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'n') },
00136 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'p') },
00137 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '9') },
00138 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'a') },
00139 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'b') },
00140 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'c') },
00141 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'd') },
00142 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'e') },
00143 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'f') },
00144 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '1') },
00145 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '2') },
00146 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '3') },
00147 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '4') },
00148 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '5') },
00149 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '6') },
00150 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '7') },
00151 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '8') },
00152 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '9') },
00153 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'a') },
00154 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'b') },
00155 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'c') },
00156 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'd') },
00157 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'e') },
00158 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'f') },
00159 { CODEC_ID_MPEG2VIDEO, MKTAG('A', 'V', 'm', 'p') },
00160 { CODEC_ID_MPEG2VIDEO, MKTAG('m', '2', 'v', '1') },
00161
00162 { CODEC_ID_JPEG2000, MKTAG('m', 'j', 'p', '2') },
00163
00164 { CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') },
00165 { CODEC_ID_TIFF, MKTAG('t', 'i', 'f', 'f') },
00166 { CODEC_ID_GIF, MKTAG('g', 'i', 'f', ' ') },
00167 { CODEC_ID_PNG, MKTAG('p', 'n', 'g', ' ') },
00168
00169 { CODEC_ID_VC1, MKTAG('v', 'c', '-', '1') },
00170 { CODEC_ID_CAVS, MKTAG('a', 'v', 's', '2') },
00171
00172 { CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') },
00173 { CODEC_ID_DNXHD, MKTAG('A', 'V', 'd', 'n') },
00174 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', '1', 'x') },
00175 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', 'u', 'p') },
00176 { CODEC_ID_SGI, MKTAG('s', 'g', 'i', ' ') },
00177 { CODEC_ID_DPX, MKTAG('d', 'p', 'x', ' ') },
00178
00179 { CODEC_ID_NONE, 0 },
00180 };
00181
00182 const AVCodecTag codec_movaudio_tags[] = {
00183 { CODEC_ID_PCM_S32BE, MKTAG('i', 'n', '3', '2') },
00184 { CODEC_ID_PCM_S32LE, MKTAG('i', 'n', '3', '2') },
00185 { CODEC_ID_PCM_S24BE, MKTAG('i', 'n', '2', '4') },
00186 { CODEC_ID_PCM_S24LE, MKTAG('i', 'n', '2', '4') },
00187 { CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's') },
00188 { CODEC_ID_PCM_S16LE, MKTAG('s', 'o', 'w', 't') },
00189 { CODEC_ID_PCM_S16LE, MKTAG('l', 'p', 'c', 'm') },
00190 { CODEC_ID_PCM_F32BE, MKTAG('f', 'l', '3', '2') },
00191 { CODEC_ID_PCM_F32LE, MKTAG('f', 'l', '3', '2') },
00192 { CODEC_ID_PCM_F64BE, MKTAG('f', 'l', '6', '4') },
00193 { CODEC_ID_PCM_F64LE, MKTAG('f', 'l', '6', '4') },
00194 { CODEC_ID_PCM_S8, MKTAG('s', 'o', 'w', 't') },
00195 { CODEC_ID_PCM_U8, MKTAG('r', 'a', 'w', ' ') },
00196 { CODEC_ID_PCM_U8, MKTAG('N', 'O', 'N', 'E') },
00197 { CODEC_ID_PCM_MULAW, MKTAG('u', 'l', 'a', 'w') },
00198 { CODEC_ID_PCM_ALAW, MKTAG('a', 'l', 'a', 'w') },
00199
00200 { CODEC_ID_ADPCM_IMA_QT, MKTAG('i', 'm', 'a', '4') },
00201
00202 { CODEC_ID_MACE3, MKTAG('M', 'A', 'C', '3') },
00203 { CODEC_ID_MACE6, MKTAG('M', 'A', 'C', '6') },
00204
00205 { CODEC_ID_MP1, MKTAG('.', 'm', 'p', '1') },
00206 { CODEC_ID_MP2, MKTAG('.', 'm', 'p', '2') },
00207
00208 { CODEC_ID_MP3, MKTAG('.', 'm', 'p', '3') },
00209 { CODEC_ID_MP3, 0x6D730055 },
00210
00211
00212
00213 { CODEC_ID_AAC, MKTAG('m', 'p', '4', 'a') },
00214 { CODEC_ID_AC3, MKTAG('a', 'c', '-', '3') },
00215 { CODEC_ID_AC3, MKTAG('s', 'a', 'c', '3') },
00216
00217 { CODEC_ID_AMR_NB, MKTAG('s', 'a', 'm', 'r') },
00218 { CODEC_ID_AMR_WB, MKTAG('s', 'a', 'w', 'b') },
00219
00220 { CODEC_ID_GSM, MKTAG('a', 'g', 's', 'm') },
00221 { CODEC_ID_ALAC, MKTAG('a', 'l', 'a', 'c') },
00222
00223 { CODEC_ID_QCELP, MKTAG('Q','c','l','p') },
00224 { CODEC_ID_QCELP, MKTAG('Q','c','l','q') },
00225 { CODEC_ID_QCELP, MKTAG('s','q','c','p') },
00226
00227 { CODEC_ID_QDM2, MKTAG('Q', 'D', 'M', '2') },
00228
00229 { CODEC_ID_DVAUDIO, MKTAG('v', 'd', 'v', 'a') },
00230 { CODEC_ID_DVAUDIO, MKTAG('d', 'v', 'c', 'a') },
00231
00232 { CODEC_ID_WMAV2, MKTAG('W', 'M', 'A', '2') },
00233
00234 { CODEC_ID_NONE, 0 },
00235 };
00236
00237 const AVCodecTag ff_codec_movsubtitle_tags[] = {
00238 { CODEC_ID_MOV_TEXT, MKTAG('t', 'e', 'x', 't') },
00239 { CODEC_ID_MOV_TEXT, MKTAG('t', 'x', '3', 'g') },
00240 { CODEC_ID_NONE, 0 },
00241 };
00242
00243
00244
00245
00246
00247 static const char mov_mdhd_language_map[][4] = {
00248
00249 "eng", "fra", "ger", "ita", "dut", "sve", "spa", "dan", "por", "nor",
00250 "heb", "jpn", "ara", "fin", "gre", "ice", "mlt", "tur", "hr ", "chi",
00251 "urd", "hin", "tha", "kor", "lit", "pol", "hun", "est", "lav", "",
00252 "fo ", "", "rus", "chi", "", "iri", "alb", "ron", "ces", "slk",
00253 "slv", "yid", "sr ", "mac", "bul", "ukr", "bel", "uzb", "kaz", "aze",
00254
00255 "aze", "arm", "geo", "mol", "kir", "tgk", "tuk", "mon", "", "pus",
00256 "kur", "kas", "snd", "tib", "nep", "san", "mar", "ben", "asm", "guj",
00257 "pa ", "ori", "mal", "kan", "tam", "tel", "", "bur", "khm", "lao",
00258
00259 "vie", "ind", "tgl", "may", "may", "amh", "tir", "orm", "som", "swa",
00260
00261 "", "run", "", "mlg", "epo", "", "", "", "", "",
00262
00263 "", "", "", "", "", "", "", "", "", "",
00264 "", "", "", "", "", "", "", "", "", "",
00265 "", "", "", "", "", "", "", "", "wel", "baq",
00266 "cat", "lat", "que", "grn", "aym", "tat", "uig", "dzo", "jav"
00267 };
00268
00269 int ff_mov_iso639_to_lang(const char lang[4], int mp4)
00270 {
00271 int i, code = 0;
00272
00273
00274 for (i = 0; lang[0] && !mp4 && i < FF_ARRAY_ELEMS(mov_mdhd_language_map); i++) {
00275 if (!strcmp(lang, mov_mdhd_language_map[i]))
00276 return i;
00277 }
00278
00279 if (!mp4)
00280 return -1;
00281
00282 if (lang[0] == '\0')
00283 lang = "und";
00284
00285 for (i = 0; i < 3; i++) {
00286 uint8_t c = lang[i];
00287 c -= 0x60;
00288 if (c > 0x1f)
00289 return -1;
00290 code <<= 5;
00291 code |= c;
00292 }
00293 return code;
00294 }
00295
00296 int ff_mov_lang_to_iso639(unsigned code, char to[4])
00297 {
00298 int i;
00299 memset(to, 0, 4);
00300
00301
00302 if (code > 138) {
00303 for (i = 2; i >= 0; i--) {
00304 to[i] = 0x60 + (code & 0x1f);
00305 code >>= 5;
00306 }
00307 return 1;
00308 }
00309
00310 if (code >= FF_ARRAY_ELEMS(mov_mdhd_language_map))
00311 return 0;
00312 if (!mov_mdhd_language_map[code][0])
00313 return 0;
00314 memcpy(to, mov_mdhd_language_map[code], 4);
00315 return 1;
00316 }