diff --git a/README.md b/README.md index a861d20..f5f6adc 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ sudo udevadm control --reload ```bash mkdir ./video -./it9910hd_fusefs ./video --width 1920 --height 1080 --fps 30 --bitrate 52000 --audio_src 2 --video_src 4 +./it9910hd_fusefs ./video --width 1920 --height 1080 --fps 30 --bitrate 52000 --audio_src 2 --video_src 4 --brightness=0 --contrast=100 --saturation=100 --hue=0 ``` ## Play video diff --git a/bin/it9910hd_fusefs b/bin/it9910hd_fusefs index bbf187d..6fc97b3 100644 Binary files a/bin/it9910hd_fusefs and b/bin/it9910hd_fusefs differ diff --git a/bin/play b/bin/play index b262995..68bb85b 100644 --- a/bin/play +++ b/bin/play @@ -4,7 +4,7 @@ mkdir ./video -./it9910hd_fusefs ./video --width 1920 --height 1080 --fps 30 --bitrate 52000 --audio_src 2 --video_src 4 & +./it9910hd_fusefs ./video --width 1920 --height 1080 --fps 30 --bitrate 52000 --audio_src 2 --video_src 4 --brightness=0 --contrast=100 --saturation=100 --hue=0 & mpv -hwdec=auto ./video/hdmi_stream.ts diff --git a/bin/record b/bin/record index a5defe3..776e430 100644 --- a/bin/record +++ b/bin/record @@ -2,7 +2,7 @@ mkdir ./video -./it9910hd_fusefs ./video --width 1920 --height 1080 --fps 25 --bitrate 20000 --audio_src 2 --video_src 4 & +./it9910hd_fusefs ./video --width 1920 --height 1080 --fps 25 --bitrate 20000 --audio_src 2 --video_src 4 --brightness=0 --contrast=100 --saturation=100 --hue=0 & mpv -hwdec=auto --record-file=./video.ts ./video/hdmi_stream.ts diff --git a/src/it9910hd_driver.rs b/src/it9910hd_driver.rs index d2424f2..59309b2 100644 --- a/src/it9910hd_driver.rs +++ b/src/it9910hd_driver.rs @@ -23,6 +23,10 @@ impl IT9910Driver { bitrate: u32, audio_src: u32, video_src: u32, + brightness: i32, + contrast: i32, + hue: i32, + saturation: i32, ) -> Result<(), String> { //self.debug_query_time(1)?; //self.set_pc_grabber(0)?; @@ -53,7 +57,10 @@ impl IT9910Driver { self.set_pc_grabber2(device_model, i, width, height, bitrate, fps)?; } - //self.debug_query_time(1)?; + self.set_brightness(brightness)?; + self.set_contrast(contrast)?; + self.set_hue(hue)?; + self.set_saturation(saturation)?; self.set_state(2)?; @@ -125,6 +132,50 @@ impl IT9910Driver { Ok(()) } + fn set_brightness(&mut self, brightness: i32) -> Result<(), String> { + let mut buf = [0u8; 16 + 4 * 2]; + + write_le_i32(&mut buf[16..20], 0); + write_le_i32(&mut buf[20..24], brightness); + + let _received = self.send_command(&mut buf, 0x99100101, 2)?; + + Ok(()) + } + + fn set_contrast(&mut self, contrast: i32) -> Result<(), String> { + let mut buf = [0u8; 16 + 4 * 2]; + + write_le_i32(&mut buf[16..20], 0); + write_le_i32(&mut buf[20..24], contrast); + + let _received = self.send_command(&mut buf, 0x99100102, 2)?; + + Ok(()) + } + + fn set_hue(&mut self, hue: i32) -> Result<(), String> { + let mut buf = [0u8; 16 + 4 * 2]; + + write_le_i32(&mut buf[16..20], 0); + write_le_i32(&mut buf[20..24], hue); + + let _received = self.send_command(&mut buf, 0x99100103, 2)?; + + Ok(()) + } + + fn set_saturation(&mut self, set_saturation: i32) -> Result<(), String> { + let mut buf = [0u8; 16 + 4 * 2]; + + write_le_i32(&mut buf[16..20], 0); + write_le_i32(&mut buf[20..24], set_saturation); + + let _received = self.send_command(&mut buf, 0x99100104, 2)?; + + Ok(()) + } + fn set_pc_grabber(&mut self, start: i32) -> Result<(), String> { let mut buf = [0u8; 16 + 4 * 3]; diff --git a/src/main.rs b/src/main.rs index 1daa08c..4d84e73 100644 --- a/src/main.rs +++ b/src/main.rs @@ -66,7 +66,11 @@ struct IT9910FS { bitrate: u32, audio_src: u32, video_src: u32, - //buffer_max_len: u32, + brightness: i32, + constrast: i32, + hue: i32, + saturation: i32, + data_receiver: Option>>, terminate_sender: Option>, thread_ended_receiver: Option>, @@ -87,7 +91,10 @@ impl IT9910FS { bitrate: u32, audio_src: u32, video_src: u32, - //buffer_max_len: u32, + brightness: i32, + constrast: i32, + hue: i32, + saturation: i32, ) -> Result { Ok(IT9910FS { width: width, @@ -96,7 +103,11 @@ impl IT9910FS { bitrate: bitrate, audio_src: audio_src, video_src: video_src, - //buffer_max_len: buffer_max_len, + brightness: brightness, + constrast: constrast, + hue: hue, + saturation: saturation, + data_receiver: None, terminate_sender: None, thread_ended_receiver: None, @@ -178,6 +189,10 @@ impl Filesystem for IT9910FS { let bitrate = self.bitrate; let audio_src = self.audio_src; let video_src = self.video_src; + let brightness = self.brightness; + let contrast = self.constrast; + let hue = self.hue; + let saturation = self.saturation; thread::spawn(move || { let thread_id = thread_native_id(); @@ -200,6 +215,10 @@ impl Filesystem for IT9910FS { bitrate, audio_src, video_src, + brightness, + contrast, + hue, + saturation, ) { eprintln!("IT9910 thread error: {}", err); } @@ -341,6 +360,10 @@ pub fn run( bitrate: u32, audio_src: u32, video_src: u32, + brightness: i32, + constrast: i32, + hue: i32, + saturation: i32, ) -> Result<(), String> { let mut it_driver = match IT9910Driver::open() { Ok(it_driver) => it_driver, @@ -349,7 +372,9 @@ pub fn run( } }; - if let Err(err) = it_driver.start(width, height, fps, bitrate, audio_src, video_src) { + if let Err(err) = it_driver.start( + width, height, fps, bitrate, audio_src, video_src, brightness, constrast, hue, saturation, + ) { return Err(format!("Unable to start IT9910 device: {}", err)); } @@ -431,13 +456,30 @@ fn main() -> Result<(), String> { .long("video_src") .default_value("4"), ) - /*.arg( - Arg::with_name("buffer_len") - .help("buffer size in MB") - .short("l") - .long("buffer_len") + .arg( + Arg::with_name("brightness") + .help("brightness, range: -100..100") + .long("brightness") + .default_value("0"), + ) + .arg( + Arg::with_name("contrast") + .help("contrast, range: 0..1000") + .long("contrast") .default_value("100"), - )*/ + ) + .arg( + Arg::with_name("hue") + .help("hue, range: 0..360") + .long("hue") + .default_value("0"), + ) + .arg( + Arg::with_name("saturation") + .help("saturation, range: 0..1000") + .long("saturation") + .default_value("100"), + ) .arg( Arg::with_name("dir") .help("mountpoint for video filesystem") @@ -452,7 +494,10 @@ fn main() -> Result<(), String> { let bitrate = value_t!(matches, "bitrate", u32).unwrap_or(20000); let audio_src = value_t!(matches, "audio_src", u32).unwrap_or(2); let video_src = value_t!(matches, "video_src", u32).unwrap_or(4); - //let buffer_len = value_t!(matches, "buffer_len", u32).unwrap_or(100); + let brightness = value_t!(matches, "brightness", i32).unwrap_or(0); + let contrast = value_t!(matches, "contrast", i32).unwrap_or(0); + let hue = value_t!(matches, "hue", i32).unwrap_or(0); + let saturation = value_t!(matches, "saturation", i32).unwrap_or(0); let mountpoint = matches.value_of("dir").unwrap(); println!("IT9910HD FuseFS."); @@ -461,7 +506,6 @@ fn main() -> Result<(), String> { width, height, fps, bitrate ); println!("Audio Src: {}, video src: {}", audio_src, video_src); - //println!("Buffer: {} MB", buffer_len); println!("--------"); let options = ["-o", "ro", "-o", "fsname=it9910fs"] @@ -470,7 +514,7 @@ fn main() -> Result<(), String> { .collect::>(); let it9910fs = IT9910FS::new( - width, height, fps, bitrate, audio_src, video_src, //buffer_len, + width, height, fps, bitrate, audio_src, video_src, brightness, contrast, hue, saturation, )?; fuse::mount(it9910fs, mountpoint, &options).unwrap();