Skip to content

Commit

Permalink
added callback methods for binary add-ons to get codec id information…
Browse files Browse the repository at this point in the history
… from XBMC, so the dep on avcodec.h can be removed. only IDs used by pvr.hts and pvr.vdr.vnsi have been included
  • Loading branch information
opdenkamp committed Jul 9, 2013
1 parent d8b4503 commit 2e5e448
Show file tree
Hide file tree
Showing 25 changed files with 1,031 additions and 23 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ config.log
/lib/addons/library.xbmc.addon/Makefile
/lib/addons/library.xbmc.gui/Makefile
/lib/addons/library.xbmc.pvr/Makefile
/lib/addons/library.xbmc.codec/Makefile
/lib/addons/library.xbmc.addon/project/VS2010Express/Release
/lib/addons/library.xbmc.addon/project/VS2010Express/Debug
/lib/addons/library.xbmc.gui/project/VS2010Express/Release
Expand Down
6 changes: 5 additions & 1 deletion Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,7 @@ endif

LIBADDON_DIRS=\
lib/addons/library.xbmc.addon \
lib/addons/library.xbmc.codec \
lib/addons/library.xbmc.pvr \
lib/addons/library.xbmc.gui \

Expand Down Expand Up @@ -355,6 +356,7 @@ screensavers: $(SS_DIRS)

libaddon: exports
$(MAKE) -C lib/addons/library.xbmc.addon
$(MAKE) -C lib/addons/library.xbmc.codec
$(MAKE) -C lib/addons/library.xbmc.gui
$(MAKE) -C lib/addons/library.xbmc.pvr
dvdpcodecs: dllloader
Expand Down Expand Up @@ -442,10 +444,11 @@ ifneq (@USE_LIBXBMC@,1)
MAINOBJS+=xbmc/main/main.o
endif

# sync with tools/depends/target/xbmc-addon-bindings
# sync these entries manually with tools/depends/target/xbmc-addon-bindings/Makefile
BINDINGS =xbmc/addons/include/xbmc_addon_cpp_dll.h
BINDINGS+=xbmc/addons/include/xbmc_addon_dll.h
BINDINGS+=xbmc/addons/include/xbmc_addon_types.h
BINDINGS+=xbmc/addons/include/xbmc_codec_types.h
BINDINGS+=xbmc/addons/include/xbmc_epg_types.h
BINDINGS+=xbmc/addons/include/xbmc_pvr_dll.h
BINDINGS+=xbmc/addons/include/xbmc_pvr_types.h
Expand All @@ -456,6 +459,7 @@ BINDINGS+=xbmc/addons/include/xbmc_vis_types.h
BINDINGS+=addons/library.xbmc.addon/libXBMC_addon.h
BINDINGS+=addons/library.xbmc.gui/libXBMC_gui.h
BINDINGS+=addons/library.xbmc.pvr/libXBMC_pvr.h
BINDINGS+=addons/library.xbmc.codec/libXBMC_codec.h

libxbmc.so: $(OBJSXBMC) $(DYNOBJSXBMC) $(NWAOBJSXBMC) $(MAINOBJS)
ifeq ($(findstring osx,@ARCH@), osx)
Expand Down
10 changes: 10 additions & 0 deletions XBMC.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,9 @@
DFB65FD315373AE7006B8FF1 /* AEUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FB115373AE7006B8FF1 /* AEUtil.cpp */; };
DFB65FD415373AE7006B8FF1 /* AEWAVLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB65FB315373AE7006B8FF1 /* AEWAVLoader.cpp */; };
DFB6610915374E80006B8FF1 /* DVDAudioCodecPassthrough.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFB6610615374E80006B8FF1 /* DVDAudioCodecPassthrough.cpp */; };
DFBB4308178B574E006CC20A /* AddonCallbacksCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFBB4306178B574E006CC20A /* AddonCallbacksCodec.cpp */; };
DFBB4309178B574E006CC20A /* AddonCallbacksCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFBB4306178B574E006CC20A /* AddonCallbacksCodec.cpp */; };
DFBB430A178B574E006CC20A /* AddonCallbacksCodec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFBB4306178B574E006CC20A /* AddonCallbacksCodec.cpp */; };
DFBE805115F7D75700D7D102 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DFBE803D15F7D72100D7D102 /* SystemConfiguration.framework */; };
DFCA6AC7152245CD000BFAAE /* HTTPJsonRpcHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCA6ABB152245CD000BFAAE /* HTTPJsonRpcHandler.cpp */; };
DFCA6AC8152245CD000BFAAE /* HTTPVfsHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DFCA6ABD152245CD000BFAAE /* HTTPVfsHandler.cpp */; };
Expand Down Expand Up @@ -4187,6 +4190,8 @@
DFB65FB415373AE7006B8FF1 /* AEWAVLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AEWAVLoader.h; sourceTree = "<group>"; };
DFB6610615374E80006B8FF1 /* DVDAudioCodecPassthrough.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDAudioCodecPassthrough.cpp; sourceTree = "<group>"; };
DFB6610715374E80006B8FF1 /* DVDAudioCodecPassthrough.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVDAudioCodecPassthrough.h; sourceTree = "<group>"; };
DFBB4306178B574E006CC20A /* AddonCallbacksCodec.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AddonCallbacksCodec.cpp; sourceTree = "<group>"; };
DFBB4307178B574E006CC20A /* AddonCallbacksCodec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddonCallbacksCodec.h; sourceTree = "<group>"; };
DFBE803D15F7D72100D7D102 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
DFCA6ABB152245CD000BFAAE /* HTTPJsonRpcHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPJsonRpcHandler.cpp; sourceTree = "<group>"; };
DFCA6ABC152245CD000BFAAE /* HTTPJsonRpcHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPJsonRpcHandler.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -5647,6 +5652,8 @@
C8482912156CFFE7005A996F /* AddonCallbacks.h */,
C8482913156CFFE7005A996F /* AddonCallbacksAddon.cpp */,
C8482914156CFFE7005A996F /* AddonCallbacksAddon.h */,
DFBB4306178B574E006CC20A /* AddonCallbacksCodec.cpp */,
DFBB4307178B574E006CC20A /* AddonCallbacksCodec.h */,
C8482915156CFFE7005A996F /* AddonCallbacksGUI.cpp */,
C8482916156CFFE7005A996F /* AddonCallbacksGUI.h */,
C8482917156CFFE7005A996F /* AddonCallbacksPVR.cpp */,
Expand Down Expand Up @@ -10546,6 +10553,7 @@
DF40BC20178B4BEC009DB567 /* PythonInvoker.cpp in Sources */,
DF40BC2F178B4C07009DB567 /* LanguageInvokerThread.cpp in Sources */,
DF40BC31178B4C07009DB567 /* ScriptInvocationManager.cpp in Sources */,
DFBB430A178B574E006CC20A /* AddonCallbacksCodec.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -11567,6 +11575,7 @@
DF40BC1F178B4BEC009DB567 /* PythonInvoker.cpp in Sources */,
DF40BC2C178B4C07009DB567 /* LanguageInvokerThread.cpp in Sources */,
DF40BC2E178B4C07009DB567 /* ScriptInvocationManager.cpp in Sources */,
DFBB4309178B574E006CC20A /* AddonCallbacksCodec.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -12590,6 +12599,7 @@
DF40BC1E178B4BEC009DB567 /* PythonInvoker.cpp in Sources */,
DF40BC29178B4C07009DB567 /* LanguageInvokerThread.cpp in Sources */,
DF40BC2B178B4C07009DB567 /* ScriptInvocationManager.cpp in Sources */,
DFBB4308178B574E006CC20A /* AddonCallbacksCodec.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
124 changes: 124 additions & 0 deletions addons/library.xbmc.codec/libXBMC_codec.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
#pragma once
/*
* Copyright (C) 2005-2013 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, see
* <http://www.gnu.org/licenses/>.
*
*/

#include <string>
#include <vector>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "xbmc_codec_types.h"
#include "../library.xbmc.addon/libXBMC_addon.h"

#ifdef _WIN32
#define CODEC_HELPER_DLL "\\library.xbmc.codec\\libXBMC_codec" ADDON_HELPER_EXT
#else
#define CODEC_HELPER_DLL_NAME "libXBMC_codec-" ADDON_HELPER_ARCH ADDON_HELPER_EXT
#define CODEC_HELPER_DLL "/library.xbmc.codec/" CODEC_HELPER_DLL_NAME
#endif

class CHelper_libXBMC_codec
{
public:
CHelper_libXBMC_codec(void)
{
m_libXBMC_codec = NULL;
m_Handle = NULL;
}

~CHelper_libXBMC_codec(void)
{
if (m_libXBMC_codec)
{
CODEC_unregister_me(m_Handle, m_Callbacks);
dlclose(m_libXBMC_codec);
}
}

/*!
* @brief Resolve all callback methods
* @param handle Pointer to the add-on
* @return True when all methods were resolved, false otherwise.
*/
bool RegisterMe(void* handle)
{
m_Handle = handle;

std::string libBasePath;
libBasePath = ((cb_array*)m_Handle)->libPath;
libBasePath += CODEC_HELPER_DLL;

#if defined(ANDROID)
struct stat st;
if(stat(libBasePath.c_str(),&st) != 0)
{
std::string tempbin = getenv("XBMC_ANDROID_LIBS");
libBasePath = tempbin + "/" + CODEC_HELPER_DLL_NAME;
}
#endif

m_libXBMC_codec = dlopen(libBasePath.c_str(), RTLD_LAZY);
if (m_libXBMC_codec == NULL)
{
fprintf(stderr, "Unable to load %s\n", dlerror());
return false;
}

CODEC_register_me = (void* (*)(void *HANDLE))
dlsym(m_libXBMC_codec, "CODEC_register_me");
if (CODEC_register_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }

CODEC_unregister_me = (void (*)(void* HANDLE, void* CB))
dlsym(m_libXBMC_codec, "CODEC_unregister_me");
if (CODEC_unregister_me == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }

CODEC_get_codec_by_name = (xbmc_codec_t (*)(void* HANDLE, void* CB, const char* strCodecName))
dlsym(m_libXBMC_codec, "CODEC_get_codec_by_name");
if (CODEC_get_codec_by_name == NULL) { fprintf(stderr, "Unable to assign function %s\n", dlerror()); return false; }

m_Callbacks = CODEC_register_me(m_Handle);
return m_Callbacks != NULL;
}

/*!
* @brief Get the codec id used by XBMC
* @param strCodecName The name of the codec
* @return The codec_id, or a codec_id with 0 values when not supported
*/
xbmc_codec_t GetCodecByName(const char* strCodecName)
{
return CODEC_get_codec_by_name(m_Handle, m_Callbacks, strCodecName);
}

protected:
void* (*CODEC_register_me)(void*);
void (*CODEC_unregister_me)(void*, void*);
xbmc_codec_t (*CODEC_get_codec_by_name)(void *HANDLE, void* CB, const char* strCodecName);

private:
void* m_libXBMC_codec;
void* m_Handle;
void* m_Callbacks;
struct cb_array
{
const char* libPath;
};
};

6 changes: 6 additions & 0 deletions addons/xbmc.codec/addon.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon id="xbmc.codec" version="1.0.0" provider-name="Team XBMC">
<requires>
<import addon="xbmc.core" version="0.1.0"/>
</requires>
</addon>
5 changes: 1 addition & 4 deletions configure.in
Original file line number Diff line number Diff line change
Expand Up @@ -2384,6 +2384,7 @@ OUTPUT_FILES="Makefile \
xbmc/visualizations/fishBMC/Makefile \
xbmc/visualizations/WaveForm/Makefile \
lib/addons/library.xbmc.addon/Makefile \
lib/addons/library.xbmc.codec/Makefile \
lib/addons/library.xbmc.gui/Makefile \
lib/addons/library.xbmc.pvr/Makefile \
xbmc/visualizations/EGLHelpers/Makefile \
Expand Down Expand Up @@ -2777,15 +2778,11 @@ XB_CONFIG_MODULE([lib/gtest], [
], [$SKIP_CONFIG_GTEST])

XB_CONFIG_MODULE([pvr-addons], [
if test "$USE_EXTERNAL_FFMPEG" = 1; then
PVR_EXT_FFMPEG="--enable-external-ffmpeg"
fi
./configure \
--prefix="${prefix}" \
--host=$host_alias \
--build=$build_alias \
--target=$target_alias \
$PVR_EXT_FFMPEG \
CC="$CC" \
CXX="$CXX" \
CFLAGS="$CFLAGS" \
Expand Down
6 changes: 5 additions & 1 deletion lib/DllAvCodec.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ class DllAvCodecInterface
virtual void av_init_packet(AVPacket *pkt)=0;
virtual int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels, enum AVSampleFormat sample_fmt, const uint8_t *buf, int buf_size, int align) = 0;
virtual void avcodec_free_frame(AVFrame **frame)=0;
virtual int av_codec_is_decoder(const AVCodec *codec)=0;
};

#if (defined USE_EXTERNAL_FFMPEG) || (defined TARGET_DARWIN)
Expand Down Expand Up @@ -171,6 +172,7 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface
virtual void av_init_packet(AVPacket *pkt) { return ::av_init_packet(pkt); }
virtual int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels, enum AVSampleFormat sample_fmt, const uint8_t *buf, int buf_size, int align) { return ::avcodec_fill_audio_frame(frame, nb_channels, sample_fmt, buf, buf_size, align); }
virtual void avcodec_free_frame(AVFrame **frame) { return ::avcodec_free_frame(frame); };
virtual int av_codec_is_decoder(const AVCodec *codec) { return ::av_codec_is_decoder(codec); }

// DLL faking.
virtual bool ResolveExports() { return true; }
Expand Down Expand Up @@ -222,8 +224,9 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface
DEFINE_METHOD2(enum PixelFormat, avcodec_default_get_format, (struct AVCodecContext *p1, const enum PixelFormat *p2))
DEFINE_METHOD6(int, avcodec_fill_audio_frame, (AVFrame* p1, int p2, enum AVSampleFormat p3, const uint8_t* p4, int p5, int p6))
DEFINE_METHOD1(void, avcodec_free_frame, (AVFrame **p1))

DEFINE_METHOD1(AVCodec*, av_codec_next, (AVCodec *p1))
DEFINE_METHOD1(int, av_codec_is_decoder, (const AVCodec *p1))

BEGIN_METHOD_RESOLVE()
RESOLVE_METHOD(avcodec_flush_buffers)
RESOLVE_METHOD_RENAME(avcodec_open2,avcodec_open2_dont_call)
Expand Down Expand Up @@ -259,6 +262,7 @@ class DllAvCodec : public DllDynamic, DllAvCodecInterface
RESOLVE_METHOD(av_init_packet)
RESOLVE_METHOD(avcodec_fill_audio_frame)
RESOLVE_METHOD(avcodec_free_frame)
RESOLVE_METHOD(av_codec_is_decoder)
END_METHOD_RESOLVE()

/* dependencies of libavcodec */
Expand Down
1 change: 1 addition & 0 deletions lib/addons/library.xbmc.addon/libXBMC_addon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <stdlib.h>
#include <stdarg.h>
#include <string>
#include "../../../xbmc/addons/include/xbmc_addon_types.h"
#include "../../../addons/library.xbmc.addon/libXBMC_addon.h"
#include "../../../xbmc/addons/AddonCallbacks.h"

Expand Down
27 changes: 27 additions & 0 deletions lib/addons/library.xbmc.codec/Makefile.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
ARCH=@ARCH@
INCLUDES=-I. -I../../../xbmc/addons/include
DEFINES+=
CXXFLAGS=-fPIC
LIBNAME=libXBMC_codec
OBJS=$(LIBNAME).o

LIB_SHARED=../../../addons/library.xbmc.codec/$(LIBNAME)-$(ARCH).so

all: $(LIB_SHARED)

$(LIB_SHARED): $(OBJS)
ifeq ($(findstring osx,$(ARCH)), osx)
$(CXX) $(LDFLAGS) -Wl,-alias_list,@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper_mach_alias \
-bundle -undefined dynamic_lookup -o $@ \
@abs_top_srcdir@/xbmc/cores/DllLoader/exports/wrapper.o $(OBJS)
else
$(CXX) $(CFLAGS) $(LDFLAGS) -shared -g -o $(LIB_SHARED) $(OBJS)
endif

CLEAN_FILES = \
$(LIB_SHARED) \

DISTCLEAN_FILES= \
Makefile \

include ../../../Makefile.include
73 changes: 73 additions & 0 deletions lib/addons/library.xbmc.codec/libXBMC_codec.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* Copyright (C) 2012-2013 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
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string>
#include "../../../addons/library.xbmc.codec/libXBMC_codec.h"
#include "addons/AddonCallbacks.h"

#ifdef _WIN32
#include <windows.h>
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT
#endif

using namespace std;

extern "C"
{

DLLEXPORT void* CODEC_register_me(void *hdl)
{
CB_CODECLib *cb = NULL;
if (!hdl)
fprintf(stderr, "libXBMC_codec-ERROR: %s is called with NULL handle\n", __FUNCTION__);
else
{
cb = ((AddonCB*)hdl)->CODECLib_RegisterMe(((AddonCB*)hdl)->addonData);
if (!cb)
fprintf(stderr, "libXBMC_codec-ERROR: %s can't get callback table from XBMC\n", __FUNCTION__);
}
return cb;
}

DLLEXPORT void CODEC_unregister_me(void *hdl, void* cb)
{
if (hdl && cb)
((AddonCB*)hdl)->CODECLib_UnRegisterMe(((AddonCB*)hdl)->addonData, (CB_CODECLib*)cb);
}

DLLEXPORT xbmc_codec_t CODEC_get_codec_by_name(void *hdl, void* cb, const char* strCodecName)
{
xbmc_codec_t retVal;
retVal.codec_id = XBMC_INVALID_CODEC_ID;
retVal.codec_type = XBMC_CODEC_TYPE_UNKNOWN;

if (cb != NULL)
retVal = ((CB_CODECLib*)cb)->GetCodecByName(((AddonCB*)hdl)->addonData, strCodecName);

return retVal;
}

};
Loading

0 comments on commit 2e5e448

Please sign in to comment.