aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs')
-rw-r--r--Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs19
1 files changed, 13 insertions, 6 deletions
diff --git a/Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs b/Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs
index b4f9206b..98754c76 100644
--- a/Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs
+++ b/Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs
@@ -6,6 +6,7 @@ namespace Ryujinx.Graphics.Nvdec.H264
unsafe class FFmpegContext : IDisposable
{
private readonly AVCodec* _codec;
+ private AVPacket* _packet;
private AVCodecContext* _context;
public FFmpegContext()
@@ -14,20 +15,21 @@ namespace Ryujinx.Graphics.Nvdec.H264
_context = ffmpeg.avcodec_alloc_context3(_codec);
ffmpeg.avcodec_open2(_context, _codec, null);
+
+ _packet = ffmpeg.av_packet_alloc();
}
public int DecodeFrame(Surface output, ReadOnlySpan<byte> bitstream)
{
- AVPacket packet;
-
- ffmpeg.av_init_packet(&packet);
+ // Ensure the packet is clean before proceeding
+ ffmpeg.av_packet_unref(_packet);
fixed (byte* ptr = bitstream)
{
- packet.data = ptr;
- packet.size = bitstream.Length;
+ _packet->data = ptr;
+ _packet->size = bitstream.Length;
- int rc = ffmpeg.avcodec_send_packet(_context, &packet);
+ int rc = ffmpeg.avcodec_send_packet(_context, _packet);
if (rc != 0)
{
@@ -40,6 +42,11 @@ namespace Ryujinx.Graphics.Nvdec.H264
public void Dispose()
{
+ fixed (AVPacket** ppPacket = &_packet)
+ {
+ ffmpeg.av_packet_free(ppPacket);
+ }
+
ffmpeg.avcodec_close(_context);
fixed (AVCodecContext** ppContext = &_context)