video/audio playback:prepare & start

prepare:啓動mQueue,對http://rtsp://gtalk/fmradio://rx 之類的url進行mAudioTrack/mVideoTrack分離,並根據mAudioTrack/mVideoTrack編碼類型選擇相應的decode

1.framework/base/media/libmediaplayerservice/MediaPlayerService.cpp

status_t MediaPlayerService::Client::prepareAsync()

{….

 sp<MediaPlayerBase> p = getPlayer(); ……..  setDataSource時創建的stagefrightplayer                          

    if (p == 0) return UNKNOWN_ERROR;

    status_t ret = p->prepareAsync();

……

    return ret;

}

2.framework/base/media/libmediaplayerservice/stagefrightplayer

status_t StagefrightPlayer::prepareAsync() {

    return mPlayer->prepareAsync();…………mPlayer--->AwesomePlayer

}

3:framework/base/media/libstagefright/awesomePlayer

status_t AwesomePlayer::prepareAsync() {

…….

    return prepareAsync_l();

}

啓動mQueueonPrepareAsyncEvent被觸發

status_t AwesomePlayer::prepareAsync_l() {……

    if (!mQueueStarted) {

        mQueue.start();

        mQueueStarted = true;

    }

….

    mAsyncPrepareEvent = new AwesomeEvent(

            this, &AwesomePlayer::onPrepareAsyncEvent);

    mQueue.postEvent(mAsyncPrepareEvent);

    return OK;

}

 

void AwesomePlayer::onPrepareAsyncEvent() {

….

    if (mUri.size() > 0) {

        status_t err = finishSetDataSource_l();………….http://之類的url進行mAudioTrack/mVideoTrack分離

    if (mVideoTrack != NULL && mVideoSource == NULL) {

        status_t err = initVideoDecoder();……………………decode video

    }

 

    if (mAudioTrack != NULL && mAudioSource == NULL) {

        status_t err = initAudioDecoder();…………………….decode audio

           return;

        }

    }

    if (mCachedSource != NULL || mRTSPController != NULL) {

        postBufferingEvent_l();………………..觸發mBufferingEvent,對應的實現在void                   AwesomePlayer::onBufferingUpdate()

    }

}

 

start:解碼並播放

1,framework/base/media/libmedia/mediaPlayer.cpp

status_t MediaPlayer::start()

{……

    if ( (mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_PREPARED |

                    MEDIA_PLAYER_PLAYBACK_COMPLETE | MEDIA_PLAYER_PAUSED ) ) ) {

        mPlayer->setLooping(mLoop);

        mPlayer->setVolume(mLeftVolume, mRightVolume);

        mPlayer->setAuxEffectSendLevel(mSendLevel);

        mCurrentState = MEDIA_PLAYER_STARTED;

        status_t ret = mPlayer->start();

……….

}

2,framework/base/media/libmediaPlayerService /mediaPlayerService.cpp

status_t MediaPlayerService::Client::start()

{..

    sp<MediaPlayerBase> p = getPlayer();

    p->setLooping(mLoop);

    return p->start();

}

3,framework/base/media/libmediaPlayerService/stagefrightplayer.cpp

 

status_t StagefrightPlayer::start() {

    return mPlayer->play();

}

4,framework/base/media/libstagefright/awesomePlayer.cpp

tatus_t AwesomePlayer::play() {

  ………..

  return play_l();

}

 

status_t AwesomePlayer::play_l() {

……

    if (mVideoSource != NULL) {

        // Kick off video playback

        postVideoEvent_l();……..videoEvent放入mQueue

 

}

開始解碼播放,並由mVideoRenderer輸出,video playback 完成

void AwesomePlayer::onVideoEvent() {……………

            status_t err = mVideoSource->read(&mVideoBuffer[mVideoQueueBack], &options);

……….

    if (mVideoRenderer != NULL) {

        mVideoRenderer->render(mVideoBuffer[mVideoQueueBack]);

    }

…..

    postVideoEvent_l();

}

 

audio playerback

 

1,framework/base/media/libstagefright/awesomePlayer.cpp

status_t AwesomePlayer::play_l() {

    if (mAudioSource != NULL) {

        if (mAudioPlayer == NULL) {

            if (mAudioSink != NULL) {

                mWatchForAudioSeekComplete = false;

                mAudioPlayer = new AudioPlayer(mAudioSink, this);

                mAudioPlayer->setSource(mAudioSource);

…………..

                    }

                }

                status_t err = mAudioPlayer->start(

                        true /* sourceAlreadyStarted */);

………………..

}

2,framework/base/media/libstagefright/audioplayer.cpp

讀第一手解析的數據,並開啓audio output

status_t AudioPlayer::start(bool sourceAlreadyStarted) {

    if (mAudioSink.get() != NULL) {

        status_t err = mAudioSink->open(

                mSampleRate, numChannels, AudioSystem::PCM_16_BIT,

                DEFAULT_AUDIOSINK_BUFFERCOUNT,

                &AudioPlayer::AudioSinkCallback, this);

……

        mAudioSink->start();

    } else {

        mAudioTrack = new AudioTrack(

                AudioSystem::MUSIC, mSampleRate, AudioSystem::PCM_16_BIT,

                (numChannels == 2)

                    ? AudioSystem::CHANNEL_OUT_STEREO

                    : AudioSystem::CHANNEL_OUT_MONO,

                0, 0, &AudioCallback, this, 0);

….

        mAudioTrack->start();

    }

 

    mStarted = true;

 

    return OK;

}

 

開啓audio output 時後把AudioSinkCallback傳給它,每當調用callback時,audioplayer都回去decode 獲取解碼後的數據

size_t AudioPlayer::AudioSinkCallback(

        MediaPlayerBase::AudioSink *audioSink,

        void *buffer, size_t size, void *cookie) {

    AudioPlayer *me = (AudioPlayer *)cookie;

 

    return me->fillBuffer(buffer, size);

}

 

size_t AudioPlayer::fillBuffer(void *data, size_t size) {

…..

            err = mSource->read(&mInputBuffer, &options);

…..    

     memcpy((char *)data + size_done,

               (const char *)mInputBuffer->data() + mInputBuffer->range_offset(),

               copy);

…….

 

    return size_done;

}

 

發佈了32 篇原創文章 · 獲贊 59 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章