From c519cf692804af768a95b0f5c72a37ad6dfd6b08 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Tue, 20 Feb 2024 10:30:32 +0100 Subject: [PATCH 1/6] Implement wrapper for sws_getCoefficients --- src/software/scaling/color_space.rs | 5 ++- src/software/scaling/context.rs | 52 ++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/software/scaling/color_space.rs b/src/software/scaling/color_space.rs index 0c741488..f4b01491 100644 --- a/src/software/scaling/color_space.rs +++ b/src/software/scaling/color_space.rs @@ -11,6 +11,7 @@ pub enum ColorSpace { ITU624, SMPTE170M, SMPTE240M, + BT2020, } impl From for ColorSpace { @@ -18,9 +19,10 @@ impl From for ColorSpace { match value { SWS_CS_ITU709 => ColorSpace::ITU709, SWS_CS_FCC => ColorSpace::FCC, + // Default is same as ITU601 SWS_CS_DEFAULT => ColorSpace::Default, SWS_CS_SMPTE240M => ColorSpace::SMPTE240M, - + SWS_CS_BT2020 => ColorSpace::BT2020, _ => ColorSpace::Default, } } @@ -36,6 +38,7 @@ impl From for c_int { ColorSpace::ITU624 => SWS_CS_ITU624, ColorSpace::SMPTE170M => SWS_CS_SMPTE170M, ColorSpace::SMPTE240M => SWS_CS_SMPTE240M, + ColorSpace::BT2020 => SWS_CS_BT2020, } } } diff --git a/src/software/scaling/context.rs b/src/software/scaling/context.rs index 0469a23e..d2a667ed 100644 --- a/src/software/scaling/context.rs +++ b/src/software/scaling/context.rs @@ -1,6 +1,8 @@ use std::ptr; -use super::Flags; +use crate::color; + +use super::{ColorSpace, Flags}; use ffi::*; use libc::c_int; use util::format; @@ -41,6 +43,8 @@ impl Context { dst_w: u32, dst_h: u32, flags: Flags, + color_space: color::Space, + color_range: color::Range, ) -> Result { unsafe { let ptr = sws_getContext( @@ -78,6 +82,52 @@ impl Context { } } + pub fn set_colorspace_details( + &mut self, + space: ColorSpace, + src_range: color::Range, + dst_range: color::Range, + input_yuv_space: color::Space, + brightness: i32, + contrast: i32, + saturation: i32, + ) { + unsafe { + let input_color_space_int = match input_yuv_space { + color::Space::BT709 => ColorSpace::ITU709, + color::Space::BT2020CL => ColorSpace::BT2020, + color::Space::BT2020NCL => ColorSpace::BT2020, + _ => ColorSpace::ITU601, + }; + let coefficients: *const i32 = sws_getCoefficients(input_color_space_int.into()); + + // 0 means limited range (16-235), 1 means full range (0-255) + let src_range_value = match src_range { + color::Range::MPEG => 0, + color::Range::JPEG => 1, + color::Range::Unspecified => 1, + }; + // 0 means limited range, 1 means full range + // For an RGB image, we want full range, for YUV, most of the time we want limited range + let dst_range_value = match dst_range { + color::Range::MPEG => 0, + color::Range::JPEG => 1, + color::Range::Unspecified => 1, + }; + + sws_setColorspaceDetails( + self.as_mut_ptr(), + coefficients, + src_range_value, + coefficients, + dst_range_value, + brightness, + contrast, + saturation, + ); + } + } + pub fn cached( &mut self, src_format: format::Pixel, From fa8bf843caa625a5cc3cb0abbc4d27fa9ea23196 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Tue, 20 Feb 2024 10:31:05 +0100 Subject: [PATCH 2/6] Update context.rs --- src/software/scaling/context.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/software/scaling/context.rs b/src/software/scaling/context.rs index d2a667ed..cfb3a521 100644 --- a/src/software/scaling/context.rs +++ b/src/software/scaling/context.rs @@ -1,7 +1,5 @@ use std::ptr; -use crate::color; - use super::{ColorSpace, Flags}; use ffi::*; use libc::c_int; From 6d25a583779e76e6f84d58a1db97065f531f3ca9 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Tue, 20 Feb 2024 10:40:24 +0100 Subject: [PATCH 3/6] Update context.rs --- src/software/scaling/context.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/software/scaling/context.rs b/src/software/scaling/context.rs index cfb3a521..ee6cb3e7 100644 --- a/src/software/scaling/context.rs +++ b/src/software/scaling/context.rs @@ -1,5 +1,7 @@ use std::ptr; +use crate::color; + use super::{ColorSpace, Flags}; use ffi::*; use libc::c_int; @@ -41,8 +43,6 @@ impl Context { dst_w: u32, dst_h: u32, flags: Flags, - color_space: color::Space, - color_range: color::Range, ) -> Result { unsafe { let ptr = sws_getContext( From 0e4120958be4bee19647a08505d5efe361af3fa8 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Tue, 20 Feb 2024 10:42:27 +0100 Subject: [PATCH 4/6] Update context.rs --- src/software/scaling/context.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/software/scaling/context.rs b/src/software/scaling/context.rs index ee6cb3e7..864f2d0b 100644 --- a/src/software/scaling/context.rs +++ b/src/software/scaling/context.rs @@ -82,10 +82,9 @@ impl Context { pub fn set_colorspace_details( &mut self, - space: ColorSpace, + input_yuv_space: color::Space, src_range: color::Range, dst_range: color::Range, - input_yuv_space: color::Space, brightness: i32, contrast: i32, saturation: i32, From 8b1ac88d7c0fea9ec4ac672d0159245fcb384596 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Tue, 20 Feb 2024 10:42:47 +0100 Subject: [PATCH 5/6] Update context.rs --- src/software/scaling/context.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/software/scaling/context.rs b/src/software/scaling/context.rs index 864f2d0b..fa7b715c 100644 --- a/src/software/scaling/context.rs +++ b/src/software/scaling/context.rs @@ -82,7 +82,7 @@ impl Context { pub fn set_colorspace_details( &mut self, - input_yuv_space: color::Space, + input_space: color::Space, src_range: color::Range, dst_range: color::Range, brightness: i32, @@ -90,7 +90,7 @@ impl Context { saturation: i32, ) { unsafe { - let input_color_space_int = match input_yuv_space { + let input_color_space_int = match input_space { color::Space::BT709 => ColorSpace::ITU709, color::Space::BT2020CL => ColorSpace::BT2020, color::Space::BT2020NCL => ColorSpace::BT2020, From 80d351ad73eb55df471e746b7f4464d9da7b809c Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Tue, 20 Feb 2024 11:13:55 +0100 Subject: [PATCH 6/6] return a result --- src/software/scaling/context.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/software/scaling/context.rs b/src/software/scaling/context.rs index fa7b715c..0c7788d5 100644 --- a/src/software/scaling/context.rs +++ b/src/software/scaling/context.rs @@ -88,7 +88,7 @@ impl Context { brightness: i32, contrast: i32, saturation: i32, - ) { + ) -> Result<(), Error> { unsafe { let input_color_space_int = match input_space { color::Space::BT709 => ColorSpace::ITU709, @@ -112,7 +112,7 @@ impl Context { color::Range::Unspecified => 1, }; - sws_setColorspaceDetails( + match sws_setColorspaceDetails( self.as_mut_ptr(), coefficients, src_range_value, @@ -121,7 +121,10 @@ impl Context { brightness, contrast, saturation, - ); + ) { + e if e < 0 => Err(Error::from(e)), + _ => Ok(()), + } } }