@@ -45,17 +45,12 @@ namespace android {
4545static Mutex gWVMutex ;
4646
4747WVMExtractor::WVMExtractor (const sp<DataSource> &source)
48- : mDataSource (source) {
49- {
50- Mutex::Autolock autoLock (gWVMutex );
51- if (gVendorLibHandle == NULL ) {
52- gVendorLibHandle = dlopen (" libwvm.so" , RTLD_NOW);
53- }
48+ : mDataSource (source)
49+ {
50+ Mutex::Autolock autoLock (gWVMutex );
5451
55- if (gVendorLibHandle == NULL ) {
56- LOGE (" Failed to open libwvm.so" );
57- return ;
58- }
52+ if (!getVendorLibHandle ()) {
53+ return ;
5954 }
6055
6156 typedef WVMLoadableExtractor *(*GetInstanceFunc)(sp<DataSource>);
@@ -71,6 +66,19 @@ WVMExtractor::WVMExtractor(const sp<DataSource> &source)
7166 }
7267}
7368
69+ bool WVMExtractor::getVendorLibHandle ()
70+ {
71+ if (gVendorLibHandle == NULL ) {
72+ gVendorLibHandle = dlopen (" libwvm.so" , RTLD_NOW);
73+ }
74+
75+ if (gVendorLibHandle == NULL ) {
76+ LOGE (" Failed to open libwvm.so" );
77+ }
78+
79+ return gVendorLibHandle != NULL ;
80+ }
81+
7482WVMExtractor::~WVMExtractor () {
7583}
7684
@@ -113,5 +121,33 @@ void WVMExtractor::setAdaptiveStreamingMode(bool adaptive) {
113121 }
114122}
115123
124+ bool SniffWVM (
125+ const sp<DataSource> &source, String8 *mimeType, float *confidence,
126+ sp<AMessage> *) {
127+
128+ Mutex::Autolock autoLock (gWVMutex );
129+
130+ if (!WVMExtractor::getVendorLibHandle ()) {
131+ return false ;
132+ }
133+
134+ typedef WVMLoadableExtractor *(*SnifferFunc)(sp<DataSource>);
135+ SnifferFunc snifferFunc =
136+ (SnifferFunc) dlsym (gVendorLibHandle ,
137+ " _ZN7android15IsWidevineMediaENS_2spINS_10DataSourceEEE" );
138+
139+ if (snifferFunc) {
140+ if ((*snifferFunc)(source)) {
141+ *mimeType = MEDIA_MIMETYPE_CONTAINER_WVM;
142+ *confidence = 10 .0f ;
143+ return true ;
144+ }
145+ } else {
146+ LOGE (" IsWidevineMedia not found in libwvm.so" );
147+ }
148+
149+ return false ;
150+ }
151+
116152} // namespace android
117153
0 commit comments