1#define LOG_TAG "omx_interface"
2#include <utils/Log.h>
3
4#include "pvlogger.h"
5
6#include "pv_omxcore.h"
7#include "omx_interface.h"
8
9// this is the name of the original SO that contains your OMX core
10#define OMX_CORE_LIBRARY "libOMX_Core.so"
11
12class TIOMXInterface : public OMXInterface
13{
14    public:
15        // Handle to the OMX core library
16        void* ipHandle;
17
18        ~TIOMXInterface()
19        {
20            if ((NULL != ipHandle) && (0 != dlclose(ipHandle)))
21            {
22                // dlclose() returns non-zero value if close failed, check for errors
23                const char* pErr = dlerror();
24                if (NULL != pErr)
25                {
26                    ALOGE("TIOMXInterface: Error closing library: %s\n", pErr);
27                }
28                else
29                {
30                    ALOGE("OsclSharedLibrary::Close: Error closing library, no error reported");
31                }
32            }
33
34            ipHandle = NULL;
35        };
36
37        OsclAny* SharedLibraryLookup(const OsclUuid& aInterfaceId)
38        {
39            // Make sure ipHandle is valid. If ipHandle is NULL, the dlopen
40            // call failed.
41            if (ipHandle && aInterfaceId == OMX_INTERFACE_ID)
42            {
43                ALOGD("TIOMXInterface: library lookup success\n");
44                // the library lookup was successful
45                return this;
46            }
47            // the ID doesn't match
48            ALOGE("TIOMXInterface: library lookup failed\n");
49            return NULL;
50        };
51
52        static TIOMXInterface* Instance()
53        {
54            ALOGD("TIOMXInterface: creating interface\n");
55            return OSCL_NEW(TIOMXInterface, ());
56        };
57
58        bool UnloadWhenNotUsed(void)
59        {
60            // As of 9/22/08, the PV OMX core library can not be
61            // safely unloaded and reloaded when the proxy interface
62            // is enabled.
63            return false;
64        };
65
66    private:
67
68        TIOMXInterface()
69        {
70            ALOGD("Calling DLOPEN on OMX_CORE_LIBRARY (%s)\n", OMX_CORE_LIBRARY);
71            ipHandle = dlopen(OMX_CORE_LIBRARY, RTLD_NOW);
72
73            if (NULL == ipHandle)
74            {
75                pOMX_Init = NULL;
76                pOMX_Deinit = NULL;
77                pOMX_ComponentNameEnum = NULL;
78                pOMX_GetHandle = NULL;
79                pOMX_FreeHandle = NULL;
80                pOMX_GetComponentsOfRole = NULL;
81                pOMX_GetRolesOfComponent = NULL;
82                pOMX_SetupTunnel = NULL;
83                pOMX_GetContentPipe = NULL;
84                // added extra method to enable config parsing without instantiating the component
85                pOMXConfigParser = NULL;
86
87                // check for errors
88                const char* pErr = dlerror();
89                if (NULL == pErr)
90                {
91                    // No error reported, but no handle to the library
92                    ALOGE("OsclLib::LoadLibrary: Error opening "
93                         "library (%s) but no error reported\n", OMX_CORE_LIBRARY);
94                }
95                else
96                {
97                    // Error reported
98                    ALOGE("OsclLib::LoadLibrary: Error opening "
99                         "library (%s): %s\n", OMX_CORE_LIBRARY, pErr);
100                }
101            }
102            else
103            {
104                ALOGD("DLOPEN SUCCEEDED (%s)\n", OMX_CORE_LIBRARY);
105                // Lookup all the symbols in the OMX core
106                pOMX_Init = (tpOMX_Init)dlsym(ipHandle, "TIOMX_Init");
107                pOMX_Deinit = (tpOMX_Deinit)dlsym(ipHandle, "TIOMX_Deinit");
108                pOMX_ComponentNameEnum = (tpOMX_ComponentNameEnum)dlsym(ipHandle, "TIOMX_ComponentNameEnum");
109                pOMX_GetHandle = (tpOMX_GetHandle)dlsym(ipHandle, "TIOMX_GetHandle");
110                pOMX_FreeHandle = (tpOMX_FreeHandle)dlsym(ipHandle, "TIOMX_FreeHandle");
111                pOMX_GetComponentsOfRole = (tpOMX_GetComponentsOfRole)dlsym(ipHandle, "TIOMX_GetComponentsOfRole");
112                pOMX_GetRolesOfComponent = (tpOMX_GetRolesOfComponent)dlsym(ipHandle, "TIOMX_GetRolesOfComponent");
113                pOMX_SetupTunnel = (tpOMX_SetupTunnel)dlsym(ipHandle, "TIOMX_SetupTunnel");
114                pOMXConfigParser = (tpOMXConfigParser)dlsym(ipHandle, "TIOMXConfigParserRedirect");
115                pOMX_GetContentPipe = NULL; // (tpOMX_GetContentPipe)dlsym(ipHandle, "OMX_GetContentPipe");
116            }
117        };
118
119};
120
121// function to obtain the interface object from the shared library
122extern "C"
123{
124    OSCL_EXPORT_REF OsclAny* PVGetInterface()
125    {
126        return TIOMXInterface::Instance();
127    }
128
129    OSCL_EXPORT_REF void PVReleaseInterface(OsclSharedLibraryInterface* aInstance)
130    {
131        TIOMXInterface* instance = (TIOMXInterface*)aInstance;
132        if (instance)
133            OSCL_DELETE(instance);
134    }
135}
136
137