WVMExtractor.cpp revision b371426ce4cf2fa6d8c3d1903b61322feb165d35
1b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang/* 2b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * Copyright (C) 2010 The Android Open Source Project 3b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * 4b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * you may not use this file except in compliance with the License. 6b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * You may obtain a copy of the License at 7b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * 8b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * http://www.apache.org/licenses/LICENSE-2.0 9b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * 10b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * Unless required by applicable law or agreed to in writing, software 11b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * distributed under the License is distributed on an "AS IS" BASIS, 12b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * See the License for the specific language governing permissions and 14b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * limitations under the License. 15b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang */ 16b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 17b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#define LOG_TAG "WVMExtractor" 18b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <utils/Log.h> 19b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 20b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include "include/WVMExtractor.h" 21b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 22b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <arpa/inet.h> 23b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <utils/String8.h> 24b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/Utils.h> 25b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/DataSource.h> 26b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaSource.h> 27b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaDefs.h> 28b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MetaData.h> 29b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaErrors.h> 30b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaBuffer.h> 31b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaDebug.h> 32b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <dlfcn.h> 33b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 34b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <utils/Errors.h> 35b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 36b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang/* The extractor lifetime is short - just long enough to get 37b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * the media sources constructed - so the shared lib needs to remain open 38b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * beyond the lifetime of the extractor. So keep the handle as a global 39b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang * rather than a member of the extractor 40b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang */ 41b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangvoid *gVendorLibHandle = NULL; 42b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 43b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangnamespace android { 44b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 45b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangstatic Mutex gWVMutex; 46b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 47b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria WangWVMExtractor::WVMExtractor(const sp<DataSource> &source) 48b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang : mDataSource(source) { 49b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang { 50b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang Mutex::Autolock autoLock(gWVMutex); 51b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (gVendorLibHandle == NULL) { 52b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang gVendorLibHandle = dlopen("libwvm.so", RTLD_NOW); 53b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 54b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 55b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (gVendorLibHandle == NULL) { 56b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang LOGE("Failed to open libwvm.so"); 57b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return; 58b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 59b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 60b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 61b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang typedef MediaExtractor *(*GetInstanceFunc)(sp<DataSource>); 62b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang GetInstanceFunc getInstanceFunc = 63b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang (GetInstanceFunc) dlsym(gVendorLibHandle, 64b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang "_ZN7android11GetInstanceENS_2spINS_10DataSourceEEE"); 65b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 66b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (getInstanceFunc) { 67b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang LOGD("Calling GetInstanceFunc"); 68b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang mImpl = (*getInstanceFunc)(source); 69b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang CHECK(mImpl != NULL); 70b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } else { 71b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang LOGE("Failed to locate GetInstance in libwvm.so"); 72b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 73b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 74b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 75b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria WangWVMExtractor::~WVMExtractor() { 76b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 77b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 78b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsize_t WVMExtractor::countTracks() { 79b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return (mImpl != NULL) ? mImpl->countTracks() : 0; 80b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 81b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 82b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsp<MediaSource> WVMExtractor::getTrack(size_t index) { 83b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mImpl == NULL) { 84b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return NULL; 85b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 86b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return mImpl->getTrack(index); 87b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 88b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 89b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsp<MetaData> WVMExtractor::getTrackMetaData(size_t index, uint32_t flags) { 90b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mImpl == NULL) { 91b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return NULL; 92b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 93b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return mImpl->getTrackMetaData(index, flags); 94b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 95b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 96b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsp<MetaData> WVMExtractor::getMetaData() { 97b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mImpl == NULL) { 98b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return NULL; 99b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 100b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return mImpl->getMetaData(); 101b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 102b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 103b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} //namespace android 104b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 105