extern crate decklink;
#[macro_use]
extern crate text_io;
use decklink::device::output::{DecklinkOutputDevice, DecklinkVideoOutputFlags};
use decklink::device::DecklinkDeviceDisplayModes;
use decklink::device::{get_devices, DecklinkDevice};
use decklink::display_mode::DecklinkDisplayMode;
use decklink::frame::{DecklinkFrameFlags, DecklinkPixelFormat, DecklinkVideoMutableFrame};
fn select_output_and_format() -> Option<(DecklinkDevice, DecklinkOutputDevice, DecklinkDisplayMode)>
{
let device = {
let mut devices = get_devices().expect("list devices failed");
println!("Found {} devices", devices.len());
for i in 0..devices.len() {
println!(
"{}: {}",
i,
devices[i]
.display_name()
.unwrap_or_else(|| "Unknown".to_string())
);
}
let index: usize = text_io::read!();
if index >= devices.len() {
println!("Invalid device index");
return None;
}
devices.swap_remove(index)
};
println!(
"Selected device: {}\n",
device
.display_name()
.unwrap_or_else(|| "Unknown".to_string())
);
let output = match device.output() {
None => {
println!("Failed to create device output");
return None;
}
Some(o) => o,
};
let mode = {
let mut supported_modes = output
.display_modes()
.expect("Failed to list display modes");
for i in 0..supported_modes.len() {
println!(
"{}: {}",
i,
supported_modes[i]
.name()
.unwrap_or_else(|| "Unknown".to_string())
);
}
let index: usize = read!();
if index >= supported_modes.len() {
println!("Invalid mode index");
return None;
}
supported_modes.swap_remove(index)
};
Some((device, output, mode))
}
fn main() {
if let Some((_device, output, mode)) = select_output_and_format() {
let mut frame = Box::new(DecklinkVideoMutableFrame::create(
mode.width(),
mode.height(),
mode.width() * 4,
DecklinkPixelFormat::Format8BitBGRA,
DecklinkFrameFlags::empty(),
));
let bytes = vec![120u8; (mode.width() * mode.height() * 4) as usize];
if frame.set_bytes(bytes).is_err() {
println!("Failed to set frame bytes");
return;
}
let video_output = output
.enable_video_output_sync(mode.mode(), DecklinkVideoOutputFlags::empty())
.expect("Failed to enable video output");
video_output
.display_custom_frame(frame)
.expect("Failed to display frame");
println!("Press enter to continue");
let _s: String = read!();
}
}