From 8ce4245214d6a2e259e463acb9b8b958af58c99e Mon Sep 17 00:00:00 2001 From: Zaggy1024 Date: Tue, 14 Feb 2023 04:27:48 -0600 Subject: [PATCH] LibVideo/VP9: Return Corrupted error when tile range decoder init fails Previously, we were incorrectly wrapping an error from `BooleanDecoder` initialization in a `DecoderErrorCategory::Memory` error. This caused an incorrect error message in VideoPlayer. Now it will instead return `DecoderErrorCategory::Corrupted`. --- Userland/Libraries/LibVideo/VP9/Context.h | 13 +++++++------ Userland/Libraries/LibVideo/VP9/Parser.cpp | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Userland/Libraries/LibVideo/VP9/Context.h b/Userland/Libraries/LibVideo/VP9/Context.h index ab410ab4f5..4cd7c996fc 100644 --- a/Userland/Libraries/LibVideo/VP9/Context.h +++ b/Userland/Libraries/LibVideo/VP9/Context.h @@ -14,6 +14,7 @@ #include #include #include +#include #include "BooleanDecoder.h" #include "ContextStorage.h" @@ -187,14 +188,14 @@ static NonZeroTokensView create_non_zero_tokens_view(NonZeroTokens& non_zero_tok struct TileContext { public: - static ErrorOr try_create(FrameContext& frame_context, u32 tile_size, u32 rows_start, u32 rows_end, u32 columns_start, u32 columns_end, PartitionContextView above_partition_context, NonZeroTokensView above_non_zero_tokens, SegmentationPredictionContextView above_segmentation_ids) + static DecoderErrorOr try_create(FrameContext& frame_context, u32 tile_size, u32 rows_start, u32 rows_end, u32 columns_start, u32 columns_end, PartitionContextView above_partition_context, NonZeroTokensView above_non_zero_tokens, SegmentationPredictionContextView above_segmentation_ids) { auto width = columns_end - columns_start; auto height = rows_end - rows_start; auto context_view = frame_context.m_block_contexts.view(rows_start, columns_start, height, width); - auto bit_stream = TRY(try_make(TRY(try_make(frame_context.stream)))); - auto decoder = TRY(BooleanDecoder::initialize(move(bit_stream), tile_size)); + auto bit_stream = DECODER_TRY_ALLOC(try_make(DECODER_TRY_ALLOC(try_make(frame_context.stream)))); + auto decoder = DECODER_TRY(DecoderErrorCategory::Corrupted, BooleanDecoder::initialize(move(bit_stream), tile_size)); return TileContext { frame_context, @@ -207,9 +208,9 @@ public: above_partition_context, above_non_zero_tokens, above_segmentation_ids, - TRY(PartitionContext::create(superblocks_to_blocks(blocks_ceiled_to_superblocks(height)))), - TRY(create_non_zero_tokens(blocks_to_sub_blocks(height), frame_context.color_config.subsampling_y)), - TRY(SegmentationPredictionContext::create(height)), + DECODER_TRY_ALLOC(PartitionContext::create(superblocks_to_blocks(blocks_ceiled_to_superblocks(height)))), + DECODER_TRY_ALLOC(create_non_zero_tokens(blocks_to_sub_blocks(height), frame_context.color_config.subsampling_y)), + DECODER_TRY_ALLOC(SegmentationPredictionContext::create(height)), }; } diff --git a/Userland/Libraries/LibVideo/VP9/Parser.cpp b/Userland/Libraries/LibVideo/VP9/Parser.cpp index f52e276513..80c325d91e 100644 --- a/Userland/Libraries/LibVideo/VP9/Parser.cpp +++ b/Userland/Libraries/LibVideo/VP9/Parser.cpp @@ -888,7 +888,7 @@ DecoderErrorOr Parser::decode_tiles(FrameContext& frame_context) auto above_non_zero_tokens_view = create_non_zero_tokens_view(above_non_zero_tokens, blocks_to_sub_blocks(columns_start), blocks_to_sub_blocks(columns_end - columns_start), frame_context.color_config.subsampling_x); auto above_segmentation_ids_for_tile = safe_slice(above_segmentation_ids.span(), columns_start, columns_end - columns_start); - auto tile_context = DECODER_TRY_ALLOC(TileContext::try_create(frame_context, tile_size, rows_start, rows_end, columns_start, columns_end, above_partition_context_for_tile, above_non_zero_tokens_view, above_segmentation_ids_for_tile)); + auto tile_context = TRY(TileContext::try_create(frame_context, tile_size, rows_start, rows_end, columns_start, columns_end, above_partition_context_for_tile, above_non_zero_tokens_view, above_segmentation_ids_for_tile)); TRY(decode_tile(tile_context)); TRY_READ(frame_context.bit_stream.discard(tile_size)); }