144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman/*
244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman**
344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** Copyright 2012, The Android Open Source Project
444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman**
544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** Licensed under the Apache License, Version 2.0 (the "License");
644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** you may not use this file except in compliance with the License.
744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** You may obtain a copy of the License at
844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman**
944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman**     http://www.apache.org/licenses/LICENSE-2.0
1044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman**
1144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** Unless required by applicable law or agreed to in writing, software
1244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** distributed under the License is distributed on an "AS IS" BASIS,
1344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** See the License for the specific language governing permissions and
1544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** limitations under the License.
1644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman*/
1744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
1844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#define LOG_TAG "MediaPlayerFactory"
1944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <utils/Log.h>
2044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
2144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <cutils/properties.h>
2244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <media/IMediaPlayer.h>
2344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <media/stagefright/foundation/ADebug.h>
2444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <utils/Errors.h>
2544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <utils/misc.h>
2644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
2744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "MediaPlayerFactory.h"
2844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
2944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "MidiFile.h"
3044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "TestPlayerStub.h"
3144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "StagefrightPlayer.h"
3244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "nuplayer/NuPlayerDriver.h"
3344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
3444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmannamespace android {
3544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
3644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn GrossmanMutex MediaPlayerFactory::sLock;
3744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn GrossmanMediaPlayerFactory::tFactoryMap MediaPlayerFactory::sFactoryMap;
3844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanbool MediaPlayerFactory::sInitComplete = false;
3944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
4044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanstatus_t MediaPlayerFactory::registerFactory_l(IFactory* factory,
4144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                               player_type type) {
4244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (NULL == factory) {
4344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGE("Failed to register MediaPlayerFactory of type %d, factory is"
4444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman              " NULL.", type);
4544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return BAD_VALUE;
4644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
4744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
4844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (sFactoryMap.indexOfKey(type) >= 0) {
4944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGE("Failed to register MediaPlayerFactory of type %d, type is"
5044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman              " already registered.", type);
5144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return ALREADY_EXISTS;
5244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
5344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
5444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (sFactoryMap.add(type, factory) < 0) {
5544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGE("Failed to register MediaPlayerFactory of type %d, failed to add"
5644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman              " to map.", type);
5744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return UNKNOWN_ERROR;
5844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
5944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
6044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    return OK;
6144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
6244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
6344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getDefaultPlayerType() {
6444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    char value[PROPERTY_VALUE_MAX];
6544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (property_get("media.stagefright.use-nuplayer", value, NULL)
6644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            && (!strcmp("1", value) || !strcasecmp("true", value))) {
6744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return NU_PLAYER;
6844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
6944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
7044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    return STAGEFRIGHT_PLAYER;
7144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
7244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
7344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanstatus_t MediaPlayerFactory::registerFactory(IFactory* factory,
7444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                             player_type type) {
7544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    Mutex::Autolock lock_(&sLock);
7644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    return registerFactory_l(factory, type);
7744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
7844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
7944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanvoid MediaPlayerFactory::unregisterFactory(player_type type) {
8044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    Mutex::Autolock lock_(&sLock);
8144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    sFactoryMap.removeItem(type);
8244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
8344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
8444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#define GET_PLAYER_TYPE_IMPL(a...)                      \
8544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    Mutex::Autolock lock_(&sLock);                      \
8644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                        \
8744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    player_type ret = STAGEFRIGHT_PLAYER;               \
8844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    float bestScore = 0.0;                              \
8944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                        \
9044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    for (size_t i = 0; i < sFactoryMap.size(); ++i) {   \
9144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                        \
9244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        IFactory* v = sFactoryMap.valueAt(i);           \
9344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        float thisScore;                                \
9444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        CHECK(v != NULL);                               \
9544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        thisScore = v->scoreFactory(a, bestScore);      \
9644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (thisScore > bestScore) {                    \
9744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            ret = sFactoryMap.keyAt(i);                 \
9844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            bestScore = thisScore;                      \
9944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }                                               \
10044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }                                                   \
10144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                        \
10244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (0.0 == bestScore) {                             \
10344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        bestScore = getDefaultPlayerType();             \
10444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }                                                   \
10544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                        \
10644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    return ret;
10744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
10844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
10944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                              const char* url) {
11044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    GET_PLAYER_TYPE_IMPL(client, url);
11144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
11244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
11344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
11444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                              int fd,
11544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                              int64_t offset,
11644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                              int64_t length) {
11744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    GET_PLAYER_TYPE_IMPL(client, fd, offset, length);
11844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
11944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
12044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
12144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                              const sp<IStreamSource> &source) {
12244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    GET_PLAYER_TYPE_IMPL(client, source);
12344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
12444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
12544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#undef GET_PLAYER_TYPE_IMPL
12644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
12744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmansp<MediaPlayerBase> MediaPlayerFactory::createPlayer(
12844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        player_type playerType,
12944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        void* cookie,
13044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        notify_callback_f notifyFunc) {
13144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    sp<MediaPlayerBase> p;
13244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    IFactory* factory;
13344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    status_t init_result;
13444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    Mutex::Autolock lock_(&sLock);
13544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
13644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (sFactoryMap.indexOfKey(playerType) < 0) {
13744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGE("Failed to create player object of type %d, no registered"
13844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman              " factory", playerType);
13944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return p;
14044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
14144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
14244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    factory = sFactoryMap.valueFor(playerType);
14344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    CHECK(NULL != factory);
14444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    p = factory->createPlayer();
14544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
14644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (p == NULL) {
14744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGE("Failed to create player object of type %d, create failed",
14844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman               playerType);
14944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return p;
15044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
15144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
15244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    init_result = p->initCheck();
15344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (init_result == NO_ERROR) {
15444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        p->setNotifyCallback(cookie, notifyFunc);
15544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    } else {
15644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGE("Failed to create player object of type %d, initCheck failed"
15744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman              " (res = %d)", playerType, init_result);
15844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        p.clear();
15944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
16044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
16144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    return p;
16244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
16344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
16444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman/*****************************************************************************
16544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman *                                                                           *
16644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman *                     Built-In Factory Implementations                      *
16744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman *                                                                           *
16844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman *****************************************************************************/
16944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
17044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass StagefrightPlayerFactory :
17144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    public MediaPlayerFactory::IFactory {
17244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman  public:
17344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual float scoreFactory(const sp<IMediaPlayer>& client,
17444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               int fd,
17544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               int64_t offset,
17644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               int64_t length,
17744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               float curScore) {
17844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        char buf[20];
17944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        lseek(fd, offset, SEEK_SET);
18044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        read(fd, buf, sizeof(buf));
18144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        lseek(fd, offset, SEEK_SET);
18244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
18344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        long ident = *((long*)buf);
18444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
18544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        // Ogg vorbis?
18644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (ident == 0x5367674f) // 'OggS'
18744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return 1.0;
18844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
18944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return 0.0;
19044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
19144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
19244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual sp<MediaPlayerBase> createPlayer() {
19344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGV(" create StagefrightPlayer");
19444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return new StagefrightPlayer();
19544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
19644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman};
19744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
19844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass NuPlayerFactory : public MediaPlayerFactory::IFactory {
19944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman  public:
20044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual float scoreFactory(const sp<IMediaPlayer>& client,
20144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               const char* url,
20244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               float curScore) {
20344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        static const float kOurScore = 0.8;
20444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
20544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (kOurScore <= curScore)
20644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return 0.0;
20744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
20844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (!strncasecmp("http://", url, 7)
20944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                || !strncasecmp("https://", url, 8)) {
21044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            size_t len = strlen(url);
21144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {
21244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                return kOurScore;
21344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            }
21444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
21544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            if (strstr(url,"m3u8")) {
21644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                return kOurScore;
21744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            }
21844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
21944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
22044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (!strncasecmp("rtsp://", url, 7)) {
22144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return kOurScore;
22244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
22344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
22444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return 0.0;
22544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
22644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
22744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual float scoreFactory(const sp<IMediaPlayer>& client,
22844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               const sp<IStreamSource> &source,
22944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               float curScore) {
23044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return 1.0;
23144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
23244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
23344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual sp<MediaPlayerBase> createPlayer() {
23444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGV(" create NuPlayer");
23544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return new NuPlayerDriver;
23644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
23744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman};
23844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
23944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass SonivoxPlayerFactory : public MediaPlayerFactory::IFactory {
24044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman  public:
24144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual float scoreFactory(const sp<IMediaPlayer>& client,
24244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               const char* url,
24344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               float curScore) {
24444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        static const float kOurScore = 0.4;
24544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        static const char* const FILE_EXTS[] = { ".mid",
24644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".midi",
24744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".smf",
24844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".xmf",
2495c5f8d93667ec36fbcd01ecb113ccae78322c85bDongwon Kang                                                 ".mxmf",
25044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".imy",
25144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".rtttl",
25244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".rtx",
25344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".ota" };
25444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (kOurScore <= curScore)
25544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return 0.0;
25644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
25744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        // use MidiFile for MIDI extensions
25844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        int lenURL = strlen(url);
25944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        for (int i = 0; i < NELEM(FILE_EXTS); ++i) {
26044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            int len = strlen(FILE_EXTS[i]);
26144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            int start = lenURL - len;
26244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            if (start > 0) {
26344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                if (!strncasecmp(url + start, FILE_EXTS[i], len)) {
26444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                    return kOurScore;
26544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                }
26644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            }
26744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
26844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
26944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return 0.0;
27044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
27144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
27244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual float scoreFactory(const sp<IMediaPlayer>& client,
27344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               int fd,
27444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               int64_t offset,
27544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               int64_t length,
27644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               float curScore) {
27744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        static const float kOurScore = 0.8;
27844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
27944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (kOurScore <= curScore)
28044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return 0.0;
28144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
28244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        // Some kind of MIDI?
28344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        EAS_DATA_HANDLE easdata;
28444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (EAS_Init(&easdata) == EAS_SUCCESS) {
28544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            EAS_FILE locator;
28644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            locator.path = NULL;
28744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            locator.fd = fd;
28844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            locator.offset = offset;
28944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            locator.length = length;
29044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            EAS_HANDLE  eashandle;
29144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            if (EAS_OpenFile(easdata, &locator, &eashandle) == EAS_SUCCESS) {
29244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                EAS_CloseFile(easdata, eashandle);
29344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                EAS_Shutdown(easdata);
29444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                return kOurScore;
29544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            }
29644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            EAS_Shutdown(easdata);
29744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
29844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
29944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return 0.0;
30044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
30144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
30244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual sp<MediaPlayerBase> createPlayer() {
30344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGV(" create MidiFile");
30444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return new MidiFile();
30544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
30644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman};
30744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
30844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass TestPlayerFactory : public MediaPlayerFactory::IFactory {
30944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman  public:
31044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual float scoreFactory(const sp<IMediaPlayer>& client,
31144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               const char* url,
31244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               float curScore) {
31344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (TestPlayerStub::canBeUsed(url)) {
31444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return 1.0;
31544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
31644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
31744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return 0.0;
31844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
31944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
32044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual sp<MediaPlayerBase> createPlayer() {
32144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGV("Create Test Player stub");
32244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return new TestPlayerStub();
32344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
32444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman};
32544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
32644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanvoid MediaPlayerFactory::registerBuiltinFactories() {
32744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    Mutex::Autolock lock_(&sLock);
32844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
32944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (sInitComplete)
33044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return;
33144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
33244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    registerFactory_l(new StagefrightPlayerFactory(), STAGEFRIGHT_PLAYER);
33344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    registerFactory_l(new NuPlayerFactory(), NU_PLAYER);
33444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    registerFactory_l(new SonivoxPlayerFactory(), SONIVOX_PLAYER);
33544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    registerFactory_l(new TestPlayerFactory(), TEST_PLAYER);
33644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
33744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    sInitComplete = true;
33844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
33944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
34044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}  // namespace android
341