Skip to content

[Windows][MFT][Dolby Vision P5] 从 0ms 首帧即严重错误颜色 | Severe wrong colors from first frame #387

Description

@Monster-DP

中文说明

问题现象

Windows 上使用默认 MFT:d3d=11 解码/渲染 Dolby Vision Profile 5 视频时,0ms 第一帧开始就出现严重橙色/洋红/黑色失真,已经无法正常观看,并非轻微色差。seek 或恢复非零历史进度后仍然错误,并会进一步暴露 RPU/颜色附件丢失。正确结果应当是 Dolby Vision 到 SDR 色调映射后的正常颜色。

该问题可以在未修改源码的官方 mdk-examples/flutter/simple 示例中复现,因此可以排除应用 UI 或自定义播放封装。

关键证据

  • 官方 simple0ms 起播,第一帧日志为 player 1st video frame rendered @0.000000ms,实际画面已经严重橙色/黑色失真。
  • 同一时刻 MDK 正确识别 Dolby Vision Profile 5, BL RPU,实际解码器为 MFT;日志仍报告 BT2100 PQBT709tone map: 1dyhdr: 1,说明这些状态标志并不代表视觉输出正确。
  • 正式应用和最小探针从 828000 ms 恢复播放时同样立即出现严重错误颜色。
  • seek 后发生 MF_E_TRANSFORM_STREAM_CHANGE,帧颜色变成 UNSPECIFIED
  • 随后 tone mapdyhdr 均从 1 变成 0,并连续出现 per frame attachment not found
  • 附件分别包含官方示例 0ms 第一帧的严重橙色/黑色失真,以及 seek 后的严重洋红/灰色失真。

预期行为

0ms 第一帧、任意初始位置、恢复历史进度以及每次 seek 后,都应保持正确的 Dolby Vision Profile 5 到 SDR 映射,输出正常 BT.709 颜色。发生 MFT 流变化后,应保留或重新关联逐帧 RPU/颜色附件,而不是关闭 tone mapping 和 dynamic HDR。

完整环境、复现步骤、日志转换和解码器 A/B 见下方英文说明。附件包含脱敏完整日志、官方示例 0ms 错误颜色截图和 seek 后错误颜色截图。


English

Describe the bug

On Windows, Dolby Vision Profile 5 playback through the default MFT:d3d=11 decode/render path produces severely incorrect orange/magenta/black colors from the first frame at 0 ms. The video is already unwatchable before any seek; this is not a subtle color-accuracy difference. Seeking or restoring a non-zero position remains incorrect and additionally exposes loss of the RPU/color attachment. The same frames should have normal SDR colors through Dolby Vision-to-SDR tone mapping.

At 0 ms, the official sample logs player 1st video frame rendered @0.000000ms, recognizes Profile 5, and reports BT.2100 PQ to BT.709 with tone map: 1 and dyhdr: 1, but the actual image is already severely orange/black. Our application and minimal probe at 828000 ms show the same class of severe corruption. After seeking/position restore, MFT reports MF_E_TRANSFORM_STREAM_CHANGE; the first post-seek P010 frames lose their color metadata and per-frame Dolby Vision attachment, and MDK changes tone map/dyhdr from 1 to 0.

This reproduces in the unmodified official mdk-examples/flutter/simple application, so it is not caused by our application UI or playback abstraction.

Versions / environment

  • fvp 0.37.3
  • video_player 2.11.1
  • MDK 0.37.0 (git f293c14)
  • mdk-examples commit 128cdcd014d908c0b77ee1d45a84354a99527f0b
  • fvp master checked at 114a520ebff302128f526ca8c85e983c6af7a0e5
  • Flutter 3.41.5, Dart 3.11.3
  • Windows 11 x64 build 26200
  • Intel Iris Xe Graphics, driver 32.0.101.7085
  • Microsoft HEVC Video Extensions 2.5.25.0
  • Windows profile build; actual video decoder reported by MDK: MFT

Media properties

  • MP4, 3840x1608, 25 fps, HEVC Main 10 / dvhe
  • Dolby Vision 1.0 Profile 5 Level 6, BL RPU, full range
  • Approximately 11.4 Mbps video bitrate
  • The source cannot be publicly redistributed. Additional traces or a legally permissible minimal sample can be provided if needed.

Steps to reproduce

  1. Check out mdk-examples commit 128cdcd014d908c0b77ee1d45a84354a99527f0b.
  2. In flutter/simple, run flutter pub get and flutter build windows --profile.
  3. Start the unmodified sample with a file URI as the last argument:
simple.exe "file:///C:/media/dv5_sample.mp4"
  1. Let playback initialize, then either seek to approximately 828271 ms or reproduce through an application that restores an initial position near 828000 ms (00:13:48.271) and pause after the post-seek frame appears.
  2. Observe the severely magenta/gray frame and the following log transition.

A file URI is used so the unmodified example enters its VideoPlayerController.network path. Passing a raw local path on first startup hits an unrelated example initialization issue (_controller.dispose() before _controller is initialized).

Relevant log transition

At 0 ms, the log reports Dolby Vision processing and SDR tone mapping as active, but the visual output is already severely wrong:

Dolby Vision 1.0 Profile 5 Level 6, BL RPU
opening video decoder: MFT
frame color: BT2100 PQ RGB Full
output color: BT709 UNSPECIFIED RGB Full
tone map: 1. dyhdr: 1

Immediately after seek / MFT stream change:

player.seek(828271, 1026, ...)
MF_E_TRANSFORM_STREAM_CHANGE. status: 0x100
frame color: UNSPECIFIED UNSPECIFIED UNSPECIFIED Full
tone map: 0. dyhdr: 0
per frame attachment not found

The full sanitized log is attached below.

Decoder A/B

  • Default MFT:d3d=11: hardware decoding starts quickly and identifies DV Profile 5, but the first frame at 0 ms already has severely wrong colors; positioning/seek can additionally lose its RPU/color attachment.
  • -c:v FFmpeg: identifies the same DV Profile 5 stream, but on this machine it did not display a first frame within approximately 50 seconds, used high CPU, and repeatedly cycled buffering from 0% to 100%; it is not a practical fallback for this 4K stream.

Expected behavior

From the first frame at 0 ms, when opening at any initial position, restoring a saved position, and after every seek, the Dolby Vision Profile 5 video should render with normal, correctly tone-mapped SDR colors. After MF_E_TRANSFORM_STREAM_CHANGE, MDK should preserve or re-associate the per-frame Dolby Vision RPU/color attachment, keep tone map: 1 and dyhdr: 1, and continue producing a correctly tone-mapped BT.709 image.

Why is the DV Profile 5 to SDR output visually incorrect even while MDK reports tone map: 1 and dyhdr: 1 at 0 ms? Is there an option that fixes the initial color conversion and restores the RPU attachment after MFT stream changes, or does this require an MDK/MFT-path fix?

Attachments

mdk-simple-dv5-mft-sanitized.txt
Image

Image

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