144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman/* 244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** 344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** Copyright 2012, The Android Open Source Project 444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** 544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** Licensed under the Apache License, Version 2.0 (the "License"); 644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** you may not use this file except in compliance with the License. 744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** You may obtain a copy of the License at 844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** 944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** http://www.apache.org/licenses/LICENSE-2.0 1044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** 1144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** Unless required by applicable law or agreed to in writing, software 1244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** distributed under the License is distributed on an "AS IS" BASIS, 1344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** See the License for the specific language governing permissions and 1544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman** limitations under the License. 1644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman*/ 1744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 1844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#define LOG_TAG "MediaPlayerFactory" 1944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <utils/Log.h> 2044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 2144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <cutils/properties.h> 2244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <media/IMediaPlayer.h> 2344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <media/stagefright/foundation/ADebug.h> 2444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <utils/Errors.h> 2544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <utils/misc.h> 2644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 2744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "MediaPlayerFactory.h" 2844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 2944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "MidiFile.h" 3044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "TestPlayerStub.h" 3144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "StagefrightPlayer.h" 3244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "nuplayer/NuPlayerDriver.h" 3344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 3444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmannamespace android { 3544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 3644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn GrossmanMutex MediaPlayerFactory::sLock; 3744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn GrossmanMediaPlayerFactory::tFactoryMap MediaPlayerFactory::sFactoryMap; 3844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanbool MediaPlayerFactory::sInitComplete = false; 3944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 4044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanstatus_t MediaPlayerFactory::registerFactory_l(IFactory* factory, 4144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type type) { 4244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (NULL == factory) { 4344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGE("Failed to register MediaPlayerFactory of type %d, factory is" 4444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman " NULL.", type); 4544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return BAD_VALUE; 4644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 4744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 4844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (sFactoryMap.indexOfKey(type) >= 0) { 4944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGE("Failed to register MediaPlayerFactory of type %d, type is" 5044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman " already registered.", type); 5144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return ALREADY_EXISTS; 5244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 5344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 5444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (sFactoryMap.add(type, factory) < 0) { 5544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGE("Failed to register MediaPlayerFactory of type %d, failed to add" 5644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman " to map.", type); 5744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return UNKNOWN_ERROR; 5844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 5944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 6044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return OK; 6144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 6244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 6344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getDefaultPlayerType() { 6444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman char value[PROPERTY_VALUE_MAX]; 6544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (property_get("media.stagefright.use-nuplayer", value, NULL) 6644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman && (!strcmp("1", value) || !strcasecmp("true", value))) { 6744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return NU_PLAYER; 6844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 6944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 7044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return STAGEFRIGHT_PLAYER; 7144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 7244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 7344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanstatus_t MediaPlayerFactory::registerFactory(IFactory* factory, 7444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type type) { 7544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman Mutex::Autolock lock_(&sLock); 7644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return registerFactory_l(factory, type); 7744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 7844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 7944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanvoid MediaPlayerFactory::unregisterFactory(player_type type) { 8044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman Mutex::Autolock lock_(&sLock); 8144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman sFactoryMap.removeItem(type); 8244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 8344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 8444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#define GET_PLAYER_TYPE_IMPL(a...) \ 8544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman Mutex::Autolock lock_(&sLock); \ 8644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman \ 8744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type ret = STAGEFRIGHT_PLAYER; \ 8844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman float bestScore = 0.0; \ 8944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman \ 9044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman for (size_t i = 0; i < sFactoryMap.size(); ++i) { \ 9144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman \ 9244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman IFactory* v = sFactoryMap.valueAt(i); \ 9344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman float thisScore; \ 9444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman CHECK(v != NULL); \ 9544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman thisScore = v->scoreFactory(a, bestScore); \ 9644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (thisScore > bestScore) { \ 9744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ret = sFactoryMap.keyAt(i); \ 9844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman bestScore = thisScore; \ 9944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } \ 10044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } \ 10144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman \ 10244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (0.0 == bestScore) { \ 10344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman bestScore = getDefaultPlayerType(); \ 10444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } \ 10544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman \ 10644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return ret; 10744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 10844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client, 10944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman const char* url) { 11044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman GET_PLAYER_TYPE_IMPL(client, url); 11144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 11244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 11344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client, 11444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int fd, 11544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int64_t offset, 11644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int64_t length) { 11744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman GET_PLAYER_TYPE_IMPL(client, fd, offset, length); 11844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 11944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 12044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client, 12144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman const sp<IStreamSource> &source) { 12244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman GET_PLAYER_TYPE_IMPL(client, source); 12344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 12444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 12544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#undef GET_PLAYER_TYPE_IMPL 12644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 12744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmansp<MediaPlayerBase> MediaPlayerFactory::createPlayer( 12844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type playerType, 12944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman void* cookie, 13044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman notify_callback_f notifyFunc) { 13144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman sp<MediaPlayerBase> p; 13244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman IFactory* factory; 13344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman status_t init_result; 13444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman Mutex::Autolock lock_(&sLock); 13544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 13644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (sFactoryMap.indexOfKey(playerType) < 0) { 13744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGE("Failed to create player object of type %d, no registered" 13844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman " factory", playerType); 13944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return p; 14044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 14144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 14244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman factory = sFactoryMap.valueFor(playerType); 14344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman CHECK(NULL != factory); 14444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman p = factory->createPlayer(); 14544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 14644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (p == NULL) { 14744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGE("Failed to create player object of type %d, create failed", 14844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman playerType); 14944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return p; 15044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 15144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 15244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman init_result = p->initCheck(); 15344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (init_result == NO_ERROR) { 15444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman p->setNotifyCallback(cookie, notifyFunc); 15544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } else { 15644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGE("Failed to create player object of type %d, initCheck failed" 15744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman " (res = %d)", playerType, init_result); 15844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman p.clear(); 15944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 16044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 16144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return p; 16244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 16344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 16444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman/***************************************************************************** 16544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman * * 16644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman * Built-In Factory Implementations * 16744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman * * 16844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman *****************************************************************************/ 16944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 17044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass StagefrightPlayerFactory : 17144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman public MediaPlayerFactory::IFactory { 17244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman public: 17344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual float scoreFactory(const sp<IMediaPlayer>& client, 17444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int fd, 17544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int64_t offset, 17644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int64_t length, 17744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman float curScore) { 17844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman char buf[20]; 17944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman lseek(fd, offset, SEEK_SET); 18044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman read(fd, buf, sizeof(buf)); 18144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman lseek(fd, offset, SEEK_SET); 18244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 18344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman long ident = *((long*)buf); 18444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 18544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman // Ogg vorbis? 18644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (ident == 0x5367674f) // 'OggS' 18744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 1.0; 18844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 18944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 19044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 19144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 19244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual sp<MediaPlayerBase> createPlayer() { 19344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGV(" create StagefrightPlayer"); 19444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return new StagefrightPlayer(); 19544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 19644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}; 19744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 19844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass NuPlayerFactory : public MediaPlayerFactory::IFactory { 19944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman public: 20044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual float scoreFactory(const sp<IMediaPlayer>& client, 20144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman const char* url, 20244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman float curScore) { 20344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman static const float kOurScore = 0.8; 20444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 20544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (kOurScore <= curScore) 20644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 20744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 20844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (!strncasecmp("http://", url, 7) 20944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman || !strncasecmp("https://", url, 8)) { 21044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman size_t len = strlen(url); 21144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { 21244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return kOurScore; 21344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 21444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 21544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (strstr(url,"m3u8")) { 21644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return kOurScore; 21744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 21844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 21944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 22044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (!strncasecmp("rtsp://", url, 7)) { 22144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return kOurScore; 22244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 22344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 22444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 22544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 22644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 22744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual float scoreFactory(const sp<IMediaPlayer>& client, 22844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman const sp<IStreamSource> &source, 22944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman float curScore) { 23044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 1.0; 23144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 23244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 23344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual sp<MediaPlayerBase> createPlayer() { 23444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGV(" create NuPlayer"); 23544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return new NuPlayerDriver; 23644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 23744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}; 23844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 23944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass SonivoxPlayerFactory : public MediaPlayerFactory::IFactory { 24044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman public: 24144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual float scoreFactory(const sp<IMediaPlayer>& client, 24244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman const char* url, 24344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman float curScore) { 24444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman static const float kOurScore = 0.4; 24544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman static const char* const FILE_EXTS[] = { ".mid", 24644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".midi", 24744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".smf", 24844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".xmf", 2495c5f8d93667ec36fbcd01ecb113ccae78322c85bDongwon Kang ".mxmf", 25044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".imy", 25144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".rtttl", 25244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".rtx", 25344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".ota" }; 25444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (kOurScore <= curScore) 25544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 25644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 25744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman // use MidiFile for MIDI extensions 25844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int lenURL = strlen(url); 25944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman for (int i = 0; i < NELEM(FILE_EXTS); ++i) { 26044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int len = strlen(FILE_EXTS[i]); 26144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int start = lenURL - len; 26244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (start > 0) { 26344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (!strncasecmp(url + start, FILE_EXTS[i], len)) { 26444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return kOurScore; 26544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 26644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 26744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 26844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 26944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 27044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 27144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 27244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual float scoreFactory(const sp<IMediaPlayer>& client, 27344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int fd, 27444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int64_t offset, 27544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int64_t length, 27644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman float curScore) { 27744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman static const float kOurScore = 0.8; 27844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 27944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (kOurScore <= curScore) 28044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 28144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 28244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman // Some kind of MIDI? 28344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman EAS_DATA_HANDLE easdata; 28444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (EAS_Init(&easdata) == EAS_SUCCESS) { 28544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman EAS_FILE locator; 28644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman locator.path = NULL; 28744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman locator.fd = fd; 28844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman locator.offset = offset; 28944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman locator.length = length; 29044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman EAS_HANDLE eashandle; 29144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (EAS_OpenFile(easdata, &locator, &eashandle) == EAS_SUCCESS) { 29244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman EAS_CloseFile(easdata, eashandle); 29344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman EAS_Shutdown(easdata); 29444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return kOurScore; 29544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 29644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman EAS_Shutdown(easdata); 29744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 29844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 29944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 30044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 30144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 30244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual sp<MediaPlayerBase> createPlayer() { 30344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGV(" create MidiFile"); 30444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return new MidiFile(); 30544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 30644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}; 30744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 30844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass TestPlayerFactory : public MediaPlayerFactory::IFactory { 30944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman public: 31044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual float scoreFactory(const sp<IMediaPlayer>& client, 31144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman const char* url, 31244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman float curScore) { 31344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (TestPlayerStub::canBeUsed(url)) { 31444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 1.0; 31544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 31644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 31744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 31844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 31944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 32044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual sp<MediaPlayerBase> createPlayer() { 32144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGV("Create Test Player stub"); 32244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return new TestPlayerStub(); 32344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 32444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}; 32544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 32644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanvoid MediaPlayerFactory::registerBuiltinFactories() { 32744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman Mutex::Autolock lock_(&sLock); 32844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 32944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (sInitComplete) 33044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return; 33144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 33244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman registerFactory_l(new StagefrightPlayerFactory(), STAGEFRIGHT_PLAYER); 33344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman registerFactory_l(new NuPlayerFactory(), NU_PLAYER); 33444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman registerFactory_l(new SonivoxPlayerFactory(), SONIVOX_PLAYER); 33544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman registerFactory_l(new TestPlayerFactory(), TEST_PLAYER); 33644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 33744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman sInitComplete = true; 33844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 33944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 34044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} // namespace android 341