aboutsummaryrefslogtreecommitdiff
path: root/Emby.Drawing
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Drawing')
-rw-r--r--Emby.Drawing/Emby.Drawing.csproj2
-rw-r--r--Emby.Drawing/ImageMagick/ImageMagickEncoder.cs1
-rw-r--r--Emby.Drawing/ImageProcessor.cs56
-rw-r--r--Emby.Drawing/packages.config2
4 files changed, 56 insertions, 5 deletions
diff --git a/Emby.Drawing/Emby.Drawing.csproj b/Emby.Drawing/Emby.Drawing.csproj
index f278e1e29..b286885a5 100644
--- a/Emby.Drawing/Emby.Drawing.csproj
+++ b/Emby.Drawing/Emby.Drawing.csproj
@@ -34,7 +34,7 @@
<ItemGroup>
<Reference Include="ImageMagickSharp, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\ImageMagickSharp.1.0.0.15\lib\net45\ImageMagickSharp.dll</HintPath>
+ <HintPath>..\packages\ImageMagickSharp.1.0.0.16\lib\net45\ImageMagickSharp.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
diff --git a/Emby.Drawing/ImageMagick/ImageMagickEncoder.cs b/Emby.Drawing/ImageMagick/ImageMagickEncoder.cs
index 3d6cdd03d..380c56059 100644
--- a/Emby.Drawing/ImageMagick/ImageMagickEncoder.cs
+++ b/Emby.Drawing/ImageMagick/ImageMagickEncoder.cs
@@ -63,6 +63,7 @@ namespace Emby.Drawing.ImageMagick
{
_logger.Info("ImageMagick version: " + Wand.VersionString);
TestWebp();
+ Wand.SetMagickThreadCount(1);
}
private bool _webpAvailable = true;
diff --git a/Emby.Drawing/ImageProcessor.cs b/Emby.Drawing/ImageProcessor.cs
index 55c6f6455..59c2e95c7 100644
--- a/Emby.Drawing/ImageProcessor.cs
+++ b/Emby.Drawing/ImageProcessor.cs
@@ -51,8 +51,14 @@ namespace Emby.Drawing
private readonly IJsonSerializer _jsonSerializer;
private readonly IServerApplicationPaths _appPaths;
private readonly IImageEncoder _imageEncoder;
+ private readonly SemaphoreSlim _imageProcessingSemaphore;
- public ImageProcessor(ILogger logger, IServerApplicationPaths appPaths, IFileSystem fileSystem, IJsonSerializer jsonSerializer, IImageEncoder imageEncoder)
+ public ImageProcessor(ILogger logger,
+ IServerApplicationPaths appPaths,
+ IFileSystem fileSystem,
+ IJsonSerializer jsonSerializer,
+ IImageEncoder imageEncoder,
+ int maxConcurrentImageProcesses)
{
_logger = logger;
_fileSystem = fileSystem;
@@ -88,6 +94,8 @@ namespace Emby.Drawing
}
_cachedImagedSizes = new ConcurrentDictionary<Guid, ImageSize>(sizeDictionary);
+ _logger.Info("ImageProcessor started with {0} max concurrent image processes", maxConcurrentImageProcesses);
+ _imageProcessingSemaphore = new SemaphoreSlim(maxConcurrentImageProcesses, maxConcurrentImageProcesses);
}
public string[] SupportedInputFormats
@@ -201,6 +209,8 @@ namespace Emby.Drawing
await semaphore.WaitAsync().ConfigureAwait(false);
+ var imageProcessingLockTaken = false;
+
try
{
CheckDisposed();
@@ -212,11 +222,20 @@ namespace Emby.Drawing
Directory.CreateDirectory(Path.GetDirectoryName(cacheFilePath));
+ await _imageProcessingSemaphore.WaitAsync().ConfigureAwait(false);
+
+ imageProcessingLockTaken = true;
+
_imageEncoder.EncodeImage(originalImagePath, cacheFilePath, newWidth, newHeight, quality, options);
}
}
finally
{
+ if (imageProcessingLockTaken)
+ {
+ _imageProcessingSemaphore.Release();
+ }
+
semaphore.Release();
}
@@ -254,10 +273,15 @@ namespace Emby.Drawing
return GetResult(croppedImagePath);
}
+ var imageProcessingLockTaken = false;
+
try
{
Directory.CreateDirectory(Path.GetDirectoryName(croppedImagePath));
+ await _imageProcessingSemaphore.WaitAsync().ConfigureAwait(false);
+ imageProcessingLockTaken = true;
+
_imageEncoder.CropWhiteSpace(originalImagePath, croppedImagePath);
}
catch (Exception ex)
@@ -269,6 +293,11 @@ namespace Emby.Drawing
}
finally
{
+ if (imageProcessingLockTaken)
+ {
+ _imageProcessingSemaphore.Release();
+ }
+
semaphore.Release();
}
@@ -592,13 +621,25 @@ namespace Emby.Drawing
return enhancedImagePath;
}
+ var imageProcessingLockTaken = false;
+
try
{
Directory.CreateDirectory(Path.GetDirectoryName(enhancedImagePath));
+
+ await _imageProcessingSemaphore.WaitAsync().ConfigureAwait(false);
+
+ imageProcessingLockTaken = true;
+
await ExecuteImageEnhancers(supportedEnhancers, originalImagePath, enhancedImagePath, item, imageType, imageIndex).ConfigureAwait(false);
}
finally
{
+ if (imageProcessingLockTaken)
+ {
+ _imageProcessingSemaphore.Release();
+ }
+
semaphore.Release();
}
@@ -717,9 +758,18 @@ namespace Emby.Drawing
return Path.Combine(path, filename);
}
- public void CreateImageCollage(ImageCollageOptions options)
+ public async Task CreateImageCollage(ImageCollageOptions options)
{
- _imageEncoder.CreateImageCollage(options);
+ await _imageProcessingSemaphore.WaitAsync().ConfigureAwait(false);
+
+ try
+ {
+ _imageEncoder.CreateImageCollage(options);
+ }
+ finally
+ {
+ _imageProcessingSemaphore.Release();
+ }
}
public IEnumerable<IImageEnhancer> GetSupportedEnhancers(IHasImages item, ImageType imageType)
diff --git a/Emby.Drawing/packages.config b/Emby.Drawing/packages.config
index 35c98e592..acbd2ee3a 100644
--- a/Emby.Drawing/packages.config
+++ b/Emby.Drawing/packages.config
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
- <package id="ImageMagickSharp" version="1.0.0.15" targetFramework="net45" />
+ <package id="ImageMagickSharp" version="1.0.0.16" targetFramework="net45" />
</packages> \ No newline at end of file