From 4fe16b9b902692d18976e0c9eb7272c8c38919c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Leszko?= Date: Mon, 18 Sep 2023 09:38:15 +0200 Subject: [PATCH] Change scale_cuda to scale_npp (#373) --- ffmpeg/ffmpeg.go | 27 +++++++++++++++------------ ffmpeg/nvidia_test.go | 4 ++-- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/ffmpeg/ffmpeg.go b/ffmpeg/ffmpeg.go index 2a536675ea..1cc8302c1a 100755 --- a/ffmpeg/ffmpeg.go +++ b/ffmpeg/ffmpeg.go @@ -447,7 +447,7 @@ func newAVOpts(opts map[string]string) *C.AVDictionary { } // return encoding specific options for the given accel -func configEncoder(inOpts *TranscodeOptionsIn, outOpts TranscodeOptions) (string, string, error) { +func configEncoder(inOpts *TranscodeOptionsIn, outOpts TranscodeOptions) (string, string, string, error) { inDev := inOpts.Device outDev := outOpts.Device encoder := FfEncoderLookup[outOpts.Accel][outOpts.Profile.Encoder] @@ -455,35 +455,35 @@ func configEncoder(inOpts *TranscodeOptionsIn, outOpts TranscodeOptions) (string case Software: switch outOpts.Accel { case Software: - return encoder, "scale", nil + return encoder, "scale", "", nil case Nvidia: upload := "hwupload_cuda" if outDev != "" { upload = upload + "=device=" + outDev } - return encoder, upload + ",scale_cuda", nil + return encoder, upload + ",scale_npp", "super", nil } case Nvidia: switch outOpts.Accel { case Software: - return encoder, "scale_cuda", nil + return encoder, "scale_npp", "super", nil case Nvidia: // If we encode on a different device from decode then need to transfer if outDev != "" && outDev != inDev { - return "", "", ErrTranscoderDev // XXX not allowed + return "", "", "", ErrTranscoderDev // XXX not allowed } - return encoder, "scale_cuda", nil + return encoder, "scale_npp", "super", nil } case Netint: switch outOpts.Accel { case Software, Nvidia: - return "", "", ErrTranscoderDev // XXX don't allow mix-match between NETINT and sw/nv + return "", "", "", ErrTranscoderDev // XXX don't allow mix-match between NETINT and sw/nv case Netint: // Use software scale filter - return encoder, "scale", nil + return encoder, "scale", "", nil } } - return "", "", ErrTranscoderHw + return "", "", "", ErrTranscoderHw } func accelDeviceType(accel Acceleration) (C.enum_AVHWDeviceType, error) { switch accel { @@ -643,15 +643,18 @@ func createCOutputParams(input *TranscodeOptionsIn, ps []TranscodeOptions) ([]C. } } encoder, scale_filter := p.VideoEncoder.Name, "scale" + var interpAlgo string if encoder == "" { - encoder, scale_filter, err = configEncoder(input, p) + encoder, scale_filter, interpAlgo, err = configEncoder(input, p) if err != nil { return params, finalizer, err } } // preserve aspect ratio along the larger dimension when rescaling - var filters string - filters = fmt.Sprintf("%s='w=if(gte(iw,ih),%d,-2):h=if(lt(iw,ih),%d,-2)'", scale_filter, w, h) + filters := fmt.Sprintf("%s='w=if(gte(iw,ih),%d,-2):h=if(lt(iw,ih),%d,-2)'", scale_filter, w, h) + if interpAlgo != "" { + filters = fmt.Sprintf("%s:interp_algo=%s", filters, interpAlgo) + } if input.Accel == Nvidia && p.Accel == Software { // needed for hw dec -> hw rescale -> sw enc filters = filters + ",hwdownload,format=nv12" diff --git a/ffmpeg/nvidia_test.go b/ffmpeg/nvidia_test.go index de70a2f510..0a263b9408 100755 --- a/ffmpeg/nvidia_test.go +++ b/ffmpeg/nvidia_test.go @@ -550,7 +550,7 @@ func TestNvidia_API_MixedOutput(t *testing.T) { diff -u $1.md5 ffmpeg_$1.md5 ffmpeg -loglevel warning -i out_$1.ts -c:a aac -ar 44100 -ac 2 \ - -vf hwupload_cuda,fps=123,scale_cuda=w=256:h=144 -c:v h264_nvenc \ + -vf hwupload_cuda,fps=123,scale_npp=w=256:h=144 -c:v h264_nvenc \ ffmpeg_nv_$1.ts # sanity check ffmpeg frame count against ours @@ -640,7 +640,7 @@ func TestNvidia_API_AlternatingTimestamps(t *testing.T) { diff -u $1.md5 ffmpeg_$1.md5 ffmpeg -loglevel warning -i out_$1.ts -c:a aac -ar 44100 -ac 2 \ - -vf hwupload_cuda,fps=123,scale_cuda=w=256:h=144 -c:v h264_nvenc \ + -vf hwupload_cuda,fps=123,scale_npp=w=256:h=144 -c:v h264_nvenc \ -muxdelay 0 -copyts \ ffmpeg_nv_$1.ts