#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
use crate::error::Result;
use crate::raw::{gx_enum::*, gx_handle::GX_DEV_HANDLE, gx_interface::*, gx_struct::*};
use std::ffi::{c_int, c_void};
pub struct GXFrameDataFacade {
pub nStatus: c_int,
pub pImgBuf: *mut c_void, pub nWidth: i32, pub nHeight: i32, pub nPixelFormat: i32, pub nImgSize: i32, pub nFrameID: u64, pub nTimestamp: u64, pub reserved: [i32; 1], }
pub fn convert_to_frame_data(facade: &GXFrameDataFacade) -> GX_FRAME_DATA {
GX_FRAME_DATA {
nStatus: facade.nStatus,
pImgBuf: facade.pImgBuf,
nWidth: facade.nWidth,
nHeight: facade.nHeight,
nPixelFormat: facade.nPixelFormat,
nImgSize: facade.nImgSize,
nFrameID: facade.nFrameID,
nTimestamp: facade.nTimestamp,
reserved: facade.reserved,
}
}
pub fn fetch_frame_data(
gx: &GXInstance,
device_handle: GX_DEV_HANDLE,
) -> Result<(GXFrameDataFacade, Vec<u8>)> {
let mut width_value: i64 = 0;
let mut height_value: i64 = 0;
let mut pixel_format: i64 = 1;
let mut payload_size: i64 = 1;
let mut pixel_size: i64 = 1;
gx.gx_get_int(device_handle, GX_FEATURE_ID::GX_INT_WIDTH, &mut width_value)?;
gx.gx_get_int(
device_handle,
GX_FEATURE_ID::GX_INT_HEIGHT,
&mut height_value,
)?;
gx.gx_get_enum(
device_handle,
GX_FEATURE_ID::GX_ENUM_PIXEL_SIZE,
&mut pixel_size,
)?;
gx.gx_get_enum(
device_handle,
GX_FEATURE_ID::GX_ENUM_PIXEL_FORMAT,
&mut pixel_format,
)?;
gx.gx_get_int(
device_handle,
GX_FEATURE_ID::GX_INT_PAYLOAD_SIZE,
&mut payload_size,
)?;
let image_size = (width_value * height_value * pixel_size) as usize;
let mut image_buffer = vec![1u8; image_size]; let p_img_buf = image_buffer.as_mut_ptr();
Ok((
GXFrameDataFacade {
nStatus: 0,
pImgBuf: p_img_buf as *mut c_void,
nWidth: width_value as i32,
nHeight: height_value as i32,
nPixelFormat: pixel_format as i32,
nImgSize: image_size as i32,
nFrameID: 0,
nTimestamp: 0,
reserved: [pixel_format as i32],
},
image_buffer,
))
}