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