From 2b4b6c5613d1d597c717990d3b0bb6b114e13caf Mon Sep 17 00:00:00 2001 From: Zaggy1024 Date: Sat, 29 Oct 2022 19:53:24 -0500 Subject: [PATCH] LibVideo: Make VP9::Decoder a subclass of a new abstract VideoDecoder This will allow other decoders to be used in place of VP9::Decoder when new video decoders are implemented, such as AV1. --- Userland/Applications/VideoPlayer/main.cpp | 6 ++--- Userland/Libraries/LibVideo/VP9/Decoder.cpp | 5 ---- Userland/Libraries/LibVideo/VP9/Decoder.h | 9 +++---- Userland/Libraries/LibVideo/VideoDecoder.h | 26 +++++++++++++++++++++ 4 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 Userland/Libraries/LibVideo/VideoDecoder.h diff --git a/Userland/Applications/VideoPlayer/main.cpp b/Userland/Applications/VideoPlayer/main.cpp index 03fecaa3d9..1c591a97d6 100644 --- a/Userland/Applications/VideoPlayer/main.cpp +++ b/Userland/Applications/VideoPlayer/main.cpp @@ -49,7 +49,7 @@ ErrorOr serenity_main(Main::Arguments arguments) main_widget->set_layout(); auto image_widget = TRY(main_widget->try_add()); - Video::VP9::Decoder vp9_decoder; + OwnPtr decoder = make(); size_t cluster_index = 0; size_t block_index = 0; size_t frame_index = 0; @@ -76,14 +76,14 @@ ErrorOr serenity_main(Main::Arguments arguments) if (!optional_sample.has_value()) return; - auto result = vp9_decoder.receive_sample(optional_sample.release_value()); + auto result = decoder->receive_sample(optional_sample.release_value()); if (result.is_error()) { outln("Error decoding frame {}: {}", frame_number, result.error().string_literal()); return; } - auto frame_result = vp9_decoder.get_decoded_frame(); + auto frame_result = decoder->get_decoded_frame(); if (frame_result.is_error()) { outln("Error retrieving frame {}: {}", frame_number, frame_result.error().string_literal()); return; diff --git a/Userland/Libraries/LibVideo/VP9/Decoder.cpp b/Userland/Libraries/LibVideo/VP9/Decoder.cpp index b899d3e050..d03f9df5fd 100644 --- a/Userland/Libraries/LibVideo/VP9/Decoder.cpp +++ b/Userland/Libraries/LibVideo/VP9/Decoder.cpp @@ -42,11 +42,6 @@ DecoderErrorOr Decoder::receive_sample(Span chunk_data) return {}; } -DecoderErrorOr Decoder::receive_sample(ByteBuffer const& chunk_data) -{ - return receive_sample(chunk_data.span()); -} - void Decoder::dump_frame_info() { m_parser->dump_info(); diff --git a/Userland/Libraries/LibVideo/VP9/Decoder.h b/Userland/Libraries/LibVideo/VP9/Decoder.h index bde1dd671f..11e2671c36 100644 --- a/Userland/Libraries/LibVideo/VP9/Decoder.h +++ b/Userland/Libraries/LibVideo/VP9/Decoder.h @@ -13,23 +13,24 @@ #include #include #include +#include #include #include "Parser.h" namespace Video::VP9 { -class Decoder { +class Decoder : public VideoDecoder { friend class Parser; public: Decoder(); + ~Decoder() override { } /* (8.1) General */ - DecoderErrorOr receive_sample(Span); - DecoderErrorOr receive_sample(ByteBuffer const&); + DecoderErrorOr receive_sample(Span) override; void dump_frame_info(); - DecoderErrorOr> get_decoded_frame(); + DecoderErrorOr> get_decoded_frame() override; private: typedef i32 Intermediate; diff --git a/Userland/Libraries/LibVideo/VideoDecoder.h b/Userland/Libraries/LibVideo/VideoDecoder.h new file mode 100644 index 0000000000..bcafc73fd5 --- /dev/null +++ b/Userland/Libraries/LibVideo/VideoDecoder.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2022, Gregory Bertilson + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +#include "DecoderError.h" +#include "VideoFrame.h" + +namespace Video { + +class VideoDecoder { +public: + virtual ~VideoDecoder() {}; + + virtual DecoderErrorOr receive_sample(Span sample) = 0; + DecoderErrorOr receive_sample(ByteBuffer const& sample) { return receive_sample(sample.span()); } + virtual DecoderErrorOr> get_decoded_frame() = 0; +}; + +}