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