Browse Source

fix scaling image subs with vaapi (#2526)

pull/2528/head
Jason Dove 10 months ago committed by GitHub
parent
commit
ebcd9a35a7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      CHANGELOG.md
  2. 4
      ErsatzTV.Application/Streaming/Queries/GetPlayoutItemProcessByChannelNumberHandler.cs
  3. 14
      ErsatzTV.FFmpeg/Filter/ScaleSubtitleImageFilter.cs
  4. 8
      ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs

1
CHANGELOG.md

@ -29,6 +29,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -29,6 +29,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Fix intermittent watermark opacity
- Improve reliability of live remote streams; they should transcode closer to realtime in most cases
- Dramatically improve stream startup time
- VAAPI: fix scaling image-based subtitles (e.g. dvdsub)
### Changed
- Do not use graphics engine for single, permanent watermark

4
ErsatzTV.Application/Streaming/Queries/GetPlayoutItemProcessByChannelNumberHandler.cs

@ -283,10 +283,10 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler< @@ -283,10 +283,10 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler<
bool isComplete = true;
// if we are working ahead, limit to 45s
// if we are working ahead, limit to 44s (multiple of segment size)
if (!request.HlsRealtime)
{
TimeSpan limit = TimeSpan.FromSeconds(45);
TimeSpan limit = TimeSpan.FromSeconds(44);
if (duration > limit)
{

14
ErsatzTV.FFmpeg/Filter/ScaleSubtitleImageFilter.cs

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
namespace ErsatzTV.FFmpeg.Filter;
public class ScaleSubtitleImageFilter(FrameSize scaledSize) : BaseFilter
{
public override string Filter =>
$"scale={scaledSize.Width}:{scaledSize.Height}:force_original_aspect_ratio=decrease,pad=w={scaledSize.Width}:h={scaledSize.Height}:x=-1:y=-1:color=black@0";
public override FrameState NextState(FrameState currentState) => currentState with
{
ScaledSize = scaledSize,
PaddedSize = scaledSize,
FrameDataLocation = FrameDataLocation.Software
};
}

8
ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs

@ -516,16 +516,16 @@ public class VaapiPipelineBuilder : SoftwarePipelineBuilder @@ -516,16 +516,16 @@ public class VaapiPipelineBuilder : SoftwarePipelineBuilder
}
else
{
var subtitleHardwareUpload = new HardwareUploadVaapiFilter(false);
subtitle.FilterSteps.Add(subtitleHardwareUpload);
// only scale if scaling or padding was used for main video stream
if (videoInputFile.FilterSteps.Any(s => s is ScaleFilter or ScaleVaapiFilter or PadFilter))
{
var scaleFilter = new SubtitleScaleVaapiFilter(desiredState.PaddedSize);
var scaleFilter = new ScaleSubtitleImageFilter(desiredState.PaddedSize);
subtitle.FilterSteps.Add(scaleFilter);
}
var subtitleHardwareUpload = new HardwareUploadVaapiFilter(false);
subtitle.FilterSteps.Add(subtitleHardwareUpload);
var subtitlesFilter = new OverlaySubtitleVaapiFilter();
subtitleOverlayFilterSteps.Add(subtitlesFilter);
}

Loading…
Cancel
Save