WVMExtractor.cpp revision 9d2f386dd2885eaffa11fd494ae258bb09fe6397
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 36e301545a292987b6f7f3b316003eb8b76e3a5e2eJeff Tinker/* The extractor lifetime is short - just long enough to get 37e301545a292987b6f7f3b316003eb8b76e3a5e2eJeff Tinker * the media sources constructed - so the shared lib needs to remain open 38e301545a292987b6f7f3b316003eb8b76e3a5e2eJeff Tinker * beyond the lifetime of the extractor. So keep the handle as a global 39e301545a292987b6f7f3b316003eb8b76e3a5e2eJeff Tinker * rather than a member of the extractor 40e301545a292987b6f7f3b316003eb8b76e3a5e2eJeff Tinker */ 41e301545a292987b6f7f3b316003eb8b76e3a5e2eJeff Tinkervoid *gVendorLibHandle = NULL; 42e301545a292987b6f7f3b316003eb8b76e3a5e2eJeff Tinker 43b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangnamespace android { 44b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 45e301545a292987b6f7f3b316003eb8b76e3a5e2eJeff Tinkerstatic Mutex gWVMutex; 46b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 47b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria WangWVMExtractor::WVMExtractor(const sp<DataSource> &source) 489d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong : mDataSource(source) 499d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong{ 509d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong Mutex::Autolock autoLock(gWVMutex); 51b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 529d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (!getVendorLibHandle()) { 539d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return; 54b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 55b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 56cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker typedef WVMLoadableExtractor *(*GetInstanceFunc)(sp<DataSource>); 57b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang GetInstanceFunc getInstanceFunc = 58e301545a292987b6f7f3b316003eb8b76e3a5e2eJeff Tinker (GetInstanceFunc) dlsym(gVendorLibHandle, 59b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang "_ZN7android11GetInstanceENS_2spINS_10DataSourceEEE"); 60b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 61b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (getInstanceFunc) { 629d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong CHECK(source->DrmInitialization(MEDIA_MIMETYPE_CONTAINER_WVM) != NULL); 63b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang mImpl = (*getInstanceFunc)(source); 64b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang CHECK(mImpl != NULL); 659d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong setDrmFlag(true); 66b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } else { 6729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to locate GetInstance in libwvm.so"); 68b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 69b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 70b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 719d2f386dd2885eaffa11fd494ae258bb09fe6397James Dongbool WVMExtractor::getVendorLibHandle() 729d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong{ 739d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (gVendorLibHandle == NULL) { 749d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong gVendorLibHandle = dlopen("libwvm.so", RTLD_NOW); 759d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 769d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 779d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (gVendorLibHandle == NULL) { 789d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong ALOGE("Failed to open libwvm.so"); 799d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 809d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 819d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return gVendorLibHandle != NULL; 829d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong} 839d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 84b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria WangWVMExtractor::~WVMExtractor() { 85b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 86b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 87b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsize_t WVMExtractor::countTracks() { 88b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return (mImpl != NULL) ? mImpl->countTracks() : 0; 89b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 90b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 91b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsp<MediaSource> WVMExtractor::getTrack(size_t index) { 92b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mImpl == NULL) { 93b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return NULL; 94b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 95b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return mImpl->getTrack(index); 96b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 97b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 98b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsp<MetaData> WVMExtractor::getTrackMetaData(size_t index, uint32_t flags) { 99b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mImpl == NULL) { 100b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return NULL; 101b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 102b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return mImpl->getTrackMetaData(index, flags); 103b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 104b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 105b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsp<MetaData> WVMExtractor::getMetaData() { 106b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mImpl == NULL) { 107b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return NULL; 108b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 109b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return mImpl->getMetaData(); 110b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 111b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 112681755fc0d0797506456f46a2a10555916d6be32Andreas Huberint64_t WVMExtractor::getCachedDurationUs(status_t *finalStatus) { 113cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker if (mImpl == NULL) { 114cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker return 0; 115cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker } 116681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 117cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker return mImpl->getCachedDurationUs(finalStatus); 118681755fc0d0797506456f46a2a10555916d6be32Andreas Huber} 119681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 120681755fc0d0797506456f46a2a10555916d6be32Andreas Hubervoid WVMExtractor::setAdaptiveStreamingMode(bool adaptive) { 121cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker if (mImpl != NULL) { 122cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker mImpl->setAdaptiveStreamingMode(adaptive); 123cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker } 124681755fc0d0797506456f46a2a10555916d6be32Andreas Huber} 125681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 1269d2f386dd2885eaffa11fd494ae258bb09fe6397James Dongbool SniffWVM( 1279d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong const sp<DataSource> &source, String8 *mimeType, float *confidence, 1289d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong sp<AMessage> *) { 1299d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 1309d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong Mutex::Autolock autoLock(gWVMutex); 1319d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 1329d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (!WVMExtractor::getVendorLibHandle()) { 1339d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return false; 1349d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 1359d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 1369d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong typedef WVMLoadableExtractor *(*SnifferFunc)(const sp<DataSource>&); 1379d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong SnifferFunc snifferFunc = 1389d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong (SnifferFunc) dlsym(gVendorLibHandle, 1399d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong "_ZN7android15IsWidevineMediaERKNS_2spINS_10DataSourceEEE"); 1409d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 1419d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (snifferFunc) { 1429d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if ((*snifferFunc)(source)) { 1439d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong *mimeType = MEDIA_MIMETYPE_CONTAINER_WVM; 1449d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong *confidence = 10.0f; 1459d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return true; 1469d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 1479d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } else { 1489d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong ALOGE("IsWidevineMedia not found in libwvm.so"); 1499d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 1509d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 1519d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return false; 1529d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong} 1539d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 154b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} //namespace android 155b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 156