use core::sync::atomic::{AtomicU64, Ordering};
use core::time::Duration;
use crate::profile::Encoding;
pub const M_RGB565: usize = 0;
pub const M_RGB555: usize = 1;
pub const M_RGB555_REORDERED: usize = 2;
pub const M_UYVY: usize = 3;
pub const M_YCBCR420: usize = 4;
pub const M_CLCL: usize = 5;
pub const M_CL: usize = 6;
pub const M_JPEG: usize = 7;
pub const M_TOTAL: usize = 8;
const NUM_COUNTERS: usize = 9;
const fn encoding_to_idx(encoding: Encoding) -> usize {
match encoding {
Encoding::Rgb565 => M_RGB565,
Encoding::Rgb555 => M_RGB555,
Encoding::ReorderedRgb555 => M_RGB555_REORDERED,
Encoding::Yuv422 => M_UYVY,
Encoding::Ycbcr420 => M_YCBCR420,
Encoding::Jpeg => M_JPEG,
}
}
#[derive(Debug)]
pub struct DecodeMetrics {
counters: [AtomicU64; NUM_COUNTERS],
}
impl DecodeMetrics {
#[allow(clippy::new_without_default)]
#[must_use]
pub fn new() -> Self {
Self {
counters: [
AtomicU64::new(0),
AtomicU64::new(0),
AtomicU64::new(0),
AtomicU64::new(0),
AtomicU64::new(0),
AtomicU64::new(0),
AtomicU64::new(0),
AtomicU64::new(0),
AtomicU64::new(0),
],
}
}
pub fn record(&self, encoding: Encoding, duration: Duration) {
let nanos = u64::try_from(duration.as_nanos()).unwrap_or(u64::MAX);
self.counters[encoding_to_idx(encoding)].fetch_add(nanos, Ordering::Relaxed);
self.counters[M_TOTAL].fetch_add(nanos, Ordering::Relaxed);
}
#[must_use]
pub fn nanos(&self, idx: usize) -> u64 {
self.counters.get(idx).map_or(0, |c| c.load(Ordering::Relaxed))
}
pub fn reset(&self) {
for c in &self.counters {
c.store(0, Ordering::Relaxed);
}
}
#[must_use]
pub fn snapshot(&self) -> [u64; NUM_COUNTERS] {
[
self.counters[0].load(Ordering::Relaxed),
self.counters[1].load(Ordering::Relaxed),
self.counters[2].load(Ordering::Relaxed),
self.counters[3].load(Ordering::Relaxed),
self.counters[4].load(Ordering::Relaxed),
self.counters[5].load(Ordering::Relaxed),
self.counters[6].load(Ordering::Relaxed),
self.counters[7].load(Ordering::Relaxed),
self.counters[8].load(Ordering::Relaxed),
]
}
#[must_use]
pub fn rgb565_nanos(&self) -> u64 {
self.nanos(M_RGB565)
}
#[must_use]
pub fn rgb555_nanos(&self) -> u64 {
self.nanos(M_RGB555)
}
#[must_use]
pub fn rgb555_reordered_nanos(&self) -> u64 {
self.nanos(M_RGB555_REORDERED)
}
#[must_use]
pub fn uyvy_nanos(&self) -> u64 {
self.nanos(M_UYVY)
}
#[must_use]
pub fn ycbcr420_nanos(&self) -> u64 {
self.nanos(M_YCBCR420)
}
#[must_use]
pub fn clcl_nanos(&self) -> u64 {
self.nanos(M_CLCL)
}
#[must_use]
pub fn cl_nanos(&self) -> u64 {
self.nanos(M_CL)
}
#[must_use]
pub fn jpeg_nanos(&self) -> u64 {
self.nanos(M_JPEG)
}
}