summaryrefslogtreecommitdiffstats
path: root/media/libstagefright
diff options
context:
space:
mode:
authorJeff Tinker <jtinker@google.com>2011-06-28 10:12:08 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-06-28 10:12:08 -0700
commit306bafcd7cabeb9059e066296cd225b8b03968a2 (patch)
treee5a598c909be525ba8b1a6db14cbbd2abdc070c9 /media/libstagefright
parent1e06f435434681f8750cc21763868fd025e8480e (diff)
parent50255a92dfb2ffd35955035ae9ac9d4b85f606b8 (diff)
downloadframeworks_av-306bafcd7cabeb9059e066296cd225b8b03968a2.zip
frameworks_av-306bafcd7cabeb9059e066296cd225b8b03968a2.tar.gz
frameworks_av-306bafcd7cabeb9059e066296cd225b8b03968a2.tar.bz2
Merge "Fix for b/4165024: Serious Memory leak when playing a WV protected streaming video."
Diffstat (limited to 'media/libstagefright')
-rw-r--r--media/libstagefright/WVMExtractor.cpp36
-rw-r--r--media/libstagefright/include/WVMExtractor.h5
2 files changed, 28 insertions, 13 deletions
diff --git a/media/libstagefright/WVMExtractor.cpp b/media/libstagefright/WVMExtractor.cpp
index 26eda0c..7072d58 100644
--- a/media/libstagefright/WVMExtractor.cpp
+++ b/media/libstagefright/WVMExtractor.cpp
@@ -33,26 +33,25 @@
#include <utils/Errors.h>
-/* The extractor lifetime is short - just long enough to get
- * the media sources constructed - so the shared lib needs to remain open
- * beyond the lifetime of the extractor. So keep the handle as a global
- * rather than a member of the extractor
- */
-void *gVendorLibHandle = NULL;
-
namespace android {
-static Mutex gWVMutex;
+Mutex WVMExtractor::sMutex;
+uint32_t WVMExtractor::sActiveExtractors = 0;
+void *WVMExtractor::sVendorLibHandle = NULL;
WVMExtractor::WVMExtractor(const sp<DataSource> &source)
: mDataSource(source) {
{
- Mutex::Autolock autoLock(gWVMutex);
- if (gVendorLibHandle == NULL) {
- gVendorLibHandle = dlopen("libwvm.so", RTLD_NOW);
+ Mutex::Autolock autoLock(sMutex);
+
+ if (sVendorLibHandle == NULL) {
+ CHECK(sActiveExtractors == 0);
+ sVendorLibHandle = dlopen("libwvm.so", RTLD_NOW);
}
- if (gVendorLibHandle == NULL) {
+ sActiveExtractors++;
+
+ if (sVendorLibHandle == NULL) {
LOGE("Failed to open libwvm.so");
return;
}
@@ -60,7 +59,7 @@ WVMExtractor::WVMExtractor(const sp<DataSource> &source)
typedef WVMLoadableExtractor *(*GetInstanceFunc)(sp<DataSource>);
GetInstanceFunc getInstanceFunc =
- (GetInstanceFunc) dlsym(gVendorLibHandle,
+ (GetInstanceFunc) dlsym(sVendorLibHandle,
"_ZN7android11GetInstanceENS_2spINS_10DataSourceEEE");
if (getInstanceFunc) {
@@ -72,6 +71,17 @@ WVMExtractor::WVMExtractor(const sp<DataSource> &source)
}
WVMExtractor::~WVMExtractor() {
+ Mutex::Autolock autoLock(sMutex);
+
+ CHECK(sActiveExtractors > 0);
+ sActiveExtractors--;
+
+ // Close lib after last use
+ if (sActiveExtractors == 0) {
+ if (sVendorLibHandle != NULL)
+ dlclose(sVendorLibHandle);
+ sVendorLibHandle = NULL;
+ }
}
size_t WVMExtractor::countTracks() {
diff --git a/media/libstagefright/include/WVMExtractor.h b/media/libstagefright/include/WVMExtractor.h
index deecd25..0817bab 100644
--- a/media/libstagefright/include/WVMExtractor.h
+++ b/media/libstagefright/include/WVMExtractor.h
@@ -18,6 +18,7 @@
#define WVM_EXTRACTOR_H_
+#include <media/stagefright/DataSource.h>
#include <media/stagefright/MediaExtractor.h>
#include <utils/Errors.h>
@@ -67,6 +68,10 @@ private:
WVMExtractor(const WVMExtractor &);
WVMExtractor &operator=(const WVMExtractor &);
+
+ static Mutex sMutex;
+ static uint32_t sActiveExtractors;
+ static void *sVendorLibHandle;
};
} // namespace android