1use alloc::vec::Vec;
6
7use super::{J2kEncodeDispatchReport, J2kEncodeStageResult};
8use crate::{
9 EncodedHtJ2kCodeBlock, EncodedHtJ2kCodeBlockSet, EncodedJ2kCodeBlock, J2kForwardDwt53Job,
10 J2kForwardDwt53Output, J2kForwardDwt97Job, J2kForwardDwt97Output, J2kForwardIctJob,
11 J2kForwardRctJob, J2kHtCodeBlockEncodeJob, J2kHtCodeBlockSetEncodeJob, J2kHtSubbandEncodeJob,
12 J2kPacketizationEncodeJob, J2kPacketizationProgressionOrder, J2kQuantizeSubbandJob,
13 J2kResidentHtj2kTileEncodeJob, J2kTier1CodeBlockEncodeJob,
14};
15
16#[derive(Debug, Clone, Copy)]
18pub struct J2kDeinterleaveToF32Job<'a> {
19 pub pixels: &'a [u8],
21 pub num_pixels: usize,
23 pub num_components: u16,
25 pub bit_depth: u8,
27 pub signed: bool,
29}
30
31#[derive(Debug, Clone, Copy)]
35pub struct J2kDeinterleaveMctToF32Job<'a> {
36 pub pixels: &'a [u8],
38 pub num_pixels: usize,
40 pub bit_depth: u8,
42 pub signed: bool,
44 pub reversible: bool,
46}
47
48#[derive(Debug, Clone, Copy, PartialEq, Eq)]
50pub struct J2kEncodeContext {
51 pub num_pixels: usize,
53 pub num_components: u16,
55 pub bit_depth: u8,
57 pub signed: bool,
59 pub reversible: bool,
61}
62
63#[derive(Debug, Clone, Copy)]
65pub struct J2kHtj2kTileEncodeJob<'a> {
66 pub pixels: &'a [u8],
68 pub width: u32,
70 pub height: u32,
72 pub num_components: u16,
74 pub bit_depth: u8,
76 pub signed: bool,
78 pub num_decomposition_levels: u8,
80 pub reversible: bool,
82 pub use_mct: bool,
84 pub guard_bits: u8,
86 pub code_block_width: u32,
88 pub code_block_height: u32,
90 pub progression_order: J2kPacketizationProgressionOrder,
92 pub component_sampling: &'a [(u8, u8)],
94 pub quantization_steps: &'a [(u16, u16)],
96}
97
98#[derive(Debug, Default, Clone, Copy)]
100pub struct CpuOnlyJ2kEncodeStageAccelerator;
101
102pub trait J2kEncodeStageAccelerator {
104 fn begin_encode(&mut self, _context: J2kEncodeContext) -> J2kEncodeStageResult<()> {
106 Ok(())
107 }
108
109 fn dispatch_report(&self) -> J2kEncodeDispatchReport {
111 J2kEncodeDispatchReport::default()
112 }
113
114 fn ht_subband_maximum_cleanup_magnitude(&self) -> Option<u64> {
116 None
117 }
118
119 fn ht_tile_required_magnitude_bound(&self) -> Option<u8> {
121 None
122 }
123
124 fn encode_deinterleave(
126 &mut self,
127 _job: J2kDeinterleaveToF32Job<'_>,
128 ) -> J2kEncodeStageResult<Option<Vec<Vec<f32>>>> {
129 Ok(None)
130 }
131
132 fn encode_deinterleave_mct(
134 &mut self,
135 _job: J2kDeinterleaveMctToF32Job<'_>,
136 ) -> J2kEncodeStageResult<Option<Vec<Vec<f32>>>> {
137 Ok(None)
138 }
139
140 fn encode_forward_rct(&mut self, _job: J2kForwardRctJob<'_>) -> J2kEncodeStageResult<bool> {
142 Ok(false)
143 }
144
145 fn encode_forward_ict(&mut self, _job: J2kForwardIctJob<'_>) -> J2kEncodeStageResult<bool> {
147 Ok(false)
148 }
149
150 fn encode_forward_dwt53(
152 &mut self,
153 _job: J2kForwardDwt53Job<'_>,
154 ) -> J2kEncodeStageResult<Option<J2kForwardDwt53Output>> {
155 Ok(None)
156 }
157
158 fn encode_forward_dwt97(
160 &mut self,
161 _job: J2kForwardDwt97Job<'_>,
162 ) -> J2kEncodeStageResult<Option<J2kForwardDwt97Output>> {
163 Ok(None)
164 }
165
166 fn encode_quantize_subband(
168 &mut self,
169 _job: J2kQuantizeSubbandJob<'_>,
170 ) -> J2kEncodeStageResult<Option<Vec<i32>>> {
171 Ok(None)
172 }
173
174 fn encode_tier1_code_block(
176 &mut self,
177 _job: J2kTier1CodeBlockEncodeJob<'_>,
178 ) -> J2kEncodeStageResult<Option<EncodedJ2kCodeBlock>> {
179 Ok(None)
180 }
181
182 fn encode_tier1_code_blocks(
184 &mut self,
185 _jobs: &[J2kTier1CodeBlockEncodeJob<'_>],
186 ) -> J2kEncodeStageResult<Option<Vec<EncodedJ2kCodeBlock>>> {
187 Ok(None)
188 }
189
190 fn encode_ht_code_block(
192 &mut self,
193 _job: J2kHtCodeBlockEncodeJob<'_>,
194 ) -> J2kEncodeStageResult<Option<EncodedHtJ2kCodeBlock>> {
195 Ok(None)
196 }
197
198 fn encode_ht_code_blocks(
200 &mut self,
201 _jobs: &[J2kHtCodeBlockEncodeJob<'_>],
202 ) -> J2kEncodeStageResult<Option<Vec<EncodedHtJ2kCodeBlock>>> {
203 Ok(None)
204 }
205
206 #[doc(hidden)]
208 fn encode_ht_code_block_sets(
209 &mut self,
210 _jobs: &[J2kHtCodeBlockSetEncodeJob<'_>],
211 ) -> J2kEncodeStageResult<Option<Vec<EncodedHtJ2kCodeBlockSet>>> {
212 Ok(None)
213 }
214
215 fn encode_ht_subband(
217 &mut self,
218 _job: J2kHtSubbandEncodeJob<'_>,
219 ) -> J2kEncodeStageResult<Option<Vec<EncodedHtJ2kCodeBlock>>> {
220 Ok(None)
221 }
222
223 fn encode_htj2k_tile(
225 &mut self,
226 _job: J2kHtj2kTileEncodeJob<'_>,
227 ) -> J2kEncodeStageResult<Option<Vec<u8>>> {
228 Ok(None)
229 }
230
231 fn encode_resident_htj2k_tile(
233 &mut self,
234 _job: J2kResidentHtj2kTileEncodeJob<'_>,
235 ) -> J2kEncodeStageResult<Option<Vec<u8>>> {
236 Ok(None)
237 }
238
239 fn prefer_parallel_cpu_code_block_fallback(&self) -> bool {
241 false
242 }
243
244 fn prefer_parallel_cpu_tile_encode(&self) -> bool {
246 false
247 }
248
249 fn encode_packetization(
251 &mut self,
252 _job: J2kPacketizationEncodeJob<'_>,
253 ) -> J2kEncodeStageResult<Option<Vec<u8>>> {
254 Ok(None)
255 }
256}
257
258#[doc(hidden)]
259impl J2kEncodeStageAccelerator for CpuOnlyJ2kEncodeStageAccelerator {
260 fn prefer_parallel_cpu_code_block_fallback(&self) -> bool {
261 true
262 }
263
264 fn prefer_parallel_cpu_tile_encode(&self) -> bool {
265 true
266 }
267}
268
269#[cfg(test)]
270mod tests {
271 use super::{CpuOnlyJ2kEncodeStageAccelerator, J2kEncodeStageAccelerator};
272 use crate::J2kHtCodeBlockSetEncodeJob;
273
274 #[test]
275 fn legacy_accelerators_decline_explicit_ht_sets_by_default() {
276 let coefficients = [7_i32];
277 let jobs = [J2kHtCodeBlockSetEncodeJob {
278 coefficients: &coefficients,
279 width: 1,
280 height: 1,
281 total_bitplanes: 3,
282 cleanup_bitplane: 1,
283 target_coding_passes: 3,
284 }];
285 let mut accelerator = CpuOnlyJ2kEncodeStageAccelerator;
286
287 assert!(accelerator
288 .encode_ht_code_block_sets(&jobs)
289 .expect("default set hook")
290 .is_none());
291 }
292}