From fcdfd8a4822f4ce1be3f01fc97fa25a847221568 Mon Sep 17 00:00:00 2001
From: Mary <me@thog.eu>
Date: Sun, 2 May 2021 22:08:35 +0200
Subject: [PATCH] Update to FFmpeg 4.4.0 (#2259)

* Update to FFmpeg 4.4.0

As the title say

* Fix warning from 4.4.0
---
 Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs  | 19 +++++++++++++------
 .../Ryujinx.Graphics.Nvdec.H264.csproj        |  2 +-
 Ryujinx/Ryujinx.csproj                        |  2 +-
 3 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs b/Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs
index b4f9206bad..98754c767c 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)
diff --git a/Ryujinx.Graphics.Nvdec.H264/Ryujinx.Graphics.Nvdec.H264.csproj b/Ryujinx.Graphics.Nvdec.H264/Ryujinx.Graphics.Nvdec.H264.csproj
index 2d54173cdc..fdcdae06de 100644
--- a/Ryujinx.Graphics.Nvdec.H264/Ryujinx.Graphics.Nvdec.H264.csproj
+++ b/Ryujinx.Graphics.Nvdec.H264/Ryujinx.Graphics.Nvdec.H264.csproj
@@ -6,7 +6,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="FFmpeg.AutoGen" Version="4.3.0" />
+    <PackageReference Include="FFmpeg.AutoGen" Version="4.4.0" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/Ryujinx/Ryujinx.csproj b/Ryujinx/Ryujinx.csproj
index 59edc9193d..c4d758748d 100644
--- a/Ryujinx/Ryujinx.csproj
+++ b/Ryujinx/Ryujinx.csproj
@@ -15,7 +15,7 @@
     <PackageReference Include="DiscordRichPresence" Version="1.0.166" />
     <PackageReference Include="GtkSharp" Version="3.22.25.128" />
     <PackageReference Include="GtkSharp.Dependencies" Version="1.1.0" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'osx-x64'" />
-    <PackageReference Include="Ryujinx.Graphics.Nvdec.Dependencies" Version="4.3.0" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'osx-x64'" />
+    <PackageReference Include="Ryujinx.Graphics.Nvdec.Dependencies" Version="4.4.0-build7" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'osx-x64'" />
     <PackageReference Include="Ryujinx.Audio.OpenAL.Dependencies" Version="1.21.0.1" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'osx-x64'" />
     <PackageReference Include="OpenTK.Graphics" Version="4.5.0" />
     <PackageReference Include="SPB" Version="0.0.2" />