* start to add ffmpeg library * start to hook ffmpeg lib into main app * improvements * more progress * make pipeline builder configurable * more options * move more logic down into ffmpeg lib * ffmpeg lib desired state refactoring * add software scaling and padding * add loudness normalization and software deinterlace * add metadata output options * add setsar filter * use built-in scaling logic * fixes * initial nvidia support * nvidia improvements * support hls mode * print old arguments at debug level * fix package reference * start to add qsv support * formatting * fix tests * add timeout to transcode tests * show successful ffmpeg arguments * add vaapi support * add more software decoders * add experimental transcoder option * call existing ffmpeg process service for unimplemented features * fix nvidia mpeg2video bug * update changelog * ignore some neglected unit tests
47 lines
1.9 KiB
C#
47 lines
1.9 KiB
C#
using ErsatzTV.FFmpeg.Encoder.Nvenc;
|
|
using ErsatzTV.FFmpeg.Encoder.Qsv;
|
|
using ErsatzTV.FFmpeg.Encoder.Vaapi;
|
|
using ErsatzTV.FFmpeg.Format;
|
|
|
|
namespace ErsatzTV.FFmpeg.Encoder;
|
|
|
|
public static class AvailableEncoders
|
|
{
|
|
public static IEncoder ForVideoFormat(FrameState currentState, FrameState desiredState) =>
|
|
(desiredState.HardwareAccelerationMode, desiredState.VideoFormat) switch
|
|
{
|
|
(HardwareAccelerationMode.Nvenc, VideoFormat.Hevc) => new EncoderHevcNvenc(),
|
|
(HardwareAccelerationMode.Nvenc, VideoFormat.H264) => new EncoderH264Nvenc(),
|
|
|
|
(HardwareAccelerationMode.Qsv, VideoFormat.Hevc) => new EncoderHevcQsv(),
|
|
(HardwareAccelerationMode.Qsv, VideoFormat.H264) => new EncoderH264Qsv(),
|
|
|
|
(HardwareAccelerationMode.Vaapi, VideoFormat.Hevc) => new EncoderHevcVaapi(currentState),
|
|
(HardwareAccelerationMode.Vaapi, VideoFormat.H264) => new EncoderH264Vaapi(currentState),
|
|
|
|
(_, VideoFormat.Hevc) => new EncoderLibx265(),
|
|
(_, VideoFormat.H264) => new EncoderLibx264(),
|
|
(_, VideoFormat.Mpeg2Video) => new EncoderMpeg2Video(),
|
|
|
|
(_, VideoFormat.Undetermined) => new EncoderImplicitVideo(),
|
|
|
|
_ => throw new ArgumentOutOfRangeException(nameof(desiredState.VideoFormat), desiredState.VideoFormat, null)
|
|
};
|
|
|
|
public static IEncoder ForAudioFormat(FrameState desiredState)
|
|
{
|
|
return desiredState.AudioFormat.Match(
|
|
audioFormat =>
|
|
audioFormat switch
|
|
{
|
|
AudioFormat.Aac => (IEncoder)new EncoderAac(),
|
|
AudioFormat.Ac3 => new EncoderAc3(),
|
|
_ => throw new ArgumentOutOfRangeException(nameof(audioFormat), audioFormat, null)
|
|
},
|
|
() => throw new ArgumentOutOfRangeException(
|
|
nameof(desiredState.AudioFormat),
|
|
desiredState.AudioFormat,
|
|
null));
|
|
}
|
|
}
|