From 078f7f05d53ba8e92f4a72992edab732125af79f Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Mon, 22 Feb 2010 11:24:01 -0800 Subject: Properly unload the renderer shared library after the renderer goes away. --- media/libstagefright/omx/OMX.cpp | 43 +++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) (limited to 'media/libstagefright/omx') diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp index 9ca060d..ff8757d 100644 --- a/media/libstagefright/omx/OMX.cpp +++ b/media/libstagefright/omx/OMX.cpp @@ -401,6 +401,33 @@ void OMX::invalidateNodeID_l(node_id node) { //////////////////////////////////////////////////////////////////////////////// +struct SharedVideoRenderer : public VideoRenderer { + SharedVideoRenderer(void *libHandle, VideoRenderer *obj) + : mLibHandle(libHandle), + mObj(obj) { + } + + virtual ~SharedVideoRenderer() { + delete mObj; + mObj = NULL; + + dlclose(mLibHandle); + mLibHandle = NULL; + } + + virtual void render( + const void *data, size_t size, void *platformPrivate) { + return mObj->render(data, size, platformPrivate); + } + +private: + void *mLibHandle; + VideoRenderer *mObj; + + SharedVideoRenderer(const SharedVideoRenderer &); + SharedVideoRenderer &operator=(const SharedVideoRenderer &); +}; + sp OMX::createRenderer( const sp &surface, const char *componentName, @@ -411,11 +438,7 @@ sp OMX::createRenderer( VideoRenderer *impl = NULL; - static void *libHandle = NULL; - - if (!libHandle) { - libHandle = dlopen("libstagefrighthw.so", RTLD_NOW); - } + void *libHandle = dlopen("libstagefrighthw.so", RTLD_NOW); if (libHandle) { typedef VideoRenderer *(*CreateRendererFunc)( @@ -434,6 +457,16 @@ sp OMX::createRenderer( if (func) { impl = (*func)(surface, componentName, colorFormat, displayWidth, displayHeight, encodedWidth, encodedHeight); + + if (impl) { + impl = new SharedVideoRenderer(libHandle, impl); + libHandle = NULL; + } + } + + if (libHandle) { + dlclose(libHandle); + libHandle = NULL; } } -- cgit v1.1