use alloc::vec::Vec;
use super::{J2kEncodeDispatchReport, J2kEncodeStageResult};
use crate::{
EncodedHtJ2kCodeBlock, EncodedHtJ2kCodeBlockSet, EncodedJ2kCodeBlock, J2kForwardDwt53Job,
J2kForwardDwt53Output, J2kForwardDwt97Job, J2kForwardDwt97Output, J2kForwardIctJob,
J2kForwardRctJob, J2kHtCodeBlockEncodeJob, J2kHtCodeBlockSetEncodeJob, 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)
}
#[doc(hidden)]
fn encode_ht_code_block_sets(
&mut self,
_jobs: &[J2kHtCodeBlockSetEncodeJob<'_>],
) -> J2kEncodeStageResult<Option<Vec<EncodedHtJ2kCodeBlockSet>>> {
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
}
}
#[cfg(test)]
mod tests {
use super::{CpuOnlyJ2kEncodeStageAccelerator, J2kEncodeStageAccelerator};
use crate::J2kHtCodeBlockSetEncodeJob;
#[test]
fn legacy_accelerators_decline_explicit_ht_sets_by_default() {
let coefficients = [7_i32];
let jobs = [J2kHtCodeBlockSetEncodeJob {
coefficients: &coefficients,
width: 1,
height: 1,
total_bitplanes: 3,
cleanup_bitplane: 1,
target_coding_passes: 3,
}];
let mut accelerator = CpuOnlyJ2kEncodeStageAccelerator;
assert!(accelerator
.encode_ht_code_block_sets(&jobs)
.expect("default set hook")
.is_none());
}
}