1 /* WEED is free software; you can redistribute it and/or
2 modify it under the terms of the GNU Lesser General Public
3 License as published by the Free Software Foundation; either
4 version 3 of the License, or (at your option) any later version.
5
6 Weed is distributed in the hope that it will be useful,
7 but WITHOUT ANY WARRANTY; without even the implied warranty of
8 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9 Lesser General Public License for more details.
10
11 You should have received a copy of the GNU Lesser General Public
12 License along with this source code; if not, write to the Free Software
13 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
14
15 Weed is developed by:
16 Gabriel "Salsaman" Finch - http://lives-video.com
17
18 partly based on LiViDO, which is developed by:
19 Niels Elburg - http://veejay.sf.net
20 Denis "Jaromil" Rojo - http://freej.dyne.org
21 Tom Schouten - http://zwizwa.fartit.com
22 Andraz Tori - http://cvs.cinelerra.org
23
24 reviewed with suggestions and contributions from:
25 Silvano "Kysucix" Galliani - http://freej.dyne.org
26 Kentaro Fukuchi - http://megaui.net/fukuchi
27 Jun Iio - http://www.malib.net
28 Carlo Prelz - http://www2.fluido.as:8080/
29 */
30
31 /* (C) G. Finch, 2005 - 2020 */
32
33 #ifndef __WEED_COMPAT_H__
34 #define __WEED_COMPAT_H__
35
36 #ifdef __cplusplus
37 extern "C"
38 {
39 #endif /* __cplusplus */
40
41 #include <string.h>
42
43 #define WEED_COMPAT_VERSION 0.13.0
44
45 #ifdef NEED_FOURCC_COMPAT
46
47 #ifndef WEED_FOURCC_COMPAT
48 #define WEED_FOURCC_COMPAT
49 #endif
50
51 #ifndef __WEED_PALETTES_H__
52 #ifdef NEED_LOCAL_WEED
53 #include "weed-palettes.h"
54 #else
55 #include <weed/weed-palettes.h>
56 #endif
57 #endif // WEED_PALETTES_H
58
59 #ifndef MK_FOURCC
60 #define MK_FOURCC(a, b, c, d) ((a << 24) | (b << 16) | (c << 8) | d)
61 #endif
62
63 #ifndef VLC_FOURCC
64 #define VLC_FOURCC(a, b, c, d) MK_FOURCC(a, b, c, d)
65 #endif
66
67 #ifndef FOURCC_THEORA
68 #define FOURCC_THEORA (MK_FOURCC('T', 'H', 'R', 'A'))
69 #endif
70
71 #ifndef FOURCC_VORBIS
72 #define FOURCC_VORBIS (MK_FOURCC('V', 'B', 'I', 'S'))
73 #endif
74
75 #ifndef FOURCC_DIRAC
76 #define FOURCC_DIRAC (MK_FOURCC('D', 'R', 'A', 'C'))
77 #endif
78
79 #ifndef FOURCC_DVR
80 #define FOURCC_DVR (MK_FOURCC('D', 'V', 'R', ' '))
81 #endif
82
83 #ifndef FOURCC_UNDEF
84 #define FOURCC_UNDEF (MK_FOURCC( 'u', 'n', 'd', 'f' ))
85 #endif
86
87
fourccp_to_weedp(unsigned int fourcc,int bpp,int * interlaced,int * sampling,int * sspace,int * clamping)88 static inline int fourccp_to_weedp(unsigned int fourcc, int bpp, int *interlaced, int *sampling,
89 int *sspace, int *clamping) {
90 // inputs are fourcc and bpp
91 // returns int weed_palette
92
93 // optionally sets interlaced (0 = none, 1 = interlaced), sampling, subspace and clamping
94
95 // TODO - this is probably wrong for some formats and needs testing/verifying with various devices
96 // fourcc colorcodes are a nasty mess, and should be avoided whenever possible
97
98 // data from http://www.fourcc.org
99
100 if (clamping) *clamping = WEED_YUV_CLAMPING_CLAMPED;
101 if (interlaced) *interlaced = 0;
102 if (sspace) *sspace = WEED_YUV_SUBSPACE_YCBCR;
103 if (sampling) *sampling = WEED_YUV_SAMPLING_DEFAULT;
104
105 switch (fourcc) {
106 // RGB formats
107 case MK_FOURCC('B', 'G', 'R', '2'):
108 case MK_FOURCC('B', 'G', 'R', '3'):
109 case MK_FOURCC('B', 'G', 'R', '4'):
110 if (bpp == 24) return WEED_PALETTE_BGR24;
111 if (bpp == 32) return WEED_PALETTE_BGRA32;
112 break;
113
114 case 0x00000000: // BI_RGB - RGB or BGR ???
115 case MK_FOURCC('r', 'a', 'w', '2'): // raw2 - RGB or BGR ???
116
117 case MK_FOURCC('R', 'G', 'B', '2'):
118 case MK_FOURCC('R', 'G', 'B', '3'):
119 case MK_FOURCC('R', 'G', 'B', '4'):
120 if (bpp == 24) return WEED_PALETTE_RGB24;
121 if (bpp == 32) return WEED_PALETTE_RGBA32;
122 break;
123
124 case MK_FOURCC('R', 'G', 'B', 'A'):
125 if (bpp == 32) return WEED_PALETTE_RGBA32;
126 break;
127 case MK_FOURCC('A', 'R', 'G', 'B'): /* ARGB, not sure if exists */
128 if (bpp == 32) return WEED_PALETTE_ARGB32;
129 break;
130
131 // YUV packed formats
132
133 case MK_FOURCC('I', 'U', 'Y', 'B'):
134 if (interlaced) *interlaced = 1;
135 return WEED_PALETTE_UYVY;
136 case MK_FOURCC('I', 'Y', 'U', '1'):
137 case MK_FOURCC('Y', '4', '1', '1'):
138 return WEED_PALETTE_YUV411;
139 case MK_FOURCC('I', 'Y', 'U', '2'):
140 return WEED_PALETTE_YUV888;
141 case MK_FOURCC('H', 'D', 'Y', 'C'):
142 case 0x43594448: // HDYC
143 if (sspace) *sspace = WEED_YUV_SUBSPACE_BT709;
144 return WEED_PALETTE_UYVY;
145 case MK_FOURCC('U', 'Y', 'N', 'V'):
146 case MK_FOURCC('U', 'Y', 'V', 'Y'):
147 case MK_FOURCC('Y', '4', '2', '2'):
148 case MK_FOURCC('c', 'y', 'u', 'v'):
149 return WEED_PALETTE_UYVY;
150 case MK_FOURCC('Y', 'U', 'Y', '2'):
151 case MK_FOURCC('Y', 'U', 'Y', 'V'):
152 case MK_FOURCC('Y', 'U', 'N', 'V'):
153 return WEED_PALETTE_YUYV;
154 case MK_FOURCC('g', 'r', 'e', 'y'):
155 if (clamping) *clamping = WEED_YUV_CLAMPING_UNCLAMPED;
156 case MK_FOURCC('Y', '8', '0', '0'):
157 case MK_FOURCC('Y', '8', ' ', ' '):
158 return WEED_PALETTE_A8;
159
160 // YUV planar formats
161 case MK_FOURCC('Y', 'U', 'V', 'A'):
162 return WEED_PALETTE_YUVA4444P;
163 break;
164 case MK_FOURCC('I', '4', '4', '4'):
165 return WEED_PALETTE_YUV444P;
166 break;
167 case MK_FOURCC('4', '2', '2', 'P'):
168 return WEED_PALETTE_YUV422P;
169 break;
170 case MK_FOURCC('Y', 'V', '1', '2'):
171 return WEED_PALETTE_YVU420P;
172 case MK_FOURCC('I', '4', '2', '0'):
173 case MK_FOURCC('I', 'Y', 'U', 'V'):
174 case MK_FOURCC('Y', 'U', '1', '2'):
175 return WEED_PALETTE_YUV420P;
176
177 case MK_FOURCC('J', '4', '2', '0'):
178 if (clamping) *clamping = WEED_YUV_CLAMPING_UNCLAMPED;
179 return WEED_PALETTE_YUV420P;
180 case MK_FOURCC('J', '4', '2', '2'):
181 if (clamping) *clamping = WEED_YUV_CLAMPING_UNCLAMPED;
182 return WEED_PALETTE_YUV422P;
183 case MK_FOURCC('J', '4', '4', '4'):
184 if (clamping) *clamping = WEED_YUV_CLAMPING_UNCLAMPED;
185 return WEED_PALETTE_YUV444P;
186
187 // known formats we cannot use
188 case MK_FOURCC('R', 'G', 'B', 'P'): // RGBP - palettised RGB
189 case MK_FOURCC('R', 'G', 'B', '0'): // RGB0 - 15 or 16 bit RGB
190 case MK_FOURCC('R', 'G', 'B', 'Q'): // RGBQ - 15 or 16 bit RGB
191 case MK_FOURCC('R', 'G', 'B', 'R'): // RGBR - ???
192
193 case MK_FOURCC('N', 'V', '1', '2'): // NV12 - planar Y, packed UV
194 case MK_FOURCC('v', '2', '1', '0'): // v210 - 10 bit 422, packed
195
196 case MK_FOURCC('Y', 'U', 'V', '9'): // YUV9 - 410 planar palette
197 case MK_FOURCC('I', '4', '1', '0'): // I410 - 410 planar palette
198 case MK_FOURCC('Y', '2', '1', '1'): // Y211 - ???
199
200 case MK_FOURCC('I', '4', '1', '1'): // I411 - 411 planar palette
201 case MK_FOURCC('I', '4', '4', '0'): // I440 - 440 planar palette
202 case MK_FOURCC('J', '4', '4', '0'): // J440 - 440 planar palette unclamped
203 case MK_FOURCC('A', 'Y', 'U', 'V'): // - YUVA8888 but with alpha first, ie. AYUV8888
204
205 // no match
206 default:
207 return WEED_PALETTE_END;
208 }
209 return WEED_PALETTE_END;
210 }
211
212 #endif // NEED_FOURCC
213
214 #ifdef HAVE_AVCODEC
215 #ifdef HAVE_AVUTIL
216
217 // compatibility with libavcodec
218
219 #include <libavcodec/avcodec.h>
220 #include <libavutil/pixfmt.h>
221
222 #ifndef __WEED_PALETTES_H__
223 #ifdef NEED_LOCAL_WEED
224 #include "weed-palettes.h"
225 #else
226 #include <weed/weed-palettes.h>
227 #endif
228 #endif
229
230 typedef struct AVCodecTag {
231 int id;
232 unsigned int tag;
233 } AVCodecTag;
234
235 #ifndef MKTAG
236 #define MKTAG(a, b, c, d) ((a) | ((b) << 8) | ((c) << 16) | ((d) << 24))
237 #endif
238
239 #if (LIBAVCODEC_VERSION_MAJOR <= 54)
240 #define AVCodecID CodecID
241
242 #define AV_CODEC_ID_NONE CODEC_ID_NONE
243 #define AV_CODEC_ID_H264 CODEC_ID_H264
244 #define AV_CODEC_ID_H263 CODEC_ID_H263
245 #define AV_CODEC_ID_H263P CODEC_ID_H263P
246 #define AV_CODEC_ID_H263I CODEC_ID_H263I
247 #define AV_CODEC_ID_H261 CODEC_ID_H261
248 #define AV_CODEC_ID_MPEG4 CODEC_ID_MPEG4
249 #define AV_CODEC_ID_MSMPEG4V3 CODEC_ID_MSMPEG4V3
250 #define AV_CODEC_ID_MSMPEG4V2 CODEC_ID_MSMPEG4V2
251 #define AV_CODEC_ID_MSMPEG4V1 CODEC_ID_MSMPEG4V1
252 #define AV_CODEC_ID_WMV1 CODEC_ID_WMV1
253 #define AV_CODEC_ID_WMV2 CODEC_ID_WMV2
254 #define AV_CODEC_ID_DVVIDEO CODEC_ID_DVVIDEO
255 #define AV_CODEC_ID_MPEG1VIDEO CODEC_ID_MPEG1VIDEO
256 #define AV_CODEC_ID_MPEG2VIDEO CODEC_ID_MPEG2VIDEO
257 #define AV_CODEC_ID_MJPEG CODEC_ID_MJPEG
258 #define AV_CODEC_ID_LJPEG CODEC_ID_LJPEG
259 #define AV_CODEC_ID_JPEGLS CODEC_ID_JPEGLS
260 #define AV_CODEC_ID_HUFFYUV CODEC_ID_HUFFYUV
261 #define AV_CODEC_ID_FFVHUFF CODEC_ID_FFVHUFF
262 #define AV_CODEC_ID_CYUV CODEC_ID_CYUV
263 #define AV_CODEC_ID_RAWVIDEO CODEC_ID_RAWVIDEO
264 #define AV_CODEC_ID_INDEO2 CODEC_ID_INDEO2
265 #define AV_CODEC_ID_INDEO3 CODEC_ID_INDEO3
266 #define AV_CODEC_ID_INDEO4 CODEC_ID_INDEO4
267 #define AV_CODEC_ID_INDEO5 CODEC_ID_INDEO5
268 #define AV_CODEC_ID_VP3 CODEC_ID_VP3
269 #define AV_CODEC_ID_VP5 CODEC_ID_VP5
270 #define AV_CODEC_ID_VP6 CODEC_ID_VP6
271 #define AV_CODEC_ID_VP6F CODEC_ID_VP6F
272 #define AV_CODEC_ID_VP6A CODEC_ID_VP6A
273 #define AV_CODEC_ID_ASV1 CODEC_ID_ASV1
274 #define AV_CODEC_ID_ASV2 CODEC_ID_ASV2
275 #define AV_CODEC_ID_VCR1 CODEC_ID_VCR1
276 #define AV_CODEC_ID_FFV1 CODEC_ID_FFV1
277 #define AV_CODEC_ID_XAN_WC4 CODEC_ID_XAN_WC4
278 #define AV_CODEC_ID_MIMIC CODEC_ID_MIMIC
279 #define AV_CODEC_ID_MSRLE CODEC_ID_MSRLE
280 #define AV_CODEC_ID_MSVIDEO1 CODEC_ID_MSVIDEO1
281 #define AV_CODEC_ID_CINEPAK CODEC_ID_CINEPAK
282 #define AV_CODEC_ID_TRUEMOTION1 CODEC_ID_TRUEMOTION1
283 #define AV_CODEC_ID_TRUEMOTION2 CODEC_ID_TRUEMOTION2
284 #define AV_CODEC_ID_MSZH CODEC_ID_MSZH
285 #define AV_CODEC_ID_ZLIB CODEC_ID_ZLIB
286
287 #if FF_API_SNOW
288 #define AV_CODEC_ID_SNOW CODEC_ID_SNOW
289 #endif
290
291 #define AV_CODEC_ID_4XM CODEC_ID_4XM
292 #define AV_CODEC_ID_FLV1 CODEC_ID_FLV1
293 #define AV_CODEC_ID_FLASHSV CODEC_ID_FLASHSV
294 #define AV_CODEC_ID_SVQ1 CODEC_ID_SVQ1
295 #define AV_CODEC_ID_TSCC CODEC_ID_TSCC
296 #define AV_CODEC_ID_ULTI CODEC_ID_ULTI
297 #define AV_CODEC_ID_VIXL CODEC_ID_VIXL
298 #define AV_CODEC_ID_QPEG CODEC_ID_QPEG
299 #define AV_CODEC_ID_WMV3 CODEC_ID_WMV3
300 #define AV_CODEC_ID_VC1 CODEC_ID_VC1
301 #define AV_CODEC_ID_LOCO CODEC_ID_LOCO
302 #define AV_CODEC_ID_WNV1 CODEC_ID_WNV1
303 #define AV_CODEC_ID_AASC CODEC_ID_AASC
304 #define AV_CODEC_ID_FRAPS CODEC_ID_FRAPS
305 #define AV_CODEC_ID_THEORA CODEC_ID_THEORA
306 #define AV_CODEC_ID_CSCD CODEC_ID_CSCD
307 #define AV_CODEC_ID_ZMBV CODEC_ID_ZMBV
308 #define AV_CODEC_ID_KMVC CODEC_ID_KMVC
309 #define AV_CODEC_ID_CAVS CODEC_ID_CAVS
310 #define AV_CODEC_ID_JPEG2000 CODEC_ID_JPEG2000
311 #define AV_CODEC_ID_VMNC CODEC_ID_VMNC
312 #define AV_CODEC_ID_TARGA CODEC_ID_TARGA
313 #define AV_CODEC_ID_PNG CODEC_ID_PNG
314 #define AV_CODEC_ID_GIF CODEC_ID_GIF
315 #define AV_CODEC_ID_TIFF CODEC_ID_TIFF
316 #define AV_CODEC_ID_CLJR CODEC_ID_CLJR
317 #define AV_CODEC_ID_DIRAC CODEC_ID_DIRAC
318 #define AV_CODEC_ID_RPZA CODEC_ID_RPZA
319 #define AV_CODEC_ID_SP5X CODEC_ID_SP5X
320
321 #define AV_CODEC_ID_FLASHSV2 CODEC_ID_FLASHSV2
322 #define AV_CODEC_ID_TEXT CODEC_ID_TEXT
323 #define AV_CODEC_ID_SSA CODEC_ID_SSA
324 #define AV_CODEC_ID_SRT CODEC_ID_SRT
325 #define AV_CODEC_ID_VP8 CODEC_ID_VP8
326 #define AV_CODEC_ID_RV10 CODEC_ID_RV10
327 #define AV_CODEC_ID_RV20 CODEC_ID_RV20
328 #define AV_CODEC_ID_RV30 CODEC_ID_RV30
329 #define AV_CODEC_ID_RV40 CODEC_ID_RV40
330 #define AV_CODEC_ID_MP3 CODEC_ID_MP3
331 #define AV_CODEC_ID_MP2 CODEC_ID_MP2
332 #define AV_CODEC_ID_AAC CODEC_ID_AAC
333 #define AV_CODEC_ID_PCM_BLURAY CODEC_ID_PCM_BLURAY
334 #define AV_CODEC_ID_AC3 CODEC_ID_AC3
335 #define AV_CODEC_ID_VORBIS CODEC_ID_VORBIS
336 #define AV_CODEC_ID_EAC3 CODEC_ID_EAC3
337 #define AV_CODEC_ID_DTS CODEC_ID_DTS
338 #define AV_CODEC_ID_TRUEHD CODEC_ID_TRUEHD
339 #define AV_CODEC_ID_S302M CODEC_ID_S302M
340 #define AV_CODEC_ID_DVB_TELETEXT CODEC_ID_DVB_TELETEXT
341 #define AV_CODEC_ID_DVB_SUBTITLE CODEC_ID_DVB_SUBTITLE
342 #define AV_CODEC_ID_DVD_SUBTITLE CODEC_ID_DVD_SUBTITLE
343
344 #define AV_CODEC_ID_MOV_TEXT CODEC_ID_MOV_TEXT
345 #define AV_CODEC_ID_MP4ALS CODEC_ID_MP4ALS
346 #define AV_CODEC_ID_QCELP CODEC_ID_QCELP
347 #define AV_CODEC_ID_MPEG4SYSTEMS CODEC_ID_MPEG4SYSTEMS
348
349 #define AV_CODEC_ID_MPEG2TS CODEC_ID_MPEG2TS
350 #define AV_CODEC_ID_AAC_LATM CODEC_ID_AAC_LATM
351 #define AV_CODEC_ID_HDMV_PGS_SUBTITLE CODEC_ID_HDMV_PGS_SUBTITLE
352
353 #define AV_CODEC_ID_FLAC CODEC_ID_FLAC
354 #define AV_CODEC_ID_MLP CODEC_ID_MLP
355
356 #define AV_CODEC_ID_PCM_F32LE CODEC_ID_PCM_F32LE
357 #define AV_CODEC_ID_PCM_F64LE CODEC_ID_PCM_F64LE
358
359 #define AV_CODEC_ID_PCM_S16BE CODEC_ID_PCM_S16BE
360 #define AV_CODEC_ID_PCM_S24BE CODEC_ID_PCM_S24BE
361 #define AV_CODEC_ID_PCM_S32BE CODEC_ID_PCM_S32BE
362
363 #define AV_CODEC_ID_PCM_S16LE CODEC_ID_PCM_S16LE
364 #define AV_CODEC_ID_PCM_S24LE CODEC_ID_PCM_S24LE
365 #define AV_CODEC_ID_PCM_S32LE CODEC_ID_PCM_S32LE
366
367 #define AV_CODEC_ID_PCM_U8 CODEC_ID_PCM_U8
368
369 #define AV_CODEC_ID_QDM2 CODEC_ID_QDM2
370 #define AV_CODEC_ID_RA_144 CODEC_ID_RA_144
371 #define AV_CODEC_ID_RA_288 CODEC_ID_RA_288
372 #define AV_CODEC_ID_ATRAC3 CODEC_ID_ATRAC3
373 #define AV_CODEC_ID_COOK CODEC_ID_COOK
374 #define AV_CODEC_ID_SIPR CODEC_ID_SIPR
375 #define AV_CODEC_ID_TTA CODEC_ID_TTA
376 #define AV_CODEC_ID_WAVPACK CODEC_ID_WAVPACK
377
378 #define AV_CODEC_ID_TTF CODEC_ID_TTF
379
380 // from mkv_decoder.h
381 #define AV_CODEC_ID_R10K CODEC_ID_R10K
382 #define AV_CODEC_ID_R210 CODEC_ID_R210
383 #define AV_CODEC_ID_V210 CODEC_ID_V210
384 #define AV_CODEC_ID_MJPEGB CODEC_ID_MJPEGB
385 #define AV_CODEC_ID_SVQ3 CODEC_ID_SVQ3
386 #define AV_CODEC_ID_8BPS CODEC_ID_8BPS
387 #define AV_CODEC_ID_SMC CODEC_ID_SMC
388 #define AV_CODEC_ID_QTRLE CODEC_ID_QTRLE
389 #define AV_CODEC_ID_QDRAW CODEC_ID_QDRAW
390 #define AV_CODEC_ID_DNXHD CODEC_ID_DNXHD
391 #define AV_CODEC_ID_SGI CODEC_ID_SGI
392 #define AV_CODEC_ID_DPX CODEC_ID_DPX
393 #define AV_CODEC_ID_PRORES CODEC_ID_PRORES
394
395 #endif // AVCODEC_VERSION
396
397 static const AVCodecTag codec_bmp_tags[] = {
398 { AV_CODEC_ID_H264, MKTAG('H', '2', '6', '4') },
399 { AV_CODEC_ID_H264, MKTAG('h', '2', '6', '4') },
400 { AV_CODEC_ID_H264, MKTAG('X', '2', '6', '4') },
401 { AV_CODEC_ID_H264, MKTAG('x', '2', '6', '4') },
402 { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') },
403 { AV_CODEC_ID_H264, MKTAG('V', 'S', 'S', 'H') },
404 { AV_CODEC_ID_H263, MKTAG('H', '2', '6', '3') },
405 { AV_CODEC_ID_H263, MKTAG('X', '2', '6', '3') },
406 { AV_CODEC_ID_H263, MKTAG('T', '2', '6', '3') },
407 { AV_CODEC_ID_H263, MKTAG('L', '2', '6', '3') },
408 { AV_CODEC_ID_H263, MKTAG('V', 'X', '1', 'K') },
409 { AV_CODEC_ID_H263, MKTAG('Z', 'y', 'G', 'o') },
410 { AV_CODEC_ID_H263P, MKTAG('H', '2', '6', '3') },
411 { AV_CODEC_ID_H263I, MKTAG('I', '2', '6', '3') }, /* intel h263 */
412 { AV_CODEC_ID_H261, MKTAG('H', '2', '6', '1') },
413 { AV_CODEC_ID_H263P, MKTAG('U', '2', '6', '3') },
414 { AV_CODEC_ID_H263P, MKTAG('v', 'i', 'v', '1') },
415 { AV_CODEC_ID_MPEG4, MKTAG('F', 'M', 'P', '4') },
416 { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') },
417 { AV_CODEC_ID_MPEG4, MKTAG('D', 'X', '5', '0') },
418 { AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
419 { AV_CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') },
420 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'S', '2') },
421 { AV_CODEC_ID_MPEG4, MKTAG(4 , 0 , 0 , 0) }, /* some broken avi use this */
422 { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', '1') },
423 { AV_CODEC_ID_MPEG4, MKTAG('B', 'L', 'Z', '0') },
424 { AV_CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
425 { AV_CODEC_ID_MPEG4, MKTAG('U', 'M', 'P', '4') },
426 { AV_CODEC_ID_MPEG4, MKTAG('W', 'V', '1', 'F') },
427 { AV_CODEC_ID_MPEG4, MKTAG('S', 'E', 'D', 'G') },
428 { AV_CODEC_ID_MPEG4, MKTAG('R', 'M', 'P', '4') },
429 { AV_CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') },
430 { AV_CODEC_ID_MPEG4, MKTAG('F', 'F', 'D', 'S') },
431 { AV_CODEC_ID_MPEG4, MKTAG('F', 'V', 'F', 'W') },
432 { AV_CODEC_ID_MPEG4, MKTAG('D', 'C', 'O', 'D') },
433 { AV_CODEC_ID_MPEG4, MKTAG('M', 'V', 'X', 'M') },
434 { AV_CODEC_ID_MPEG4, MKTAG('P', 'M', '4', 'V') },
435 { AV_CODEC_ID_MPEG4, MKTAG('S', 'M', 'P', '4') },
436 { AV_CODEC_ID_MPEG4, MKTAG('D', 'X', 'G', 'M') },
437 { AV_CODEC_ID_MPEG4, MKTAG('V', 'I', 'D', 'M') },
438 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'T', '3') },
439 { AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'X') },
440 { AV_CODEC_ID_MPEG4, MKTAG('H', 'D', 'X', '4') }, /* flipped video */
441 { AV_CODEC_ID_MPEG4, MKTAG('D', 'M', 'K', '2') },
442 { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'G', 'I') },
443 { AV_CODEC_ID_MPEG4, MKTAG('I', 'N', 'M', 'C') },
444 { AV_CODEC_ID_MPEG4, MKTAG('E', 'P', 'H', 'V') }, /* Ephv MPEG-4 */
445 { AV_CODEC_ID_MPEG4, MKTAG('E', 'M', '4', 'A') },
446 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'C', 'C') }, /* Divio MPEG-4 */
447 { AV_CODEC_ID_MPEG4, MKTAG('S', 'N', '4', '0') },
448 { AV_CODEC_ID_MPEG4, MKTAG('V', 'S', 'P', 'X') },
449 { AV_CODEC_ID_MPEG4, MKTAG('U', 'L', 'D', 'X') },
450 { AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'V') },
451 { AV_CODEC_ID_MPEG4, MKTAG('S', 'I', 'P', 'P') }, /* Samsung SHR-6040 */
452 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3') }, /* default signature when using MSMPEG4 */
453 { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') },
454 { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') },
455 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') },
456 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') },
457 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') },
458 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'V', 'X', '3') },
459 { AV_CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') },
460 { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') },
461 { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') },
462 { AV_CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') },
463 { AV_CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') },
464 { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') },
465 { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', '4', '1') },
466 { AV_CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') },
467 { AV_CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') },
468 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') },
469 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') },
470 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
471 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') },
472 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') },
473 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', '0') },
474 { AV_CODEC_ID_DVVIDEO, MKTAG('c', 'd', 'v', 'c') }, /* Canopus DV */
475 { AV_CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', 'H') }, /* Canopus DV */
476 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') },
477 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 's') },
478 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
479 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') },
480 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') },
481 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', '2') },
482 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') },
483 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') },
484 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('P', 'I', 'M', '2') },
485 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') },
486 { AV_CODEC_ID_MPEG1VIDEO, MKTAG(1 , 0 , 0 , 16) },
487 { AV_CODEC_ID_MPEG2VIDEO, MKTAG(2 , 0 , 0 , 16) },
488 { AV_CODEC_ID_MPEG4, MKTAG(4 , 0 , 0 , 16) },
489 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') },
490 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') },
491 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('L', 'M', 'P', '2') }, /* Lead MPEG2 in avi */
492 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('s', 'l', 'i', 'f') },
493 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('E', 'M', '2', 'V') },
494 { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') },
495 { AV_CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') },
496 { AV_CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') },
497 { AV_CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') },
498 { AV_CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') },
499 { AV_CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */
500 { AV_CODEC_ID_JPEGLS, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - encoder */
501 { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - decoder */
502 { AV_CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') },
503 { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'P', 'G') },
504 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') },
505 { AV_CODEC_ID_MJPEG, MKTAG('A', 'C', 'D', 'V') },
506 { AV_CODEC_ID_MJPEG, MKTAG('Q', 'I', 'V', 'G') },
507 { AV_CODEC_ID_MJPEG, MKTAG('S', 'L', 'M', 'J') }, /* SL M-JPEG */
508 { AV_CODEC_ID_MJPEG, MKTAG('C', 'J', 'P', 'G') }, /* Creative Webcam JPEG */
509 { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'L', 'V') }, /* Intel JPEG Library Video Codec */
510 { AV_CODEC_ID_MJPEG, MKTAG('M', 'V', 'J', 'P') }, /* Midvid JPEG Video Codec */
511 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '1') },
512 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '2') },
513 { AV_CODEC_ID_MJPEG, MKTAG('M', 'T', 'S', 'J') },
514 { AV_CODEC_ID_MJPEG, MKTAG('Z', 'J', 'P', 'G') }, /* Paradigm Matrix M-JPEG Codec */
515 { AV_CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') },
516 { AV_CODEC_ID_FFVHUFF, MKTAG('F', 'F', 'V', 'H') },
517 { AV_CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') },
518 { AV_CODEC_ID_RAWVIDEO, MKTAG(0 , 0 , 0 , 0) },
519 { AV_CODEC_ID_RAWVIDEO, MKTAG(3 , 0 , 0 , 0) },
520 { AV_CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') },
521 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'Y', '2') },
522 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') },
523 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', '4', '2', '2') },
524 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'N', 'V') },
525 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'V') },
526 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'Y') },
527 { AV_CODEC_ID_RAWVIDEO, MKTAG('u', 'y', 'v', '1') },
528 { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'V', 'u', '1') },
529 { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') },
530 { AV_CODEC_ID_RAWVIDEO, MKTAG('P', '4', '2', '2') },
531 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') },
532 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'V', 'Y') },
533 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'Y', 'U', 'Y') },
534 { AV_CODEC_ID_RAWVIDEO, MKTAG('I', 'Y', 'U', 'V') },
535 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', '0', '0') },
536 { AV_CODEC_ID_RAWVIDEO, MKTAG('H', 'D', 'Y', 'C') },
537 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
538 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'D', 'T', 'Z') }, /* SoftLab-NSK VideoTizer */
539 { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') },
540 { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') },
541 { AV_CODEC_ID_INDEO4, MKTAG('I', 'V', '4', '1') },
542 { AV_CODEC_ID_INDEO5, MKTAG('I', 'V', '5', '0') },
543 { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
544 { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') },
545 { AV_CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
546 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') },
547 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') },
548 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
549 { AV_CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') },
550 { AV_CODEC_ID_VP6F, MKTAG('F', 'L', 'V', '4') },
551 { AV_CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') },
552 { AV_CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') },
553 { AV_CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') },
554 { AV_CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') },
555 { AV_CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') },
556 { AV_CODEC_ID_MIMIC, MKTAG('L', 'M', '2', '0') },
557 { AV_CODEC_ID_MSRLE, MKTAG('m', 'r', 'l', 'e') },
558 { AV_CODEC_ID_MSRLE, MKTAG(1 , 0 , 0 , 0) },
559 { AV_CODEC_ID_MSRLE, MKTAG(2 , 0 , 0 , 0) },
560 { AV_CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') },
561 { AV_CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') },
562 { AV_CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') },
563 { AV_CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') },
564 { AV_CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') },
565 { AV_CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') },
566 { AV_CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') },
567 { AV_CODEC_ID_TRUEMOTION1, MKTAG('D', 'U', 'C', 'K') },
568 { AV_CODEC_ID_TRUEMOTION1, MKTAG('P', 'V', 'E', 'Z') },
569 { AV_CODEC_ID_MSZH, MKTAG('M', 'S', 'Z', 'H') },
570 { AV_CODEC_ID_ZLIB, MKTAG('Z', 'L', 'I', 'B') },
571 #if FF_API_SNOW
572 { AV_CODEC_ID_SNOW, MKTAG('S', 'N', 'O', 'W') },
573 #endif
574 { AV_CODEC_ID_4XM, MKTAG('4', 'X', 'M', 'V') },
575 { AV_CODEC_ID_FLV1, MKTAG('F', 'L', 'V', '1') },
576 { AV_CODEC_ID_FLASHSV, MKTAG('F', 'S', 'V', '1') },
577 { AV_CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') },
578 { AV_CODEC_ID_TSCC, MKTAG('t', 's', 'c', 'c') },
579 { AV_CODEC_ID_ULTI, MKTAG('U', 'L', 'T', 'I') },
580 { AV_CODEC_ID_VIXL, MKTAG('V', 'I', 'X', 'L') },
581 { AV_CODEC_ID_QPEG, MKTAG('Q', 'P', 'E', 'G') },
582 { AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '0') },
583 { AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '1') },
584 { AV_CODEC_ID_WMV3, MKTAG('W', 'M', 'V', '3') },
585 { AV_CODEC_ID_VC1, MKTAG('W', 'V', 'C', '1') },
586 { AV_CODEC_ID_VC1, MKTAG('W', 'M', 'V', 'A') },
587 { AV_CODEC_ID_LOCO, MKTAG('L', 'O', 'C', 'O') },
588 { AV_CODEC_ID_WNV1, MKTAG('W', 'N', 'V', '1') },
589 { AV_CODEC_ID_AASC, MKTAG('A', 'A', 'S', 'C') },
590 { AV_CODEC_ID_INDEO2, MKTAG('R', 'T', '2', '1') },
591 { AV_CODEC_ID_FRAPS, MKTAG('F', 'P', 'S', '1') },
592 { AV_CODEC_ID_THEORA, MKTAG('t', 'h', 'e', 'o') },
593 { AV_CODEC_ID_TRUEMOTION2, MKTAG('T', 'M', '2', '0') },
594 { AV_CODEC_ID_CSCD, MKTAG('C', 'S', 'C', 'D') },
595 { AV_CODEC_ID_ZMBV, MKTAG('Z', 'M', 'B', 'V') },
596 { AV_CODEC_ID_KMVC, MKTAG('K', 'M', 'V', 'C') },
597 { AV_CODEC_ID_CAVS, MKTAG('C', 'A', 'V', 'S') },
598 { AV_CODEC_ID_JPEG2000, MKTAG('M', 'J', '2', 'C') },
599 { AV_CODEC_ID_VMNC, MKTAG('V', 'M', 'n', 'c') },
600 { AV_CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') },
601 { AV_CODEC_ID_PNG, MKTAG('M', 'P', 'N', 'G') },
602 { AV_CODEC_ID_PNG, MKTAG('P', 'N', 'G', '1') },
603 { AV_CODEC_ID_CLJR, MKTAG('c', 'l', 'j', 'r') },
604 { AV_CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') },
605 { AV_CODEC_ID_RPZA, MKTAG('a', 'z', 'p', 'r') },
606 { AV_CODEC_ID_RPZA, MKTAG('R', 'P', 'Z', 'A') },
607 { AV_CODEC_ID_RPZA, MKTAG('r', 'p', 'z', 'a') },
608 { AV_CODEC_ID_SP5X, MKTAG('S', 'P', '5', '4') },
609 { AV_CODEC_ID_NONE, 0 }
610 };
611
612 #ifdef NEED_AV_STREAM_TYPES
613
614 typedef struct {
615 uint32_t stream_type;
616 enum AVMediaType codec_type;
617 enum AVCodecID codec_id;
618 } StreamType;
619
620 static const StreamType ISO_types[] = {
621 { 0x01, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG2VIDEO },
622 { 0x02, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG2VIDEO },
623 { 0x03, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_MP3 },
624 { 0x04, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_MP3 },
625 { 0x0f, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AAC },
626 { 0x10, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_MPEG4 },
627 /* Makito encoder sets stream type 0x11 for AAC,
628 so auto-detect LOAS/LATM instead of hardcoding it. */
629 // { 0x11, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AAC_LATM }, /* LATM syntax */
630 { 0x1b, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_H264 },
631 { 0xd1, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC },
632 { 0xea, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1 },
633 { 0 },
634 };
635
636 static const StreamType HDMV_types[] = {
637 { 0x80, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_PCM_BLURAY },
638 { 0x81, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },
639 { 0x82, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
640 { 0x83, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_TRUEHD },
641 { 0x84, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 },
642 { 0x85, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS HD */
643 { 0x86, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS HD MASTER*/
644 { 0xa1, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 }, /* E-AC3 Secondary Audio */
645 { 0xa2, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS }, /* DTS Express Secondary Audio */
646 { 0x90, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_HDMV_PGS_SUBTITLE },
647 { 0 },
648 };
649
650 /* ATSC ? */
651 static const StreamType MISC_types[] = {
652 { 0x81, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },
653 { 0x8a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
654 { 0 },
655 };
656
657 static const StreamType REGD_types[] = {
658 { MKTAG('d', 'r', 'a', 'c'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC },
659 { MKTAG('A', 'C', '-', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 },
660 { MKTAG('B', 'S', 'S', 'D'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_S302M },
661 { MKTAG('D', 'T', 'S', '1'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
662 { MKTAG('D', 'T', 'S', '2'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
663 { MKTAG('D', 'T', 'S', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
664 { MKTAG('V', 'C', '-', '1'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1 },
665 { 0 },
666 };
667
668 /* descriptor present */
669 static const StreamType DESC_types[] = {
670 { 0x6a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 }, /* AC-3 descriptor */
671 { 0x7a, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3 }, /* E-AC-3 descriptor */
672 { 0x7b, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_DTS },
673 { 0x56, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_DVB_TELETEXT },
674 { 0x59, AVMEDIA_TYPE_SUBTITLE, AV_CODEC_ID_DVB_SUBTITLE }, /* subtitling descriptor */
675 { 0 },
676 };
677
678 #endif
679
680 #if defined FF_API_PIX_FMT || defined AVUTIL_PIXFMT_H
681
avi_color_range_to_weed_clamping(enum AVColorRange range)682 static inline int avi_color_range_to_weed_clamping(enum AVColorRange range) {
683 switch (range) {
684 case AVCOL_RANGE_MPEG:
685 return WEED_YUV_CLAMPING_CLAMPED;
686 case AVCOL_RANGE_JPEG:
687 return WEED_YUV_CLAMPING_UNCLAMPED;
688 default:
689 break;
690 }
691 return WEED_YUV_CLAMPING_CLAMPED;
692 }
693
weed_clamping_to_avi_color_range(int clamping)694 static inline enum AVColorRange weed_clamping_to_avi_color_range(int clamping) {
695 switch (clamping) {
696 case WEED_YUV_CLAMPING_CLAMPED:
697 return AVCOL_RANGE_MPEG;
698 case WEED_YUV_CLAMPING_UNCLAMPED:
699 return AVCOL_RANGE_JPEG;
700 }
701 return AVCOL_RANGE_NB;
702 }
703
704 #ifndef AVUTIL_PIXFMT_H
705
avi_pix_fmt_to_weed_palette(enum PixelFormat pix_fmt,int * clamped)706 static inline int avi_pix_fmt_to_weed_palette(enum PixelFormat pix_fmt, int *clamped) {
707 // clamped may be set to NULL if you are not interested in the value
708 switch (pix_fmt) {
709 case PIX_FMT_RGB24:
710 return WEED_PALETTE_RGB24;
711 case PIX_FMT_BGR24:
712 return WEED_PALETTE_BGR24;
713 case PIX_FMT_RGBA:
714 return WEED_PALETTE_RGBA32;
715 case PIX_FMT_BGRA:
716 return WEED_PALETTE_BGRA32;
717 case PIX_FMT_ARGB:
718 return WEED_PALETTE_ARGB32;
719 case PIX_FMT_YUV444P:
720 return WEED_PALETTE_YUV444P;
721 case PIX_FMT_YUVA444P:
722 return WEED_PALETTE_YUVA4444P;
723 case PIX_FMT_YUV422P:
724 return WEED_PALETTE_YUV422P;
725 case PIX_FMT_YUV420P:
726 return WEED_PALETTE_YUV420P;
727 case PIX_FMT_YUYV422:
728 return WEED_PALETTE_YUYV;
729 case PIX_FMT_UYVY422:
730 return WEED_PALETTE_UYVY;
731 case PIX_FMT_UYYVYY411:
732 return WEED_PALETTE_YUV411;
733 case PIX_FMT_GRAY8:
734 return WEED_PALETTE_A8;
735 case PIX_FMT_MONOWHITE:
736 case PIX_FMT_MONOBLACK:
737 return WEED_PALETTE_A1;
738 case PIX_FMT_YUVJ422P:
739 if (clamped) *clamped = WEED_YUV_CLAMPING_UNCLAMPED;
740 return WEED_PALETTE_YUV422P;
741 case PIX_FMT_YUVJ444P:
742 if (clamped) *clamped = WEED_YUV_CLAMPING_UNCLAMPED;
743 return WEED_PALETTE_YUV444P;
744 case PIX_FMT_YUVAJ444P:
745 if (clamped) *clamped = WEED_YUV_CLAMPING_UNCLAMPED;
746 return WEED_PALETTE_YUVA444P;
747 case PIX_FMT_YUVJ420P:
748 if (clamped) *clamped = WEED_YUV_CLAMPING_UNCLAMPED;
749 return WEED_PALETTE_YUV420P;
750
751 default:
752 return WEED_PALETTE_END;
753 }
754 }
755
weed_palette_to_avi_pix_fmt(int pal,int * clamped)756 static inline enum PixelFormat weed_palette_to_avi_pix_fmt(int pal, int *clamped) {
757 switch (pal) {
758 case WEED_PALETTE_RGB24:
759 return PIX_FMT_RGB24;
760 case WEED_PALETTE_BGR24:
761 return PIX_FMT_BGR24;
762 case WEED_PALETTE_RGBA32:
763 return PIX_FMT_RGBA;
764 case WEED_PALETTE_BGRA32:
765 return PIX_FMT_BGRA;
766 case WEED_PALETTE_ARGB32:
767 return PIX_FMT_ARGB;
768 case WEED_PALETTE_YUV444P:
769 if (clamped && *clamped == WEED_YUV_CLAMPING_UNCLAMPED)
770 return PIX_FMT_YUVJ444P;
771 return PIX_FMT_YUV444P;
772 case WEED_PALETTE_YUVA444P:
773 if (clamped && *clamped == WEED_YUV_CLAMPING_UNCLAMPED)
774 return PIX_FMT_YUVAJ444P;
775 return PIX_FMT_YUVA444P;
776 case WEED_PALETTE_YUV422P:
777 if (clamped && *clamped == WEED_YUV_CLAMPING_UNCLAMPED)
778 return PIX_FMT_YUVJ422P;
779 return PIX_FMT_YUV422P;
780 case WEED_PALETTE_YUV420P:
781 if (clamped && *clamped == WEED_YUV_CLAMPING_UNCLAMPED)
782 return PIX_FMT_YUVJ420P;
783 return PIX_FMT_YUV420P;
784 case WEED_PALETTE_YUYV:
785 return PIX_FMT_YUYV422;
786 case WEED_PALETTE_UYVY:
787 return PIX_FMT_UYVY422;
788 case WEED_PALETTE_YUV411:
789 return PIX_FMT_UYYVYY411;
790
791 case WEED_PALETTE_A8:
792 return PIX_FMT_GRAY8;
793 case WEED_PALETTE_A1:
794 return PIX_FMT_MONOBLACK;
795
796 default:
797 return PIX_FMT_NONE;
798 }
799 }
800
801 #else
802
avi_pix_fmt_to_weed_palette(enum AVPixelFormat pix_fmt,int * clamped)803 static inline int avi_pix_fmt_to_weed_palette(enum AVPixelFormat pix_fmt, int *clamped) {
804 // clamped may be set to NULL if you are not interested in the value
805 switch (pix_fmt) {
806 case AV_PIX_FMT_RGB24:
807 return WEED_PALETTE_RGB24;
808 case AV_PIX_FMT_BGR24:
809 return WEED_PALETTE_BGR24;
810 case AV_PIX_FMT_RGBA:
811 return WEED_PALETTE_RGBA32;
812 case AV_PIX_FMT_BGRA:
813 return WEED_PALETTE_BGRA32;
814 case AV_PIX_FMT_ARGB:
815 return WEED_PALETTE_ARGB32;
816 case AV_PIX_FMT_YUV444P:
817 return WEED_PALETTE_YUV444P;
818 case AV_PIX_FMT_YUVA444P:
819 return WEED_PALETTE_YUVA4444P;
820 case AV_PIX_FMT_YUV422P:
821 return WEED_PALETTE_YUV422P;
822 case AV_PIX_FMT_YUV420P:
823 return WEED_PALETTE_YUV420P;
824 case AV_PIX_FMT_YUYV422:
825 return WEED_PALETTE_YUYV;
826 case AV_PIX_FMT_UYVY422:
827 return WEED_PALETTE_UYVY;
828 case AV_PIX_FMT_UYYVYY411:
829 return WEED_PALETTE_YUV411;
830 case AV_PIX_FMT_GRAY8:
831 return WEED_PALETTE_A8;
832 case AV_PIX_FMT_MONOWHITE:
833 case AV_PIX_FMT_MONOBLACK:
834 return WEED_PALETTE_A1;
835 case AV_PIX_FMT_YUVJ422P:
836 if (clamped) *clamped = WEED_YUV_CLAMPING_UNCLAMPED;
837 return WEED_PALETTE_YUV422P;
838 case AV_PIX_FMT_YUVJ444P:
839 if (clamped) *clamped = WEED_YUV_CLAMPING_UNCLAMPED;
840 return WEED_PALETTE_YUV444P;
841 case AV_PIX_FMT_YUVJ420P:
842 if (clamped) *clamped = WEED_YUV_CLAMPING_UNCLAMPED;
843 return WEED_PALETTE_YUV420P;
844
845 default:
846 return WEED_PALETTE_END;
847 }
848 }
849
weed_palette_to_avi_pix_fmt(int pal,int * clamped)850 static inline enum AVPixelFormat weed_palette_to_avi_pix_fmt(int pal, int *clamped) {
851 switch (pal) {
852 case WEED_PALETTE_RGB24:
853 return AV_PIX_FMT_RGB24;
854 case WEED_PALETTE_BGR24:
855 return AV_PIX_FMT_BGR24;
856 case WEED_PALETTE_RGBA32:
857 return AV_PIX_FMT_RGBA;
858 case WEED_PALETTE_BGRA32:
859 return AV_PIX_FMT_BGRA;
860 case WEED_PALETTE_ARGB32:
861 return AV_PIX_FMT_ARGB;
862 case WEED_PALETTE_YUV444P:
863 if (clamped && *clamped == WEED_YUV_CLAMPING_UNCLAMPED)
864 return AV_PIX_FMT_YUVJ444P;
865 return AV_PIX_FMT_YUV444P;
866 case WEED_PALETTE_YUVA4444P:
867 return AV_PIX_FMT_YUVA444P;
868 case WEED_PALETTE_YUV422P:
869 if (clamped && *clamped == WEED_YUV_CLAMPING_UNCLAMPED)
870 return AV_PIX_FMT_YUVJ422P;
871 return AV_PIX_FMT_YUV422P;
872 case WEED_PALETTE_YUV420P:
873 if (clamped && *clamped == WEED_YUV_CLAMPING_UNCLAMPED)
874 return AV_PIX_FMT_YUVJ420P;
875 return AV_PIX_FMT_YUV420P;
876 case WEED_PALETTE_YUYV:
877 return AV_PIX_FMT_YUYV422;
878 case WEED_PALETTE_UYVY:
879 return AV_PIX_FMT_UYVY422;
880 case WEED_PALETTE_YUV411:
881 return AV_PIX_FMT_UYYVYY411;
882
883 case WEED_PALETTE_A8:
884 return AV_PIX_FMT_GRAY8;
885 case WEED_PALETTE_A1:
886 return AV_PIX_FMT_MONOBLACK;
887
888 default:
889 return AV_PIX_FMT_NONE;
890 }
891 }
892 #endif // avutil
893 #endif // pix fmts
894
avi_trc_to_weed_gamma(enum AVColorTransferCharacteristic trc)895 static inline int avi_trc_to_weed_gamma(enum AVColorTransferCharacteristic trc) {
896 switch (trc) {
897 case AVCOL_TRC_BT709:
898 return WEED_GAMMA_BT709;
899 case AVCOL_TRC_LINEAR:
900 return WEED_GAMMA_LINEAR;
901 case AVCOL_TRC_GAMMA22:
902 return WEED_GAMMA_SRGB;
903 default:
904 break;
905 }
906 return WEED_GAMMA_UNKNOWN;
907 }
908
weed_gamma_to_avi_trc(int gamma_type)909 static inline enum AVColorTransferCharacteristic weed_gamma_to_avi_trc(int gamma_type) {
910 switch (gamma_type) {
911 case WEED_GAMMA_BT709:
912 return AVCOL_TRC_BT709;
913 case WEED_GAMMA_LINEAR:
914 return AVCOL_TRC_LINEAR;
915 case WEED_GAMMA_SRGB:
916 return AVCOL_TRC_GAMMA22;
917 default:
918 break;
919 }
920 return AVCOL_TRC_UNSPECIFIED;
921 }
922
923 #endif // HAVE_AVUTIL
924 #endif // HAVE_AVCODEC
925
926 #ifndef WEED_AVUTIL_CHANNEL_LAYOUTS
927
928 #ifdef USE_AVUTIL_CHANNEL_LAYOUTS
929 #ifndef AVUTIL_CHANNEL_LAYOUT_H
930 #ifdef HAVE_AVUTIL
931 #include <libavutil/channel_layout.h>
932 #endif
933 #endif
934
935 #ifdef AVUTIL_CHANNEL_LAYOUT_H
936 #define WEED_CH_FRONT_LEFT AV_CH_FRONT_LEFT
937 #define WEED_CH_FRONT_RIGHT AV_CH_FRONT_RIGHT
938 #define WEED_CH_FRONT_CENTER AV_CH_FRONT_CENTER
939 #define WEED_CH_LOW_FREQUENCY AV_CH_LOW_FREQUENCY
940 #define WEED_CH_BACK_LEFT AV_CH_BACK_LEFT
941 #define WEED_CH_BACK_RIGHT AV_CH_BACK_RIGHT
942 #define WEED_CH_FRONT_LEFT_OF_CENTER AV_CH_FRONT_LEFT_OF_CENTER
943 #define WEED_CH_FRONT_RIGHT_OF_CENTER AV_CH_FRONT_RIGHT_OF_CENTER
944 #define WEED_CH_BACK_CENTER AV_CH_BACK_CENTER
945 #define WEED_CH_SIDE_LEFT AV_CH_SIDE_LEFT
946 #define WEED_CH_SIDE_RIGHT AV_CH_SIDE_RIGHT
947 #define WEED_CH_TOP_CENTER AV_CH_TOP_CENTER
948 #define WEED_CH_TOP_FRONT_LEFT AV_CH_TOP_FRONT_LEFT
949 #define WEED_CH_TOP_FRONT_CENTER AV_CH_TOP_FRONT_CENTER
950 #define WEED_CH_TOP_FRONT_RIGHT AV_CH_TOP_FRONT_RIGHT
951 #define WEED_CH_TOP_BACK_LEFT AV_CH_TOP_BACK_LEFT
952 #define WEED_CH_TOP_BACK_CENTER AV_CH_TOP_BACK_CENTER
953 #define WEED_CH_TOP_BACK_RIGHT AV_CH_TOP_BACK_RIGHT
954 #define WEED_CH_STEREO_LEFT AV_CH_STEREO_LEFT
955 #define WEED_CH_STEREO_RIGHT AV_CH_STEREO_RIGHT
956 #define WEED_CH_WIDE_LEFT AV_CH_WIDE_LEFT
957 #define WEED_CH_WIDE_RIGHT AV_CH_WIDE_RIGHT
958 #define WEED_CH_SURROUND_DIRECT_LEFT AV_CH_SURROUND_DIRECT_LEFT
959 #define WEED_CH_SURROUND_DIRECT_RIGHT AV_CH_SURROUND_DIRECT_RIGHT
960 #define WEED_CH_LOW_FREQUENCY_2 AV_CH_LOW_FREQUENCY_2
961
962 #ifdef WEED_CH_LAYOUT_MONO
963 #undef WEED_CH_LAYOUT_MONO
964 #endif
965
966 #ifdef WEED_CH_LAYOUT_STEREO
967 #undef WEED_CH_LAYOUT_STEREO
968 #endif
969
970 #define WEED_CH_LAYOUT_MONO AV_CH_LAYOUT_MONO
971 #define WEED_CH_LAYOUT_STEREO AV_CH_LAYOUT_STEREO
972 #define WEED_CH_LAYOUT_2POINT1 AV_CH_LAYOUT_2POINT1
973 #define WEED_CH_LAYOUT_2_1 AV_CH_LAYOUT_2_1
974 #define WEED_CH_LAYOUT_SURROUND AV_CH_LAYOUT_SURROUND
975 #define WEED_CH_LAYOUT_3POINT1 AV_CH_LAYOUT_3POINT1
976 #define WEED_CH_LAYOUT_4POINT0 AV_CH_LAYOUT_4POINT0
977 #define WEED_CH_LAYOUT_4POINT1 AV_CH_LAYOUT_4POINT1
978 #define WEED_CH_LAYOUT_2_2 AV_CH_LAYOUT_2_2
979 #define WEED_CH_LAYOUT_QUAD AV_CH_LAYOUT_QUAD
980 #define WEED_CH_LAYOUT_5POINT0 AV_CH_LAYOUT_5POINT0
981 #define WEED_CH_LAYOUT_5POINT1 AV_CH_LAYOUT_5POINT1
982 #define WEED_CH_LAYOUT_5POINT0_BACK AV_CH_LAYOUT_5POINT0_BACK
983 #define WEED_CH_LAYOUT_5POINT1_BACK AV_CH_LAYOUT_5POINT1_BACK
984 #define WEED_CH_LAYOUT_6POINT0 AV_CH_LAYOUT_6POINT0
985 #define WEED_CH_LAYOUT_6POINT0_FRONT AV_CH_LAYOUT_6POINT0_FRONT
986 #define WEED_CH_LAYOUT_HEXAGONAL AV_CH_LAYOUT_HEXAGONAL
987 #define WEED_CH_LAYOUT_6POINT1 AV_CH_LAYOUT_6POINT1
988 #define WEED_CH_LAYOUT_6POINT1_BACK AV_CH_LAYOUT_6POINT1_BACK
989 #define WEED_CH_LAYOUT_6POINT1_FRONT AV_CH_LAYOUT_6POINT1_FRONT
990 #define WEED_CH_LAYOUT_7POINT0 AV_CH_LAYOUT_7POINT0
991 #define WEED_CH_LAYOUT_7POINT0_FRONT AV_CH_LAYOUT_7POINT0_FRONT
992 #define WEED_CH_LAYOUT_7POINT1 AV_CH_LAYOUT_7POINT1
993 #define WEED_CH_LAYOUT_7POINT1_WIDE AV_CH_LAYOUT_7POINT1_WIDE
994 #define WEED_CH_LAYOUT_7POINT1_WIDE_BACK AV_CH_LAYOUT_7POINT1_WIDE_BACK
995 #define WEED_CH_LAYOUT_OCTAGONAL AV_CH_LAYOUT_OCTAGONAL
996 #define WEED_CH_LAYOUT_HEXADECAGONAL AV_CH_LAYOUT_HEXADECAGONAL
997 #define WEED_CH_LAYOUT_STEREO_DOWNMIX AV_CH_LAYOUT_STEREO_DOWNMIX
998
999 #ifndef WEED_CH_LAYOUT_DEFAULT_1
1000 #define WEED_CH_LAYOUT_DEFAULT_1 WEED_CH_LAYOUT_MONO
1001 #endif
1002 #ifndef WEED_CH_LAYOUT_DEFAULT_2
1003 #define WEED_CH_LAYOUT_DEFAULT_2 WEED_CH_LAYOUT_STEREO
1004 #endif
1005 #ifndef WEED_CH_LAYOUTS_DEFAULT
1006 #define WEED_CH_LAYOUTS_DEFAULT (WEED_CH_LAYOUT_DEFAULT_2, WEED_CH_LAYOUT_DEFAULT_1}
1007 #endif
1008 #ifndef WEED_CH_LAYOUTS_DEFAULT_MIN2
1009 #define WEED_CH_LAYOUTS_DEFAULT_MIN2 (WEED_CH_LAYOUT_DEFAULT_2}
1010 #endif
1011
1012 #define WEED_AVUTIL_CHANNEL_LAYOUTS
1013
1014 #ifdef WEED_CHANNEL_LAYOUT_TYPE
1015 #undef WEED_CHANNEL_LAYOUT_TYPE
1016 #endif
1017
1018 #define WEED_CHANNEL_LAYOUT_TYPE "avutil"
1019 #endif /// WEED_CHANNEL_LAYOUT_H
1020
1021 #endif //avchan
1022 #endif //avchan
1023
1024 #ifdef NEED_PANGO_COMPAT
1025 #ifdef __PANGO_FONT_H__
1026
1027 #define HAVE_PANGO_FONT_STRETCH 1
1028 #define HAVE_PANGO_FONT_WEIGHT 1
1029 #define HAVE_PANGO_FONT_STYLE 1
1030 #define HAVE_PANGO_FONT_SIZE 1
1031
font_stretch_to_pango_stretch(const char * stretch)1032 static inline int font_stretch_to_pango_stretch(const char *stretch) {
1033 PangoFontDescription *pfd = pango_font_description_from_string(stretch);
1034 PangoStretch pstretch = pango_font_description_get_stretch(pfd);
1035 pango_font_description_free(pfd);
1036 return pstretch;
1037 }
1038
font_weight_to_pango_weight(const char * weight)1039 static inline int font_weight_to_pango_weight(const char *weight) {
1040 PangoFontDescription *pfd = pango_font_description_from_string(weight);
1041 PangoWeight pweight = pango_font_description_get_weight(pfd);
1042 pango_font_description_free(pfd);
1043 return pweight;
1044 }
1045
font_style_to_pango_style(const char * style)1046 static inline int font_style_to_pango_style(const char *style) {
1047 PangoFontDescription *pfd = pango_font_description_from_string(style);
1048 PangoStyle pstyle = pango_font_description_get_style(pfd);
1049 pango_font_description_free(pfd);
1050 return pstyle;
1051 }
1052
1053 // int font_size_to_pango_size(int font_size)
1054 #define font_size_to_pango_size(font_size) ((font_size) * PANGO_SCALE)
1055
1056 #endif
1057 #endif
1058
1059 #ifdef __cplusplus
1060 }
1061 #endif /* __cplusplus */
1062
1063 #endif // __WEED_COMPAT_H__
1064