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