blob: 5ae80cc05d2c3a110a6024b98ae51cf4be11d0b7 [file] [log] [blame]
Gloria Wangb3714262010-11-01 15:53:16 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "WVMExtractor"
18#include <utils/Log.h>
19
20#include "include/WVMExtractor.h"
21
22#include <arpa/inet.h>
23#include <utils/String8.h>
James Dongf1d5aa12012-02-06 23:46:37 -080024#include <media/stagefright/foundation/ADebug.h>
Gloria Wangb3714262010-11-01 15:53:16 -070025#include <media/stagefright/Utils.h>
26#include <media/stagefright/DataSource.h>
27#include <media/stagefright/MediaSource.h>
28#include <media/stagefright/MediaDefs.h>
29#include <media/stagefright/MetaData.h>
30#include <media/stagefright/MediaErrors.h>
31#include <media/stagefright/MediaBuffer.h>
Gloria Wangb3714262010-11-01 15:53:16 -070032#include <dlfcn.h>
33
34#include <utils/Errors.h>
35
Jeff Tinkere3015452011-07-01 07:13:42 -070036/* The extractor lifetime is short - just long enough to get
37 * the media sources constructed - so the shared lib needs to remain open
38 * beyond the lifetime of the extractor. So keep the handle as a global
39 * rather than a member of the extractor
40 */
41void *gVendorLibHandle = NULL;
42
Gloria Wangb3714262010-11-01 15:53:16 -070043namespace android {
44
Jeff Tinkere3015452011-07-01 07:13:42 -070045static Mutex gWVMutex;
Gloria Wangb3714262010-11-01 15:53:16 -070046
47WVMExtractor::WVMExtractor(const sp<DataSource> &source)
James Dong9d2f3862012-01-10 08:24:37 -080048 : mDataSource(source)
49{
50 Mutex::Autolock autoLock(gWVMutex);
Gloria Wangb3714262010-11-01 15:53:16 -070051
James Dong9d2f3862012-01-10 08:24:37 -080052 if (!getVendorLibHandle()) {
53 return;
Gloria Wangb3714262010-11-01 15:53:16 -070054 }
55
Jeffrey Tinkercd0b0fe2011-05-21 18:19:17 -070056 typedef WVMLoadableExtractor *(*GetInstanceFunc)(sp<DataSource>);
Gloria Wangb3714262010-11-01 15:53:16 -070057 GetInstanceFunc getInstanceFunc =
Jeff Tinkere3015452011-07-01 07:13:42 -070058 (GetInstanceFunc) dlsym(gVendorLibHandle,
Gloria Wangb3714262010-11-01 15:53:16 -070059 "_ZN7android11GetInstanceENS_2spINS_10DataSourceEEE");
60
61 if (getInstanceFunc) {
Andreas Huber16087352012-04-13 14:54:36 -070062 if (source->DrmInitialization(
63 MEDIA_MIMETYPE_CONTAINER_WVM) != NULL) {
64 mImpl = (*getInstanceFunc)(source);
65 CHECK(mImpl != NULL);
66 setDrmFlag(true);
67 } else {
68 ALOGE("Drm manager failed to initialize.");
69 }
Gloria Wangb3714262010-11-01 15:53:16 -070070 } else {
Steve Block29357bc2012-01-06 19:20:56 +000071 ALOGE("Failed to locate GetInstance in libwvm.so");
Gloria Wangb3714262010-11-01 15:53:16 -070072 }
73}
74
Glenn Kasten75e35132012-10-12 15:59:28 -070075static void init_routine()
James Dong9d2f3862012-01-10 08:24:37 -080076{
Glenn Kasten75e35132012-10-12 15:59:28 -070077 gVendorLibHandle = dlopen("libwvm.so", RTLD_NOW);
James Dong9d2f3862012-01-10 08:24:37 -080078 if (gVendorLibHandle == NULL) {
79 ALOGE("Failed to open libwvm.so");
80 }
Glenn Kasten75e35132012-10-12 15:59:28 -070081}
82
83bool WVMExtractor::getVendorLibHandle()
84{
85 static pthread_once_t sOnceControl = PTHREAD_ONCE_INIT;
86 pthread_once(&sOnceControl, init_routine);
James Dong9d2f3862012-01-10 08:24:37 -080087
88 return gVendorLibHandle != NULL;
89}
90
Gloria Wangb3714262010-11-01 15:53:16 -070091WVMExtractor::~WVMExtractor() {
92}
93
94size_t WVMExtractor::countTracks() {
95 return (mImpl != NULL) ? mImpl->countTracks() : 0;
96}
97
98sp<MediaSource> WVMExtractor::getTrack(size_t index) {
99 if (mImpl == NULL) {
100 return NULL;
101 }
102 return mImpl->getTrack(index);
103}
104
105sp<MetaData> WVMExtractor::getTrackMetaData(size_t index, uint32_t flags) {
106 if (mImpl == NULL) {
107 return NULL;
108 }
109 return mImpl->getTrackMetaData(index, flags);
110}
111
112sp<MetaData> WVMExtractor::getMetaData() {
113 if (mImpl == NULL) {
114 return NULL;
115 }
116 return mImpl->getMetaData();
117}
118
Andreas Huber681755f2011-04-21 10:06:43 -0700119int64_t WVMExtractor::getCachedDurationUs(status_t *finalStatus) {
Jeffrey Tinkercd0b0fe2011-05-21 18:19:17 -0700120 if (mImpl == NULL) {
121 return 0;
122 }
Andreas Huber681755f2011-04-21 10:06:43 -0700123
Jeffrey Tinkercd0b0fe2011-05-21 18:19:17 -0700124 return mImpl->getCachedDurationUs(finalStatus);
Andreas Huber681755f2011-04-21 10:06:43 -0700125}
126
Jeffrey Tinkerf10f36d2012-08-23 01:56:53 -0700127status_t WVMExtractor::getEstimatedBandwidthKbps(int32_t *kbps) {
128 if (mImpl == NULL) {
129 return UNKNOWN_ERROR;
130 }
131
132 return mImpl->getEstimatedBandwidthKbps(kbps);
133}
134
135
Andreas Huber681755f2011-04-21 10:06:43 -0700136void WVMExtractor::setAdaptiveStreamingMode(bool adaptive) {
Jeffrey Tinkercd0b0fe2011-05-21 18:19:17 -0700137 if (mImpl != NULL) {
138 mImpl->setAdaptiveStreamingMode(adaptive);
139 }
Andreas Huber681755f2011-04-21 10:06:43 -0700140}
141
Jeff Tinkered709d02012-04-26 10:38:47 -0700142void WVMExtractor::setCryptoPluginMode(bool cryptoPluginMode) {
143 if (mImpl != NULL) {
144 mImpl->setCryptoPluginMode(cryptoPluginMode);
145 }
146}
147
Jeff Tinkerdce41612012-02-14 14:54:01 -0800148void WVMExtractor::setUID(uid_t uid) {
149 if (mImpl != NULL) {
150 mImpl->setUID(uid);
151 }
152}
153
Edwin Wongac1b7162012-09-06 14:07:37 -0700154status_t WVMExtractor::getError() {
155 if (mImpl == NULL) {
156 return UNKNOWN_ERROR;
157 }
158
159 return mImpl->getError();
160}
161
162void WVMExtractor::setError(status_t err) {
163 if (mImpl != NULL) {
164 mImpl->setError(err);
165 }
166}
167
James Dong9d2f3862012-01-10 08:24:37 -0800168bool SniffWVM(
169 const sp<DataSource> &source, String8 *mimeType, float *confidence,
170 sp<AMessage> *) {
171
172 Mutex::Autolock autoLock(gWVMutex);
173
174 if (!WVMExtractor::getVendorLibHandle()) {
175 return false;
176 }
177
178 typedef WVMLoadableExtractor *(*SnifferFunc)(const sp<DataSource>&);
179 SnifferFunc snifferFunc =
180 (SnifferFunc) dlsym(gVendorLibHandle,
181 "_ZN7android15IsWidevineMediaERKNS_2spINS_10DataSourceEEE");
182
183 if (snifferFunc) {
184 if ((*snifferFunc)(source)) {
185 *mimeType = MEDIA_MIMETYPE_CONTAINER_WVM;
186 *confidence = 10.0f;
187 return true;
188 }
189 } else {
190 ALOGE("IsWidevineMedia not found in libwvm.so");
191 }
192
193 return false;
194}
195
Gloria Wangb3714262010-11-01 15:53:16 -0700196} //namespace android
197