use j2k::EncodedJ2k;
#[cfg(target_os = "macos")]
use j2k_core::PixelFormat;
#[cfg(target_os = "macos")]
use metal::Buffer;
use std::time::Duration;
use super::MetalEncodedJ2k;
#[cfg(target_os = "macos")]
#[derive(Debug, Clone, Copy)]
pub struct MetalLosslessEncodeTile<'a> {
pub(super) buffer: &'a Buffer,
pub(super) byte_offset: usize,
pub(super) width: u32,
pub(super) height: u32,
pub(super) pitch_bytes: usize,
pub(super) output_width: u32,
pub(super) output_height: u32,
pub(super) format: PixelFormat,
}
#[cfg(target_os = "macos")]
impl<'a> MetalLosslessEncodeTile<'a> {
pub unsafe fn from_buffer(
buffer: &'a Buffer,
byte_offset: usize,
dimensions: (u32, u32),
pitch_bytes: usize,
output_dimensions: (u32, u32),
format: PixelFormat,
) -> Self {
Self::from_trusted_buffer(
buffer,
byte_offset,
dimensions,
pitch_bytes,
output_dimensions,
format,
)
}
pub(crate) fn from_trusted_buffer(
buffer: &'a Buffer,
byte_offset: usize,
dimensions: (u32, u32),
pitch_bytes: usize,
output_dimensions: (u32, u32),
format: PixelFormat,
) -> Self {
Self {
buffer,
byte_offset,
width: dimensions.0,
height: dimensions.1,
pitch_bytes,
output_width: output_dimensions.0,
output_height: output_dimensions.1,
format,
}
}
pub fn byte_offset(self) -> usize {
self.byte_offset
}
pub fn dimensions(self) -> (u32, u32) {
(self.width, self.height)
}
pub fn pitch_bytes(self) -> usize {
self.pitch_bytes
}
pub fn output_dimensions(self) -> (u32, u32) {
(self.output_width, self.output_height)
}
pub fn pixel_format(self) -> PixelFormat {
self.format
}
}
#[cfg(not(target_os = "macos"))]
#[derive(Debug, Clone, Copy)]
pub struct MetalLosslessEncodeTile<'a> {
_private: core::marker::PhantomData<&'a ()>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MetalLosslessEncodeResidency {
pub coefficient_prep_used: bool,
pub packetization_used: bool,
pub codestream_assembly_used: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[doc(hidden)]
pub struct MetalLosslessEncodeOutcome {
pub encoded: EncodedJ2k,
pub input_copy_used: bool,
pub resident: MetalLosslessEncodeResidency,
pub input_copy_duration: Duration,
pub encode_duration: Duration,
pub gpu_duration: Option<Duration>,
pub validation_duration: Duration,
pub host_readback_duration: Duration,
}
#[doc(hidden)]
pub struct MetalLosslessBufferEncodeOutcome {
pub encoded: MetalEncodedJ2k,
pub input_copy_used: bool,
pub resident: MetalLosslessEncodeResidency,
pub input_copy_duration: Duration,
pub encode_duration: Duration,
pub gpu_duration: Option<Duration>,
pub validation_duration: Duration,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct MetalLosslessEncodeConfig {
pub gpu_encode_inflight_tiles: Option<usize>,
pub gpu_encode_memory_budget_bytes: Option<usize>,
}
#[derive(Clone, Copy)]
pub struct MetalLosslessEncodeBatchRequest<'a, 'b> {
pub tiles: &'a [MetalLosslessEncodeTile<'b>],
pub staging: MetalEncodeInputStaging,
pub config: MetalLosslessEncodeConfig,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MetalEncodeInputStaging {
CopyAndPad,
AlreadyPaddedContiguous,
}