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> 24f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h> 25b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/Utils.h> 26b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/DataSource.h> 27b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaSource.h> 28b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaDefs.h> 29b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MetaData.h> 30b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaErrors.h> 31b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang#include <media/stagefright/MediaBuffer.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 45b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria WangWVMExtractor::WVMExtractor(const sp<DataSource> &source) 469d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong : mDataSource(source) 479d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong{ 489d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (!getVendorLibHandle()) { 499d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return; 50b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 51b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 52cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker typedef WVMLoadableExtractor *(*GetInstanceFunc)(sp<DataSource>); 53b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang GetInstanceFunc getInstanceFunc = 54e301545a292987b6f7f3b316003eb8b76e3a5e2eJeff Tinker (GetInstanceFunc) dlsym(gVendorLibHandle, 55b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang "_ZN7android11GetInstanceENS_2spINS_10DataSourceEEE"); 56b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 57b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (getInstanceFunc) { 581608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber if (source->DrmInitialization( 591608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber MEDIA_MIMETYPE_CONTAINER_WVM) != NULL) { 601608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber mImpl = (*getInstanceFunc)(source); 611608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber CHECK(mImpl != NULL); 621608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber setDrmFlag(true); 631608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber } else { 641608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber ALOGE("Drm manager failed to initialize."); 651608735ef488ecd8c3c012a3b0d4b1d4ef3d93c7Andreas Huber } 66b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } else { 6729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to locate GetInstance in libwvm.so"); 68b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 69b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 70b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 7175e351348e11f75b3db6b6ab388cc31d5702ea2eGlenn Kastenstatic void init_routine() 729d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong{ 7375e351348e11f75b3db6b6ab388cc31d5702ea2eGlenn Kasten gVendorLibHandle = dlopen("libwvm.so", RTLD_NOW); 749d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (gVendorLibHandle == NULL) { 75a77f7031c15dc8ead0228d6e15f41577bff511f2Elliott Hughes ALOGE("Failed to open libwvm.so: %s", dlerror()); 769d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 7775e351348e11f75b3db6b6ab388cc31d5702ea2eGlenn Kasten} 7875e351348e11f75b3db6b6ab388cc31d5702ea2eGlenn Kasten 7975e351348e11f75b3db6b6ab388cc31d5702ea2eGlenn Kastenbool WVMExtractor::getVendorLibHandle() 8075e351348e11f75b3db6b6ab388cc31d5702ea2eGlenn Kasten{ 8175e351348e11f75b3db6b6ab388cc31d5702ea2eGlenn Kasten static pthread_once_t sOnceControl = PTHREAD_ONCE_INIT; 8275e351348e11f75b3db6b6ab388cc31d5702ea2eGlenn Kasten pthread_once(&sOnceControl, init_routine); 839d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 849d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return gVendorLibHandle != NULL; 859d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong} 869d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 87b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria WangWVMExtractor::~WVMExtractor() { 88b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 89b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 90b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsize_t WVMExtractor::countTracks() { 91b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return (mImpl != NULL) ? mImpl->countTracks() : 0; 92b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 93b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 94b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissensp<IMediaSource> WVMExtractor::getTrack(size_t index) { 95b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mImpl == NULL) { 96b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return NULL; 97b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 98b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return mImpl->getTrack(index); 99b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 100b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 101b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsp<MetaData> WVMExtractor::getTrackMetaData(size_t index, uint32_t flags) { 102b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mImpl == NULL) { 103b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return NULL; 104b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 105b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return mImpl->getTrackMetaData(index, flags); 106b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 107b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 108b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wangsp<MetaData> WVMExtractor::getMetaData() { 109b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang if (mImpl == NULL) { 110b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return NULL; 111b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang } 112b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang return mImpl->getMetaData(); 113b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} 114b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 115681755fc0d0797506456f46a2a10555916d6be32Andreas Huberint64_t WVMExtractor::getCachedDurationUs(status_t *finalStatus) { 116cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker if (mImpl == NULL) { 117cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker return 0; 118cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker } 119681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 120cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker return mImpl->getCachedDurationUs(finalStatus); 121681755fc0d0797506456f46a2a10555916d6be32Andreas Huber} 122681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 123f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinkerstatus_t WVMExtractor::getEstimatedBandwidthKbps(int32_t *kbps) { 124f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker if (mImpl == NULL) { 125f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker return UNKNOWN_ERROR; 126f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker } 127f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker 128f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker return mImpl->getEstimatedBandwidthKbps(kbps); 129f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker} 130f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker 131f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker 132681755fc0d0797506456f46a2a10555916d6be32Andreas Hubervoid WVMExtractor::setAdaptiveStreamingMode(bool adaptive) { 133cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker if (mImpl != NULL) { 134cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker mImpl->setAdaptiveStreamingMode(adaptive); 135cd0b0fe858a9f109281031717d5c0001953b9054Jeffrey Tinker } 136681755fc0d0797506456f46a2a10555916d6be32Andreas Huber} 137681755fc0d0797506456f46a2a10555916d6be32Andreas Huber 138ed709d00ead015b8a0de50ebc410073f6a078fd5Jeff Tinkervoid WVMExtractor::setCryptoPluginMode(bool cryptoPluginMode) { 139ed709d00ead015b8a0de50ebc410073f6a078fd5Jeff Tinker if (mImpl != NULL) { 140ed709d00ead015b8a0de50ebc410073f6a078fd5Jeff Tinker mImpl->setCryptoPluginMode(cryptoPluginMode); 141ed709d00ead015b8a0de50ebc410073f6a078fd5Jeff Tinker } 142ed709d00ead015b8a0de50ebc410073f6a078fd5Jeff Tinker} 143ed709d00ead015b8a0de50ebc410073f6a078fd5Jeff Tinker 144dce4161f7d4d39498f69591e876f5fecdde95833Jeff Tinkervoid WVMExtractor::setUID(uid_t uid) { 145dce4161f7d4d39498f69591e876f5fecdde95833Jeff Tinker if (mImpl != NULL) { 146dce4161f7d4d39498f69591e876f5fecdde95833Jeff Tinker mImpl->setUID(uid); 147dce4161f7d4d39498f69591e876f5fecdde95833Jeff Tinker } 148dce4161f7d4d39498f69591e876f5fecdde95833Jeff Tinker} 149dce4161f7d4d39498f69591e876f5fecdde95833Jeff Tinker 150ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wongstatus_t WVMExtractor::getError() { 151ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wong if (mImpl == NULL) { 152ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wong return UNKNOWN_ERROR; 153ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wong } 154ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wong 155ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wong return mImpl->getError(); 156ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wong} 157ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wong 158ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wongvoid WVMExtractor::setError(status_t err) { 159ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wong if (mImpl != NULL) { 160ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wong mImpl->setError(err); 161ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wong } 162ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wong} 163ac1b71664dbdba1379f00fad2dcc3baa5f734d6bEdwin Wong 1649d2f386dd2885eaffa11fd494ae258bb09fe6397James Dongbool SniffWVM( 1659d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong const sp<DataSource> &source, String8 *mimeType, float *confidence, 1669d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong sp<AMessage> *) { 1679d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 1689d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (!WVMExtractor::getVendorLibHandle()) { 1699d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return false; 1709d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 1719d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 1729d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong typedef WVMLoadableExtractor *(*SnifferFunc)(const sp<DataSource>&); 1739d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong SnifferFunc snifferFunc = 1749d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong (SnifferFunc) dlsym(gVendorLibHandle, 1759d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong "_ZN7android15IsWidevineMediaERKNS_2spINS_10DataSourceEEE"); 1769d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 1779d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if (snifferFunc) { 1789d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong if ((*snifferFunc)(source)) { 1799d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong *mimeType = MEDIA_MIMETYPE_CONTAINER_WVM; 1809d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong *confidence = 10.0f; 1819d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return true; 1829d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 1839d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } else { 1849d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong ALOGE("IsWidevineMedia not found in libwvm.so"); 1859d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong } 1869d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 1879d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong return false; 1889d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong} 1899d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong 190b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang} //namespace android 191b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang 192