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> 23ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar#include <media/stagefright/DataSource.h> 24ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar#include <media/stagefright/FileSource.h> 2544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <media/stagefright/foundation/ADebug.h> 2644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <utils/Errors.h> 2744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include <utils/misc.h> 28ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar#include <../libstagefright/include/WVMExtractor.h> 2944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 3044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "MediaPlayerFactory.h" 3144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 3244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "MidiFile.h" 3344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "TestPlayerStub.h" 3444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "StagefrightPlayer.h" 3544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#include "nuplayer/NuPlayerDriver.h" 3644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 3744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmannamespace android { 3844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 3944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn GrossmanMutex MediaPlayerFactory::sLock; 4044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn GrossmanMediaPlayerFactory::tFactoryMap MediaPlayerFactory::sFactoryMap; 4144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanbool MediaPlayerFactory::sInitComplete = false; 4244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 4344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanstatus_t MediaPlayerFactory::registerFactory_l(IFactory* factory, 4444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type type) { 4544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (NULL == factory) { 4644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGE("Failed to register MediaPlayerFactory of type %d, factory is" 4744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman " NULL.", type); 4844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return BAD_VALUE; 4944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 5044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 5144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (sFactoryMap.indexOfKey(type) >= 0) { 5244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGE("Failed to register MediaPlayerFactory of type %d, type is" 5344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman " already registered.", type); 5444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return ALREADY_EXISTS; 5544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 5644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 5744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (sFactoryMap.add(type, factory) < 0) { 5844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGE("Failed to register MediaPlayerFactory of type %d, failed to add" 5944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman " to map.", type); 6044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return UNKNOWN_ERROR; 6144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 6244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 6344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return OK; 6444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 6544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 6648f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hungstatic player_type getDefaultPlayerType() { 6744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman char value[PROPERTY_VALUE_MAX]; 68f5bdd770d509373cc4174a55d0b81b223ecc4d81Lajos Molnar if (property_get("media.stagefright.use-awesome", value, NULL) 6944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman && (!strcmp("1", value) || !strcasecmp("true", value))) { 70f5bdd770d509373cc4174a55d0b81b223ecc4d81Lajos Molnar return STAGEFRIGHT_PLAYER; 71b47558f87ee9bd4fce11a2d5bc213bd1aa9031a8Lajos Molnar } 72b47558f87ee9bd4fce11a2d5bc213bd1aa9031a8Lajos Molnar 73b47558f87ee9bd4fce11a2d5bc213bd1aa9031a8Lajos Molnar // TODO: remove this EXPERIMENTAL developer settings property 74f5bdd770d509373cc4174a55d0b81b223ecc4d81Lajos Molnar if (property_get("persist.sys.media.use-awesome", value, NULL) 75b47558f87ee9bd4fce11a2d5bc213bd1aa9031a8Lajos Molnar && !strcasecmp("true", value)) { 76f5bdd770d509373cc4174a55d0b81b223ecc4d81Lajos Molnar return STAGEFRIGHT_PLAYER; 7744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 7844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 79f5bdd770d509373cc4174a55d0b81b223ecc4d81Lajos Molnar return NU_PLAYER; 8044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 8144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 8244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanstatus_t MediaPlayerFactory::registerFactory(IFactory* factory, 8344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type type) { 8444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman Mutex::Autolock lock_(&sLock); 8544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return registerFactory_l(factory, type); 8644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 8744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 8844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanvoid MediaPlayerFactory::unregisterFactory(player_type type) { 8944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman Mutex::Autolock lock_(&sLock); 9044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman sFactoryMap.removeItem(type); 9144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 9244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 9344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#define GET_PLAYER_TYPE_IMPL(a...) \ 9444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman Mutex::Autolock lock_(&sLock); \ 9544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman \ 9644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type ret = STAGEFRIGHT_PLAYER; \ 9744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman float bestScore = 0.0; \ 9844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman \ 9944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman for (size_t i = 0; i < sFactoryMap.size(); ++i) { \ 10044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman \ 10144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman IFactory* v = sFactoryMap.valueAt(i); \ 10244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman float thisScore; \ 10344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman CHECK(v != NULL); \ 10444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman thisScore = v->scoreFactory(a, bestScore); \ 10544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (thisScore > bestScore) { \ 10644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ret = sFactoryMap.keyAt(i); \ 10744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman bestScore = thisScore; \ 10844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } \ 10944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } \ 11044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman \ 11144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (0.0 == bestScore) { \ 112198a893671ce80d951625fe328a92073306660d0Andreas Huber ret = getDefaultPlayerType(); \ 11344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } \ 11444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman \ 11544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return ret; 11644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 11744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client, 11844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman const char* url) { 11944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman GET_PLAYER_TYPE_IMPL(client, url); 12044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 12144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 12244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client, 12344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int fd, 12444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int64_t offset, 12544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int64_t length) { 12644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman GET_PLAYER_TYPE_IMPL(client, fd, offset, length); 12744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 12844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 12944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanplayer_type MediaPlayerFactory::getPlayerType(const sp<IMediaPlayer>& client, 13044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman const sp<IStreamSource> &source) { 13144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman GET_PLAYER_TYPE_IMPL(client, source); 13244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 13344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 13444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman#undef GET_PLAYER_TYPE_IMPL 13544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 13644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmansp<MediaPlayerBase> MediaPlayerFactory::createPlayer( 13744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman player_type playerType, 13844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman void* cookie, 13944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman notify_callback_f notifyFunc) { 14044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman sp<MediaPlayerBase> p; 14144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman IFactory* factory; 14244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman status_t init_result; 14344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman Mutex::Autolock lock_(&sLock); 14444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 14544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (sFactoryMap.indexOfKey(playerType) < 0) { 14644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGE("Failed to create player object of type %d, no registered" 14744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman " factory", playerType); 14844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return p; 14944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 15044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 15144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman factory = sFactoryMap.valueFor(playerType); 15244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman CHECK(NULL != factory); 15344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman p = factory->createPlayer(); 15444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 15544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (p == NULL) { 15644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGE("Failed to create player object of type %d, create failed", 15744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman playerType); 15844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return p; 15944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 16044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 16144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman init_result = p->initCheck(); 16244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (init_result == NO_ERROR) { 16344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman p->setNotifyCallback(cookie, notifyFunc); 16444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } else { 16544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGE("Failed to create player object of type %d, initCheck failed" 16644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman " (res = %d)", playerType, init_result); 16744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman p.clear(); 16844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 16944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 17044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return p; 17144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 17244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 17344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman/***************************************************************************** 17444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman * * 17544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman * Built-In Factory Implementations * 17644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman * * 17744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman *****************************************************************************/ 17844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 17944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass StagefrightPlayerFactory : 18044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman public MediaPlayerFactory::IFactory { 18144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman public: 182247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/, 18344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int fd, 18444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int64_t offset, 185ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar int64_t length, 186247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn float /*curScore*/) { 187ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar if (legacyDrm()) { 188ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar sp<DataSource> source = new FileSource(dup(fd), offset, length); 189ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar String8 mimeType; 190ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar float confidence; 191ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar if (SniffWVM(source, &mimeType, &confidence, NULL /* format */)) { 192ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar return 1.0; 193ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar } 194ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar } 195ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar 196ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar if (getDefaultPlayerType() == STAGEFRIGHT_PLAYER) { 19748f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung char buf[20]; 19848f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung lseek(fd, offset, SEEK_SET); 19948f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung read(fd, buf, sizeof(buf)); 20048f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung lseek(fd, offset, SEEK_SET); 20148f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung 20248f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung uint32_t ident = *((uint32_t*)buf); 20348f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung 20448f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung // Ogg vorbis? 20548f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung if (ident == 0x5367674f) // 'OggS' 20648f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung return 1.0; 20748f36a07d1faa1b8ec0af5d12d3c18fbfcb9eb65Andy Hung } 20844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 20944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 21044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 21144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 212ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/, 213ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar const char* url, 214ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar float /*curScore*/) { 215ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar if (legacyDrm() && !strncasecmp("widevine://", url, 11)) { 216ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar return 1.0; 217ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar } 218ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar return 0.0; 219ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar } 220ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar 22144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual sp<MediaPlayerBase> createPlayer() { 22244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGV(" create StagefrightPlayer"); 22344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return new StagefrightPlayer(); 22444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 225ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar private: 226ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar bool legacyDrm() { 227ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar char value[PROPERTY_VALUE_MAX]; 228ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar if (property_get("persist.sys.media.legacy-drm", value, NULL) 229ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar && (!strcmp("1", value) || !strcasecmp("true", value))) { 230ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar return true; 231ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar } 232ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar return false; 233ca7b4bc40604ae4f06718cb34945fdab278987aeLajos Molnar } 23444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}; 23544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 23644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass NuPlayerFactory : public MediaPlayerFactory::IFactory { 23744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman public: 238247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/, 23944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman const char* url, 24044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman float curScore) { 24144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman static const float kOurScore = 0.8; 24244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 24344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (kOurScore <= curScore) 24444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 24544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 24644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (!strncasecmp("http://", url, 7) 247997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber || !strncasecmp("https://", url, 8) 248997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber || !strncasecmp("file://", url, 7)) { 24944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman size_t len = strlen(url); 25044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { 25144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return kOurScore; 25244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 25344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 25444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (strstr(url,"m3u8")) { 25544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return kOurScore; 25644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 2577a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé 2587a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé if ((len >= 4 && !strcasecmp(".sdp", &url[len - 4])) || strstr(url, ".sdp?")) { 2597a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé return kOurScore; 2607a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé } 26144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 26244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 26344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (!strncasecmp("rtsp://", url, 7)) { 26444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return kOurScore; 26544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 26644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 26744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 26844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 26944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 270247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/, 271247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn const sp<IStreamSource>& /*source*/, 272247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn float /*curScore*/) { 27344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 1.0; 27444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 27544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 27644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual sp<MediaPlayerBase> createPlayer() { 27744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGV(" create NuPlayer"); 27844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return new NuPlayerDriver; 27944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 28044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}; 28144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 28244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass SonivoxPlayerFactory : public MediaPlayerFactory::IFactory { 28344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman public: 284247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/, 28544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman const char* url, 28644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman float curScore) { 28744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman static const float kOurScore = 0.4; 28844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman static const char* const FILE_EXTS[] = { ".mid", 28944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".midi", 29044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".smf", 29144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".xmf", 2925c5f8d93667ec36fbcd01ecb113ccae78322c85bDongwon Kang ".mxmf", 29344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".imy", 29444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".rtttl", 29544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".rtx", 29644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ".ota" }; 29744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (kOurScore <= curScore) 29844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 29944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 30044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman // use MidiFile for MIDI extensions 30144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int lenURL = strlen(url); 30244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman for (int i = 0; i < NELEM(FILE_EXTS); ++i) { 30344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int len = strlen(FILE_EXTS[i]); 30444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int start = lenURL - len; 30544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (start > 0) { 30644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (!strncasecmp(url + start, FILE_EXTS[i], len)) { 30744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return kOurScore; 30844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 30944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 31044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 31144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 31244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 31344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 31444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 315247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/, 31644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int fd, 31744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int64_t offset, 31844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman int64_t length, 31944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman float curScore) { 32044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman static const float kOurScore = 0.8; 32144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 32244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (kOurScore <= curScore) 32344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 32444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 32544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman // Some kind of MIDI? 32644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman EAS_DATA_HANDLE easdata; 32744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (EAS_Init(&easdata) == EAS_SUCCESS) { 32844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman EAS_FILE locator; 32944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman locator.path = NULL; 33044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman locator.fd = fd; 33144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman locator.offset = offset; 33244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman locator.length = length; 33344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman EAS_HANDLE eashandle; 33444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (EAS_OpenFile(easdata, &locator, &eashandle) == EAS_SUCCESS) { 33544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman EAS_CloseFile(easdata, eashandle); 33644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman EAS_Shutdown(easdata); 33744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return kOurScore; 33844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 33944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman EAS_Shutdown(easdata); 34044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 34144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 34244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 34344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 34444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 34544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual sp<MediaPlayerBase> createPlayer() { 34644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGV(" create MidiFile"); 34744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return new MidiFile(); 34844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 34944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}; 35044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 35144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanclass TestPlayerFactory : public MediaPlayerFactory::IFactory { 35244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman public: 353247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/, 35444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman const char* url, 355247d9ebdbe7f165644f308745eee061fcbb77771Mark Salyzyn float /*curScore*/) { 35644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (TestPlayerStub::canBeUsed(url)) { 35744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 1.0; 35844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 35944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 36044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return 0.0; 36144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 36244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 36344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman virtual sp<MediaPlayerBase> createPlayer() { 36444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman ALOGV("Create Test Player stub"); 36544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return new TestPlayerStub(); 36644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman } 36744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman}; 36844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 36944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossmanvoid MediaPlayerFactory::registerBuiltinFactories() { 37044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman Mutex::Autolock lock_(&sLock); 37144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 37244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman if (sInitComplete) 37344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman return; 37444a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 37544a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman registerFactory_l(new StagefrightPlayerFactory(), STAGEFRIGHT_PLAYER); 37644a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman registerFactory_l(new NuPlayerFactory(), NU_PLAYER); 37744a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman registerFactory_l(new SonivoxPlayerFactory(), SONIVOX_PLAYER); 37844a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman registerFactory_l(new TestPlayerFactory(), TEST_PLAYER); 37944a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 38044a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman sInitComplete = true; 38144a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} 38244a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman 38344a7e42f0310831e6a846d1b6bb40bf3a399bf6dJohn Grossman} // namespace android 384