"本文轉(zhuǎn)載自:[yanbixing123]的Android MultiMedia框架完全解析 - ACodec詳細(xì)解析"
1.概述
??前面的文章中热某,已經(jīng)多次分析過ACodec檀训,這里單獨一章用來分析其中的一些機(jī)制與流程机错,下面先來看看ACodec在整個NuPlayer架構(gòu)中的位置:
2.ACodec消息機(jī)制
??(1)ACodec有一個BaseState和派生出來的其他State谍憔,如UninitializedState只磷,LoadedToIdleState惨远,ExecutingState等叁幢。當(dāng)有消息過來時钞馁,如果派生類有重寫的方法,則會調(diào)到重寫的方法二打,如果沒有,則會調(diào)到BaseState的方法掂榔。
??(2)ACodec繼承自AHierarchicalStateMachine類继效,該類用于將收到的消息傳遞給哪個state。
??(3)ACodec收到的消息分兩種装获,一種是MediaCodec傳過來的瑞信,對應(yīng)onMessageReceived方法;另一種是OMXComponent傳過來的穴豫,對應(yīng)onOMXMessage方法凡简。而onOMXMessage里面又分了4種情況來調(diào)用不同的方法:EVENT、EMPTY_BUFFER_DONE精肃、FILL_BUFFER_DONE和FRAME_RENDERED秤涩。
3.ACodec向MediaCodec的通知
??OMX的組件解碼之后,ACodec::BaseState::onOMXFillBufferDone (…)會被回調(diào)司抱,去取得解碼后的數(shù)據(jù)筐眷。然后會在onOMXFillBufferDone中調(diào)用notify通知MediaCodec,發(fā)給MediaCodec的消息形如notify->setInt32("what",CodecBase::kWhatDrainThisBuffer); 然后notify->post();
??MediaCodec收到ACodec的消息后做相應(yīng)處理习柠,調(diào)updateBuffers(kPortIndexOutput,msg) 進(jìn)行更新匀谣,同時調(diào)用onOutputBufferAvailable()中通知NuPlayer::Decoder有可用的outputbuffer。
4.ACodec的三種端口模式狀態(tài)
??其會根據(jù)當(dāng)前的狀態(tài)來決定buffer如何處理:
KEEP_BUFFERS:當(dāng)ACodec處于BaseState或者收到OnInputBufferFilled消息但是buffer里面沒有填充有效的數(shù)據(jù)時资溃,ACodec握有的buffer不會送到OMX 組件武翎;
RESUBMIT_BUFFERS:當(dāng)ACodec處于ExecutingState或者處于OutputPortSettingChangedState但是當(dāng)前是input口的buffer時,ACodec將握有的buffer送給OMX 組件溶锭;
FREE_BUFFERS:當(dāng)ACodec處于OutputPortSettingChangedState并且當(dāng)前是output口的buffer時宝恶,ACodec將握有的buffer釋放掉。
??buffer傳輸過程: