我在Android
Kitkat
中遇到了这个generic question on Adaptive Playback。但是,我有一些具体的问题如下:
我能够理解对codec
及相关框架的影响。但是,有一点我完全无法理解。
在自适应回放的情况下,编解码器在其输出端口上使用metadata
,其基本上抽象并打包底层缓冲区句柄(很可能是gralloc
句柄)。如果分辨率发生变化,我假设codec
直接更新gralloc
句柄属性,并将缓冲区发送回OMX
客户端而不更改端口设置。
我的第一个问题是:我的理解和假设是否正确?
如果是,Surfaceflinger
/ SurfaceTexture
如何知道传入的有效内容采用metadata
格式,以及如何检索width
和height
来自基础gralloc
实施?
请您指点相关来源,以帮助我更好地理解这个问题?
非常感谢提前。
答案 0 :(得分:1)
sendFormatChange => kWhatOutputFormatChange => MEDIA_SET_VIDEO_SIZE => ... => native_window_set_buffers_dimensions
只是澄清一下,让我们使用QC示例,组件识别裁剪更改 - 在此处查找OMX_IndexConfigCommonOutputCrop
omx_vdec,然后ACodec清除mSentFormat
这使得ACodec调用sendFormatChange
将kWhatOutputFormatChange
事件发送到NuPlayer,后者将MEDIA_SET_VIDEO_SIZE
发送给媒体播放器。在第二侧,你会得到native_window_set_buffers_geometry
强制Surface::setBuffersDimensions
。
使用OMXCodec OMX_IndexConfigCommonOutputCrop
收到集mOutputPortSettingsHaveChanged
时,最近的OMXCodec::read
调用将返回INFO_FORMAT_CHANGED
这在AwesomePlayer中会调用notifyVideoSize_l
这个一个发送给听众MEDIA_SET_VIDEO_SIZE