在媒体文件的播放过程中,会选择使用StagefrightPlayer 还是 NuPlayer, SonivoxPlayer,等。在setDataSource()时,会通过createPlayer()来选择。
较早之前的过程和4.4并不一样,大概是从4.3还是4.2开始改的。之前创建好像是直接在MediaPlayerService中根据player_type,new StagefrightPlayer即可。
一, stagefright player的创建过程
下面从setDataSource_pre()中开始分析创建的过程:
1. MediaPlayerService::Client::setDataSource_pre()
sp<MediaPlayerBase> MediaPlayerService::Client::setDataSource_pre(
player_type playerType)
{
ALOGV("player type = %d", playerType);
// create the right type of player
sp<MediaPlayerBase> p = createPlayer(playerType); //此处创建player
if (p == NULL) {
return p;
}
if (!p->hardwareOutput()) {
mAudioOutput = new AudioOutput(mAudioSessionId, IPCThreadState::self()->getCallingUid());
static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput);
}
return p;
}
2. MediaPlayerService::Client::createPlayer(player_type playerType)
sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType)
{
// determine if we have the right player type
sp<MediaPlayerBase> p = mPlayer;
if ((p != NULL) && (p->playerType() != playerType)) {
ALOGV("delete player");
p.clear();
}
if (p == NULL) {
p = MediaPlayerFactory::createPlayer(playerType, this, notify); //到MediaPlayerFactory中进行下一步工作
}
if (p != NULL) {
p->setUID(mUID);
}
return p;
}
sp<MediaPlayerBase> MediaPlayerFactory::createPlayer(
player_type playerType,
void* cookie,
notify_callback_f notifyFunc) {
sp<MediaPlayerBase> p;
IFactory* factory;
status_t init_result;
Mutex::Autolock lock_(&sLock);
if (sFactoryMap.indexOfKey(playerType) < 0) {
ALOGE("Failed to create player object of type %d, no registered"
" factory", playerType);
return p;
}
factory = sFactoryMap.valueFor(playerType);
CHECK(NULL != factory);
p = factory->createPlayer();
if (p == NULL) {
ALOGE("Failed to create player object of type %d, create failed",
playerType);
return p;
}
init_result = p->initCheck();
if (init_result == NO_ERROR) {
p->setNotifyCallback(cookie, notifyFunc);
} else {
ALOGE("Failed to create player object of type %d, initCheck failed"
" (res = %d)", playerType, init_result);
p.clear();
}
return p;
}
CHECK(NULL != factory);
p = factory->createPlayer(); //在对应的factory中创建player
比如stagefrightplayer的创建(在StagefrigtPlayerFactory中):
virtual sp<MediaPlayerBase> createPlayer() {
ALOGV(" create StagefrightPlayer");
return new StagefrightPlayer();
}
factory = sFactoryMap.valueFor(playerType);中,sFactoryMap看来是一个存放IFacory*的 KeyedVector<>,定义在:
MediaPlayerFactory::tFactoryMap MediaPlayerFactory::sFactoryMap;
而tFactoryMap的定义在:
private:
typedef KeyedVector<player_type, IFactory*> tFactoryMap;
那么这个KeyedVector<player_type, IFactory>是在什么时候初始化的呢?
二, tFactoryMap的初始化
这个成员是在MediaPlayerService的构造函数中开始创建:
1. MediaPlayerService的构造函数:
MediaPlayerService::MediaPlayerService()
{
ALOGV("MediaPlayerService created");
mNextConnId = 1;
mBatteryAudio.refCount = 0;
for (int i = 0; i < NUM_AUDIO_DEVICES; i++) {
mBatteryAudio.deviceOn[i] = 0;
mBatteryAudio.lastTime[i] = 0;
mBatteryAudio.totalTime[i] = 0;
}
// speaker is on by default
mBatteryAudio.deviceOn[SPEAKER] = 1;
MediaPlayerFactory::registerBuiltinFactories(); // 可以看到此处是注册什么关于factory的东西
}
2. void MediaPlayerFactory::registerBuiltinFactories()
void MediaPlayerFactory::registerBuiltinFactories() {
Mutex::Autolock lock_(&sLock);
if (sInitComplete)
return;
registerFactory_l(new StagefrightPlayerFactory(), STAGEFRIGHT_PLAYER); //此处是关于stagefright player的
registerFactory_l(new NuPlayerFactory(), NU_PLAYER);
registerFactory_l(new SonivoxPlayerFactory(), SONIVOX_PLAYER);
registerFactory_l(new TestPlayerFactory(), TEST_PLAYER);
sInitComplete = true;
}
3. status_t MediaPlayerFactory::registerFactory_l()
status_t MediaPlayerFactory::registerFactory_l(IFactory* factory,
player_type type) {
if (NULL == factory) {
ALOGE("Failed to register MediaPlayerFactory of type %d, factory is"
" NULL.", type);
return BAD_VALUE;
}
if (sFactoryMap.indexOfKey(type) >= 0) {
ALOGE("Failed to register MediaPlayerFactory of type %d, type is"
" already registered.", type);
return ALREADY_EXISTS;
}
if (sFactoryMap.add(type, factory) < 0) { //此处就将StagefrightPlayerFactory添加到sFactoryMap中了
ALOGE("Failed to register MediaPlayerFactory of type %d, failed to add"
" to map.", type);
return UNKNOWN_ERROR;
}
return OK;
}
总结:
1. 先初始化sFactoryMap,可以根据player_type从中得到StagefrightPlayerFactory
2.根据player_type,得到StagefrightPlayerFactory,调用其createPlayer(),new StagefrightPlayer并返回。
三 , StagefrightPlayer的类型
StagefrightPlayer继承自MediaPlayerInterface
而MediaPlayerInterface继承自MediaPlayerBase