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