MediaPlayerFactory.cpp revision e4d40ad91f3516bde106658673b2cb076b5dfcb7
14199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/*
24199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa**
34199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa** Copyright 2012, The Android Open Source Project
44199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa**
54199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa** Licensed under the Apache License, Version 2.0 (the "License");
64199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa** you may not use this file except in compliance with the License.
74199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa** You may obtain a copy of the License at
84199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa**
94199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa**     http://www.apache.org/licenses/LICENSE-2.0
104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa**
114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa** Unless required by applicable law or agreed to in writing, software
124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa** distributed under the License is distributed on an "AS IS" BASIS,
134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa** See the License for the specific language governing permissions and
154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa** limitations under the License.
16677ef21613a9d35053ec098444832ce4125a847eDaisuke Miyakawa*/
174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa//#define LOG_NDEBUG 0
194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa#define LOG_TAG "MediaPlayerFactory"
204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa#include <utils/Log.h>
214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
225f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa#include <cutils/properties.h>
235f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa#include <media/IMediaPlayer.h>
244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa#include <media/stagefright/DataSource.h>
254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa#include <media/stagefright/FileSource.h>
264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa#include <media/stagefright/foundation/ADebug.h>
274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa#include <utils/Errors.h>
284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa#include <utils/misc.h>
294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa#include <../libstagefright/include/WVMExtractor.h>
304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa#include "MediaPlayerFactory.h"
324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa#include "TestPlayerStub.h"
344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa#include "nuplayer/NuPlayerDriver.h"
355f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa
364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawanamespace android {
374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke MiyakawaMutex MediaPlayerFactory::sLock;
394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke MiyakawaMediaPlayerFactory::tFactoryMap MediaPlayerFactory::sFactoryMap;
401680191a2a208fd61123810a88ce9def83e222baDaisuke Miyakawabool MediaPlayerFactory::sInitComplete = false;
411de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
421de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawastatus_t MediaPlayerFactory::registerFactory_l(IFactory* factory,
434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                               player_type type) {
444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    if (NULL == factory) {
454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ALOGE("Failed to register MediaPlayerFactory of type %d, factory is"
461de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa              " NULL.", type);
471de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        return BAD_VALUE;
481de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    }
491de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa
501de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa    if (sFactoryMap.indexOfKey(type) >= 0) {
511de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        ALOGE("Failed to register MediaPlayerFactory of type %d, type is"
521de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa              " already registered.", type);
534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return ALREADY_EXISTS;
544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    if (sFactoryMap.add(type, factory) < 0) {
574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ALOGE("Failed to register MediaPlayerFactory of type %d, failed to add"
584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa              " to map.", type);
594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return UNKNOWN_ERROR;
604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
625f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa    return OK;
634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawastatic player_type getDefaultPlayerType() {
664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    return NU_PLAYER;
674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawastatus_t MediaPlayerFactory::registerFactory(IFactory* factory,
704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                             player_type type) {
714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    Mutex::Autolock lock_(&sLock);
724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    return registerFactory_l(factory, type);
734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawavoid MediaPlayerFactory::unregisterFactory(player_type type) {
764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    Mutex::Autolock lock_(&sLock);
774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    sFactoryMap.removeItem(type);
784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa#define GET_PLAYER_TYPE_IMPL(a...)                      \
814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    Mutex::Autolock lock_(&sLock);                      \
824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                                        \
835f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa    player_type ret = STAGEFRIGHT_PLAYER;               \
845f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa    float bestScore = 0.0;                              \
854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                                        \
864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    for (size_t i = 0; i < sFactoryMap.size(); ++i) {   \
871de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa                                                        \
881de396f6df89363169d3a2e61a61fa98d12c1ef8Daisuke Miyakawa        IFactory* v = sFactoryMap.valueAt(i);           \
894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        float thisScore;                                \
904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        CHECK(v != NULL);                               \
914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        thisScore = v->scoreFactory(a, bestScore);      \
924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (thisScore > bestScore) {                    \
934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            ret = sFactoryMap.keyAt(i);                 \
944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            bestScore = thisScore;                      \
954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }                                               \
964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }                                                   \
974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                                        \
984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    if (0.0 == bestScore) {                             \
994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ret = getDefaultPlayerType();                   \
1004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }                                                   \
1014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                                        \
1024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    return ret;
1034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
1054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                              const char* url) {
1064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    GET_PLAYER_TYPE_IMPL(client, url);
1074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
1084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
1104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                              int fd,
1114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                              int64_t offset,
1124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                              int64_t length) {
1134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    GET_PLAYER_TYPE_IMPL(client, fd, offset, length);
1144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
1154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
1174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                              const sp<IStreamSource> &source) {
1185f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa    GET_PLAYER_TYPE_IMPL(client, source);
1194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
1204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
1224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                                              const sp<DataSource> &source) {
1234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    GET_PLAYER_TYPE_IMPL(client, source);
1244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
1254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa#undef GET_PLAYER_TYPE_IMPL
1274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawasp<MediaPlayerBase> MediaPlayerFactory::createPlayer(
1294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        player_type playerType,
1305f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa        void* cookie,
1314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        notify_callback_f notifyFunc,
1324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        pid_t pid) {
1334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    sp<MediaPlayerBase> p;
1344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    IFactory* factory;
1354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    status_t init_result;
1364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    Mutex::Autolock lock_(&sLock);
1374560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa
1384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    if (sFactoryMap.indexOfKey(playerType) < 0) {
1394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ALOGE("Failed to create player object of type %d, no registered"
1404560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa              " factory", playerType);
1414560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa        return p;
1424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    factory = sFactoryMap.valueFor(playerType);
1455f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa    CHECK(NULL != factory);
1464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    p = factory->createPlayer(pid);
1474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1485f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa    if (p == NULL) {
1494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ALOGE("Failed to create player object of type %d, create failed",
1504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa               playerType);
1514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return p;
1524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
15448dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    init_result = p->initCheck();
15548dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa    if (init_result == NO_ERROR) {
15648dd8e86a81d2ab40eb762975c8211c225002bf0Daisuke Miyakawa        p->setNotifyCallback(cookie, notifyFunc);
1574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    } else {
1584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ALOGE("Failed to create player object of type %d, initCheck failed"
1594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa              " (res = %d)", playerType, init_result);
1604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        p.clear();
1614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
1624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    return p;
1644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa}
1654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/*****************************************************************************
1674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *                                                                           *
1684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *                     Built-In Factory Implementations                      *
1694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa *                                                                           *
1705f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa *****************************************************************************/
1714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaclass NuPlayerFactory : public MediaPlayerFactory::IFactory {
1734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa  public:
1744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
1754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                               const char* url,
1764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                               float curScore) {
1774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        static const float kOurScore = 0.8;
1784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (kOurScore <= curScore)
1804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return 0.0;
1814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (!strncasecmp("http://", url, 7)
1834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                || !strncasecmp("https://", url, 8)
1844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                || !strncasecmp("file://", url, 7)) {
1854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            size_t len = strlen(url);
1864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {
1874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return kOurScore;
1884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1905f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa            if (strstr(url,"m3u8")) {
1914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return kOurScore;
1924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            if ((len >= 4 && !strcasecmp(".sdp", &url[len - 4])) || strstr(url, ".sdp?")) {
1954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                return kOurScore;
1964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            }
1974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
1984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
1994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (!strncasecmp("rtsp://", url, 7)) {
2004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return kOurScore;
2014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
2024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return 0.0;
2044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
2074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                               const sp<IStreamSource>& /*source*/,
2084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                               float /*curScore*/) {
2094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return 1.0;
2104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2114560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa
2124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
2134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                               const sp<DataSource>& /*source*/,
2144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                               float /*curScore*/) {
2154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        // Only NuPlayer supports setting a DataSource source directly.
2164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return 1.0;
2174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    virtual sp<MediaPlayerBase> createPlayer(pid_t pid) {
2204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ALOGV(" create NuPlayer");
2214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return new NuPlayerDriver(pid);
2224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa};
2244560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa
2254560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawaclass TestPlayerFactory : public MediaPlayerFactory::IFactory {
2264560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa  public:
2274560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
2284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                               const char* url,
2294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa                               float /*curScore*/) {
2304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        if (TestPlayerStub::canBeUsed(url)) {
2314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa            return 1.0;
2324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        }
2334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2344560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa        return 0.0;
2354560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa    }
2364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa
2374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    virtual sp<MediaPlayerBase> createPlayer(pid_t /* pid */) {
2384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        ALOGV("Create Test Player stub");
2394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa        return new TestPlayerStub();
2404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa    }
2414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa};
242
243void MediaPlayerFactory::registerBuiltinFactories() {
244    Mutex::Autolock lock_(&sLock);
245
246    if (sInitComplete)
247        return;
248
249    registerFactory_l(new NuPlayerFactory(), NU_PLAYER);
250    registerFactory_l(new TestPlayerFactory(), TEST_PLAYER);
251
252    sInitComplete = true;
253}
254
255}  // namespace android
256