1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 05:47:35 +00:00

LibVideo/VP9: Move loop filter parameters to FrameContext

This commit is contained in:
Zaggy1024 2022-11-23 06:02:40 -06:00 committed by Andreas Kling
parent 90f16c78fa
commit 0df5c1f32f
3 changed files with 34 additions and 29 deletions

View file

@ -305,6 +305,12 @@ public:
bool high_precision_motion_vectors_allowed { false }; bool high_precision_motion_vectors_allowed { false };
InterpolationFilter interpolation_filter { InterpolationFilter::Switchable }; InterpolationFilter interpolation_filter { InterpolationFilter::Switchable };
u8 loop_filter_level { 0 };
u8 loop_filter_sharpness { 0 };
bool loop_filter_delta_enabled { false };
Array<i8, MAX_REF_FRAMES> loop_filter_reference_deltas;
Array<i8, 2> loop_filter_mode_deltas;
u16 header_size_in_bytes { 0 }; u16 header_size_in_bytes { 0 };
private: private:

View file

@ -107,6 +107,8 @@ DecoderErrorOr<FrameContext> Parser::parse_frame(ReadonlyBytes frame_data)
m_previous_frame_size = frame_context.size(); m_previous_frame_size = frame_context.size();
m_previous_show_frame = frame_context.shows_a_frame(); m_previous_show_frame = frame_context.shows_a_frame();
m_previous_color_config = frame_context.color_config; m_previous_color_config = frame_context.color_config;
m_previous_loop_filter_ref_deltas = frame_context.loop_filter_reference_deltas;
m_previous_loop_filter_mode_deltas = frame_context.loop_filter_mode_deltas;
return frame_context; return frame_context;
} }
@ -159,7 +161,6 @@ DecoderErrorOr<FrameContext> Parser::uncompressed_header()
return DecoderError::corrupted("uncompressed_header: Profile 3 reserved bit was non-zero"sv); return DecoderError::corrupted("uncompressed_header: Profile 3 reserved bit was non-zero"sv);
if (TRY_READ(m_bit_stream->read_bit())) { if (TRY_READ(m_bit_stream->read_bit())) {
m_loop_filter_level = 0;
frame_context.set_existing_frame_to_show(TRY_READ(m_bit_stream->read_bits(3))); frame_context.set_existing_frame_to_show(TRY_READ(m_bit_stream->read_bits(3)));
return frame_context; return frame_context;
} }
@ -259,7 +260,7 @@ DecoderErrorOr<FrameContext> Parser::uncompressed_header()
frame_context.should_replace_probability_context = should_replace_probability_context; frame_context.should_replace_probability_context = should_replace_probability_context;
frame_context.probability_context_index = probability_context_index; frame_context.probability_context_index = probability_context_index;
TRY(loop_filter_params()); TRY(loop_filter_params(frame_context));
TRY(quantization_params()); TRY(quantization_params());
TRY(segmentation_params()); TRY(segmentation_params());
TRY(tile_info(frame_context)); TRY(tile_info(frame_context));
@ -393,23 +394,26 @@ DecoderErrorOr<InterpolationFilter> Parser::read_interpolation_filter()
return literal_to_type[TRY_READ(m_bit_stream->read_bits(2))]; return literal_to_type[TRY_READ(m_bit_stream->read_bits(2))];
} }
DecoderErrorOr<void> Parser::loop_filter_params() DecoderErrorOr<void> Parser::loop_filter_params(FrameContext& frame_context)
{ {
m_loop_filter_level = TRY_READ(m_bit_stream->read_bits(6)); frame_context.loop_filter_level = TRY_READ(m_bit_stream->read_bits(6));
m_loop_filter_sharpness = TRY_READ(m_bit_stream->read_bits(3)); frame_context.loop_filter_sharpness = TRY_READ(m_bit_stream->read_bits(3));
m_loop_filter_delta_enabled = TRY_READ(m_bit_stream->read_bit()); frame_context.loop_filter_delta_enabled = TRY_READ(m_bit_stream->read_bit());
if (m_loop_filter_delta_enabled) {
if (TRY_READ(m_bit_stream->read_bit())) { auto reference_deltas = m_previous_loop_filter_ref_deltas;
for (auto& loop_filter_ref_delta : m_loop_filter_ref_deltas) { auto mode_deltas = m_previous_loop_filter_mode_deltas;
if (TRY_READ(m_bit_stream->read_bit())) if (frame_context.loop_filter_delta_enabled && TRY_READ(m_bit_stream->read_bit())) {
loop_filter_ref_delta = TRY_READ(m_bit_stream->read_s(6)); for (auto& loop_filter_ref_delta : reference_deltas) {
} if (TRY_READ(m_bit_stream->read_bit()))
for (auto& loop_filter_mode_delta : m_loop_filter_mode_deltas) { loop_filter_ref_delta = TRY_READ(m_bit_stream->read_s(6));
if (TRY_READ(m_bit_stream->read_bit())) }
loop_filter_mode_delta = TRY_READ(m_bit_stream->read_s(6)); for (auto& loop_filter_mode_delta : mode_deltas) {
} if (TRY_READ(m_bit_stream->read_bit()))
loop_filter_mode_delta = TRY_READ(m_bit_stream->read_s(6));
} }
} }
frame_context.loop_filter_reference_deltas = reference_deltas;
frame_context.loop_filter_mode_deltas = mode_deltas;
return {}; return {};
} }
@ -524,13 +528,11 @@ void Parser::setup_past_independence()
} }
m_previous_block_contexts.reset(); m_previous_block_contexts.reset();
m_segmentation_abs_or_delta_update = false; m_segmentation_abs_or_delta_update = false;
m_loop_filter_delta_enabled = true; m_previous_loop_filter_ref_deltas[IntraFrame] = 1;
m_loop_filter_ref_deltas[IntraFrame] = 1; m_previous_loop_filter_ref_deltas[LastFrame] = 0;
m_loop_filter_ref_deltas[LastFrame] = 0; m_previous_loop_filter_ref_deltas[GoldenFrame] = -1;
m_loop_filter_ref_deltas[GoldenFrame] = -1; m_previous_loop_filter_ref_deltas[AltRefFrame] = -1;
m_loop_filter_ref_deltas[AltRefFrame] = -1; m_previous_loop_filter_mode_deltas.fill(0);
for (auto& loop_filter_mode_delta : m_loop_filter_mode_deltas)
loop_filter_mode_delta = 0;
m_probability_tables->reset_probs(); m_probability_tables->reset_probs();
} }

View file

@ -64,7 +64,7 @@ private:
DecoderErrorOr<Gfx::Size<u32>> parse_render_size(Gfx::Size<u32> frame_size); DecoderErrorOr<Gfx::Size<u32>> parse_render_size(Gfx::Size<u32> frame_size);
DecoderErrorOr<void> compute_image_size(FrameContext&); DecoderErrorOr<void> compute_image_size(FrameContext&);
DecoderErrorOr<InterpolationFilter> read_interpolation_filter(); DecoderErrorOr<InterpolationFilter> read_interpolation_filter();
DecoderErrorOr<void> loop_filter_params(); DecoderErrorOr<void> loop_filter_params(FrameContext&);
DecoderErrorOr<void> quantization_params(); DecoderErrorOr<void> quantization_params();
DecoderErrorOr<i8> read_delta_q(); DecoderErrorOr<i8> read_delta_q();
DecoderErrorOr<void> segmentation_params(); DecoderErrorOr<void> segmentation_params();
@ -141,14 +141,13 @@ private:
Gfx::Point<size_t> get_decoded_point_for_plane(FrameContext const&, u32 row, u32 column, u8 plane); Gfx::Point<size_t> get_decoded_point_for_plane(FrameContext const&, u32 row, u32 column, u8 plane);
Gfx::Size<size_t> get_decoded_size_for_plane(FrameContext const&, u8 plane); Gfx::Size<size_t> get_decoded_size_for_plane(FrameContext const&, u8 plane);
u8 m_loop_filter_level { 0 };
u8 m_loop_filter_sharpness { 0 };
bool m_loop_filter_delta_enabled { false };
bool m_is_first_compute_image_size_invoke { true }; bool m_is_first_compute_image_size_invoke { true };
Gfx::Size<u32> m_previous_frame_size { 0, 0 }; Gfx::Size<u32> m_previous_frame_size { 0, 0 };
bool m_previous_show_frame { false }; bool m_previous_show_frame { false };
ColorConfig m_previous_color_config; ColorConfig m_previous_color_config;
FrameType m_previous_frame_type { FrameType::KeyFrame }; FrameType m_previous_frame_type { FrameType::KeyFrame };
Array<i8, MAX_REF_FRAMES> m_previous_loop_filter_ref_deltas;
Array<i8, 2> m_previous_loop_filter_mode_deltas;
u8 m_base_q_idx { 0 }; u8 m_base_q_idx { 0 };
i8 m_delta_q_y_dc { 0 }; i8 m_delta_q_y_dc { 0 };
i8 m_delta_q_uv_dc { 0 }; i8 m_delta_q_uv_dc { 0 };
@ -164,8 +163,6 @@ private:
bool m_segmentation_abs_or_delta_update { false }; bool m_segmentation_abs_or_delta_update { false };
u16 m_tile_cols_log2 { 0 }; u16 m_tile_cols_log2 { 0 };
u16 m_tile_rows_log2 { 0 }; u16 m_tile_rows_log2 { 0 };
i8 m_loop_filter_ref_deltas[MAX_REF_FRAMES];
i8 m_loop_filter_mode_deltas[2];
// FIXME: Move above and left contexts to structs // FIXME: Move above and left contexts to structs
Array<Vector<bool>, 3> m_above_nonzero_context; Array<Vector<bool>, 3> m_above_nonzero_context;