Skip to main content

av_scenechange/data/
superblock.rs

1use crate::data::{
2    block::{BlockOffset, MIB_SIZE_LOG2},
3    tile::TileBlockOffset,
4};
5
6pub const MAX_SB_SIZE_LOG2: usize = 7;
7pub const SUPERBLOCK_TO_BLOCK_SHIFT: usize = MIB_SIZE_LOG2;
8pub const SB_SIZE_LOG2: usize = 6;
9pub const SB_SIZE: usize = 1 << SB_SIZE_LOG2;
10pub const MI_SIZE_LOG2: usize = 2;
11pub const MI_SIZE: usize = 1 << MI_SIZE_LOG2;
12
13/// Absolute offset in superblocks inside a tile, where a superblock is defined
14/// to be an `N*N` square where `N == (1 << SUPERBLOCK_TO_PLANE_SHIFT)`.
15#[derive(Clone, Copy, Debug, PartialEq, Eq)]
16pub struct TileSuperBlockOffset(pub SuperBlockOffset);
17
18impl TileSuperBlockOffset {
19    /// Offset of a block inside the current superblock.
20    pub const fn block_offset(self, block_x: usize, block_y: usize) -> TileBlockOffset {
21        TileBlockOffset(self.0.block_offset(block_x, block_y))
22    }
23}
24
25/// Absolute offset in superblocks inside a plane, where a superblock is defined
26/// to be an `N*N` square where `N == (1 << SUPERBLOCK_TO_PLANE_SHIFT)`.
27#[derive(Clone, Copy, Debug, PartialEq, Eq)]
28pub struct PlaneSuperBlockOffset(pub SuperBlockOffset);
29
30/// Absolute offset in superblocks, where a superblock is defined
31/// to be an `N*N` square where `N == (1 << SUPERBLOCK_TO_PLANE_SHIFT)`.
32#[derive(Clone, Copy, Debug, PartialEq, Eq)]
33pub struct SuperBlockOffset {
34    pub x: usize,
35    pub y: usize,
36}
37
38impl SuperBlockOffset {
39    /// Offset of a block inside the current superblock.
40    const fn block_offset(self, block_x: usize, block_y: usize) -> BlockOffset {
41        BlockOffset {
42            x: (self.x << SUPERBLOCK_TO_BLOCK_SHIFT) + block_x,
43            y: (self.y << SUPERBLOCK_TO_BLOCK_SHIFT) + block_y,
44        }
45    }
46}