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