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>
23ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar#include <media/stagefright/DataSource.h>
24ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar#include <media/stagefright/FileSource.h>
2544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <media/stagefright/foundation/ADebug.h>
2644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <utils/Errors.h>
2744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <utils/misc.h>
28ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar#include <../libstagefright/include/WVMExtractor.h>
2944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
3044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "MediaPlayerFactory.h"
3144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
3244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "MidiFile.h"
3344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "TestPlayerStub.h"
3444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "StagefrightPlayer.h"
3544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "nuplayer/NuPlayerDriver.h"
3644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
3744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmannamespace android {
3844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
3944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn GrossmanMutex MediaPlayerFactory::sLock;
4044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn GrossmanMediaPlayerFactory::tFactoryMap MediaPlayerFactory::sFactoryMap;
4144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanbool MediaPlayerFactory::sInitComplete = false;
4244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
4344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanstatus_t MediaPlayerFactory::registerFactory_l(IFactory* factory,
4444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                               player_type type) {
4544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (NULL == factory) {
4644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGE("Failed to register MediaPlayerFactory of type %d, factory is"
4744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman              " NULL.", type);
4844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return BAD_VALUE;
4944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
5044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
5144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (sFactoryMap.indexOfKey(type) >= 0) {
5244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGE("Failed to register MediaPlayerFactory of type %d, type is"
5344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman              " already registered.", type);
5444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return ALREADY_EXISTS;
5544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
5644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
5744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (sFactoryMap.add(type, factory) < 0) {
5844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGE("Failed to register MediaPlayerFactory of type %d, failed to add"
5944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman              " to map.", type);
6044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return UNKNOWN_ERROR;
6144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
6244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
6344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    return OK;
6444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
6544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
6648f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hungstatic player_type getDefaultPlayerType() {
6744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    char value[PROPERTY_VALUE_MAX];
68f5bdd770d509373cc4174a55d0b81b223ecc4d81Lajos Molnar    if (property_get("media.stagefright.use-awesome", value, NULL)
6944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            && (!strcmp("1", value) || !strcasecmp("true", value))) {
70f5bdd770d509373cc4174a55d0b81b223ecc4d81Lajos Molnar        return STAGEFRIGHT_PLAYER;
71b47558f87ee9bd4fce11a2d5bc213bd1aa9031a8Lajos Molnar    }
72b47558f87ee9bd4fce11a2d5bc213bd1aa9031a8Lajos Molnar
73b47558f87ee9bd4fce11a2d5bc213bd1aa9031a8Lajos Molnar    // TODO: remove this EXPERIMENTAL developer settings property
74f5bdd770d509373cc4174a55d0b81b223ecc4d81Lajos Molnar    if (property_get("persist.sys.media.use-awesome", value, NULL)
75b47558f87ee9bd4fce11a2d5bc213bd1aa9031a8Lajos Molnar            && !strcasecmp("true", value)) {
76f5bdd770d509373cc4174a55d0b81b223ecc4d81Lajos Molnar        return STAGEFRIGHT_PLAYER;
7744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
7844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
79f5bdd770d509373cc4174a55d0b81b223ecc4d81Lajos Molnar    return NU_PLAYER;
8044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
8144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
8244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanstatus_t MediaPlayerFactory::registerFactory(IFactory* factory,
8344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                             player_type type) {
8444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    Mutex::Autolock lock_(&sLock);
8544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    return registerFactory_l(factory, type);
8644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
8744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
8844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanvoid MediaPlayerFactory::unregisterFactory(player_type type) {
8944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    Mutex::Autolock lock_(&sLock);
9044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    sFactoryMap.removeItem(type);
9144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
9244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
9344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#define GET_PLAYER_TYPE_IMPL(a...)                      \
9444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    Mutex::Autolock lock_(&sLock);                      \
9544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                        \
9644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    player_type ret = STAGEFRIGHT_PLAYER;               \
9744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    float bestScore = 0.0;                              \
9844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                        \
9944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    for (size_t i = 0; i < sFactoryMap.size(); ++i) {   \
10044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                        \
10144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        IFactory* v = sFactoryMap.valueAt(i);           \
10244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        float thisScore;                                \
10344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        CHECK(v != NULL);                               \
10444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        thisScore = v->scoreFactory(a, bestScore);      \
10544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (thisScore > bestScore) {                    \
10644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            ret = sFactoryMap.keyAt(i);                 \
10744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            bestScore = thisScore;                      \
10844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }                                               \
10944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }                                                   \
11044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                        \
11144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (0.0 == bestScore) {                             \
112198a893671ce80d951625fe328a92073306660d0Andreas Huber        ret = getDefaultPlayerType();                   \
11344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }                                                   \
11444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                        \
11544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    return ret;
11644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
11744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
11844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                              const char* url) {
11944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    GET_PLAYER_TYPE_IMPL(client, url);
12044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
12144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
12244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
12344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                              int fd,
12444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                              int64_t offset,
12544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                              int64_t length) {
12644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    GET_PLAYER_TYPE_IMPL(client, fd, offset, length);
12744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
12844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
12944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
13044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                              const sp<IStreamSource> &source) {
13144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    GET_PLAYER_TYPE_IMPL(client, source);
13244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
13344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
13444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#undef GET_PLAYER_TYPE_IMPL
13544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
13644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmansp<MediaPlayerBase> MediaPlayerFactory::createPlayer(
13744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        player_type playerType,
13844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        void* cookie,
13944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        notify_callback_f notifyFunc) {
14044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    sp<MediaPlayerBase> p;
14144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    IFactory* factory;
14244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    status_t init_result;
14344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    Mutex::Autolock lock_(&sLock);
14444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
14544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (sFactoryMap.indexOfKey(playerType) < 0) {
14644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGE("Failed to create player object of type %d, no registered"
14744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman              " factory", playerType);
14844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return p;
14944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
15044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
15144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    factory = sFactoryMap.valueFor(playerType);
15244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    CHECK(NULL != factory);
15344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    p = factory->createPlayer();
15444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
15544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (p == NULL) {
15644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGE("Failed to create player object of type %d, create failed",
15744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman               playerType);
15844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return p;
15944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
16044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
16144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    init_result = p->initCheck();
16244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (init_result == NO_ERROR) {
16344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        p->setNotifyCallback(cookie, notifyFunc);
16444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    } else {
16544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGE("Failed to create player object of type %d, initCheck failed"
16644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman              " (res = %d)", playerType, init_result);
16744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        p.clear();
16844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
16944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
17044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    return p;
17144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
17244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
17344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman/*****************************************************************************
17444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman *                                                                           *
17544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman *                     Built-In Factory Implementations                      *
17644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman *                                                                           *
17744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman *****************************************************************************/
17844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
17944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass StagefrightPlayerFactory :
18044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    public MediaPlayerFactory::IFactory {
18144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman  public:
182247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
18344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               int fd,
18444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               int64_t offset,
185ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar                               int64_t length,
186247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn                               float /*curScore*/) {
187ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar        if (legacyDrm()) {
188ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar            sp<DataSource> source = new FileSource(dup(fd), offset, length);
189ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar            String8 mimeType;
190ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar            float confidence;
191ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar            if (SniffWVM(source, &mimeType, &confidence, NULL /* format */)) {
192ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar                return 1.0;
193ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar            }
194ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar        }
195ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar
196ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar        if (getDefaultPlayerType() == STAGEFRIGHT_PLAYER) {
19748f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung            char buf[20];
19848f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung            lseek(fd, offset, SEEK_SET);
19948f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung            read(fd, buf, sizeof(buf));
20048f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung            lseek(fd, offset, SEEK_SET);
20148f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung
20248f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung            uint32_t ident = *((uint32_t*)buf);
20348f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung
20448f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung            // Ogg vorbis?
20548f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung            if (ident == 0x5367674f) // 'OggS'
20648f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung                return 1.0;
20748f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung        }
20844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
20944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return 0.0;
21044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
21144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
212ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
213ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar                               const char* url,
214ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar                               float /*curScore*/) {
215ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar        if (legacyDrm() && !strncasecmp("widevine://", url, 11)) {
216ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar            return 1.0;
217ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar        }
218ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar        return 0.0;
219ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar    }
220ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar
22144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual sp<MediaPlayerBase> createPlayer() {
22244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGV(" create StagefrightPlayer");
22344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return new StagefrightPlayer();
22444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
225ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar  private:
226ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar    bool legacyDrm() {
227ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar        char value[PROPERTY_VALUE_MAX];
228ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar        if (property_get("persist.sys.media.legacy-drm", value, NULL)
229ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar                && (!strcmp("1", value) || !strcasecmp("true", value))) {
230ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar            return true;
231ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar        }
232ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar        return false;
233ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar    }
23444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman};
23544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
23644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass NuPlayerFactory : public MediaPlayerFactory::IFactory {
23744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman  public:
238247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
23944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               const char* url,
24044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               float curScore) {
24144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        static const float kOurScore = 0.8;
24244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
24344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (kOurScore <= curScore)
24444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return 0.0;
24544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
24644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (!strncasecmp("http://", url, 7)
247997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber                || !strncasecmp("https://", url, 8)
248997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber                || !strncasecmp("file://", url, 7)) {
24944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            size_t len = strlen(url);
25044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {
25144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                return kOurScore;
25244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            }
25344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
25444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            if (strstr(url,"m3u8")) {
25544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                return kOurScore;
25644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            }
2577a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé
2587a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            if ((len >= 4 && !strcasecmp(".sdp", &url[len - 4])) || strstr(url, ".sdp?")) {
2597a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé                return kOurScore;
2607a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé            }
26144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
26244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
26344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (!strncasecmp("rtsp://", url, 7)) {
26444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return kOurScore;
26544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
26644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
26744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return 0.0;
26844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
26944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
270247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
271247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn                               const sp<IStreamSource>& /*source*/,
272247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn                               float /*curScore*/) {
27344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return 1.0;
27444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
27544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
27644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual sp<MediaPlayerBase> createPlayer() {
27744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGV(" create NuPlayer");
27844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return new NuPlayerDriver;
27944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
28044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman};
28144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
28244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass SonivoxPlayerFactory : public MediaPlayerFactory::IFactory {
28344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman  public:
284247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
28544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               const char* url,
28644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               float curScore) {
28744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        static const float kOurScore = 0.4;
28844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        static const char* const FILE_EXTS[] = { ".mid",
28944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".midi",
29044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".smf",
29144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".xmf",
2925c5f8d93667ec36fbcd01ecb113ccae78322c85bDongwon Kang                                                 ".mxmf",
29344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".imy",
29444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".rtttl",
29544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".rtx",
29644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                                                 ".ota" };
29744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (kOurScore <= curScore)
29844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return 0.0;
29944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
30044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        // use MidiFile for MIDI extensions
30144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        int lenURL = strlen(url);
30244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        for (int i = 0; i < NELEM(FILE_EXTS); ++i) {
30344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            int len = strlen(FILE_EXTS[i]);
30444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            int start = lenURL - len;
30544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            if (start > 0) {
30644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                if (!strncasecmp(url + start, FILE_EXTS[i], len)) {
30744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                    return kOurScore;
30844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                }
30944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            }
31044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
31144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
31244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return 0.0;
31344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
31444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
315247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
31644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               int fd,
31744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               int64_t offset,
31844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               int64_t length,
31944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               float curScore) {
32044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        static const float kOurScore = 0.8;
32144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
32244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (kOurScore <= curScore)
32344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return 0.0;
32444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
32544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        // Some kind of MIDI?
32644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        EAS_DATA_HANDLE easdata;
32744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (EAS_Init(&easdata) == EAS_SUCCESS) {
32844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            EAS_FILE locator;
32944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            locator.path = NULL;
33044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            locator.fd = fd;
33144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            locator.offset = offset;
33244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            locator.length = length;
33344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            EAS_HANDLE  eashandle;
33444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            if (EAS_OpenFile(easdata, &locator, &eashandle) == EAS_SUCCESS) {
33544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                EAS_CloseFile(easdata, eashandle);
33644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                EAS_Shutdown(easdata);
33744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                return kOurScore;
33844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            }
33944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            EAS_Shutdown(easdata);
34044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
34144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
34244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return 0.0;
34344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
34444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
34544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual sp<MediaPlayerBase> createPlayer() {
34644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGV(" create MidiFile");
34744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return new MidiFile();
34844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
34944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman};
35044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
35144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass TestPlayerFactory : public MediaPlayerFactory::IFactory {
35244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman  public:
353247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
35444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman                               const char* url,
355247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn                               float /*curScore*/) {
35644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        if (TestPlayerStub::canBeUsed(url)) {
35744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman            return 1.0;
35844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        }
35944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
36044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return 0.0;
36144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
36244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
36344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    virtual sp<MediaPlayerBase> createPlayer() {
36444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        ALOGV("Create Test Player stub");
36544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return new TestPlayerStub();
36644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    }
36744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman};
36844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
36944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanvoid MediaPlayerFactory::registerBuiltinFactories() {
37044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    Mutex::Autolock lock_(&sLock);
37144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
37244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    if (sInitComplete)
37344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman        return;
37444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
37544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    registerFactory_l(new StagefrightPlayerFactory(), STAGEFRIGHT_PLAYER);
37644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    registerFactory_l(new NuPlayerFactory(), NU_PLAYER);
37744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    registerFactory_l(new SonivoxPlayerFactory(), SONIVOX_PLAYER);
37844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    registerFactory_l(new TestPlayerFactory(), TEST_PLAYER);
37944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
38044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman    sInitComplete = true;
38144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}
38244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman
38344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}  // namespace android
384