我在SO的Android
Kitkat
中遇到了这个generic question on Adaptive Playback。但是,我有一些特定的查询,如下所示:
我能够理解对codec
和相关框架的影响。但是,有一点我无法完全理解。
在自适应播放的情况下,编解码器在其输出端口上使用metadata
,基本上从根本上抽象并打包了底层缓冲区句柄(很可能是gralloc
句柄)。如果分辨率发生变化,则假定codec
直接更新gralloc
句柄属性,并将缓冲区发送回OMX
客户端,而无需更改端口设置。
我的第一个问题是:我的理解和假设正确吗?
如果是这样,Surfaceflinger
/ SurfaceTexture
如何知道传入的有效载荷为metadata
格式,以及如何从基础width
实现中检索height
和gralloc
?
您能否指出我相关的资源,以帮助我更好地理解这个问题?
提前谢谢了。
最佳答案
sendFormatChange => kWhatOutputFormatChange => MEDIA_SET_VIDEO_SIZE => ... =>本机窗口集_缓冲区大小
只是澄清一下,让我们使用QC示例,组件识别作物变化-在omx_vdec中查找OMX_IndexConfigCommonOutputCrop
,然后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