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);