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, nvtiffStreamGetImageInfo,
16        nvtiffStreamGetNextIFDOffset, nvtiffStreamOpenFromFile,
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        // Step 1: Parse the TIFF file from disk
30        let tiff_cstr = std::ffi::CString::new("images/bali_notiles.tif").unwrap();
31        let tiff_path: *const std::os::raw::c_char = tiff_cstr.as_ptr();
32
33        let status_open: u32 = unsafe { nvtiffStreamOpenFromFile(tiff_path, &raw mut tiff_stream) };
34        dbg!(status_open); // should be 0=SUCCESS
35        assert_eq!(status_open, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
36
37        // Step 2: Extract file-level metadata information from the TIFF stream
38        let mut ifd_offset: usize = 0; // start from IFD 0
39
40        let status_nextifdoffset: u32 =
41            unsafe { nvtiffStreamGetNextIFDOffset(tiff_stream, ifd_offset, &raw mut ifd_offset) };
42        assert_eq!(status_nextifdoffset, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
43        dbg!(status_nextifdoffset);
44        assert_eq!(ifd_offset, 18_446_744_073_709_551_615);
45
46        // Step 3: Extract image-level metadata information from the TIFF stream
47        let mut image_info = nvtiffImageInfo::default();
48
49        let status_imageinfo: u32 =
50            unsafe { nvtiffStreamGetImageInfo(tiff_stream, 0, &raw mut image_info) };
51        assert_eq!(status_imageinfo, nvtiffStatus::NVTIFF_STATUS_SUCCESS);
52        dbg!(image_info);
53        assert_eq!(
54            image_info,
55            nvtiffImageInfo {
56                image_type: 0, // nvtiffImageType::NVTIFF_IMAGETYPE_?,
57                image_width: 725,
58                image_height: 489,
59                compression: nvtiffCompression::NVTIFF_COMPRESSION_LZW, // 5
60                photometric_int: nvtiffPhotometricInt::NVTIFF_PHOTOMETRIC_RGB, // 2
61                planar_config: nvtiffPlanarConfig::NVTIFF_PLANARCONFIG_CONTIG, // 1
62                samples_per_pixel: 3,
63                bits_per_pixel: 24,
64                bits_per_sample: [8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
65                sample_format: [
66                    nvtiffSampleFormat::NVTIFF_SAMPLEFORMAT_UINT, // 1
67                    nvtiffSampleFormat::NVTIFF_SAMPLEFORMAT_UINT, // 1
68                    nvtiffSampleFormat::NVTIFF_SAMPLEFORMAT_UINT, // 1
69                    0,
70                    0,
71                    0,
72                    0,
73                    0,
74                    0,
75                    0,
76                    0,
77                    0,
78                    0,
79                    0,
80                    0,
81                    0
82                ],
83            }
84        );
85    }
86}