Reduce amount of deprecated symbols used from FFmpeg
[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
37 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101))
38 #define FFMPEG_HAVE_PARSE_UTILS 1
39 #include <libavutil/parseutils.h>
40 #endif
41
42 #include <libswscale/swscale.h>
43
44 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 105))
45 #define FFMPEG_HAVE_AVIO 1
46 #endif
47
48 #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))
49 #define FFMPEG_HAVE_DEFAULT_VAL_UNION 1
50 #endif
51
52 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101))
53 #define FFMPEG_HAVE_AV_DUMP_FORMAT 1
54 #endif
55
56 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 45))
57 #define FFMPEG_HAVE_AV_GUESS_FORMAT 1
58 #endif
59
60 #if (LIBAVCODEC_VERSION_MAJOR > 52) || ((LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 23))
61 #define FFMPEG_HAVE_DECODE_AUDIO3 1
62 #define FFMPEG_HAVE_DECODE_VIDEO2 1
63 #endif
64
65 #if (LIBAVCODEC_VERSION_MAJOR > 52) || ((LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 64))
66 #define FFMPEG_HAVE_AVMEDIA_TYPES 1
67 #endif
68
69 #if ((LIBAVCODEC_VERSION_MAJOR > 52) || (LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 29)) && \
70         ((LIBSWSCALE_VERSION_MAJOR > 0) || (LIBSWSCALE_VERSION_MAJOR >= 0) && (LIBSWSCALE_VERSION_MINOR >= 10))
71 #define FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT
72 #endif
73
74 #if ((LIBAVUTIL_VERSION_MAJOR > 51) || (LIBAVUTIL_VERSION_MAJOR == 51) && (LIBAVUTIL_VERSION_MINOR >= 32))
75 #define FFMPEG_FFV1_ALPHA_SUPPORTED
76 #endif
77
78 #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)))
79 #define avformat_close_input(x) av_close_input_file(*(x))
80 #endif
81
82 #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)))
83 void ff_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp);
84
85 static inline
86 void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp)
87 {
88     ff_update_cur_dts(s, ref_st, timestamp);
89 }
90 #endif
91
92 #ifndef FFMPEG_HAVE_AVIO
93 #define AVIO_FLAG_WRITE URL_WRONLY
94 #define avio_open url_fopen
95 #define avio_tell url_ftell
96 #define avio_close url_fclose
97 #define avio_size url_fsize
98 #endif
99
100 /* there are some version inbetween, which have avio_... functions but no
101    AVIO_FLAG_... */
102 #ifndef AVIO_FLAG_WRITE
103 #define AVIO_FLAG_WRITE URL_WRONLY
104 #endif
105
106 #ifndef AV_PKT_FLAG_KEY
107 #define AV_PKT_FLAG_KEY PKT_FLAG_KEY
108 #endif
109
110 #ifndef FFMPEG_HAVE_AV_DUMP_FORMAT
111 #define av_dump_format dump_format
112 #endif
113
114 #ifndef FFMPEG_HAVE_AV_GUESS_FORMAT
115 #define av_guess_format guess_format
116 #endif
117
118 #ifndef FFMPEG_HAVE_PARSE_UTILS
119 #define av_parse_video_rate av_parse_video_frame_rate
120 #endif
121
122 #ifdef FFMPEG_HAVE_DEFAULT_VAL_UNION
123 #define FFMPEG_DEF_OPT_VAL_INT(OPT) OPT->default_val.i64
124 #define FFMPEG_DEF_OPT_VAL_DOUBLE(OPT) OPT->default_val.dbl
125 #else
126 #define FFMPEG_DEF_OPT_VAL_INT(OPT) OPT->default_val
127 #define FFMPEG_DEF_OPT_VAL_DOUBLE(OPT) OPT->default_val
128 #endif
129
130 #ifndef FFMPEG_HAVE_AVMEDIA_TYPES
131 #define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
132 #define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO
133 #endif
134
135 #ifndef FFMPEG_HAVE_DECODE_AUDIO3
136 static inline 
137 int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
138                           int *frame_size_ptr, AVPacket *avpkt)
139 {
140         return avcodec_decode_audio2(avctx, samples,
141                                      frame_size_ptr, avpkt->data,
142                                      avpkt->size);
143 }
144 #endif
145
146 #ifndef FFMPEG_HAVE_DECODE_VIDEO2
147 static inline
148 int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
149                          int *got_picture_ptr,
150                          AVPacket *avpkt)
151 {
152         return avcodec_decode_video(avctx, picture, got_picture_ptr,
153                                     avpkt->data, avpkt->size);
154 }
155 #endif
156
157 static inline
158 int64_t av_get_pts_from_frame(AVFormatContext *avctx, AVFrame * picture)
159 {
160         int64_t pts = picture->pkt_pts;
161
162         if (pts == AV_NOPTS_VALUE) {
163                 pts = picture->pkt_dts;
164         }
165         if (pts == AV_NOPTS_VALUE) {
166                 pts = 0;
167         }
168
169         (void)avctx;
170         return pts;
171 }
172
173 #endif