Skip to content

display-info.dll:mpv 退出后显示器 HDR 模式偶发未关闭(script-message 与插件卸载存在竞态条件) #332

Description

@yosh-wang

非常感谢作者维护的MPV整合包,非常好用。反馈一个问题:

问题描述

在部分设备上使用 hdr-mode.lua 脚本配合 display-info.dll 插件时,mpv 退出后显示器的 HDR 模式偶尔未能自动关闭。此问题间歇性发生(约 1%-3% 的退出操作会出现),导致显示器保持在 HDR 状态,桌面颜色显示异常。

复现条件

  • 设备:部分 Windows 设备(尤其是系统响应较快的机型)
  • 系统:Windows 10/11
  • 插件:display-info.dll
  • 脚本模式:hdr_mode=switch
  • 播放内容:HDR 视频
  • 退出方式:按 q 或点击关闭按钮

日志分析

mpv.log
mpvHistory.log

以一次出现问题的退出流程为例:

时间 事件
13.101s 用户按 q 退出,mpv 开始执行退出流程
13.111s 脚本发送 toggle-hdr-display off 命令
13.111s 同一毫秒内,mpv 完全退出
13.111s display_info 插件被销毁

正常退出日志(HDR 正常关闭):

[2.366][i][hdr_mode] Restoring display to SDR on shutdown
[2.366][d][cplayer] Run command: script-message, flags=64, args=[args="toggle-hdr-display", args="off"]
[2.593][v][cplayer] Set property: user-data/display-info/hdr-status="off" -> 1
[2.629][i][cplayer] [display-info] HDR disabled

异常退出日志(HDR 未能关闭):

[13.111][i][hdr_mode] Restoring display to SDR on shutdown
[13.111][d][cplayer] Run command: script-message, flags=64, args=[args="toggle-hdr-display", args="off"]
[13.111][i][cplayer] Exiting... (Quit)
[13.111][d][display_info] Destroying client handle...

注意:异常日志中缺失以下关键行:

  • Set property: user-data/display-info/hdr-status="off"
  • [display-info] HDR disabled

原因分析

目前脚本在 on_end 中发送关闭命令后,mpv 会立即继续执行退出流程

local function on_end(event)
    -- ...
    if event["reason"] == "quit" and o.hdr_mode == "switch" then
        if hdr_active then
            switch_display_mode(false)  -- 发送关闭命令
        end
    end
    -- 继续执行退出...
end

script-message异步的,发送后不等待接收方处理完成。display-info.dll 作为 C 插件,需要时间调用 Windows API 切换 HDR。当系统负载较低时,mpv 退出速度极快,display-info.dll 还没来得及处理命令就被销毁了。时序如下:

  1. hdr-mode.lua 通过 script-message 发送 toggle-hdr-display off 命令
  2. mpv 立即继续执行退出流程,销毁 display-info.dll
  3. display-info.dll 未能收到或未能处理该命令

这是一个典型的竞态条件(Race Condition)

  • hdr-mode.lua 脚本正确发送了关闭命令 ✅
  • script-message异步的,发送后不等待接收方处理完成
  • display-info.dll 作为 C 插件,需要时间调用 Windows API 切换 HDR
  • mpv 退出速度太快,插件来不及完成工作就被卸载

环境信息

  • 操作系统:Windows 11 24H2
  • mpv 版本:v0.41.0-856-g33111f321
  • display-info.dll:最新版(dyphire/mpv-display-plugin)
  • hdr-mode.lua:最新版(dyphire/mpv-scripts)

相关代码位置

行号 代码 说明
23-28 local o = {} 配置选项定义处,新增 hdr_exit_wait
240-252 local function on_end(event) 退出处理函数
246 switch_display_mode(false) 发送 HDR 关闭命令
243 mp.unobserve_property(switch_hdr) 取消属性观察

补充说明

  • 为什么问题很少发生? 系统负载较高时,mpv 退出流程稍慢,display-info 有足够时间处理命令;系统空闲时,mpv 退出速度极快,display-info 来不及响应。
  • script-message 是异步的,调用后不等待接收方完成处理

以上分析猜测是AI给的.可能分析的很lower 望酌情谅解

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions