1use std::os::raw::*;
2
3#[cfg(feature = "0_5")]
4use crate::encode::{WebPConfig, WebPPicture};
5use crate::mux_types::*;
6
7pub const WEBP_MUX_ABI_VERSION: c_int = WEBP_MUX_ABI_VERSION_INTERNAL;
8
9cfg_if! {
10 if #[cfg(feature = "1_4")] {
11 const WEBP_MUX_ABI_VERSION_INTERNAL: c_int = 0x0109;
12 } else if #[cfg(feature = "0_6")] {
13 const WEBP_MUX_ABI_VERSION_INTERNAL: c_int = 0x0108;
14 } else if #[cfg(feature = "0_5")] {
15 const WEBP_MUX_ABI_VERSION_INTERNAL: c_int = 0x0106;
16 } else {
17 const WEBP_MUX_ABI_VERSION_INTERNAL: c_int = 0x0101;
18 }
19}
20
21#[cfg(feature = "extern-types")]
22#[cfg_attr(feature = "__doc_cfg", doc(cfg(feature = "mux")))]
23unsafe extern "C" {
24 pub type WebPMux;
25}
26
27#[cfg(not(feature = "extern-types"))]
28#[cfg_attr(feature = "__doc_cfg", doc(cfg(feature = "mux")))]
29#[repr(C)]
30pub struct WebPMux(c_void);
31
32#[allow(non_camel_case_types)]
33pub type WebPMuxError = i32;
35
36pub const WEBP_MUX_OK: WebPMuxError = 1;
37pub const WEBP_MUX_NOT_FOUND: WebPMuxError = 0;
38pub const WEBP_MUX_INVALID_ARGUMENT: WebPMuxError = -1;
39pub const WEBP_MUX_BAD_DATA: WebPMuxError = -2;
40pub const WEBP_MUX_MEMORY_ERROR: WebPMuxError = -3;
41pub const WEBP_MUX_NOT_ENOUGH_DATA: WebPMuxError = -4;
42
43#[allow(non_camel_case_types)]
44pub type WebPChunkId = u32;
45
46pub const WEBP_CHUNK_VP8X: WebPChunkId = 0;
47pub const WEBP_CHUNK_ICCP: WebPChunkId = 1;
48pub const WEBP_CHUNK_ANIM: WebPChunkId = 2;
49pub const WEBP_CHUNK_ANMF: WebPChunkId = 3;
50#[cfg(not(feature = "0_6"))]
51#[deprecated(note = "Removed as of libwebp 0.6.0")]
52pub const WEBP_CHUNK_FRGM: WebPChunkId = 4;
53#[cfg(feature = "0_6")]
54pub const WEBP_CHUNK_DEPRECATED: WebPChunkId = 4;
55pub const WEBP_CHUNK_ALPHA: WebPChunkId = 5;
56pub const WEBP_CHUNK_IMAGE: WebPChunkId = 6;
57pub const WEBP_CHUNK_EXIF: WebPChunkId = 7;
58pub const WEBP_CHUNK_XMP: WebPChunkId = 8;
59pub const WEBP_CHUNK_UNKNOWN: WebPChunkId = 9;
60pub const WEBP_CHUNK_NIL: WebPChunkId = 10;
61
62#[repr(C)]
63#[derive(Debug, Clone, Copy)]
64pub struct WebPMuxFrameInfo {
65 pub bitstream: WebPData,
66 pub x_offset: c_int,
67 pub y_offset: c_int,
68 pub duration: c_int,
69 pub id: WebPChunkId,
70 pub dispose_method: WebPMuxAnimDispose,
71 pub blend_method: WebPMuxAnimBlend,
72 #[doc(hidden)]
73 pub pad: [u32; 1],
74}
75
76#[repr(C)]
77#[derive(Debug, Clone, Copy)]
78pub struct WebPMuxAnimParams {
79 pub bgcolor: u32,
80 pub loop_count: c_int,
81}
82
83#[cfg(all(feature = "0_5", feature = "extern-types"))]
84#[cfg_attr(feature = "__doc_cfg", doc(cfg(feature = "0_5")))]
85unsafe extern "C" {
86 pub type WebPAnimEncoder;
87}
88
89#[cfg(all(feature = "0_5", not(feature = "extern-types")))]
90#[cfg_attr(feature = "__doc_cfg", doc(cfg(feature = "0_5")))]
91#[repr(C)]
92pub struct WebPAnimEncoder(c_void);
93
94#[cfg(feature = "0_5")]
95#[repr(C)]
96#[derive(Debug, Clone, Copy)]
97pub struct WebPAnimEncoderOptions {
98 pub anim_params: WebPMuxAnimParams,
99 pub minimize_size: c_int,
100 pub kmin: c_int,
101 pub kmax: c_int,
102 pub allow_mixed: c_int,
103 pub verbose: c_int,
104 #[doc(hidden)]
105 pub padding: [u32; 4],
106}
107
108unsafe extern "C" {
109 pub fn WebPGetMuxVersion() -> c_int;
110 #[doc(hidden)]
111 #[must_use]
112 pub fn WebPNewInternal(_: c_int) -> *mut WebPMux;
113 pub fn WebPMuxDelete(mux: *mut WebPMux);
114 #[doc(hidden)]
115 #[must_use]
116 pub fn WebPMuxCreateInternal(_: *const WebPData, _: c_int, _: c_int) -> *mut WebPMux;
117 pub fn WebPMuxSetChunk(
118 mux: *mut WebPMux,
119 fourcc: *const c_char,
120 chunk_data: *const WebPData,
121 copy_data: c_int,
122 ) -> WebPMuxError;
123 pub fn WebPMuxGetChunk(
124 mux: *const WebPMux,
125 fourcc: *const c_char,
126 chunk_data: *mut WebPData,
127 ) -> WebPMuxError;
128 pub fn WebPMuxDeleteChunk(mux: *mut WebPMux, fourcc: *const c_char) -> WebPMuxError;
129 pub fn WebPMuxSetImage(
130 mux: *mut WebPMux,
131 bitstream: *const WebPData,
132 copy_data: c_int,
133 ) -> WebPMuxError;
134 pub fn WebPMuxPushFrame(
135 mux: *mut WebPMux,
136 frame: *const WebPMuxFrameInfo,
137 copy_data: c_int,
138 ) -> WebPMuxError;
139 pub fn WebPMuxGetFrame(
140 mux: *const WebPMux,
141 nth: u32,
142 frame: *mut WebPMuxFrameInfo,
143 ) -> WebPMuxError;
144 pub fn WebPMuxDeleteFrame(mux: *mut WebPMux, nth: u32) -> WebPMuxError;
145 pub fn WebPMuxSetAnimationParams(
146 mux: *mut WebPMux,
147 params: *const WebPMuxAnimParams,
148 ) -> WebPMuxError;
149 pub fn WebPMuxGetAnimationParams(
150 mux: *const WebPMux,
151 params: *mut WebPMuxAnimParams,
152 ) -> WebPMuxError;
153 #[cfg(feature = "0_5")]
154 pub fn WebPMuxSetCanvasSize(mux: *mut WebPMux, width: c_int, height: c_int) -> WebPMuxError;
155 pub fn WebPMuxGetCanvasSize(
156 mux: *const WebPMux,
157 width: *mut c_int,
158 height: *mut c_int,
159 ) -> WebPMuxError;
160 pub fn WebPMuxGetFeatures(mux: *const WebPMux, flags: *mut u32) -> WebPMuxError;
161 pub fn WebPMuxNumChunks(
162 mux: *const WebPMux,
163 id: WebPChunkId,
164 num_elements: *mut c_int,
165 ) -> WebPMuxError;
166 pub fn WebPMuxAssemble(mux: *mut WebPMux, assembled_data: *mut WebPData) -> WebPMuxError;
167 #[cfg(feature = "0_5")]
168 #[doc(hidden)]
169 pub fn WebPAnimEncoderOptionsInitInternal(_: *mut WebPAnimEncoderOptions, _: c_int) -> c_int;
170 #[cfg(feature = "0_5")]
171 #[doc(hidden)]
172 pub fn WebPAnimEncoderNewInternal(
173 _: c_int,
174 _: c_int,
175 _: *const WebPAnimEncoderOptions,
176 _: c_int,
177 ) -> *mut WebPAnimEncoder;
178 #[cfg(feature = "0_5")]
179 #[must_use]
180 pub fn WebPAnimEncoderAdd(
181 enc: *mut WebPAnimEncoder,
182 frame: *mut WebPPicture,
183 timestamp_ms: c_int,
184 config: *const WebPConfig,
185 ) -> c_int;
186 #[cfg(feature = "0_5")]
187 #[must_use]
188 pub fn WebPAnimEncoderAssemble(enc: *mut WebPAnimEncoder, webp_data: *mut WebPData) -> c_int;
189 #[cfg(feature = "0_5")]
190 pub fn WebPAnimEncoderGetError(enc: *mut WebPAnimEncoder) -> *const c_char;
191 #[cfg(feature = "0_5")]
192 pub fn WebPAnimEncoderDelete(enc: *mut WebPAnimEncoder);
193 #[cfg(feature = "1_4")]
194 pub fn WebPAnimEncoderSetChunk(
195 enc: *mut WebPAnimEncoder,
196 fourcc: *const c_char,
197 chunk_data: *const WebPData,
198 copy_data: c_int,
199 ) -> WebPMuxError;
200 #[cfg(feature = "1_4")]
201 pub fn WebPAnimEncoderGetChunk(
202 enc: *const WebPAnimEncoder,
203 fourcc: *const c_char,
204 chunk_data: *mut WebPData,
205 ) -> WebPMuxError;
206 #[cfg(feature = "1_4")]
207 pub fn WebPAnimEncoderDeleteChunk(
208 enc: *mut WebPAnimEncoder,
209 fourcc: *const c_char,
210 ) -> WebPMuxError;
211}
212
213#[allow(non_snake_case)]
214#[must_use]
215#[inline]
216pub unsafe extern "C" fn WebPMuxNew() -> *mut WebPMux {
217 unsafe { WebPNewInternal(WEBP_MUX_ABI_VERSION) }
218}
219
220#[allow(non_snake_case)]
221#[must_use]
222#[inline]
223pub unsafe extern "C" fn WebPMuxCreate(
224 bitstream: *const WebPData,
225 copy_data: c_int,
226) -> *mut WebPMux {
227 unsafe { WebPMuxCreateInternal(bitstream, copy_data, WEBP_MUX_ABI_VERSION) }
228}
229
230#[cfg(feature = "0_5")]
231#[allow(non_snake_case)]
232#[must_use]
233#[inline]
234pub unsafe extern "C" fn WebPAnimEncoderOptionsInit(
235 enc_options: *mut WebPAnimEncoderOptions,
236) -> c_int {
237 unsafe { WebPAnimEncoderOptionsInitInternal(enc_options, WEBP_MUX_ABI_VERSION) }
238}
239
240#[cfg(feature = "0_5")]
241#[allow(non_snake_case)]
242#[inline]
243pub unsafe extern "C" fn WebPAnimEncoderNew(
244 width: c_int,
245 height: c_int,
246 enc_options: *const WebPAnimEncoderOptions,
247) -> *mut WebPAnimEncoder {
248 unsafe { WebPAnimEncoderNewInternal(width, height, enc_options, WEBP_MUX_ABI_VERSION) }
249}