libweed 2.0.0
weed-compat.h
Go to the documentation of this file.
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
37extern "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
88static 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'):
163 break;
164 case MK_FOURCC('I', '4', '4', '4'):
166 break;
167 case MK_FOURCC('4', '2', '2', 'P'):
169 break;
170 case MK_FOURCC('Y', 'V', '1', '2'):
172 case MK_FOURCC('I', '4', '2', '0'):
173 case MK_FOURCC('I', 'Y', 'U', 'V'):
174 case MK_FOURCC('Y', 'U', '1', '2'):
176
177 case MK_FOURCC('J', '4', '2', '0'):
178 if (clamping) *clamping = WEED_YUV_CLAMPING_UNCLAMPED;
180 case MK_FOURCC('J', '4', '2', '2'):
181 if (clamping) *clamping = WEED_YUV_CLAMPING_UNCLAMPED;
183 case MK_FOURCC('J', '4', '4', '4'):
184 if (clamping) *clamping = WEED_YUV_CLAMPING_UNCLAMPED;
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
230typedef 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
397static 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
614typedef struct {
615 uint32_t stream_type;
616 enum AVMediaType codec_type;
617 enum AVCodecID codec_id;
618} StreamType;
619
620static 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
636static 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 ? */
651static 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
657static 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 */
669static 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
682static inline int avi_color_range_to_weed_clamping(enum AVColorRange range) {
683 switch (range) {
684 case AVCOL_RANGE_MPEG:
686 case AVCOL_RANGE_JPEG:
688 default:
689 break;
690 }
692}
693
694static inline enum AVColorRange weed_clamping_to_avi_color_range(int clamping) {
695 switch (clamping) {
697 return AVCOL_RANGE_MPEG;
699 return AVCOL_RANGE_JPEG;
700 }
701 return AVCOL_RANGE_NB;
702 }
703
704#ifndef AVUTIL_PIXFMT_H
705
706static 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:
721 case PIX_FMT_YUVA444P:
723 case PIX_FMT_YUV422P:
725 case PIX_FMT_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;
741 case PIX_FMT_YUVJ444P:
742 if (clamped) *clamped = WEED_YUV_CLAMPING_UNCLAMPED;
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;
750
751 default:
752 return WEED_PALETTE_END;
753 }
754}
755
756static inline enum PixelFormat weed_palette_to_avi_pix_fmt(int pal, int *clamped) {
757 switch (pal) {
759 return PIX_FMT_RGB24;
761 return PIX_FMT_BGR24;
763 return PIX_FMT_RGBA;
765 return PIX_FMT_BGRA;
767 return PIX_FMT_ARGB;
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;
777 if (clamped && *clamped == WEED_YUV_CLAMPING_UNCLAMPED)
778 return PIX_FMT_YUVJ422P;
779 return PIX_FMT_YUV422P;
781 if (clamped && *clamped == WEED_YUV_CLAMPING_UNCLAMPED)
782 return PIX_FMT_YUVJ420P;
783 return PIX_FMT_YUV420P;
785 return PIX_FMT_YUYV422;
787 return PIX_FMT_UYVY422;
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
803static 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:
818 case AV_PIX_FMT_YUVA444P:
820 case AV_PIX_FMT_YUV422P:
822 case AV_PIX_FMT_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;
838 case AV_PIX_FMT_YUVJ444P:
839 if (clamped) *clamped = WEED_YUV_CLAMPING_UNCLAMPED;
841 case AV_PIX_FMT_YUVJ420P:
842 if (clamped) *clamped = WEED_YUV_CLAMPING_UNCLAMPED;
844
845 default:
846 return WEED_PALETTE_END;
847 }
848}
849
850static inline enum AVPixelFormat weed_palette_to_avi_pix_fmt(int pal, int *clamped) {
851 switch (pal) {
853 return AV_PIX_FMT_RGB24;
855 return AV_PIX_FMT_BGR24;
857 return AV_PIX_FMT_RGBA;
859 return AV_PIX_FMT_BGRA;
861 return AV_PIX_FMT_ARGB;
863 if (clamped && *clamped == WEED_YUV_CLAMPING_UNCLAMPED)
864 return AV_PIX_FMT_YUVJ444P;
865 return AV_PIX_FMT_YUV444P;
867 return AV_PIX_FMT_YUVA444P;
869 if (clamped && *clamped == WEED_YUV_CLAMPING_UNCLAMPED)
870 return AV_PIX_FMT_YUVJ422P;
871 return AV_PIX_FMT_YUV422P;
873 if (clamped && *clamped == WEED_YUV_CLAMPING_UNCLAMPED)
874 return AV_PIX_FMT_YUVJ420P;
875 return AV_PIX_FMT_YUV420P;
877 return AV_PIX_FMT_YUYV422;
879 return AV_PIX_FMT_UYVY422;
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
895static 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
909static 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;
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
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
1032static 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
1039static 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
1046static 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__
#define WEED_GAMMA_BT709
Definition: weed-palettes.h:130
#define WEED_YUV_SUBSPACE_YCBCR
Definition: weed-palettes.h:119
#define WEED_GAMMA_UNKNOWN
Definition: weed-palettes.h:127
#define WEED_PALETTE_YUV411
Definition: weed-palettes.h:89
#define WEED_YUV_CLAMPING_UNCLAMPED
Definition: weed-palettes.h:112
#define WEED_PALETTE_RGB24
Definition: weed-palettes.h:42
#define WEED_PALETTE_YVU420P
Definition: weed-palettes.h:62
#define WEED_PALETTE_YUV420P
Definition: weed-palettes.h:58
#define WEED_GAMMA_LINEAR
Definition: weed-palettes.h:128
#define WEED_PALETTE_YUV444P
Definition: weed-palettes.h:68
#define WEED_PALETTE_A8
Definition: weed-palettes.h:93
#define WEED_PALETTE_END
Definition: weed-palettes.h:41
#define WEED_GAMMA_SRGB
Definition: weed-palettes.h:129
#define WEED_PALETTE_A1
Definition: weed-palettes.h:94
#define WEED_YUV_SAMPLING_DEFAULT
Definition: weed-palettes.h:101
#define WEED_PALETTE_YUV888
Definition: weed-palettes.h:84
#define WEED_PALETTE_YUV422P
Definition: weed-palettes.h:65
#define WEED_YUV_SUBSPACE_BT709
Definition: weed-palettes.h:120
#define WEED_YUV_CLAMPING_CLAMPED
Definition: weed-palettes.h:110
#define WEED_PALETTE_RGBA32
Definition: weed-palettes.h:46
#define WEED_PALETTE_BGRA32
Definition: weed-palettes.h:48
#define WEED_PALETTE_YUYV
Definition: weed-palettes.h:79
#define WEED_PALETTE_ARGB32
Definition: weed-palettes.h:50
#define WEED_PALETTE_UYVY
Definition: weed-palettes.h:73
#define WEED_PALETTE_YUVA4444P
Definition: weed-palettes.h:70
#define WEED_PALETTE_BGR24
Definition: weed-palettes.h:44