Browse Source

add qsv av1 encoder (#2471)

pull/2472/head
Jason Dove 3 months ago committed by GitHub
parent
commit
287adc34b5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      CHANGELOG.md
  2. 3
      ErsatzTV.Application/FFmpegProfiles/Commands/UpdateFFmpegProfileHandler.cs
  3. 17
      ErsatzTV.FFmpeg/Encoder/Qsv/EncoderAv1Qsv.cs
  4. 2
      ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs
  5. 2
      ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs
  6. 6
      ErsatzTV.FFmpeg/Pipeline/QsvPipelineBuilder.cs
  7. 3
      ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs
  8. 2
      ErsatzTV/Pages/FFmpegEditor.razor
  9. 3
      ErsatzTV/Validators/FFmpegProfileEditViewModelValidator.cs

2
CHANGELOG.md

@ -60,7 +60,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -60,7 +60,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Allow HEVC playback in channel preview
- This is restricted to compatible browsers
- Preview button will be red when preview is disabled due to browser incompatibility
- Add AV1 encoding support with NVIDIA and VAAPI acceleration
- Add AV1 encoding support with NVIDIA, VAAPI and QSV acceleration
- This also requires `HLS Segmenter (fmp4)`
### Fixed

3
ErsatzTV.Application/FFmpegProfiles/Commands/UpdateFFmpegProfileHandler.cs

@ -57,7 +57,8 @@ public class @@ -57,7 +57,8 @@ public class
? FFmpegProfileBitDepth.EightBit
: update.BitDepth;
if (p.HardwareAcceleration is not HardwareAccelerationKind.Nvenc &&
if (p.HardwareAcceleration is not (HardwareAccelerationKind.Nvenc or HardwareAccelerationKind.Vaapi
or HardwareAccelerationKind.Qsv) &&
p.VideoFormat is FFmpegProfileVideoFormat.Av1)
{
p.VideoFormat = FFmpegProfileVideoFormat.Hevc;

17
ErsatzTV.FFmpeg/Encoder/Qsv/EncoderAv1Qsv.cs

@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
using ErsatzTV.FFmpeg.Format;
namespace ErsatzTV.FFmpeg.Encoder.Qsv;
public class EncoderAv1Qsv : EncoderBase
{
public override string Name => "av1_qsv";
public override StreamKind Kind => StreamKind.Video;
public override string[] OutputOptions => ["-c:v", Name, "-low_power", "0", "-look_ahead", "0"];
public override FrameState NextState(FrameState currentState) => currentState with
{
VideoFormat = VideoFormat.Av1,
FrameDataLocation = FrameDataLocation.Hardware
};
}

2
ErsatzTV.FFmpeg/Pipeline/NvidiaPipelineBuilder.cs

@ -321,8 +321,6 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder @@ -321,8 +321,6 @@ public class NvidiaPipelineBuilder : SoftwarePipelineBuilder
new EncoderH264Nvenc(desiredState.VideoProfile, desiredState.VideoPreset),
(HardwareAccelerationMode.Nvenc, VideoFormat.Av1) => new EncoderAv1Nvenc(),
(HardwareAccelerationMode.None, VideoFormat.Av1) => throw new NotSupportedException(
"AV1 software encoding is not supported"),
// don't pass NVENC profile down to libx264
(_, _) => GetSoftwareEncoder(

2
ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs

@ -630,6 +630,8 @@ public abstract class PipelineBuilderBase : IPipelineBuilder @@ -630,6 +630,8 @@ public abstract class PipelineBuilderBase : IPipelineBuilder
VideoFormat.H264 => new EncoderLibx264(desiredState.VideoProfile, desiredState.VideoPreset),
VideoFormat.Mpeg2Video => new EncoderMpeg2Video(),
VideoFormat.Av1 => throw new NotSupportedException("AV1 software encoding is not supported"),
VideoFormat.Copy => new EncoderCopyVideo(),
VideoFormat.Undetermined => new EncoderImplicitVideo(),

6
ErsatzTV.FFmpeg/Pipeline/QsvPipelineBuilder.cs

@ -77,6 +77,11 @@ public class QsvPipelineBuilder : SoftwarePipelineBuilder @@ -77,6 +77,11 @@ public class QsvPipelineBuilder : SoftwarePipelineBuilder
encodeCapability = FFmpegCapability.Software;
}
if (desiredState.VideoFormat is VideoFormat.Av1 && ffmpegState.OutputFormat is not OutputFormatKind.HlsMp4)
{
throw new NotSupportedException("AV1 output is only supported with HLS Segmenter (fmp4)");
}
bool isHevcOrH264 = videoStream.Codec is /*VideoFormat.Hevc or*/ VideoFormat.H264;
bool is10Bit = videoStream.PixelFormat.Map(pf => pf.BitDepth).IfNone(8) == 10;
@ -229,6 +234,7 @@ public class QsvPipelineBuilder : SoftwarePipelineBuilder @@ -229,6 +234,7 @@ public class QsvPipelineBuilder : SoftwarePipelineBuilder
Option<IEncoder> maybeEncoder =
(ffmpegState.EncoderHardwareAccelerationMode, desiredState.VideoFormat) switch
{
(HardwareAccelerationMode.Qsv, VideoFormat.Av1) => new EncoderAv1Qsv(),
(HardwareAccelerationMode.Qsv, VideoFormat.Hevc) => new EncoderHevcQsv(desiredState.VideoPreset),
(HardwareAccelerationMode.Qsv, VideoFormat.H264) => new EncoderH264Qsv(
desiredState.VideoProfile,

3
ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs

@ -256,9 +256,6 @@ public class VaapiPipelineBuilder : SoftwarePipelineBuilder @@ -256,9 +256,6 @@ public class VaapiPipelineBuilder : SoftwarePipelineBuilder
(HardwareAccelerationMode.Vaapi, VideoFormat.Mpeg2Video) =>
new EncoderMpeg2Vaapi(rateControlMode),
(HardwareAccelerationMode.None, VideoFormat.Av1) => throw new NotSupportedException(
"AV1 software encoding is not supported"),
(_, _) => GetSoftwareEncoder(ffmpegState, currentState, desiredState)
};

2
ErsatzTV/Pages/FFmpegEditor.razor

@ -67,7 +67,7 @@ @@ -67,7 +67,7 @@
<MudSelectItem Value="@FFmpegProfileVideoFormat.H264">h264</MudSelectItem>
<MudSelectItem Value="@FFmpegProfileVideoFormat.Hevc">hevc</MudSelectItem>
<MudSelectItem Value="@FFmpegProfileVideoFormat.Mpeg2Video">mpeg-2</MudSelectItem>
@if (_model.HardwareAcceleration is (HardwareAccelerationKind.Nvenc or HardwareAccelerationKind.Vaapi))
@if (_model.HardwareAcceleration is (HardwareAccelerationKind.Nvenc or HardwareAccelerationKind.Vaapi or HardwareAccelerationKind.Qsv))
{
<MudSelectItem Value="@FFmpegProfileVideoFormat.Av1">av1</MudSelectItem>
}

3
ErsatzTV/Validators/FFmpegProfileEditViewModelValidator.cs

@ -12,7 +12,8 @@ public class FFmpegProfileEditViewModelValidator : AbstractValidator<FFmpegProfi @@ -12,7 +12,8 @@ public class FFmpegProfileEditViewModelValidator : AbstractValidator<FFmpegProfi
[
FFmpegProfileVideoFormat.H264,
FFmpegProfileVideoFormat.Hevc,
FFmpegProfileVideoFormat.Mpeg2Video
FFmpegProfileVideoFormat.Mpeg2Video,
FFmpegProfileVideoFormat.Av1
];
private static readonly List<FFmpegProfileVideoFormat> NvencFormats =

Loading…
Cancel
Save