From f4f496cb48a59aae36e3252baa90396e1bfadd2e Mon Sep 17 00:00:00 2001 From: gdkchan Date: Tue, 28 Sep 2021 19:43:40 -0300 Subject: NVDEC (H264): Use separate contexts per channel and decode frames in DTS order (#2671) * Use separate NVDEC contexts per channel (for FFMPEG) * Remove NVDEC -> VIC frame override hack * Add missing bottom_field_pic_order_in_frame_present_flag * Make FFMPEG logging static * nit: Remove empty lines * New FFMPEG decoding approach -- call h264_decode_frame directly, trim surface cache to reduce memory usage * Fix case * Silence warnings * PR feedback * Per-decoder rather than per-codec ownership of surfaces on the cache --- Ryujinx.Graphics.Nvdec/Types/H264/PictureInfo.cs | 18 +++++++++--------- Ryujinx.Graphics.Nvdec/Types/H264/ReferenceFrame.cs | 13 ++++++++----- Ryujinx.Graphics.Nvdec/Types/Vp9/FrameStats.cs | 1 - 3 files changed, 17 insertions(+), 15 deletions(-) (limited to 'Ryujinx.Graphics.Nvdec/Types') diff --git a/Ryujinx.Graphics.Nvdec/Types/H264/PictureInfo.cs b/Ryujinx.Graphics.Nvdec/Types/H264/PictureInfo.cs index 86570342..326c40ae 100644 --- a/Ryujinx.Graphics.Nvdec/Types/H264/PictureInfo.cs +++ b/Ryujinx.Graphics.Nvdec/Types/H264/PictureInfo.cs @@ -26,13 +26,13 @@ namespace Ryujinx.Graphics.Nvdec.Types.H264 public uint Transform8x8ModeFlag; public uint LumaPitch; public uint ChromaPitch; - public uint Unknown94; - public uint LumaSecondFieldOffset; - public uint Unknown9C; - public uint UnknownA0; - public uint ChromaSecondFieldOffset; - public uint UnknownA8; - public uint UnknownAC; + public uint LumaTopOffset; + public uint LumaBottomOffset; + public uint LumaFrameOffset; + public uint ChromaTopOffset; + public uint ChromaBottomFieldOffset; + public uint ChromaFrameOffset; + public uint HistBufferSize; public ulong Flags; public Array2 FieldOrderCnt; public Array16 RefFrames; @@ -64,8 +64,8 @@ namespace Ryujinx.Graphics.Nvdec.Types.H264 public int ChromaQpIndexOffset => ExtractSx(Flags, 22, 5); public int SecondChromaQpIndexOffset => ExtractSx(Flags, 27, 5); public uint WeightedBipredIdc => (uint)(Flags >> 32) & 3; - public uint LumaOutputSurfaceIndex => (uint)(Flags >> 34) & 0x7f; - public uint ChromaOutputSurfaceIndex => (uint)(Flags >> 41) & 0x1f; + public uint OutputSurfaceIndex => (uint)(Flags >> 34) & 0x7f; + public uint ColIndex => (uint)(Flags >> 41) & 0x1f; public ushort FrameNum => (ushort)(Flags >> 46); public bool QpprimeYZeroTransformBypassFlag => (Flags2 & (1 << 1)) != 0; diff --git a/Ryujinx.Graphics.Nvdec/Types/H264/ReferenceFrame.cs b/Ryujinx.Graphics.Nvdec/Types/H264/ReferenceFrame.cs index 163a8783..d205a47a 100644 --- a/Ryujinx.Graphics.Nvdec/Types/H264/ReferenceFrame.cs +++ b/Ryujinx.Graphics.Nvdec/Types/H264/ReferenceFrame.cs @@ -1,12 +1,15 @@ -namespace Ryujinx.Graphics.Nvdec.Types.H264 +using Ryujinx.Common.Memory; + +namespace Ryujinx.Graphics.Nvdec.Types.H264 { struct ReferenceFrame { #pragma warning disable CS0649 - public uint Unknown0; - public uint Unknown4; - public uint Unknown8; - public uint UnknownC; + public uint Flags; + public Array2 FieldOrderCnt; + public uint FrameNum; #pragma warning restore CS0649 + + public uint OutputSurfaceIndex => (uint)Flags & 0x7f; } } diff --git a/Ryujinx.Graphics.Nvdec/Types/Vp9/FrameStats.cs b/Ryujinx.Graphics.Nvdec/Types/Vp9/FrameStats.cs index c360d378..26aab506 100644 --- a/Ryujinx.Graphics.Nvdec/Types/Vp9/FrameStats.cs +++ b/Ryujinx.Graphics.Nvdec/Types/Vp9/FrameStats.cs @@ -16,7 +16,6 @@ public uint FrameStatusBwdMvyCnt; public uint ErrorCtbPos; public uint ErrorSlicePos; - public uint Unknown34; #pragma warning restore CS0649 } } -- cgit v1.2.3