1bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross/*
2bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross * Copyright (C) 2012 The Android Open Source Project
3bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross *
4bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross * Licensed under the Apache License, Version 2.0 (the "License");
5bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross * you may not use this file except in compliance with the License.
6bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross * You may obtain a copy of the License at
7bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross *
8bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross *      http://www.apache.org/licenses/LICENSE-2.0
9bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross *
10bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross * Unless required by applicable law or agreed to in writing, software
11bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross * distributed under the License is distributed on an "AS IS" BASIS,
12bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross * See the License for the specific language governing permissions and
14bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross * limitations under the License.
15bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross */
16bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
17bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross#include <dlfcn.h>
18bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
19bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross#include <media/stagefright/DataSource.h>
20bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
21bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross#include "include/chromium_http_stub.h"
22bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross#include "include/HTTPBase.h"
23bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
24bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Crossnamespace android {
25bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
26bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Crossstatic bool gFirst = true;
27bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Crossstatic void *gHandle;
28bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Crossstatic Mutex gLibMutex;
29bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
30bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin CrossHTTPBase *(*gLib_createChromiumHTTPDataSource)(uint32_t flags);
31bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin CrossDataSource *(*gLib_createDataUriSource)(const char *uri);
32bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
33bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Crossstatic bool load_libstagefright_chromium_http() {
34bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    Mutex::Autolock autoLock(gLibMutex);
35bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    void *sym;
36bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
37bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    if (!gFirst) {
38bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross        return (gHandle != NULL);
39bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    }
40bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
41bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    gFirst = false;
42bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
43bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    gHandle = dlopen("libstagefright_chromium_http.so", RTLD_NOW);
44bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    if (gHandle == NULL) {
45bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross        return false;
46bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    }
47bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
48bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    sym = dlsym(gHandle, "createChromiumHTTPDataSource");
49bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    if (sym == NULL) {
50bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross        gHandle = NULL;
51bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross        return false;
52bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    }
53bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    gLib_createChromiumHTTPDataSource = (HTTPBase *(*)(uint32_t))sym;
54bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
55bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    sym = dlsym(gHandle, "createDataUriSource");
56bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    if (sym == NULL) {
57bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross        gHandle = NULL;
58bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross        return false;
59bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    }
60bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    gLib_createDataUriSource = (DataSource *(*)(const char *))sym;
61bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
62bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    return true;
63bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross}
64bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
65bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin CrossHTTPBase *createChromiumHTTPDataSource(uint32_t flags) {
66bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    if (!load_libstagefright_chromium_http()) {
67bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross        return NULL;
68bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    }
69bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
70bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    return gLib_createChromiumHTTPDataSource(flags);
71bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross}
72bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
73bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin CrossDataSource *createDataUriSource(const char *uri) {
74bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    if (!load_libstagefright_chromium_http()) {
75bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross        return NULL;
76bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    }
77bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
78bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross    return gLib_createDataUriSource(uri);
79bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross}
80bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross
81bea455c8e4a230cc5aedc9df33e1ba97c64cec5fColin Cross}
82