avfilter/tonemap_*: clip input range for bt2390

This commit is contained in:
gnattu
2025-03-21 12:20:24 +08:00
parent 30c0e71697
commit 5a20713010
3 changed files with 23 additions and 9 deletions
+7 -3
View File
@@ -1086,7 +1086,7 @@ Index: FFmpeg/libavfilter/cuda/tonemap.cu
===================================================================
--- /dev/null
+++ FFmpeg/libavfilter/cuda/tonemap.cu
@@ -0,0 +1,579 @@
@@ -0,0 +1,583 @@
+/*
+ * This file is part of FFmpeg.
+ *
@@ -1210,7 +1210,8 @@ Index: FFmpeg/libavfilter/cuda/tonemap.cu
+
+static __inline__ __device__
+float bt2390(float s, float peak, float dst_peak) {
+ float s_pq = inverse_eotf_st2084(s);
+ float s_clipped = min(s, peak);
+ float s_pq = inverse_eotf_st2084(s_clipped);
+ return eotf_st2084(bt2390_common(s_pq, peak, dst_peak));
+}
+
@@ -1324,8 +1325,11 @@ Index: FFmpeg/libavfilter/cuda/tonemap.cu
+
+static __inline__ __device__
+float3 map_one_pixel_itp_mode(float3 rgb, const FFCUDAFrame& src, const FFCUDAFrame& dst) {
+ float3 ictcp = lrgb2ictcp(rgb.x, rgb.y, rgb.z);
+ float peak = src.peak;
+ float r = mix(rgb.x, min(rgb.x, peak), tonemap_func == TONEMAP_BT2390);
+ float g = mix(rgb.x, min(rgb.y, peak), tonemap_func == TONEMAP_BT2390);
+ float b = mix(rgb.x, min(rgb.z, peak), tonemap_func == TONEMAP_BT2390);
+ float3 ictcp = lrgb2ictcp(r, g, b);
+ float dst_peak = 1.0f;
+ ictcp.x = max(ictcp.x, FLOAT_EPS);
+ float i_o = ictcp.x;
@@ -526,7 +526,7 @@ Index: FFmpeg/libavfilter/opencl/tonemap.cl
float j = tone_param;
float a, b;
@@ -71,202 +85,606 @@ float mobius(float s, float peak) {
@@ -71,202 +85,611 @@ float mobius(float s, float peak) {
return s;
a = -j * j * (peak - 1.0f) / (j * j - 2.0f * j + peak);
@@ -681,9 +681,9 @@ Index: FFmpeg/libavfilter/opencl/tonemap.cl
+ float src_peak_delin_pq = inverse_eotf_st2084(peak);
+ float dst_peak_delin_pq = inverse_eotf_st2084(1.0f);
+ #ifdef TONE_MODE_RGB
+ sig_r = inverse_eotf_st2084x4(sig_r);
+ sig_g = inverse_eotf_st2084x4(sig_g);
+ sig_b = inverse_eotf_st2084x4(sig_b);
+ sig_r = inverse_eotf_st2084x4(fmin(sig_r, peak));
+ sig_g = inverse_eotf_st2084x4(fmin(sig_g, peak));
+ sig_b = inverse_eotf_st2084x4(fmin(sig_b, peak));
+ MAP_FOUR_PIXELS(sig_r, src_peak_delin_pq, dst_peak_delin_pq)
+ MAP_FOUR_PIXELS(sig_g, src_peak_delin_pq, dst_peak_delin_pq)
+ MAP_FOUR_PIXELS(sig_b, src_peak_delin_pq, dst_peak_delin_pq)
@@ -691,7 +691,7 @@ Index: FFmpeg/libavfilter/opencl/tonemap.cl
+ sig_g = eotf_st2084x4(sig_g);
+ sig_b = eotf_st2084x4(sig_b);
+ #else
+ sig = inverse_eotf_st2084x4(sig);
+ sig = inverse_eotf_st2084x4(fmin(sig, peak));
+ MAP_FOUR_PIXELS(sig, src_peak_delin_pq, dst_peak_delin_pq)
+ sig = eotf_st2084x4(sig);
+ #endif
@@ -728,6 +728,11 @@ Index: FFmpeg/libavfilter/opencl/tonemap.cl
+#ifdef TONE_MODE_ITP
+void map_four_pixels_itp(float4 *r4, float4 *g4, float4 *b4, float peak) {
+ float4 i4_o, i4, ct4 , cp4;
+#ifdef TONE_FUNC_BT2390
+ *r4 = fmin(*r4, peak);
+ *g4 = fmin(*g4, peak);
+ *b4 = fmin(*b4, peak);
+#endif
+ lrgb2ictcp(*r4, *g4, *b4, &i4, &ct4, &cp4);
+ i4 = fmax(i4, FLOAT_EPS);
+ i4_o = i4;
@@ -40,7 +40,7 @@ Index: FFmpeg/libavfilter/metal/vf_tonemap_videotoolbox.metal
===================================================================
--- /dev/null
+++ FFmpeg/libavfilter/metal/vf_tonemap_videotoolbox.metal
@@ -0,0 +1,916 @@
@@ -0,0 +1,921 @@
+/*
+ * Copyright (c) 2024 Gnattu OC <gnattuoc@me.com>
+ *
@@ -628,6 +628,11 @@ Index: FFmpeg/libavfilter/metal/vf_tonemap_videotoolbox.metal
+ *b4 *= factor_b;
+ } else if (is_tone_mode_itp) {
+ float4 i4_o, i4, ct4 , cp4;
+ if (is_tone_func_bt2390) {
+ *r4 = fmin(*r4, peak);
+ *g4 = fmin(*g4, peak);
+ *b4 = fmin(*b4, peak);
+ }
+ lrgb2ictcp(*r4, *g4, *b4, &i4, &ct4, &cp4);
+ i4 = fmax(i4, FLOAT_EPS);
+ i4_o = i4;