🌓

MediaCodec 全链路深度剖析(七):SurfaceFlinger、HWC 与 Android 显示管线

系列导读:第六篇把「容器 GraphicBuffer」和「管道 BufferQueue」讲完了,MediaCodec 解码出来的 YUV 已经躺在 SurfaceFlinger 的一个 slot 里、fence 也挂好了。接下来的问题是——这块 Buffer 是怎么变成屏幕上一帧图像的。这一篇把 Producer 之后到像素扫描出去之前的完整链路拆开:Su...

阅读全文

MediaCodec 全链路深度剖析(六):GraphicBuffer 和 BufferQueue

系列导读:第五篇结尾留了一句话——“vendor 解码出来的那块 YUV 内存,物理上一开始就分配在 SurfaceFlinger 的 BufferQueue 里”。这句话里压了两层底层概念:那块”内存”长什么样,那条”BufferQueue”怎么搬运它。这一篇把这两层拆开讲,分两大部分: GraphicBuffer——Android 图形栈的通用容器...

阅读全文

MediaCodec 全链路深度剖析(五):从 C2Work 到 vendor 进程

系列导读:第四篇停在CCodecBufferChannel::queueInputBufferInternal里那一行mComponent->queue(&items)——一个C2Work列表打过去,HAL 那边解完通过onWorkDone回来。这一篇接着拆开这条线: C2Work到底装了什么、为什么是这个形状? mComponent-&g...

阅读全文

MediaCodec 全链路深度剖析(四):CCodec 与 BufferChannel 的分工

系列导读:第三篇把视角停在了MediaCodec.cpp的状态机,所有动作最后都落在一个sp<CodecBase> mCodec上。这一篇接着往下走,回答两个问题: mCodec 到底是 CCodec 还是 ACodec?谁来选、什么时候选? 进了 CCodec 以后,状态切换、buffer 进出、Surface 渲染——为什么要拆给两个类来...

阅读全文

MediaCodec 全链路深度剖析(三):Native 消息机制与 JNI 桥接

系列导读:第二篇结尾留下一个钩子——真正的状态机在 Native 层,Java 侧只是个薄壳。这一篇沿着 codec.start()、dequeueOutputBuffer() 这种”看上去同步”的调用一路下钻,回答一个问题: Java 的同步调用,在 JNI 之下到底是怎么落到 Native、又是怎么”原地等回结果”的? 主角是 AOSP foundat...

阅读全文