Android Kitkat 4.4.2:自适应播放对SurfaceFlinger的影响

时间:2014-02-02 05:59:20

标签: android video android-4.4-kitkat stagefright surfaceflinger

我在Android Kitkat中遇到了这个generic question on Adaptive Playback。但是,我有一些具体的问题如下:

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

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

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

如果是,Surfaceflinger / SurfaceTexture如何知道传入的有效内容采用metadata格式,以及如何检索widthheight来自基础gralloc实施?

请您指点相关来源,以帮助我更好地理解这个问题?

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

sendFormatChange => kWhatOutputFormatChange => MEDIA_SET_VIDEO_SIZE => ... => native_window_set_buffers_dimensions

只是澄清一下,让我们使用QC示例,组件识别裁剪更改 - 在此处查找OMX_IndexConfigCommonOutputCrop omx_vdec,然后ACodec清除mSentFormat这使得ACodec调用sendFormatChangekWhatOutputFormatChange事件发送到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