StagefrightPlayer的创建
来源:互联网 发布:家庭网络设计方案 编辑:程序博客网 时间:2024/06/07 00:45
在媒体文件的播放过程中,会选择使用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
- StagefrightPlayer的创建
- Android ICS创建StagefrightPlayer播放器的过程
- Android ICS创建StagefrightPlayer播放器的过程
- StagefrightPlayer的OpenMax调用流程
- Android StagefrightPlayer
- Android StagefrightPlayer调用流程
- StagefrightPlayer&&AwesomePlayer 初步分析
- Android StagefrightPlayer调用流程
- 【stagefrightplayer】1 调用过程
- 【stagefrightplayer】3 MediaExtractor介绍
- 【stagefrightplayer】1 调用过程
- 【stagefrightplayer】3 MediaExtractor介绍
- Android StagefrightPlayer调用流程
- StagefrightPlayer&&AwesomePlayer 初步分析
- stagefrightplayer调用过程
- stagefrightplayer调用过程2
- StagefrightPlayer+AwesomePlayer+omx
- 【Android 】【多媒体】stagefrightplayer框架
- Leetcode: Palindrome Partitioning II
- 我的vimrc.vim备份
- linux命令行
- Training a deep autoencoder or a classifier on MNIST digits_Rbm训练(python)
- maven依赖包的查询
- StagefrightPlayer的创建
- java 虚拟机内存模型
- KMP模板
- 关于12306的一些想法
- 18-打印国际象棋Dev C++
- 冒泡排序的 改进版
- (转)Android UI布局中设置了fill_parenet仍然没有全屏的解决办法
- 制图表达覆盖
- linux菜鸟在ubuntu12.04下安装vim7.4