Skip to content

POSIX 连接先确认开流,截图拒绝未发布首帧 - #8

Open
HarcoChen wants to merge 1 commit into
ModAVD:mainfrom
HarcoChen:codex/frame-readiness
Open

HarcoChen wants to merge 1 commit into
ModAVD:mainfrom
HarcoChen:codex/frame-readiness

Conversation

@HarcoChen

Copy link
Copy Markdown

POSIX 共享内存名称会在模拟器退出后残留。实机上,下一次冷启动尚未开启共享截图,modavd_open() 就直接接受上次的末帧并跳过开流,capture() 持续返回成功的旧画面。另外,已分配宽高但尚未发布首帧的映射也会被当成有效截图。

本次调整包含两部分。

  • POSIX 默认连接先通过控制台执行 screenrecord webrtc start,成功后再打开当前名称对应的映射。控制台失败返回错误,避免旧对象掩盖连接失败。重复开流可复用当前流。
  • 公共截图入口在发布时间为零时返回 MODAVD_E_NOT_READY,同时保留有效静止帧、合法黑色画面和帧号回绕到零的处理。

接口注释明确了 POSIX 默认连接需要可用的控制台和鉴权。MODAVD_OPEN_NO_START 由调用者确保映射属于当前实例且开流有效。成功打开映射后,首帧尚未到达时,调用者可重试 capture()。已经打开的句柄在模拟器再次重启后需要重新连接。

本地验证使用 Apple M5、macOS 26.6.2、官方 Emulator 37.2.13、API 35 Google APIs ARM64,1920×1080、3 GiB / 2 核,独立测试根,控制台 23000 / ADB server 23050,仅操作桌面和通知栏。GuestAngle,Vulkan 下的图形回读崩溃与 google/gfxstream#190 对应,本次实机使用额外参数 -feature -VulkanNativeSwapchain。

  • Release arm64 编译通过,-Wall -Wextra -Werror,CTest 2/2 通过。新增 POSIX 测试使用真实命名共享内存和受控控制台响应,覆盖旧对象替换、连接失败、NO_START、两个读者及关闭另一个读者后的读取。
  • 首帧回归测试覆盖三种格式、尺寸探测、输出缓冲区保护、合法静止黑色帧和计数器回绕。新测试在 v0.1.1 上失败。
  • 变异检查分别删除时间戳判断、跳过 POSIX 开流确认,对应的 test_core / test_open_posix 均失败。恢复后重编,2/2 通过。
  • 实机对照在同一次冷启动内依次加载 v0.1.1 和修复版。原版一直返回第 232 帧,通知栏变化时哈希和时间戳均不变,与 ADB 的平均 RGB 通道差为 30.676。修复版自动开流,两读者均读到新画面,静止时也能正常重复读取。关闭一个连接后另一个继续成功,与 ADB 的平均 RGB 通道差为 0.2725。
  • 另测四个线程同时连接、各截图 100 次,400 次均成功。四个连接关闭后,原有连接仍能成功截图。
  • scripts/test_repo_checks.py、隐私扫描和提交作者检查通过。

Windows 和 Linux 的实机行为、长时间运行及其他 Emulator 版本尚待验证。控制台确认仅在连接时进行,NO_START 和已打开句柄的后续存活判断仍由调用者负责。重复开流的实机验证范围为上述官方模拟器版本。

使用 Codex 辅助实现,以上本地验证已实际执行。新增测试为本项目编写,按 LGPL-3.0-or-later 授权。

Refs #1

复现记录见 #1 (comment)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant