【发布时间】:2014-02-25 18:32:02
【问题描述】:
我在 SO 中的 Android Kitkat 中遇到了这个 generic question on Adaptive Playback。但是,我有一些具体的查询如下:
我能够理解codec 和相关框架的含义。但是,有一点我无法完全理解。
在自适应播放的情况下,编解码器在其输出端口上使用metadata,它基本上抽象并打包了一个底层缓冲区句柄(很可能是gralloc 句柄)。如果分辨率发生变化,我认为codec 会直接更新gralloc 句柄属性并将缓冲区发送回OMX 客户端,而无需更改端口设置。
我的第一个问题是:我的理解和假设是否正确?
如果是这样,Surfaceflinger/SurfaceTexture 如何知道传入的有效负载是metadata 格式,它如何从底层gralloc 实现中检索width 和height?
能否请您指出有助于我更好地理解这个问题的相关来源?
非常感谢。
【问题讨论】:
-
每个 gralloc 缓冲区都有一个标头,用于指定数据的尺寸和像素格式。 SurfaceFlinger 总是接收缓冲区(通过句柄传递,通过 BufferQueue); “元数据模式”是一个媒体编解码器的概念。一切都通过 BufferQueue(android.googlesource.com/platform/frameworks/native/+/… 和附近的 .cpp)。哎呀,一些关键的东西是 BufferQueue——仔细看看ANativeWindow。
-
@fadden.. 感谢您的回复。我知道
BufferQueue及其含义。我的问题是针对VideoDecoderMetadata受雇于Adaptive Playback。在这种情况下,BufferQueue不会像在当前实现中那样得到显式的分辨率更改,即当分辨率更改时不会调用native_window_set_buffers_geometry。在这种情况下,我想了解SurfaceFlinger/HwComposer如何处理相同的问题?是否有任何明确的规则或期望由供应商处理?我找不到这个例子。
标签: android video android-4.4-kitkat stagefright surfaceflinger