Skip to content

Commit c56b2cd

Browse files
authored
Merge pull request #1203 from MarcA711/update-rockchip-presets
Update FFmpeg presets for Rockchip boards
2 parents c52f3eb + 6309d32 commit c56b2cd

File tree

4 files changed

+63
-22
lines changed

4 files changed

+63
-22
lines changed

internal/ffmpeg/ffmpeg.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,9 @@ var defaults = map[string]string{
129129
// hardware Rockchip
130130
// important to use custom ffmpeg https://github.com/AlexxIT/go2rtc/issues/768
131131
// hevc - doesn't have a profile setting
132-
"h264/rkmpp": "-c:v h264_rkmpp_encoder -g 50 -bf 0 -profile:v high -level:v 4.1",
133-
"h265/rkmpp": "-c:v hevc_rkmpp_encoder -g 50 -bf 0 -level:v 5.1",
132+
"h264/rkmpp": "-c:v h264_rkmpp -g 50 -bf 0 -profile:v high -level:v 4.1",
133+
"h265/rkmpp": "-c:v hevc_rkmpp -g 50 -bf 0 -profile:v main -level:v 5.1",
134+
"mjpeg/rkmpp": "-c:v mjpeg_rkmpp",
134135

135136
// hardware NVidia on Linux and Windows
136137
// preset=p2 - faster, tune=ll - low latency

internal/ffmpeg/ffmpeg_test.go

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -251,15 +251,33 @@ func _TestParseArgsHwV4l2m2m(t *testing.T) {
251251
}
252252

253253
func TestParseArgsHwRKMPP(t *testing.T) {
254-
// [HTTP-MJPEG] video will be transcoded to H264
255-
args := parseArgs("http://example.com#video=h264#hardware=rkmpp")
256-
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())
257-
258-
args = parseArgs("http://example.com#video=h264#rotate=180#hardware=rkmpp")
259-
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())
260-
261-
args = parseArgs("http://example.com#video=h264#height=320#hardware=rkmpp")
262-
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 -height 320 -an -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}`, args.String())
254+
tests := []struct {
255+
name string
256+
source string
257+
expect string
258+
}{
259+
{
260+
name: "[FILE] transcoding to H264",
261+
source: "bbb.mp4#video=h264#hardware=rkmpp",
262+
expect: `ffmpeg -hide_banner -hwaccel rkmpp -hwaccel_output_format drm_prime -afbc rga -re -i bbb.mp4 -c:v h264_rkmpp -g 50 -bf 0 -profile:v high -level:v 4.1 -an -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}`,
263+
},
264+
{
265+
name: "[FILE] transcoding with rotation",
266+
source: "bbb.mp4#video=h264#rotate=180#hardware=rkmpp",
267+
expect: `ffmpeg -hide_banner -hwaccel rkmpp -hwaccel_output_format drm_prime -afbc rga -re -i bbb.mp4 -c:v h264_rkmpp -g 50 -bf 0 -profile:v high -level:v 4.1 -an -vf "format=drm_prime|nv12,hwupload,vpp_rkrga=transpose=4" -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}`,
268+
},
269+
{
270+
name: "[FILE] transcoding with scaling",
271+
source: "bbb.mp4#video=h264#height=320#hardware=rkmpp",
272+
expect: `ffmpeg -hide_banner -hwaccel rkmpp -hwaccel_output_format drm_prime -afbc rga -re -i bbb.mp4 -c:v h264_rkmpp -g 50 -bf 0 -profile:v high -level:v 4.1 -an -vf "format=drm_prime|nv12,hwupload,scale_rkrga=-1:320:force_original_aspect_ratio=0" -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}`,
273+
},
274+
}
275+
for _, test := range tests {
276+
t.Run(test.name, func(t *testing.T) {
277+
args := parseArgs(test.source)
278+
require.Equal(t, test.expect, args.String())
279+
})
280+
}
263281
}
264282

265283
func _TestParseArgsHwCuda(t *testing.T) {

internal/ffmpeg/hardware/hardware.go

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -128,19 +128,32 @@ func MakeHardware(args *ffmpeg.Args, engine string, defaults map[string]string)
128128
case EngineRKMPP:
129129
args.Codecs[i] = defaults[name+"/"+engine]
130130

131-
for j, filter := range args.Filters {
132-
if strings.HasPrefix(filter, "scale=") {
133-
args.Filters = append(args.Filters[:j], args.Filters[j+1:]...)
131+
if !args.HasFilters("drawtext=") {
132+
args.Input = "-hwaccel rkmpp -hwaccel_output_format drm_prime -afbc rga " + args.Input
134133

135-
width, height, _ := strings.Cut(filter[6:], ":")
136-
if width != "-1" {
137-
args.Codecs[i] += " -width " + width
134+
for i, filter := range args.Filters {
135+
if strings.HasPrefix(filter, "scale=") {
136+
args.Filters[i] = "scale_rkrga=" + filter[6:] + ":force_original_aspect_ratio=0"
138137
}
139-
if height != "-1" {
140-
args.Codecs[i] += " -height " + height
138+
if strings.HasPrefix(filter, "transpose=") {
139+
if filter == "transpose=1,transpose=1" { // 180 degrees half-turn
140+
args.Filters[i] = "vpp_rkrga=transpose=4" // reversal
141+
} else {
142+
args.Filters[i] = "vpp_rkrga=transpose=" + filter[10:]
143+
}
141144
}
142-
break
143145
}
146+
147+
if len(args.Filters) > 0 {
148+
// fix if input doesn't support hwaccel, do nothing when support
149+
// insert as first filter before hardware scale and transpose
150+
args.InsertFilter("format=drm_prime|nv12,hwupload")
151+
}
152+
} else {
153+
// enable software pixel for drawtext, scale and transpose
154+
args.Input = "-hwaccel rkmpp -hwaccel_output_format nv12 -afbc rga " + args.Input
155+
156+
args.AddFilter("hwupload")
144157
}
145158
}
146159
}

internal/ffmpeg/hardware/hardware_unix.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import (
1111
const (
1212
ProbeV4L2M2MH264 = "-f lavfi -i testsrc2 -t 1 -c h264_v4l2m2m -f null -"
1313
ProbeV4L2M2MH265 = "-f lavfi -i testsrc2 -t 1 -c hevc_v4l2m2m -f null -"
14-
ProbeRKMPPH264 = "-f lavfi -i testsrc2 -t 1 -c h264_rkmpp_encoder -f null -"
15-
ProbeRKMPPH265 = "-f lavfi -i testsrc2 -t 1 -c hevc_rkmpp_encoder -f null -"
14+
ProbeRKMPPH264 = "-f lavfi -i testsrc2 -t 1 -c h264_rkmpp -f null -"
15+
ProbeRKMPPH265 = "-f lavfi -i testsrc2 -t 1 -c hevc_rkmpp -f null -"
16+
ProbeRKMPPJPEG = "-f lavfi -i testsrc2 -t 1 -c mjpeg_rkmpp -f null -"
1617
ProbeVAAPIH264 = "-init_hw_device vaapi -f lavfi -i testsrc2 -t 1 -vf format=nv12,hwupload -c h264_vaapi -f null -"
1718
ProbeVAAPIH265 = "-init_hw_device vaapi -f lavfi -i testsrc2 -t 1 -vf format=nv12,hwupload -c hevc_vaapi -f null -"
1819
ProbeVAAPIJPEG = "-init_hw_device vaapi -f lavfi -i testsrc2 -t 1 -vf format=nv12,hwupload -c mjpeg_vaapi -f null -"
@@ -39,6 +40,10 @@ func ProbeAll(bin string) []*api.Source {
3940
Name: runToString(bin, ProbeRKMPPH265),
4041
URL: "ffmpeg:...#video=h265#hardware=" + EngineRKMPP,
4142
},
43+
{
44+
Name: runToString(bin, ProbeRKMPPJPEG),
45+
URL: "ffmpeg:...#video=mjpeg#hardware=" + EngineRKMPP,
46+
},
4247
}
4348
}
4449

@@ -83,6 +88,10 @@ func ProbeHardware(bin, name string) string {
8388
if run(bin, ProbeRKMPPH265) {
8489
return EngineRKMPP
8590
}
91+
case "mjpeg":
92+
if run(bin, ProbeRKMPPJPEG) {
93+
return EngineRKMPP
94+
}
8695
}
8796

8897
return EngineSoftware

0 commit comments

Comments
 (0)