StagefrightPlayer的创建

在媒体文件的播放过程中,会选择使用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;
}


3. MediaPlayerFactory::createPlayer()

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;
}


    factory = sFactoryMap.valueFor(playerType);   //根据playerType选择factory
    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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值