浏览代码

Merge branch 'master' of https://github.com/scampower3/jellyfin

LJQ 1 年之前
父节点
当前提交
da1bd4a4a5

+ 1 - 0
CONTRIBUTORS.md

@@ -167,6 +167,7 @@
  - [ipitio](https://github.com/ipitio)
  - [TheTyrius](https://github.com/TheTyrius)
  - [tallbl0nde](https://github.com/tallbl0nde)
+ - [sleepycatcoding](https://github.com/sleepycatcoding)
  - [scampower3](https://github.com/scampower3)
 
 # Emby Contributors

+ 6 - 4
Emby.Naming/Common/NamingOptions.cs

@@ -318,22 +318,24 @@ namespace Emby.Naming.Common
                 new EpisodeExpression(@"[\._ -]()[Ee][Pp]_?([0-9]+)([^\\/]*)$"),
                 // <!-- foo.E01., foo.e01. -->
                 new EpisodeExpression(@"[^\\/]*?()\.?[Ee]([0-9]+)\.([^\\/]*)$"),
-                new EpisodeExpression("(?<year>[0-9]{4})[\\.-](?<month>[0-9]{2})[\\.-](?<day>[0-9]{2})", true)
+                new EpisodeExpression(@"(?<year>[0-9]{4})[._ -](?<month>[0-9]{2})[._ -](?<day>[0-9]{2})", true)
                 {
                     DateTimeFormats = new[]
                     {
                         "yyyy.MM.dd",
                         "yyyy-MM-dd",
-                        "yyyy_MM_dd"
+                        "yyyy_MM_dd",
+                        "yyyy MM dd"
                     }
                 },
-                new EpisodeExpression(@"(?<day>[0-9]{2})[.-](?<month>[0-9]{2})[.-](?<year>[0-9]{4})", true)
+                new EpisodeExpression(@"(?<day>[0-9]{2})[._ -](?<month>[0-9]{2})[._ -](?<year>[0-9]{4})", true)
                 {
                     DateTimeFormats = new[]
                     {
                         "dd.MM.yyyy",
                         "dd-MM-yyyy",
-                        "dd_MM_yyyy"
+                        "dd_MM_yyyy",
+                        "dd MM yyyy"
                     }
                 },
 

+ 11 - 14
MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs

@@ -37,7 +37,7 @@ namespace MediaBrowser.Controller.MediaEncoding
         private readonly IMediaEncoder _mediaEncoder;
         private readonly ISubtitleEncoder _subtitleEncoder;
         private readonly IConfiguration _config;
-        private readonly Version _minKernelVersionAmdVkFmtModifier = new Version(5, 15);
+
         // i915 hang was fixed by linux 6.2 (3f882f2)
         private readonly Version _minKerneli915Hang = new Version(5, 18);
         private readonly Version _maxKerneli915Hang = new Version(6, 1, 3);
@@ -891,9 +891,11 @@ namespace MediaBrowser.Controller.MediaEncoding
                 }
                 else if (_mediaEncoder.IsVaapiDeviceAmd)
                 {
+                    // Disable AMD EFC feature since it's still unstable in upstream Mesa.
+                    Environment.SetEnvironmentVariable("AMD_DEBUG", "noefc");
+
                     if (IsVulkanFullSupported()
-                        && _mediaEncoder.IsVaapiDeviceSupportVulkanFmtModifier
-                        && Environment.OSVersion.Version >= _minKernelVersionAmdVkFmtModifier)
+                        && _mediaEncoder.IsVaapiDeviceSupportVulkanDrmInterop)
                     {
                         args.Append(GetDrmDeviceArgs(options.VaapiDevice, DrmAlias));
                         args.Append(GetVaapiDeviceArgs(null, null, null, DrmAlias, VaapiAlias));
@@ -4205,14 +4207,13 @@ namespace MediaBrowser.Controller.MediaEncoding
             // prefered vaapi + vulkan filters pipeline
             if (_mediaEncoder.IsVaapiDeviceAmd
                 && isVaapiVkSupported
-                && _mediaEncoder.IsVaapiDeviceSupportVulkanFmtModifier
-                && Environment.OSVersion.Version >= _minKernelVersionAmdVkFmtModifier)
+                && _mediaEncoder.IsVaapiDeviceSupportVulkanDrmInterop)
             {
-                // AMD radeonsi path(Vega/gfx9+, kernel>=5.15), with extra vulkan tonemap and overlay support.
+                // AMD radeonsi path(targeting Polaris/gfx8+), with extra vulkan tonemap and overlay support.
                 return GetAmdVaapiFullVidFiltersPrefered(state, options, vidDecoder, vidEncoder);
             }
 
-            // Intel i965 and Amd radeonsi/r600 path(Polaris/gfx8-), only featuring scale and deinterlace support.
+            // Intel i965 and Amd legacy driver path, only featuring scale and deinterlace support.
             return GetVaapiLimitedVidFiltersPrefered(state, options, vidDecoder, vidEncoder);
         }
 
@@ -4484,7 +4485,7 @@ namespace MediaBrowser.Controller.MediaEncoding
                 // INPUT vaapi surface(vram)
                 if (doVkTonemap || hasSubs)
                 {
-                    // map from vaapi to vulkan/drm via interop (Vega/gfx9+).
+                    // map from vaapi to vulkan/drm via interop (Polaris/gfx8+).
                     mainFilters.Add("hwmap=derive_device=vulkan");
                     mainFilters.Add("format=vulkan");
                 }
@@ -4513,9 +4514,7 @@ namespace MediaBrowser.Controller.MediaEncoding
             if (doVkTonemap && !hasSubs)
             {
                 // OUTPUT vaapi(nv12) surface(vram)
-                // map from vulkan/drm to vaapi via interop (Vega/gfx9+).
-                mainFilters.Add("hwmap=derive_device=drm");
-                mainFilters.Add("format=drm_prime");
+                // map from vulkan/drm to vaapi via interop (Polaris/gfx8+).
                 mainFilters.Add("hwmap=derive_device=vaapi");
                 mainFilters.Add("format=vaapi");
 
@@ -4581,9 +4580,7 @@ namespace MediaBrowser.Controller.MediaEncoding
                 else if (isVaapiEncoder)
                 {
                     // OUTPUT vaapi(nv12) surface(vram)
-                    // map from vulkan/drm to vaapi via interop (Vega/gfx9+).
-                    overlayFilters.Add("hwmap=derive_device=drm");
-                    overlayFilters.Add("format=drm_prime");
+                    // map from vulkan/drm to vaapi via interop (Polaris/gfx8+).
                     overlayFilters.Add("hwmap=derive_device=vaapi");
                     overlayFilters.Add("format=vaapi");
 

+ 2 - 2
MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs

@@ -64,8 +64,8 @@ namespace MediaBrowser.Controller.MediaEncoding
         /// <summary>
         /// Gets a value indicating whether the configured Vaapi device supports vulkan drm format modifier.
         /// </summary>
-        /// <value><c>true</c> if the Vaapi device supports vulkan drm format modifier, <c>false</c> otherwise.</value>
-        bool IsVaapiDeviceSupportVulkanFmtModifier { get; }
+        /// <value><c>true</c> if the Vaapi device supports vulkan drm interop, <c>false</c> otherwise.</value>
+        bool IsVaapiDeviceSupportVulkanDrmInterop { get; }
 
         /// <summary>
         /// Whether given encoder codec is supported.

+ 6 - 8
MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs

@@ -76,12 +76,10 @@ namespace MediaBrowser.MediaEncoding.Encoder
         private bool _isVaapiDeviceAmd = false;
         private bool _isVaapiDeviceInteliHD = false;
         private bool _isVaapiDeviceInteli965 = false;
-        private bool _isVaapiDeviceSupportVulkanFmtModifier = false;
+        private bool _isVaapiDeviceSupportVulkanDrmInterop = false;
 
-        private static string[] _vulkanFmtModifierExts =
+        private static string[] _vulkanExternalMemoryDmaBufExts =
         {
-            "VK_KHR_sampler_ycbcr_conversion",
-            "VK_EXT_image_drm_format_modifier",
             "VK_KHR_external_memory_fd",
             "VK_EXT_external_memory_dma_buf",
             "VK_KHR_external_semaphore_fd",
@@ -140,7 +138,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
         public bool IsVaapiDeviceInteli965 => _isVaapiDeviceInteli965;
 
         /// <inheritdoc />
-        public bool IsVaapiDeviceSupportVulkanFmtModifier => _isVaapiDeviceSupportVulkanFmtModifier;
+        public bool IsVaapiDeviceSupportVulkanDrmInterop => _isVaapiDeviceSupportVulkanDrmInterop;
 
         [GeneratedRegex(@"[^\/\\]+?(\.[^\/\\\n.]+)?$")]
         private static partial Regex FfprobePathRegex();
@@ -204,7 +202,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
                     _isVaapiDeviceAmd = validator.CheckVaapiDeviceByDriverName("Mesa Gallium driver", options.VaapiDevice);
                     _isVaapiDeviceInteliHD = validator.CheckVaapiDeviceByDriverName("Intel iHD driver", options.VaapiDevice);
                     _isVaapiDeviceInteli965 = validator.CheckVaapiDeviceByDriverName("Intel i965 driver", options.VaapiDevice);
-                    _isVaapiDeviceSupportVulkanFmtModifier = validator.CheckVulkanDrmDeviceByExtensionName(options.VaapiDevice, _vulkanFmtModifierExts);
+                    _isVaapiDeviceSupportVulkanDrmInterop = validator.CheckVulkanDrmDeviceByExtensionName(options.VaapiDevice, _vulkanExternalMemoryDmaBufExts);
 
                     if (_isVaapiDeviceAmd)
                     {
@@ -219,9 +217,9 @@ namespace MediaBrowser.MediaEncoding.Encoder
                         _logger.LogInformation("VAAPI device {RenderNodePath} is Intel GPU (i965)", options.VaapiDevice);
                     }
 
-                    if (_isVaapiDeviceSupportVulkanFmtModifier)
+                    if (_isVaapiDeviceSupportVulkanDrmInterop)
                     {
-                        _logger.LogInformation("VAAPI device {RenderNodePath} supports Vulkan DRM format modifier", options.VaapiDevice);
+                        _logger.LogInformation("VAAPI device {RenderNodePath} supports Vulkan DRM interop", options.VaapiDevice);
                     }
                 }
             }

+ 1 - 1
MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs

@@ -293,7 +293,7 @@ namespace MediaBrowser.MediaEncoding.Subtitles
                 return true;
             }
 
-            if (string.Equals(format, SubtitleFormat.VTT, StringComparison.OrdinalIgnoreCase))
+            if (string.Equals(format, SubtitleFormat.VTT, StringComparison.OrdinalIgnoreCase) || string.Equals(format, SubtitleFormat.WEBVTT, StringComparison.OrdinalIgnoreCase))
             {
                 value = new VttWriter();
                 return true;

+ 1 - 0
MediaBrowser.Model/MediaInfo/SubtitleFormat.cs

@@ -9,6 +9,7 @@ namespace MediaBrowser.Model.MediaInfo
         public const string SSA = "ssa";
         public const string ASS = "ass";
         public const string VTT = "vtt";
+        public const string WEBVTT = "webvtt";
         public const string TTML = "ttml";
     }
 }

+ 1 - 1
tests/Jellyfin.Api.Tests/Auth/DefaultAuthorizationPolicy/DefaultAuthorizationHandlerTests.cs

@@ -66,7 +66,7 @@ namespace Jellyfin.Api.Tests.Auth.DefaultAuthorizationPolicy
 
             _userManagerMock
                 .Setup(u => u.GetUserById(It.IsAny<Guid>()))
-                .Returns<User>(null);
+                .Returns<User?>(null);
 
             var claims = new[]
             {

+ 1 - 0
tests/Jellyfin.Naming.Tests/TV/DailyEpisodeTests.cs

@@ -13,6 +13,7 @@ namespace Jellyfin.Naming.Tests.TV
         [InlineData(@"/server/anything_1996-11-14.mp4", "anything", 1996, 11, 14)]
         [InlineData(@"/server/james.corden.2017.04.20.anne.hathaway.720p.hdtv.x264-crooks.mkv", "james.corden", 2017, 04, 20)]
         [InlineData(@"/server/ABC News 2018_03_24_19_00_00.mkv", "ABC News", 2018, 03, 24)]
+        [InlineData(@"/server/Jeopardy 2023 07 14 HDTV x264 AC3.mkv", "Jeopardy", 2023, 07, 14)]
         // TODO: [InlineData(@"/server/anything_14.11.1996.mp4", "anything", 1996, 11, 14)]
         // TODO: [InlineData(@"/server/A Daily Show - (2015-01-15) - Episode Name - [720p].mkv", "A Daily Show", 2015, 01, 15)]
         // TODO: [InlineData(@"/server/Last Man Standing_KTLADT_2018_05_25_01_28_00.wtv", "Last Man Standing", 2018, 05, 25)]