我在SO的Android Kitkat中遇到了这个generic question on Adaptive Playback。但是,我有一些特定的查询,如下所示:

我能够理解对codec和相关框架的影响。但是,有一点我无法完全理解。

在自适应播放的情况下,编解码器在其输出端口上使用metadata,基本上从根本上抽象并打包了底层缓冲区句柄(很可能是gralloc句柄)。如果分辨率发生变化,则假定codec直接更新gralloc句柄属性,并将缓冲区发送回OMX客户端,而无需更改端口设置。

我的第一个问题是:我的理解和假设正确吗?

如果是这样,Surfaceflinger / SurfaceTexture如何知道传入的有效载荷为metadata格式,以及如何从基础width实现中检索heightgralloc

您能否指出我相关的资源,以帮助我更好地理解这个问题?

提前谢谢了。

最佳答案

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

10-08 06:14