Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d6b6bf93 authored by Andreas Huber's avatar Andreas Huber Committed by Android (Google) Code Review
Browse files

Merge "Properly unload the renderer shared library after the renderer goes away."

parents fde32903 078f7f05
Loading
Loading
Loading
Loading
+38 −5
Original line number Diff line number Diff line
@@ -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<IOMXRenderer> OMX::createRenderer(
        const sp<ISurface> &surface,
        const char *componentName,
@@ -411,11 +438,7 @@ sp<IOMXRenderer> 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<IOMXRenderer> 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;
        }
    }