Fix T53012: Shadow catcher creates artifacts on contact area
[blender.git] / intern / ffmpeg / ffmpeg_compat.h
1 /*
2  * compatibility macros to make every ffmpeg installation appear
3  * like the most current installation (wrapping some functionality sometimes)
4  * it also includes all ffmpeg header files at once, no need to do it 
5  * separately.
6  *
7  * Copyright (c) 2011 Peter Schlaile
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  */
20
21 #ifndef __FFMPEG_COMPAT_H__
22 #define __FFMPEG_COMPAT_H__
23
24 #include <libavformat/avformat.h>
25
26 /* check our ffmpeg is new enough, avoids user complaints */
27 #if (LIBAVFORMAT_VERSION_MAJOR < 52) || ((LIBAVFORMAT_VERSION_MAJOR == 52) && (LIBAVFORMAT_VERSION_MINOR <= 64))
28 #  error "FFmpeg 0.7 or newer is needed, Upgrade your FFmpeg or disable it"
29 #endif
30 /* end sanity check */
31
32 /* visual studio 2012 does not define inline for C */
33 #ifdef _MSC_VER
34 #  define FFMPEG_INLINE static __inline
35 #else
36 #  define FFMPEG_INLINE static inline
37 #endif
38
39 #include <libavcodec/avcodec.h>
40 #include <libavutil/rational.h>
41 #include <libavutil/opt.h>
42 #include <libavutil/mathematics.h>
43
44 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101))
45 #  define FFMPEG_HAVE_PARSE_UTILS 1
46 #  include <libavutil/parseutils.h>
47 #endif
48
49 #include <libswscale/swscale.h>
50
51 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 105))
52 #  define FFMPEG_HAVE_AVIO 1
53 #endif
54
55 #if (LIBAVCODEC_VERSION_MAJOR > 53) || ((LIBAVCODEC_VERSION_MAJOR == 53) && (LIBAVCODEC_VERSION_MINOR > 1)) || ((LIBAVCODEC_VERSION_MAJOR == 53) && (LIBAVCODEC_VERSION_MINOR == 1) && (LIBAVCODEC_VERSION_MICRO >= 1)) || ((LIBAVCODEC_VERSION_MAJOR == 52) && (LIBAVCODEC_VERSION_MINOR >= 121))
56 #  define FFMPEG_HAVE_DEFAULT_VAL_UNION 1
57 #endif
58
59 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101))
60 #  define FFMPEG_HAVE_AV_DUMP_FORMAT 1
61 #endif
62
63 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 45))
64 #  define FFMPEG_HAVE_AV_GUESS_FORMAT 1
65 #endif
66
67 #if (LIBAVCODEC_VERSION_MAJOR > 52) || ((LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 23))
68 #  define FFMPEG_HAVE_DECODE_AUDIO3 1
69 #  define FFMPEG_HAVE_DECODE_VIDEO2 1
70 #endif
71
72 #if (LIBAVCODEC_VERSION_MAJOR > 52) || ((LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 64))
73 #  define FFMPEG_HAVE_AVMEDIA_TYPES 1
74 #endif
75
76 #if ((LIBAVCODEC_VERSION_MAJOR > 52) || (LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 29)) && \
77         ((LIBSWSCALE_VERSION_MAJOR > 0) || (LIBSWSCALE_VERSION_MAJOR >= 0) && (LIBSWSCALE_VERSION_MINOR >= 10))
78 #  define FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT
79 #endif
80
81 #if ((LIBAVCODEC_VERSION_MAJOR > 54) || (LIBAVCODEC_VERSION_MAJOR >= 54) && (LIBAVCODEC_VERSION_MINOR > 14))
82 #  define FFMPEG_HAVE_CANON_H264_RESOLUTION_FIX
83 #endif
84
85 #if ((LIBAVCODEC_VERSION_MAJOR > 53) || (LIBAVCODEC_VERSION_MAJOR >= 53) && (LIBAVCODEC_VERSION_MINOR >= 60))
86 #  define FFMPEG_HAVE_ENCODE_AUDIO2
87 #endif
88
89 #if ((LIBAVCODEC_VERSION_MAJOR > 53) || (LIBAVCODEC_VERSION_MAJOR >= 53) && (LIBAVCODEC_VERSION_MINOR >= 42))
90 #  define FFMPEG_HAVE_DECODE_AUDIO4
91 #endif
92
93 #if ((LIBAVCODEC_VERSION_MAJOR > 54) || (LIBAVCODEC_VERSION_MAJOR >= 54) && (LIBAVCODEC_VERSION_MINOR >= 13))
94 #  define FFMPEG_HAVE_AVFRAME_SAMPLE_RATE
95 #endif
96
97 #if ((LIBAVUTIL_VERSION_MAJOR > 51) || (LIBAVUTIL_VERSION_MAJOR == 51) && (LIBAVUTIL_VERSION_MINOR >= 21))
98 #  define FFMPEG_FFV1_ALPHA_SUPPORTED
99 #  define FFMPEG_SAMPLE_FMT_S16P_SUPPORTED
100 #else
101
102 FFMPEG_INLINE
103 int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt)
104 {
105         /* no planar formats in FFmpeg < 0.9 */
106         (void) sample_fmt;
107         return 0;
108 }
109
110 #endif
111
112 /* FFmpeg upstream 1.0 is the first who added AV_ prefix. */
113 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(54, 59, 100)
114 #  define AV_CODEC_ID_NONE CODEC_ID_NONE
115 #  define AV_CODEC_ID_MPEG4 CODEC_ID_MPEG4
116 #  define AV_CODEC_ID_MJPEG CODEC_ID_MJPEG
117 #  define AV_CODEC_ID_DNXHD CODEC_ID_DNXHD
118 #  define AV_CODEC_ID_MPEG2VIDEO CODEC_ID_MPEG2VIDEO
119 #  define AV_CODEC_ID_MPEG1VIDEO CODEC_ID_MPEG1VIDEO
120 #  define AV_CODEC_ID_DVVIDEO CODEC_ID_DVVIDEO
121 #  define AV_CODEC_ID_THEORA CODEC_ID_THEORA
122 #  define AV_CODEC_ID_PNG CODEC_ID_PNG
123 #  define AV_CODEC_ID_QTRLE CODEC_ID_QTRLE
124 #  define AV_CODEC_ID_FFV1 CODEC_ID_FFV1
125 #  define AV_CODEC_ID_HUFFYUV CODEC_ID_HUFFYUV
126 #  define AV_CODEC_ID_H264 CODEC_ID_H264
127 #  define AV_CODEC_ID_FLV1 CODEC_ID_FLV1
128
129 #  define AV_CODEC_ID_AAC CODEC_ID_AAC
130 #  define AV_CODEC_ID_AC3 CODEC_ID_AC3
131 #  define AV_CODEC_ID_MP3 CODEC_ID_MP3
132 #  define AV_CODEC_ID_MP2 CODEC_ID_MP2
133 #  define AV_CODEC_ID_FLAC CODEC_ID_FLAC
134 #  define AV_CODEC_ID_PCM_U8 CODEC_ID_PCM_U8
135 #  define AV_CODEC_ID_PCM_S16LE CODEC_ID_PCM_S16LE
136 #  define AV_CODEC_ID_PCM_S24LE CODEC_ID_PCM_S24LE
137 #  define AV_CODEC_ID_PCM_S32LE CODEC_ID_PCM_S32LE
138 #  define AV_CODEC_ID_PCM_F32LE CODEC_ID_PCM_F32LE
139 #  define AV_CODEC_ID_PCM_F64LE CODEC_ID_PCM_F64LE
140 #  define AV_CODEC_ID_VORBIS CODEC_ID_VORBIS
141 #endif
142
143 FFMPEG_INLINE
144 int av_get_cropped_height_from_codec(AVCodecContext *pCodecCtx)
145 {
146         int y = pCodecCtx->height;
147
148 #ifndef FFMPEG_HAVE_CANON_H264_RESOLUTION_FIX
149 /* really bad hack to remove this dreadfull black bar at the bottom
150    with Canon footage and old ffmpeg versions.
151    (to fix this properly in older ffmpeg versions one has to write a new
152    demuxer...) 
153            
154    see the actual fix here for reference:
155
156    http://git.libav.org/?p=libav.git;a=commit;h=30f515091c323da59c0f1b533703dedca2f4b95d
157
158    We do our best to apply this only to matching footage.
159 */
160         if (pCodecCtx->width == 1920 && 
161             pCodecCtx->height == 1088 &&
162             pCodecCtx->pix_fmt == PIX_FMT_YUVJ420P &&
163             pCodecCtx->codec_id == AV_CODEC_ID_H264 ) {
164                 y = 1080;
165         }
166 #endif
167
168         return y;
169 }
170
171 #if ((LIBAVUTIL_VERSION_MAJOR < 51) || (LIBAVUTIL_VERSION_MAJOR == 51) && (LIBAVUTIL_VERSION_MINOR < 22))
172 FFMPEG_INLINE
173 int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
174 {
175         const AVOption *rv = NULL;
176         (void) search_flags;
177         av_set_string3(obj, name, val, 1, &rv);
178         return rv != NULL;
179 }
180
181 FFMPEG_INLINE
182 int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
183 {
184         const AVOption *rv = NULL;
185         (void) search_flags;
186         rv = av_set_int(obj, name, val);
187         return rv != NULL;
188 }
189
190 FFMPEG_INLINE
191 int av_opt_set_double(void *obj, const char *name, double val, int search_flags)
192 {
193         const AVOption *rv = NULL;
194         (void) search_flags;
195         rv = av_set_double(obj, name, val);
196         return rv != NULL;
197 }
198
199 #  define AV_OPT_TYPE_INT     FF_OPT_TYPE_INT
200 #  define AV_OPT_TYPE_INT64   FF_OPT_TYPE_INT64
201 #  define AV_OPT_TYPE_STRING  FF_OPT_TYPE_STRING
202 #  define AV_OPT_TYPE_CONST   FF_OPT_TYPE_CONST
203 #  define AV_OPT_TYPE_DOUBLE  FF_OPT_TYPE_DOUBLE
204 #  define AV_OPT_TYPE_FLOAT   FF_OPT_TYPE_FLOAT
205 #endif
206
207 #if ((LIBAVUTIL_VERSION_MAJOR < 51) || (LIBAVUTIL_VERSION_MAJOR == 51) && (LIBAVUTIL_VERSION_MINOR < 54))
208 FFMPEG_INLINE
209 enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt)
210 {
211     if (sample_fmt < 0 || sample_fmt >= AV_SAMPLE_FMT_NB)
212         return AV_SAMPLE_FMT_NONE;
213     return sample_fmt;
214 }
215 #endif
216
217 #if ((LIBAVCODEC_VERSION_MAJOR < 53) || (LIBAVCODEC_VERSION_MAJOR == 53 && LIBAVCODEC_VERSION_MINOR < 35))
218 FFMPEG_INLINE
219 int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)
220 {
221         /* TODO: no options are taking into account */
222         (void) options;
223         return avcodec_open(avctx, codec);
224 }
225 #endif
226
227 #if ((LIBAVFORMAT_VERSION_MAJOR < 53) || (LIBAVFORMAT_VERSION_MAJOR == 53 && LIBAVFORMAT_VERSION_MINOR < 21))
228 FFMPEG_INLINE
229 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
230 {
231         /* TODO: no codec is taking into account */
232         (void) c;
233         return av_new_stream(s, 0);
234 }
235
236 FFMPEG_INLINE
237 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
238 {
239         /* TODO: no options are taking into account */
240         (void) options;
241         return av_find_stream_info(ic);
242 }
243 #endif
244
245 #if ((LIBAVFORMAT_VERSION_MAJOR > 53) || ((LIBAVFORMAT_VERSION_MAJOR == 53) && (LIBAVFORMAT_VERSION_MINOR > 32)) || ((LIBAVFORMAT_VERSION_MAJOR == 53) && (LIBAVFORMAT_VERSION_MINOR == 24) && (LIBAVFORMAT_VERSION_MICRO >= 100)))
246 FFMPEG_INLINE
247 void my_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
248 {
249         int i;
250
251         for (i = 0; i < s->nb_streams; i++) {
252                 AVStream *st = s->streams[i];
253
254                 st->cur_dts = av_rescale(timestamp,
255                                          st->time_base.den * (int64_t)ref_st->time_base.num,
256                                          st->time_base.num * (int64_t)ref_st->time_base.den);
257         }
258 }
259
260 FFMPEG_INLINE
261 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
262 {
263         my_update_cur_dts(s, ref_st, timestamp);
264 }
265 #endif
266
267 #if ((LIBAVCODEC_VERSION_MAJOR < 54) || (LIBAVCODEC_VERSION_MAJOR == 54 && LIBAVCODEC_VERSION_MINOR < 28))
268 FFMPEG_INLINE
269 void avcodec_free_frame(AVFrame **frame)
270 {
271         /* don't need to do anything with old AVFrame
272          * since it does not have malloced members */
273         (void)frame;
274 }
275 #endif
276
277 #if ((LIBAVCODEC_VERSION_MAJOR > 54) || (LIBAVCODEC_VERSION_MAJOR >= 54) && (LIBAVCODEC_VERSION_MINOR >= 13))
278 #  define FFMPEG_HAVE_AVFRAME_SAMPLE_RATE
279 #endif
280
281 #if ((LIBAVCODEC_VERSION_MAJOR > 54) || (LIBAVCODEC_VERSION_MAJOR == 54 && LIBAVCODEC_VERSION_MINOR >= 13))
282 #  define FFMPEG_HAVE_FRAME_CHANNEL_LAYOUT
283 #endif
284
285 #ifndef FFMPEG_HAVE_AVIO
286 #  define AVIO_FLAG_WRITE URL_WRONLY
287 #  define avio_open url_fopen
288 #  define avio_tell url_ftell
289 #  define avio_close url_fclose
290 #  define avio_size url_fsize
291 #endif
292
293 /* there are some version inbetween, which have avio_... functions but no
294  * AVIO_FLAG_... */
295 #ifndef AVIO_FLAG_WRITE
296 #  define AVIO_FLAG_WRITE URL_WRONLY
297 #endif
298
299 #ifndef AV_PKT_FLAG_KEY
300 #  define AV_PKT_FLAG_KEY PKT_FLAG_KEY
301 #endif
302
303 #ifndef FFMPEG_HAVE_AV_DUMP_FORMAT
304 #  define av_dump_format dump_format
305 #endif
306
307 #ifndef FFMPEG_HAVE_AV_GUESS_FORMAT
308 #  define av_guess_format guess_format
309 #endif
310
311 #ifndef FFMPEG_HAVE_PARSE_UTILS
312 #  define av_parse_video_rate av_parse_video_frame_rate
313 #endif
314
315 #ifdef FFMPEG_HAVE_DEFAULT_VAL_UNION
316 #  define FFMPEG_DEF_OPT_VAL_INT(OPT) OPT->default_val.i64
317 #  define FFMPEG_DEF_OPT_VAL_DOUBLE(OPT) OPT->default_val.dbl
318 #else
319 #  define FFMPEG_DEF_OPT_VAL_INT(OPT) OPT->default_val
320 #  define FFMPEG_DEF_OPT_VAL_DOUBLE(OPT) OPT->default_val
321 #endif
322
323 #ifndef FFMPEG_HAVE_AVMEDIA_TYPES
324 #  define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
325 #  define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO
326 #endif
327
328 #ifndef FFMPEG_HAVE_DECODE_AUDIO3
329 FFMPEG_INLINE 
330 int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
331                           int *frame_size_ptr, AVPacket *avpkt)
332 {
333         return avcodec_decode_audio2(avctx, samples,
334                                      frame_size_ptr, avpkt->data,
335                                      avpkt->size);
336 }
337 #endif
338
339 #ifndef FFMPEG_HAVE_DECODE_VIDEO2
340 FFMPEG_INLINE
341 int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
342                          int *got_picture_ptr,
343                          AVPacket *avpkt)
344 {
345         return avcodec_decode_video(avctx, picture, got_picture_ptr,
346                                     avpkt->data, avpkt->size);
347 }
348 #endif
349
350 FFMPEG_INLINE
351 int64_t av_get_pts_from_frame(AVFormatContext *avctx, AVFrame * picture)
352 {
353         int64_t pts;
354 #if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(55, 34, 100)
355         pts = picture->pts;
356 #else
357         pts = picture->pkt_pts;
358 #endif
359
360         if (pts == AV_NOPTS_VALUE) {
361                 pts = picture->pkt_dts;
362         }
363         if (pts == AV_NOPTS_VALUE) {
364                 pts = 0;
365         }
366
367         (void)avctx;
368         return pts;
369 }
370
371 /* obsolete constant formerly defined in FFMpeg libavcodec/avcodec.h */
372 #ifndef AVCODEC_MAX_AUDIO_FRAME_SIZE
373 #  define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
374 #endif
375
376 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(54, 1, 0)
377 FFMPEG_INLINE
378 int avcodec_encode_video2(AVCodecContext *avctx, AVPacket *pkt,
379                           const AVFrame *frame, int *got_output)
380 {
381         int outsize, ret;
382
383         ret = av_new_packet(pkt, avctx->width * avctx->height * 7 + 10000);
384         if (ret < 0)
385                 return ret;
386
387         outsize = avcodec_encode_video(avctx, pkt->data, pkt->size, frame);
388         if (outsize <= 0) {
389                 *got_output = 0;
390                 av_free_packet(pkt);
391         }
392         else {
393                 *got_output = 1;
394                 av_shrink_packet(pkt, outsize);
395                 if (avctx->coded_frame) {
396                         pkt->pts = avctx->coded_frame->pts;
397                         if (avctx->coded_frame->key_frame)
398                                 pkt->flags |= AV_PKT_FLAG_KEY;
399                 }
400         }
401
402         return outsize >= 0 ? 0 : outsize;
403 }
404
405 #endif
406
407 #if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(53, 17, 0)
408 FFMPEG_INLINE
409 void avformat_close_input(AVFormatContext **ctx)
410 {
411     av_close_input_file(*ctx);
412     *ctx = NULL;
413 }
414 #endif
415
416 #if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(52, 8, 0)
417 FFMPEG_INLINE
418 AVFrame *av_frame_alloc(void)
419 {
420     return avcodec_alloc_frame();
421 }
422
423 FFMPEG_INLINE
424 void av_frame_free(AVFrame **frame)
425 {
426     av_freep(frame);
427 }
428 #endif
429
430 FFMPEG_INLINE
431 AVRational av_get_r_frame_rate_compat(const AVStream *stream)
432 {
433 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(54, 23, 1)
434         /* For until r_frame_rate was deprecated use it. */
435         return stream->r_frame_rate;
436 #else
437         return stream->avg_frame_rate;
438 #endif
439 }
440
441 #if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(51, 32, 0)
442 #  define AV_OPT_SEARCH_FAKE_OBJ 0
443 #endif
444
445 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(54, 59, 100)
446 #  define FFMPEG_HAVE_DEPRECATED_FLAGS2
447 #endif
448
449 /* Since FFmpeg-1.1 this constant have AV_ prefix. */
450 #if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(52, 3, 100)
451 #  define AV_PIX_FMT_BGR32 PIX_FMT_BGR32
452 #  define AV_PIX_FMT_YUV422P PIX_FMT_YUV422P
453 #  define AV_PIX_FMT_BGRA PIX_FMT_BGRA
454 #  define AV_PIX_FMT_ARGB PIX_FMT_ARGB
455 #  define AV_PIX_FMT_RGBA PIX_FMT_RGBA
456 #endif
457
458 /* New API from FFmpeg-2.0 which soon became recommended one. */
459 #if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(52, 38, 100)
460 #  define av_frame_alloc avcodec_alloc_frame
461 #  define av_frame_free avcodec_free_frame
462 #  define av_frame_unref avcodec_get_frame_defaults
463 #endif
464
465 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 24, 102)
466
467 /* NOTE: The code in this block are from FFmpeg 2.6.4, which is licensed by LGPL. */
468
469 #define MAX_NEG_CROP 1024
470
471 #define times4(x) x, x, x, x
472 #define times256(x) times4(times4(times4(times4(times4(x)))))
473
474 static const uint8_t ff_compat_crop_tab[256 + 2 * MAX_NEG_CROP] = {
475 times256(0x00),
476 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
477 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
478 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
479 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
480 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
481 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
482 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
483 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
484 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
485 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
486 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
487 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
488 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
489 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
490 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
491 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
492 times256(0xFF)
493 };
494
495 #undef times4
496 #undef times256
497
498 /* filter parameters: [-1 4 2 4 -1] // 8 */
499 FFMPEG_INLINE
500 void deinterlace_line(uint8_t *dst,
501                       const uint8_t *lum_m4, const uint8_t *lum_m3,
502                       const uint8_t *lum_m2, const uint8_t *lum_m1,
503                       const uint8_t *lum,
504                       int size)
505 {
506         const uint8_t *cm = ff_compat_crop_tab + MAX_NEG_CROP;
507         int sum;
508
509         for(;size > 0;size--) {
510                 sum = -lum_m4[0];
511                 sum += lum_m3[0] << 2;
512                 sum += lum_m2[0] << 1;
513                 sum += lum_m1[0] << 2;
514                 sum += -lum[0];
515                 dst[0] = cm[(sum + 4) >> 3];
516                 lum_m4++;
517                 lum_m3++;
518                 lum_m2++;
519                 lum_m1++;
520                 lum++;
521                 dst++;
522         }
523 }
524
525 FFMPEG_INLINE
526 void deinterlace_line_inplace(uint8_t *lum_m4, uint8_t *lum_m3,
527                               uint8_t *lum_m2, uint8_t *lum_m1,
528                               uint8_t *lum, int size)
529 {
530         const uint8_t *cm = ff_compat_crop_tab + MAX_NEG_CROP;
531         int sum;
532
533         for(;size > 0;size--) {
534                 sum = -lum_m4[0];
535                 sum += lum_m3[0] << 2;
536                 sum += lum_m2[0] << 1;
537                 lum_m4[0]=lum_m2[0];
538                 sum += lum_m1[0] << 2;
539                 sum += -lum[0];
540                 lum_m2[0] = cm[(sum + 4) >> 3];
541                 lum_m4++;
542                 lum_m3++;
543                 lum_m2++;
544                 lum_m1++;
545                 lum++;
546         }
547 }
548
549 /* deinterlacing : 2 temporal taps, 3 spatial taps linear filter. The
550    top field is copied as is, but the bottom field is deinterlaced
551    against the top field. */
552 FFMPEG_INLINE
553 void deinterlace_bottom_field(uint8_t *dst, int dst_wrap,
554                               const uint8_t *src1, int src_wrap,
555                               int width, int height)
556 {
557         const uint8_t *src_m2, *src_m1, *src_0, *src_p1, *src_p2;
558         int y;
559
560         src_m2 = src1;
561         src_m1 = src1;
562         src_0=&src_m1[src_wrap];
563         src_p1=&src_0[src_wrap];
564         src_p2=&src_p1[src_wrap];
565         for(y=0;y<(height-2);y+=2) {
566                 memcpy(dst,src_m1,width);
567                 dst += dst_wrap;
568                 deinterlace_line(dst,src_m2,src_m1,src_0,src_p1,src_p2,width);
569                 src_m2 = src_0;
570                 src_m1 = src_p1;
571                 src_0 = src_p2;
572                 src_p1 += 2*src_wrap;
573                 src_p2 += 2*src_wrap;
574                 dst += dst_wrap;
575         }
576         memcpy(dst,src_m1,width);
577         dst += dst_wrap;
578         /* do last line */
579         deinterlace_line(dst,src_m2,src_m1,src_0,src_0,src_0,width);
580 }
581
582 FFMPEG_INLINE
583 int deinterlace_bottom_field_inplace(uint8_t *src1, int src_wrap,
584                                      int width, int height)
585 {
586         uint8_t *src_m1, *src_0, *src_p1, *src_p2;
587         int y;
588         uint8_t *buf = (uint8_t *)av_malloc(width);
589         if (!buf)
590                 return AVERROR(ENOMEM);
591
592         src_m1 = src1;
593         memcpy(buf,src_m1,width);
594         src_0=&src_m1[src_wrap];
595         src_p1=&src_0[src_wrap];
596         src_p2=&src_p1[src_wrap];
597         for(y=0;y<(height-2);y+=2) {
598                 deinterlace_line_inplace(buf,src_m1,src_0,src_p1,src_p2,width);
599                 src_m1 = src_p1;
600                 src_0 = src_p2;
601                 src_p1 += 2*src_wrap;
602                 src_p2 += 2*src_wrap;
603         }
604         /* do last line */
605         deinterlace_line_inplace(buf,src_m1,src_0,src_0,src_0,width);
606         av_free(buf);
607         return 0;
608 }
609
610 #ifdef __GNUC__
611 #  pragma GCC diagnostic push
612 #  pragma GCC diagnostic ignored "-Wdeprecated-declarations"
613 #endif
614
615 FFMPEG_INLINE
616 int avpicture_deinterlace(AVPicture *dst, const AVPicture *src,
617                           enum AVPixelFormat pix_fmt, int width, int height)
618 {
619         int i, ret;
620
621         if (pix_fmt != AV_PIX_FMT_YUV420P &&
622             pix_fmt != AV_PIX_FMT_YUVJ420P &&
623             pix_fmt != AV_PIX_FMT_YUV422P &&
624             pix_fmt != AV_PIX_FMT_YUVJ422P &&
625             pix_fmt != AV_PIX_FMT_YUV444P &&
626             pix_fmt != AV_PIX_FMT_YUV411P &&
627             pix_fmt != AV_PIX_FMT_GRAY8)
628                 return -1;
629         if ((width & 3) != 0 || (height & 3) != 0)
630                 return -1;
631
632         for(i=0;i<3;i++) {
633                 if (i == 1) {
634                         switch(pix_fmt) {
635                         case AV_PIX_FMT_YUVJ420P:
636                         case AV_PIX_FMT_YUV420P:
637                                 width >>= 1;
638                                 height >>= 1;
639                                 break;
640                         case AV_PIX_FMT_YUV422P:
641                         case AV_PIX_FMT_YUVJ422P:
642                                 width >>= 1;
643                                 break;
644                         case AV_PIX_FMT_YUV411P:
645                                 width >>= 2;
646                                 break;
647                         default:
648                                 break;
649                         }
650                         if (pix_fmt == AV_PIX_FMT_GRAY8) {
651                                 break;
652                         }
653                 }
654                 if (src == dst) {
655                         ret = deinterlace_bottom_field_inplace(dst->data[i],
656                                                                dst->linesize[i],
657                                                                width, height);
658                         if (ret < 0)
659                                 return ret;
660                 } else {
661                         deinterlace_bottom_field(dst->data[i],dst->linesize[i],
662                                                  src->data[i], src->linesize[i],
663                                                  width, height);
664                 }
665         }
666         return 0;
667 }
668
669 #ifdef __GNUC__
670 #  pragma GCC diagnostic pop
671 #endif
672
673 #endif
674
675 #endif