give a more useful error when building with an old ffmpeg.
[blender.git] / intern / ffmpeg / ffmpeg_compat.h
1 #ifndef __ffmpeg_compat_h_included__
2 #define __ffmpeg_compat_h_included__ 1
3
4 /*
5  * $Id$
6  *
7  * compatibility macros to make every ffmpeg installation appear
8  * like the most current installation (wrapping some functionality sometimes)
9  * it also includes all ffmpeg header files at once, no need to do it 
10  * seperately.
11  *
12  * Copyright (c) 2011 Peter Schlaile
13  *
14  * This program is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License as published by
16  * the Free Software Foundation; either version 2 of the License, or
17  * (at your option) any later version.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  */
25
26
27 #include <libavformat/avformat.h>
28
29
30 /* check our ffmpeg is new enough, avoids user complaints */
31 #if (LIBAVFORMAT_VERSION_MAJOR < 52) || ((LIBAVFORMAT_VERSION_MAJOR == 52) && (LIBAVFORMAT_VERSION_MINOR <= 64))
32 #  error "FFmpeg 0.7 or newer is needed, Upgrade you're FFmpeg or disable it"
33 #endif
34 /* end sanity check */
35
36
37 #include <libavcodec/avcodec.h>
38 #include <libavutil/rational.h>
39
40 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101))
41 #define FFMPEG_HAVE_PARSE_UTILS 1
42 #include <libavutil/parseutils.h>
43 #endif
44
45 #include <libswscale/swscale.h>
46 #include <libavcodec/opt.h>
47
48 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 105))
49 #define FFMPEG_HAVE_AVIO 1
50 #endif
51
52 #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))
53 #define FFMPEG_HAVE_DEFAULT_VAL_UNION 1
54 #endif
55
56 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101))
57 #define FFMPEG_HAVE_AV_DUMP_FORMAT 1
58 #endif
59
60 #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 45))
61 #define FFMPEG_HAVE_AV_GUESS_FORMAT 1
62 #endif
63
64 #if (LIBAVCODEC_VERSION_MAJOR > 52) || ((LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 23))
65 #define FFMPEG_HAVE_DECODE_AUDIO3 1
66 #define FFMPEG_HAVE_DECODE_VIDEO2 1
67 #endif
68
69 #if (LIBAVCODEC_VERSION_MAJOR > 52) || ((LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 64))
70 #define FFMPEG_HAVE_AVMEDIA_TYPES 1
71 #endif
72
73 #if ((LIBAVCODEC_VERSION_MAJOR > 52) || (LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 29)) && \
74         ((LIBSWSCALE_VERSION_MAJOR > 0) || (LIBSWSCALE_VERSION_MAJOR >= 0) && (LIBSWSCALE_VERSION_MINOR >= 10))
75 #define FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT
76 #endif
77
78 #ifndef FFMPEG_HAVE_AVIO
79 #define AVIO_FLAG_WRITE URL_WRONLY
80 #define avio_open url_fopen
81 #define avio_tell url_ftell
82 #define avio_close url_fclose
83 #define avio_size url_fsize
84 #endif
85
86 /* there are some version inbetween, which have avio_... functions but no
87    AVIO_FLAG_... */
88 #ifndef AVIO_FLAG_WRITE
89 #define AVIO_FLAG_WRITE URL_WRONLY
90 #endif
91
92 #ifndef AV_PKT_FLAG_KEY
93 #define AV_PKT_FLAG_KEY PKT_FLAG_KEY
94 #endif
95
96 #ifndef FFMPEG_HAVE_AV_DUMP_FORMAT
97 #define av_dump_format dump_format
98 #endif
99
100 #ifndef FFMPEG_HAVE_AV_GUESS_FORMAT
101 #define av_guess_format guess_format
102 #endif
103
104 #ifndef FFMPEG_HAVE_PARSE_UTILS
105 #define av_parse_video_rate av_parse_video_frame_rate
106 #endif
107
108 #ifdef FFMPEG_HAVE_DEFAULT_VAL_UNION
109 #define FFMPEG_DEF_OPT_VAL_INT(OPT) OPT->default_val.i64
110 #define FFMPEG_DEF_OPT_VAL_DOUBLE(OPT) OPT->default_val.dbl
111 #else
112 #define FFMPEG_DEF_OPT_VAL_INT(OPT) OPT->default_val
113 #define FFMPEG_DEF_OPT_VAL_DOUBLE(OPT) OPT->default_val
114 #endif
115
116 #ifndef FFMPEG_HAVE_AVMEDIA_TYPES
117 #define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
118 #define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO
119 #endif
120
121 #ifndef FFMPEG_HAVE_DECODE_AUDIO3
122 static inline 
123 int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
124                           int *frame_size_ptr, AVPacket *avpkt)
125 {
126         return avcodec_decode_audio2(avctx, samples,
127                                      frame_size_ptr, avpkt->data,
128                                      avpkt->size);
129 }
130 #endif
131
132 #ifndef FFMPEG_HAVE_DECODE_VIDEO2
133 static inline
134 int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
135                          int *got_picture_ptr,
136                          AVPacket *avpkt)
137 {
138         return avcodec_decode_video(avctx, picture, got_picture_ptr,
139                                     avpkt->data, avpkt->size);
140 }
141 #endif
142
143 static inline
144 int64_t av_get_pts_from_frame(AVFormatContext *avctx, AVFrame * picture)
145 {
146         int64_t pts = picture->pkt_pts;
147
148         if (pts == AV_NOPTS_VALUE) {
149                 pts = picture->pkt_dts;
150         }
151         if (pts == AV_NOPTS_VALUE) {
152                 pts = 0;
153         }
154         
155         return pts;
156 }
157
158 #endif