j2k-cuda-runtime 0.7.2

CUDA codec engine and Driver API runtime for j2k device adapters
Documentation
use crate::{
    classic_decode::{
        CudaClassicKernelJob, CudaClassicKernelSegment, CudaClassicKernelTables, CudaClassicStatus,
    },
    error::CudaError,
    htj2k_decode::{
        CudaHtj2kCleanupMultiKernelJob, CudaHtj2kCodeBlockKernelJob, CudaHtj2kDequantizeKernelJob,
        CudaHtj2kStatus,
    },
    htj2k_encode::{
        CudaHtj2kEncodeCompactJob, CudaHtj2kEncodeKernelJob, CudaHtj2kEncodeMultiInputKernelJob,
        CudaHtj2kEncodeStatus,
    },
    htj2k_packetize::{
        CudaHtj2kPacketizationBlock, CudaHtj2kPacketizationKernelPacket,
        CudaHtj2kPacketizationStatus, CudaHtj2kPacketizationSubband,
        CudaHtj2kPacketizationSubbandTagState, CudaHtj2kPacketizationTagNodeState,
    },
    j2k_decode::{
        CudaJ2kIdwtJob, CudaJ2kIdwtMultiKernelJob, CudaJ2kInverseMctJob, CudaJ2kStoreGray16Job,
        CudaJ2kStoreGray8Job, CudaJ2kStoreRgb16Job, CudaJ2kStoreRgb16MctJob, CudaJ2kStoreRgb8Job,
        CudaJ2kStoreRgb8MctBatchJob,
    },
    jpeg::{
        CudaJpegBaselineEncodeHuffmanTable, CudaJpegBaselineEncodeParams,
        CudaJpegBaselineEncodeStatus, CudaJpegDecodeStatus, CudaJpegEntropyCheckpoint,
        CudaJpegEntropyOverflowState, CudaJpegEntropySyncState, CudaJpegHuffmanTable,
    },
};
use j2k_core::accelerator::GpuAbi;

mod abi;

macro_rules! gpu_ref_bytes {
    ($($(#[$attr:meta])* $name:ident: $ty:ty;)+) => {
        $(
            $(#[$attr])*
            pub(crate) fn $name(value: &$ty) -> &[u8] {
                <$ty as GpuAbi>::as_bytes(value)
            }
        )+
    };
}

macro_rules! gpu_slice_bytes {
    ($($(#[$attr:meta])* $name:ident: $ty:ty;)+) => {
        $(
            $(#[$attr])*
            pub(crate) fn $name(values: &[$ty]) -> &[u8] {
                <$ty as GpuAbi>::slice_as_bytes(values)
            }
        )+
    };
}

macro_rules! gpu_slice_bytes_mut {
    ($($(#[$attr:meta])* $name:ident: $ty:ty;)+) => {
        $(
            $(#[$attr])*
            pub(crate) fn $name(values: &mut [$ty]) -> &mut [u8] {
                <$ty as GpuAbi>::slice_as_bytes_mut(values)
            }
        )+
    };
}

gpu_ref_bytes! {
    #[cfg_attr(
        not(feature = "cuda-oxide-jpeg-decode"),
        expect(dead_code, reason = "helper is used only by the JPEG decode kernel feature")
    )]
    cuda_jpeg_huffman_table_as_bytes: CudaJpegHuffmanTable;
    #[cfg_attr(
        not(feature = "cuda-oxide-jpeg-encode"),
        expect(dead_code, reason = "helper is used only by the JPEG encode kernel feature")
    )]
    cuda_jpeg_baseline_encode_huffman_table_as_bytes: CudaJpegBaselineEncodeHuffmanTable;
    store_gray8_job_as_bytes: CudaJ2kStoreGray8Job;
    store_gray16_job_as_bytes: CudaJ2kStoreGray16Job;
    inverse_mct_job_as_bytes: CudaJ2kInverseMctJob;
    store_rgb8_job_as_bytes: CudaJ2kStoreRgb8Job;
    store_rgb16_job_as_bytes: CudaJ2kStoreRgb16Job;
    store_rgb16_mct_job_as_bytes: CudaJ2kStoreRgb16MctJob;
    idwt_job_as_bytes: CudaJ2kIdwtJob;
    classic_tables_as_bytes: CudaClassicKernelTables;
}

gpu_slice_bytes! {
    f32_slice_as_bytes: f32;
    i16_slice_as_bytes: i16;
    i32_slice_as_bytes: i32;
    u16_slice_as_bytes: u16;
    #[cfg_attr(not(feature = "cuda-oxide-jpeg-decode"), expect(dead_code, reason = "helper is used only by the JPEG decode kernel feature"))]
    cuda_jpeg_entropy_checkpoints_as_bytes: CudaJpegEntropyCheckpoint;
    #[cfg_attr(not(feature = "cuda-oxide-jpeg-decode"), expect(dead_code, reason = "helper is used only by the JPEG decode kernel feature"))]
    cuda_jpeg_decode_statuses_as_bytes: CudaJpegDecodeStatus;
    #[cfg_attr(not(feature = "cuda-oxide-jpeg-decode"), expect(dead_code, reason = "helper is used only by the JPEG decode kernel feature"))]
    cuda_jpeg_entropy_sync_states_as_bytes: CudaJpegEntropySyncState;
    #[cfg_attr(not(feature = "cuda-oxide-jpeg-decode"), expect(dead_code, reason = "helper is used only by the JPEG decode kernel feature"))]
    cuda_jpeg_entropy_overflow_states_as_bytes: CudaJpegEntropyOverflowState;
    #[cfg_attr(not(feature = "cuda-oxide-jpeg-encode"), expect(dead_code, reason = "helper is used only by the JPEG encode kernel feature"))]
    cuda_jpeg_baseline_encode_params_as_bytes: CudaJpegBaselineEncodeParams;
    #[cfg_attr(not(feature = "cuda-oxide-jpeg-encode"), expect(dead_code, reason = "helper is used only by the JPEG encode kernel feature"))]
    cuda_jpeg_baseline_encode_statuses_as_bytes: CudaJpegBaselineEncodeStatus;
    store_rgb8_mct_batch_jobs_as_bytes: CudaJ2kStoreRgb8MctBatchJob;
    htj2k_encode_jobs_as_bytes: CudaHtj2kEncodeKernelJob;
    htj2k_encode_multi_input_jobs_as_bytes: CudaHtj2kEncodeMultiInputKernelJob;
    htj2k_encode_compact_jobs_as_bytes: CudaHtj2kEncodeCompactJob;
    htj2k_packetization_packets_as_bytes: CudaHtj2kPacketizationKernelPacket;
    htj2k_packetization_subbands_as_bytes: CudaHtj2kPacketizationSubband;
    htj2k_packetization_blocks_as_bytes: CudaHtj2kPacketizationBlock;
    htj2k_packetization_subband_tag_states_as_bytes: CudaHtj2kPacketizationSubbandTagState;
    htj2k_packetization_tag_nodes_as_bytes: CudaHtj2kPacketizationTagNodeState;
    htj2k_packetization_statuses_as_bytes: CudaHtj2kPacketizationStatus;
    htj2k_jobs_as_bytes: CudaHtj2kCodeBlockKernelJob;
    htj2k_cleanup_multi_jobs_as_bytes: CudaHtj2kCleanupMultiKernelJob;
    htj2k_dequantize_jobs_as_bytes: CudaHtj2kDequantizeKernelJob;
    idwt_multi_jobs_as_bytes: CudaJ2kIdwtMultiKernelJob;
    classic_jobs_as_bytes: CudaClassicKernelJob;
    classic_segments_as_bytes: CudaClassicKernelSegment;
}

gpu_slice_bytes_mut! {
    f32_slice_as_bytes_mut: f32;
    i32_slice_as_bytes_mut: i32;
    #[cfg_attr(not(feature = "cuda-oxide-jpeg-decode"), expect(dead_code, reason = "helper is used only by the JPEG decode kernel feature"))]
    cuda_jpeg_decode_statuses_as_bytes_mut: CudaJpegDecodeStatus;
    #[cfg_attr(not(feature = "cuda-oxide-jpeg-decode"), expect(dead_code, reason = "helper is used only by the JPEG decode kernel feature"))]
    cuda_jpeg_entropy_sync_states_as_bytes_mut: CudaJpegEntropySyncState;
    #[cfg_attr(not(feature = "cuda-oxide-jpeg-decode"), expect(dead_code, reason = "helper is used only by the JPEG decode kernel feature"))]
    cuda_jpeg_entropy_overflow_states_as_bytes_mut: CudaJpegEntropyOverflowState;
    #[cfg_attr(not(feature = "cuda-oxide-jpeg-encode"), expect(dead_code, reason = "helper is used only by the JPEG encode kernel feature"))]
    cuda_jpeg_baseline_encode_statuses_as_bytes_mut: CudaJpegBaselineEncodeStatus;
    htj2k_encode_statuses_as_bytes_mut: CudaHtj2kEncodeStatus;
    htj2k_packetization_statuses_as_bytes_mut: CudaHtj2kPacketizationStatus;
    htj2k_statuses_as_bytes_mut: CudaHtj2kStatus;
    classic_statuses_as_bytes_mut: CudaClassicStatus;
}

pub(crate) fn htj2k_encode_statuses_byte_len(count: usize) -> Result<usize, CudaError> {
    count
        .checked_mul(std::mem::size_of::<CudaHtj2kEncodeStatus>())
        .ok_or(CudaError::LengthTooLarge { len: count })
}

pub(crate) fn htj2k_statuses_byte_len(count: usize) -> Result<usize, CudaError> {
    count
        .checked_mul(std::mem::size_of::<CudaHtj2kStatus>())
        .ok_or(CudaError::LengthTooLarge { len: count })
}