Files
MetaCrate/crates/libremetaverse-openjpeg/src/ffi.rs
Chili Palmer 16501f2331
Some checks failed
JPEG 2000 feature / linux (push) Has been cancelled
JPEG 2000 feature / macos (push) Has been cancelled
JPEG 2000 feature / windows (push) Has been cancelled
Implement optional JPEG2000 codec adapter (#40)
2026-08-09 03:42:18 +00:00

280 lines
8.5 KiB
Rust

//! Minimal `OpenJPEG` 2.5 public ABI used by this crate.
//!
//! These declarations follow `openjpeg.h` from `OpenJPEG` 2.5.4. Keeping the
//! bindings here avoids requiring libclang merely to enable the codec.
use std::ffi::{c_char, c_int, c_uint, c_void};
pub type OPJ_BOOL = c_int;
pub type OPJ_CHAR = c_char;
pub type OPJ_UINT16 = u16;
pub type OPJ_INT32 = i32;
pub type OPJ_UINT32 = u32;
pub type OPJ_UINT64 = u64;
pub type OPJ_OFF_T = i64;
pub type OPJ_SIZE_T = usize;
pub type OPJ_RSIZ_CAPABILITIES = u32;
pub type OPJ_CINEMA_MODE = u32;
pub type OPJ_PROG_ORDER = i32;
#[repr(transparent)]
#[derive(Debug, Copy, Clone)]
pub struct OPJ_COLOR_SPACE(i32);
impl OPJ_COLOR_SPACE {
pub const OPJ_CLRSPC_SRGB: Self = Self(1);
pub const OPJ_CLRSPC_GRAY: Self = Self(2);
}
#[repr(transparent)]
#[derive(Debug, Copy, Clone)]
pub struct OPJ_CODEC_FORMAT(i32);
impl OPJ_CODEC_FORMAT {
pub const OPJ_CODEC_J2K: Self = Self(0);
pub const OPJ_CODEC_JP2: Self = Self(2);
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct opj_poc_t {
pub resno0: OPJ_UINT32,
pub compno0: OPJ_UINT32,
pub layno1: OPJ_UINT32,
pub resno1: OPJ_UINT32,
pub compno1: OPJ_UINT32,
pub layno0: OPJ_UINT32,
pub precno0: OPJ_UINT32,
pub precno1: OPJ_UINT32,
pub prg1: OPJ_PROG_ORDER,
pub prg: OPJ_PROG_ORDER,
pub progorder: [OPJ_CHAR; 5],
pub tile: OPJ_UINT32,
pub tx0: OPJ_INT32,
pub tx1: OPJ_INT32,
pub ty0: OPJ_INT32,
pub ty1: OPJ_INT32,
pub layS: OPJ_UINT32,
pub resS: OPJ_UINT32,
pub compS: OPJ_UINT32,
pub prcS: OPJ_UINT32,
pub layE: OPJ_UINT32,
pub resE: OPJ_UINT32,
pub compE: OPJ_UINT32,
pub prcE: OPJ_UINT32,
pub txS: OPJ_UINT32,
pub txE: OPJ_UINT32,
pub tyS: OPJ_UINT32,
pub tyE: OPJ_UINT32,
pub dx: OPJ_UINT32,
pub dy: OPJ_UINT32,
pub lay_t: OPJ_UINT32,
pub res_t: OPJ_UINT32,
pub comp_t: OPJ_UINT32,
pub prc_t: OPJ_UINT32,
pub tx0_t: OPJ_UINT32,
pub ty0_t: OPJ_UINT32,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct opj_cparameters_t {
pub tile_size_on: OPJ_BOOL,
pub cp_tx0: c_int,
pub cp_ty0: c_int,
pub cp_tdx: c_int,
pub cp_tdy: c_int,
pub cp_disto_alloc: c_int,
pub cp_fixed_alloc: c_int,
pub cp_fixed_quality: c_int,
pub cp_matrice: *mut c_int,
pub cp_comment: *mut c_char,
pub csty: c_int,
pub prog_order: OPJ_PROG_ORDER,
pub POC: [opj_poc_t; 32],
pub numpocs: OPJ_UINT32,
pub tcp_numlayers: c_int,
pub tcp_rates: [f32; 100],
pub tcp_distoratio: [f32; 100],
pub numresolution: c_int,
pub cblockw_init: c_int,
pub cblockh_init: c_int,
pub mode: c_int,
pub irreversible: c_int,
pub roi_compno: c_int,
pub roi_shift: c_int,
pub res_spec: c_int,
pub prcw_init: [c_int; 33],
pub prch_init: [c_int; 33],
pub infile: [c_char; 4096],
pub outfile: [c_char; 4096],
pub index_on: c_int,
pub index: [c_char; 4096],
pub image_offset_x0: c_int,
pub image_offset_y0: c_int,
pub subsampling_dx: c_int,
pub subsampling_dy: c_int,
pub decod_format: c_int,
pub cod_format: c_int,
pub jpwl_epc_on: OPJ_BOOL,
pub jpwl_hprot_MH: c_int,
pub jpwl_hprot_TPH_tileno: [c_int; 16],
pub jpwl_hprot_TPH: [c_int; 16],
pub jpwl_pprot_tileno: [c_int; 16],
pub jpwl_pprot_packno: [c_int; 16],
pub jpwl_pprot: [c_int; 16],
pub jpwl_sens_size: c_int,
pub jpwl_sens_addr: c_int,
pub jpwl_sens_range: c_int,
pub jpwl_sens_MH: c_int,
pub jpwl_sens_TPH_tileno: [c_int; 16],
pub jpwl_sens_TPH: [c_int; 16],
pub cp_cinema: OPJ_CINEMA_MODE,
pub max_comp_size: c_int,
pub cp_rsiz: OPJ_RSIZ_CAPABILITIES,
pub tp_on: c_char,
pub tp_flag: c_char,
pub tcp_mct: c_char,
pub jpip_on: OPJ_BOOL,
pub mct_data: *mut c_void,
pub max_cs_size: c_int,
pub rsiz: OPJ_UINT16,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct opj_dparameters_t {
pub cp_reduce: OPJ_UINT32,
pub cp_layer: OPJ_UINT32,
pub infile: [c_char; 4096],
pub outfile: [c_char; 4096],
pub decod_format: c_int,
pub cod_format: c_int,
pub DA_x0: OPJ_UINT32,
pub DA_x1: OPJ_UINT32,
pub DA_y0: OPJ_UINT32,
pub DA_y1: OPJ_UINT32,
pub m_verbose: OPJ_BOOL,
pub tile_index: OPJ_UINT32,
pub nb_tile_to_decode: OPJ_UINT32,
pub jpwl_correct: OPJ_BOOL,
pub jpwl_exp_comps: c_int,
pub jpwl_max_tiles: c_int,
pub flags: c_uint,
}
pub type opj_codec_t = *mut c_void;
pub type opj_stream_t = *mut c_void;
pub type opj_stream_read_fn =
Option<unsafe extern "C" fn(*mut c_void, OPJ_SIZE_T, *mut c_void) -> OPJ_SIZE_T>;
pub type opj_stream_write_fn =
Option<unsafe extern "C" fn(*mut c_void, OPJ_SIZE_T, *mut c_void) -> OPJ_SIZE_T>;
pub type opj_stream_skip_fn = Option<unsafe extern "C" fn(OPJ_OFF_T, *mut c_void) -> OPJ_OFF_T>;
pub type opj_stream_seek_fn = Option<unsafe extern "C" fn(OPJ_OFF_T, *mut c_void) -> OPJ_BOOL>;
pub type opj_stream_free_user_data_fn = Option<unsafe extern "C" fn(*mut c_void)>;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct opj_image_comp_t {
pub dx: OPJ_UINT32,
pub dy: OPJ_UINT32,
pub w: OPJ_UINT32,
pub h: OPJ_UINT32,
pub x0: OPJ_UINT32,
pub y0: OPJ_UINT32,
pub prec: OPJ_UINT32,
pub bpp: OPJ_UINT32,
pub sgnd: OPJ_UINT32,
pub resno_decoded: OPJ_UINT32,
pub factor: OPJ_UINT32,
pub data: *mut OPJ_INT32,
pub alpha: OPJ_UINT16,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct opj_image_t {
pub x0: OPJ_UINT32,
pub y0: OPJ_UINT32,
pub x1: OPJ_UINT32,
pub y1: OPJ_UINT32,
pub numcomps: OPJ_UINT32,
pub color_space: OPJ_COLOR_SPACE,
pub comps: *mut opj_image_comp_t,
pub icc_profile_buf: *mut u8,
pub icc_profile_len: OPJ_UINT32,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct opj_image_cmptparm_t {
pub dx: OPJ_UINT32,
pub dy: OPJ_UINT32,
pub w: OPJ_UINT32,
pub h: OPJ_UINT32,
pub x0: OPJ_UINT32,
pub y0: OPJ_UINT32,
pub prec: OPJ_UINT32,
pub bpp: OPJ_UINT32,
pub sgnd: OPJ_UINT32,
}
unsafe extern "C" {
pub fn opj_version() -> *const c_char;
pub fn opj_stream_default_create(is_input: OPJ_BOOL) -> *mut opj_stream_t;
pub fn opj_stream_destroy(stream: *mut opj_stream_t);
pub fn opj_stream_set_read_function(stream: *mut opj_stream_t, function: opj_stream_read_fn);
pub fn opj_stream_set_write_function(stream: *mut opj_stream_t, function: opj_stream_write_fn);
pub fn opj_stream_set_skip_function(stream: *mut opj_stream_t, function: opj_stream_skip_fn);
pub fn opj_stream_set_seek_function(stream: *mut opj_stream_t, function: opj_stream_seek_fn);
pub fn opj_stream_set_user_data(
stream: *mut opj_stream_t,
data: *mut c_void,
free_function: opj_stream_free_user_data_fn,
);
pub fn opj_stream_set_user_data_length(stream: *mut opj_stream_t, length: OPJ_UINT64);
pub fn opj_create_decompress(format: OPJ_CODEC_FORMAT) -> *mut opj_codec_t;
pub fn opj_create_compress(format: OPJ_CODEC_FORMAT) -> *mut opj_codec_t;
pub fn opj_destroy_codec(codec: *mut opj_codec_t);
pub fn opj_set_default_decoder_parameters(parameters: *mut opj_dparameters_t);
pub fn opj_setup_decoder(
codec: *mut opj_codec_t,
parameters: *mut opj_dparameters_t,
) -> OPJ_BOOL;
pub fn opj_decoder_set_strict_mode(codec: *mut opj_codec_t, strict: OPJ_BOOL) -> OPJ_BOOL;
pub fn opj_read_header(
stream: *mut opj_stream_t,
codec: *mut opj_codec_t,
image: *mut *mut opj_image_t,
) -> OPJ_BOOL;
pub fn opj_decode(
codec: *mut opj_codec_t,
stream: *mut opj_stream_t,
image: *mut opj_image_t,
) -> OPJ_BOOL;
pub fn opj_end_decompress(codec: *mut opj_codec_t, stream: *mut opj_stream_t) -> OPJ_BOOL;
pub fn opj_image_create(
component_count: OPJ_UINT32,
component_parameters: *mut opj_image_cmptparm_t,
color_space: OPJ_COLOR_SPACE,
) -> *mut opj_image_t;
pub fn opj_image_destroy(image: *mut opj_image_t);
pub fn opj_set_default_encoder_parameters(parameters: *mut opj_cparameters_t);
pub fn opj_setup_encoder(
codec: *mut opj_codec_t,
parameters: *mut opj_cparameters_t,
image: *mut opj_image_t,
) -> OPJ_BOOL;
pub fn opj_start_compress(
codec: *mut opj_codec_t,
image: *mut opj_image_t,
stream: *mut opj_stream_t,
) -> OPJ_BOOL;
pub fn opj_encode(codec: *mut opj_codec_t, stream: *mut opj_stream_t) -> OPJ_BOOL;
pub fn opj_end_compress(codec: *mut opj_codec_t, stream: *mut opj_stream_t) -> OPJ_BOOL;
}