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