From d669e8114b4b8f092edd6a19f0ca73bf4fdaf47f Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Sat, 3 Sep 2022 20:28:18 -0500 Subject: [PATCH] more scaling fixes (#948) * remove force_original_aspect_ratio from scale_cuda * remove force_original_aspect_ratio from scale_cuda * fix qsv scaling * fix qsv scaling on linux * fix vaapi scaling edge cases * update changelog --- CHANGELOG.md | 1 + .../Emby/EmbyPathReplacementServiceTests.cs | 2 +- .../FFmpeg/TranscodingTests.cs | 2 ++ .../JellyfinPathReplacementServiceTests.cs | 2 +- .../Plex/PlexPathReplacementServiceTests.cs | 2 +- .../Emby/EmbyPathReplacementService.cs | 2 +- .../FFmpeg/FFmpegLibraryProcessService.cs | 8 ++++++++ .../JellyfinPathReplacementService.cs | 2 +- .../Plex/PlexPathReplacementService.cs | 2 +- ErsatzTV.FFmpeg.Tests/PipelineBuilderTests.cs | 17 ++++++++++++++++- .../Filter/AvailableScaleFilters.cs | 4 +++- .../Filter/Cuda/ScaleCudaFilter.cs | 8 +------- ErsatzTV.FFmpeg/Filter/Qsv/ScaleQsvFilter.cs | 14 +++++++++++--- .../Filter/Vaapi/ScaleVaapiFilter.cs | 8 +------- ErsatzTV.FFmpeg/PipelineBuilder.cs | 19 +++++++++++++++---- .../Runtime/IRuntimeInfo.cs | 2 +- .../Checks/HardwareAccelerationHealthCheck.cs | 2 +- .../Runtime/RuntimeInfo.cs | 2 +- .../RunOnce/PlatformSettingsService.cs | 2 +- ErsatzTV/Startup.cs | 2 +- 20 files changed, 69 insertions(+), 34 deletions(-) rename {ErsatzTV.Core/Interfaces => ErsatzTV.FFmpeg}/Runtime/IRuntimeInfo.cs (83%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cfd00591..efdf24405 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fix scanner crash caused by invalid mtime - `VAAPI`: Downgrade libva from 2.15 to 2.14 - Fix bug with XMLTV that caused some filler to display with primary content details +- Multiple fixes for content scaling with `Nvidia`, `Qsv` and `Vaapi` accelerations ### Added - Add `Preferred Audio Title` feature diff --git a/ErsatzTV.Core.Tests/Emby/EmbyPathReplacementServiceTests.cs b/ErsatzTV.Core.Tests/Emby/EmbyPathReplacementServiceTests.cs index ac0770302..55fb607f6 100644 --- a/ErsatzTV.Core.Tests/Emby/EmbyPathReplacementServiceTests.cs +++ b/ErsatzTV.Core.Tests/Emby/EmbyPathReplacementServiceTests.cs @@ -2,7 +2,7 @@ using ErsatzTV.Core.Domain; using ErsatzTV.Core.Emby; using ErsatzTV.Core.Interfaces.Repositories; -using ErsatzTV.Core.Interfaces.Runtime; +using ErsatzTV.FFmpeg.Runtime; using FluentAssertions; using Microsoft.Extensions.Logging; using Moq; diff --git a/ErsatzTV.Core.Tests/FFmpeg/TranscodingTests.cs b/ErsatzTV.Core.Tests/FFmpeg/TranscodingTests.cs index c8f093846..4b74429d2 100644 --- a/ErsatzTV.Core.Tests/FFmpeg/TranscodingTests.cs +++ b/ErsatzTV.Core.Tests/FFmpeg/TranscodingTests.cs @@ -13,6 +13,7 @@ using ErsatzTV.Core.Metadata; using ErsatzTV.FFmpeg; using ErsatzTV.FFmpeg.Capabilities; using ErsatzTV.FFmpeg.State; +using ErsatzTV.Infrastructure.Runtime; using FluentAssertions; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging; @@ -314,6 +315,7 @@ public class TranscodingTests // new HardwareCapabilitiesFactory( // new MemoryCache(new MemoryCacheOptions()), // LoggerFactory.CreateLogger()), + new RuntimeInfo(), LoggerFactory.CreateLogger()); var v = new MediaVersion diff --git a/ErsatzTV.Core.Tests/Jellyfin/JellyfinPathReplacementServiceTests.cs b/ErsatzTV.Core.Tests/Jellyfin/JellyfinPathReplacementServiceTests.cs index d9ac99073..30817395d 100644 --- a/ErsatzTV.Core.Tests/Jellyfin/JellyfinPathReplacementServiceTests.cs +++ b/ErsatzTV.Core.Tests/Jellyfin/JellyfinPathReplacementServiceTests.cs @@ -1,7 +1,7 @@ using System.Runtime.InteropServices; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; -using ErsatzTV.Core.Interfaces.Runtime; +using ErsatzTV.FFmpeg.Runtime; using ErsatzTV.Core.Jellyfin; using FluentAssertions; using Microsoft.Extensions.Logging; diff --git a/ErsatzTV.Core.Tests/Plex/PlexPathReplacementServiceTests.cs b/ErsatzTV.Core.Tests/Plex/PlexPathReplacementServiceTests.cs index 76faaacfe..9e9db750e 100644 --- a/ErsatzTV.Core.Tests/Plex/PlexPathReplacementServiceTests.cs +++ b/ErsatzTV.Core.Tests/Plex/PlexPathReplacementServiceTests.cs @@ -1,7 +1,7 @@ using System.Runtime.InteropServices; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; -using ErsatzTV.Core.Interfaces.Runtime; +using ErsatzTV.FFmpeg.Runtime; using ErsatzTV.Core.Plex; using FluentAssertions; using Microsoft.Extensions.Logging; diff --git a/ErsatzTV.Core/Emby/EmbyPathReplacementService.cs b/ErsatzTV.Core/Emby/EmbyPathReplacementService.cs index 0525f294e..caabe2482 100644 --- a/ErsatzTV.Core/Emby/EmbyPathReplacementService.cs +++ b/ErsatzTV.Core/Emby/EmbyPathReplacementService.cs @@ -2,7 +2,7 @@ using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Emby; using ErsatzTV.Core.Interfaces.Repositories; -using ErsatzTV.Core.Interfaces.Runtime; +using ErsatzTV.FFmpeg.Runtime; using Microsoft.Extensions.Logging; namespace ErsatzTV.Core.Emby; diff --git a/ErsatzTV.Core/FFmpeg/FFmpegLibraryProcessService.cs b/ErsatzTV.Core/FFmpeg/FFmpegLibraryProcessService.cs index 08463af4b..8eca45842 100644 --- a/ErsatzTV.Core/FFmpeg/FFmpegLibraryProcessService.cs +++ b/ErsatzTV.Core/FFmpeg/FFmpegLibraryProcessService.cs @@ -7,6 +7,7 @@ using ErsatzTV.FFmpeg.Capabilities; using ErsatzTV.FFmpeg.Environment; using ErsatzTV.FFmpeg.Format; using ErsatzTV.FFmpeg.OutputFormat; +using ErsatzTV.FFmpeg.Runtime; using ErsatzTV.FFmpeg.State; using Microsoft.Extensions.Logging; using MediaStream = ErsatzTV.Core.Domain.MediaStream; @@ -18,6 +19,7 @@ public class FFmpegLibraryProcessService : IFFmpegProcessService private readonly FFmpegProcessService _ffmpegProcessService; private readonly IFFmpegStreamSelector _ffmpegStreamSelector; private readonly IHardwareCapabilitiesFactory _hardwareCapabilitiesFactory; + private readonly IRuntimeInfo _runtimeInfo; private readonly ILogger _logger; private readonly FFmpegPlaybackSettingsCalculator _playbackSettingsCalculator; private readonly ITempFilePool _tempFilePool; @@ -28,6 +30,7 @@ public class FFmpegLibraryProcessService : IFFmpegProcessService IFFmpegStreamSelector ffmpegStreamSelector, ITempFilePool tempFilePool, IHardwareCapabilitiesFactory hardwareCapabilitiesFactory, + IRuntimeInfo runtimeInfo, ILogger logger) { _ffmpegProcessService = ffmpegProcessService; @@ -35,6 +38,7 @@ public class FFmpegLibraryProcessService : IFFmpegProcessService _ffmpegStreamSelector = ffmpegStreamSelector; _tempFilePool = tempFilePool; _hardwareCapabilitiesFactory = hardwareCapabilitiesFactory; + _runtimeInfo = runtimeInfo; _logger = logger; } @@ -240,6 +244,7 @@ public class FFmpegLibraryProcessService : IFFmpegProcessService _logger.LogDebug("FFmpeg desired state {FrameState}", desiredState); var pipelineBuilder = new PipelineBuilder( + _runtimeInfo, await _hardwareCapabilitiesFactory.GetHardwareCapabilities(ffmpegPath, hwAccel), videoInputFile, audioInputFile, @@ -372,6 +377,7 @@ public class FFmpegLibraryProcessService : IFFmpegProcessService _logger.LogDebug("FFmpeg desired error state {FrameState}", desiredState); var pipelineBuilder = new PipelineBuilder( + _runtimeInfo, await _hardwareCapabilitiesFactory.GetHardwareCapabilities(ffmpegPath, hwAccel), videoInputFile, audioInputFile, @@ -400,6 +406,7 @@ public class FFmpegLibraryProcessService : IFFmpegProcessService resolution); var pipelineBuilder = new PipelineBuilder( + _runtimeInfo, await _hardwareCapabilitiesFactory.GetHardwareCapabilities(ffmpegPath, HardwareAccelerationMode.None), None, None, @@ -426,6 +433,7 @@ public class FFmpegLibraryProcessService : IFFmpegProcessService new List { new(0, string.Empty, None, FrameSize.Unknown, string.Empty, None, true) }); var pipelineBuilder = new PipelineBuilder( + _runtimeInfo, await _hardwareCapabilitiesFactory.GetHardwareCapabilities(ffmpegPath, HardwareAccelerationMode.None), videoInputFile, None, diff --git a/ErsatzTV.Core/Jellyfin/JellyfinPathReplacementService.cs b/ErsatzTV.Core/Jellyfin/JellyfinPathReplacementService.cs index 21e848f31..da7ddf2a8 100644 --- a/ErsatzTV.Core/Jellyfin/JellyfinPathReplacementService.cs +++ b/ErsatzTV.Core/Jellyfin/JellyfinPathReplacementService.cs @@ -2,7 +2,7 @@ using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Jellyfin; using ErsatzTV.Core.Interfaces.Repositories; -using ErsatzTV.Core.Interfaces.Runtime; +using ErsatzTV.FFmpeg.Runtime; using Microsoft.Extensions.Logging; namespace ErsatzTV.Core.Jellyfin; diff --git a/ErsatzTV.Core/Plex/PlexPathReplacementService.cs b/ErsatzTV.Core/Plex/PlexPathReplacementService.cs index 0d11d8b6f..a53b31d95 100644 --- a/ErsatzTV.Core/Plex/PlexPathReplacementService.cs +++ b/ErsatzTV.Core/Plex/PlexPathReplacementService.cs @@ -2,7 +2,7 @@ using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Plex; using ErsatzTV.Core.Interfaces.Repositories; -using ErsatzTV.Core.Interfaces.Runtime; +using ErsatzTV.FFmpeg.Runtime; using Microsoft.Extensions.Logging; namespace ErsatzTV.Core.Plex; diff --git a/ErsatzTV.FFmpeg.Tests/PipelineBuilderTests.cs b/ErsatzTV.FFmpeg.Tests/PipelineBuilderTests.cs index fea8f86b1..e092729d8 100644 --- a/ErsatzTV.FFmpeg.Tests/PipelineBuilderTests.cs +++ b/ErsatzTV.FFmpeg.Tests/PipelineBuilderTests.cs @@ -4,6 +4,7 @@ using ErsatzTV.FFmpeg.Capabilities; using ErsatzTV.FFmpeg.Encoder; using ErsatzTV.FFmpeg.Format; using ErsatzTV.FFmpeg.OutputFormat; +using ErsatzTV.FFmpeg.Runtime; using ErsatzTV.FFmpeg.State; using FluentAssertions; using LanguageExt; @@ -72,6 +73,7 @@ public class PipelineGeneratorTests Option.None); var builder = new PipelineBuilder( + new Mock().Object, new DefaultHardwareCapabilities(), videoInputFile, audioInputFile, @@ -143,6 +145,7 @@ public class PipelineGeneratorTests Option.None); var builder = new PipelineBuilder( + new Mock().Object, new DefaultHardwareCapabilities(), videoInputFile, audioInputFile, @@ -167,7 +170,16 @@ public class PipelineGeneratorTests var resolution = new FrameSize(1920, 1080); var concatInputFile = new ConcatInputFile("http://localhost:8080/ffmpeg/concat/1", resolution); - var builder = new PipelineBuilder(new DefaultHardwareCapabilities(), None, None, None, None, "", "", _logger); + var builder = new PipelineBuilder( + new Mock().Object, + new DefaultHardwareCapabilities(), + None, + None, + None, + None, + "", + "", + _logger); FFmpegPipeline result = builder.Concat(concatInputFile, FFmpegState.Concat(false, "Some Channel")); result.PipelineSteps.Should().HaveCountGreaterThan(0); @@ -231,6 +243,7 @@ public class PipelineGeneratorTests Option.None); var builder = new PipelineBuilder( + new Mock().Object, new DefaultHardwareCapabilities(), videoInputFile, audioInputFile, @@ -294,6 +307,7 @@ public class PipelineGeneratorTests Option.None); var builder = new PipelineBuilder( + new Mock().Object, new DefaultHardwareCapabilities(), videoInputFile, audioInputFile, @@ -327,6 +341,7 @@ public class PipelineGeneratorTests }); var pipelineBuilder = new PipelineBuilder( + new Mock().Object, new DefaultHardwareCapabilities(), videoInputFile, Option.None, diff --git a/ErsatzTV.FFmpeg/Filter/AvailableScaleFilters.cs b/ErsatzTV.FFmpeg/Filter/AvailableScaleFilters.cs index fdfc1255a..9c306b16c 100644 --- a/ErsatzTV.FFmpeg/Filter/AvailableScaleFilters.cs +++ b/ErsatzTV.FFmpeg/Filter/AvailableScaleFilters.cs @@ -1,12 +1,14 @@ using ErsatzTV.FFmpeg.Filter.Cuda; using ErsatzTV.FFmpeg.Filter.Qsv; using ErsatzTV.FFmpeg.Filter.Vaapi; +using ErsatzTV.FFmpeg.Runtime; namespace ErsatzTV.FFmpeg.Filter; public static class AvailableScaleFilters { public static IPipelineFilterStep ForAcceleration( + IRuntimeInfo runtimeInfo, HardwareAccelerationMode accelMode, FrameState currentState, FrameSize scaledSize, @@ -16,7 +18,7 @@ public static class AvailableScaleFilters HardwareAccelerationMode.Nvenc => new ScaleCudaFilter(currentState, scaledSize, paddedSize), HardwareAccelerationMode.Qsv when currentState.FrameDataLocation == FrameDataLocation.Hardware || scaledSize == paddedSize => - new ScaleQsvFilter(currentState, scaledSize), + new ScaleQsvFilter(runtimeInfo, currentState, scaledSize, paddedSize), HardwareAccelerationMode.Vaapi => new ScaleVaapiFilter(currentState, scaledSize, paddedSize), _ => new ScaleFilter(currentState, scaledSize, paddedSize) }; diff --git a/ErsatzTV.FFmpeg/Filter/Cuda/ScaleCudaFilter.cs b/ErsatzTV.FFmpeg/Filter/Cuda/ScaleCudaFilter.cs index 8ed3e6520..9b72ecbaa 100644 --- a/ErsatzTV.FFmpeg/Filter/Cuda/ScaleCudaFilter.cs +++ b/ErsatzTV.FFmpeg/Filter/Cuda/ScaleCudaFilter.cs @@ -37,13 +37,7 @@ public class ScaleCudaFilter : BaseFilter format = $":format={pixelFormat.FFmpegName}"; } - string aspectRatio = string.Empty; - if (_scaledSize != _paddedSize) - { - aspectRatio = ":force_original_aspect_ratio=1"; - } - - scale = $"scale_cuda={targetSize}{aspectRatio}{format}"; + scale = $"scale_cuda={targetSize}{format}"; } // TODO: this might not always upload to hardware, so NextState could be inaccurate diff --git a/ErsatzTV.FFmpeg/Filter/Qsv/ScaleQsvFilter.cs b/ErsatzTV.FFmpeg/Filter/Qsv/ScaleQsvFilter.cs index 4fe963428..94afe0bfe 100644 --- a/ErsatzTV.FFmpeg/Filter/Qsv/ScaleQsvFilter.cs +++ b/ErsatzTV.FFmpeg/Filter/Qsv/ScaleQsvFilter.cs @@ -1,16 +1,22 @@ -using ErsatzTV.FFmpeg.Format; +using System.Runtime.InteropServices; +using ErsatzTV.FFmpeg.Format; +using ErsatzTV.FFmpeg.Runtime; namespace ErsatzTV.FFmpeg.Filter.Qsv; public class ScaleQsvFilter : BaseFilter { + private readonly IRuntimeInfo _runtimeInfo; private readonly FrameState _currentState; private readonly FrameSize _scaledSize; + private readonly FrameSize _paddedSize; - public ScaleQsvFilter(FrameState currentState, FrameSize scaledSize) + public ScaleQsvFilter(IRuntimeInfo runtimeInfo, FrameState currentState, FrameSize scaledSize, FrameSize paddedSize) { + _runtimeInfo = runtimeInfo; _currentState = currentState; _scaledSize = scaledSize; + _paddedSize = paddedSize; } public override string Filter @@ -37,7 +43,9 @@ public class ScaleQsvFilter : BaseFilter format = $":format={pixelFormat.FFmpegName}"; } - string targetSize = $"w={_scaledSize.Width}:h={_scaledSize.Height}"; + string targetSize = _runtimeInfo.IsOSPlatform(OSPlatform.Windows) + ? $"w={_paddedSize.Width}:h={_paddedSize.Height}" + : $"w={_scaledSize.Width}:h={_scaledSize.Height}"; scale = $"vpp_qsv={targetSize}{format}"; } diff --git a/ErsatzTV.FFmpeg/Filter/Vaapi/ScaleVaapiFilter.cs b/ErsatzTV.FFmpeg/Filter/Vaapi/ScaleVaapiFilter.cs index a290491f7..ac5b6f57a 100644 --- a/ErsatzTV.FFmpeg/Filter/Vaapi/ScaleVaapiFilter.cs +++ b/ErsatzTV.FFmpeg/Filter/Vaapi/ScaleVaapiFilter.cs @@ -37,14 +37,8 @@ public class ScaleVaapiFilter : BaseFilter format = $":format={pixelFormat.FFmpegName}"; } - string aspectRatio = string.Empty; - if (_scaledSize != _paddedSize) - { - aspectRatio = ":force_original_aspect_ratio=1"; - } - string targetSize = $"{_paddedSize.Width}:{_paddedSize.Height}"; - scale = $"scale_vaapi={targetSize}{aspectRatio}:force_divisible_by=2{format}"; + scale = $"scale_vaapi={targetSize}:force_divisible_by=2{format}"; } if (_currentState.FrameDataLocation == FrameDataLocation.Hardware) diff --git a/ErsatzTV.FFmpeg/PipelineBuilder.cs b/ErsatzTV.FFmpeg/PipelineBuilder.cs index 4d42bbaf3..5e7c0b866 100644 --- a/ErsatzTV.FFmpeg/PipelineBuilder.cs +++ b/ErsatzTV.FFmpeg/PipelineBuilder.cs @@ -10,6 +10,7 @@ using ErsatzTV.FFmpeg.Option.HardwareAcceleration; using ErsatzTV.FFmpeg.Option.Metadata; using ErsatzTV.FFmpeg.OutputFormat; using ErsatzTV.FFmpeg.Protocol; +using ErsatzTV.FFmpeg.Runtime; using ErsatzTV.FFmpeg.State; using Microsoft.Extensions.Logging; @@ -19,6 +20,7 @@ public class PipelineBuilder { private readonly Option _audioInputFile; private readonly string _fontsFolder; + private readonly IRuntimeInfo _runtimeInfo; private readonly IHardwareCapabilities _hardwareCapabilities; private readonly ILogger _logger; private readonly List _pipelineSteps; @@ -28,6 +30,7 @@ public class PipelineBuilder private readonly Option _watermarkInputFile; public PipelineBuilder( + IRuntimeInfo runtimeInfo, IHardwareCapabilities hardwareCapabilities, Option videoInputFile, Option audioInputFile, @@ -49,6 +52,7 @@ public class PipelineBuilder new ClosedGopOutputOption() }; + _runtimeInfo = runtimeInfo; _hardwareCapabilities = hardwareCapabilities; _videoInputFile = videoInputFile; _audioInputFile = audioInputFile; @@ -392,6 +396,7 @@ public class PipelineBuilder else if (currentState.ScaledSize != desiredState.ScaledSize) { IPipelineFilterStep scaleFilter = AvailableScaleFilters.ForAcceleration( + _runtimeInfo, ffmpegState.EncoderHardwareAccelerationMode, currentState, desiredState.ScaledSize, @@ -406,8 +411,9 @@ public class PipelineBuilder currentState = padStep.NextState(currentState); _videoInputFile.Iter(f => f.FilterSteps.Add(padStep)); } - - if (videoStream.DisplayAspectRatio == desiredState.DisplayAspectRatio) + + if (videoStream.DisplayAspectRatio == desiredState.DisplayAspectRatio || + ffmpegState.EncoderHardwareAccelerationMode == HardwareAccelerationMode.Qsv) { IPipelineFilterStep darStep = new SetDarFilter(desiredState.DisplayAspectRatio); currentState = darStep.NextState(currentState); @@ -417,6 +423,7 @@ public class PipelineBuilder else if (currentState.PaddedSize != desiredState.PaddedSize) { IPipelineFilterStep scaleFilter = AvailableScaleFilters.ForAcceleration( + _runtimeInfo, ffmpegState.EncoderHardwareAccelerationMode, currentState, desiredState.ScaledSize, @@ -430,8 +437,9 @@ public class PipelineBuilder currentState = padStep.NextState(currentState); _videoInputFile.Iter(f => f.FilterSteps.Add(padStep)); } - - if (videoStream.DisplayAspectRatio == desiredState.DisplayAspectRatio) + + if (videoStream.DisplayAspectRatio == desiredState.DisplayAspectRatio || + ffmpegState.EncoderHardwareAccelerationMode == HardwareAccelerationMode.Qsv) { IPipelineFilterStep darStep = new SetDarFilter(desiredState.DisplayAspectRatio); currentState = darStep.NextState(currentState); @@ -470,6 +478,7 @@ public class PipelineBuilder currentState = currentState with { PixelFormat = desiredState.PixelFormat }; IPipelineFilterStep scaleFilter = AvailableScaleFilters.ForAcceleration( + _runtimeInfo, ffmpegState.EncoderHardwareAccelerationMode, currentState, desiredState.ScaledSize, @@ -499,6 +508,7 @@ public class PipelineBuilder currentState = currentState with { PixelFormat = desiredState.PixelFormat }; IPipelineFilterStep scaleFilter = AvailableScaleFilters.ForAcceleration( + _runtimeInfo, ffmpegState.EncoderHardwareAccelerationMode, currentState, desiredState.ScaledSize, @@ -625,6 +635,7 @@ public class PipelineBuilder _videoInputFile.Map(f => f.FilterSteps.Count).IfNone(1) == 0) { IPipelineFilterStep scaleFilter = AvailableScaleFilters.ForAcceleration( + _runtimeInfo, ffmpegState.EncoderHardwareAccelerationMode, currentState, desiredState.ScaledSize, diff --git a/ErsatzTV.Core/Interfaces/Runtime/IRuntimeInfo.cs b/ErsatzTV.FFmpeg/Runtime/IRuntimeInfo.cs similarity index 83% rename from ErsatzTV.Core/Interfaces/Runtime/IRuntimeInfo.cs rename to ErsatzTV.FFmpeg/Runtime/IRuntimeInfo.cs index b8442778c..8fb898887 100644 --- a/ErsatzTV.Core/Interfaces/Runtime/IRuntimeInfo.cs +++ b/ErsatzTV.FFmpeg/Runtime/IRuntimeInfo.cs @@ -1,7 +1,7 @@ using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; -namespace ErsatzTV.Core.Interfaces.Runtime; +namespace ErsatzTV.FFmpeg.Runtime; public interface IRuntimeInfo { diff --git a/ErsatzTV.Infrastructure/Health/Checks/HardwareAccelerationHealthCheck.cs b/ErsatzTV.Infrastructure/Health/Checks/HardwareAccelerationHealthCheck.cs index 63ac0505b..3be92c2b6 100644 --- a/ErsatzTV.Infrastructure/Health/Checks/HardwareAccelerationHealthCheck.cs +++ b/ErsatzTV.Infrastructure/Health/Checks/HardwareAccelerationHealthCheck.cs @@ -4,7 +4,7 @@ using ErsatzTV.Core.Domain; using ErsatzTV.Core.Health; using ErsatzTV.Core.Health.Checks; using ErsatzTV.Core.Interfaces.Repositories; -using ErsatzTV.Core.Interfaces.Runtime; +using ErsatzTV.FFmpeg.Runtime; using ErsatzTV.Infrastructure.Data; using LanguageExt.UnsafeValueAccess; using Microsoft.EntityFrameworkCore; diff --git a/ErsatzTV.Infrastructure/Runtime/RuntimeInfo.cs b/ErsatzTV.Infrastructure/Runtime/RuntimeInfo.cs index 3222feaa0..0d7d52d5d 100644 --- a/ErsatzTV.Infrastructure/Runtime/RuntimeInfo.cs +++ b/ErsatzTV.Infrastructure/Runtime/RuntimeInfo.cs @@ -1,5 +1,5 @@ using System.Runtime.InteropServices; -using ErsatzTV.Core.Interfaces.Runtime; +using ErsatzTV.FFmpeg.Runtime; namespace ErsatzTV.Infrastructure.Runtime; diff --git a/ErsatzTV/Services/RunOnce/PlatformSettingsService.cs b/ErsatzTV/Services/RunOnce/PlatformSettingsService.cs index 3ab32726d..521be4136 100644 --- a/ErsatzTV/Services/RunOnce/PlatformSettingsService.cs +++ b/ErsatzTV/Services/RunOnce/PlatformSettingsService.cs @@ -1,6 +1,6 @@ using System.Runtime.InteropServices; using ErsatzTV.Core.Interfaces.Metadata; -using ErsatzTV.Core.Interfaces.Runtime; +using ErsatzTV.FFmpeg.Runtime; using ErsatzTV.Infrastructure.Data; using Microsoft.Extensions.Caching.Memory; diff --git a/ErsatzTV/Startup.cs b/ErsatzTV/Startup.cs index 878ce00a2..389a9cb50 100644 --- a/ErsatzTV/Startup.cs +++ b/ErsatzTV/Startup.cs @@ -23,7 +23,6 @@ using ErsatzTV.Core.Interfaces.Metadata.Nfo; using ErsatzTV.Core.Interfaces.Plex; using ErsatzTV.Core.Interfaces.Repositories; using ErsatzTV.Core.Interfaces.Repositories.Caching; -using ErsatzTV.Core.Interfaces.Runtime; using ErsatzTV.Core.Interfaces.Scheduling; using ErsatzTV.Core.Interfaces.Search; using ErsatzTV.Core.Interfaces.Trakt; @@ -34,6 +33,7 @@ using ErsatzTV.Core.Plex; using ErsatzTV.Core.Scheduling; using ErsatzTV.Core.Trakt; using ErsatzTV.FFmpeg.Capabilities; +using ErsatzTV.FFmpeg.Runtime; using ErsatzTV.Formatters; using ErsatzTV.Infrastructure.Data; using ErsatzTV.Infrastructure.Data.Repositories;