MediaPlayer2Factory: use on demand initialization for static variable.
Test: MediaPlayer2 plays
Bug: 63934228
Change-Id: I0eb42a9eaf61ba2d4d49900d2926288e932e65cb
diff --git a/media/libmedia/MediaPlayer2Factory.cpp b/media/libmedia/MediaPlayer2Factory.cpp
index df567ce..ac115f6 100644
--- a/media/libmedia/MediaPlayer2Factory.cpp
+++ b/media/libmedia/MediaPlayer2Factory.cpp
@@ -34,9 +34,17 @@
namespace android {
Mutex MediaPlayer2Factory::sLock;
-MediaPlayer2Factory::tFactoryMap MediaPlayer2Factory::sFactoryMap;
+MediaPlayer2Factory::tFactoryMap *MediaPlayer2Factory::sFactoryMap;
bool MediaPlayer2Factory::sInitComplete = false;
+// static
+bool MediaPlayer2Factory::ensureInit_l() {
+ if (sFactoryMap == NULL) {
+ sFactoryMap = new (std::nothrow) tFactoryMap();
+ }
+ return (sFactoryMap != NULL);
+}
+
status_t MediaPlayer2Factory::registerFactory_l(IFactory* factory,
player2_type type) {
if (NULL == factory) {
@@ -45,13 +53,17 @@
return BAD_VALUE;
}
- if (sFactoryMap.indexOfKey(type) >= 0) {
+ if (!ensureInit_l()) {
+ return NO_INIT;
+ }
+
+ if (sFactoryMap->indexOfKey(type) >= 0) {
ALOGE("Failed to register MediaPlayer2Factory of type %d, type is"
" already registered.", type);
return ALREADY_EXISTS;
}
- if (sFactoryMap.add(type, factory) < 0) {
+ if (sFactoryMap->add(type, factory) < 0) {
ALOGE("Failed to register MediaPlayer2Factory of type %d, failed to add"
" to map.", type);
return UNKNOWN_ERROR;
@@ -64,31 +76,24 @@
return PLAYER2_NU_PLAYER2;
}
-status_t MediaPlayer2Factory::registerFactory(IFactory* factory,
- player2_type type) {
- Mutex::Autolock lock_(&sLock);
- return registerFactory_l(factory, type);
-}
-
-void MediaPlayer2Factory::unregisterFactory(player2_type type) {
- Mutex::Autolock lock_(&sLock);
- sFactoryMap.removeItem(type);
-}
-
#define GET_PLAYER_TYPE_IMPL(a...) \
Mutex::Autolock lock_(&sLock); \
\
player2_type ret = PLAYER2_STAGEFRIGHT_PLAYER; \
float bestScore = 0.0; \
\
- for (size_t i = 0; i < sFactoryMap.size(); ++i) { \
+ if (!ensureInit_l()) { \
+ return ret; \
+ } \
\
- IFactory* v = sFactoryMap.valueAt(i); \
+ for (size_t i = 0; i < sFactoryMap->size(); ++i) { \
+ \
+ IFactory* v = sFactoryMap->valueAt(i); \
float thisScore; \
CHECK(v != NULL); \
thisScore = v->scoreFactory(a, bestScore); \
if (thisScore > bestScore) { \
- ret = sFactoryMap.keyAt(i); \
+ ret = sFactoryMap->keyAt(i); \
bestScore = thisScore; \
} \
} \
@@ -133,13 +138,17 @@
status_t init_result;
Mutex::Autolock lock_(&sLock);
- if (sFactoryMap.indexOfKey(playerType) < 0) {
+ if (!ensureInit_l()) {
+ return NULL;
+ }
+
+ if (sFactoryMap->indexOfKey(playerType) < 0) {
ALOGE("Failed to create player object of type %d, no registered"
" factory", playerType);
return p;
}
- factory = sFactoryMap.valueFor(playerType);
+ factory = sFactoryMap->valueFor(playerType);
CHECK(NULL != factory);
p = factory->createPlayer(pid);
diff --git a/media/libmedia/MediaPlayer2Factory.h b/media/libmedia/MediaPlayer2Factory.h
index 799b5f3..416d241 100644
--- a/media/libmedia/MediaPlayer2Factory.h
+++ b/media/libmedia/MediaPlayer2Factory.h
@@ -50,9 +50,6 @@
virtual sp<MediaPlayer2Base> createPlayer(pid_t pid) = 0;
};
- static status_t registerFactory(IFactory* factory,
- player2_type type);
- static void unregisterFactory(player2_type type);
static player2_type getPlayerType(const sp<MediaPlayer2Engine>& client,
const char* url);
static player2_type getPlayerType(const sp<MediaPlayer2Engine>& client,
@@ -76,11 +73,13 @@
MediaPlayer2Factory() { }
+ static bool ensureInit_l();
+
static status_t registerFactory_l(IFactory* factory,
player2_type type);
static Mutex sLock;
- static tFactoryMap sFactoryMap;
+ static tFactoryMap *sFactoryMap;
static bool sInitComplete;
DISALLOW_EVIL_CONSTRUCTORS(MediaPlayer2Factory);