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}