mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-07-15 18:53:27 +01:00
Merge remote-tracking branch 'origin/master' into feature/EFUserData
This commit is contained in:
@@ -4,7 +4,6 @@
|
||||
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace MediaBrowser.Controller.Entities
|
||||
{
|
||||
@@ -12,7 +11,6 @@ namespace MediaBrowser.Controller.Entities
|
||||
{
|
||||
public LinkedChild()
|
||||
{
|
||||
Id = Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
public string Path { get; set; }
|
||||
@@ -21,9 +19,6 @@ namespace MediaBrowser.Controller.Entities
|
||||
|
||||
public string LibraryItemId { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public string Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the linked item id.
|
||||
/// </summary>
|
||||
@@ -31,6 +26,8 @@ namespace MediaBrowser.Controller.Entities
|
||||
|
||||
public static LinkedChild Create(BaseItem item)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(item);
|
||||
|
||||
var child = new LinkedChild
|
||||
{
|
||||
Path = item.Path,
|
||||
|
||||
@@ -49,11 +49,6 @@ namespace MediaBrowser.Controller.Extensions
|
||||
/// </summary>
|
||||
public const string FfmpegPathKey = "ffmpeg";
|
||||
|
||||
/// <summary>
|
||||
/// The key for a setting that indicates whether playlists should allow duplicate entries.
|
||||
/// </summary>
|
||||
public const string PlaylistsAllowDuplicatesKey = "playlists:allowDuplicates";
|
||||
|
||||
/// <summary>
|
||||
/// The key for a setting that indicates whether kestrel should bind to a unix socket.
|
||||
/// </summary>
|
||||
@@ -120,14 +115,6 @@ namespace MediaBrowser.Controller.Extensions
|
||||
public static bool GetFFmpegImgExtractPerfTradeoff(this IConfiguration configuration)
|
||||
=> configuration.GetValue<bool>(FfmpegImgExtractPerfTradeoffKey);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether playlists should allow duplicate entries from the <see cref="IConfiguration"/>.
|
||||
/// </summary>
|
||||
/// <param name="configuration">The configuration to read the setting from.</param>
|
||||
/// <returns>True if playlists should allow duplicates, otherwise false.</returns>
|
||||
public static bool DoPlaylistsAllowDuplicates(this IConfiguration configuration)
|
||||
=> configuration.GetValue<bool>(PlaylistsAllowDuplicatesKey);
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether kestrel should bind to a unix socket from the <see cref="IConfiguration" />.
|
||||
/// </summary>
|
||||
|
||||
@@ -2196,7 +2196,10 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||
{
|
||||
var videoFrameRate = videoStream.ReferenceFrameRate;
|
||||
|
||||
if (!videoFrameRate.HasValue || videoFrameRate.Value > requestedFramerate.Value)
|
||||
// Add a little tolerance to the framerate check because some videos might record a framerate
|
||||
// that is slightly higher than the intended framerate, but the device can still play it correctly.
|
||||
// 0.05 fps tolerance should be safe enough.
|
||||
if (!videoFrameRate.HasValue || videoFrameRate.Value > requestedFramerate.Value + 0.05f)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -3318,24 +3321,25 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||
&& options.VppTonemappingBrightness >= -100
|
||||
&& options.VppTonemappingBrightness <= 100)
|
||||
{
|
||||
procampParams += $"=b={options.VppTonemappingBrightness}";
|
||||
procampParams += "procamp_vaapi=b={0}";
|
||||
doVaVppProcamp = true;
|
||||
}
|
||||
|
||||
if (options.VppTonemappingContrast > 1
|
||||
&& options.VppTonemappingContrast <= 10)
|
||||
{
|
||||
procampParams += doVaVppProcamp ? ":" : "=";
|
||||
procampParams += $"c={options.VppTonemappingContrast}";
|
||||
procampParams += doVaVppProcamp ? ":c={1}" : "procamp_vaapi=c={1}";
|
||||
doVaVppProcamp = true;
|
||||
}
|
||||
|
||||
args = "{0}tonemap_vaapi=format={1}:p=bt709:t=bt709:m=bt709:extra_hw_frames=32";
|
||||
args = procampParams + "{2}tonemap_vaapi=format={3}:p=bt709:t=bt709:m=bt709:extra_hw_frames=32";
|
||||
|
||||
return string.Format(
|
||||
CultureInfo.InvariantCulture,
|
||||
args,
|
||||
doVaVppProcamp ? $"procamp_vaapi{procampParams}," : string.Empty,
|
||||
options.VppTonemappingBrightness,
|
||||
options.VppTonemappingContrast,
|
||||
doVaVppProcamp ? "," : string.Empty,
|
||||
videoFormat ?? "nv12");
|
||||
}
|
||||
else
|
||||
@@ -3523,20 +3527,29 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||
{
|
||||
// tonemapx requires yuv420p10 input for dovi reshaping, let ffmpeg convert the frame when necessary
|
||||
var tonemapFormat = requireDoviReshaping ? "yuv420p" : outFormat;
|
||||
|
||||
var tonemapArgs = $"tonemapx=tonemap={options.TonemappingAlgorithm}:desat={options.TonemappingDesat}:peak={options.TonemappingPeak}:t=bt709:m=bt709:p=bt709:format={tonemapFormat}";
|
||||
var tonemapArgString = "tonemapx=tonemap={0}:desat={1}:peak={2}:t=bt709:m=bt709:p=bt709:format={3}";
|
||||
|
||||
if (options.TonemappingParam != 0)
|
||||
{
|
||||
tonemapArgs += $":param={options.TonemappingParam}";
|
||||
tonemapArgString += ":param={4}";
|
||||
}
|
||||
|
||||
var range = options.TonemappingRange;
|
||||
if (range == TonemappingRange.tv || range == TonemappingRange.pc)
|
||||
{
|
||||
tonemapArgs += $":range={options.TonemappingRange}";
|
||||
tonemapArgString += ":range={5}";
|
||||
}
|
||||
|
||||
var tonemapArgs = string.Format(
|
||||
CultureInfo.InvariantCulture,
|
||||
tonemapArgString,
|
||||
options.TonemappingAlgorithm,
|
||||
options.TonemappingDesat,
|
||||
options.TonemappingPeak,
|
||||
tonemapFormat,
|
||||
options.TonemappingParam,
|
||||
options.TonemappingRange);
|
||||
|
||||
mainFilters.Add(tonemapArgs);
|
||||
}
|
||||
else
|
||||
@@ -4128,31 +4141,46 @@ namespace MediaBrowser.Controller.MediaEncoding
|
||||
else if (isD3d11vaDecoder || isQsvDecoder)
|
||||
{
|
||||
var isRext = IsVideoStreamHevcRext(state);
|
||||
var twoPassVppTonemap = isRext;
|
||||
var twoPassVppTonemap = false;
|
||||
var doVppFullRangeOut = isMjpegEncoder
|
||||
&& _mediaEncoder.EncoderVersion >= _minFFmpegQsvVppOutRangeOption;
|
||||
var doVppScaleModeHq = isMjpegEncoder
|
||||
&& _mediaEncoder.EncoderVersion >= _minFFmpegQsvVppScaleModeOption;
|
||||
var doVppProcamp = false;
|
||||
var procampParams = string.Empty;
|
||||
var procampParamsString = string.Empty;
|
||||
if (doVppTonemap)
|
||||
{
|
||||
if (isRext)
|
||||
{
|
||||
// VPP tonemap requires p010 input
|
||||
twoPassVppTonemap = true;
|
||||
}
|
||||
|
||||
if (options.VppTonemappingBrightness != 0
|
||||
&& options.VppTonemappingBrightness >= -100
|
||||
&& options.VppTonemappingBrightness <= 100)
|
||||
{
|
||||
procampParams += $":brightness={options.VppTonemappingBrightness}";
|
||||
procampParamsString += ":brightness={0}";
|
||||
twoPassVppTonemap = doVppProcamp = true;
|
||||
}
|
||||
|
||||
if (options.VppTonemappingContrast > 1
|
||||
&& options.VppTonemappingContrast <= 10)
|
||||
{
|
||||
procampParams += $":contrast={options.VppTonemappingContrast}";
|
||||
procampParamsString += ":contrast={1}";
|
||||
twoPassVppTonemap = doVppProcamp = true;
|
||||
}
|
||||
|
||||
procampParams += doVppProcamp ? ":procamp=1:async_depth=2" : string.Empty;
|
||||
if (doVppProcamp)
|
||||
{
|
||||
procampParamsString += ":procamp=1:async_depth=2";
|
||||
procampParams = string.Format(
|
||||
CultureInfo.InvariantCulture,
|
||||
procampParamsString,
|
||||
options.VppTonemappingBrightness,
|
||||
options.VppTonemappingContrast);
|
||||
}
|
||||
}
|
||||
|
||||
var outFormat = doOclTonemap ? ((doVppTranspose || isRext) ? "p010" : string.Empty) : "nv12";
|
||||
|
||||
@@ -50,8 +50,18 @@ public interface IMediaSegmentManager
|
||||
/// </summary>
|
||||
/// <param name="itemId">The id of the <see cref="BaseItem"/>.</param>
|
||||
/// <param name="typeFilter">filteres all media segments of the given type to be included. If null all types are included.</param>
|
||||
/// <param name="filterByProvider">When set filteres the segments to only return those that which providers are currently enabled on their library.</param>
|
||||
/// <returns>An enumerator of <see cref="MediaSegmentDto"/>'s.</returns>
|
||||
Task<IEnumerable<MediaSegmentDto>> GetSegmentsAsync(Guid itemId, IEnumerable<MediaSegmentType>? typeFilter);
|
||||
Task<IEnumerable<MediaSegmentDto>> GetSegmentsAsync(Guid itemId, IEnumerable<MediaSegmentType>? typeFilter, bool filterByProvider = true);
|
||||
|
||||
/// <summary>
|
||||
/// Obtains all segments accociated with the itemId.
|
||||
/// </summary>
|
||||
/// <param name="item">The <see cref="BaseItem"/>.</param>
|
||||
/// <param name="typeFilter">filteres all media segments of the given type to be included. If null all types are included.</param>
|
||||
/// <param name="filterByProvider">When set filteres the segments to only return those that which providers are currently enabled on their library.</param>
|
||||
/// <returns>An enumerator of <see cref="MediaSegmentDto"/>'s.</returns>
|
||||
Task<IEnumerable<MediaSegmentDto>> GetSegmentsAsync(BaseItem item, IEnumerable<MediaSegmentType>? typeFilter, bool filterByProvider = true);
|
||||
|
||||
/// <summary>
|
||||
/// Gets information about any media segments stored for the given itemId.
|
||||
|
||||
@@ -92,8 +92,9 @@ namespace MediaBrowser.Controller.Playlists
|
||||
/// <param name="playlistId">The playlist identifier.</param>
|
||||
/// <param name="entryId">The entry identifier.</param>
|
||||
/// <param name="newIndex">The new index.</param>
|
||||
/// <param name="callingUserId">The calling user.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task MoveItemAsync(string playlistId, string entryId, int newIndex);
|
||||
Task MoveItemAsync(string playlistId, string entryId, int newIndex, Guid callingUserId);
|
||||
|
||||
/// <summary>
|
||||
/// Removed all playlists of a user.
|
||||
|
||||
Reference in New Issue
Block a user