前言
输出buffer整体的管理流程主要可以分为三个部分:
- MediaCodc 和 应用之间的交互 包括设置Surface、解码输出回调到MediaCodec。将输出buffer render或者releas到surface。
- MediaCodec到CCodecBufferChannel,主要是传递控制命令
- CCodecbufferChannel到componet buffer的封装 传递 控制等等。
- componet到bufferqueuepool buffer的申请
外部设置Surface进来,然后把输入buffer 输入,等待输出buffer 的回调,回调回来后 根据音视频同步的策略。在合适的时机renderOutput 送到MediaCodec。
需要了解的几个方面
- setSurface内部做了什么处理。
- 什么时候有输出的buffer可用?
- 输出buffer render到MediaCodec.内部做了什么处理。
setSurface
外部的setSurface调用到 MediaCodec的kWhatSetSurface
- MediaCodec::setSurface
调用下面的connetToSurface 对surface进行连接
nativeWindowConnect(surface.get(), "connectToSurface(reconnect)");
- CCodecBufferChannel::setSurface
根据bufferChanned的信息配置surface,比如配置deuque buffer 的超时时间、
dequeue最大的buffer数,当然这些值在后续可能还会改变,后续在解码器中解码出来的delay改变的话 回重新设置这个delay,
然后在handlework 重新设置最大的可dequeue的buffer 数。赋值mOutputSurface的相关变量。
Mutexed<OutputSurface>::Locked output(mOutputSurface);
output->surface = newSurface;
output->generation = generation;
- 设置surface到 C2BufferQueueBlockPool 用于后续的解码buffer的申请
在ccodecbufferchannel的start中调用configureProducer设置外部surface的GraphicBufferProducer到
bufferQueueBlockpopl中。
outputSurface = output->surface ?
output->surface->getIGraphicBufferProducer() : nullptr;
if (outputSurface) {
mComponent->setOutputSurface(
outputPoolId_,
outputSurface,
outputGeneration,
maxDequeueCount);
}
Return<Status> Component::setOutputSurface(
uint64_t blockPoolId,
const sp<HGraphicBufferProducer2>& surface) {
std::shared_ptr<C2BlockPool> pool;
GetCodec2BlockPool(blockPoolId, mComponent, &pool);
if (pool && pool->getAllocatorId() == C2PlatformAllocatorStore::BUFFERQUEUE) {
if (bqPool) {
bqPool->setRenderCallback(cb);
bqPool->configureProducer(surface);
}
}
return Status::OK;
}
void configureProducer(const sp<HGraphicBufferProducer> &producer,
native_handle_t *syncHandle,
uint64_t producerId,
uint32_t generation,
uint64_t usage,
bool bqInformation) {
if (producer) {
mProducer = producer;
mProducerId = producerId;
mGeneration = bqInformation ? generation : 0;
}
}
start
start 中跟输出buffer 相关的主要是两个方面
- 可以从surface最大能够dequeue出的buffer 数。由4个值组成 其中
kSmoothnessFactor为4 kRenderingDepth为3。outputDelay由各个解码组件进行设置
比如h264的默认设置为8, 同时会在解码过程handlework进行重新设置。
具体来说: