Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 787ed44f authored by Wei Jia's avatar Wei Jia
Browse files

MediaPlayer2Factory: use on demand initialization for static variable.

Test: MediaPlayer2 plays
Bug: 63934228
Change-Id: I0eb42a9eaf61ba2d4d49900d2926288e932e65cb
parent 0defd00c
Loading
Loading
Loading
Loading
+28 −19
Original line number Diff line number Diff line
@@ -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 @@ status_t MediaPlayer2Factory::registerFactory_l(IFactory* factory,
        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 @@ static player2_type getDefaultPlayerType() {
    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;                                     \
    }                                                   \
                                                        \
    for (size_t i = 0; i < sFactoryMap->size(); ++i) {  \
                                                        \
        IFactory* v = sFactoryMap.valueAt(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 @@ sp<MediaPlayer2Base> MediaPlayer2Factory::createPlayer(
    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);

+3 −4
Original line number Diff line number Diff line
@@ -50,9 +50,6 @@ class MediaPlayer2Factory {
        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 @@ class MediaPlayer2Factory {

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