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


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
原创粉丝点击