MediaPlayerFactory.cpp revision 701d342f785e407c8e6bcb046658f84ac56d989a
199e53b86eebb605b70dd7591b89bf61a9414ed0eGlenn Kasten/*
265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**
365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Copyright 2012, The Android Open Source Project
465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**
565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Licensed under the Apache License, Version 2.0 (the "License");
665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** you may not use this file except in compliance with the License.
765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** You may obtain a copy of the License at
865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**
965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
1065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**
1165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Unless required by applicable law or agreed to in writing, software
1265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** distributed under the License is distributed on an "AS IS" BASIS,
1365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** See the License for the specific language governing permissions and
1565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** limitations under the License.
1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian*/
1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian//#define LOG_NDEBUG 0
1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define LOG_TAG "MediaPlayerFactory"
2065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/Log.h>
2165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <cutils/properties.h>
2365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <media/IMediaPlayer.h>
2465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <media/stagefright/DataSource.h>
2565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <media/stagefright/FileSource.h>
2665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <media/stagefright/foundation/ADebug.h>
279ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang#include <utils/Errors.h>
2865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/misc.h>
2965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <../libstagefright/include/WVMExtractor.h>
3065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
3165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include "MediaPlayerFactory.h"
3265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
3365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include "TestPlayerStub.h"
3438ccae2c0324daa305f3fe77d25fdf5edec0b0e1Eric Laurent#include "StagefrightPlayer.h"
3565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include "nuplayer/NuPlayerDriver.h"
36fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin
3765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiannamespace android {
38f6b1678f8f508b447155a81b44e214475ab634a8Glenn Kasten
3965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianMutex MediaPlayerFactory::sLock;
409ee159b79022b2e1a050acb3890ce948e99e9ccbGloria WangMediaPlayerFactory::tFactoryMap MediaPlayerFactory::sFactoryMap;
4125b248eb52a0a16adaef6b79c9d92cb88b9a2bc2Glenn Kastenbool MediaPlayerFactory::sInitComplete = false;
4265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
4365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatus_t MediaPlayerFactory::registerFactory_l(IFactory* factory,
4465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                               player_type type) {
45fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    if (NULL == factory) {
4664760240f931714858a59c1579f07264d7182ba2Dima Zavin        ALOGE("Failed to register MediaPlayerFactory of type %d, factory is"
477394a4f358fa9908a9f0a7c954b65c399f4268e6Dima Zavin              " NULL.", type);
4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return BAD_VALUE;
4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
5065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
5144deb053252a3bd2f57a007ab9560f4924f62394Glenn Kasten    if (sFactoryMap.indexOfKey(type) >= 0) {
5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ALOGE("Failed to register MediaPlayerFactory of type %d, type is"
5365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian              " already registered.", type);
546d8b694d999e9be7d5dcc336535832a80fb6f61fEric Laurent        return ALREADY_EXISTS;
5559bd0da8373af0e5159b799495fda51e03120ea4Eric Laurent    }
5659bd0da8373af0e5159b799495fda51e03120ea4Eric Laurent
5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (sFactoryMap.add(type, factory) < 0) {
583b21c50ef95fe4e7ac3426ca14b365749e66ff08Glenn Kasten        ALOGE("Failed to register MediaPlayerFactory of type %d, failed to add"
593b21c50ef95fe4e7ac3426ca14b365749e66ff08Glenn Kasten              " to map.", type);
604d8d0c30abfa4b8d75866d42094cc797e05068faGlenn Kasten        return UNKNOWN_ERROR;
61feb0db689c17dced50afaee54c659f1676e2d505Eric Laurent    }
624d8d0c30abfa4b8d75866d42094cc797e05068faGlenn Kasten
634d8d0c30abfa4b8d75866d42094cc797e05068faGlenn Kasten    return OK;
644ff14bae91075eb274eb1c2975982358946e7e63John Grossman}
654ff14bae91075eb274eb1c2975982358946e7e63John Grossman
664ff14bae91075eb274eb1c2975982358946e7e63John Grossmanstatic player_type getDefaultPlayerType() {
6765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    char value[PROPERTY_VALUE_MAX];
6865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (property_get("media.stagefright.use-awesome", value, NULL)
69de070137f11d346fba77605bd76a44c040a618fcEric Laurent            && (!strcmp("1", value) || !strcasecmp("true", value))) {
7065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return STAGEFRIGHT_PLAYER;
7165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
72ec1d6b5e17281a066d618f7fcd2b63b3ce11f421Glenn Kasten
73ec1d6b5e17281a066d618f7fcd2b63b3ce11f421Glenn Kasten    return NU_PLAYER;
7465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
7565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
76b1cf75c4935001f61057989ee3cf27bbf09ecd9cGlenn Kastenstatus_t MediaPlayerFactory::registerFactory(IFactory* factory,
7765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                             player_type type) {
7865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock lock_(&sLock);
7965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return registerFactory_l(factory, type);
8065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
8165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
8265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid MediaPlayerFactory::unregisterFactory(player_type type) {
8365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    Mutex::Autolock lock_(&sLock);
8465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    sFactoryMap.removeItem(type);
8565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
8665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
8765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define GET_PLAYER_TYPE_IMPL(a...)                      \
887dede876998ff56351d495ec3a798c1b131193e8Glenn Kasten    Mutex::Autolock lock_(&sLock);                      \
8965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                                        \
907dede876998ff56351d495ec3a798c1b131193e8Glenn Kasten    player_type ret = STAGEFRIGHT_PLAYER;               \
917dede876998ff56351d495ec3a798c1b131193e8Glenn Kasten    float bestScore = 0.0;                              \
9265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                                                        \
937c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent    for (size_t i = 0; i < sFactoryMap.size(); ++i) {   \
947c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent                                                        \
9565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        IFactory* v = sFactoryMap.valueAt(i);           \
967dede876998ff56351d495ec3a798c1b131193e8Glenn Kasten        float thisScore;                                \
977dede876998ff56351d495ec3a798c1b131193e8Glenn Kasten        CHECK(v != NULL);                               \
9860cd0a0d488e604d27fc7dbb02b00348693dfde2Eric Laurent        thisScore = v->scoreFactory(a, bestScore);      \
997cafbb32999049873d4746ba83bd20c88abe6ce6Eric Laurent        if (thisScore > bestScore) {                    \
1007cafbb32999049873d4746ba83bd20c88abe6ce6Eric Laurent            ret = sFactoryMap.keyAt(i);                 \
1017cafbb32999049873d4746ba83bd20c88abe6ce6Eric Laurent            bestScore = thisScore;                      \
1027cafbb32999049873d4746ba83bd20c88abe6ce6Eric Laurent        }                                               \
1037cafbb32999049873d4746ba83bd20c88abe6ce6Eric Laurent    }                                                   \
1044ff14bae91075eb274eb1c2975982358946e7e63John Grossman                                                        \
1057cafbb32999049873d4746ba83bd20c88abe6ce6Eric Laurent    if (0.0 == bestScore) {                             \
10665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ret = getDefaultPlayerType();                   \
10765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }                                                   \
1089ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang                                                        \
1099ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang    return ret;
11025b248eb52a0a16adaef6b79c9d92cb88b9a2bc2Glenn Kasten
11125b248eb52a0a16adaef6b79c9d92cb88b9a2bc2Glenn Kastenplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
11225b248eb52a0a16adaef6b79c9d92cb88b9a2bc2Glenn Kasten                                              const char* url) {
1139ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang    GET_PLAYER_TYPE_IMPL(client, url);
1149ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang}
1159ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang
1169ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wangplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
1179ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang                                              int fd,
1189ee159b79022b2e1a050acb3890ce948e99e9ccbGloria Wang                                              int64_t offset,
119799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin                                              int64_t length) {
120799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    GET_PLAYER_TYPE_IMPL(client, fd, offset, length);
121799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin}
122799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
123799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavinplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
124799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin                                              const sp<IStreamSource> &source) {
125799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    GET_PLAYER_TYPE_IMPL(client, source);
126799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin}
127799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
128799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavinplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client,
12929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                                              const sp<DataSource> &source) {
130799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    GET_PLAYER_TYPE_IMPL(client, source);
131799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin}
132799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
133799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin#undef GET_PLAYER_TYPE_IMPL
134799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
135799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavinsp<MediaPlayerBase> MediaPlayerFactory::createPlayer(
136799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        player_type playerType,
137799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        void* cookie,
138799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        notify_callback_f notifyFunc) {
139799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    sp<MediaPlayerBase> p;
140799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    IFactory* factory;
141799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    status_t init_result;
142ec1d6b5e17281a066d618f7fcd2b63b3ce11f421Glenn Kasten    Mutex::Autolock lock_(&sLock);
143799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
144799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    if (sFactoryMap.indexOfKey(playerType) < 0) {
145799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        ALOGE("Failed to create player object of type %d, no registered"
146799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin              " factory", playerType);
147799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        return p;
148799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    }
14965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
15065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    factory = sFactoryMap.valueFor(playerType);
15165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    CHECK(NULL != factory);
15265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    p = factory->createPlayer();
1534ff14bae91075eb274eb1c2975982358946e7e63John Grossman
1544ff14bae91075eb274eb1c2975982358946e7e63John Grossman    if (p == NULL) {
1554ff14bae91075eb274eb1c2975982358946e7e63John Grossman        ALOGE("Failed to create player object of type %d, create failed",
1564ff14bae91075eb274eb1c2975982358946e7e63John Grossman               playerType);
1574ff14bae91075eb274eb1c2975982358946e7e63John Grossman        return p;
1584ff14bae91075eb274eb1c2975982358946e7e63John Grossman    }
1594ff14bae91075eb274eb1c2975982358946e7e63John Grossman
1604ff14bae91075eb274eb1c2975982358946e7e63John Grossman    init_result = p->initCheck();
16165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (init_result == NO_ERROR) {
1625a61d2f277af3098fc10b2881babca16391362daDima Zavin        p->setNotifyCallback(cookie, notifyFunc);
1635a61d2f277af3098fc10b2881babca16391362daDima Zavin    } else {
1645a61d2f277af3098fc10b2881babca16391362daDima Zavin        ALOGE("Failed to create player object of type %d, initCheck failed"
1655a61d2f277af3098fc10b2881babca16391362daDima Zavin              " (res = %d)", playerType, init_result);
166799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        p.clear();
167fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin    }
168935752053ef2691dbb6d5a6d149e0e362c6e3c74Eric Laurent
169935752053ef2691dbb6d5a6d149e0e362c6e3c74Eric Laurent    return p;
170799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin}
1714ff14bae91075eb274eb1c2975982358946e7e63John Grossman
1724ff14bae91075eb274eb1c2975982358946e7e63John Grossman/*****************************************************************************
1734ff14bae91075eb274eb1c2975982358946e7e63John Grossman *                                                                           *
1744ff14bae91075eb274eb1c2975982358946e7e63John Grossman *                     Built-In Factory Implementations                      *
1754ff14bae91075eb274eb1c2975982358946e7e63John Grossman *                                                                           *
1764ff14bae91075eb274eb1c2975982358946e7e63John Grossman *****************************************************************************/
1774ff14bae91075eb274eb1c2975982358946e7e63John Grossman
1784ff14bae91075eb274eb1c2975982358946e7e63John Grossmanclass StagefrightPlayerFactory :
1794ff14bae91075eb274eb1c2975982358946e7e63John Grossman    public MediaPlayerFactory::IFactory {
1804ff14bae91075eb274eb1c2975982358946e7e63John Grossman  public:
1814ff14bae91075eb274eb1c2975982358946e7e63John Grossman    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
1824ff14bae91075eb274eb1c2975982358946e7e63John Grossman                               int fd,
18365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                               int64_t offset,
184799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin                               int64_t length,
185799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin                               float /*curScore*/) {
186799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        if (legacyDrm()) {
187fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin            sp<DataSource> source = new FileSource(dup(fd), offset, length);
188799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin            String8 mimeType;
189799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin            float confidence;
190799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin            if (SniffWVM(source, &mimeType, &confidence, NULL /* format */)) {
191799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin                return 1.0;
192df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            }
193799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        }
194799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
195799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        if (getDefaultPlayerType() == STAGEFRIGHT_PLAYER) {
1962b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten            char buf[20];
197799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin            lseek(fd, offset, SEEK_SET);
198df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            read(fd, buf, sizeof(buf));
1995a61d2f277af3098fc10b2881babca16391362daDima Zavin            lseek(fd, offset, SEEK_SET);
200799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
201799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin            uint32_t ident = *((uint32_t*)buf);
20265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2032b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten            // Ogg vorbis?
20429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            if (ident == 0x5367674f) // 'OggS'
2052b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten                return 1.0;
206799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        }
207799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
2082b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten        return 0.0;
2092b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten    }
2102b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten
2112b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
2122b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten                               const char* url,
2132b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten                               float /*curScore*/) {
2144ff14bae91075eb274eb1c2975982358946e7e63John Grossman        if (legacyDrm() && !strncasecmp("widevine://", url, 11)) {
2154ff14bae91075eb274eb1c2975982358946e7e63John Grossman            return 1.0;
2164ff14bae91075eb274eb1c2975982358946e7e63John Grossman        }
2174ff14bae91075eb274eb1c2975982358946e7e63John Grossman        return 0.0;
2184ff14bae91075eb274eb1c2975982358946e7e63John Grossman    }
2194ff14bae91075eb274eb1c2975982358946e7e63John Grossman
2204ff14bae91075eb274eb1c2975982358946e7e63John Grossman    virtual sp<MediaPlayerBase> createPlayer() {
2214ff14bae91075eb274eb1c2975982358946e7e63John Grossman        ALOGV(" create StagefrightPlayer");
2224ff14bae91075eb274eb1c2975982358946e7e63John Grossman        return new StagefrightPlayer();
2234ff14bae91075eb274eb1c2975982358946e7e63John Grossman    }
2244ff14bae91075eb274eb1c2975982358946e7e63John Grossman  private:
2254ff14bae91075eb274eb1c2975982358946e7e63John Grossman    bool legacyDrm() {
2264ff14bae91075eb274eb1c2975982358946e7e63John Grossman        char value[PROPERTY_VALUE_MAX];
2274ff14bae91075eb274eb1c2975982358946e7e63John Grossman        if (property_get("persist.sys.media.legacy-drm", value, NULL)
2284ff14bae91075eb274eb1c2975982358946e7e63John Grossman                && (!strcmp("1", value) || !strcasecmp("true", value))) {
2294ff14bae91075eb274eb1c2975982358946e7e63John Grossman            return true;
2304ff14bae91075eb274eb1c2975982358946e7e63John Grossman        }
2314ff14bae91075eb274eb1c2975982358946e7e63John Grossman        return false;
2324ff14bae91075eb274eb1c2975982358946e7e63John Grossman    }
2334ff14bae91075eb274eb1c2975982358946e7e63John Grossman};
2344ff14bae91075eb274eb1c2975982358946e7e63John Grossman
2354ff14bae91075eb274eb1c2975982358946e7e63John Grossmanclass NuPlayerFactory : public MediaPlayerFactory::IFactory {
2364ff14bae91075eb274eb1c2975982358946e7e63John Grossman  public:
2374ff14bae91075eb274eb1c2975982358946e7e63John Grossman    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
2384ff14bae91075eb274eb1c2975982358946e7e63John Grossman                               const char* url,
2394ff14bae91075eb274eb1c2975982358946e7e63John Grossman                               float curScore) {
240799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        static const float kOurScore = 0.8;
241799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
242799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        if (kOurScore <= curScore)
243799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin            return 0.0;
244799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
2452b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten        if (!strncasecmp("http://", url, 7)
246799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin                || !strncasecmp("https://", url, 8)
2472b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten                || !strncasecmp("file://", url, 7)) {
248799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin            size_t len = strlen(url);
249799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin            if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) {
2504ff14bae91075eb274eb1c2975982358946e7e63John Grossman                return kOurScore;
2514ff14bae91075eb274eb1c2975982358946e7e63John Grossman            }
2524ff14bae91075eb274eb1c2975982358946e7e63John Grossman
2534ff14bae91075eb274eb1c2975982358946e7e63John Grossman            if (strstr(url,"m3u8")) {
2544ff14bae91075eb274eb1c2975982358946e7e63John Grossman                return kOurScore;
2554ff14bae91075eb274eb1c2975982358946e7e63John Grossman            }
2564ff14bae91075eb274eb1c2975982358946e7e63John Grossman
2574ff14bae91075eb274eb1c2975982358946e7e63John Grossman            if ((len >= 4 && !strcasecmp(".sdp", &url[len - 4])) || strstr(url, ".sdp?")) {
258799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin                return kOurScore;
25965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            }
2604ff14bae91075eb274eb1c2975982358946e7e63John Grossman        }
2614ff14bae91075eb274eb1c2975982358946e7e63John Grossman
2624ff14bae91075eb274eb1c2975982358946e7e63John Grossman        if (!strncasecmp("rtsp://", url, 7)) {
2634ff14bae91075eb274eb1c2975982358946e7e63John Grossman            return kOurScore;
2644ff14bae91075eb274eb1c2975982358946e7e63John Grossman        }
2654ff14bae91075eb274eb1c2975982358946e7e63John Grossman
26665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return 0.0;
26765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
26865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
26965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
270799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin                               const sp<IStreamSource>& /*source*/,
27165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                               float /*curScore*/) {
27265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return 1.0;
27365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
27465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
27565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
27665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                               const sp<DataSource>& /*source*/,
27765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                               float /*curScore*/) {
27865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // Only NuPlayer supports setting a DataSource source directly.
279799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        return 1.0;
2802b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten    }
2812b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten
2822b213bc220768d2b984239511cd4554a96bc0079Glenn Kasten    virtual sp<MediaPlayerBase> createPlayer() {
28365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ALOGV(" create NuPlayer");
28465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return new NuPlayerDriver;
28565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
286799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin};
287799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin
288799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavinclass TestPlayerFactory : public MediaPlayerFactory::IFactory {
289799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin  public:
290799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/,
291799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin                               const char* url,
292799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin                               float /*curScore*/) {
293799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        if (TestPlayerStub::canBeUsed(url)) {
294799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin            return 1.0;
295799a70e7028a4d714436c3a744a775acfbd31aaeDima Zavin        }
29665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
29765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return 0.0;
29865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
29965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
30065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    virtual sp<MediaPlayerBase> createPlayer() {
30165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        ALOGV("Create Test Player stub");
30265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return new TestPlayerStub();
30365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
30465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
30577c1119ea0b5cb32287088ceeeb7e3b6bd14a85dGlenn Kasten
30677c1119ea0b5cb32287088ceeeb7e3b6bd14a85dGlenn Kastenvoid MediaPlayerFactory::registerBuiltinFactories() {
30777c1119ea0b5cb32287088ceeeb7e3b6bd14a85dGlenn Kasten    Mutex::Autolock lock_(&sLock);
30877c1119ea0b5cb32287088ceeeb7e3b6bd14a85dGlenn Kasten
30965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (sInitComplete)
31065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return;
3113a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
3123a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    registerFactory_l(new StagefrightPlayerFactory(), STAGEFRIGHT_PLAYER);
3133a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    registerFactory_l(new NuPlayerFactory(), NU_PLAYER);
3143a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    registerFactory_l(new TestPlayerFactory(), TEST_PLAYER);
3153a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
3163a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    sInitComplete = true;
3173a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen}
3183a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen
31965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}  // namespace android
32065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian