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