Browse Source

vaapi downsample 10bit hevc 8bit h264 (#397)

* vaapi downsample 10bit hevc to 8bit h264

* update changelog
pull/398/head
Jason Dove 5 years ago committed by GitHub
parent
commit
ae8e795228
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      CHANGELOG.md
  2. 14
      ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs
  3. 7
      ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs
  4. 8
      ErsatzTV.Core/FFmpeg/FFmpegProcessService.cs

3
CHANGELOG.md

@ -7,6 +7,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Changed ### Changed
- Use latest iHD driver (21.2.3 vs 20.1.1) in vaapi docker images - Use latest iHD driver (21.2.3 vs 20.1.1) in vaapi docker images
### Fixed
- Add downsampling to support transcoding 10-bit HEVC content with the h264_vaapi encoder
## [0.0.62-alpha] - 2021-10-05 ## [0.0.62-alpha] - 2021-10-05
### Added ### Added
- Support IMDB ids from Plex libraries, which may improve Trakt matching for some items - Support IMDB ids from Plex libraries, which may improve Trakt matching for some items

14
ErsatzTV.Core/FFmpeg/FFmpegComplexFilterBuilder.cs

@ -21,6 +21,7 @@ namespace ErsatzTV.Core.FFmpeg
private Option<IDisplaySize> _scaleToSize = None; private Option<IDisplaySize> _scaleToSize = None;
private Option<ChannelWatermark> _watermark; private Option<ChannelWatermark> _watermark;
private string _pixelFormat; private string _pixelFormat;
private string _videoEncoder;
public FFmpegComplexFilterBuilder WithHardwareAcceleration(HardwareAccelerationKind hardwareAccelerationKind) public FFmpegComplexFilterBuilder WithHardwareAcceleration(HardwareAccelerationKind hardwareAccelerationKind)
{ {
@ -77,6 +78,12 @@ namespace ErsatzTV.Core.FFmpeg
return this; return this;
} }
public FFmpegComplexFilterBuilder WithVideoEncoder(string videoEncoder)
{
_videoEncoder = videoEncoder;
return this;
}
public Option<FFmpegComplexFilter> Build(int videoStreamIndex, Option<int> audioStreamIndex) public Option<FFmpegComplexFilter> Build(int videoStreamIndex, Option<int> audioStreamIndex)
{ {
var complexFilter = new StringBuilder(); var complexFilter = new StringBuilder();
@ -247,6 +254,13 @@ namespace ErsatzTV.Core.FFmpeg
complexFilter.Append(audioLabel); complexFilter.Append(audioLabel);
} }
// vaapi downsample 10bit hevc to 8bit h264
if (acceleration == HardwareAccelerationKind.Vaapi && !videoFilterQueue.Any() &&
_pixelFormat == "yuv420p10le" && _videoEncoder.StartsWith("h264"))
{
videoFilterQueue.Add("scale_vaapi=format=nv12");
}
if (videoFilterQueue.Any() || !string.IsNullOrWhiteSpace(watermarkOverlay)) if (videoFilterQueue.Any() || !string.IsNullOrWhiteSpace(watermarkOverlay))
{ {
if (hasAudioFilters) if (hasAudioFilters)

7
ErsatzTV.Core/FFmpeg/FFmpegProcessBuilder.cs

@ -402,8 +402,13 @@ namespace ErsatzTV.Core.FFmpeg
return this; return this;
} }
public FFmpegProcessBuilder WithFilterComplex(MediaStream videoStream, Option<MediaStream> maybeAudioStream) public FFmpegProcessBuilder WithFilterComplex(
MediaStream videoStream,
Option<MediaStream> maybeAudioStream,
string videoCodec)
{ {
_complexFilterBuilder = _complexFilterBuilder.WithVideoEncoder(videoCodec);
int videoStreamIndex = videoStream.Index; int videoStreamIndex = videoStream.Index;
Option<int> maybeIndex = maybeAudioStream.Map(ms => ms.Index); Option<int> maybeIndex = maybeAudioStream.Map(ms => ms.Index);

8
ErsatzTV.Core/FFmpeg/FFmpegProcessService.cs

@ -82,7 +82,7 @@ namespace ErsatzTV.Core.FFmpeg
} }
builder = builder builder = builder
.WithFilterComplex(videoStream, maybeAudioStream); .WithFilterComplex(videoStream, maybeAudioStream, channel.FFmpegProfile.VideoCodec);
}, },
() => () =>
{ {
@ -91,18 +91,18 @@ namespace ErsatzTV.Core.FFmpeg
builder = builder builder = builder
.WithDeinterlace(playbackSettings.Deinterlace) .WithDeinterlace(playbackSettings.Deinterlace)
.WithBlackBars(channel.FFmpegProfile.Resolution) .WithBlackBars(channel.FFmpegProfile.Resolution)
.WithFilterComplex(videoStream, maybeAudioStream); .WithFilterComplex(videoStream, maybeAudioStream, channel.FFmpegProfile.VideoCodec);
} }
else if (playbackSettings.Deinterlace) else if (playbackSettings.Deinterlace)
{ {
builder = builder.WithDeinterlace(playbackSettings.Deinterlace) builder = builder.WithDeinterlace(playbackSettings.Deinterlace)
.WithAlignedAudio(playbackSettings.AudioDuration) .WithAlignedAudio(playbackSettings.AudioDuration)
.WithFilterComplex(videoStream, maybeAudioStream); .WithFilterComplex(videoStream, maybeAudioStream, channel.FFmpegProfile.VideoCodec);
} }
else else
{ {
builder = builder builder = builder
.WithFilterComplex(videoStream, maybeAudioStream); .WithFilterComplex(videoStream, maybeAudioStream, channel.FFmpegProfile.VideoCodec);
} }
}); });

Loading…
Cancel
Save