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