aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--lib/DllAvFilter.h200
-rw-r--r--lib/Makefile.in10
-rw-r--r--lib/ffmpeg/build_xbmc_win32.sh2
-rw-r--r--project/VS2010Express/XBMC.vcxproj1
-rw-r--r--project/VS2010Express/XBMC.vcxproj.filters5
-rw-r--r--xbmc/DllPaths_generated.h.in1
-rw-r--r--xbmc/DllPaths_win32.h1
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp2
9 files changed, 222 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index 6a3a09c616..391564bc99 100644
--- a/.gitignore
+++ b/.gitignore
@@ -371,6 +371,7 @@ project/Win32BuildSetup/dependencies/libcdio-10.dll
/system/players/dvdplayer/avcore-0.dll
/system/players/dvdplayer/avformat-52.dll
/system/players/dvdplayer/avutil-50.dll
+/system/players/dvdplayer/avfilter-1.dll
/system/players/dvdplayer/freetype6.dll
/system/players/dvdplayer/libass.dll
/system/players/dvdplayer/libdvdcss-2.dll
diff --git a/lib/DllAvFilter.h b/lib/DllAvFilter.h
new file mode 100644
index 0000000000..1d5f3edad7
--- /dev/null
+++ b/lib/DllAvFilter.h
@@ -0,0 +1,200 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2011 Team XBMC
+ * http://www.xbmc.org
+ *
+ * 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, 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#if (defined HAVE_CONFIG_H) && (!defined WIN32)
+ #include "config.h"
+#endif
+#include "DynamicDll.h"
+#include "DllAvCore.h"
+#include "utils/log.h"
+
+extern "C" {
+#ifndef HAVE_MMX
+#define HAVE_MMX
+#endif
+#ifndef __STDC_CONSTANT_MACROS
+#define __STDC_CONSTANT_MACROS
+#endif
+
+#ifndef __GNUC__
+#pragma warning(disable:4244)
+#endif
+
+#if (defined USE_EXTERNAL_FFMPEG)
+ #if (defined HAVE_LIBAVFILTER_AVFILTER_H)
+ #include <libavfilter/avfiltergraph.h>
+ #include <libavfilter/vsrc_buffer.h>
+ #elif (defined HAVE_FFMPEG_AVFILTER_H)
+ #include <ffmpeg/avfiltergraph.h>
+ #include <ffmpeg/vsrc_buffer.h>
+ #endif
+#else
+ #include "libavfilter/avfiltergraph.h"
+ #include "libavfilter/vsrc_buffer.h"
+#endif
+}
+
+#include "threads/SingleLock.h"
+
+class DllAvFilterInterface
+{
+public:
+ virtual ~DllAvFilterInterface() {}
+ virtual int avfilter_open_dont_call(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name)=0;
+ virtual void avfilter_free_dont_call(AVFilterContext *filter)=0;
+ virtual void avfilter_graph_free_dont_call(AVFilterGraph *graph)=0;
+ virtual int avfilter_graph_create_filter(AVFilterContext **filt_ctx, AVFilter *filt, const char *name, const char *args, void *opaque, AVFilterGraph *graph_ctx)=0;
+ virtual AVFilter *avfilter_get_by_name(const char *name)=0;
+ virtual AVFilterGraph *avfilter_graph_alloc(void)=0;
+ virtual int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, AVFilterInOut *inputs, AVFilterInOut *outputs, AVClass *log_ctx)=0;
+ virtual int avfilter_graph_config(AVFilterGraph *graphctx, AVClass *log_ctx)=0;
+ virtual int avfilter_poll_frame(AVFilterLink *link)=0;
+ virtual int avfilter_request_frame(AVFilterLink *link)=0;
+ virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect)=0;
+ virtual AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w, int h)=0;
+ virtual void avfilter_unref_buffer(AVFilterBufferRef *ref)=0;
+ virtual int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad)=0;
+};
+
+#if (defined USE_EXTERNAL_FFMPEG)
+// Use direct mapping
+class DllAvFilter : public DllDynamic, DllAvFilterInterface
+{
+public:
+ virtual ~DllAvFilter();
+ virtual int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name)
+ {
+ CSingleLock lock(DllAvFilter::m_critSection);
+ return ::avfilter_open(filter_ctx, filter, inst_name);
+ }
+ virtual int avfilter_free(AVFilterContext *filter)
+ {
+ CSingleLock lock(DllAvFilter::m_critSection);
+ return ::avfilter_free(filter);
+ }
+ virtual int avfilter_graph_free(AVFilterGraph *graph)
+ {
+ CSingleLock lock(DllAvFilter::m_critSection);
+ return ::avfilter_graph_free(graph);
+ }
+ virtual int avfilter_open_dont_call(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name) { *(int *)0x0 = 0; return 0; }
+ virtual void avfilter_free_dont_call(AVFilterContext *filter) { *(int *)0x0 = 0; }
+ virtual void avfilter_graph_free_dont_call(AVFilterGraph *graph) { *(int *)0x0 = 0; }
+ virtual int avfilter_graph_create_filter(AVFilterContext **filt_ctx, AVFilter *filt, const char *name, const char *args, void *opaque, AVFilterGraph *graph_ctx) { return ::avfilter_graph_create_filter(filt_ctx, filt, name, args, opaque, graph_ctx); }
+ virtual AVFilter *avfilter_get_by_name(const char *name) { return ::avfilter_get_by_name(name); }
+ virtual AVFilterGraph *avfilter_graph_alloc() { return ::avfilter_graph_alloc(); }
+ virtual int avfilter_graph_parse(AVFilterGraph *graph, const char *filters, AVFilterInOut *inputs, AVFilterInOut *outputs, AVClass *log_ctx) { return ::avfilter_graph_parse(graph, filters, inputs, outputs, log_ctx); }
+ virtual int avfilter_graph_config(AVFilterGraph *graphctx, AVClass *log_ctx) { return ::avfilter_graph_config(graphctx, log_ctx); }
+ virtual int avfilter_poll_frame(AVFilterLink *link) { return ::avfilter_poll_frame(link); }
+ virtual int avfilter_request_frame(AVFilterLink *link) { return ::avfilter_request_frame(link); }
+ virtual int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts, AVRational pixel_aspect) { return ::av_vsrc_buffer_add_frame(buffer_filter, frame, pts, pixel_aspect); }
+ virtual AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, int w, int h) { return ::avfilter_get_video_buffer(link, perms, w, h); }
+ virtual void avfilter_unref_buffer(AVFilterBufferRef *ref) { ::avfilter_unref_buffer(ref); }
+ virtual int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad) { return ::avfilter_link(src, srcpad, dst, dstpad); }
+ // DLL faking.
+ virtual bool ResolveExports() { return true; }
+ virtual bool Load() {
+ CLog::Log(LOGDEBUG, "DllAvFilter: Using libavfilter system library");
+ return true;
+ }
+ virtual void Unload() {}
+};
+#else
+class DllAvFilter : public DllDynamic, DllAvFilterInterface
+{
+ DECLARE_DLL_WRAPPER(DllAvFilter, DLL_PATH_LIBAVFILTER)
+
+ LOAD_SYMBOLS()
+
+ DEFINE_METHOD3(int, avfilter_open_dont_call, (AVFilterContext **p1, AVFilter *p2, const char *p3))
+ DEFINE_METHOD1(void, avfilter_free_dont_call, (AVFilterContext *p1))
+ DEFINE_METHOD1(void, avfilter_graph_free_dont_call, (AVFilterGraph *p1))
+ DEFINE_METHOD0(void, avfilter_register_all_dont_call)
+ DEFINE_METHOD6(int, avfilter_graph_create_filter, (AVFilterContext **p1, AVFilter *p2, const char *p3, const char *p4, void *p5, AVFilterGraph *p6))
+ DEFINE_METHOD1(AVFilter*, avfilter_get_by_name, (const char *p1))
+ DEFINE_METHOD0(AVFilterGraph*, avfilter_graph_alloc)
+ DEFINE_METHOD5(int, avfilter_graph_parse, (AVFilterGraph *p1, const char *p2, AVFilterInOut *p3, AVFilterInOut *p4, AVClass *p5))
+ DEFINE_METHOD2(int, avfilter_graph_config, (AVFilterGraph *p1, AVClass *p2))
+#ifdef _LINUX
+ DEFINE_METHOD1(int, avfilter_poll_frame, (AVFilterLink *p1))
+ DEFINE_METHOD1(int, avfilter_request_frame, (AVFilterLink* p1))
+#else
+ DEFINE_FUNC_ALIGNED1(int, __cdecl, avfilter_poll_frame, AVFilterLink *)
+ DEFINE_FUNC_ALIGNED1(int, __cdecl, avfilter_request_frame, AVFilterLink*)
+#endif
+ DEFINE_METHOD4(int, av_vsrc_buffer_add_frame, (AVFilterContext *p1, AVFrame *p2, int64_t p3, AVRational p4))
+ DEFINE_METHOD4(AVFilterBufferRef*, avfilter_get_video_buffer, (AVFilterLink *p1, int p2, int p3, int p4))
+ DEFINE_METHOD1(void, avfilter_unref_buffer, (AVFilterBufferRef *p1))
+ DEFINE_METHOD4(int, avfilter_link, (AVFilterContext *p1, unsigned p2, AVFilterContext *p3, unsigned p4))
+
+ BEGIN_METHOD_RESOLVE()
+ RESOLVE_METHOD_RENAME(avfilter_open, avfilter_open_dont_call)
+ RESOLVE_METHOD_RENAME(avfilter_free, avfilter_free_dont_call)
+ RESOLVE_METHOD_RENAME(avfilter_graph_free ,avfilter_graph_free_dont_call)
+ RESOLVE_METHOD_RENAME(avfilter_register_all, avfilter_register_all_dont_call)
+ RESOLVE_METHOD(avfilter_graph_create_filter)
+ RESOLVE_METHOD(avfilter_get_by_name)
+ RESOLVE_METHOD(avfilter_graph_alloc)
+ RESOLVE_METHOD(avfilter_graph_parse)
+ RESOLVE_METHOD(avfilter_graph_config)
+ RESOLVE_METHOD(avfilter_poll_frame)
+ RESOLVE_METHOD(avfilter_request_frame)
+ RESOLVE_METHOD(av_vsrc_buffer_add_frame)
+ RESOLVE_METHOD(avfilter_get_video_buffer)
+ RESOLVE_METHOD(avfilter_unref_buffer)
+ RESOLVE_METHOD(avfilter_link)
+ END_METHOD_RESOLVE()
+
+ /* dependencies of libavfilter */
+ DllAvCore m_dllAvCore;
+ // DllAvUtil loaded implicitely by m_dllAvCore
+
+public:
+ static CCriticalSection m_critSection;
+ int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name)
+ {
+ CSingleLock lock(DllAvFilter::m_critSection);
+ return avfilter_open_dont_call(filter_ctx, filter, inst_name);
+ }
+ void avfilter_free(AVFilterContext *filter)
+ {
+ CSingleLock lock(DllAvFilter::m_critSection);
+ avfilter_free_dont_call(filter);
+ }
+ void avfilter_graph_free(AVFilterGraph *graph)
+ {
+ CSingleLock lock(DllAvFilter::m_critSection);
+ avfilter_graph_free_dont_call(graph);
+ }
+ void avfilter_register_all()
+ {
+ CSingleLock lock(DllAvFilter::m_critSection);
+ avfilter_register_all_dont_call();
+ }
+ virtual bool Load()
+ {
+ if (!m_dllAvCore.Load())
+ return false;
+ return DllDynamic::Load();
+ }
+};
+#endif
diff --git a/lib/Makefile.in b/lib/Makefile.in
index ce4605cf1c..7daced351e 100644
--- a/lib/Makefile.in
+++ b/lib/Makefile.in
@@ -30,6 +30,7 @@ ifneq (@USE_EXTERNAL_FFMPEG@,1)
avcore-0-$(ARCH).so \
avformat-52-$(ARCH).so \
postproc-51-$(ARCH).so \
+ avfilter-1-$(ARCH).so \
swscale-0-$(ARCH).so
endif
@@ -72,6 +73,10 @@ $(SYSDIR)/avformat-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavformat/libavformat.dyli
$(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \
$(WRAPPER) ffmpeg/libavformat/*.o $(BUNDLE1_O)
+$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.dylib
+ $(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \
+ $(WRAPPER) ffmpeg/libavfilter/*.o $(BUNDLE1_O)
+
ifneq ($(findstring arm,$(ARCH)), arm)
$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.dylib
$(LD) $(LDFLAGS) -alias_list $(WRAPPER_MACH_ALIAS) -o $@ \
@@ -91,6 +96,7 @@ ffmpeg/libavutil/libavutil.dylib : ffmpeg;
ffmpeg/libavcodec/libavcodec.dylib : ffmpeg;
ffmpeg/libavcore/libavcore.dylib : ffmpeg;
ffmpeg/libavformat/libavformat.dylib : ffmpeg;
+ffmpeg/libavformat/libavfilter.dylib : ffmpeg;
ffmpeg/libswscale/libswscale.dylib : ffmpeg;
ffmpeg/libpostproc/libpostproc.dylib : ffmpeg;
ffmpeg:
@@ -110,6 +116,9 @@ $(SYSDIR)/avcore-0-$(ARCH).so: $(WRAPPER) ffmpeg/libavcore/libavcore.so
$(SYSDIR)/avformat-52-$(ARCH).so: $(WRAPPER) ffmpeg/libavformat/libavformat.so
cp ffmpeg/libavformat/libavformat.so $@
+$(SYSDIR)/avfilter-1-$(ARCH).so: $(WRAPPER) ffmpeg/libavfilter/libavfilter.so
+ cp ffmpeg/libavfilter/libavfilter.so $@
+
ifneq ($(ARCH), arm)
$(SYSDIR)/swscale-0-$(ARCH).so: $(WRAPPER) ffmpeg/libswscale/libswscale.so
cp ffmpeg/libswscale/libswscale.so $@
@@ -127,6 +136,7 @@ ffmpeg/libavutil/libavutil.so : ffmpeg;
ffmpeg/libavcodec/libavcodec.so : ffmpeg;
ffmpeg/libavcore/libavcore.so : ffmpeg;
ffmpeg/libavformat/libavformat.so : ffmpeg;
+ffmpeg/libavfilter/libavfilter.so : ffmpeg;
ffmpeg/libswscale/libswscale.so : ffmpeg;
ffmpeg/libpostproc/libpostproc.so : ffmpeg;
ffmpeg:
diff --git a/lib/ffmpeg/build_xbmc_win32.sh b/lib/ffmpeg/build_xbmc_win32.sh
index 8ad2751039..57838dc290 100644
--- a/lib/ffmpeg/build_xbmc_win32.sh
+++ b/lib/ffmpeg/build_xbmc_win32.sh
@@ -35,6 +35,7 @@ OPTIONS="
--enable-encoder=ac3 \
--enable-encoder=aac \
--enable-runtime-cpudetect \
+--enable-avfilter \
--disable-debug \
--disable-doc"
@@ -46,5 +47,6 @@ cp .libs/avcodec-52.dll /xbmc/system/players/dvdplayer/ &&
cp .libs/avcore-0.dll /xbmc/system/players/dvdplayer/ &&
cp .libs/avformat-52.dll /xbmc/system/players/dvdplayer/ &&
cp .libs/avutil-50.dll /xbmc/system/players/dvdplayer/ &&
+cp .libs/avfilter-1.dll /xbmc/system/players/dvdplayer/ &&
cp .libs/postproc-51.dll /xbmc/system/players/dvdplayer/ &&
cp .libs/swscale-0.dll /xbmc/system/players/dvdplayer/
diff --git a/project/VS2010Express/XBMC.vcxproj b/project/VS2010Express/XBMC.vcxproj
index df101ec5f3..a08ea4fe83 100644
--- a/project/VS2010Express/XBMC.vcxproj
+++ b/project/VS2010Express/XBMC.vcxproj
@@ -1163,6 +1163,7 @@
<ClCompile Include="..\..\xbmc\xbmc.cpp" />
</ItemGroup>
<ItemGroup>
+ <ClInclude Include="..\..\lib\DllAvFilter.h" />
<ClInclude Include="..\..\lib\ffmpeg\include-xbmc-win32\libavutil\avconfig.h" />
<ClInclude Include="..\..\lib\SlingboxLib\SlingboxLib.h" />
<ClInclude Include="..\..\lib\tinyXML\tinystr.h" />
diff --git a/project/VS2010Express/XBMC.vcxproj.filters b/project/VS2010Express/XBMC.vcxproj.filters
index 6e55ffa4d3..8e0c85122a 100644
--- a/project/VS2010Express/XBMC.vcxproj.filters
+++ b/project/VS2010Express/XBMC.vcxproj.filters
@@ -4940,6 +4940,9 @@
<ClInclude Include="..\..\xbmc\addons\AddonVersion.h">
<Filter>addons</Filter>
</ClInclude>
+ <ClInclude Include="..\..\lib\DllAvFilter.h">
+ <Filter>cores\dvdplayer\DVDHeaders</Filter>
+ </ClInclude>
<ClInclude Include="..\..\xbmc\guilib\DirtyRegionTracker.h">
<Filter>guilib</Filter>
</ClInclude>
@@ -4965,4 +4968,4 @@
<Filter>win32</Filter>
</CustomBuild>
</ItemGroup>
-</Project> \ No newline at end of file
+</Project>
diff --git a/xbmc/DllPaths_generated.h.in b/xbmc/DllPaths_generated.h.in
index 3023bf2343..6dd5bd4623 100644
--- a/xbmc/DllPaths_generated.h.in
+++ b/xbmc/DllPaths_generated.h.in
@@ -76,6 +76,7 @@
#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50-@ARCH@.so"
#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51-@ARCH@.so"
#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0-@ARCH@.so"
+#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1-@ARCH@.so"
/* cdrip */
#if defined(_LINUX) && !defined(__APPLE__)
diff --git a/xbmc/DllPaths_win32.h b/xbmc/DllPaths_win32.h
index 0e276b1e7e..3c7812d88a 100644
--- a/xbmc/DllPaths_win32.h
+++ b/xbmc/DllPaths_win32.h
@@ -63,6 +63,7 @@
#define DLL_PATH_LIBAVCORE "special://xbmcbin/system/players/dvdplayer/avcore-0.dll"
#define DLL_PATH_LIBAVFORMAT "special://xbmcbin/system/players/dvdplayer/avformat-52.dll"
#define DLL_PATH_LIBAVUTIL "special://xbmcbin/system/players/dvdplayer/avutil-50.dll"
+#define DLL_PATH_LIBAVFILTER "special://xbmcbin/system/players/dvdplayer/avfilter-1.dll"
#define DLL_PATH_LIBPOSTPROC "special://xbmcbin/system/players/dvdplayer/postproc-51.dll"
#define DLL_PATH_LIBSWSCALE "special://xbmcbin/system/players/dvdplayer/swscale-0.dll"
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
index 293fc3829f..dd3e8aea87 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
@@ -56,6 +56,8 @@
#include "VAAPI.h"
#endif
+CCriticalSection DllAvFilter::m_critSection;
+
using namespace boost;
enum PixelFormat CDVDVideoCodecFFmpeg::GetFormat( struct AVCodecContext * avctx