DynamicHlsController.cs (jellyfin-10.8.9) | : | DynamicHlsController.cs (jellyfin-10.8.10) | ||
---|---|---|---|---|
skipping to change at line 16 | skipping to change at line 16 | |||
using System.IO; | using System.IO; | |||
using System.Linq; | using System.Linq; | |||
using System.Text; | using System.Text; | |||
using System.Threading; | using System.Threading; | |||
using System.Threading.Tasks; | using System.Threading.Tasks; | |||
using Jellyfin.Api.Attributes; | using Jellyfin.Api.Attributes; | |||
using Jellyfin.Api.Constants; | using Jellyfin.Api.Constants; | |||
using Jellyfin.Api.Helpers; | using Jellyfin.Api.Helpers; | |||
using Jellyfin.Api.Models.PlaybackDtos; | using Jellyfin.Api.Models.PlaybackDtos; | |||
using Jellyfin.Api.Models.StreamingDtos; | using Jellyfin.Api.Models.StreamingDtos; | |||
using Jellyfin.Extensions; | ||||
using Jellyfin.MediaEncoding.Hls.Playlist; | using Jellyfin.MediaEncoding.Hls.Playlist; | |||
using MediaBrowser.Common.Configuration; | using MediaBrowser.Common.Configuration; | |||
using MediaBrowser.Controller.Configuration; | using MediaBrowser.Controller.Configuration; | |||
using MediaBrowser.Controller.Devices; | using MediaBrowser.Controller.Devices; | |||
using MediaBrowser.Controller.Dlna; | using MediaBrowser.Controller.Dlna; | |||
using MediaBrowser.Controller.Library; | using MediaBrowser.Controller.Library; | |||
using MediaBrowser.Controller.MediaEncoding; | using MediaBrowser.Controller.MediaEncoding; | |||
using MediaBrowser.Controller.Net; | using MediaBrowser.Controller.Net; | |||
using MediaBrowser.MediaEncoding.Encoder; | ||||
using MediaBrowser.Model.Configuration; | using MediaBrowser.Model.Configuration; | |||
using MediaBrowser.Model.Dlna; | using MediaBrowser.Model.Dlna; | |||
using MediaBrowser.Model.IO; | using MediaBrowser.Model.IO; | |||
using MediaBrowser.Model.Net; | using MediaBrowser.Model.Net; | |||
using Microsoft.AspNetCore.Authorization; | using Microsoft.AspNetCore.Authorization; | |||
using Microsoft.AspNetCore.Http; | using Microsoft.AspNetCore.Http; | |||
using Microsoft.AspNetCore.Mvc; | using Microsoft.AspNetCore.Mvc; | |||
using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | |||
namespace Jellyfin.Api.Controllers | namespace Jellyfin.Api.Controllers | |||
skipping to change at line 1665 | skipping to change at line 1667 | |||
threads, | threads, | |||
mapArgs, | mapArgs, | |||
GetVideoArguments(state, startNumber, isEventPlaylist), | GetVideoArguments(state, startNumber, isEventPlaylist), | |||
GetAudioArguments(state), | GetAudioArguments(state), | |||
maxMuxingQueueSize, | maxMuxingQueueSize, | |||
state.SegmentLength.ToString(CultureInfo.InvariantCulture), | state.SegmentLength.ToString(CultureInfo.InvariantCulture), | |||
segmentFormat, | segmentFormat, | |||
startNumber.ToString(CultureInfo.InvariantCulture), | startNumber.ToString(CultureInfo.InvariantCulture), | |||
baseUrlParam, | baseUrlParam, | |||
isEventPlaylist ? "event" : "vod", | isEventPlaylist ? "event" : "vod", | |||
outputTsArg, | EncodingUtils.NormalizePath(outputTsArg), | |||
outputPath).Trim(); | EncodingUtils.NormalizePath(outputPath)).Trim(); | |||
} | } | |||
/// <summary> | /// <summary> | |||
/// Gets the audio arguments for transcoding. | /// Gets the audio arguments for transcoding. | |||
/// </summary> | /// </summary> | |||
/// <param name="state">The <see cref="StreamState"/>.</param> | /// <param name="state">The <see cref="StreamState"/>.</param> | |||
/// <returns>The command line arguments for audio transcoding.</returns> | /// <returns>The command line arguments for audio transcoding.</returns> | |||
private string GetAudioArguments(StreamState state) | private string GetAudioArguments(StreamState state) | |||
{ | { | |||
if (state.AudioStream == null) | if (state.AudioStream == null) | |||
skipping to change at line 1696 | skipping to change at line 1698 | |||
{ | { | |||
var bitStreamArgs = EncodingHelper.GetAudioBitStreamArgument s(state, state.Request.SegmentContainer, state.MediaSource.Container); | var bitStreamArgs = EncodingHelper.GetAudioBitStreamArgument s(state, state.Request.SegmentContainer, state.MediaSource.Container); | |||
return "-acodec copy -strict -2" + bitStreamArgs; | return "-acodec copy -strict -2" + bitStreamArgs; | |||
} | } | |||
var audioTranscodeParams = string.Empty; | var audioTranscodeParams = string.Empty; | |||
audioTranscodeParams += "-acodec " + audioCodec; | audioTranscodeParams += "-acodec " + audioCodec; | |||
if (state.OutputAudioBitrate.HasValue) | if (state.OutputAudioBitrate.HasValue && !EncodingHelper.Lossles sAudioCodecs.Contains(state.ActualOutputAudioCodec, StringComparison.OrdinalIgno reCase)) | |||
{ | { | |||
audioTranscodeParams += " -ab " + state.OutputAudioBitrate.V alue.ToString(CultureInfo.InvariantCulture); | audioTranscodeParams += " -ab " + state.OutputAudioBitrate.V alue.ToString(CultureInfo.InvariantCulture); | |||
} | } | |||
if (state.OutputAudioChannels.HasValue) | if (state.OutputAudioChannels.HasValue) | |||
{ | { | |||
audioTranscodeParams += " -ac " + state.OutputAudioChannels. Value.ToString(CultureInfo.InvariantCulture); | audioTranscodeParams += " -ac " + state.OutputAudioChannels. Value.ToString(CultureInfo.InvariantCulture); | |||
} | } | |||
if (state.OutputAudioSampleRate.HasValue) | if (state.OutputAudioSampleRate.HasValue) | |||
{ | { | |||
audioTranscodeParams += " -ar " + state.OutputAudioSampleRat e.Value.ToString(CultureInfo.InvariantCulture); | audioTranscodeParams += " -ar " + state.OutputAudioSampleRat e.Value.ToString(CultureInfo.InvariantCulture); | |||
} | } | |||
audioTranscodeParams += " -vn"; | audioTranscodeParams += " -vn"; | |||
return audioTranscodeParams; | return audioTranscodeParams; | |||
} | } | |||
// dts, flac, opus and truehd are experimental in mp4 muxer | // dts, flac, opus and truehd are experimental in mp4 muxer | |||
var strictArgs = string.Empty; | var strictArgs = string.Empty; | |||
var actualOutputAudioCodec = state.ActualOutputAudioCodec; | ||||
if (string.Equals(state.ActualOutputAudioCodec, "flac", StringCompar | if (string.Equals(actualOutputAudioCodec, "flac", StringComparison.O | |||
ison.OrdinalIgnoreCase) | rdinalIgnoreCase) | |||
|| string.Equals(state.ActualOutputAudioCodec, "opus", StringCom | || string.Equals(actualOutputAudioCodec, "opus", StringCompariso | |||
parison.OrdinalIgnoreCase) | n.OrdinalIgnoreCase) | |||
|| string.Equals(state.ActualOutputAudioCodec, "dts", StringComp | || string.Equals(actualOutputAudioCodec, "dts", StringComparison | |||
arison.OrdinalIgnoreCase) | .OrdinalIgnoreCase) | |||
|| string.Equals(state.ActualOutputAudioCodec, "truehd", StringC | || string.Equals(actualOutputAudioCodec, "truehd", StringCompari | |||
omparison.OrdinalIgnoreCase)) | son.OrdinalIgnoreCase)) | |||
{ | { | |||
strictArgs = " -strict -2"; | strictArgs = " -strict -2"; | |||
} | } | |||
if (EncodingHelper.IsCopyCodec(audioCodec)) | if (EncodingHelper.IsCopyCodec(audioCodec)) | |||
{ | { | |||
var videoCodec = _encodingHelper.GetVideoEncoder(state, _encodin gOptions); | var videoCodec = _encodingHelper.GetVideoEncoder(state, _encodin gOptions); | |||
var bitStreamArgs = EncodingHelper.GetAudioBitStreamArguments(st ate, state.Request.SegmentContainer, state.MediaSource.Container); | var bitStreamArgs = EncodingHelper.GetAudioBitStreamArguments(st ate, state.Request.SegmentContainer, state.MediaSource.Container); | |||
var copyArgs = "-codec:a:0 copy" + bitStreamArgs + strictArgs; | var copyArgs = "-codec:a:0 copy" + bitStreamArgs + strictArgs; | |||
skipping to change at line 1750 | skipping to change at line 1752 | |||
var args = "-codec:a:0 " + audioCodec + strictArgs; | var args = "-codec:a:0 " + audioCodec + strictArgs; | |||
var channels = state.OutputAudioChannels; | var channels = state.OutputAudioChannels; | |||
if (channels.HasValue) | if (channels.HasValue) | |||
{ | { | |||
args += " -ac " + channels.Value; | args += " -ac " + channels.Value; | |||
} | } | |||
var bitrate = state.OutputAudioBitrate; | var bitrate = state.OutputAudioBitrate; | |||
if (bitrate.HasValue && !EncodingHelper.LosslessAudioCodecs.Contains | ||||
if (bitrate.HasValue) | (actualOutputAudioCodec, StringComparison.OrdinalIgnoreCase)) | |||
{ | { | |||
args += " -ab " + bitrate.Value.ToString(CultureInfo.InvariantCu lture); | args += " -ab " + bitrate.Value.ToString(CultureInfo.InvariantCu lture); | |||
} | } | |||
if (state.OutputAudioSampleRate.HasValue) | if (state.OutputAudioSampleRate.HasValue) | |||
{ | { | |||
args += " -ar " + state.OutputAudioSampleRate.Value.ToString(Cul tureInfo.InvariantCulture); | args += " -ar " + state.OutputAudioSampleRate.Value.ToString(Cul tureInfo.InvariantCulture); | |||
} | } | |||
args += _encodingHelper.GetAudioFilterParam(state, _encodingOptions) ; | args += _encodingHelper.GetAudioFilterParam(state, _encodingOptions) ; | |||
skipping to change at line 1846 | skipping to change at line 1847 | |||
// Currenly b-frames in libx265 breaks the FMP4-HLS playback on iOS, disable it for now. | // Currenly b-frames in libx265 breaks the FMP4-HLS playback on iOS, disable it for now. | |||
if (string.Equals(codec, "libx265", StringComparison.OrdinalIgno reCase)) | if (string.Equals(codec, "libx265", StringComparison.OrdinalIgno reCase)) | |||
{ | { | |||
args += " -bf 0"; | args += " -bf 0"; | |||
} | } | |||
// args += " -mixed-refs 0 -refs 3 -x264opts b_pyramid=0:weightb =0:weightp=0"; | // args += " -mixed-refs 0 -refs 3 -x264opts b_pyramid=0:weightb =0:weightp=0"; | |||
// video processing filters. | // video processing filters. | |||
args += _encodingHelper.GetVideoProcessingFilterParam(state, _en | var videoProcessParam = _encodingHelper.GetVideoProcessingFilter | |||
codingOptions, codec); | Param(state, _encodingOptions, codec); | |||
var negativeMapArgs = _encodingHelper.GetNegativeMapArgsByFilter | ||||
s(state, videoProcessParam); | ||||
args = negativeMapArgs + args + videoProcessParam; | ||||
// -start_at_zero is necessary to use with -ss when seeking, | // -start_at_zero is necessary to use with -ss when seeking, | |||
// otherwise the target position cannot be determined. | // otherwise the target position cannot be determined. | |||
if (state.SubtitleStream != null) | if (state.SubtitleStream != null) | |||
{ | { | |||
// Disable start_at_zero for external graphical subs | // Disable start_at_zero for external graphical subs | |||
if (!(state.SubtitleStream.IsExternal && !state.SubtitleStre am.IsTextSubtitleStream)) | if (!(state.SubtitleStream.IsExternal && !state.SubtitleStre am.IsTextSubtitleStream)) | |||
{ | { | |||
args += " -start_at_zero"; | args += " -start_at_zero"; | |||
} | } | |||
End of changes. 7 change blocks. | ||||
16 lines changed or deleted | 23 lines changed or added |