问题描述
Android 14+ 会先按 Display.Mode.supportedHdrTypes 筛选候选显示模式,但 DisplayModeManager.selectBestDisplayMode() 的比较基准仍固定为当前 display.mode,即使当前模式不支持用户请求的 HDR 类型。
当当前模式是高刷新 SDR、设备另有低刷新 HDR 模式时,HDR 候选会因为“刷新率降低”被过滤,最终继续使用当前非 HDR 模式,后续又根据该模式判定 HDR 不受支持。
典型场景
- 当前模式:4K 120 Hz,
supportedHdrTypes 不含 HDR10/HDR10+
- 可用候选:4K 60 Hz,支持 HDR10/HDR10+
- 串流设置:60 FPS、HDR10 或 HDR10+
- 默认不允许主动降低刷新率的帧同步策略
bestMode 初始为 120 Hz 当前模式;60 Hz HDR 候选满足 HDR 类型,但因 refreshRateReduced 被跳过。之后 HdrCapabilityHelper 检查当前模式并关闭 HDR。
影响范围
Android 14+ 且不同显示模式具有不同 HDR 类型的电视、盒子、手机或外接显示器。用户明确选择 HDR,设备也存在可用 HDR 模式,但客户端可能错误回退 SDR。
期望行为
只要启用了 HDR 类型筛选,模式选择的基准和候选都应来自支持所请求 HDR 类型的集合;刷新率和分辨率优化应在这个集合内部进行。
建议修复
acceptableHdrTypes 非空且存在匹配模式时,不要用不匹配 HDR 类型的当前模式作为 bestMode 初始值。
- 如果当前模式本身匹配,可以继续优先使用当前模式。
- 增加覆盖“120 Hz SDR 当前模式 + 60 Hz HDR 候选 + 60 FPS 串流”的模式选择测试。
来源
代码审查发现,首次引入于 #483。
问题描述
Android 14+ 会先按
Display.Mode.supportedHdrTypes筛选候选显示模式,但DisplayModeManager.selectBestDisplayMode()的比较基准仍固定为当前display.mode,即使当前模式不支持用户请求的 HDR 类型。当当前模式是高刷新 SDR、设备另有低刷新 HDR 模式时,HDR 候选会因为“刷新率降低”被过滤,最终继续使用当前非 HDR 模式,后续又根据该模式判定 HDR 不受支持。
典型场景
supportedHdrTypes不含 HDR10/HDR10+bestMode初始为 120 Hz 当前模式;60 Hz HDR 候选满足 HDR 类型,但因refreshRateReduced被跳过。之后HdrCapabilityHelper检查当前模式并关闭 HDR。影响范围
Android 14+ 且不同显示模式具有不同 HDR 类型的电视、盒子、手机或外接显示器。用户明确选择 HDR,设备也存在可用 HDR 模式,但客户端可能错误回退 SDR。
期望行为
只要启用了 HDR 类型筛选,模式选择的基准和候选都应来自支持所请求 HDR 类型的集合;刷新率和分辨率优化应在这个集合内部进行。
建议修复
acceptableHdrTypes非空且存在匹配模式时,不要用不匹配 HDR 类型的当前模式作为bestMode初始值。来源
代码审查发现,首次引入于 #483。