use alloc::vec::Vec;
use super::{J2kEncodeDispatchReport, J2kEncodeStageResult};
use crate::{
EncodedHtJ2kCodeBlock, EncodedJ2kCodeBlock, J2kForwardDwt53Job, J2kForwardDwt53Output,
J2kForwardDwt97Job, J2kForwardDwt97Output, J2kForwardIctJob, J2kForwardRctJob,
J2kHtCodeBlockEncodeJob, J2kHtSubbandEncodeJob, J2kPacketizationEncodeJob,
J2kPacketizationProgressionOrder, J2kQuantizeSubbandJob, J2kResidentHtj2kTileEncodeJob,
J2kTier1CodeBlockEncodeJob,
};
#[derive(Debug, Clone, Copy)]
pub struct J2kDeinterleaveToF32Job<'a> {
pub pixels: &'a [u8],
pub num_pixels: usize,
pub num_components: u16,
pub bit_depth: u8,
pub signed: bool,
}
#[derive(Debug, Clone, Copy)]
pub struct J2kDeinterleaveMctToF32Job<'a> {
pub pixels: &'a [u8],
pub num_pixels: usize,
pub bit_depth: u8,
pub signed: bool,
pub reversible: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct J2kEncodeContext {
pub num_pixels: usize,
pub num_components: u16,
pub bit_depth: u8,
pub signed: bool,
pub reversible: bool,
}
#[derive(Debug, Clone, Copy)]
pub struct J2kHtj2kTileEncodeJob<'a> {
pub pixels: &'a [u8],
pub width: u32,
pub height: u32,
pub num_components: u16,
pub bit_depth: u8,
pub signed: bool,
pub num_decomposition_levels: u8,
pub reversible: bool,
pub use_mct: bool,
pub guard_bits: u8,
pub code_block_width: u32,
pub code_block_height: u32,
pub progression_order: J2kPacketizationProgressionOrder,
pub component_sampling: &'a [(u8, u8)],
pub quantization_steps: &'a [(u16, u16)],
}
#[derive(Debug, Default, Clone, Copy)]
pub struct CpuOnlyJ2kEncodeStageAccelerator;
pub trait J2kEncodeStageAccelerator {
fn begin_encode(&mut self, _context: J2kEncodeContext) -> J2kEncodeStageResult<()> {
Ok(())
}
fn dispatch_report(&self) -> J2kEncodeDispatchReport {
J2kEncodeDispatchReport::default()
}
fn ht_subband_maximum_cleanup_magnitude(&self) -> Option<u64> {
None
}
fn ht_tile_required_magnitude_bound(&self) -> Option<u8> {
None
}
fn encode_deinterleave(
&mut self,
_job: J2kDeinterleaveToF32Job<'_>,
) -> J2kEncodeStageResult<Option<Vec<Vec<f32>>>> {
Ok(None)
}
fn encode_deinterleave_mct(
&mut self,
_job: J2kDeinterleaveMctToF32Job<'_>,
) -> J2kEncodeStageResult<Option<Vec<Vec<f32>>>> {
Ok(None)
}
fn encode_forward_rct(&mut self, _job: J2kForwardRctJob<'_>) -> J2kEncodeStageResult<bool> {
Ok(false)
}
fn encode_forward_ict(&mut self, _job: J2kForwardIctJob<'_>) -> J2kEncodeStageResult<bool> {
Ok(false)
}
fn encode_forward_dwt53(
&mut self,
_job: J2kForwardDwt53Job<'_>,
) -> J2kEncodeStageResult<Option<J2kForwardDwt53Output>> {
Ok(None)
}
fn encode_forward_dwt97(
&mut self,
_job: J2kForwardDwt97Job<'_>,
) -> J2kEncodeStageResult<Option<J2kForwardDwt97Output>> {
Ok(None)
}
fn encode_quantize_subband(
&mut self,
_job: J2kQuantizeSubbandJob<'_>,
) -> J2kEncodeStageResult<Option<Vec<i32>>> {
Ok(None)
}
fn encode_tier1_code_block(
&mut self,
_job: J2kTier1CodeBlockEncodeJob<'_>,
) -> J2kEncodeStageResult<Option<EncodedJ2kCodeBlock>> {
Ok(None)
}
fn encode_tier1_code_blocks(
&mut self,
_jobs: &[J2kTier1CodeBlockEncodeJob<'_>],
) -> J2kEncodeStageResult<Option<Vec<EncodedJ2kCodeBlock>>> {
Ok(None)
}
fn encode_ht_code_block(
&mut self,
_job: J2kHtCodeBlockEncodeJob<'_>,
) -> J2kEncodeStageResult<Option<EncodedHtJ2kCodeBlock>> {
Ok(None)
}
fn encode_ht_code_blocks(
&mut self,
_jobs: &[J2kHtCodeBlockEncodeJob<'_>],
) -> J2kEncodeStageResult<Option<Vec<EncodedHtJ2kCodeBlock>>> {
Ok(None)
}
fn encode_ht_subband(
&mut self,
_job: J2kHtSubbandEncodeJob<'_>,
) -> J2kEncodeStageResult<Option<Vec<EncodedHtJ2kCodeBlock>>> {
Ok(None)
}
fn encode_htj2k_tile(
&mut self,
_job: J2kHtj2kTileEncodeJob<'_>,
) -> J2kEncodeStageResult<Option<Vec<u8>>> {
Ok(None)
}
fn encode_resident_htj2k_tile(
&mut self,
_job: J2kResidentHtj2kTileEncodeJob<'_>,
) -> J2kEncodeStageResult<Option<Vec<u8>>> {
Ok(None)
}
fn prefer_parallel_cpu_code_block_fallback(&self) -> bool {
false
}
fn prefer_parallel_cpu_tile_encode(&self) -> bool {
false
}
fn encode_packetization(
&mut self,
_job: J2kPacketizationEncodeJob<'_>,
) -> J2kEncodeStageResult<Option<Vec<u8>>> {
Ok(None)
}
}
#[doc(hidden)]
impl J2kEncodeStageAccelerator for CpuOnlyJ2kEncodeStageAccelerator {
fn prefer_parallel_cpu_code_block_fallback(&self) -> bool {
true
}
fn prefer_parallel_cpu_tile_encode(&self) -> bool {
true
}
}