1826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev/*--------------------------------------------------------------------------
2dd5743ee305c8db17facba3e0176a3d07adc7499Rom LemarchandCopyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
3826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
4826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevRedistribution and use in source and binary forms, with or without
5826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevmodification, are permitted provided that the following conditions are met:
6826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * Redistributions of source code must retain the above copyright
7826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      notice, this list of conditions and the following disclaimer.
8826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    * Redistributions in binary form must reproduce the above copyright
9826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      notice, this list of conditions and the following disclaimer in the
10826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      documentation and/or other materials provided with the distribution.
11dd5743ee305c8db17facba3e0176a3d07adc7499Rom Lemarchand    * Neither the name of Code Aurora nor
12826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      the names of its contributors may be used to endorse or promote
13826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      products derived from this software without specific prior written
14826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev      permission.
15826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
16826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev--------------------------------------------------------------------------*/
28826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
29826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include "DivXDrmDecrypt.h"
30826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <dlfcn.h>  // for dlopen/dlclose
31826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
32826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev//#define LOG_NDEBUG 0
33826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define LOG_TAG "DivXDrmDecrypt"
34826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#ifdef _ANDROID_
35826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <utils/Log.h>
36826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#else
37826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <stdio.h>
38826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#define ALOGE(fmt, args...) fprintf(stderr, fmt, ##args)
39826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#endif /* _ANDROID_ */
40826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
41826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevstatic const char* DIVX_DRM_SHIM_LIB = "libSHIMDivxDrm.so";
42826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
43826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchevvoid* getDecryptHandle() {
44826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    static void* decryptLib = NULL;
45826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    static bool  decryptLibOpened = false;
46826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
47826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(decryptLibOpened) {
48826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return decryptLib;
49826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
50826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
51826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    decryptLib = ::dlopen(DIVX_DRM_SHIM_LIB, RTLD_NOW);
52826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    decryptLibOpened = true;
53826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
54826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (decryptLib == NULL) {
55826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ALOGE("Failed to open DIVX_DRM_SHIM_LIB \n");
56826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
57826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
58826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return decryptLib;
59826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
60826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
61826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDivXDrmDecryptFactory DrmDecryptFactoryFunction() {
62826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    static DivXDrmDecryptFactory drmDecryptFactoryFunction = NULL;
63826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    static bool alreadyTriedToFindFactoryFunction = false;
64826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
65826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(alreadyTriedToFindFactoryFunction) {
66826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return drmDecryptFactoryFunction;
67826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
68826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
69826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    void *pDecryptLib = getDecryptHandle();
70826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if (pDecryptLib == NULL) {
71826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return NULL;
72826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
73826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
74826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    drmDecryptFactoryFunction = (DivXDrmDecryptFactory) dlsym(pDecryptLib, MEDIA_CREATE_DIVX_DRM_DECRYPT);
75826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    alreadyTriedToFindFactoryFunction = true;
76826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
77826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if(!drmDecryptFactoryFunction) {
78826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ALOGE(" dlsym for DrmDecrypt factory function failed \n");
79826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
80826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
81826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return drmDecryptFactoryFunction;
82826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
83826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
84826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
85826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
86826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan MalchevDivXDrmDecrypt* DivXDrmDecrypt::Create() {
87826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DivXDrmDecryptFactory drmCreateFunc = DrmDecryptFactoryFunction();
88826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if( drmCreateFunc == NULL ) {
89826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        return NULL;
90826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
91826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
92826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    DivXDrmDecrypt* decrypt = drmCreateFunc();
93826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    if( decrypt == NULL ) {
94826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev        ALOGE(" failed to instantiate DrmDecoder \n");
95826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    }
96826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return decrypt;
97826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev}
98826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
99