mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-07-11 02:16:39 +02:00
a8093c2a3c
mainly doing this to reduce memory footprint; we all know how nice ankerl::unordered_dense is in theory 4x faster - in practice these maps arent that "hot" anyways so not likely to have much perf gained i just want to reduce mem fragmentation to ease my porting process, plus it helps other platforms as well (ahem weak Mediatek devices) :) Signed-off-by: lizzie <lizzie@eden-emu.dev> Co-authored-by: Caio Oliveira <caiooliveirafarias0@gmail.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3442 Reviewed-by: DraVee <dravee@eden-emu.dev> Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
68 lines
1.8 KiB
C++
68 lines
1.8 KiB
C++
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
// 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 <ankerl/unordered_dense.h>
|
|
#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
|