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:
parent
0d23504e30
commit
f4f496cb48
18 changed files with 358 additions and 200 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
public uint FrameStatusBwdMvyCnt;
|
||||
public uint ErrorCtbPos;
|
||||
public uint ErrorSlicePos;
|
||||
public uint Unknown34;
|
||||
#pragma warning restore CS0649
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue