diff options
| author | dyknon dyknonr5fjp | 2025-02-24 18:58:32 +0900 |
|---|---|---|
| committer | dyknon dyknonr5fjp | 2025-02-24 18:58:32 +0900 |
| commit | 6ecbf0d55695335f52d6fcf2b6a22ed45f5e4d99 (patch) | |
| tree | e17bfc8a9b55d5afbfe2f884322a96a54340f25d /src/bin/sshcamera.rs | |
| parent | 31b60ae28e6aff6d23b378cd77e288c96c7db148 (diff) | |
Remote camera capability.
Diffstat (limited to 'src/bin/sshcamera.rs')
| -rw-r--r-- | src/bin/sshcamera.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/bin/sshcamera.rs b/src/bin/sshcamera.rs new file mode 100644 index 0000000..02c8778 --- /dev/null +++ b/src/bin/sshcamera.rs @@ -0,0 +1,59 @@ +use anyhow::{anyhow, Result}; +use sshcamera::v4l2::{Device as V4l2, Field}; +use sshcamera::v4l2cairo::V4l2Cairo; +use sshcamera::gtk; +use sshcamera::v4l2abst::{CaptStream, RemoteCam}; +use sshcamera::io::RWBundle; +use gtk4::glib::ExitCode; +use std::env; +use std::io::{self, Read as _, Write as _}; +use std::process::{Command, Stdio}; + +fn main() -> Result<ExitCode>{ + let mut args = env::args(); + if args.next() == None{ + return Err(anyhow!("arg0 is not present??")); + } + let Some(arg1) = args.next() else{ + return Err(anyhow!("Give me args")); + }; + if arg1.contains('/'){ + if args.next() != None{ + return Err(anyhow!("too many args")); + } + + let v = V4l2::open(arg1)?; + + // TODO: It should be better. + let mut c = v.captstream_builder()? + .set_pixelformat("MJPG".into()) + //.set_pixelformat("YUYV".into()) + .set_field(Field::None) + .build()?; + assert!(["YUYV", "MJPG"].contains(&c.pixelformat().as_str())); + assert!(c.field() == Field::None); + + let mut io = RWBundle(io::stdin(), io::stdout()); + loop{ + CaptStream::next(&mut c, |frame|{ + frame.serialize(&mut io)?; + io.flush()?; + let mut rb = [0]; + io.read_exact(&mut rb)?; + if rb[0] != 0x2e{ + return Err(anyhow!("protocol error")); + } + Ok(()) + })??; + } + }else{ + let child = Command::new(arg1) + .args(args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn()?; + let io = RWBundle(child.stdout.unwrap(), child.stdin.unwrap()); + let v2c = V4l2Cairo::new(RemoteCam::new(io)); + gtk::main(v2c) + } +} |
