16. Android MultiMedia框架完全解析 - ACodec詳細解析

之前的文章中,已經多次分析過ACodec,但是我仍然認爲有必要單獨拿出來一節分析其中的一些機制與流程,下面先來看看ACodec在整個NuPlayer架構中的位置:

1、ACodec消息機制:

ACodec有一個BaseState和派生出來的其他State,如 UninitializedState,LoadedToIdleState, ExecutingState等。當有消息過來時,如果派生類有重寫的方法,則會調到重寫的方法,如果沒有,則會調到BaseState的方法。

ACodec繼承自AHierarchicalStateMachine類,該類用於將收到的消息傳遞給哪個state。

ACodec收到的消息分兩種,一種是MediaCodec傳過來的,對應onMessageReceived方法;另一種是OMXComponent傳過來的,對應onOMXMessage方法。而onOMXMessage裏面又分了4種情況來調用不同的方法。(EVENT、EMPTY_BUFFER_DONE、FILL_BUFFER_DONE和FRAME_RENDERED)

 

2、ACodec向MediaCodec的通知(例)

OMX的組件解碼之後,ACodec::BaseState::onOMXFillBufferDone (…)會被回調,去取得解碼後的數據。然後會在onOMXFillBufferDone中調用notify通知MediaCodec,發給MediaCodec的消息形如notify->setInt32("what",CodecBase::kWhatDrainThisBuffer); 然後notify->post();

MediaCodec收到ACodec的消息後做相應處理,調updateBuffers(kPortIndexOutput,msg) 進行更新,同時調用onOutputBufferAvailable()中通知NuPlayer::Decoder有可用的outputbuffer。

 

3、 ACodec的三種端口模式狀態

其會根據當前處於哪個狀態來決定buffer如何處理:

KEEP_BUFFERS:當ACodec處於BaseState或者收到OnInputBufferFilled消息但是buffer裏面沒有填充有效的數據時,ACodec握有的buffer不會送到OMX 組件;

RESUBMIT_BUFFERS:當ACodec處於ExecutingState或者處於OutputPortSettingChangedState但是當前是input口的buffer時,ACodec將握有的buffer送給OMX 組件;

FREE_BUFFERS:當ACodec處於OutputPortSettingChangedState並且當前是output口的buffer時,ACodec將握有的buffer釋放掉。

 

buffer傳輸過程

 

此文結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章