Skip to main content

nvtiff_sys/
lib.rs

1#![doc = include_str!("../README.md")]
2#![allow(non_upper_case_globals)]
3#![allow(non_camel_case_types)]
4#![allow(non_snake_case)]
5
6pub mod nvtiff;
7pub mod result;
8pub use nvtiff::*;
9pub use result::{NvTiffResult, NvTiffResultCheck};
10
11#[cfg(test)]
12mod tests {
13    use crate::{
14        nvtiffCompression, nvtiffImageInfo, nvtiffPhotometricInt, nvtiffPlanarConfig,
15        nvtiffSampleFormat, nvtiffStatus, nvtiffStream, nvtiffStreamCreate,
16        nvtiffStreamGetImageInfo, nvtiffStreamGetNumImages, nvtiffStreamParseFromFile,
17    };
18
19    #[test]
20    fn test_nvtiff_get_metadata_info() {
21        // nvTIFF decoding!!
22        // https://docs.nvidia.com/cuda/nvtiff/quickstartguide.html#nvtiff-decode
23
24        // Step 0: Create bitstream
25        // https://stackoverflow.com/questions/43350167/how-do-i-initialize-an-opaque-c-struct-when-using-rust-ffi
26        let mut stream = std::mem::MaybeUninit::uninit();
27        let mut tiff_stream: *mut nvtiffStream = stream.as_mut_ptr();
28
29        let status_create: nvtiffStatus::Type = unsafe { nvtiffStreamCreate(&raw mut tiff_stream) };
30        dbg!(status_create); // should be 0=SUCCESS
31        assert_eq!(status_create, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
32
33        // Step 1: Parse the TIFF file from disk
34        let tiff_cstr = std::ffi::CString::new("images/bali_notiles.tif").unwrap();
35        let tiff_path: *const std::os::raw::c_char = tiff_cstr.as_ptr();
36
37        let status_parse: u32 = unsafe { nvtiffStreamParseFromFile(tiff_path, tiff_stream) };
38        dbg!(status_parse); // should be 0=SUCCESS
39        assert_eq!(status_parse, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
40
41        // Step 2: Extract file-level metadata information from the TIFF stream
42        let mut num_images: u32 = 0;
43
44        let status_numimages: u32 =
45            unsafe { nvtiffStreamGetNumImages(tiff_stream, &raw mut num_images) };
46        assert_eq!(status_numimages, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
47        dbg!(status_numimages);
48        assert_eq!(num_images, 1);
49
50        // Step 3: Extract image-level metadata information from the TIFF stream
51        let mut image_info = nvtiffImageInfo::default();
52
53        let status_imageinfo: u32 =
54            unsafe { nvtiffStreamGetImageInfo(tiff_stream, 0, &raw mut image_info) };
55        assert_eq!(status_imageinfo, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
56        dbg!(image_info);
57        assert_eq!(
58            image_info,
59            nvtiffImageInfo {
60                image_type: 0, // nvtiffImageType::NVTIFF_IMAGETYPE_?,
61                image_width: 725,
62                image_height: 489,
63                compression: nvtiffCompression::NVTIFF_COMPRESSION_LZW, // 5
64                photometric_int: nvtiffPhotometricInt::NVTIFF_PHOTOMETRIC_RGB, // 2
65                planar_config: nvtiffPlanarConfig::NVTIFF_PLANARCONFIG_CONTIG, // 1
66                samples_per_pixel: 3,
67                bits_per_pixel: 24,
68                bits_per_sample: [8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
69                sample_format: [
70                    nvtiffSampleFormat::NVTIFF_SAMPLEFORMAT_UINT, // 1
71                    nvtiffSampleFormat::NVTIFF_SAMPLEFORMAT_UINT, // 1
72                    nvtiffSampleFormat::NVTIFF_SAMPLEFORMAT_UINT, // 1
73                    0,
74                    0,
75                    0,
76                    0,
77                    0,
78                    0,
79                    0,
80                    0,
81                    0,
82                    0,
83                    0,
84                    0,
85                    0
86                ],
87            }
88        );
89    }
90}