== FFMPEG / Canon DSLR footage workaround ==
[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  * seperately.
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
33 #include <libavcodec/avcodec.h>
34 #include <libavutil/rational.h>
35 #include <libavutil/opt.h>
36 #include <libavutil/mathematics.h>
37
38 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101))
39 #define FFMPEG_HAVE_PARSE_UTILS 1
40 #include <libavutil/parseutils.h>
41 #endif
42
43 #include <libswscale/swscale.h>
44
45 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 105))
46 #define FFMPEG_HAVE_AVIO 1
47 #endif
48
49 #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))
50 #define FFMPEG_HAVE_DEFAULT_VAL_UNION 1
51 #endif
52
53 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101))
54 #define FFMPEG_HAVE_AV_DUMP_FORMAT 1
55 #endif
56
57 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 45))
58 #define FFMPEG_HAVE_AV_GUESS_FORMAT 1
59 #endif
60
61 #if (LIBAVCODEC_VERSION_MAJOR > 52) || ((LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 23))
62 #define FFMPEG_HAVE_DECODE_AUDIO3 1
63 #define FFMPEG_HAVE_DECODE_VIDEO2 1
64 #endif
65
66 #if (LIBAVCODEC_VERSION_MAJOR > 52) || ((LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 64))
67 #define FFMPEG_HAVE_AVMEDIA_TYPES 1
68 #endif
69
70 #if ((LIBAVCODEC_VERSION_MAJOR > 52) || (LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 29)) && \
71         ((LIBSWSCALE_VERSION_MAJOR > 0) || (LIBSWSCALE_VERSION_MAJOR >= 0) && (LIBSWSCALE_VERSION_MINOR >= 10))
72 #define FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT
73 #endif
74
75 #if ((LIBAVCODEC_VERSION_MAJOR > 54) || (LIBAVCODEC_VERSION_MAJOR >= 54) && (LIBAVCODEC_VERSION_MINOR > 14))
76 #define FFMPEG_HAVE_CANON_H264_RESOLUTION_FIX
77 #endif
78
79 #if ((LIBAVUTIL_VERSION_MAJOR > 51) || (LIBAVUTIL_VERSION_MAJOR == 51) && (LIBAVUTIL_VERSION_MINOR >= 32))
80 #define FFMPEG_FFV1_ALPHA_SUPPORTED
81 #define FFMPEG_SAMPLE_FMT_S16P_SUPPORTED
82 #endif
83
84 static inline
85 int av_get_cropped_height_from_codec(AVCodecContext *pCodecCtx)
86 {
87         int y = pCodecCtx->height;
88
89 #ifndef FFMPEG_HAVE_CANON_H264_RESOLUTION_FIX
90 /* really bad hack to remove this dreadfull black bar at the bottom
91    with Canon footage and old ffmpeg versions.
92    (to fix this properly in older ffmpeg versions one has to write a new
93    demuxer...) 
94            
95    see the actual fix here for reference:
96
97    http://git.libav.org/?p=libav.git;a=commit;h=30f515091c323da59c0f1b533703dedca2f4b95d
98
99    We do our best to apply this only to matching footage.
100 */
101         if (pCodecCtx->width == 1920 && 
102             pCodecCtx->height == 1088 &&
103             pCodecCtx->pix_fmt == PIX_FMT_YUVJ420P &&
104             pCodecCtx->codec_id == CODEC_ID_H264 ) {
105                 y = 1080;
106         }
107 #endif
108
109         return y;
110 }
111
112 #if ((LIBAVUTIL_VERSION_MAJOR < 51) || (LIBAVUTIL_VERSION_MAJOR == 51) && (LIBAVUTIL_VERSION_MINOR < 22))
113 static inline
114 int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
115 {
116         const AVOption *rv = NULL;
117         av_set_string3(obj, name, val, 1, &rv);
118         return rv != NULL;
119 }
120
121 static inline
122 int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
123 {
124         const AVOption *rv = NULL;
125         rv = av_set_int(obj, name, val);
126         return rv != NULL;
127 }
128
129 static inline
130 int av_opt_set_double(void *obj, const char *name, double val, int search_flags)
131 {
132         const AVOption *rv = NULL;
133         rv = av_set_double(obj, name, val);
134         return rv != NULL;
135 }
136
137 #define AV_OPT_TYPE_INT     FF_OPT_TYPE_INT
138 #define AV_OPT_TYPE_INT64   FF_OPT_TYPE_INT64
139 #define AV_OPT_TYPE_STRING  FF_OPT_TYPE_STRING
140 #define AV_OPT_TYPE_CONST   FF_OPT_TYPE_CONST
141 #define AV_OPT_TYPE_DOUBLE  FF_OPT_TYPE_DOUBLE
142 #define AV_OPT_TYPE_FLOAT   FF_OPT_TYPE_FLOAT
143 #endif
144
145 #if ((LIBAVUTIL_VERSION_MAJOR < 51) || (LIBAVUTIL_VERSION_MAJOR == 51) && (LIBAVUTIL_VERSION_MINOR < 54))
146 static inline
147 enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt)
148 {
149     if (sample_fmt < 0 || sample_fmt >= AV_SAMPLE_FMT_NB)
150         return AV_SAMPLE_FMT_NONE;
151     return sample_fmt;
152 }
153 #endif
154
155 #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)))
156 #define avformat_close_input(x) av_close_input_file(*(x))
157 #endif
158
159 #if ((LIBAVCODEC_VERSION_MAJOR < 53) || (LIBAVCODEC_VERSION_MAJOR == 53 && LIBAVCODEC_VERSION_MINOR < 35))
160 static inline
161 int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)
162 {
163         /* TODO: no options are taking into account */
164         return avcodec_open(avctx, codec);
165 }
166 #endif
167
168 #if ((LIBAVFORMAT_VERSION_MAJOR < 53) || (LIBAVFORMAT_VERSION_MAJOR == 53 && LIBAVFORMAT_VERSION_MINOR < 21))
169 static inline
170 AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c)
171 {
172         /* TODO: no codec is taking into account */
173         return av_new_stream(s, 0);
174 }
175
176 static inline
177 int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
178 {
179         /* TODO: no options are taking into account */
180         return av_find_stream_info(ic);
181 }
182 #endif
183
184 #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)))
185 static inline
186 void my_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
187 {
188         int i;
189
190         for (i = 0; i < s->nb_streams; i++) {
191                 AVStream *st = s->streams[i];
192
193                 st->cur_dts = av_rescale(timestamp,
194                                          st->time_base.den * (int64_t)ref_st->time_base.num,
195                                          st->time_base.num * (int64_t)ref_st->time_base.den);
196         }
197 }
198
199 static inline
200 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
201 {
202         my_update_cur_dts(s, ref_st, timestamp);
203 }
204 #endif
205
206 #if ((LIBAVCODEC_VERSION_MAJOR < 54) || (LIBAVCODEC_VERSION_MAJOR == 54 && LIBAVCODEC_VERSION_MINOR < 28))
207 static inline
208 void avcodec_free_frame(AVFrame **frame)
209 {
210         /* don't need to do anything with old AVFrame
211          * since it does not have malloced members */
212         (void)frame;
213 }
214 #endif
215
216 #if ((LIBAVCODEC_VERSION_MAJOR > 54) || (LIBAVCODEC_VERSION_MAJOR == 54 && LIBAVCODEC_VERSION_MINOR >= 13))
217 #define FFMPEG_HAVE_FRAME_CHANNEL_LAYOUT
218 #endif
219
220 #ifndef FFMPEG_HAVE_AVIO
221 #define AVIO_FLAG_WRITE URL_WRONLY
222 #define avio_open url_fopen
223 #define avio_tell url_ftell
224 #define avio_close url_fclose
225 #define avio_size url_fsize
226 #endif
227
228 /* there are some version inbetween, which have avio_... functions but no
229  * AVIO_FLAG_... */
230 #ifndef AVIO_FLAG_WRITE
231 #define AVIO_FLAG_WRITE URL_WRONLY
232 #endif
233
234 #ifndef AV_PKT_FLAG_KEY
235 #define AV_PKT_FLAG_KEY PKT_FLAG_KEY
236 #endif
237
238 #ifndef FFMPEG_HAVE_AV_DUMP_FORMAT
239 #define av_dump_format dump_format
240 #endif
241
242 #ifndef FFMPEG_HAVE_AV_GUESS_FORMAT
243 #define av_guess_format guess_format
244 #endif
245
246 #ifndef FFMPEG_HAVE_PARSE_UTILS
247 #define av_parse_video_rate av_parse_video_frame_rate
248 #endif
249
250 #ifdef FFMPEG_HAVE_DEFAULT_VAL_UNION
251 #define FFMPEG_DEF_OPT_VAL_INT(OPT) OPT->default_val.i64
252 #define FFMPEG_DEF_OPT_VAL_DOUBLE(OPT) OPT->default_val.dbl
253 #else
254 #define FFMPEG_DEF_OPT_VAL_INT(OPT) OPT->default_val
255 #define FFMPEG_DEF_OPT_VAL_DOUBLE(OPT) OPT->default_val
256 #endif
257
258 #ifndef FFMPEG_HAVE_AVMEDIA_TYPES
259 #define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
260 #define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO
261 #endif
262
263 #ifndef FFMPEG_HAVE_DECODE_AUDIO3
264 static inline 
265 int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
266                           int *frame_size_ptr, AVPacket *avpkt)
267 {
268         return avcodec_decode_audio2(avctx, samples,
269                                      frame_size_ptr, avpkt->data,
270                                      avpkt->size);
271 }
272 #endif
273
274 #ifndef FFMPEG_HAVE_DECODE_VIDEO2
275 static inline
276 int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
277                          int *got_picture_ptr,
278                          AVPacket *avpkt)
279 {
280         return avcodec_decode_video(avctx, picture, got_picture_ptr,
281                                     avpkt->data, avpkt->size);
282 }
283 #endif
284
285 static inline
286 int64_t av_get_pts_from_frame(AVFormatContext *avctx, AVFrame * picture)
287 {
288         int64_t pts = picture->pkt_pts;
289
290         if (pts == AV_NOPTS_VALUE) {
291                 pts = picture->pkt_dts;
292         }
293         if (pts == AV_NOPTS_VALUE) {
294                 pts = 0;
295         }
296
297         (void)avctx;
298         return pts;
299 }
300
301 #endif