【Multi Media】Android多媒体播放

多媒体和编解码器(组件)之前交互流程分为两个,
对于组件端来说,一个是输入一个是输出,

以音频解码器流程为例:
输入流程:
mNuPlayer::Decoder::fetchInputData MediaCodec 从source中获取音频流A(从Source获取音频流)
AmNuPlayer::Decoder::onInputBufferFetched 将音频流送入指定index的buffer
MediaCodec::queueInputBuffer 发送MediaCodec::kWhatQueueInputBuffer消息
MediaCodec::onQueueInputBuffer
ACodecBufferChannel::queueInputBuffer 发送ACodec::kWhatInputBufferFilled信息
ACodec::BaseState::onInputBufferFilled
OMXNodeInstance::emptyBuffer
OMX_EmptyThisBuffer 送数据完成。

解码器解码完数据之后,回调
OMXNodeInstance::OnEmptyBufferDone,发送omx_message::EMPTY_BUFFER_DONE
ACodec::BaseState::onOMXEmptyBufferDone
ACodecBufferChannel::fillThisBuffer
BufferCallback::onInputBufferAvailable,发送MediaCodec::kWhatFillThisBuffer
MediaCodec::onInputBufferAvailable,发送MediaCodec::CB_INPUT_AVAILABLE
NuPlayer::Decoder::handleAnInputBuffer
NuPlayer::DecoderBase::onRequestInputBuffers
AmNuPlayer::Decoder::doRequestBuffers
回调到输入第一步填写数据到buffer,整个循环完成,对应流程图上方。

输出流程:
解码器解码完之后,回调
OMXNodeInstance::OnFillBufferDone,发送omx_message::FILL_BUFFER_DONE
ACodec::BaseState::onOMXFillBufferDone
ACodecBufferChannel::drainThisBuffer
BufferCallback::onOutputBufferAvailable,发送MediaCodec::kWhatDrainThisBuffer
MediaCodec::onOutputBufferAvailable,发送MediaCodec::CB_OUTPUT_AVAILABLE
NuPlayer::Decoder::handleAnOutputBuffer
以下步骤开始送到AudioTrack,write给AudioFlinger
NuPlayer::Renderer::queueBuffer,发送kWhatQueueBuffer
NuPlayer::Renderer::onQueueBuffer,发送kWhatDrainAudioQueue
NuPlayer::Renderer::onDrainAudioQueue

同时handleAnOutputBuffer发送AmNuPlayer::DecoderBase::kWhatRenderBuffer消息,
AmNuPlayer::Decoder::onRenderBuffer
MediaCodec::releaseOutputBuffer,发送MediaCodec::kWhatReleaseOutputBuffer消息
MediaCodec::onReleaseOutputBuffer
ACodecBufferChannel::renderOutputBuffer,发送ACodec::kWhatOutputBufferDrained
ACodec::BaseState::onOutputBufferDrained
OMXNodeInstance::fillBuffer
OMX_FillThisBuffer
已经将解码之后buffer的数据取走,通知解码器放置数据,整个输出流程走完,对应流程图下方

【Multi Media】Android多媒体播放