cca5f64d9ac46372b35f99ec79fa4d8875273147
[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 ((LIBAVUTIL_VERSION_MAJOR > 51) || (LIBAVUTIL_VERSION_MAJOR == 51) && (LIBAVUTIL_VERSION_MINOR >= 21))
94 #define FFMPEG_FFV1_ALPHA_SUPPORTED
95 #define FFMPEG_SAMPLE_FMT_S16P_SUPPORTED
96 #else
97
98 FFMPEG_INLINE
99 int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt)
100 {
101         /* no planar formats in FFmpeg < 0.9 */
102         return 0;
103 }
104
105 #endif
106
107 FFMPEG_INLINE
108 int av_get_cropped_height_from_codec(AVCodecContext *pCodecCtx)
109 {
110         int y = pCodecCtx->height;
111
112 #ifndef FFMPEG_HAVE_CANON_H264_RESOLUTION_FIX
113 /* really bad hack to remove this dreadfull black bar at the bottom
114    with Canon footage and old ffmpeg versions.
115    (to fix this properly in older ffmpeg versions one has to write a new
116    demuxer...) 
117            
118    see the actual fix here for reference:
119
120    http://git.libav.org/?p=libav.git;a=commit;h=30f515091c323da59c0f1b533703dedca2f4b95d
121
122    We do our best to apply this only to matching footage.
123 */
124         if (pCodecCtx->width == 1920 && 
125             pCodecCtx->height == 1088 &&
126             pCodecCtx->pix_fmt == PIX_FMT_YUVJ420P &&
127             pCodecCtx->codec_id == CODEC_ID_H264 ) {
128                 y = 1080;
129         }
130 #endif
131
132         return y;
133 }
134
135 #if ((LIBAVUTIL_VERSION_MAJOR < 51) || (LIBAVUTIL_VERSION_MAJOR == 51) && (LIBAVUTIL_VERSION_MINOR < 22))
136 FFMPEG_INLINE
137 int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
138 {
139         const AVOption *rv = NULL;
140         av_set_string3(obj, name, val, 1, &rv);
141         return rv != NULL;
142 }
143
144 FFMPEG_INLINE
145 int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
146 {
147         const AVOption *rv = NULL;
148         rv = av_set_int(obj, name, val);
149         return rv != NULL;
150 }
151
152 FFMPEG_INLINE
153 int av_opt_set_double(void *obj, const char *name, double val, int search_flags)
154 {
155         const AVOption *rv = NULL;
156         rv = av_set_double(obj, name, val);
157         return rv != NULL;
158 }
159
160 #define AV_OPT_TYPE_INT     FF_OPT_TYPE_INT
161 #define AV_OPT_TYPE_INT64   FF_OPT_TYPE_INT64
162 #define AV_OPT_TYPE_STRING  FF_OPT_TYPE_STRING
163 #define AV_OPT_TYPE_CONST   FF_OPT_TYPE_CONST
164 #define AV_OPT_TYPE_DOUBLE  FF_OPT_TYPE_DOUBLE
165 #define AV_OPT_TYPE_FLOAT   FF_OPT_TYPE_FLOAT
166 #endif
167
168 #if ((LIBAVUTIL_VERSION_MAJOR < 51) || (LIBAVUTIL_VERSION_MAJOR == 51) && (LIBAVUTIL_VERSION_MINOR < 54))
169 FFMPEG_INLINE
170 enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt)
171 {
172     if (sample_fmt < 0 || sample_fmt >= AV_SAMPLE_FMT_NB)
173         return AV_SAMPLE_FMT_NONE;
174     return sample_fmt;
175 }
176 #endif
177
178 #if ((LIBAVFORMAT_VERSION_MAJOR < 53) || ((LIBAVFORMAT_VERSION_MAJOR == 53) && (LIBAVFORMAT_VERSION_MINOR < 24)) || ((LIBAVFORMAT_VERSION_MAJOR == 53) && (LIBAVFORMAT_VERSION_MINOR < 24) && (LIBAVFORMAT_VERSION_MICRO < 2)))
179 #define avformat_close_input(x) av_close_input_file(*(x))
180 #endif
181
182 #if ((LIBAVCODEC_VERSION_MAJOR < 53) || (LIBAVCODEC_VERSION_MAJOR == 53 && LIBAVCODEC_VERSION_MINOR < 35))
183 FFMPEG_INLINE
184 int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)
185 {
186         /* TODO: no options are taking into account */
187         return avcodec_open(avctx, codec);
188 }
189 #endif
190
191 #if ((LIBAVFORMAT_VERSION_MAJOR < 53) || (LIBAVFORMAT_VERSION_MAJOR == 53 && LIBAVFORMAT_VERSION_MINOR < 21))
192 FFMPEG_INLINE
193 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
194 {
195         /* TODO: no codec is taking into account */
196         return av_new_stream(s, 0);
197 }
198
199 FFMPEG_INLINE
200 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
201 {
202         /* TODO: no options are taking into account */
203         return av_find_stream_info(ic);
204 }
205 #endif
206
207 #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)))
208 FFMPEG_INLINE
209 void my_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
210 {
211         int i;
212
213         for (i = 0; i < s->nb_streams; i++) {
214                 AVStream *st = s->streams[i];
215
216                 st->cur_dts = av_rescale(timestamp,
217                                          st->time_base.den * (int64_t)ref_st->time_base.num,
218                                          st->time_base.num * (int64_t)ref_st->time_base.den);
219         }
220 }
221
222 FFMPEG_INLINE
223 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
224 {
225         my_update_cur_dts(s, ref_st, timestamp);
226 }
227 #endif
228
229 #if ((LIBAVCODEC_VERSION_MAJOR < 54) || (LIBAVCODEC_VERSION_MAJOR == 54 && LIBAVCODEC_VERSION_MINOR < 28))
230 FFMPEG_INLINE
231 void avcodec_free_frame(AVFrame **frame)
232 {
233         /* don't need to do anything with old AVFrame
234          * since it does not have malloced members */
235         (void)frame;
236 }
237 #endif
238
239 #if ((LIBAVCODEC_VERSION_MAJOR > 54) || (LIBAVCODEC_VERSION_MAJOR == 54 && LIBAVCODEC_VERSION_MINOR >= 13))
240 #define FFMPEG_HAVE_FRAME_CHANNEL_LAYOUT
241 #endif
242
243 #ifndef FFMPEG_HAVE_AVIO
244 #define AVIO_FLAG_WRITE URL_WRONLY
245 #define avio_open url_fopen
246 #define avio_tell url_ftell
247 #define avio_close url_fclose
248 #define avio_size url_fsize
249 #endif
250
251 /* there are some version inbetween, which have avio_... functions but no
252  * AVIO_FLAG_... */
253 #ifndef AVIO_FLAG_WRITE
254 #define AVIO_FLAG_WRITE URL_WRONLY
255 #endif
256
257 #ifndef AV_PKT_FLAG_KEY
258 #define AV_PKT_FLAG_KEY PKT_FLAG_KEY
259 #endif
260
261 #ifndef FFMPEG_HAVE_AV_DUMP_FORMAT
262 #define av_dump_format dump_format
263 #endif
264
265 #ifndef FFMPEG_HAVE_AV_GUESS_FORMAT
266 #define av_guess_format guess_format
267 #endif
268
269 #ifndef FFMPEG_HAVE_PARSE_UTILS
270 #define av_parse_video_rate av_parse_video_frame_rate
271 #endif
272
273 #ifdef FFMPEG_HAVE_DEFAULT_VAL_UNION
274 #define FFMPEG_DEF_OPT_VAL_INT(OPT) OPT->default_val.i64
275 #define FFMPEG_DEF_OPT_VAL_DOUBLE(OPT) OPT->default_val.dbl
276 #else
277 #define FFMPEG_DEF_OPT_VAL_INT(OPT) OPT->default_val
278 #define FFMPEG_DEF_OPT_VAL_DOUBLE(OPT) OPT->default_val
279 #endif
280
281 #ifndef FFMPEG_HAVE_AVMEDIA_TYPES
282 #define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
283 #define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO
284 #endif
285
286 #ifndef FFMPEG_HAVE_DECODE_AUDIO3
287 FFMPEG_INLINE 
288 int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
289                           int *frame_size_ptr, AVPacket *avpkt)
290 {
291         return avcodec_decode_audio2(avctx, samples,
292                                      frame_size_ptr, avpkt->data,
293                                      avpkt->size);
294 }
295 #endif
296
297 #ifndef FFMPEG_HAVE_DECODE_VIDEO2
298 FFMPEG_INLINE
299 int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
300                          int *got_picture_ptr,
301                          AVPacket *avpkt)
302 {
303         return avcodec_decode_video(avctx, picture, got_picture_ptr,
304                                     avpkt->data, avpkt->size);
305 }
306 #endif
307
308 FFMPEG_INLINE
309 int64_t av_get_pts_from_frame(AVFormatContext *avctx, AVFrame * picture)
310 {
311         int64_t pts = picture->pkt_pts;
312
313         if (pts == AV_NOPTS_VALUE) {
314                 pts = picture->pkt_dts;
315         }
316         if (pts == AV_NOPTS_VALUE) {
317                 pts = 0;
318         }
319
320         (void)avctx;
321         return pts;
322 }
323
324 /* obsolete constant formerly defined in FFMpeg libavcodec/avcodec.h */
325 #ifndef AVCODEC_MAX_AUDIO_FRAME_SIZE
326 # define AVCODEC_MAX_AUDIO_FRAME_SIZE 192000 // 1 second of 48khz 32bit audio
327 #endif
328
329 #endif