0
Fork 0
mirror of https://github.com/Silent1566/webhtv.git synced 2026-10-18 07:09:16 +00:00

fix(mpv): 补缓冲停滞看门狗并把内核/软硬解切换原因写进日志

MPV 卡缓冲此前没有任何兜底:15 秒启动看门狗在 MPV 上报 BUFFERING 的瞬间
就被 onPlaybackStateChanged 取消(state != IDLE 即取消),而停滞看门狗
(BufferingStallWatchdog) 被 !isExo() 门禁限制在 Exo 上。结果是 MPV 一旦卡在
BUFFERING 且位置与缓冲末端都不前进,只能无限转圈。

看门狗本身是引擎无关的(只消费 position/buffered/loading),且
MpvPlayer.timeOutSeekBuffering() 的注释已经假设它存在('let that watchdog own
the stall')——对 MPV 而言那个被引用的看门狗此前是空的。

- git mv player/exo/ExoBufferingStallWatchdog.java → player/BufferingStallWatchdog.java
  (类名同步,保留历史),补 MPV 维度注释:两个引擎的 rebuffer 阈值
  (Exo 15s、MPV 最大 8s)都必须低于看门狗的 20s/60s 上限;
- 放开三处 Exo 专属门禁:armBufferingStallWatchdog()、checkBufferingStall()、
  seek 重臂点与 STATE_BUFFERING 分支;
- 新增 stalledDurationMs(now),超时日志报告实测停滞时长而非只报配置上限;
- 新增 switch-cause 日志与 logSwitchCause 重载:kind 由实际变化推导
  (内核变了=kernel,仅软硬解变了=decode),并输出 cause/chosen/from/to/position。
  cause 取值:user-choice、history-kernel-before-play、
  history-kernel-retry-after-error、fallback-decode:<trigger>、
  fallback-kernel:<trigger>、kernel-unavailable、auto-no-hardware-decoder、
  hard-decode-switch-retry;trigger 由 errorCode 归类且保留数值。

未改动任何公开签名,因此三个 Activity 与四个既有 source-text 测试完全未动。

验证:定向 23/23 + 8/8 + 3/3;全量 5085 用例仅 7 个预存失败(基线同 7 个,
逐条一致);四变体编译通过;两次变异测试如期失败并还原;git diff --check 通过。
未做设备验证,待补项记录于 docs/MPV-BUFFERING-STALL-WATCHDOG-20261017.md。

Verification: 定向:BufferingStallWatchdogTest 23/23、PlayerManagerSwitchCauseSourceTest 8/8、PlayerManagerLifecycleSourceTest 3/3 全绿。全量 :app:testMobileArm64_v8aDebugUnitTest = 5085 tests / 7 failed / 3 skipped;同命令在 stash 后的基线 3eee5e8c9d 上为 5076 / 7 failed / 3 skipped,失败集合逐条一致(MpvFontConfigTest、MpvHlsCacheCoordinatorTest、ReaderPlaybackRoutingSourceTest×2、TmdbSourceOnlyInteractionTest、TmdbUIAdapterTest、WebThemeTokenSourceTest),零新增失败、用例 +9。四变体编译(Mobile/Leanback × arm64_v8a/armeabi_v7a)全部 BUILD SUCCESSFUL。变异测试两次如期失败并已还原:① 重新用 if (isExo()) 门禁 armBufferingStallWatchdog() → bufferingStateArmsTheStallWatchdogForEveryEngine FAILED;② 把 previousType/previousDecode 捕获移到 playerType=type 之后 → everyKernelSwitchFlowsThroughTheSingleCauseLogger FAILED。另记录一次未失败的无效变异(捕获提前,不破坏不变量)。首版曾因给 Activity 加 cause 参数破坏 4 个既有 source-text 测试,已改为内部推导原因并撤销全部 Activity 改动,4 项失败随之消失(非放宽断言)。git diff --check 通过。未做设备验证,待补项见 docs §7。另:过程中 git stash push -u/pop 因 core.autocrlf=true 把受保护的 .wh_diag/sub.json 改写成 CRLF,已按 guard 的 --no-filters 口径逐字节还原为原 LF(221287 字节),guard check 重新 PASS。

Task-Guard: MPV-BUFFERING-STALL-WATCHDOG-20261017
This commit is contained in:
Silent1566 2026-10-17 11:06:10 +08:00
commit c2a09e7647
8 changed files with 926 additions and 472 deletions