use std::{thread, time::Duration};
use image::{ImageBuffer, Rgb};
use imageproc::drawing::draw_text_mut;
use rusttype::{Font, Scale};
use rvideo::{BoundingBox, Format, Frame, Server};
use serde::Serialize;
const FONT: &[u8] = include_bytes!("/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf");
#[derive(Serialize)]
struct FrameInfo {
source: String,
frame_number: u64,
#[serde(rename = ".bboxes")]
bounding_boxes: Vec<BoundingBox>,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let width = 640;
let height = 480;
let server = Server::new(Duration::from_secs(5));
let stream = server.add_stream(Format::Rgb8, width, height)?;
thread::spawn(move || {
let mut frame_number = 0;
let font = Font::try_from_bytes(FONT).unwrap();
loop {
let mut imgbuf =
ImageBuffer::<Rgb<u8>, Vec<u8>>::from_fn(width.into(), height.into(), |_, _| {
Rgb([0, 0, 0])
});
draw_text_mut(
&mut imgbuf,
Rgb::from([255, 255, 255]),
0,
0,
Scale { x: 100.0, y: 100.0 },
&font,
&frame_number.to_string(),
);
dbg!(frame_number);
let metadata = FrameInfo {
source: "test".to_string(),
frame_number,
bounding_boxes: vec![
BoundingBox::new(100, 300, 100, 100)
.with_color([255, 0, 0])
.with_label("airplane"),
BoundingBox::new(630, 220, 10, 50)
.with_confidence(0.5)
.with_label("person"),
BoundingBox::new(400, 0, 20, 20)
.with_confidence(0.892)
.with_label("car"),
],
};
stream
.send_frame(Frame::new_with_metadata(
rmp_serde::to_vec_named(&metadata).unwrap().into(),
imgbuf.to_vec().into(),
))
.unwrap();
thread::sleep(Duration::from_millis(100));
frame_number += 1;
}
});
server.serve("127.0.0.1:3001")?;
Ok(())
}