/* * compatibility macros to make every ffmpeg installation appear * like the most current installation (wrapping some functionality sometimes) * it also includes all ffmpeg header files at once, no need to do it * seperately. * * Copyright (c) 2011 Peter Schlaile * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #ifndef __FFMPEG_COMPAT_H__ #define __FFMPEG_COMPAT_H__ #include /* check our ffmpeg is new enough, avoids user complaints */ #if (LIBAVFORMAT_VERSION_MAJOR < 52) || ((LIBAVFORMAT_VERSION_MAJOR == 52) && (LIBAVFORMAT_VERSION_MINOR <= 64)) # error "FFmpeg 0.7 or newer is needed, Upgrade your FFmpeg or disable it" #endif /* end sanity check */ #include #include #include #include #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101)) #define FFMPEG_HAVE_PARSE_UTILS 1 #include #endif #include #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 105)) #define FFMPEG_HAVE_AVIO 1 #endif #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)) #define FFMPEG_HAVE_DEFAULT_VAL_UNION 1 #endif #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101)) #define FFMPEG_HAVE_AV_DUMP_FORMAT 1 #endif #if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 45)) #define FFMPEG_HAVE_AV_GUESS_FORMAT 1 #endif #if (LIBAVCODEC_VERSION_MAJOR > 52) || ((LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 23)) #define FFMPEG_HAVE_DECODE_AUDIO3 1 #define FFMPEG_HAVE_DECODE_VIDEO2 1 #endif #if (LIBAVCODEC_VERSION_MAJOR > 52) || ((LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 64)) #define FFMPEG_HAVE_AVMEDIA_TYPES 1 #endif #if ((LIBAVCODEC_VERSION_MAJOR > 52) || (LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 29)) && \ ((LIBSWSCALE_VERSION_MAJOR > 0) || (LIBSWSCALE_VERSION_MAJOR >= 0) && (LIBSWSCALE_VERSION_MINOR >= 10)) #define FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT #endif #if ((LIBAVUTIL_VERSION_MAJOR > 51) || (LIBAVUTIL_VERSION_MAJOR == 51) && (LIBAVUTIL_VERSION_MINOR >= 32)) #define FFMPEG_FFV1_ALPHA_SUPPORTED #endif #if ((LIBAVUTIL_VERSION_MAJOR < 51) || (LIBAVUTIL_VERSION_MAJOR == 51) && (LIBAVUTIL_VERSION_MINOR < 22)) static inline int av_opt_set(void *obj, const char *name, const char *val, int search_flags) { const AVOption *rv = NULL; av_set_string3(obj, name, val, 1, &rv); return rv != NULL; } static inline int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags) { const AVOption *rv = NULL; rv = av_set_int(obj, name, val); return rv != NULL; } static inline int av_opt_set_double(void *obj, const char *name, double val, int search_flags) { const AVOption *rv = NULL; rv = av_set_double(obj, name, val); return rv != NULL; } #define AV_OPT_TYPE_INT FF_OPT_TYPE_INT #define AV_OPT_TYPE_INT64 FF_OPT_TYPE_INT64 #define AV_OPT_TYPE_STRING FF_OPT_TYPE_STRING #define AV_OPT_TYPE_CONST FF_OPT_TYPE_CONST #define AV_OPT_TYPE_DOUBLE FF_OPT_TYPE_DOUBLE #define AV_OPT_TYPE_FLOAT FF_OPT_TYPE_FLOAT #endif #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))) #define avformat_close_input(x) av_close_input_file(*(x)) #endif #if ((LIBAVCODEC_VERSION_MAJOR < 53) || (LIBAVCODEC_VERSION_MAJOR == 53 && LIBAVCODEC_VERSION_MINOR < 35)) static inline int avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options) { /* TODO: no options are taking into account */ return avcodec_open(avctx, codec); } #endif #if ((LIBAVFORMAT_VERSION_MAJOR < 53) || (LIBAVFORMAT_VERSION_MAJOR == 53 && LIBAVFORMAT_VERSION_MINOR < 21)) static inline AVStream *avformat_new_stream(AVFormatContext *s, AVCodec *c) { /* TODO: no codec is taking into account */ return av_new_stream(s, 0); } static inline int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) { /* TODO: no options are taking into account */ return av_find_stream_info(ic); } #endif #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))) static inline void my_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp) { int i; for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; st->cur_dts = av_rescale(timestamp, st->time_base.den * (int64_t)ref_st->time_base.num, st->time_base.num * (int64_t)ref_st->time_base.den); } } static inline void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp) { my_update_cur_dts(s, ref_st, timestamp); } #endif #ifndef FFMPEG_HAVE_AVIO #define AVIO_FLAG_WRITE URL_WRONLY #define avio_open url_fopen #define avio_tell url_ftell #define avio_close url_fclose #define avio_size url_fsize #endif /* there are some version inbetween, which have avio_... functions but no * AVIO_FLAG_... */ #ifndef AVIO_FLAG_WRITE #define AVIO_FLAG_WRITE URL_WRONLY #endif #ifndef AV_PKT_FLAG_KEY #define AV_PKT_FLAG_KEY PKT_FLAG_KEY #endif #ifndef FFMPEG_HAVE_AV_DUMP_FORMAT #define av_dump_format dump_format #endif #ifndef FFMPEG_HAVE_AV_GUESS_FORMAT #define av_guess_format guess_format #endif #ifndef FFMPEG_HAVE_PARSE_UTILS #define av_parse_video_rate av_parse_video_frame_rate #endif #ifdef FFMPEG_HAVE_DEFAULT_VAL_UNION #define FFMPEG_DEF_OPT_VAL_INT(OPT) OPT->default_val.i64 #define FFMPEG_DEF_OPT_VAL_DOUBLE(OPT) OPT->default_val.dbl #else #define FFMPEG_DEF_OPT_VAL_INT(OPT) OPT->default_val #define FFMPEG_DEF_OPT_VAL_DOUBLE(OPT) OPT->default_val #endif #ifndef FFMPEG_HAVE_AVMEDIA_TYPES #define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO #define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO #endif #ifndef FFMPEG_HAVE_DECODE_AUDIO3 static inline int avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples, int *frame_size_ptr, AVPacket *avpkt) { return avcodec_decode_audio2(avctx, samples, frame_size_ptr, avpkt->data, avpkt->size); } #endif #ifndef FFMPEG_HAVE_DECODE_VIDEO2 static inline int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, AVPacket *avpkt) { return avcodec_decode_video(avctx, picture, got_picture_ptr, avpkt->data, avpkt->size); } #endif static inline int64_t av_get_pts_from_frame(AVFormatContext *avctx, AVFrame * picture) { int64_t pts = picture->pkt_pts; if (pts == AV_NOPTS_VALUE) { pts = picture->pkt_dts; } if (pts == AV_NOPTS_VALUE) { pts = 0; } (void)avctx; return pts; } #endif