aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Nvdec/VDec/VideoDecoder.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Nvdec/VDec/VideoDecoder.cs')
-rw-r--r--Ryujinx.Graphics.Nvdec/VDec/VideoDecoder.cs21
1 files changed, 18 insertions, 3 deletions
diff --git a/Ryujinx.Graphics.Nvdec/VDec/VideoDecoder.cs b/Ryujinx.Graphics.Nvdec/VDec/VideoDecoder.cs
index b4a89d8f..9afc9485 100644
--- a/Ryujinx.Graphics.Nvdec/VDec/VideoDecoder.cs
+++ b/Ryujinx.Graphics.Nvdec/VDec/VideoDecoder.cs
@@ -1,6 +1,8 @@
using Ryujinx.Graphics.Gpu;
+using Ryujinx.Graphics.Gpu.Memory;
using Ryujinx.Graphics.Vic;
using System;
+using System.Runtime.InteropServices;
namespace Ryujinx.Graphics.VDec
{
@@ -70,7 +72,7 @@ namespace Ryujinx.Graphics.VDec
ScalingMatrix8 = gpu.MemoryAccessor.ReadBytes(_decoderContextAddress + 0x220, 2 * 64)
};
- byte[] frameData = gpu.MemoryAccessor.ReadBytes(_frameDataAddress, (ulong)frameDataSize);
+ byte[] frameData = gpu.MemoryAccessor.ReadBytes(_frameDataAddress, frameDataSize);
_h264Decoder.Decode(Params, matrices, frameData);
}
@@ -86,7 +88,7 @@ namespace Ryujinx.Graphics.VDec
Ref2Key = (long)gpu.MemoryManager.Translate(_vpxRef2LumaAddress)
};
- Vp9FrameHeader header = gpu.MemoryAccessor.Read<Vp9FrameHeader>(_decoderContextAddress + 0x48);
+ Vp9FrameHeader header = ReadStruct<Vp9FrameHeader>(gpu.MemoryAccessor, _decoderContextAddress + 0x48);
Vp9ProbabilityTables probs = new Vp9ProbabilityTables()
{
@@ -117,7 +119,7 @@ namespace Ryujinx.Graphics.VDec
MvHpProbs = gpu.MemoryAccessor.ReadBytes(_vpxProbTablesAddress + 0x54a, 0x2)
};
- byte[] frameData = gpu.MemoryAccessor.ReadBytes(_frameDataAddress, (ulong)frameDataSize);
+ byte[] frameData = gpu.MemoryAccessor.ReadBytes(_frameDataAddress, frameDataSize);
_vp9Decoder.Decode(keys, header, probs, frameData);
}
@@ -127,6 +129,19 @@ namespace Ryujinx.Graphics.VDec
}
}
+ private T ReadStruct<T>(MemoryAccessor accessor, ulong address) where T : struct
+ {
+ byte[] data = accessor.ReadBytes(address, Marshal.SizeOf<T>());
+
+ unsafe
+ {
+ fixed (byte* ptr = data)
+ {
+ return Marshal.PtrToStructure<T>((IntPtr)ptr);
+ }
+ }
+ }
+
private void SetDecoderCtxAddr(int[] arguments)
{
_decoderContextAddress = GetAddress(arguments);