dav1d_sys/
lib.rs

1// TODO: Use core::ffi once we depend on Rust >= 1.64
2use std::os::raw::{c_char, c_int, c_uint, c_void};
3
4pub const DAV1D_OBU_SEQ_HDR: Dav1dObuType = 1;
5pub const DAV1D_OBU_TD: Dav1dObuType = 2;
6pub const DAV1D_OBU_FRAME_HDR: Dav1dObuType = 3;
7pub const DAV1D_OBU_TILE_GRP: Dav1dObuType = 4;
8pub const DAV1D_OBU_METADATA: Dav1dObuType = 5;
9pub const DAV1D_OBU_FRAME: Dav1dObuType = 6;
10pub const DAV1D_OBU_REDUNDANT_FRAME_HDR: Dav1dObuType = 7;
11pub const DAV1D_OBU_PADDING: Dav1dObuType = 15;
12pub type Dav1dObuType = c_uint;
13
14pub const DAV1D_TX_4X4_ONLY: Dav1dTxfmMode = 0;
15pub const DAV1D_TX_LARGEST: Dav1dTxfmMode = 1;
16pub const DAV1D_TX_SWITCHABLE: Dav1dTxfmMode = 2;
17pub const DAV1D_N_TX_MODES: Dav1dTxfmMode = 3;
18pub type Dav1dTxfmMode = c_uint;
19
20pub const DAV1D_FILTER_8TAP_REGULAR: Dav1dFilterMode = 0;
21pub const DAV1D_FILTER_8TAP_SMOOTH: Dav1dFilterMode = 1;
22pub const DAV1D_FILTER_8TAP_SHARP: Dav1dFilterMode = 2;
23pub const DAV1D_N_SWITCHABLE_FILTERS: Dav1dFilterMode = 3;
24pub const DAV1D_FILTER_BILINEAR: Dav1dFilterMode = 3;
25pub const DAV1D_N_FILTERS: Dav1dFilterMode = 4;
26pub const DAV1D_FILTER_SWITCHABLE: Dav1dFilterMode = 4;
27pub type Dav1dFilterMode = c_uint;
28
29pub const DAV1D_OFF: Dav1dAdaptiveBoolean = 0;
30pub const DAV1D_ON: Dav1dAdaptiveBoolean = 1;
31pub const DAV1D_ADAPTIVE: Dav1dAdaptiveBoolean = 2;
32pub type Dav1dAdaptiveBoolean = c_uint;
33
34pub const DAV1D_RESTORATION_NONE: Dav1dRestorationType = 0;
35pub const DAV1D_RESTORATION_SWITCHABLE: Dav1dRestorationType = 1;
36pub const DAV1D_RESTORATION_WIENER: Dav1dRestorationType = 2;
37pub const DAV1D_RESTORATION_SGRPROJ: Dav1dRestorationType = 3;
38pub type Dav1dRestorationType = c_uint;
39
40pub const DAV1D_WM_TYPE_IDENTITY: Dav1dWarpedMotionType = 0;
41pub const DAV1D_WM_TYPE_TRANSLATION: Dav1dWarpedMotionType = 1;
42pub const DAV1D_WM_TYPE_ROT_ZOOM: Dav1dWarpedMotionType = 2;
43pub const DAV1D_WM_TYPE_AFFINE: Dav1dWarpedMotionType = 3;
44pub type Dav1dWarpedMotionType = c_uint;
45
46pub const DAV1D_PIXEL_LAYOUT_I400: Dav1dPixelLayout = 0;
47pub const DAV1D_PIXEL_LAYOUT_I420: Dav1dPixelLayout = 1;
48pub const DAV1D_PIXEL_LAYOUT_I422: Dav1dPixelLayout = 2;
49pub const DAV1D_PIXEL_LAYOUT_I444: Dav1dPixelLayout = 3;
50pub type Dav1dPixelLayout = c_uint;
51
52pub const DAV1D_FRAME_TYPE_KEY: Dav1dFrameType = 0;
53pub const DAV1D_FRAME_TYPE_INTER: Dav1dFrameType = 1;
54pub const DAV1D_FRAME_TYPE_INTRA: Dav1dFrameType = 2;
55pub const DAV1D_FRAME_TYPE_SWITCH: Dav1dFrameType = 3;
56pub type Dav1dFrameType = c_uint;
57
58pub const DAV1D_COLOR_PRI_BT709: Dav1dColorPrimaries = 1;
59pub const DAV1D_COLOR_PRI_UNKNOWN: Dav1dColorPrimaries = 2;
60pub const DAV1D_COLOR_PRI_BT470M: Dav1dColorPrimaries = 4;
61pub const DAV1D_COLOR_PRI_BT470BG: Dav1dColorPrimaries = 5;
62pub const DAV1D_COLOR_PRI_BT601: Dav1dColorPrimaries = 6;
63pub const DAV1D_COLOR_PRI_SMPTE240: Dav1dColorPrimaries = 7;
64pub const DAV1D_COLOR_PRI_FILM: Dav1dColorPrimaries = 8;
65pub const DAV1D_COLOR_PRI_BT2020: Dav1dColorPrimaries = 9;
66pub const DAV1D_COLOR_PRI_XYZ: Dav1dColorPrimaries = 10;
67pub const DAV1D_COLOR_PRI_SMPTE431: Dav1dColorPrimaries = 11;
68pub const DAV1D_COLOR_PRI_SMPTE432: Dav1dColorPrimaries = 12;
69pub const DAV1D_COLOR_PRI_EBU3213: Dav1dColorPrimaries = 22;
70pub const DAV1D_COLOR_PRI_RESERVED: Dav1dColorPrimaries = 255;
71pub type Dav1dColorPrimaries = c_uint;
72
73pub const DAV1D_TRC_BT709: Dav1dTransferCharacteristics = 1;
74pub const DAV1D_TRC_UNKNOWN: Dav1dTransferCharacteristics = 2;
75pub const DAV1D_TRC_BT470M: Dav1dTransferCharacteristics = 4;
76pub const DAV1D_TRC_BT470BG: Dav1dTransferCharacteristics = 5;
77pub const DAV1D_TRC_BT601: Dav1dTransferCharacteristics = 6;
78pub const DAV1D_TRC_SMPTE240: Dav1dTransferCharacteristics = 7;
79pub const DAV1D_TRC_LINEAR: Dav1dTransferCharacteristics = 8;
80pub const DAV1D_TRC_LOG100: Dav1dTransferCharacteristics = 9;
81pub const DAV1D_TRC_LOG100_SQRT10: Dav1dTransferCharacteristics = 10;
82pub const DAV1D_TRC_IEC61966: Dav1dTransferCharacteristics = 11;
83pub const DAV1D_TRC_BT1361: Dav1dTransferCharacteristics = 12;
84pub const DAV1D_TRC_SRGB: Dav1dTransferCharacteristics = 13;
85pub const DAV1D_TRC_BT2020_10BIT: Dav1dTransferCharacteristics = 14;
86pub const DAV1D_TRC_BT2020_12BIT: Dav1dTransferCharacteristics = 15;
87pub const DAV1D_TRC_SMPTE2084: Dav1dTransferCharacteristics = 16;
88pub const DAV1D_TRC_SMPTE428: Dav1dTransferCharacteristics = 17;
89pub const DAV1D_TRC_HLG: Dav1dTransferCharacteristics = 18;
90pub const DAV1D_TRC_RESERVED: Dav1dTransferCharacteristics = 255;
91pub type Dav1dTransferCharacteristics = c_uint;
92
93pub const DAV1D_MC_IDENTITY: Dav1dMatrixCoefficients = 0;
94pub const DAV1D_MC_BT709: Dav1dMatrixCoefficients = 1;
95pub const DAV1D_MC_UNKNOWN: Dav1dMatrixCoefficients = 2;
96pub const DAV1D_MC_FCC: Dav1dMatrixCoefficients = 4;
97pub const DAV1D_MC_BT470BG: Dav1dMatrixCoefficients = 5;
98pub const DAV1D_MC_BT601: Dav1dMatrixCoefficients = 6;
99pub const DAV1D_MC_SMPTE240: Dav1dMatrixCoefficients = 7;
100pub const DAV1D_MC_SMPTE_YCGCO: Dav1dMatrixCoefficients = 8;
101pub const DAV1D_MC_BT2020_NCL: Dav1dMatrixCoefficients = 9;
102pub const DAV1D_MC_BT2020_CL: Dav1dMatrixCoefficients = 10;
103pub const DAV1D_MC_SMPTE2085: Dav1dMatrixCoefficients = 11;
104pub const DAV1D_MC_CHROMAT_NCL: Dav1dMatrixCoefficients = 12;
105pub const DAV1D_MC_CHROMAT_CL: Dav1dMatrixCoefficients = 13;
106pub const DAV1D_MC_ICTCP: Dav1dMatrixCoefficients = 14;
107pub const DAV1D_MC_RESERVED: Dav1dMatrixCoefficients = 255;
108pub type Dav1dMatrixCoefficients = c_uint;
109
110pub const DAV1D_CHR_UNKNOWN: Dav1dChromaSamplePosition = 0;
111pub const DAV1D_CHR_VERTICAL: Dav1dChromaSamplePosition = 1;
112pub const DAV1D_CHR_COLOCATED: Dav1dChromaSamplePosition = 2;
113pub type Dav1dChromaSamplePosition = c_uint;
114
115pub const DAV1D_INLOOPFILTER_NONE: Dav1dInloopFilterType = 0;
116pub const DAV1D_INLOOPFILTER_DEBLOCK: Dav1dInloopFilterType = 1;
117pub const DAV1D_INLOOPFILTER_CDEF: Dav1dInloopFilterType = 2;
118pub const DAV1D_INLOOPFILTER_RESTORATION: Dav1dInloopFilterType = 4;
119pub const DAV1D_INLOOPFILTER_ALL: Dav1dInloopFilterType = 7;
120pub type Dav1dInloopFilterType = c_uint;
121
122pub const DAV1D_EVENT_FLAG_NEW_SEQUENCE: Dav1dEventFlags = 1;
123pub const DAV1D_EVENT_FLAG_NEW_OP_PARAMS_INFO: Dav1dEventFlags = 2;
124pub type Dav1dEventFlags = c_uint;
125
126pub const DAV1D_MAX_THREADS: c_int = 256;
127pub const DAV1D_MAX_FRAME_DELAY: c_int = 256;
128
129pub const DAV1D_MAX_CDEF_STRENGTHS: usize = 8;
130pub const DAV1D_MAX_OPERATING_POINTS: usize = 32;
131pub const DAV1D_MAX_TILE_COLS: usize = 64;
132pub const DAV1D_MAX_TILE_ROWS: usize = 64;
133pub const DAV1D_MAX_SEGMENTS: usize = 8;
134pub const DAV1D_NUM_REF_FRAMES: usize = 8;
135pub const DAV1D_PRIMARY_REF_NONE: usize = 7;
136pub const DAV1D_REFS_PER_FRAME: usize = 7;
137pub const DAV1D_TOTAL_REFS_PER_FRAME: usize = DAV1D_REFS_PER_FRAME + 1;
138
139pub const DAV1D_DECODEFRAMETYPE_ALL: Dav1dDecodeFrameType = 0;
140pub const DAV1D_DECODEFRAMETYPE_REFERENCE: Dav1dDecodeFrameType = 1;
141pub const DAV1D_DECODEFRAMETYPE_INTRA: Dav1dDecodeFrameType = 2;
142pub const DAV1D_DECODEFRAMETYPE_KEY: Dav1dDecodeFrameType = 3;
143pub type Dav1dDecodeFrameType = c_uint;
144
145// Conversion of the C DAV1D_ERR macro
146pub const fn dav1d_err(errno: c_int) -> c_int {
147    if libc::EPERM < 0 {
148        errno
149    } else {
150        -errno
151    }
152}
153
154pub const DAV1D_ERR_AGAIN: c_int = dav1d_err(libc::EAGAIN);
155pub const DAV1D_ERR_INVAL: c_int = dav1d_err(libc::EINVAL);
156pub const DAV1D_ERR_NOMEM: c_int = dav1d_err(libc::ENOMEM);
157pub const DAV1D_ERR_NOPROTOOPT: c_int = dav1d_err(libc::ENOPROTOOPT);
158
159#[repr(C)]
160#[derive(Debug, Copy, Clone)]
161pub struct Dav1dUserData {
162    pub data: *const u8,
163    pub ref_: *mut Dav1dRef,
164}
165
166#[repr(C)]
167#[derive(Debug, Copy, Clone)]
168pub struct Dav1dDataProps {
169    pub timestamp: i64,
170    pub duration: i64,
171    pub offset: i64,
172    pub size: usize,
173    pub user_data: Dav1dUserData,
174}
175
176#[repr(C)]
177#[derive(Copy, Clone)]
178pub struct Dav1dWarpedMotionParams {
179    pub type_: Dav1dWarpedMotionType,
180    pub matrix: [i32; 6usize],
181    pub u: Dav1dWarpedMotionParamsU,
182}
183
184#[repr(C)]
185#[derive(Copy, Clone)]
186pub union Dav1dWarpedMotionParamsU {
187    pub p: Dav1dWarpedMotionParamsUP,
188    pub abcd: [i16; 4usize],
189}
190
191#[repr(C)]
192#[derive(Debug, Copy, Clone)]
193pub struct Dav1dWarpedMotionParamsUP {
194    pub alpha: i16,
195    pub beta: i16,
196    pub gamma: i16,
197    pub delta: i16,
198}
199
200#[repr(C)]
201#[derive(Debug, Copy, Clone)]
202pub struct Dav1dContentLightLevel {
203    pub max_content_light_level: u16,
204    pub max_frame_average_light_level: u16,
205}
206
207#[repr(C)]
208#[derive(Debug, Copy, Clone)]
209pub struct Dav1dMasteringDisplay {
210    pub primaries: [[u16; 2usize]; 3usize],
211    pub white_point: [u16; 2usize],
212    pub max_luminance: u32,
213    pub min_luminance: u32,
214}
215
216#[repr(C)]
217#[derive(Debug, Copy, Clone)]
218pub struct Dav1dITUTT35 {
219    pub country_code: u8,
220    pub country_code_extension_byte: u8,
221    pub payload_size: usize,
222    pub payload: *mut u8,
223}
224
225#[repr(C)]
226#[derive(Debug, Copy, Clone)]
227pub struct Dav1dSequenceHeader {
228    pub profile: u8,
229    pub max_width: c_int,
230    pub max_height: c_int,
231    pub layout: Dav1dPixelLayout,
232    pub pri: Dav1dColorPrimaries,
233    pub trc: Dav1dTransferCharacteristics,
234    pub mtrx: Dav1dMatrixCoefficients,
235    pub chr: Dav1dChromaSamplePosition,
236    pub hbd: u8,
237    pub color_range: u8,
238    pub num_operating_points: u8,
239    pub operating_points: [Dav1dSequenceHeaderOperatingPoint; DAV1D_MAX_OPERATING_POINTS],
240    pub still_picture: u8,
241    pub reduced_still_picture_header: u8,
242    pub timing_info_present: u8,
243    pub num_units_in_tick: u32,
244    pub time_scale: u32,
245    pub equal_picture_interval: u8,
246    pub num_ticks_per_picture: u32,
247    pub decoder_model_info_present: u8,
248    pub encoder_decoder_buffer_delay_length: u8,
249    pub num_units_in_decoding_tick: u32,
250    pub buffer_removal_delay_length: u8,
251    pub frame_presentation_delay_length: u8,
252    pub display_model_info_present: u8,
253    pub width_n_bits: u8,
254    pub height_n_bits: u8,
255    pub frame_id_numbers_present: u8,
256    pub delta_frame_id_n_bits: u8,
257    pub frame_id_n_bits: u8,
258    pub sb128: u8,
259    pub filter_intra: u8,
260    pub intra_edge_filter: u8,
261    pub inter_intra: u8,
262    pub masked_compound: u8,
263    pub warped_motion: u8,
264    pub dual_filter: u8,
265    pub order_hint: u8,
266    pub jnt_comp: u8,
267    pub ref_frame_mvs: u8,
268    pub screen_content_tools: Dav1dAdaptiveBoolean,
269    pub force_integer_mv: Dav1dAdaptiveBoolean,
270    pub order_hint_n_bits: u8,
271    pub super_res: u8,
272    pub cdef: u8,
273    pub restoration: u8,
274    pub ss_hor: u8,
275    pub ss_ver: u8,
276    pub monochrome: u8,
277    pub color_description_present: u8,
278    pub separate_uv_delta_q: u8,
279    pub film_grain_present: u8,
280    pub operating_parameter_info:
281        [Dav1dSequenceHeaderOperatingParameterInfo; DAV1D_MAX_OPERATING_POINTS],
282}
283
284#[repr(C)]
285#[derive(Debug, Copy, Clone)]
286pub struct Dav1dSequenceHeaderOperatingPoint {
287    pub major_level: u8,
288    pub minor_level: u8,
289    pub initial_display_delay: u16,
290    pub idc: u8,
291    pub tier: u8,
292    pub decoder_model_param_present: u8,
293    pub display_model_param_present: u8,
294}
295
296#[repr(C)]
297#[derive(Debug, Copy, Clone)]
298pub struct Dav1dSequenceHeaderOperatingParameterInfo {
299    pub decoder_buffer_delay: u32,
300    pub encoder_buffer_delay: u32,
301    pub low_delay_mode: u8,
302}
303
304#[repr(C)]
305#[derive(Debug, Copy, Clone)]
306pub struct Dav1dSegmentationData {
307    pub delta_q: i16,
308    pub delta_lf_y_v: i8,
309    pub delta_lf_y_h: i8,
310    pub delta_lf_u: i8,
311    pub delta_lf_v: i8,
312    pub ref_: i8,
313    pub skip: u8,
314    pub globalmv: u8,
315}
316
317#[repr(C)]
318#[derive(Debug, Copy, Clone)]
319pub struct Dav1dSegmentationDataSet {
320    pub d: [Dav1dSegmentationData; DAV1D_MAX_SEGMENTS],
321    pub preskip: u8,
322    pub last_active_segid: i8,
323}
324
325#[repr(C)]
326#[derive(Debug, Copy, Clone)]
327pub struct Dav1dLoopfilterModeRefDeltas {
328    pub mode_delta: [i8; 2usize],
329    pub ref_delta: [i8; DAV1D_TOTAL_REFS_PER_FRAME],
330}
331
332#[repr(C)]
333#[derive(Debug, Copy, Clone)]
334pub struct Dav1dFilmGrainData {
335    pub seed: c_uint,
336    pub num_y_points: c_int,
337    pub y_points: [[u8; 2usize]; 14usize],
338    pub chroma_scaling_from_luma: c_int,
339    pub num_uv_points: [c_int; 2usize],
340    pub uv_points: [[[u8; 2usize]; 10usize]; 2usize],
341    pub scaling_shift: c_int,
342    pub ar_coeff_lag: c_int,
343    pub ar_coeffs_y: [i8; 24usize],
344    pub ar_coeffs_uv: [[i8; 28usize]; 2usize],
345    pub ar_coeff_shift: u64,
346    pub grain_scale_shift: c_int,
347    pub uv_mult: [c_int; 2usize],
348    pub uv_luma_mult: [c_int; 2usize],
349    pub uv_offset: [c_int; 2usize],
350    pub overlap_flag: c_int,
351    pub clip_to_restricted_range: c_int,
352}
353
354#[repr(C)]
355#[derive(Copy, Clone)]
356pub struct Dav1dFrameHeader {
357    pub film_grain: Dav1dFrameHeaderFilmGrain,
358    pub frame_type: Dav1dFrameType,
359    pub width: [c_int; 2usize],
360    pub height: c_int,
361    pub frame_offset: u8,
362    pub temporal_id: u8,
363    pub spatial_id: u8,
364    pub show_existing_frame: u8,
365    pub existing_frame_idx: u8,
366    pub frame_id: u32,
367    pub frame_presentation_delay: u32,
368    pub show_frame: u8,
369    pub showable_frame: u8,
370    pub error_resilient_mode: u8,
371    pub disable_cdf_update: u8,
372    pub allow_screen_content_tools: u8,
373    pub force_integer_mv: u8,
374    pub frame_size_override: u8,
375    pub primary_ref_frame: u8,
376    pub buffer_removal_time_present: u8,
377    pub operating_points: [Dav1dFrameHeaderOperatingPoint; DAV1D_MAX_OPERATING_POINTS],
378    pub refresh_frame_flags: u8,
379    pub render_width: c_int,
380    pub render_height: c_int,
381    pub super_res: Dav1dFrameHeaderSuperRes,
382    pub have_render_size: u8,
383    pub allow_intrabc: u8,
384    pub frame_ref_short_signaling: u8,
385    pub refidx: [i8; DAV1D_REFS_PER_FRAME],
386    pub hp: u8,
387    pub subpel_filter_mode: Dav1dFilterMode,
388    pub switchable_motion_mode: u8,
389    pub use_ref_frame_mvs: u8,
390    pub refresh_context: u8,
391    pub tiling: Dav1dFrameHeaderTiling,
392    pub quant: Dav1dFrameHeaderQuant,
393    pub segmentation: Dav1dFrameHeaderSegmentation,
394    pub delta: Dav1dFrameHeaderDelta,
395    pub all_lossless: u8,
396    pub loopfilter: Dav1dFrameHeaderLoopfilter,
397    pub cdef: Dav1dFrameHeaderCDef,
398    pub restoration: Dav1dFrameHeaderRestoration,
399    pub txfm_mode: Dav1dTxfmMode,
400    pub switchable_comp_refs: u8,
401    pub skip_mode_allowed: u8,
402    pub skip_mode_enabled: u8,
403    pub skip_mode_refs: [i8; 2usize],
404    pub warp_motion: u8,
405    pub reduced_txtp_set: u8,
406    pub gmv: [Dav1dWarpedMotionParams; DAV1D_REFS_PER_FRAME],
407}
408
409#[repr(C)]
410#[derive(Debug, Copy, Clone)]
411pub struct Dav1dFrameHeaderFilmGrain {
412    pub data: Dav1dFilmGrainData,
413    pub present: u8,
414    pub update: u8,
415}
416
417#[repr(C)]
418#[derive(Debug, Copy, Clone)]
419pub struct Dav1dFrameHeaderOperatingPoint {
420    pub buffer_removal_time: u32,
421}
422
423#[repr(C)]
424#[derive(Debug, Copy, Clone)]
425pub struct Dav1dFrameHeaderSuperRes {
426    pub width_scale_denominator: u8,
427    pub enabled: u8,
428}
429
430#[repr(C)]
431#[derive(Debug, Copy, Clone)]
432pub struct Dav1dFrameHeaderTiling {
433    pub uniform: u8,
434    pub n_bytes: u8,
435    pub min_log2_cols: u8,
436    pub max_log2_cols: u8,
437    pub log2_cols: u8,
438    pub cols: u8,
439    pub min_log2_rows: u8,
440    pub max_log2_rows: u8,
441    pub log2_rows: u8,
442    pub rows: u8,
443    pub col_start_sb: [u16; DAV1D_MAX_TILE_COLS + 1],
444    pub row_start_sb: [u16; DAV1D_MAX_TILE_ROWS + 1],
445    pub update: u16,
446}
447
448#[repr(C)]
449#[derive(Debug, Copy, Clone)]
450pub struct Dav1dFrameHeaderQuant {
451    pub yac: u8,
452    pub ydc_delta: i8,
453    pub udc_delta: i8,
454    pub uac_delta: i8,
455    pub vdc_delta: i8,
456    pub vac_delta: i8,
457    pub qm: u8,
458    pub qm_y: u8,
459    pub qm_u: u8,
460    pub qm_v: u8,
461}
462
463#[repr(C)]
464#[derive(Debug, Copy, Clone)]
465pub struct Dav1dFrameHeaderSegmentation {
466    pub enabled: u8,
467    pub update_map: u8,
468    pub temporal: u8,
469    pub update_data: u8,
470    pub seg_data: Dav1dSegmentationDataSet,
471    pub lossless: [u8; DAV1D_MAX_SEGMENTS],
472    pub qidx: [u8; DAV1D_MAX_SEGMENTS],
473}
474
475#[repr(C)]
476#[derive(Debug, Copy, Clone)]
477pub struct Dav1dFrameHeaderDelta {
478    pub q: Dav1dDeltaQ,
479    pub lf: Dav1dDeltaLF,
480}
481
482#[repr(C)]
483#[derive(Debug, Copy, Clone)]
484pub struct Dav1dDeltaQ {
485    pub present: u8,
486    pub res_log2: u8,
487}
488
489#[repr(C)]
490#[derive(Debug, Copy, Clone)]
491pub struct Dav1dDeltaLF {
492    pub present: u8,
493    pub res_log2: u8,
494    pub multi: u8,
495}
496
497#[repr(C)]
498#[derive(Debug, Copy, Clone)]
499pub struct Dav1dFrameHeaderLoopfilter {
500    pub level_y: [u8; 2usize],
501    pub level_u: u8,
502    pub level_v: u8,
503    pub mode_ref_delta_enabled: u8,
504    pub mode_ref_delta_update: u8,
505    pub mode_ref_deltas: Dav1dLoopfilterModeRefDeltas,
506    pub sharpness: u8,
507}
508
509#[repr(C)]
510#[derive(Debug, Copy, Clone)]
511pub struct Dav1dFrameHeaderCDef {
512    pub damping: u8,
513    pub n_bits: u8,
514    pub y_strength: [u8; DAV1D_MAX_CDEF_STRENGTHS],
515    pub uv_strength: [u8; DAV1D_MAX_CDEF_STRENGTHS],
516}
517
518#[repr(C)]
519#[derive(Debug, Copy, Clone)]
520pub struct Dav1dFrameHeaderRestoration {
521    pub type_: [Dav1dRestorationType; 3usize],
522    pub unit_size: [u8; 2usize],
523}
524
525#[repr(C)]
526#[derive(Debug, Copy, Clone)]
527pub struct Dav1dPictureParameters {
528    pub w: c_int,
529    pub h: c_int,
530    pub layout: Dav1dPixelLayout,
531    pub bpc: c_int,
532}
533
534#[repr(C)]
535#[derive(Debug, Copy, Clone)]
536pub struct Dav1dPicture {
537    pub seq_hdr: *mut Dav1dSequenceHeader,
538    pub frame_hdr: *mut Dav1dFrameHeader,
539    pub data: [*mut c_void; 3usize],
540    pub stride: [isize; 2usize],
541    pub p: Dav1dPictureParameters,
542    pub m: Dav1dDataProps,
543    pub content_light: *mut Dav1dContentLightLevel,
544    pub mastering_display: *mut Dav1dMasteringDisplay,
545    pub itut_t35: *mut Dav1dITUTT35,
546    pub reserved: [usize; 4usize],
547    pub frame_hdr_ref: *mut Dav1dRef,
548    pub seq_hdr_ref: *mut Dav1dRef,
549    pub content_light_ref: *mut Dav1dRef,
550    pub mastering_display_ref: *mut Dav1dRef,
551    pub itut_t35_ref: *mut Dav1dRef,
552    pub n_itut_t34: usize,
553    pub reserved_ref: [usize; 4usize],
554    pub ref_: *mut Dav1dRef,
555    pub allocator_data: *mut c_void,
556}
557
558#[repr(C)]
559#[derive(Debug, Copy, Clone)]
560pub struct Dav1dPicAllocator {
561    pub cookie: *mut c_void,
562    pub alloc_picture_callback:
563        Option<unsafe extern "C" fn(pic: *mut Dav1dPicture, cookie: *mut c_void) -> c_int>,
564    pub release_picture_callback:
565        Option<unsafe extern "C" fn(pic: *mut Dav1dPicture, cookie: *mut c_void)>,
566}
567
568#[repr(C)]
569#[derive(Debug, Copy, Clone)]
570pub struct Dav1dData {
571    pub data: *const u8,
572    pub sz: usize,
573    pub ref_: *mut Dav1dRef,
574    pub m: Dav1dDataProps,
575}
576
577#[repr(transparent)]
578#[derive(Debug)]
579pub struct Dav1dContext(c_void);
580
581#[repr(C)]
582#[derive(Debug, Copy, Clone)]
583pub struct Dav1dLogger {
584    pub cookie: *mut c_void,
585    pub callback: *mut c_void,
586    // FIXME: Use the following once std::ffi::VaList is stable
587    // Option<
588    //     unsafe extern "C" fn(
589    //         cookie: *mut c_void,
590    //         format: *const c_char,
591    //         ap: *mut ::std::ffi::VaList,
592    //     ),
593    //  >,
594}
595
596#[repr(C)]
597#[derive(Debug, Copy, Clone)]
598pub struct Dav1dSettings {
599    pub n_threads: c_int,
600    pub max_frame_delay: c_int,
601    pub apply_grain: c_int,
602    pub operating_point: c_int,
603    pub all_layers: c_int,
604    pub frame_size_limit: c_uint,
605    pub allocator: Dav1dPicAllocator,
606    pub logger: Dav1dLogger,
607    pub strict_std_compliance: c_int,
608    pub output_invisible_frames: c_int,
609    pub inloop_filters: Dav1dInloopFilterType,
610    pub decode_frame_type: Dav1dDecodeFrameType,
611    pub reserved: [u8; 16usize],
612}
613
614#[repr(transparent)]
615#[derive(Debug)]
616pub struct Dav1dRef(c_void);
617
618extern "C" {
619    pub fn dav1d_version() -> *const c_char;
620
621    pub fn dav1d_version_api() -> u32;
622
623    pub fn dav1d_default_settings(s: *mut Dav1dSettings);
624
625    pub fn dav1d_parse_sequence_header(
626        out: *mut Dav1dSequenceHeader,
627        buf: *const u8,
628        sz: usize,
629    ) -> c_int;
630
631    pub fn dav1d_open(c_out: *mut *mut Dav1dContext, s: *const Dav1dSettings) -> c_int;
632
633    pub fn dav1d_send_data(c: *mut Dav1dContext, in_: *mut Dav1dData) -> c_int;
634
635    pub fn dav1d_flush(c: *mut Dav1dContext);
636
637    pub fn dav1d_get_picture(c: *mut Dav1dContext, out: *mut Dav1dPicture) -> c_int;
638
639    pub fn dav1d_get_decode_error_data_props(
640        c: *mut Dav1dContext,
641        out: *mut Dav1dDataProps,
642    ) -> c_int;
643
644    pub fn dav1d_get_frame_delay(c: *mut Dav1dContext) -> c_int;
645
646    pub fn dav1d_apply_grain(
647        c: *mut Dav1dContext,
648        out: *mut Dav1dPicture,
649        in_: *const Dav1dPicture,
650    ) -> c_int;
651
652    pub fn dav1d_get_event_flags(c: *mut Dav1dContext, flags: *mut Dav1dEventFlags) -> c_int;
653
654    pub fn dav1d_close(c_out: *mut *mut Dav1dContext);
655
656    pub fn dav1d_picture_unref(p: *mut Dav1dPicture);
657
658    pub fn dav1d_data_props_unref(props: *mut Dav1dDataProps);
659
660    pub fn dav1d_data_create(data: *mut Dav1dData, sz: usize) -> *mut u8;
661
662    pub fn dav1d_data_wrap(
663        data: *mut Dav1dData,
664        buf: *const u8,
665        sz: usize,
666        free_callback: Option<unsafe extern "C" fn(buf: *const u8, cookie: *mut c_void)>,
667        cookie: *mut c_void,
668    ) -> c_int;
669
670    pub fn dav1d_data_wrap_user_data(
671        data: *mut Dav1dData,
672        user_data: *const u8,
673        free_callback: Option<unsafe extern "C" fn(user_data: *const u8, cookie: *mut c_void)>,
674        cookie: *mut c_void,
675    ) -> c_int;
676
677    pub fn dav1d_data_unref(data: *mut Dav1dData);
678}
679
680#[cfg(test)]
681mod tests {
682    use super::*;
683    use std::ffi::CStr;
684
685    macro_rules! assert_size (
686        ($t:ty, $sz:expr) => (
687            assert_eq!(::std::mem::size_of::<$t>(), $sz);
688        );
689    );
690
691    #[test]
692    fn size() {
693        #[cfg(target_pointer_width = "64")]
694        assert_size!(Dav1dSettings, 96);
695        #[cfg(target_pointer_width = "32")]
696        assert_size!(Dav1dSettings, 76);
697    }
698
699    #[test]
700    fn version() {
701        println!("{}", unsafe {
702            CStr::from_ptr(dav1d_version()).to_string_lossy()
703        });
704    }
705}