use std::net::Ipv4Addr;
use crate::wire::{
DeviceUid, OsdCaptionAlign, OsdCaptionFormat, OsdSyncSize, OsdSyncState, OsdSyncWhat,
};
pub const OSD_SYNC_SLOTS: usize = 4;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct OsdSyncSlot {
pub bytes: u32,
pub crc32: u32,
pub percent: u8,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct OsdSync {
pub seq: u16,
pub target: DeviceUid,
pub what: OsdSyncWhat,
pub http_port: u16,
pub source_ip: Ipv4Addr,
pub records: u16,
pub slots: Option<[OsdSyncSlot; OSD_SYNC_SLOTS]>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct OsdSyncRequest {
pub target: DeviceUid,
pub seq: u16,
pub what: OsdSyncWhat,
pub missing: [u8; 16],
pub source: DeviceUid,
}
impl OsdSyncRequest {
pub fn is_missing(&self, index: u16) -> bool {
self.missing
.get(usize::from(index / 8))
.is_some_and(|b| b & (1 << (index % 8)) != 0)
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct OsdCaption {
pub font: String,
pub size: u16,
pub x: i16,
pub y: i16,
pub wrap: i16,
pub align: OsdCaptionAlign,
pub format: OsdCaptionFormat,
pub colour: u32,
pub text: String,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct OsdLogo {
pub logo: i8,
pub x: i16,
pub y: i16,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum OsdSyncValue {
Caption(OsdCaption),
Logo(OsdLogo),
Background(u32),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct OsdSyncSetting {
pub seq: u16,
pub target: DeviceUid,
pub index: u16,
pub records: u16,
pub size: OsdSyncSize,
pub layers: u16,
pub set: u16,
pub value: OsdSyncValue,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct OsdSyncReport {
pub seq: u16,
pub state: OsdSyncState,
pub written: u16,
pub refused: u16,
pub reason: String,
}
pub const OSD_SYNC_RECORDS_MAX: usize = 128;
pub const OSD_SYNC_FONT_MAX: usize = 31;
pub const OSD_SYNC_TEXT_MAX: usize = 360;
pub const OSD_SYNC_IMAGE_MAX: usize = 512 * 1024;
pub const OSD_SYNC_IMAGE_WIDTH_MAX: u32 = 1920;
pub const OSD_SYNC_IMAGE_HEIGHT_MAX: u32 = 1080;
pub const OSD_SYNC_PERCENT_MAX: u8 = 100;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct OsdSyncEntry {
pub size: OsdSyncSize,
pub layers: u16,
pub set: u16,
pub value: OsdSyncValue,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct OsdSyncImage {
pub png: Vec<u8>,
pub percent: u8,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct OsdSyncContent {
pub what: OsdSyncWhat,
pub entries: Vec<OsdSyncEntry>,
pub images: Option<[OsdSyncImage; OSD_SYNC_SLOTS]>,
}