Skip to main content

j2k_cuda_runtime/
lib.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2
3//! CUDA codec engine and Driver API runtime used by J2K CUDA adapter crates.
4
5#![deny(unsafe_op_in_unsafe_fn)]
6#![deny(missing_docs)]
7#![warn(unreachable_pub)]
8macro_rules! cuda_kernel_params {
9    ($($arg:ident),+ $(,)?) => {
10        [$(cuda_kernel_param(&mut $arg)),+]
11    };
12}
13
14macro_rules! impl_cuda_htj2k_encoded_status_accessors {
15    () => {
16        /// HTJ2K cleanup segment length in bytes.
17        pub fn cleanup_length(&self) -> u32 {
18            htj2k_encoded_cleanup_length(self.status)
19        }
20
21        /// HTJ2K refinement segment length in bytes.
22        pub fn refinement_length(&self) -> u32 {
23            htj2k_encoded_refinement_length(self.status)
24        }
25
26        /// Number of coding passes in the encoded payload.
27        pub fn num_coding_passes(&self) -> u8 {
28            htj2k_encoded_num_coding_passes(self.status)
29        }
30
31        /// Number of missing most-significant bitplanes.
32        pub fn num_zero_bitplanes(&self) -> u8 {
33            htj2k_encoded_num_zero_bitplanes(self.status)
34        }
35
36        /// Kernel status row downloaded after dispatch.
37        pub fn status(&self) -> CudaHtj2kEncodeStatus {
38            self.status
39        }
40
41        /// CUDA execution counters for the encode dispatch.
42        pub fn execution(&self) -> CudaExecutionStats {
43            self.execution
44        }
45
46        /// CUDA event timings for the encode dispatch.
47        pub fn stage_timings(&self) -> CudaHtj2kEncodeStageTimings {
48            self.stage_timings
49        }
50    };
51}
52
53mod allocation;
54mod build_flags;
55mod bytes;
56mod classic_decode;
57mod context;
58mod driver;
59mod error;
60mod execution;
61mod htj2k_decode;
62mod htj2k_encode;
63mod htj2k_packetize;
64mod j2k_decode;
65mod j2k_encode;
66mod jpeg;
67mod kernels;
68mod memory;
69mod ml;
70#[cfg(test)]
71mod tests;
72mod transcode;
73
74pub use build_flags::transcode_kernels_built;
75pub use classic_decode::{
76    CudaClassicCodeBlockJob, CudaClassicDecodeStageTimings, CudaClassicDecodeTableResources,
77    CudaClassicDecodeTarget, CudaClassicSegment, CudaClassicStatus, CudaQueuedClassicDecode,
78};
79#[cfg(test)]
80pub(crate) use context::CudaKernelName;
81pub use context::{
82    CudaContext, CudaContextDiagnostics, CudaExternalHostOwner, CudaExternalHostReservation,
83    CudaHtj2kCompactEncodedCodeBlock, CudaHtj2kCompactEncodedCodeBlocks,
84};
85pub use error::CudaError;
86#[cfg(test)]
87pub(crate) use execution::CudaEvent;
88pub use execution::{
89    CudaExecutionStats, CudaKernelBatchOutput, CudaKernelContiguousBatchOutput, CudaKernelOutput,
90    CudaPooledKernelOutput, CudaQueuedExecution,
91};
92pub use htj2k_decode::{
93    htj2k_cleanup_multi_descriptor_bytes, CudaHtj2kCleanupTarget, CudaHtj2kCodeBlockJob,
94    CudaHtj2kDecodeOutput, CudaHtj2kDecodeResources, CudaHtj2kDecodeStageTimings,
95    CudaHtj2kDecodeTableResources, CudaHtj2kDecodeTables, CudaHtj2kDequantizeTarget,
96    CudaHtj2kStatus, CudaPooledHtj2kDecodeOutput, CudaQueuedHtj2kCleanup,
97    CudaQueuedHtj2kCleanupGroup,
98};
99pub use htj2k_encode::{
100    CudaHtj2kEncodeCodeBlockJob, CudaHtj2kEncodeCodeBlockRegionJob, CudaHtj2kEncodeResidentTarget,
101    CudaHtj2kEncodeResources, CudaHtj2kEncodeStageTimings, CudaHtj2kEncodeStatus,
102    CudaHtj2kEncodeTables, CudaHtj2kEncodedCodeBlock, CudaHtj2kEncodedCodeBlocks,
103};
104pub use htj2k_packetize::{
105    CudaHtj2kPacketizationBlock, CudaHtj2kPacketizationPacket, CudaHtj2kPacketizationStageTimings,
106    CudaHtj2kPacketizationStatus, CudaHtj2kPacketizationSubband,
107    CudaHtj2kPacketizationSubbandTagState, CudaHtj2kPacketizationTagNodeState,
108    CudaHtj2kPacketizedTile,
109};
110pub use j2k_decode::{
111    CudaJ2kIdwtJob, CudaJ2kIdwtTarget, CudaJ2kInverseMctJob, CudaJ2kRect, CudaJ2kStoreGray16Job,
112    CudaJ2kStoreGray16Target, CudaJ2kStoreGray8Job, CudaJ2kStoreGray8Target,
113    CudaJ2kStoreGrayI16Target, CudaJ2kStoreRgb16Job, CudaJ2kStoreRgb16MctJob, CudaJ2kStoreRgb8Job,
114    CudaJ2kStoreRgb8MctJob, CudaJ2kStoreRgb8MctTarget, CudaJ2kStoreRgbNativeJob,
115    CudaJ2kStoreRgbNativeTarget, CudaJ2kStoreRgbaNativeJob, CudaJ2kStoreRgbaNativeTarget,
116    CudaJ2kStridedInterleavedPixels, CudaQueuedJ2kStoreBatch,
117};
118pub use j2k_encode::{
119    CudaDwt53LevelShape, CudaDwt53Output, CudaDwt97BatchStageTimings, CudaDwt97Output,
120    CudaJ2kDeinterleavedComponents, CudaJ2kQuantizeJob, CudaJ2kQuantizeSubbandRegionJob,
121    CudaJ2kQuantizedSubband, CudaJ2kResidentComponents, CudaJ2kResidentQuantizedSubband,
122    CudaResidentDwt53Output, CudaResidentDwt97Output,
123};
124pub use jpeg::{
125    CudaJpegBaselineEncodeFormat, CudaJpegBaselineEncodeHuffmanTable, CudaJpegBaselineEncodeParams,
126    CudaJpegBaselineEntropyEncodeBatchJob, CudaJpegBaselineEntropyEncodeJob,
127    CudaJpegChunkedEntropyConfig, CudaJpegChunkedEntropyPlan, CudaJpegChunkedEntropyReport,
128    CudaJpegEntropyCheckpoint, CudaJpegEntropyOverflowState, CudaJpegEntropySyncState,
129    CudaJpegHuffmanTable, CudaJpegRgb8DecodePlan, CudaJpegRgb8Sampling,
130};
131pub use memory::{
132    CudaBufferPool, CudaBufferPoolDiagnostics, CudaBufferPoolLimits, CudaBufferPoolTakeTrace,
133    CudaDeviceBuffer, CudaDeviceBufferRange, CudaDeviceBufferView, CudaDeviceBufferViewMut,
134    CudaExternalDeviceBufferViewMut, CudaPinnedUploadOperationGuard,
135    CudaPinnedUploadStagingCheckout, CudaPinnedUploadStagingPoolDiagnostics,
136    CudaPinnedUploadStagingPoolLimits, CudaPooledDeviceBuffer,
137};
138pub use ml::{CudaJ2kMlKernelConfig, CudaJ2kMlLayout, CudaJ2kMlNormalization, CudaJ2kMlSample};
139pub use transcode::{
140    CudaDwt97BatchGeometry, CudaDwt97BatchWithPoolRequest, CudaHtj2k97CodeblockBands,
141    CudaHtj2k97CodeblockBatchWithPoolRequest, CudaHtj2k97DeviceCodeblockBands,
142    CudaHtj2k97I16CodeblockBatchWithPoolRequest, CudaHtj2k97QuantizeParams,
143    CudaTranscodeDwt97Bands, CudaTranscodeReversible53Bands,
144};
145
146#[cfg(test)]
147pub(crate) use bytes::{
148    f32_slice_as_bytes, f32_slice_as_bytes_mut, htj2k_cleanup_multi_jobs_as_bytes,
149    i32_slice_as_bytes, i32_slice_as_bytes_mut,
150};
151#[cfg(test)]
152pub(crate) use context::HTJ2K_UVLC_ENCODE_TABLE_BYTES;
153#[cfg(test)]
154pub(crate) use htj2k_decode::{
155    htj2k_decode_multi_cleanup_dequant_kernel_for_jobs, htj2k_decode_multi_kernel_for_jobs,
156    CudaHtj2kCleanupMultiKernelJob, HTJ2K_STATUS_OK, HTJ2K_STATUS_UNSUPPORTED,
157};
158#[cfg(test)]
159pub(crate) use htj2k_encode::{
160    htj2k_encode_compact_jobs, htj2k_encode_compact_jobs_multi_input, CudaHtj2kEncodeCompactJob,
161    CudaHtj2kEncodeKernelJob, CudaHtj2kEncodeMultiInputKernelJob, HTJ2K_ENCODE_OUTPUT_CAPACITY,
162};
163#[cfg(test)]
164pub(crate) use j2k_decode::{
165    checked_f32_words_byte_len, format_idwt_batch_trace_row, idwt_batch_kernel_mode,
166    idwt_batch_trace_row, idwt_batch_uses_cooperative_53, CudaJ2kIdwtBatchKernelMode,
167    CudaJ2kIdwtMultiKernelJob,
168};
169#[cfg(test)]
170pub(crate) use jpeg::jpeg_entropy_overflow_count;
171#[cfg(test)]
172pub(crate) use memory::{copy_pooled_bytes_to_vec_uninit, pool_fit_buffer_index_by_len};
173#[cfg(test)]
174pub(crate) use transcode::{should_use_pinned_pooled_i16_upload, validate_dct_block_grid};