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
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 
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 
682 static 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 
694 static 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 
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 
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;
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;
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 
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 
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;
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;
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 
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 
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
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 
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 
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 
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__
WEED_YUV_SUBSPACE_YCBCR
#define WEED_YUV_SUBSPACE_YCBCR
Definition: weed-palettes.h:119
WEED_PALETTE_YUV411
#define WEED_PALETTE_YUV411
Definition: weed-palettes.h:89
WEED_PALETTE_A8
#define WEED_PALETTE_A8
Definition: weed-palettes.h:93
WEED_PALETTE_A1
#define WEED_PALETTE_A1
Definition: weed-palettes.h:94
WEED_YUV_CLAMPING_CLAMPED
#define WEED_YUV_CLAMPING_CLAMPED
Definition: weed-palettes.h:110
WEED_PALETTE_YUV888
#define WEED_PALETTE_YUV888
Definition: weed-palettes.h:84
WEED_PALETTE_UYVY
#define WEED_PALETTE_UYVY
Definition: weed-palettes.h:73
WEED_PALETTE_YUV420P
#define WEED_PALETTE_YUV420P
Definition: weed-palettes.h:58
WEED_YUV_SUBSPACE_BT709
#define WEED_YUV_SUBSPACE_BT709
Definition: weed-palettes.h:120
WEED_PALETTE_BGRA32
#define WEED_PALETTE_BGRA32
Definition: weed-palettes.h:48
WEED_PALETTE_RGBA32
#define WEED_PALETTE_RGBA32
Definition: weed-palettes.h:46
WEED_YUV_CLAMPING_UNCLAMPED
#define WEED_YUV_CLAMPING_UNCLAMPED
Definition: weed-palettes.h:112
WEED_GAMMA_SRGB
#define WEED_GAMMA_SRGB
Definition: weed-palettes.h:129
weed-palettes.h
WEED_PALETTE_YUV444P
#define WEED_PALETTE_YUV444P
Definition: weed-palettes.h:68
WEED_GAMMA_UNKNOWN
#define WEED_GAMMA_UNKNOWN
Definition: weed-palettes.h:127
WEED_PALETTE_ARGB32
#define WEED_PALETTE_ARGB32
Definition: weed-palettes.h:50
WEED_PALETTE_END
#define WEED_PALETTE_END
Definition: weed-palettes.h:41
WEED_PALETTE_YUV422P
#define WEED_PALETTE_YUV422P
Definition: weed-palettes.h:65
WEED_PALETTE_BGR24
#define WEED_PALETTE_BGR24
Definition: weed-palettes.h:44
WEED_PALETTE_YUVA4444P
#define WEED_PALETTE_YUVA4444P
Definition: weed-palettes.h:70
WEED_GAMMA_BT709
#define WEED_GAMMA_BT709
Definition: weed-palettes.h:130
WEED_YUV_SAMPLING_DEFAULT
#define WEED_YUV_SAMPLING_DEFAULT
Definition: weed-palettes.h:101
WEED_PALETTE_YUYV
#define WEED_PALETTE_YUYV
Definition: weed-palettes.h:79
WEED_GAMMA_LINEAR
#define WEED_GAMMA_LINEAR
Definition: weed-palettes.h:128
WEED_PALETTE_YVU420P
#define WEED_PALETTE_YVU420P
Definition: weed-palettes.h:62
WEED_PALETTE_RGB24
#define WEED_PALETTE_RGB24
Definition: weed-palettes.h:42