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