diff options
Diffstat (limited to 'media/libstagefright/AwesomePlayer.cpp')
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 65 |
1 files changed, 61 insertions, 4 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index a13b242..5d2127b 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -18,6 +18,8 @@ #define LOG_TAG "AwesomePlayer" #include <utils/Log.h> +#include <dlfcn.h> + #include "include/AwesomePlayer.h" #include "include/Prefetcher.h" #include "include/SoftwareRenderer.h" @@ -34,6 +36,8 @@ #include <media/stagefright/MetaData.h> #include <media/stagefright/OMXCodec.h> +#include <surfaceflinger/ISurface.h> + namespace android { struct AwesomeEvent : public TimedEventQueue::Event { @@ -80,13 +84,16 @@ private: struct AwesomeLocalRenderer : public AwesomeRenderer { AwesomeLocalRenderer( + const char *componentName, OMX_COLOR_FORMATTYPE colorFormat, const sp<ISurface> &surface, size_t displayWidth, size_t displayHeight, size_t decodedWidth, size_t decodedHeight) - : mTarget(new SoftwareRenderer( - colorFormat, surface, displayWidth, displayHeight, - decodedWidth, decodedHeight)) { + : mTarget(NULL), + mLibHandle(NULL) { + init(componentName, + colorFormat, surface, displayWidth, + displayHeight, decodedWidth, decodedHeight); } virtual void render(MediaBuffer *buffer) { @@ -99,15 +106,64 @@ protected: virtual ~AwesomeLocalRenderer() { delete mTarget; mTarget = NULL; + + if (mLibHandle) { + dlclose(mLibHandle); + mLibHandle = NULL; + } } private: - SoftwareRenderer *mTarget; + VideoRenderer *mTarget; + void *mLibHandle; + + void init( + const char *componentName, + OMX_COLOR_FORMATTYPE colorFormat, + const sp<ISurface> &surface, + size_t displayWidth, size_t displayHeight, + size_t decodedWidth, size_t decodedHeight); AwesomeLocalRenderer(const AwesomeLocalRenderer &); AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);; }; +void AwesomeLocalRenderer::init( + const char *componentName, + OMX_COLOR_FORMATTYPE colorFormat, + const sp<ISurface> &surface, + size_t displayWidth, size_t displayHeight, + size_t decodedWidth, size_t decodedHeight) { + mLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW); + + if (mLibHandle) { + typedef VideoRenderer *(*CreateRendererFunc)( + const sp<ISurface> &surface, + const char *componentName, + OMX_COLOR_FORMATTYPE colorFormat, + size_t displayWidth, size_t displayHeight, + size_t decodedWidth, size_t decodedHeight); + + CreateRendererFunc func = + (CreateRendererFunc)dlsym( + mLibHandle, + "_Z14createRendererRKN7android2spINS_8ISurfaceEEEPKc20" + "OMX_COLOR_FORMATTYPEjjjj"); + + if (func) { + mTarget = + (*func)(surface, componentName, colorFormat, + displayWidth, displayHeight, decodedWidth, decodedHeight); + } + } + + if (mTarget == NULL) { + mTarget = new SoftwareRenderer( + colorFormat, surface, displayWidth, displayHeight, + decodedWidth, decodedHeight); + } +} + AwesomePlayer::AwesomePlayer() : mTimeSource(NULL), mAudioPlayer(NULL), @@ -448,6 +504,7 @@ void AwesomePlayer::initRenderer_l() { // Other decoders are instantiated locally and as a consequence // allocate their buffers in local address space. mVideoRenderer = new AwesomeLocalRenderer( + component, (OMX_COLOR_FORMATTYPE)format, mISurface, mVideoWidth, mVideoHeight, |