Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

hdr tonemapping: target-trc=srgb instead of pq breaks the image in dark scenes (saturation, contrast, brightness) #15340

Open
6 tasks done
geextahslex opened this issue Nov 19, 2024 · 9 comments
Labels

Comments

@geextahslex
Copy link

geextahslex commented Nov 19, 2024

mpv Information

mpv v0.39.0-355-g45c1c586 Copyright © 2000-2024 mpv/MPlayer/mplayer2 projects
 built on Nov 19 2024 00:07:00
libplacebo version: v7.349.0 (v7.349.0-26-g5788a82-dirty)
FFmpeg version: N-117832-ge9c3698ed
FFmpeg library versions:
   libavcodec      61.25.100
   libavdevice     61.4.100
   libavfilter     10.6.101
   libavformat     61.9.100
   libavutil       59.47.100
   libswresample   5.4.100
   libswscale      8.9.101

Other Information

Windows version: Windows 10 22H2 Build 19045.4170)
GPU model, driver and version: intel HD Graphics 4600, driver: 20.19.15.5171
Source of mpv: https://sourceforge.net/projects/mpv-player-windows/files/
Introduced in version: present since v38.0

Reproduction Steps

use these hdr tonemapping settings and compare a dark scene with and without vf=format=sig-peak=4.926 to see the difference in saturation

tone-mapping=st2094-10
target-peak=100
hdr-compute-peak=no
allow-delayed-peak-detect

Expected Behavior

saturation stays the same

Actual Behavior

dark scenes get desaturated and look washed out

Log File

full output
output full.txt
gpu-debug
output.txt

Sample Files

almost black and white
black and white

normal
normal4545

washed out
washed out

normal
normal3

I carefully read all instruction and confirm that I did the following:

  • I tested with the latest mpv version to validate that the issue is not already fixed.
  • I provided all required information including system and mpv version.
  • I produced the log file with the exact same set of files, parameters, and conditions used in "Reproduction Steps", with the addition of --log-file=output.txt.
  • I produced the log file while the behaviors described in "Actual Behavior" were actively observed.
  • I attached the full, untruncated log file.
  • I attached the backtrace in the case of a crash.
@geextahslex geextahslex changed the title hdr tonemapping metadata nits desaturate the image hdr tonemapping nits desaturate the image Nov 19, 2024
@kasper93
Copy link
Contributor

Likely duplicate of #12707 you can try with target-contrast=inf

@geextahslex
Copy link
Author

This doesn't fix it, this messes up the contrast or black levels

@geextahslex
Copy link
Author

geextahslex commented Nov 20, 2024

It seems like I would need to disable this "feature" that desatures the image

// Avoid raising saturation excessively when raising brightness, and
// also desaturate when reducing brightness greatly to account for the
// reduction in gamut volume.

#12707 (comment)

"shaders/colorspace: scale down saturation when raising brightness"
https://code.videolan.org/videolan/libplacebo/-/merge_requests/477/diffs

#12707 (comment)

I reverted that patch and recompiled and saturation looks fine now. This piece of code is responsible for the described effect in dark scenes.

How to patch this out? I have no experience with this...

@geextahslex geextahslex changed the title hdr tonemapping nits desaturate the image hdr tonemapping nits desaturate the image (scale down saturation when raising brightness) Nov 20, 2024
@geextahslex
Copy link
Author

geextahslex commented Nov 21, 2024

@haasn My suggestion would be to add an percantage option to this function, so you can turn it on, off or fine-tune it to your liking.

is this the code responsible for this?
https://github.com/mpv-player/mpv/blob/master/video/out/gpu/video_shaders.c

 if (!opts->gamut_mode || opts->gamut_mode == GAMUT_DESATURATE) {
            GLSL(float cmin = min(min(color.r, color.g), color.b);)
            GLSL(if (cmin < 0.0) {
                     float luma = dot(dst_luma, color.rgb);
                     float coeff = cmin / (cmin - luma);
                     color.rgb = mix(color.rgb, vec3(luma), coeff);
                 })
            GLSLF("float cmax = 1.0/%f * max(max(color.r, color.g), color.b);\n",
                  dst.hdr.max_luma / MP_REF_WHITE);
            GLSL(if (cmax > 1.0) color.rgb /= cmax;)
        }
    }

@geextahslex geextahslex changed the title hdr tonemapping nits desaturate the image (scale down saturation when raising brightness) hdr tonemapping: auto desaturation patch breaks the image in dark scenes (scale down saturation when raising brightness) Nov 21, 2024
@stonix015
Copy link

Hey @geextahslex ....
I want to understand more about this: How did you find out that vf=format=sig-peak=4.926 deactivates the feature. What does this do exactly?

Wouldn't it be the same to set target-peak = 1000 ?

So what you want is the Brightness of the HDR picture, but you do NOT want the washed out colors, mhh?

Did you try out the spline tone-mapping instead of st2094 ? It really works out as the best i think. The algorithm makes really sense.

@haasn
Copy link
Member

haasn commented Nov 22, 2024

@geextahslex
Copy link
Author

@stonix015

I want to understand more about this: How did you find out that vf=format=sig-peak=4.926 deactivates the feature. What does this do exactly?

I found this out by accident, and kasper gave me this line to fix it.

Wouldn't it be the same to set target-peak = 1000 ?

From my understanding no, because target-peak is kinda your output target and the metadata nits is the input to the pipeline. You can see it at the top in these screenshots.

almost black and white
black and white

normal
normal4545

So what you want is the Brightness of the HDR picture, but you do NOT want the washed out colors, mhh?

Yes, I dont want the desaturation effect.

Did you try out the spline tone-mapping instead of st2094 ? It really works out as the best i think. The algorithm makes really sense.

At this point I tried out everything, spline, hable, rainhard etc. For me st2094-10 works kinda the best.

@geextahslex
Copy link
Author

haasn/libplacebo#304

@geextahslex geextahslex changed the title hdr tonemapping: auto desaturation patch breaks the image in dark scenes (scale down saturation when raising brightness) hdr tonemapping: target-trc=srgb instead of pq breaks the image in dark scenes (saturation, contrast, brightness) Nov 27, 2024
@geextahslex geextahslex reopened this Nov 27, 2024
@geextahslex
Copy link
Author

geextahslex commented Nov 27, 2024

So after further testing I noticed that this behaviour only occurs when you set the target-trc to srgb/bt.1886 instead of the default pq and pq gives you crushed blacks/artifacting

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants