Closed Bug 2030296 Opened 3 months ago Closed 2 months ago

[Win10] Netflix videos not rendered on HDR enabled display

Categories

(Core :: Audio/Video: Playback, defect, P1)

Desktop
Windows 10
defect

Tracking

()

VERIFIED FIXED
152 Branch
Tracking Status
firefox-esr140 --- unaffected
firefox149 --- unaffected
firefox150 --- unaffected
firefox151 --- verified
firefox152 --- verified

People

(Reporter: csasca, Assigned: alwu)

References

(Blocks 2 open bugs, Regression)

Details

(Keywords: regression)

Attachments

(11 files, 1 obsolete file)

33.50 KB, text/plain
Details
328.23 KB, image/png
Details
51.89 KB, image/png
Details
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
183.48 KB, application/octet-stream
Details
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
48 bytes, text/x-phabricator-request
Details | Review
Attached file about support.txt

Found in

  • Firefox 151.0a1 (2026-04-08)

Affected versions

  • Firefox 151.0a1 (2026-04-08)

Unaffected versions

  • Firefox 150.0b4

Tested platforms

  • Affected platforms: Windows 10

Preconditions

  • HDR capable display and HDR enabled in Windows settings -> Nightly opened on the HDR monitor.

Steps to reproduce

  1. Load and play a HDR capable movie/series on Netflix -> Example

Expected result

  • The video uses HDR for video rendering and no issues occur

Actual result

  • The video gitches and is unviewable

Additional Notes

  • The issue can be seen in the following attachment. Filmed the difference from SDR display (integrated display of laptop) to HDR (the external display).
  • This is repducible by opening the video directly on the HDR display or by moving the window from an SDR one to HDR.
  • The videos work correctly on the SDR display (video directly opened on SDR display or moved from HDR to SDR it will revert and display correctly).
  • Youtube videos are correctly rendered with HDR but suffer from performance issues from Bug 2029122.
  • The about support infos are attached here as well.

Looked for a regression and found that it was introduced between 31-03 and 01-04. Here's the pushlog. The cause is most probably Bug 2012850.

Severity: -- → S2
Keywords: regression
Flags: needinfo?(ahale)

Speculating that a DRM video code path is not passing the correct transfer function, causing this regression...

I'm not sure I consider this a blocker.

Catalin, I'm curious if you open Firefox on the HDR display, does it look correct? I think you're saying it does not, but I wasn't sure.

Flags: needinfo?(ahale) → needinfo?(csasca)

From the test device about:support:
GPU #1
Active: Yes
Description: Intel(R) UHD Graphics 620
Vendor ID: 0x8086
Device ID: 0x5917
Driver Version: 31.0.101.2140
Driver Date: 11-5-2025
Drivers: igdumdim64 igd10iumd64 igd10iumd64 igd12umd64 igdumdim32 igd10iumd32 igd10iumd32 igd12umd32
Subsys ID: 397317aa

Display0: 1920x1080@60Hz scales:1.000000|1.000000 SDR
Display1: 3840x2160@60Hz scales:1.000000|1.500000 HDR

Can you press CTRL+SHIFT+ALT+D on Netflix to see what key system is using? If it's PlayReady, then please set the pref media.eme.playready.enabled=false and restart browser to see if same issue also happens on Widevine. Thanks!

(In reply to Ashley Hale [:ahale] from comment #2)

Speculating that a DRM video code path is not passing the correct transfer function, causing this regression...

That’s likely the case. I’ll prepare a patch to address it. However, my setup (not HDR-capable) can’t reproduce the issue, it also doesn’t provide HDR content. so I can’t verify the fix. I will ask Catalin to test my own build later.

Assignee: nobody → alwu

We should address Bug 2028843 which will make it possible to test without an HDR display attached.

See Also: → 2028843

Hey Jim, if I open the video directly on the HDR display it will not render (mentioned this scenario on the second point from Additional notes). On the attached video I just moved the video from the SDR one to HDR to see that even in that scenario it will still not render. But as soon as I move the video from HDR to the internal display it will be rendered as expected.

Flags: needinfo?(csasca)

Could you help me confirm the question in the comment 5? In addition, could you try this build to see if it helps? Thanks!

Flags: needinfo?(csasca)

Pass the correct transfer function when setting up WMF Media Engine media
types so that HDR video color is displayed correctly.

Attached image netflix data.PNG

Sure thing, so I've looked on Firefox Nightly 151.0a1 (2026-04-14) and the same behavior is there, I'll attach a photo with the data from Netflix. Seems it is not using PlayReady but SW decode instead and I've gone anyway and switched media.eme.playready.enabled to false to be 100% sure and it still happens nonetheless.

Also tried the build you linked in Comment 5 and it is till affected by the issue, same infos are provided by CTRL+SHIFT+ALT+D.

Let me know how can I help further!

Flags: needinfo?(csasca)

Will this issue happen on PlayReady? Or all HDR videos you see are Widevine? Thanks!

Flags: needinfo?(csasca)

Seems to be Widevine. I don't think this system supports PlayReady (unless there is some way to force it?). Unfortunately the system that I have and is 100% capable by default and use PlayReady has only Windows 11 and there we haven't encountered this exact issue.

Flags: needinfo?(csasca)

I can test here as well, win11+Intel.

Ok, then let me file another new bug for my patch, which can deal with the wrong color for PlayReady, and keep investigate this issue. Could you help capture a media profile by following this instruction? In addition, can you reproduce this issue on Windows 11? Or it's Windows 10 only? Thanks!

Flags: needinfo?(csasca)

Comment on attachment 9569987 [details]
Bug 2030296 - Fix MF_MT_TRANSFER_FUNCTION mapping to correctly handle PQ and HLG HDR content

Revision D294303 was moved to bug 2032534. Setting attachment 9569987 [details] to obsolete.

Attachment #9569987 - Attachment is obsolete: true
See Also: → 2032534

Build -
Name Firefox
Version 151.0a1
Build ID 20260416093720

Netflix debug info on my laptop -

Version: 6.0056.553.911
Esn: NFCDFF-02-MY27V7Q4GXF86EN504GW1P2MKWXQTJ
PBCID: 6.HiZw6yJg2UrRCdUi8_Mlrf4GL3tdWGvPe2pGjv7Ol4s
UserAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:151.0) Gecko/20100101 Firefox/151.0

MovieId: 81702189
PackageId: 2339037
Xid: 177636218746350820 (177636218746350820)
Position: 77.536
Duration: 3050.172
PlayerDuration: 3050.172
Volume: 100%
Segment: 81702189:main
Segment Position: 77.536

Player state: Normal
Buffering state: Normal
Rendering state: Playing

Playing bitrate (a/v): 128 / 1034 (1920x1080)
Playing/Buffering vmaf: 94/94
Buffering bitrate (a/v): 128 / 1034
Buffer size in Bytes (a/v): 0 / 0
Buffer size in Bytes: 0
Buffer size in Seconds (a/v): 230.705 / 232.356
Downloadables (a/v): 1481082615 / 1537195826
Current CDN (a/v/t): c176.tpa001.ix.nflxvideo.net, Id: 81966 / c167.tpa001.ix.nflxvideo.net, Id: 82008 / ?

Audio Track: en, Id: A:2:1;2;en;1;0;, Channels: 2.0, Codec: audio/mp4;codecs=mp4a.40.5 (he-aac)
Audio Tags: SpeakerSpatialAudio
Video Track: Codec: video/mp4;codecs=av01.0.04M.08 (av1, prk)
Video Tags: EVEAV1,FGS,MCCLEAREN_AV1,identPOI
Timed Text Track: none

Framerate: 23.976
Current Dropped Frames:
Total Frames: 233
Total Dropped Frames: 0
Total Corrupted Frames: undefined
Main Thread stall/sec: DISABLED
KeySystem: com.widevine.alpha.SW_SECURE_DECODE
KeyStatus: AAAAAAlQF9gAAAAAAAAAAA==,AAAAAAlQF9sAAAAAAAAAAA==, 540,1080, usable,usable
VideoDiag: readyState=4,currentTime=77.661145,pbRate=1,videoBuffered=43.835,videoRanges=64.898166-108.733625,audioBuffered=47.232,audioRanges=64.896-112.128,duration=3050.1721
HDR support: false (media-capabilities)

Throughput: 73501 kbps

https://share.firefox.dev/4cx47ho

media capabilities logging

Chrome netflix debug -
Version: 6.0056.553.911
Esn: NFCDCH-02-MXE02RUUX3A9M00NYTJ80N3U3GPFRE
PBCID: 6.6xkutOJC0doIk6wshLYPkmcT_NvFPXy3iCd9q0I80sM
UserAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36

MovieId: 81702189
PackageId: 2339037
Xid: 177636453069371100 (177636453069371100)
Position: 284.522
Duration: 3050.172
PlayerDuration: 3050.172
Volume: 100%
Segment: 81702189:main
Segment Position: 284.522

Player state: Normal
Buffering state: Normal
Rendering state: Paused

Playing bitrate (a/v): 192 / 11161 (3840x2160)
Playing/Buffering vmaf: 101/101
Buffering bitrate (a/v): 192 / 17530
Buffer size in Bytes (a/v): 0 / 0
Buffer size in Bytes: 0
Buffer size in Seconds (a/v): 133.014 / 103.031
Downloadables (a/v): 1530894088 / 1713020645
Current CDN (a/v/t): c159.tpa001.ix.nflxvideo.net, Id: 82009 / c160.tpa001.ix.nflxvideo.net, Id: 81967 / ?

Audio Track: en, Id: A:2:1;2;en;1;0;, Channels: 2.0, Codec: audio/mp4;codecs=mp4a.40.42 (xhe-aac)
Audio Tags: SpeakerSpatialAudio
Video Track: Codec: video/mp4;codecs=hev1.1.6.L93.B0 (hevc, hdr, prk)
Video Tags: CE4_HDR10_DO_v1,MCCLEAREN_HDR10,NOP,identPOI
Timed Text Track: none

Framerate: 23.976
Current Dropped Frames:
Total Frames: 480
Total Dropped Frames: 0
Total Corrupted Frames: 0
Main Thread stall/sec: DISABLED
KeySystem: com.microsoft.playready.recommendation.3000
KeyStatus: AAAAAAlQF+oAAAAAAAAAAA==,AAAAAAlQF+sAAAAAAAAAAA==,AAAAAAlQF+wAAAAAAAAAAA==, 540,1080,2160, usable,usable,usable
VideoDiag: readyState=4,currentTime=284.521555,pbRate=1,videoBuffered=50.717,videoRanges=268.601666-319.318999,audioBuffered=50.731,audioRanges=268.586666-319.317333,duration=3050.1721
HDR support: true (media-capabilities)Version: 6.0056.553.911
Esn: NFCDCH-02-MXE02RUUX3A9M00NYTJ80N3U3GPFRE
PBCID: 6.6xkutOJC0doIk6wshLYPkmcT_NvFPXy3iCd9q0I80sM
UserAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36

MovieId: 81702189
PackageId: 2339037
Xid: 177636453069371100 (177636453069371100)
Position: 284.522
Duration: 3050.172
PlayerDuration: 3050.172
Volume: 100%
Segment: 81702189:main
Segment Position: 284.522

Player state: Normal
Buffering state: Normal
Rendering state: Paused

Playing bitrate (a/v): 192 / 11161 (3840x2160)
Playing/Buffering vmaf: 101/101
Buffering bitrate (a/v): 192 / 17530
Buffer size in Bytes (a/v): 0 / 0
Buffer size in Bytes: 0
Buffer size in Seconds (a/v): 133.014 / 103.031
Downloadables (a/v): 1530894088 / 1713020645
Current CDN (a/v/t): c159.tpa001.ix.nflxvideo.net, Id: 82009 / c160.tpa001.ix.nflxvideo.net, Id: 81967 / ?

Audio Track: en, Id: A:2:1;2;en;1;0;, Channels: 2.0, Codec: audio/mp4;codecs=mp4a.40.42 (xhe-aac)
Audio Tags: SpeakerSpatialAudio
Video Track: Codec: video/mp4;codecs=hev1.1.6.L93.B0 (hevc, hdr, prk)
Video Tags: CE4_HDR10_DO_v1,MCCLEAREN_HDR10,NOP,identPOI
Timed Text Track: none

Framerate: 23.976
Current Dropped Frames:
Total Frames: 480
Total Dropped Frames: 0
Total Corrupted Frames: 0
Main Thread stall/sec: DISABLED
KeySystem: com.microsoft.playready.recommendation.3000
KeyStatus: AAAAAAlQF+oAAAAAAAAAAA==,AAAAAAlQF+sAAAAAAAAAAA==,AAAAAAlQF+wAAAAAAAAAAA==, 540,1080,2160, usable,usable,usable
VideoDiag: readyState=4,currentTime=284.521555,pbRate=1,videoBuffered=50.717,videoRanges=268.601666-319.318999,audioBuffered=50.731,audioRanges=268.586666-319.317333,duration=3050.1721
HDR support: true (media-capabilities)

See Also: → 2032579

The comment 17 to comment 21 are all related with another issue, I've filed bug 2030296 for that.

Depends on: 2032615

The issue might be caused by not setting the transfer function for MP4. I’ve filed bug 2032615 to update mp4parser once the upstream PR is accepted. After that, I’ll apply a follow-up patch to wire everything together.

Priority: -- → P1

When parsing fMP4 video tracks, the colr box carrying CICP colour primaries,
transfer characteristics, and matrix coefficients was never read. This caused
HDR10 content to fall back to BT.709 in downstream decoders, rendering
near-black on HDR displays.

Populate the colour space fields from the NCLX colr box data when present.

Regressed by: 2012850

Set release status flags based on info from the regressing bug 2012850

Here's a captured media profile from my win 10 system, hope it helps.

Flags: needinfo?(csasca)

Looked at the profile briefly, seeing a lot of this line: PlatformDecoderModule — [Debug] PlatformDecoderModule: MFTDecoder::Create, created decoder, input=MFVideoFormat_NV12, output=MFVideoFormat_ARGB32

Is this video not HDR? it seems like it should be picking MFVideoFormat_P010 if it is HDR...

Attachment #9570900 - Attachment description: Bug 2030296 - Read NCLX colr box in MP4VideoInfo::Update(). → Bug 2030296 - Part 2: Read NCLX colr box in MP4VideoInfo::Update().
Status: NEW → RESOLVED
Closed: 2 months ago
Resolution: --- → FIXED
Target Milestone: --- → 152 Branch
Attachment #9572165 - Flags: approval-mozilla-beta?

firefox-beta Uplift Approval Request

  • User impact if declined/Reason for urgency: HDR Netflix video corruption
  • Code covered by automated testing?: yes
  • Fix verified in Nightly?: no
  • Needs manual QE testing?: yes
  • Steps to reproduce for manual QE testing: See comment 0
  • Risk associated with taking this patch: low
  • Explanation of risk level: It’s about supporting parsing HDR-related information for MP4, which we already support for WebM. So it doesn’t introduce a new feature or change existing behavior.
  • String changes made/needed?: No
  • Is Android affected?: unknown
Attachment #9572166 - Flags: approval-mozilla-beta?
Flags: qe-verify+

When parsing fMP4 video tracks, the colr box carrying CICP colour primaries,
transfer characteristics, and matrix coefficients was never read. This caused
HDR10 content to fall back to BT.709 in downstream decoders, rendering
near-black on HDR displays.

Populate the colour space fields from the NCLX colr box data when present.

Original Revision: https://phabricator.services.mozilla.com/D294849

Attachment #9572165 - Flags: approval-mozilla-beta? → approval-mozilla-beta+
Attachment #9572166 - Flags: approval-mozilla-beta? → approval-mozilla-beta+
QA Whiteboard: [QA-5085][S2][qa-found-in-c151] → [QA-5085][S2][qa-found-in-c151][uplift] [qa-ver-needed-c152/b151]
QA Contact: csasca

Tried verifying the fix on Firefox 152.0a1 (2026-04-22) - Windows 10, on the same system the issue was reported and unfortunately this is still happening. Here's a new video with the behavior.

Flags: needinfo?(alwu)

Could you please capture another media profile? In addition, in your video, the video was recovered after resizing the window? If so, could you capture two cases, one for broken, one for restoring after resizing? Thanks!

Flags: needinfo?(alwu) → needinfo?(csasca)

Here's the capture.

Flags: needinfo?(csasca)
Attached file 20260423104226.all.log

And here's the log along with another media capture.

10-bit SDR video (e.g. BT.2020 wide color gamut with a standard gamma transfer
function) decodes to P010 format. Previously, mContentIsHDR was set based solely
on pixel format, so any P010 content was unconditionally treated as HDR.

On HDR monitors (mUseHDR = true), mContentIsHDR drives GetSwapChainFormat() to
select an HDR swap chain format (e.g. DXGI_FORMAT_R10G10B10A2_UNORM) and
GetOutputDXGIColorSpace() to configure the video processor for HDR10 output.
When the source content is actually SDR, GetSourceDXGIColorSpace() correctly
identifies the input as G22 (SDR BT.2020) via the transfer function, but the
output is still configured for HDR10 due to mContentIsHDR being true. This
mismatch between the SDR input color space and the HDR output configuration
causes incorrect video rendering. The issue does not occur on SDR monitors
because mUseHDR is false there, so the HDR swap chain paths are never taken.

Fix by also checking the transfer function: only PQ, HLG, and LINEAR transfer
functions indicate true HDR content. For 10-bit SDR content this means the swap
chain is created in SDR format (BGRA8), which correctly avoids the HDR processing
path. Note: this means 10-bit SDR wide color gamut content is rendered at 8-bit
output quality rather than 10-bit; properly preserving 10-bit for SDR WCG would
require a distinct swap chain path and is left for future work.

For Widevine L3 (software CDM), the CDM outputs raw CPU YUV planes and
ChromiumCDMParent::CreateVideoFrame assembles them into a VideoData frame.
mYUVColorSpace was set via DefaultColorSpace(), which returns BT.601 (<720p)
or BT.709 (>=720p) based solely on frame height and never returns BT.2020.

For BT.2020 content this wrong value propagates through YCbCrDescriptor to
TextureHost::PushDisplayItems, which passes it directly to WebRender's YUV
shader as the color matrix, causing the wrong matrix to be used for YUV-to-RGB
conversion. This could cause incorrect colors or visible corruption.

A patch has been attached on this bug, which was already closed. Filing a separate bug will ensure better tracking. If this was not by mistake and further action is needed, please alert the appropriate party. (Or: if the patch doesn't change behavior -- e.g. landing a test case, or fixing a typo -- then feel free to disregard this message)

Could you help verify the fix again? It should be included in Nightly tomorrow, thanks!

Flags: needinfo?(csasca)

Verified that Netflix now works on Windows 10 and Firefox 152.0a1 (2026-04-26). Waiting for it to be uplifted on beta.

Flags: needinfo?(csasca)

:alwu, can you add beta uplift requests?
It's tricky to track since more than one stack was landed on the same bug, e.g. Comment 42

Flags: needinfo?(alwu)

firefox-beta Uplift Approval Request

  • User impact if declined/Reason for urgency: Netflix playback corrupted
  • Code covered by automated testing?: no
  • Fix verified in Nightly?: yes
  • Needs manual QE testing?: no
  • Steps to reproduce for manual QE testing:
  • Risk associated with taking this patch: low
  • Explanation of risk level: Small changes to use correct color format to render the video frames, it doesn't introduce new features or behavior changes.
  • String changes made/needed?: No.
  • Is Android affected?: no
Attachment #9574236 - Flags: approval-mozilla-beta?

10-bit SDR video (e.g. BT.2020 wide color gamut with a standard gamma transfer
function) decodes to P010 format. Previously, mContentIsHDR was set based solely
on pixel format, so any P010 content was unconditionally treated as HDR.

On HDR monitors (mUseHDR = true), mContentIsHDR drives GetSwapChainFormat() to
select an HDR swap chain format (e.g. DXGI_FORMAT_R10G10B10A2_UNORM) and
GetOutputDXGIColorSpace() to configure the video processor for HDR10 output.
When the source content is actually SDR, GetSourceDXGIColorSpace() correctly
identifies the input as G22 (SDR BT.2020) via the transfer function, but the
output is still configured for HDR10 due to mContentIsHDR being true. This
mismatch between the SDR input color space and the HDR output configuration
causes incorrect video rendering. The issue does not occur on SDR monitors
because mUseHDR is false there, so the HDR swap chain paths are never taken.

Fix by also checking the transfer function: only PQ, HLG, and LINEAR transfer
functions indicate true HDR content. For 10-bit SDR content this means the swap
chain is created in SDR format (BGRA8), which correctly avoids the HDR processing
path. Note: this means 10-bit SDR wide color gamut content is rendered at 8-bit
output quality rather than 10-bit; properly preserving 10-bit for SDR WCG would
require a distinct swap chain path and is left for future work.

Original Revision: https://phabricator.services.mozilla.com/D296170

Just submitted new uplift request, please uplift both part3 and part4. Thanks!

Flags: needinfo?(alwu)
Attachment #9574236 - Flags: approval-mozilla-beta? → approval-mozilla-beta+

Verified that the issue is fixed as well on Firefox 151.0b5 on the same machine.

Status: RESOLVED → VERIFIED
QA Whiteboard: [QA-5085][S2][qa-found-in-c151][uplift] [qa-ver-needed-c152/b151] → [QA-5085][S2][qa-found-in-c151][uplift] [qa-ver-done-c152/b151]
Flags: qe-verify+
Regressions: 2044532
Regressions: 2044320
Regressions: 2044339
Regressions: 2048835
No longer regressions: 2048835
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: