libwebp_sys/
demux.rs

1use std::os::raw::*;
2use std::ptr;
3
4#[cfg(feature = "0_5")]
5use crate::decode::*;
6use crate::mux_types::*;
7
8pub const WEBP_DEMUX_ABI_VERSION: c_int = WEBP_DEMUX_ABI_VERSION_INTERNAL;
9
10cfg_if! {
11    if #[cfg(feature = "0_5")] {
12        const WEBP_DEMUX_ABI_VERSION_INTERNAL: c_int = 0x0107;
13    } else {
14        const WEBP_DEMUX_ABI_VERSION_INTERNAL: c_int = 0x0101;
15    }
16}
17
18#[cfg(feature = "extern-types")]
19#[cfg_attr(feature = "__doc_cfg", doc(cfg(feature = "demux")))]
20unsafe extern "C" {
21    pub type WebPDemuxer;
22}
23
24#[cfg(not(feature = "extern-types"))]
25#[cfg_attr(feature = "__doc_cfg", doc(cfg(feature = "demux")))]
26#[repr(C)]
27pub struct WebPDemuxer(c_void);
28
29#[allow(non_camel_case_types)]
30pub type WebPDemuxState = i32;
31
32pub const WEBP_DEMUX_PARSE_ERROR: WebPDemuxState = -1;
33pub const WEBP_DEMUX_PARSING_HEADER: WebPDemuxState = 0;
34pub const WEBP_DEMUX_PARSED_HEADER: WebPDemuxState = 1;
35pub const WEBP_DEMUX_DONE: WebPDemuxState = 2;
36
37#[allow(non_camel_case_types)]
38pub type WebPFormatFeature = u32;
39
40pub const WEBP_FF_FORMAT_FLAGS: WebPFormatFeature = 0;
41pub const WEBP_FF_CANVAS_WIDTH: WebPFormatFeature = 1;
42pub const WEBP_FF_CANVAS_HEIGHT: WebPFormatFeature = 2;
43pub const WEBP_FF_LOOP_COUNT: WebPFormatFeature = 3;
44pub const WEBP_FF_BACKGROUND_COLOR: WebPFormatFeature = 4;
45pub const WEBP_FF_FRAME_COUNT: WebPFormatFeature = 5;
46
47#[repr(C)]
48#[derive(Debug, Clone, Copy)]
49pub struct WebPIterator {
50    pub frame_num: c_int,
51    pub num_frames: c_int,
52    #[cfg(not(feature = "0_5"))]
53    #[deprecated(note = "Removed as of libwebp 0.5.0")]
54    pub fragment_num: c_int,
55    #[cfg(not(feature = "0_5"))]
56    #[deprecated(note = "Removed as of libwebp 0.5.0")]
57    pub num_fragments: c_int,
58    pub x_offset: c_int,
59    pub y_offset: c_int,
60    pub width: c_int,
61    pub height: c_int,
62    pub duration: c_int,
63    pub dispose_method: WebPMuxAnimDispose,
64    pub complete: c_int,
65    pub fragment: WebPData,
66    pub has_alpha: c_int,
67    pub blend_method: WebPMuxAnimBlend,
68    #[doc(hidden)]
69    pub pad: [u32; 2],
70    #[doc(hidden)]
71    pub private_: *mut c_void,
72}
73
74#[repr(C)]
75#[derive(Debug, Clone, Copy)]
76pub struct WebPChunkIterator {
77    pub chunk_num: c_int,
78    pub num_chunks: c_int,
79    pub chunk: WebPData,
80    #[doc(hidden)]
81    pub pad: [u32; 6],
82    #[doc(hidden)]
83    pub private_: *mut c_void,
84}
85
86#[cfg(all(feature = "0_5", feature = "extern-types"))]
87#[cfg_attr(
88    feature = "__doc_cfg",
89    doc(cfg(all(feature = "demux", feature = "0_5")))
90)]
91unsafe extern "C" {
92    pub type WebPAnimDecoder;
93}
94
95#[cfg(all(feature = "0_5", not(feature = "extern-types")))]
96#[cfg_attr(
97    feature = "__doc_cfg",
98    doc(cfg(all(feature = "demux", feature = "0_5")))
99)]
100#[repr(C)]
101pub struct WebPAnimDecoder(c_void);
102
103#[cfg(feature = "0_5")]
104#[repr(C)]
105#[derive(Debug, Clone, Copy)]
106pub struct WebPAnimDecoderOptions {
107    pub color_mode: WEBP_CSP_MODE,
108    pub use_threads: c_int,
109    #[doc(hidden)]
110    pub padding: [u32; 7],
111}
112
113#[cfg(feature = "0_5")]
114#[repr(C)]
115#[derive(Debug, Clone, Copy)]
116pub struct WebPAnimInfo {
117    pub canvas_width: u32,
118    pub canvas_height: u32,
119    pub loop_count: u32,
120    pub bgcolor: u32,
121    pub frame_count: u32,
122    #[doc(hidden)]
123    pub pad: [u32; 4],
124}
125
126unsafe extern "C" {
127    pub fn WebPGetDemuxVersion() -> c_int;
128    #[doc(hidden)]
129    #[must_use]
130    pub fn WebPDemuxInternal(
131        _: *const WebPData,
132        _: c_int,
133        _: *mut WebPDemuxState,
134        _: c_int,
135    ) -> *mut WebPDemuxer;
136    pub fn WebPDemuxDelete(dmux: *mut WebPDemuxer);
137    pub fn WebPDemuxGetI(dmux: *const WebPDemuxer, feature: WebPFormatFeature) -> u32;
138    #[must_use]
139    pub fn WebPDemuxGetFrame(
140        dmux: *const WebPDemuxer,
141        frame_number: c_int,
142        iter: *mut WebPIterator,
143    ) -> c_int;
144    #[must_use]
145    pub fn WebPDemuxNextFrame(iter: *mut WebPIterator) -> c_int;
146    #[must_use]
147    pub fn WebPDemuxPrevFrame(iter: *mut WebPIterator) -> c_int;
148    #[cfg(not(feature = "0_5"))]
149    #[deprecated(note = "Removed as of libwebp 0.5.0")]
150    pub fn WebPDemuxSelectFragment(iter: *mut WebPIterator, fragment_num: c_int) -> c_int;
151    pub fn WebPDemuxReleaseIterator(iter: *mut WebPIterator);
152    #[must_use]
153    pub fn WebPDemuxGetChunk(
154        dmux: *const WebPDemuxer,
155        fourcc: *const c_char,
156        chunk_number: c_int,
157        iter: *mut WebPChunkIterator,
158    ) -> c_int;
159    #[must_use]
160    pub fn WebPDemuxNextChunk(iter: *mut WebPChunkIterator) -> c_int;
161    #[must_use]
162    pub fn WebPDemuxPrevChunk(iter: *mut WebPChunkIterator) -> c_int;
163    pub fn WebPDemuxReleaseChunkIterator(iter: *mut WebPChunkIterator);
164    #[cfg(feature = "0_5")]
165    #[doc(hidden)]
166    #[must_use]
167    pub fn WebPAnimDecoderOptionsInitInternal(_: *mut WebPAnimDecoderOptions, _: c_int) -> c_int;
168    #[cfg(feature = "0_5")]
169    #[doc(hidden)]
170    #[must_use]
171    pub fn WebPAnimDecoderNewInternal(
172        _: *const WebPData,
173        _: *const WebPAnimDecoderOptions,
174        _: c_int,
175    ) -> *mut WebPAnimDecoder;
176    #[cfg(feature = "0_5")]
177    #[must_use]
178    pub fn WebPAnimDecoderGetInfo(dec: *const WebPAnimDecoder, info: *mut WebPAnimInfo) -> c_int;
179    #[cfg(feature = "0_5")]
180    #[must_use]
181    pub fn WebPAnimDecoderGetNext(
182        dec: *mut WebPAnimDecoder,
183        buf: *mut *mut u8,
184        timestamp: *mut c_int,
185    ) -> c_int;
186    #[cfg(feature = "0_5")]
187    #[must_use]
188    pub fn WebPAnimDecoderHasMoreFrames(dec: *const WebPAnimDecoder) -> c_int;
189    #[cfg(feature = "0_5")]
190    pub fn WebPAnimDecoderReset(dec: *mut WebPAnimDecoder);
191    #[cfg(feature = "0_5")]
192    #[must_use]
193    pub fn WebPAnimDecoderGetDemuxer(dec: *const WebPAnimDecoder) -> *const WebPDemuxer;
194    #[cfg(feature = "0_5")]
195    pub fn WebPAnimDecoderDelete(dec: *mut WebPAnimDecoder);
196}
197
198#[allow(non_snake_case)]
199#[must_use]
200#[inline]
201pub unsafe extern "C" fn WebPDemux(data: *const WebPData) -> *mut WebPDemuxer {
202    unsafe { WebPDemuxInternal(data, 0, ptr::null_mut(), WEBP_DEMUX_ABI_VERSION) }
203}
204
205#[allow(non_snake_case)]
206#[must_use]
207#[inline]
208pub unsafe extern "C" fn WebPDemuxPartial(
209    data: *const WebPData,
210    state: *mut WebPDemuxState,
211) -> *mut WebPDemuxer {
212    unsafe { WebPDemuxInternal(data, 1, state, WEBP_DEMUX_ABI_VERSION) }
213}
214
215#[cfg(feature = "0_5")]
216#[allow(non_snake_case)]
217#[inline]
218#[must_use]
219pub unsafe extern "C" fn WebPAnimDecoderOptionsInit(
220    dec_options: *mut WebPAnimDecoderOptions,
221) -> c_int {
222    unsafe { WebPAnimDecoderOptionsInitInternal(dec_options, WEBP_DEMUX_ABI_VERSION) }
223}
224
225#[cfg(feature = "0_5")]
226#[allow(non_snake_case)]
227#[must_use]
228#[inline]
229pub unsafe extern "C" fn WebPAnimDecoderNew(
230    webp_data: *const WebPData,
231    dec_options: *const WebPAnimDecoderOptions,
232) -> *mut WebPAnimDecoder {
233    unsafe { WebPAnimDecoderNewInternal(webp_data, dec_options, WEBP_DEMUX_ABI_VERSION) }
234}