diff --git a/internal/ffmpeg/ffmpeg.go b/internal/ffmpeg/ffmpeg.go index d3e5c6c0..23e01642 100644 --- a/internal/ffmpeg/ffmpeg.go +++ b/internal/ffmpeg/ffmpeg.go @@ -93,6 +93,12 @@ var defaults = map[string]string{ "h264/v4l2m2m": "-c:v h264_v4l2m2m -g 50 -bf 0", "h265/v4l2m2m": "-c:v hevc_v4l2m2m -g 50 -bf 0", + // hardware Rockchip + // important to use custom ffmpeg https://github.com/AlexxIT/go2rtc/issues/768 + // hevc - doesn't have a profile setting + "h264/rkmpp": "-c:v h264_rkmpp_encoder -g 50 -bf 0 -profile:v high -level:v 4.1", + "h265/rkmpp": "-c:v hevc_rkmpp_encoder -g 50 -bf 0 -level:v 5.1", + // hardware NVidia on Linux and Windows // preset=p2 - faster, tune=ll - low latency "h264/cuda": "-c:v h264_nvenc -g 50 -bf 0 -profile:v high -level:v auto -preset:v p2 -tune:v ll", diff --git a/internal/ffmpeg/ffmpeg_test.go b/internal/ffmpeg/ffmpeg_test.go index 42c7c2a3..b5d3e5ed 100644 --- a/internal/ffmpeg/ffmpeg_test.go +++ b/internal/ffmpeg/ffmpeg_test.go @@ -151,6 +151,18 @@ func TestParseArgsHwV4l2m2m(t *testing.T) { require.Equal(t, `ffmpeg -hide_banner -f dshow -video_size 1920x1080 -i video="0" -c:v hevc_v4l2m2m -g 50 -bf 0 -an -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}`, args.String()) } +func TestParseArgsHwRKMPP(t *testing.T) { + // [HTTP-MJPEG] video will be transcoded to H264 + args := parseArgs("http://example.com#video=h264#hardware=rkmpp") + require.Equal(t, `ffmpeg -hide_banner -fflags nobuffer -flags low_delay -i http://example.com -c:v h264_rkmpp_encoder -g 50 -bf 0 -profile:v high -level:v 4.1 -an -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}`, args.String()) + + args = parseArgs("http://example.com#video=h264#rotate=180#hardware=rkmpp") + require.Equal(t, `ffmpeg -hide_banner -fflags nobuffer -flags low_delay -i http://example.com -c:v h264_rkmpp_encoder -g 50 -bf 0 -profile:v high -level:v 4.1 -an -vf "transpose=1,transpose=1" -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}`, args.String()) + + args = parseArgs("http://example.com#video=h264#height=320#hardware=rkmpp") + require.Equal(t, `ffmpeg -hide_banner -fflags nobuffer -flags low_delay -i http://example.com -c:v h264_rkmpp_encoder -g 50 -bf 0 -profile:v high -level:v 4.1 -an -vf "scale=-1:320" -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}`, args.String()) +} + func TestParseArgsHwCuda(t *testing.T) { // [HTTP-MJPEG] video will be transcoded to H264 args := parseArgs("http:///example.com#video=h264#hardware=cuda") diff --git a/internal/ffmpeg/hardware/hardware.go b/internal/ffmpeg/hardware/hardware.go index 6f333e2d..b75a3c73 100644 --- a/internal/ffmpeg/hardware/hardware.go +++ b/internal/ffmpeg/hardware/hardware.go @@ -18,6 +18,7 @@ const ( EngineCUDA = "cuda" // NVidia on Windows and Linux EngineDXVA2 = "dxva2" // Intel on Windows EngineVideoToolbox = "videotoolbox" // macOS + EngineRKMPP = "rkmpp" // Rockchip ) func Init(bin string) { @@ -125,6 +126,9 @@ func MakeHardware(args *ffmpeg.Args, engine string, defaults map[string]string) case EngineV4L2M2M: args.Codecs[i] = defaults[name+"/"+engine] + + case EngineRKMPP: + args.Codecs[i] = defaults[name+"/"+engine] } } } diff --git a/internal/ffmpeg/hardware/hardware_linux.go b/internal/ffmpeg/hardware/hardware_linux.go index 5595e4c4..af62ad1e 100644 --- a/internal/ffmpeg/hardware/hardware_linux.go +++ b/internal/ffmpeg/hardware/hardware_linux.go @@ -8,6 +8,8 @@ import ( const ProbeV4L2M2MH264 = "-f lavfi -i testsrc2 -t 1 -c h264_v4l2m2m -f null -" const ProbeV4L2M2MH265 = "-f lavfi -i testsrc2 -t 1 -c hevc_v4l2m2m -f null -" +const ProbeRockchipH264 = "-f lavfi -i testsrc2 -t 1 -c h264_rkmpp_encoder -f null -" +const ProbeRockchipH265 = "-f lavfi -i testsrc2 -t 1 -c hevc_rkmpp_encoder -f null -" const ProbeVAAPIH264 = "-init_hw_device vaapi -f lavfi -i testsrc2 -t 1 -vf format=nv12,hwupload -c h264_vaapi -f null -" const ProbeVAAPIH265 = "-init_hw_device vaapi -f lavfi -i testsrc2 -t 1 -vf format=nv12,hwupload -c hevc_vaapi -f null -" const ProbeVAAPIJPEG = "-init_hw_device vaapi -f lavfi -i testsrc2 -t 1 -vf format=nv12,hwupload -c mjpeg_vaapi -f null -" @@ -25,6 +27,14 @@ func ProbeAll(bin string) []*api.Source { Name: runToString(bin, ProbeV4L2M2MH265), URL: "ffmpeg:...#video=h265#hardware=" + EngineV4L2M2M, }, + { + Name: runToString(bin, ProbeRockchipH264), + URL: "ffmpeg:...#video=h264#hardware=" + EngineRKMPP, + }, + { + Name: runToString(bin, ProbeRockchipH265), + URL: "ffmpeg:...#video=h265#hardware=" + EngineRKMPP, + }, } }