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, nvtiffFileInfo, nvtiffImageInfo, nvtiffPhotometricInt,
15        nvtiffPlanarConfig, nvtiffSampleFormat, nvtiffStatus_t, nvtiffStream, nvtiffStreamCreate,
16        nvtiffStreamGetFileInfo, nvtiffStreamGetImageInfo, 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 tiff_stream: *mut *mut nvtiffStream = stream.as_mut_ptr();
28        unsafe {
29            let status_create: nvtiffStatus_t::Type = nvtiffStreamCreate(tiff_stream);
30            dbg!(status_create); // should be 0=SUCCESS
31            assert_eq!(status_create, nvtiffStatus_t::NVTIFF_STATUS_SUCCESS);
32        }
33
34        // Step 1: Parse the TIFF file from disk
35        let tiff_cstr = std::ffi::CString::new("images/bali_notiles.tif").unwrap();
36        let tiff_path: *const std::os::raw::c_char = tiff_cstr.as_ptr();
37        unsafe {
38            let status_parse: u32 = nvtiffStreamParseFromFile(tiff_path, *tiff_stream);
39            dbg!(status_parse); // should be 0=SUCCESS
40            assert_eq!(status_parse, nvtiffStatus_t::NVTIFF_STATUS_SUCCESS);
41        }
42
43        // Step 2: Extract file-level metadata information from the TIFF stream
44        let mut file_info = nvtiffFileInfo::default();
45        unsafe {
46            let status_fileinfo: u32 = nvtiffStreamGetFileInfo(*tiff_stream, &raw mut file_info);
47            assert_eq!(status_fileinfo, nvtiffStatus_t::NVTIFF_STATUS_SUCCESS);
48            dbg!(file_info);
49            assert_eq!(
50                file_info,
51                nvtiffFileInfo {
52                    num_images: 1,
53                    image_width: 725,
54                    image_height: 489,
55                    photometric_int: nvtiffPhotometricInt::NVTIFF_PHOTOMETRIC_RGB, // 2
56                    planar_config: nvtiffPlanarConfig::NVTIFF_PLANARCONFIG_CONTIG, // 1
57                    samples_per_pixel: 3,
58                    bits_per_pixel: 24,
59                    bits_per_sample: [8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
60                    sample_format: [
61                        nvtiffSampleFormat::NVTIFF_SAMPLEFORMAT_UINT, // 1
62                        nvtiffSampleFormat::NVTIFF_SAMPLEFORMAT_UINT, // 1
63                        nvtiffSampleFormat::NVTIFF_SAMPLEFORMAT_UINT, // 1
64                        0,
65                        0,
66                        0,
67                        0,
68                        0,
69                        0,
70                        0,
71                        0,
72                        0,
73                        0,
74                        0,
75                        0,
76                        0
77                    ],
78                }
79            );
80        }
81
82        // Step 3: Extract image-level metadata information from the TIFF stream
83        let mut image_info = nvtiffImageInfo::default();
84        unsafe {
85            let status_imageinfo: u32 =
86                nvtiffStreamGetImageInfo(*tiff_stream, 0, &raw mut image_info);
87            assert_eq!(status_imageinfo, nvtiffStatus_t::NVTIFF_STATUS_SUCCESS);
88            dbg!(image_info);
89            assert_eq!(image_info.image_type, 0);
90            assert_eq!(
91                image_info.compression,
92                nvtiffCompression::NVTIFF_COMPRESSION_LZW
93            );
94        }
95    }
96}