diff --git a/Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs b/Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs index c402c574b..17de1a03a 100644 --- a/Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs +++ b/Ryujinx.Graphics.Nvdec.H264/FFmpegContext.cs @@ -1,6 +1,8 @@ using FFmpeg.AutoGen; using Ryujinx.Common.Logging; using System; +using System.Diagnostics; +using System.IO; using System.Runtime.InteropServices; namespace Ryujinx.Graphics.Nvdec.H264 @@ -28,6 +30,40 @@ namespace Ryujinx.Graphics.Nvdec.H264 _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) { if (level > ffmpeg.av_log_get_level()) diff --git a/Ryujinx/Program.cs b/Ryujinx/Program.cs index 9600f9dce..fbdea7de6 100644 --- a/Ryujinx/Program.cs +++ b/Ryujinx/Program.cs @@ -1,5 +1,4 @@ using ARMeilleure.Translation.PTC; -using FFmpeg.AutoGen; using Gtk; using Ryujinx.Common.Configuration; using Ryujinx.Common.GraphicsDriver; @@ -78,9 +77,6 @@ namespace Ryujinx if (OperatingSystem.IsLinux()) { XInitThreads(); - - // Configure FFmpeg search path - ffmpeg.RootPath = "/lib"; } string systemPath = Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.Machine);