Repository navigation
fix(mpv): 修复内嵌 mpv 在 surface 销毁/EOF 后 VO 重建导致的 SIGABRT - #90
Conversation
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Advanced Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
CI 红不是本分支代码问题:它基于当前 master,而 master 的 建议顺序:先合 #89 → 我把本 PR rebase 到新 master(CI 即绿,因为本分支只有 mpv 生命周期一处改动)→ 再合本 PR。另外运行时也依赖 #89:没有它 |
内嵌 mpv 退场或 EOF 时会先 detach Surface,而窗口型 VO(GLES2 设备默认的
mediacodec_embed)紧接着做 video-reconfig,mpv 随即在
vo_mediacodec_embed.c:40 断言失败,vo 线程 SIGABRT 掉整个进程:
F/libc: ../video/out/vo_mediacodec_embed.c:40 create_mediacodec_device_ref():
assertion "vo->opts->WinID != 0 && WinID != -1" failed
F/libc: Fatal signal 6 (SIGABRT) in tid (vo), pid com.miruplay.tv
mpv 日志证据(时间顺序):video EOF reached → detaching surface →
event: video-reconfig → abort。
修复:
- surfaceDestroyed / releasePlayerAfterBegin 在 detachSurface / destroy 之前先把
vo 切到 "null"(音频继续播),surfaceCreated 再按 voInUse 恢复真实 vo
- applyRuntimeOptions 只在 surface 已附着时重建 vo,避免无窗口时重建
- BaseMPVViewTest 覆盖 destroy 动作顺序与 vo 应用条件
注:真机复现/验证依赖 #89 的 libc++ 修复(否则 libmpv.so 根本加载不了)。
真机验证见 PR 描述。
fc7fb3c to
4ba5754
Compare
|
已按计划收尾:
diff 仍然只有 4 个文件(3 个 player-mpv-android + checklist 两行),随时可合。 |
问题
内嵌 mpv(
EXPERIMENTAL_MPV_EMBEDDED)退场或播到 EOF 时整个进程 SIGABRT,根因是 mpv 窗口型 VO 在 Android window 已失效时被重建:mediacodec_embed是 GLES2 设备(HK1)默认的 vo,它要求创建时 WinID 有效;而 App 在 release / surfaceDestroyed / 新播放接管旧会话时都会先detachSurface(),mpv 的 vo 线程紧跟着做一次video-reconfig,于是断言崩溃。容易命中的三条路径(都在真机复现过,均 100% 崩):
修复
surfaceDestroyed/releasePlayerAfterBegin:在detachSurface()/destroy()之前先把vo切到null(音频继续播,不销毁会话),surfaceCreated()再按voInUse恢复真实 vo。applyRuntimeOptions():只在 surface 已附着时才重建vo;surface 不在时仅记录voInUse,等重新 attach 后恢复。BaseMPVViewTest:更新 destroy 动作顺序断言(DISABLE_VIDEO_OUTPUT→DETACH),新增「无 surface 不应用 runtime vo」用例。真机验证(HK1 RBOX K8,debug 构建,实际按键操作 + 观察)
end-file,无 assert;HDMI 稳定vo="null"→ detach,无 assert其它验证:
VO: [mediacodec_embed] 1920x1080;./gradlew :player-mpv-android:testDebugUnitTest:9/9 通过;./gradlew test lint:BUILD SUCCESSFUL;player-mpv-android的 surface/vo 生命周期,未触及 Exo/IJK/DSP 路径;默认 Exo 播放与字幕渲染不受影响。已知遗留(不在本 PR 范围)
「新播放请求与旧 player screen 拆卸并发」这条路径在修复后不再崩溃,但偶发黑屏(新播放的 SurfaceView 未 attach,
MPVLib单例被旧视图的延迟 release 回收)。master 在同一条路径上是直接崩溃,所以这是升级不是回归;它属于 App 层MiruMpvSurfaceView跨屏复用/释放的生命周期问题,需要单独处理。已在 PR 描述与 checklist 里标注。