aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/video_core/host1x/codecs/decoder.h
diff options
context:
space:
mode:
authoryuzubot <[email protected]>2024-03-04 00:57:21 +0000
committeryuzubot <[email protected]>2024-03-04 00:57:21 +0000
commit276ceb26d0c58a00a0e65e3bf4d9c4371428f82d (patch)
tree587c6b5415501f1b1a1795ddd6df8d3403252cb4 /src/video_core/host1x/codecs/decoder.h
parent15e6e48bef0216480661444a8d8b348c1cca47bb (diff)
downloadyuzu-android-276ceb26d0c58a00a0e65e3bf4d9c4371428f82d.tar.gz
yuzu-android-276ceb26d0c58a00a0e65e3bf4d9c4371428f82d.zip
Merge yuzu-emu#12461
Diffstat (limited to 'src/video_core/host1x/codecs/decoder.h')
-rw-r--r--src/video_core/host1x/codecs/decoder.h64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/video_core/host1x/codecs/decoder.h b/src/video_core/host1x/codecs/decoder.h
new file mode 100644
index 000000000..22e6db815
--- /dev/null
+++ b/src/video_core/host1x/codecs/decoder.h
@@ -0,0 +1,64 @@
+// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <memory>
+#include <mutex>
+#include <optional>
+#include <string_view>
+#include <unordered_map>
+#include <queue>
+
+#include "common/common_types.h"
+#include "video_core/host1x/ffmpeg/ffmpeg.h"
+#include "video_core/host1x/nvdec_common.h"
+
+namespace Tegra {
+
+namespace Host1x {
+class Host1x;
+class FrameQueue;
+} // namespace Host1x
+
+class Decoder {
+public:
+ virtual ~Decoder();
+
+ /// Call decoders to construct headers, decode AVFrame with ffmpeg
+ void Decode();
+
+ bool UsingDecodeOrder() const {
+ return decode_api.UsingDecodeOrder();
+ }
+
+ /// Returns the value of current_codec
+ [[nodiscard]] Host1x::NvdecCommon::VideoCodec GetCurrentCodec() const {
+ return codec;
+ }
+
+ /// Return name of the current codec
+ [[nodiscard]] virtual std::string_view GetCurrentCodecName() const = 0;
+
+protected:
+ explicit Decoder(Host1x::Host1x& host1x, s32 id,
+ const Host1x::NvdecCommon::NvdecRegisters& regs,
+ Host1x::FrameQueue& frame_queue);
+
+ virtual std::span<const u8> ComposeFrame() = 0;
+ virtual std::tuple<u64, u64> GetProgressiveOffsets() = 0;
+ virtual std::tuple<u64, u64, u64, u64> GetInterlacedOffsets() = 0;
+ virtual bool IsInterlaced() = 0;
+
+ Host1x::Host1x& host1x;
+ Tegra::MemoryManager& memory_manager;
+ const Host1x::NvdecCommon::NvdecRegisters& regs;
+ s32 id;
+ Host1x::FrameQueue& frame_queue;
+ Host1x::NvdecCommon::VideoCodec codec;
+ FFmpeg::DecodeApi decode_api;
+ bool initialized{};
+ bool vp9_hidden_frame{};
+};
+
+} // namespace Tegra