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