@ -294,9 +294,7 @@ public class DynamicHlsController : BaseJellyfinApiController
if ( ! System . IO . File . Exists ( playlistPath ) )
{
var transcodingLock = _transcodeManager . GetTranscodingLock ( playlistPath ) ;
await transcodingLock . WaitAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
try
using ( await _transcodeManager . LockAsync ( playlistPath , cancellationToken ) . ConfigureAwait ( false ) )
{
if ( ! System . IO . File . Exists ( playlistPath ) )
{
@ -326,10 +324,6 @@ public class DynamicHlsController : BaseJellyfinApiController
}
}
}
finally
{
transcodingLock . Release ( ) ;
}
}
job ? ? = _transcodeManager . OnTranscodeBeginRequest ( playlistPath , TranscodingJobType ) ;
@ -1442,95 +1436,80 @@ public class DynamicHlsController : BaseJellyfinApiController
return await GetSegmentResult ( state , playlistPath , segmentPath , segmentExtension , segmentId , job , cancellationToken ) . ConfigureAwait ( false ) ;
}
var transcodingLock = _transcodeManager . GetTranscodingLock ( playlistPath ) ;
await transcodingLock . WaitAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
var released = false ;
var startTranscoding = false ;
try
using ( await _transcodeManager . LockAsync ( playlistPath , cancellationToken ) . ConfigureAwait ( false ) )
{
var startTranscoding = false ;
if ( System . IO . File . Exists ( segmentPath ) )
{
job = _transcodeManager . OnTranscodeBeginRequest ( playlistPath , TranscodingJobType ) ;
transcodingLock . Release ( ) ;
released = true ;
_logger . LogDebug ( "returning {0} [it exists, try 2]" , segmentPath ) ;
return await GetSegmentResult ( state , playlistPath , segmentPath , segmentExtension , segmentId , job , cancellationToken ) . ConfigureAwait ( false ) ;
}
else
{
var currentTranscodingIndex = GetCurrentTranscodingIndex ( playlistPath , segmentExtension ) ;
var segmentGapRequiringTranscodingChange = 24 / state . SegmentLength ;
if ( segmentId = = - 1 )
{
_logger . LogDebug ( "Starting transcoding because fmp4 init file is being requested" ) ;
startTranscoding = true ;
segmentId = 0 ;
}
else if ( currentTranscodingIndex is null )
{
_logger . LogDebug ( "Starting transcoding because currentTranscodingIndex=null" ) ;
startTranscoding = true ;
}
else if ( segmentId < currentTranscodingIndex . Value )
{
_logger . LogDebug ( "Starting transcoding because requestedIndex={0} and currentTranscodingIndex={1}" , segmentId , currentTranscodingIndex ) ;
startTranscoding = true ;
}
else if ( segmentId - currentTranscodingIndex . Value > segmentGapRequiringTranscodingChange )
{
_logger . LogDebug ( "Starting transcoding because segmentGap is {0} and max allowed gap is {1}. requestedIndex={2}" , segmentId - currentTranscodingIndex . Value , segmentGapRequiringTranscodingChange , segmentId ) ;
startTranscoding = true ;
}
if ( startTranscoding )
{
// If the playlist doesn't already exist, startup ffmpeg
try
{
await _transcodeManager . KillTranscodingJobs ( streamingRequest . DeviceId , streamingRequest . PlaySessionId , p = > false )
. ConfigureAwait ( false ) ;
var currentTranscodingIndex = GetCurrentTranscodingIndex ( playlistPath , segmentExtension ) ;
var segmentGapRequiringTranscodingChange = 24 / state . SegmentLength ;
if ( currentTranscodingIndex . HasValue )
{
DeleteLastFile ( playlistPath , segmentExtension , 0 ) ;
}
if ( segmentId = = - 1 )
{
_logger . LogDebug ( "Starting transcoding because fmp4 init file is being requested" ) ;
startTranscoding = true ;
segmentId = 0 ;
}
else if ( currentTranscodingIndex is null )
{
_logger . LogDebug ( "Starting transcoding because currentTranscodingIndex=null" ) ;
startTranscoding = true ;
}
else if ( segmentId < currentTranscodingIndex . Value )
{
_logger . LogDebug ( "Starting transcoding because requestedIndex={0} and currentTranscodingIndex={1}" , segmentId , currentTranscodingIndex ) ;
startTranscoding = true ;
}
else if ( segmentId - currentTranscodingIndex . Value > segmentGapRequiringTranscodingChange )
{
_logger . LogDebug ( "Starting transcoding because segmentGap is {0} and max allowed gap is {1}. requestedIndex={2}" , segmentId - currentTranscodingIndex . Value , segmentGapRequiringTranscodingChange , segmentId ) ;
startTranscoding = true ;
}
streamingRequest . StartTimeTicks = streamingRequest . CurrentRuntimeTicks ;
if ( startTranscoding )
{
// If the playlist doesn't already exist, startup ffmpeg
try
{
await _transcodeManager . KillTranscodingJobs ( streamingRequest . DeviceId , streamingRequest . PlaySessionId , p = > false )
. ConfigureAwait ( false ) ;
state . WaitForPath = segmentPath ;
job = await _transcodeManager . StartFfMpeg (
state ,
playlistPath ,
GetCommandLineArguments ( playlistPath , state , false , segmentId ) ,
Request . HttpContext . User . GetUserId ( ) ,
TranscodingJobType ,
cancellationTokenSource ) . ConfigureAwait ( false ) ;
}
catch
if ( currentTranscodingIndex . HasValue )
{
state . Dispose ( ) ;
throw ;
DeleteLastFile ( playlistPath , segmentExtension , 0 ) ;
}
// await WaitForMinimumSegmentCount(playlistPath, 1, cancellationTokenSource.Token).ConfigureAwait(false);
streamingRequest . StartTimeTicks = streamingRequest . CurrentRuntimeTicks ;
state . WaitForPath = segmentPath ;
job = await _transcodeManager . StartFfMpeg (
state ,
playlistPath ,
GetCommandLineArguments ( playlistPath , state , false , segmentId ) ,
Request . HttpContext . User . GetUserId ( ) ,
TranscodingJobType ,
cancellationTokenSource ) . ConfigureAwait ( false ) ;
}
else
catch
{
job = _transcodeManager . OnTranscodeBeginRequest ( playlistPath , TranscodingJobType ) ;
if ( job ? . TranscodingThrottler is not null )
{
await job . TranscodingThrottler . UnpauseTranscoding ( ) . ConfigureAwait ( false ) ;
}
state . Dispose ( ) ;
throw ;
}
// await WaitForMinimumSegmentCount(playlistPath, 1, cancellationTokenSource.Token).ConfigureAwait(false);
}
}
finally
{
if ( ! released )
else
{
transcodingLock . Release ( ) ;
job = _transcodeManager . OnTranscodeBeginRequest ( playlistPath , TranscodingJobType ) ;
if ( job ? . TranscodingThrottler is not null )
{
await job . TranscodingThrottler . UnpauseTranscoding ( ) . ConfigureAwait ( false ) ;
}
}
}