فهرست منبع

ffmpeg: Attempt to fix RootPath on some linux distributions (#2292)

* fix ffmpeg lib path

* Check if ffmpeg isn't found

* Move code to FFmpegContext

* Call it in static constructor

* revert static instance

* rollback

* lazy initialization

* Revert "lazy initialization"

This reverts commit f675d26a5d15ade72e41a5ba899ba80aed3c396d.
Ac_K 4 سال پیش
والد
کامیت
7b8ad1c36c
2فایلهای تغییر یافته به همراه36 افزوده شده و 4 حذف شده
  1. 36 0
      Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs
  2. 0 4
      Ryujinx/Program.cs

+ 36 - 0
Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs

@@ -1,6 +1,8 @@
 using FFmpeg.AutoGen;
 using FFmpeg.AutoGen;
 using Ryujinx.Common.Logging;
 using Ryujinx.Common.Logging;
 using System;
 using System;
+using System.Diagnostics;
+using System.IO;
 using System.Runtime.InteropServices;
 using System.Runtime.InteropServices;
 
 
 namespace Ryujinx.Graphics.Nvdec.H264
 namespace Ryujinx.Graphics.Nvdec.H264
@@ -28,6 +30,40 @@ namespace Ryujinx.Graphics.Nvdec.H264
             _packet = ffmpeg.av_packet_alloc();
             _packet = ffmpeg.av_packet_alloc();
         }
         }
 
 
+        static FFmpegContext()
+        {
+            SetRootPath();
+        }
+
+        private static void SetRootPath()
+        {
+            if (OperatingSystem.IsLinux())
+            {
+                // Configure FFmpeg search path
+                Process lddProcess = Process.Start(new ProcessStartInfo
+                {
+                    FileName               = "/bin/sh",
+                    Arguments              = "-c \"ldd $(which ffmpeg 2>/dev/null) | grep libavfilter\" 2>/dev/null",
+                    UseShellExecute        = false,
+                    RedirectStandardOutput = true
+                });
+
+                string lddOutput = lddProcess.StandardOutput.ReadToEnd();
+
+                lddProcess.WaitForExit();
+                lddProcess.Close();
+
+                if (lddOutput.Contains(" => "))
+                {
+                    ffmpeg.RootPath = Path.GetDirectoryName(lddOutput.Split(" => ")[1]);
+                }
+                else
+                {
+                    Logger.Error?.PrintMsg(LogClass.FFmpeg, "FFmpeg wasn't found. Make sure that you have it installed and up to date.");
+                }
+            }
+        }
+
         private void Log(void* p0, int level, string format, byte* vl)
         private void Log(void* p0, int level, string format, byte* vl)
         {
         {
             if (level > ffmpeg.av_log_get_level())
             if (level > ffmpeg.av_log_get_level())

+ 0 - 4
Ryujinx/Program.cs

@@ -1,5 +1,4 @@
 using ARMeilleure.Translation.PTC;
 using ARMeilleure.Translation.PTC;
-using FFmpeg.AutoGen;
 using Gtk;
 using Gtk;
 using Ryujinx.Common.Configuration;
 using Ryujinx.Common.Configuration;
 using Ryujinx.Common.GraphicsDriver;
 using Ryujinx.Common.GraphicsDriver;
@@ -78,9 +77,6 @@ namespace Ryujinx
             if (OperatingSystem.IsLinux())
             if (OperatingSystem.IsLinux())
             {
             {
                 XInitThreads();
                 XInitThreads();
-
-                // Configure FFmpeg search path
-                ffmpeg.RootPath = "/lib";
             }
             }
 
 
             string systemPath = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.Machine);
             string systemPath = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.Machine);