Skip to content

Commit

Permalink
struct Dav1dContext: Deduplicate (last one and all its circular dep…
Browse files Browse the repository at this point in the history
…endents) (#482)

`struct Dav1dContext` circularly contains references to:
* `struct Dav1dFrameContext`
  * `struct Dav1dFrameContext_bd_fn`
    * `type recon_b_intra_fn`
    * `type recon_b_inter_fn`
    * `type filter_sbrow_fn`
    * `type backup_ipred_edge_fn`
    * `type read_coef_blocks_fn`
* `struct Dav1dTaskContext`

which are also all deduplicated in the same commit since they are
self-referential to each other.

Since `struct Dav1dContext` is a publically incomplete type in C, we
(for now) make it `pub` with a `pub use` unlike the rest of
`src::internal`. The correct way to expose such an opaque type is
through type alias impl trait (TAIT), but that's still unstable, so this
should suffice now until we've progressed further. The next commit also
does this for `struct Dav1dRef`, too, as that's the other type that
`dav1d` exposes as an incomplete type.
  • Loading branch information
kkysen authored Sep 22, 2023
2 parents 2397240 + bac5f54 commit 51a3ab3
Show file tree
Hide file tree
Showing 23 changed files with 318 additions and 3,197 deletions.
3 changes: 3 additions & 0 deletions include/dav1d/dav1d.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
pub use crate::src::internal::Dav1dContext;
pub use crate::src::r#ref::Dav1dRef;

#[derive(Clone)]
#[repr(C)]
pub struct Dav1dLogger {
Expand Down
5 changes: 3 additions & 2 deletions lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ pub mod src {
#[cfg(feature = "bitdepth_8")]
mod filmgrain_tmpl_8;
mod getbits;
mod internal;
// TODO(kkysen) Temporarily `pub(crate)` due to a `pub use` until TAIT.
pub(super) mod internal;
mod intra_edge;
mod ipred;
mod ipred_prepare;
Expand Down Expand Up @@ -107,7 +108,7 @@ pub mod src {
mod recon_tmpl_16;
#[cfg(feature = "bitdepth_8")]
mod recon_tmpl_8;
pub mod r#ref;
pub(crate) mod r#ref;
mod refmvs;
mod scan;
mod tables;
Expand Down
217 changes: 3 additions & 214 deletions src/cdef_apply_tmpl_16.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use std::cmp;

use crate::include::common::bitdepth::DynPixel;
use crate::include::stddef::*;
use crate::include::stdint::*;

Expand All @@ -10,218 +9,21 @@ extern "C" {
}

pub type pixel = uint16_t;
use crate::include::stdatomic::atomic_int;

use crate::include::dav1d::common::Dav1dDataProps;
use crate::include::dav1d::data::Dav1dData;
use crate::src::r#ref::Dav1dRef;
#[repr(C)]
pub struct Dav1dFrameContext {
pub seq_hdr_ref: *mut Dav1dRef,
pub seq_hdr: *mut Dav1dSequenceHeader,
pub frame_hdr_ref: *mut Dav1dRef,
pub frame_hdr: *mut Dav1dFrameHeader,
pub refp: [Dav1dThreadPicture; 7],
pub cur: Dav1dPicture,
pub sr_cur: Dav1dThreadPicture,
pub mvs_ref: *mut Dav1dRef,
pub mvs: *mut refmvs_temporal_block,
pub ref_mvs: [*mut refmvs_temporal_block; 7],
pub ref_mvs_ref: [*mut Dav1dRef; 7],
pub cur_segmap_ref: *mut Dav1dRef,
pub prev_segmap_ref: *mut Dav1dRef,
pub cur_segmap: *mut uint8_t,
pub prev_segmap: *const uint8_t,
pub refpoc: [libc::c_uint; 7],
pub refrefpoc: [[libc::c_uint; 7]; 7],
pub gmv_warp_allowed: [uint8_t; 7],
pub in_cdf: CdfThreadContext,
pub out_cdf: CdfThreadContext,
pub tile: *mut Dav1dTileGroup,
pub n_tile_data_alloc: libc::c_int,
pub n_tile_data: libc::c_int,
pub svc: [[ScalableMotionParams; 2]; 7],
pub resize_step: [libc::c_int; 2],
pub resize_start: [libc::c_int; 2],
pub c: *const Dav1dContext,
pub ts: *mut Dav1dTileState,
pub n_ts: libc::c_int,
pub dsp: *const Dav1dDSPContext,
pub bd_fn: Dav1dFrameContext_bd_fn,
pub ipred_edge_sz: libc::c_int,
pub ipred_edge: [*mut DynPixel; 3],
pub b4_stride: ptrdiff_t,
pub w4: libc::c_int,
pub h4: libc::c_int,
pub bw: libc::c_int,
pub bh: libc::c_int,
pub sb128w: libc::c_int,
pub sb128h: libc::c_int,
pub sbh: libc::c_int,
pub sb_shift: libc::c_int,
pub sb_step: libc::c_int,
pub sr_sb128w: libc::c_int,
pub dq: [[[uint16_t; 2]; 3]; 8],
pub qm: [[*const uint8_t; 3]; 19],
pub a: *mut BlockContext,
pub a_sz: libc::c_int,
pub rf: refmvs_frame,
pub jnt_weights: [[uint8_t; 7]; 7],
pub bitdepth_max: libc::c_int,
pub frame_thread: Dav1dFrameContext_frame_thread,
pub lf: Dav1dFrameContext_lf,
pub task_thread: Dav1dFrameContext_task_thread,
pub tile_thread: FrameTileThreadData,
}
use crate::include::dav1d::headers::Dav1dContentLightLevel;
use crate::include::dav1d::headers::Dav1dITUTT35;
use crate::include::dav1d::headers::Dav1dMasteringDisplay;
use crate::include::dav1d::picture::Dav1dPicture;
use crate::src::internal::Dav1dFrameContext_task_thread;
use crate::src::internal::FrameTileThreadData;
use crate::src::internal::TaskThreadData;
use crate::src::internal::Dav1dFrameContext;

use crate::include::dav1d::headers::Dav1dFrameHeader;
use crate::include::dav1d::headers::Dav1dPixelLayout;
use crate::include::dav1d::headers::Dav1dWarpedMotionParams;

use crate::include::dav1d::headers::DAV1D_PIXEL_LAYOUT_I400;
use crate::include::dav1d::headers::DAV1D_PIXEL_LAYOUT_I420;
use crate::include::dav1d::headers::DAV1D_PIXEL_LAYOUT_I422;
use crate::include::dav1d::headers::DAV1D_PIXEL_LAYOUT_I444;

use crate::include::dav1d::headers::Dav1dSequenceHeader;

use crate::src::align::Align16;

use crate::src::internal::Dav1dFrameContext_frame_thread;
use crate::src::internal::Dav1dFrameContext_lf;
use crate::src::lf_mask::Av1Filter;

use crate::src::levels::Av1Block;
use crate::src::refmvs::refmvs_frame;

use crate::src::env::BlockContext;
use crate::src::refmvs::refmvs_temporal_block;
#[repr(C)]
pub struct Dav1dFrameContext_bd_fn {
pub recon_b_intra: recon_b_intra_fn,
pub recon_b_inter: recon_b_inter_fn,
pub filter_sbrow: filter_sbrow_fn,
pub filter_sbrow_deblock_cols: filter_sbrow_fn,
pub filter_sbrow_deblock_rows: filter_sbrow_fn,
pub filter_sbrow_cdef: Option<unsafe extern "C" fn(*mut Dav1dTaskContext, libc::c_int) -> ()>,
pub filter_sbrow_resize: filter_sbrow_fn,
pub filter_sbrow_lr: filter_sbrow_fn,
pub backup_ipred_edge: backup_ipred_edge_fn,
pub read_coef_blocks: read_coef_blocks_fn,
}
pub type read_coef_blocks_fn =
Option<unsafe extern "C" fn(*mut Dav1dTaskContext, BlockSize, *const Av1Block) -> ()>;
use crate::src::levels::BlockSize;

#[repr(C)]
pub struct Dav1dTaskContext {
pub c: *const Dav1dContext,
pub f: *const Dav1dFrameContext,
pub ts: *mut Dav1dTileState,
pub bx: libc::c_int,
pub by: libc::c_int,
pub l: BlockContext,
pub a: *mut BlockContext,
pub rt: refmvs_tile,
pub c2rust_unnamed: Dav1dTaskContext_cf,
pub al_pal: [[[[uint16_t; 8]; 3]; 32]; 2],
pub pal_sz_uv: [[uint8_t; 32]; 2],
pub txtp_map: [uint8_t; 1024],
pub scratch: Dav1dTaskContext_scratch,
pub warpmv: Dav1dWarpedMotionParams,
pub lf_mask: *mut Av1Filter,
pub top_pre_cdef_toggle: libc::c_int,
pub cur_sb_cdef_idx_ptr: *mut int8_t,
pub tl_4x4_filter: Filter2d,
pub frame_thread: Dav1dTaskContext_frame_thread,
pub task_thread: Dav1dTaskContext_task_thread,
}
use crate::src::internal::Dav1dTaskContext_frame_thread;
use crate::src::internal::Dav1dTaskContext_task_thread;
use crate::src::levels::Filter2d;

use crate::src::internal::Dav1dTaskContext_cf;
use crate::src::internal::Dav1dTaskContext_scratch;
use crate::src::refmvs::refmvs_tile;

use crate::src::internal::Dav1dTileState;

#[repr(C)]
pub struct Dav1dContext {
pub fc: *mut Dav1dFrameContext,
pub n_fc: libc::c_uint,
pub tc: *mut Dav1dTaskContext,
pub n_tc: libc::c_uint,
pub tile: *mut Dav1dTileGroup,
pub n_tile_data_alloc: libc::c_int,
pub n_tile_data: libc::c_int,
pub n_tiles: libc::c_int,
pub seq_hdr_pool: *mut Dav1dMemPool,
pub seq_hdr_ref: *mut Dav1dRef,
pub seq_hdr: *mut Dav1dSequenceHeader,
pub frame_hdr_pool: *mut Dav1dMemPool,
pub frame_hdr_ref: *mut Dav1dRef,
pub frame_hdr: *mut Dav1dFrameHeader,
pub content_light_ref: *mut Dav1dRef,
pub content_light: *mut Dav1dContentLightLevel,
pub mastering_display_ref: *mut Dav1dRef,
pub mastering_display: *mut Dav1dMasteringDisplay,
pub itut_t35_ref: *mut Dav1dRef,
pub itut_t35: *mut Dav1dITUTT35,
pub in_0: Dav1dData,
pub out: Dav1dThreadPicture,
pub cache: Dav1dThreadPicture,
pub flush_mem: atomic_int,
pub flush: *mut atomic_int,
pub frame_thread: Dav1dContext_frame_thread,
pub task_thread: TaskThreadData,
pub segmap_pool: *mut Dav1dMemPool,
pub refmvs_pool: *mut Dav1dMemPool,
pub refs: [Dav1dContext_refs; 8],
pub cdf_pool: *mut Dav1dMemPool,
pub cdf: [CdfThreadContext; 8],
pub dsp: [Dav1dDSPContext; 3],
pub refmvs_dsp: Dav1dRefmvsDSPContext,
pub intra_edge: Dav1dContext_intra_edge,
pub allocator: Dav1dPicAllocator,
pub apply_grain: libc::c_int,
pub operating_point: libc::c_int,
pub operating_point_idc: libc::c_uint,
pub all_layers: libc::c_int,
pub max_spatial_id: libc::c_int,
pub frame_size_limit: libc::c_uint,
pub strict_std_compliance: libc::c_int,
pub output_invisible_frames: libc::c_int,
pub inloop_filters: Dav1dInloopFilterType,
pub decode_frame_type: Dav1dDecodeFrameType,
pub drain: libc::c_int,
pub frame_flags: PictureFlags,
pub event_flags: Dav1dEventFlags,
pub cached_error_props: Dav1dDataProps,
pub cached_error: libc::c_int,
pub logger: Dav1dLogger,
pub picture_pool: *mut Dav1dMemPool,
}
use crate::src::mem::Dav1dMemPool;

use crate::include::dav1d::dav1d::Dav1dEventFlags;
use crate::include::dav1d::dav1d::Dav1dLogger;
use crate::src::picture::PictureFlags;

use crate::include::dav1d::dav1d::Dav1dDecodeFrameType;
use crate::include::dav1d::dav1d::Dav1dInloopFilterType;

use crate::include::dav1d::picture::Dav1dPicAllocator;
use crate::src::internal::Dav1dContext_intra_edge;

use crate::src::intra_edge::EdgeFlags;
use crate::src::refmvs::Dav1dRefmvsDSPContext;
use crate::src::internal::Dav1dTaskContext;

use crate::src::internal::Dav1dDSPContext;

Expand All @@ -231,20 +33,7 @@ use crate::src::cdef::CDEF_HAVE_BOTTOM;
use crate::src::cdef::CDEF_HAVE_LEFT;
use crate::src::cdef::CDEF_HAVE_RIGHT;
use crate::src::cdef::CDEF_HAVE_TOP;
use crate::src::cdf::CdfThreadContext;

use crate::src::internal::Dav1dContext_frame_thread;
use crate::src::internal::Dav1dContext_refs;
use crate::src::internal::Dav1dTileGroup;
use crate::src::picture::Dav1dThreadPicture;
pub type backup_ipred_edge_fn = Option<unsafe extern "C" fn(*mut Dav1dTaskContext) -> ()>;
pub type filter_sbrow_fn = Option<unsafe extern "C" fn(*mut Dav1dFrameContext, libc::c_int) -> ()>;
pub type recon_b_inter_fn =
Option<unsafe extern "C" fn(*mut Dav1dTaskContext, BlockSize, *const Av1Block) -> libc::c_int>;
pub type recon_b_intra_fn = Option<
unsafe extern "C" fn(*mut Dav1dTaskContext, BlockSize, EdgeFlags, *const Av1Block) -> (),
>;
use crate::src::internal::ScalableMotionParams;
pub type Backup2x8Flags = libc::c_uint;
pub const BACKUP_2X8_UV: Backup2x8Flags = 2;
pub const BACKUP_2X8_Y: Backup2x8Flags = 1;
Expand Down
Loading

0 comments on commit 51a3ab3

Please sign in to comment.