diff options
Diffstat (limited to 'src/bin/usshcamera.rs')
| -rw-r--r-- | src/bin/usshcamera.rs | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/bin/usshcamera.rs b/src/bin/usshcamera.rs new file mode 100644 index 0000000..6d73e92 --- /dev/null +++ b/src/bin/usshcamera.rs @@ -0,0 +1,44 @@ +use anyhow::{anyhow, Result}; +use sshcamera::v4l2::{Device as V4l2, Field}; +use sshcamera::v4l2abst::CaptStream; +use sshcamera::io::RWBundle; +use std::env; +use std::io::{self, Read as _, Write as _}; + +fn main() -> Result<()>{ + 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 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(()) + })??; + } +} |
