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