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
This commit is contained in:
gdkchan 2021-09-28 19:43:40 -03:00 committed by GitHub
parent 0d23504e30
commit f4f496cb48
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 358 additions and 200 deletions

View file

@ -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<int> FieldOrderCnt;
public Array16<ReferenceFrame> 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;

View file

@ -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<uint> FieldOrderCnt;
public uint FrameNum;
#pragma warning restore CS0649
public uint OutputSurfaceIndex => (uint)Flags & 0x7f;
}
}

View file

@ -16,7 +16,6 @@
public uint FrameStatusBwdMvyCnt;
public uint ErrorCtbPos;
public uint ErrorSlicePos;
public uint Unknown34;
#pragma warning restore CS0649
}
}