1use alloc::vec::Vec;
6
7use super::{J2kEncodeDispatchReport, J2kEncodeStageResult};
8use crate::{
9 EncodedHtJ2kCodeBlock, EncodedJ2kCodeBlock, J2kForwardDwt53Job, J2kForwardDwt53Output,
10 J2kForwardDwt97Job, J2kForwardDwt97Output, J2kForwardIctJob, J2kForwardRctJob,
11 J2kHtCodeBlockEncodeJob, J2kHtSubbandEncodeJob, J2kPacketizationEncodeJob,
12 J2kPacketizationProgressionOrder, J2kQuantizeSubbandJob, J2kResidentHtj2kTileEncodeJob,
13 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 fn encode_ht_subband(
208 &mut self,
209 _job: J2kHtSubbandEncodeJob<'_>,
210 ) -> J2kEncodeStageResult<Option<Vec<EncodedHtJ2kCodeBlock>>> {
211 Ok(None)
212 }
213
214 fn encode_htj2k_tile(
216 &mut self,
217 _job: J2kHtj2kTileEncodeJob<'_>,
218 ) -> J2kEncodeStageResult<Option<Vec<u8>>> {
219 Ok(None)
220 }
221
222 fn encode_resident_htj2k_tile(
224 &mut self,
225 _job: J2kResidentHtj2kTileEncodeJob<'_>,
226 ) -> J2kEncodeStageResult<Option<Vec<u8>>> {
227 Ok(None)
228 }
229
230 fn prefer_parallel_cpu_code_block_fallback(&self) -> bool {
232 false
233 }
234
235 fn prefer_parallel_cpu_tile_encode(&self) -> bool {
237 false
238 }
239
240 fn encode_packetization(
242 &mut self,
243 _job: J2kPacketizationEncodeJob<'_>,
244 ) -> J2kEncodeStageResult<Option<Vec<u8>>> {
245 Ok(None)
246 }
247}
248
249#[doc(hidden)]
250impl J2kEncodeStageAccelerator for CpuOnlyJ2kEncodeStageAccelerator {
251 fn prefer_parallel_cpu_code_block_fallback(&self) -> bool {
252 true
253 }
254
255 fn prefer_parallel_cpu_tile_encode(&self) -> bool {
256 true
257 }
258}