1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-28 20:27:46 +00:00

LibVideo/VP9: Move the above non-zero tokens context into decode_tiles

We can store this context in the stack of Parser::decode_tiles and use
spans to give access to the sections of the context for each tile and
subsequently each block.
This commit is contained in:
Zaggy1024 2022-11-28 01:01:11 -06:00 committed by Andreas Kling
parent 4e7e9d8479
commit 2f043a0bd4
5 changed files with 27 additions and 20 deletions

View file

@ -150,12 +150,12 @@ static ErrorOr<NonZeroTokens> create_non_zero_tokens(u32 size_in_sub_blocks, boo
}
template<typename T>
static Span<T> safe_slice(FixedArray<T>& array, u32 start, u32 size)
static Span<T> safe_slice(Span<T> span, u32 start, u32 size)
{
return array.span().slice(start, min(size, array.size() - start));
return span.slice(start, min(size, span.size() - start));
}
static NonZeroTokensView create_non_zero_tokens_view(NonZeroTokens& non_zero_tokens, u32 start_in_sub_blocks, u32 size_in_sub_blocks, bool subsampling)
static NonZeroTokensView create_non_zero_tokens_view(NonZeroTokensView non_zero_tokens, u32 start_in_sub_blocks, u32 size_in_sub_blocks, bool subsampling)
{
NonZeroTokensView result;
// Y plane
@ -168,9 +168,14 @@ static NonZeroTokensView create_non_zero_tokens_view(NonZeroTokens& non_zero_tok
return result;
}
static NonZeroTokensView create_non_zero_tokens_view(NonZeroTokens& non_zero_tokens, u32 start_in_sub_blocks, u32 size_in_sub_blocks, bool subsampling)
{
return create_non_zero_tokens_view({ non_zero_tokens[0].span(), non_zero_tokens[1].span(), non_zero_tokens[2].span() }, start_in_sub_blocks, size_in_sub_blocks, subsampling);
}
struct TileContext {
public:
static ErrorOr<TileContext> try_create(FrameContext& frame_context, u32 rows_start, u32 rows_end, u32 columns_start, u32 columns_end)
static ErrorOr<TileContext> try_create(FrameContext& frame_context, u32 rows_start, u32 rows_end, u32 columns_start, u32 columns_end, NonZeroTokensView above_non_zero_tokens)
{
auto context_view = frame_context.m_block_contexts.view(rows_start, columns_start, rows_end - rows_start, columns_end - columns_start);
@ -181,6 +186,7 @@ public:
columns_start,
columns_end,
context_view,
above_non_zero_tokens,
TRY(create_non_zero_tokens(blocks_to_sub_blocks(rows_end - rows_start), frame_context.color_config.subsampling_y)),
};
}
@ -196,6 +202,7 @@ public:
u32 columns() const { return columns_end - columns_start; }
Vector2DView<FrameBlockContext> block_contexts_view;
NonZeroTokensView above_non_zero_tokens;
NonZeroTokens left_non_zero_tokens;
};
@ -217,6 +224,7 @@ struct BlockContext {
.column = column,
.size = size,
.contexts_view = contexts_view,
.above_non_zero_tokens = create_non_zero_tokens_view(tile_context.above_non_zero_tokens, blocks_to_sub_blocks(column - tile_context.columns_start), size_in_sub_blocks.width(), tile_context.frame_context.color_config.subsampling_x),
.left_non_zero_tokens = create_non_zero_tokens_view(tile_context.left_non_zero_tokens, blocks_to_sub_blocks(row - tile_context.rows_start), size_in_sub_blocks.height(), tile_context.frame_context.color_config.subsampling_y),
};
}
@ -257,6 +265,7 @@ struct BlockContext {
// Indexed by ReferenceFrame enum.
Array<u8, 4> mode_context {};
NonZeroTokensView above_non_zero_tokens;
NonZeroTokensView left_non_zero_tokens;
};