mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-09-05 21:37:10 -04:00
Merge pull request #10924 from nyanmisaka/fix-subs-dar-and-framerate
Fixed some issues in PGSSUB and ASS subtitle burn-in
This commit is contained in:
commit
59048f2ed2
@ -835,30 +835,25 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
|
|
||||||
public string GetGraphicalSubCanvasSize(EncodingJobInfo state)
|
public string GetGraphicalSubCanvasSize(EncodingJobInfo state)
|
||||||
{
|
{
|
||||||
// DVBSUB and DVDSUB use the fixed canvas size 720x576
|
// DVBSUB uses the fixed canvas size 720x576
|
||||||
if (state.SubtitleStream is not null
|
if (state.SubtitleStream is not null
|
||||||
&& state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode
|
&& state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode
|
||||||
&& !state.SubtitleStream.IsTextSubtitleStream
|
&& !state.SubtitleStream.IsTextSubtitleStream
|
||||||
&& !string.Equals(state.SubtitleStream.Codec, "DVBSUB", StringComparison.OrdinalIgnoreCase)
|
&& !string.Equals(state.SubtitleStream.Codec, "DVBSUB", StringComparison.OrdinalIgnoreCase))
|
||||||
&& !string.Equals(state.SubtitleStream.Codec, "DVDSUB", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
{
|
||||||
var inW = state.VideoStream?.Width;
|
var subtitleWidth = state.SubtitleStream?.Width;
|
||||||
var inH = state.VideoStream?.Height;
|
var subtitleHeight = state.SubtitleStream?.Height;
|
||||||
var reqW = state.BaseRequest.Width;
|
|
||||||
var reqH = state.BaseRequest.Height;
|
|
||||||
var reqMaxW = state.BaseRequest.MaxWidth;
|
|
||||||
var reqMaxH = state.BaseRequest.MaxHeight;
|
|
||||||
|
|
||||||
// setup a relative small canvas_size for overlay_qsv/vaapi to reduce transfer overhead
|
if (subtitleWidth.HasValue
|
||||||
var (overlayW, overlayH) = GetFixedOutputSize(inW, inH, reqW, reqH, reqMaxW, 1080);
|
&& subtitleHeight.HasValue
|
||||||
|
&& subtitleWidth.Value > 0
|
||||||
if (overlayW.HasValue && overlayH.HasValue)
|
&& subtitleHeight.Value > 0)
|
||||||
{
|
{
|
||||||
return string.Format(
|
return string.Format(
|
||||||
CultureInfo.InvariantCulture,
|
CultureInfo.InvariantCulture,
|
||||||
" -canvas_size {0}x{1}",
|
" -canvas_size {0}x{1}",
|
||||||
overlayW.Value,
|
subtitleWidth.Value,
|
||||||
overlayH.Value);
|
subtitleHeight.Value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2877,7 +2872,7 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
return string.Empty;
|
return string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetCustomSwScaleFilter(
|
public static string GetGraphicalSubPreProcessFilters(
|
||||||
int? videoWidth,
|
int? videoWidth,
|
||||||
int? videoHeight,
|
int? videoHeight,
|
||||||
int? requestedWidth,
|
int? requestedWidth,
|
||||||
@ -2897,7 +2892,7 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
return string.Format(
|
return string.Format(
|
||||||
CultureInfo.InvariantCulture,
|
CultureInfo.InvariantCulture,
|
||||||
"scale=s={0}x{1}:flags=fast_bilinear",
|
@"scale=-1:{1}:fast_bilinear,crop,pad=max({0}\,iw):max({1}\,ih):(ow-iw)/2:(oh-ih)/2:black@0,crop={0}:{1}",
|
||||||
outWidth.Value,
|
outWidth.Value,
|
||||||
outHeight.Value);
|
outHeight.Value);
|
||||||
}
|
}
|
||||||
@ -2913,7 +2908,7 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
int? requestedHeight,
|
int? requestedHeight,
|
||||||
int? requestedMaxWidth,
|
int? requestedMaxWidth,
|
||||||
int? requestedMaxHeight,
|
int? requestedMaxHeight,
|
||||||
int? framerate)
|
float? framerate)
|
||||||
{
|
{
|
||||||
var reqTicks = state.BaseRequest.StartTimeTicks ?? 0;
|
var reqTicks = state.BaseRequest.StartTimeTicks ?? 0;
|
||||||
var startTime = TimeSpan.FromTicks(reqTicks).ToString(@"hh\\\:mm\\\:ss\\\.fff", CultureInfo.InvariantCulture);
|
var startTime = TimeSpan.FromTicks(reqTicks).ToString(@"hh\\\:mm\\\:ss\\\.fff", CultureInfo.InvariantCulture);
|
||||||
@ -2932,7 +2927,7 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
"alphasrc=s={0}x{1}:r={2}:start='{3}'",
|
"alphasrc=s={0}x{1}:r={2}:start='{3}'",
|
||||||
outWidth.Value,
|
outWidth.Value,
|
||||||
outHeight.Value,
|
outHeight.Value,
|
||||||
framerate ?? 10,
|
framerate ?? 25,
|
||||||
reqTicks > 0 ? startTime : 0);
|
reqTicks > 0 ? startTime : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3340,9 +3335,8 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
}
|
}
|
||||||
else if (hasGraphicalSubs)
|
else if (hasGraphicalSubs)
|
||||||
{
|
{
|
||||||
// [0:s]scale=s=1280x720
|
var subPreProcFilters = GetGraphicalSubPreProcessFilters(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
||||||
var subSwScaleFilter = GetCustomSwScaleFilter(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
subFilters.Add(subPreProcFilters);
|
||||||
subFilters.Add(subSwScaleFilter);
|
|
||||||
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3504,15 +3498,17 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
if (hasGraphicalSubs)
|
if (hasGraphicalSubs)
|
||||||
{
|
{
|
||||||
// scale=s=1280x720,format=yuva420p,hwupload
|
var subPreProcFilters = GetGraphicalSubPreProcessFilters(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
||||||
var subSwScaleFilter = GetCustomSwScaleFilter(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
subFilters.Add(subPreProcFilters);
|
||||||
subFilters.Add(subSwScaleFilter);
|
|
||||||
subFilters.Add("format=yuva420p");
|
subFilters.Add("format=yuva420p");
|
||||||
}
|
}
|
||||||
else if (hasTextSubs)
|
else if (hasTextSubs)
|
||||||
{
|
{
|
||||||
|
var framerate = state.VideoStream?.RealFrameRate;
|
||||||
|
var subFramerate = hasAssSubs ? Math.Min(framerate ?? 25, 60) : 10;
|
||||||
|
|
||||||
// alphasrc=s=1280x720:r=10:start=0,format=yuva420p,subtitles,hwupload
|
// alphasrc=s=1280x720:r=10:start=0,format=yuva420p,subtitles,hwupload
|
||||||
var alphaSrcFilter = GetAlphaSrcFilter(state, inW, inH, reqW, reqH, reqMaxW, reqMaxH, hasAssSubs ? 10 : 5);
|
var alphaSrcFilter = GetAlphaSrcFilter(state, inW, inH, reqW, reqH, reqMaxW, reqMaxH, subFramerate);
|
||||||
var subTextSubtitlesFilter = GetTextSubtitlesFilter(state, true, true);
|
var subTextSubtitlesFilter = GetTextSubtitlesFilter(state, true, true);
|
||||||
subFilters.Add(alphaSrcFilter);
|
subFilters.Add(alphaSrcFilter);
|
||||||
subFilters.Add("format=yuva420p");
|
subFilters.Add("format=yuva420p");
|
||||||
@ -3527,8 +3523,8 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
if (hasGraphicalSubs)
|
if (hasGraphicalSubs)
|
||||||
{
|
{
|
||||||
var subSwScaleFilter = GetCustomSwScaleFilter(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
var subPreProcFilters = GetGraphicalSubPreProcessFilters(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
||||||
subFilters.Add(subSwScaleFilter);
|
subFilters.Add(subPreProcFilters);
|
||||||
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3702,15 +3698,17 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
if (hasGraphicalSubs)
|
if (hasGraphicalSubs)
|
||||||
{
|
{
|
||||||
// scale=s=1280x720,format=yuva420p,hwupload
|
var subPreProcFilters = GetGraphicalSubPreProcessFilters(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
||||||
var subSwScaleFilter = GetCustomSwScaleFilter(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
subFilters.Add(subPreProcFilters);
|
||||||
subFilters.Add(subSwScaleFilter);
|
|
||||||
subFilters.Add("format=yuva420p");
|
subFilters.Add("format=yuva420p");
|
||||||
}
|
}
|
||||||
else if (hasTextSubs)
|
else if (hasTextSubs)
|
||||||
{
|
{
|
||||||
|
var framerate = state.VideoStream?.RealFrameRate;
|
||||||
|
var subFramerate = hasAssSubs ? Math.Min(framerate ?? 25, 60) : 10;
|
||||||
|
|
||||||
// alphasrc=s=1280x720:r=10:start=0,format=yuva420p,subtitles,hwupload
|
// alphasrc=s=1280x720:r=10:start=0,format=yuva420p,subtitles,hwupload
|
||||||
var alphaSrcFilter = GetAlphaSrcFilter(state, inW, inH, reqW, reqH, reqMaxW, reqMaxH, hasAssSubs ? 10 : 5);
|
var alphaSrcFilter = GetAlphaSrcFilter(state, inW, inH, reqW, reqH, reqMaxW, reqMaxH, subFramerate);
|
||||||
var subTextSubtitlesFilter = GetTextSubtitlesFilter(state, true, true);
|
var subTextSubtitlesFilter = GetTextSubtitlesFilter(state, true, true);
|
||||||
subFilters.Add(alphaSrcFilter);
|
subFilters.Add(alphaSrcFilter);
|
||||||
subFilters.Add("format=yuva420p");
|
subFilters.Add("format=yuva420p");
|
||||||
@ -3727,8 +3725,8 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
if (hasGraphicalSubs)
|
if (hasGraphicalSubs)
|
||||||
{
|
{
|
||||||
var subSwScaleFilter = GetCustomSwScaleFilter(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
var subPreProcFilters = GetGraphicalSubPreProcessFilters(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
||||||
subFilters.Add(subSwScaleFilter);
|
subFilters.Add(subPreProcFilters);
|
||||||
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3938,16 +3936,18 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
if (hasGraphicalSubs)
|
if (hasGraphicalSubs)
|
||||||
{
|
{
|
||||||
// scale,format=bgra,hwupload
|
// overlay_qsv can handle overlay scaling, setup a smaller height to reduce transfer overhead
|
||||||
// overlay_qsv can handle overlay scaling,
|
var subPreProcFilters = GetGraphicalSubPreProcessFilters(inW, inH, reqW, reqH, reqMaxW, 1080);
|
||||||
// add a dummy scale filter to pair with -canvas_size.
|
subFilters.Add(subPreProcFilters);
|
||||||
subFilters.Add("scale=flags=fast_bilinear");
|
|
||||||
subFilters.Add("format=bgra");
|
subFilters.Add("format=bgra");
|
||||||
}
|
}
|
||||||
else if (hasTextSubs)
|
else if (hasTextSubs)
|
||||||
{
|
{
|
||||||
|
var framerate = state.VideoStream?.RealFrameRate;
|
||||||
|
var subFramerate = hasAssSubs ? Math.Min(framerate ?? 25, 60) : 10;
|
||||||
|
|
||||||
// alphasrc=s=1280x720:r=10:start=0,format=bgra,subtitles,hwupload
|
// alphasrc=s=1280x720:r=10:start=0,format=bgra,subtitles,hwupload
|
||||||
var alphaSrcFilter = GetAlphaSrcFilter(state, inW, inH, reqW, reqH, reqMaxW, 1080, hasAssSubs ? 10 : 5);
|
var alphaSrcFilter = GetAlphaSrcFilter(state, inW, inH, reqW, reqH, reqMaxW, 1080, subFramerate);
|
||||||
var subTextSubtitlesFilter = GetTextSubtitlesFilter(state, true, true);
|
var subTextSubtitlesFilter = GetTextSubtitlesFilter(state, true, true);
|
||||||
subFilters.Add(alphaSrcFilter);
|
subFilters.Add(alphaSrcFilter);
|
||||||
subFilters.Add("format=bgra");
|
subFilters.Add("format=bgra");
|
||||||
@ -3973,8 +3973,8 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
if (hasGraphicalSubs)
|
if (hasGraphicalSubs)
|
||||||
{
|
{
|
||||||
var subSwScaleFilter = GetCustomSwScaleFilter(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
var subPreProcFilters = GetGraphicalSubPreProcessFilters(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
||||||
subFilters.Add(subSwScaleFilter);
|
subFilters.Add(subPreProcFilters);
|
||||||
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4158,12 +4158,17 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
if (hasGraphicalSubs)
|
if (hasGraphicalSubs)
|
||||||
{
|
{
|
||||||
subFilters.Add("scale=flags=fast_bilinear");
|
// overlay_qsv can handle overlay scaling, setup a smaller height to reduce transfer overhead
|
||||||
|
var subPreProcFilters = GetGraphicalSubPreProcessFilters(inW, inH, reqW, reqH, reqMaxW, 1080);
|
||||||
|
subFilters.Add(subPreProcFilters);
|
||||||
subFilters.Add("format=bgra");
|
subFilters.Add("format=bgra");
|
||||||
}
|
}
|
||||||
else if (hasTextSubs)
|
else if (hasTextSubs)
|
||||||
{
|
{
|
||||||
var alphaSrcFilter = GetAlphaSrcFilter(state, inW, inH, reqW, reqH, reqMaxW, 1080, hasAssSubs ? 10 : 5);
|
var framerate = state.VideoStream?.RealFrameRate;
|
||||||
|
var subFramerate = hasAssSubs ? Math.Min(framerate ?? 25, 60) : 10;
|
||||||
|
|
||||||
|
var alphaSrcFilter = GetAlphaSrcFilter(state, inW, inH, reqW, reqH, reqMaxW, 1080, subFramerate);
|
||||||
var subTextSubtitlesFilter = GetTextSubtitlesFilter(state, true, true);
|
var subTextSubtitlesFilter = GetTextSubtitlesFilter(state, true, true);
|
||||||
subFilters.Add(alphaSrcFilter);
|
subFilters.Add(alphaSrcFilter);
|
||||||
subFilters.Add("format=bgra");
|
subFilters.Add("format=bgra");
|
||||||
@ -4189,8 +4194,8 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
if (hasGraphicalSubs)
|
if (hasGraphicalSubs)
|
||||||
{
|
{
|
||||||
var subSwScaleFilter = GetCustomSwScaleFilter(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
var subPreProcFilters = GetGraphicalSubPreProcessFilters(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
||||||
subFilters.Add(subSwScaleFilter);
|
subFilters.Add(subPreProcFilters);
|
||||||
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4425,12 +4430,17 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
if (hasGraphicalSubs)
|
if (hasGraphicalSubs)
|
||||||
{
|
{
|
||||||
subFilters.Add("scale=flags=fast_bilinear");
|
// overlay_vaapi can handle overlay scaling, setup a smaller height to reduce transfer overhead
|
||||||
|
var subPreProcFilters = GetGraphicalSubPreProcessFilters(inW, inH, reqW, reqH, reqMaxW, 1080);
|
||||||
|
subFilters.Add(subPreProcFilters);
|
||||||
subFilters.Add("format=bgra");
|
subFilters.Add("format=bgra");
|
||||||
}
|
}
|
||||||
else if (hasTextSubs)
|
else if (hasTextSubs)
|
||||||
{
|
{
|
||||||
var alphaSrcFilter = GetAlphaSrcFilter(state, inW, inH, reqW, reqH, reqMaxW, 1080, hasAssSubs ? 10 : 5);
|
var framerate = state.VideoStream?.RealFrameRate;
|
||||||
|
var subFramerate = hasAssSubs ? Math.Min(framerate ?? 25, 60) : 10;
|
||||||
|
|
||||||
|
var alphaSrcFilter = GetAlphaSrcFilter(state, inW, inH, reqW, reqH, reqMaxW, 1080, subFramerate);
|
||||||
var subTextSubtitlesFilter = GetTextSubtitlesFilter(state, true, true);
|
var subTextSubtitlesFilter = GetTextSubtitlesFilter(state, true, true);
|
||||||
subFilters.Add(alphaSrcFilter);
|
subFilters.Add(alphaSrcFilter);
|
||||||
subFilters.Add("format=bgra");
|
subFilters.Add("format=bgra");
|
||||||
@ -4454,8 +4464,8 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
if (hasGraphicalSubs)
|
if (hasGraphicalSubs)
|
||||||
{
|
{
|
||||||
var subSwScaleFilter = GetCustomSwScaleFilter(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
var subPreProcFilters = GetGraphicalSubPreProcessFilters(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
||||||
subFilters.Add(subSwScaleFilter);
|
subFilters.Add(subPreProcFilters);
|
||||||
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
||||||
|
|
||||||
if (isVaapiEncoder)
|
if (isVaapiEncoder)
|
||||||
@ -4599,14 +4609,16 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
if (hasGraphicalSubs)
|
if (hasGraphicalSubs)
|
||||||
{
|
{
|
||||||
// scale=s=1280x720,format=bgra,hwupload
|
var subPreProcFilters = GetGraphicalSubPreProcessFilters(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
||||||
var subSwScaleFilter = GetCustomSwScaleFilter(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
subFilters.Add(subPreProcFilters);
|
||||||
subFilters.Add(subSwScaleFilter);
|
|
||||||
subFilters.Add("format=bgra");
|
subFilters.Add("format=bgra");
|
||||||
}
|
}
|
||||||
else if (hasTextSubs)
|
else if (hasTextSubs)
|
||||||
{
|
{
|
||||||
var alphaSrcFilter = GetAlphaSrcFilter(state, inW, inH, reqW, reqH, reqMaxW, reqMaxH, hasAssSubs ? 10 : 5);
|
var framerate = state.VideoStream?.RealFrameRate;
|
||||||
|
var subFramerate = hasAssSubs ? Math.Min(framerate ?? 25, 60) : 10;
|
||||||
|
|
||||||
|
var alphaSrcFilter = GetAlphaSrcFilter(state, inW, inH, reqW, reqH, reqMaxW, reqMaxH, subFramerate);
|
||||||
var subTextSubtitlesFilter = GetTextSubtitlesFilter(state, true, true);
|
var subTextSubtitlesFilter = GetTextSubtitlesFilter(state, true, true);
|
||||||
subFilters.Add(alphaSrcFilter);
|
subFilters.Add(alphaSrcFilter);
|
||||||
subFilters.Add("format=bgra");
|
subFilters.Add("format=bgra");
|
||||||
@ -4815,8 +4827,8 @@ namespace MediaBrowser.Controller.MediaEncoding
|
|||||||
{
|
{
|
||||||
if (hasGraphicalSubs)
|
if (hasGraphicalSubs)
|
||||||
{
|
{
|
||||||
var subSwScaleFilter = GetCustomSwScaleFilter(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
var subPreProcFilters = GetGraphicalSubPreProcessFilters(inW, inH, reqW, reqH, reqMaxW, reqMaxH);
|
||||||
subFilters.Add(subSwScaleFilter);
|
subFilters.Add(subPreProcFilters);
|
||||||
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
overlayFilters.Add("overlay=eof_action=pass:repeatlast=0");
|
||||||
|
|
||||||
if (isVaapiEncoder)
|
if (isVaapiEncoder)
|
||||||
|
@ -742,6 +742,10 @@ namespace MediaBrowser.MediaEncoding.Probing
|
|||||||
stream.LocalizedExternal = _localization.GetLocalizedString("External");
|
stream.LocalizedExternal = _localization.GetLocalizedString("External");
|
||||||
stream.LocalizedHearingImpaired = _localization.GetLocalizedString("HearingImpaired");
|
stream.LocalizedHearingImpaired = _localization.GetLocalizedString("HearingImpaired");
|
||||||
|
|
||||||
|
// Graphical subtitle may have width and height info
|
||||||
|
stream.Width = streamInfo.Width;
|
||||||
|
stream.Height = streamInfo.Height;
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(stream.Title))
|
if (string.IsNullOrEmpty(stream.Title))
|
||||||
{
|
{
|
||||||
// mp4 missing track title workaround: fall back to handler_name if populated and not the default "SubtitleHandler"
|
// mp4 missing track title workaround: fall back to handler_name if populated and not the default "SubtitleHandler"
|
||||||
|
Loading…
Reference in New Issue
Block a user