== FFMPEG ==
authorPeter Schlaile <peter@schlaile.de>
Fri, 27 May 2011 23:33:40 +0000 (23:33 +0000)
committerPeter Schlaile <peter@schlaile.de>
Fri, 27 May 2011 23:33:40 +0000 (23:33 +0000)
Added central compatibility header file, which enables blender to compile
against very old ffmpeg versions as well as very new versions using the
*NEW* API. (Old API functions are simulated using macros and inline functions)

Added a whole lot of additional checks, tested against 6 different versions
down the timeline, hopefully, now finally all is well.

14 files changed:
intern/audaspace/CMakeLists.txt
intern/audaspace/SConscript
intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
intern/ffmpeg/ffmpeg_compat.h [new file with mode: 0644]
source/blender/blenkernel/CMakeLists.txt
source/blender/blenkernel/SConscript
source/blender/blenkernel/intern/writeffmpeg.c
source/blender/imbuf/CMakeLists.txt
source/blender/imbuf/SConscript
source/blender/imbuf/intern/anim_movie.c
source/blender/imbuf/intern/util.c
source/gameengine/VideoTexture/CMakeLists.txt
source/gameengine/VideoTexture/SConscript
source/gameengine/VideoTexture/VideoFFmpeg.h

index 74f483eab05c29ee9a12c4a9c44d8e042acbe5d7..a2468d0071e6dbf88b777f62317e973d063c7597 100644 (file)
@@ -26,6 +26,7 @@ set(INC
        FX SRC
        ${PTHREADS_INC}
        ${LIBSAMPLERATE_INC}
+       ../ffmpeg
 )
 
 set(SRC
index ecc9498718532806764134b71661b384868084d8..67f859b0e5f2c7c282ff97ed951a7968bbc1bb62 100644 (file)
@@ -8,7 +8,7 @@ defs = []
 
 if env['WITH_BF_FFMPEG']:
     sources += env.Glob('ffmpeg/*.cpp')
-    incs += ' ffmpeg ' + env['BF_FFMPEG_INC']
+    incs += ' ffmpeg  #/intern/ffmpeg ' + env['BF_FFMPEG_INC']
     defs.append('WITH_FFMPEG')
 
 if env['WITH_BF_SDL']:
index e748235e40e3baa75a376dfc9a39e19343b43c40..4597432e7d14b500a11f786167d649cfb191fa92 100644 (file)
@@ -39,6 +39,7 @@
 extern "C" {
 #include <libavcodec/avcodec.h>
 #include <libavformat/avformat.h>
+#include "ffmpeg_compat.h"
 }
 
 int AUD_FFMPEGReader::decode(AVPacket* packet, AUD_Buffer& buffer)
diff --git a/intern/ffmpeg/ffmpeg_compat.h b/intern/ffmpeg/ffmpeg_compat.h
new file mode 100644 (file)
index 0000000..834df3d
--- /dev/null
@@ -0,0 +1,133 @@
+#ifndef __ffmpeg_compat_h_included__
+#define __ffmpeg_compat_h_included__ 1
+
+/*
+ * $Id$
+ *
+ * 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.
+ *
+ */
+
+
+#include <libavformat/avformat.h>
+#include <libavcodec/avcodec.h>
+#include <libavutil/rational.h>
+
+#if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101))
+#define FFMPEG_HAVE_PARSE_UTILS 1
+#include <libavutil/parseutils.h>
+#endif
+
+#include <libswscale/swscale.h>
+#include <libavcodec/opt.h>
+
+#if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 105))
+#define FFMPEG_HAVE_AVIO 1
+#endif
+
+#if (LIBAVFORMAT_VERSION_MAJOR > 53) || ((LIBAVFORMAT_VERSION_MAJOR >= 53) && (LIBAVFORMAT_VERSION_MINOR >= 1))
+#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_MINOR >= 29) && \
+        (LIBSWSCALE_VERSION_MAJOR >= 0) && (LIBSWSCALE_VERSION_MINOR >= 10)
+#define FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT
+#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
+#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
+
+#endif
index 2831636361f5aceb5994753b048909d2a97876a8..44d20b6c651038897988f3b9580fa935134b4161 100644 (file)
@@ -44,6 +44,7 @@ set(INC
        ../editors/include
        ../render/extern/include
        ../../../intern/audaspace/intern
+       ../../../intern/ffmpeg
        ../../../intern/bsp/extern ../blenfont
        ../../../intern/decimation/extern
        ../../../intern/elbeem/extern
index ea19b51c0444b77ac2692d46c06bef527b1d43a3..b5f845acacb4ebc4aac3ca83eda08d3c0749ace5 100644 (file)
@@ -14,6 +14,7 @@ incs += ' ../gpu #/extern/glew/include'
 incs += ' #/intern/smoke/extern'
 incs += ' #/intern/mikktspace'
 incs += ' #/intern/audaspace/intern'
+incs += ' #/intern/ffmpeg'
 
 incs += ' ' + env['BF_OPENGL_INC']
 incs += ' ' + env['BF_ZLIB_INC']
index 48930ae2eb8ab02626851a09ebfdc5a8d7d9dd33..c729565533fd8ae586efb49a4fb311de8f0aeac7 100644 (file)
 #include "IMB_imbuf_types.h"
 #include "IMB_imbuf.h"
 
-#if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 105))
-#define FFMPEG_HAVE_AVIO 1
-#endif
-
-#if (LIBAVFORMAT_VERSION_MAJOR > 53) || ((LIBAVFORMAT_VERSION_MAJOR >= 53) && (LIBAVFORMAT_VERSION_MINOR >= 1))
-#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
-
-#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
-#endif
-
-/* make OpenSuSe special "in-between" ffmpeg 0.6.2 version(tm) happy... 
-   Arrrrgh */
-#ifndef AVIO_FLAG_WRITE
-#define AVIO_FLAG_WRITE URL_WRONLY
-#endif
-
-#ifndef FFMPEG_HAVE_AV_DUMP_FORMAT
-#define av_dump_format dump_format
-#endif
+#include "ffmpeg_compat.h"
 
 extern void do_init_ffmpeg(void);
 
@@ -1080,20 +1053,12 @@ IDProperty *ffmpeg_property_add(RenderData *rd, char * type, int opt_index, int
        switch (o->type) {
        case FF_OPT_TYPE_INT:
        case FF_OPT_TYPE_INT64:
-#ifdef FFMPEG_HAVE_DEFAULT_VAL_UNION
-               val.i = o->default_val.i64;
-#else
-               val.i = o->default_val;
-#endif
+               val.i = FFMPEG_DEF_OPT_VAL_INT(o);
                idp_type = IDP_INT;
                break;
        case FF_OPT_TYPE_DOUBLE:
        case FF_OPT_TYPE_FLOAT:
-#ifdef FFMPEG_HAVE_DEFAULT_VAL_UNION
-               val.f = o->default_val.dbl;
-#else
-               val.f = o->default_val;
-#endif
+               val.f = FFMPEG_DEF_OPT_VAL_DOUBLE(o);
                idp_type = IDP_FLOAT;
                break;
        case FF_OPT_TYPE_STRING:
index 6404ae3de75c3b6fa7c97401507b40d0c1e250ce..2522bcfed92cd830dbeb91f4c149c0d50f9d74c8 100644 (file)
@@ -38,6 +38,7 @@ set(INC
        ../makesdna
        ../../../intern/memutil
        ../../../intern/guardedalloc
+       ../../../intern/ffmpeg
        ${JPEG_INCLUDE_DIR}
        ${PNG_INCLUDE_DIR}
        ${ZLIB_INCLUDE_DIRS}
index ecb9a89c274d5fd2cd991cb3a7bed0c6e15c0a45..a80f92b4421b32dcd70ab1577bc3ded4e0695165 100644 (file)
@@ -5,7 +5,7 @@ sources = env.Glob('intern/*.c')
 
 incs = '. ../makesdna #/intern/guardedalloc #/intern/memutil ../blenlib'
 incs += ' ../avi ../blenkernel ../blenloader'
-
+incs += ' #/intern/ffmpeg'
 
 incs += ' ' + env['BF_JPEG_INC']
 incs += ' ' + env['BF_PNG_INC']
index a0051d85c5b4c9214fd9d6504c8a513b435903f6..919b0eb0c29e736b20f044988ed91277523d7551 100644 (file)
 #include <libavutil/rational.h>
 #include <libswscale/swscale.h>
 
-#if LIBAVFORMAT_VERSION_INT < (49 << 16)
-#define FFMPEG_OLD_FRAME_RATE 1
-#else
-#define FFMPEG_CODEC_IS_POINTER 1
-#endif
-
-#if (LIBAVCODEC_VERSION_MAJOR >= 52) && (LIBAVCODEC_VERSION_MINOR >= 29) && \
-        (LIBSWSCALE_VERSION_MAJOR >= 0) && (LIBSWSCALE_VERSION_MINOR >= 10)
-#define FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT
-#endif
-
-#if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101))
-#define FFMPEG_HAVE_AV_DUMP_FORMAT 1
-#endif
-
-#ifndef FFMPEG_HAVE_AV_DUMP_FORMAT
-#define av_dump_format dump_format
-#endif
+#include "ffmpeg_compat.h"
 
 #endif //WITH_FFMPEG
 
@@ -528,18 +511,6 @@ static ImBuf * avi_fetchibuf (struct anim *anim, int position) {
 
 extern void do_init_ffmpeg(void);
 
-#ifdef FFMPEG_CODEC_IS_POINTER
-static AVCodecContext* get_codec_from_stream(AVStream* stream)
-{
-       return stream->codec;
-}
-#else
-static AVCodecContext* get_codec_from_stream(AVStream* stream)
-{
-       return &stream->codec;
-}
-#endif
-
 static int startffmpeg(struct anim * anim) {
        int            i, videoStream;
 
@@ -573,7 +544,7 @@ static int startffmpeg(struct anim * anim) {
                /* Find the first video stream */
        videoStream=-1;
        for(i=0; i<pFormatCtx->nb_streams; i++)
-               if(get_codec_from_stream(pFormatCtx->streams[i])->codec_type
+               if(pFormatCtx->streams[i]->codec->codec_type
                   == AVMEDIA_TYPE_VIDEO) {
                        videoStream=i;
                        break;
@@ -584,7 +555,7 @@ static int startffmpeg(struct anim * anim) {
                return -1;
        }
 
-       pCodecCtx = get_codec_from_stream(pFormatCtx->streams[videoStream]);
+       pCodecCtx = pFormatCtx->streams[videoStream]->codec;
 
                /* Find the decoder for the video stream */
        pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
@@ -600,19 +571,10 @@ static int startffmpeg(struct anim * anim) {
                return -1;
        }
 
-#ifdef FFMPEG_OLD_FRAME_RATE
-       if(pCodecCtx->frame_rate>1000 && pCodecCtx->frame_rate_base==1)
-               pCodecCtx->frame_rate_base=1000;
-
-
-       anim->duration = pFormatCtx->duration * pCodecCtx->frame_rate 
-               / pCodecCtx->frame_rate_base / AV_TIME_BASE;
-#else
        anim->duration = ceil(pFormatCtx->duration
                * av_q2d(pFormatCtx->streams[videoStream]->r_frame_rate) 
                / AV_TIME_BASE);
 
-#endif
        anim->params = 0;
 
        anim->x = pCodecCtx->width;
@@ -866,15 +828,9 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
 #endif
 
        if (position != anim->curposition + 1) { 
-#ifdef FFMPEG_OLD_FRAME_RATE
-               double frame_rate = 
-                       (double) anim->pCodecCtx->frame_rate
-                       / (double) anim->pCodecCtx->frame_rate_base;
-#else
                double frame_rate = 
                        av_q2d(anim->pFormatCtx->streams[anim->videoStream]
                                   ->r_frame_rate);
-#endif
                double pts_time_base = av_q2d(anim->pFormatCtx->streams[anim->videoStream]->time_base);
                long long pos;
                long long st_time = anim->pFormatCtx->start_time;
index 3eed69f4c52facffa2344b1aa36c4e48c3db5215..6e5e87d7e5c0187683695b490a0372a144a10b8c 100644 (file)
 #include <libavdevice/avdevice.h>
 #include <libavutil/log.h>
 
-#if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101))
-#define FFMPEG_HAVE_AV_DUMP_FORMAT 1
-#endif
-
-#ifndef FFMPEG_HAVE_AV_DUMP_FORMAT
-#define av_dump_format dump_format
-#endif
+#include "ffmpeg_compat.h"
 
 #endif
 
index fb10b619f178e2a412fbfc5ecab03db0c7634cdc..b544139d4a78119d55acdda94648b8a2a4cbae91 100644 (file)
@@ -45,6 +45,7 @@ set(INC
        ../../../intern/string
        ../../../intern/moto/include
        ../../../intern/guardedalloc
+       ../../../intern/ffmpeg
        ${GLEW_INCLUDE_PATH}
 )
 
index 5091082e87a988947bbf2a0881a640e33df972b9..b39a59e4504eff79d84883701c7419bdcc8b04ee 100644 (file)
@@ -13,6 +13,7 @@ incs += ' #source/blender/editors/include #source/blender/blenlib #source/blende
 incs += ' #source/blender/makesdna #source/blender/imbuf #source/blender/python #source/blender/python/generic'
 incs += ' #source/blender/gpu #intern/string #intern/moto/include'
 incs += ' #intern/guardedalloc #intern/container #extern/glew/include'
+incs += ' #intern/ffmpeg'
 
 defs = [] 
 if env['OURPLATFORM'] in ('win32-vc', 'win64-vc','win32-mingw'):
index 70c7a840cb8fbc1da2f25e0a31401ba51ed59e29..139b90dc463838c0e9fb4a4b985d0610c4bbb5a6 100644 (file)
@@ -31,20 +31,15 @@ http://www.gnu.org/copyleft/lesser.txt.
 extern "C" {
 #undef __cplusplus
 #include <pthread.h>
-#include <libavformat/avformat.h>
-#include <libavcodec/avcodec.h>
-#include <libavutil/rational.h>
-#if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101))
-#include <libavutil/parseutils.h>
-#endif
-#include <libswscale/swscale.h>
+
+#include "ffmpeg_compat.h"
+
 #include "DNA_listBase.h"
 #include "BLI_threads.h"
 #include "BLI_blenlib.h"
 #define __cplusplus
 }
 
-
 #if LIBAVFORMAT_VERSION_INT < (49 << 16)
 #define FFMPEG_OLD_FRAME_RATE 1
 #else