sheepflix/patches/go-transcode-vaapi.patch
2026-08-26 01:24:51 -04:00

63 lines
1.9 KiB
Diff

diff --git a/hlsvod/transcode.go b/hlsvod/transcode.go
index 1b04b00..12eb935 100644
--- a/hlsvod/transcode.go
+++ b/hlsvod/transcode.go
@@ -6,5 +6,6 @@ import (
"fmt"
"log"
+ "os"
"os/exec"
"path"
"strings"
@@ -56,6 +57,16 @@ func TranscodeSegments(ctx context.Context, ffmpegBinary string, config Transcod
}...)
}
+ // Decode and filter on the GPU when a VAAPI render device is configured.
+ // This is opt-in so upstream's software behavior remains available.
+ vaapiDevice := os.Getenv("TRANSCODE_VAAPI_DEVICE")
+ if vaapiDevice != "" {
+ args = append(args, []string{
+ "-init_hw_device", "vaapi=va:" + vaapiDevice,
+ "-filter_hw_device", "va", "-hwaccel", "vaapi", "-hwaccel_output_format", "vaapi",
+ }...)
+ }
+
// Input specs
args = append(args, []string{
"-i", config.InputFilePath, // Input file
@@ -79,17 +89,26 @@ func TranscodeSegments(ctx context.Context, ffmpegBinary string, config Transcod
if profile.Width >= profile.Height {
scale = fmt.Sprintf("scale=-2:%d", profile.Height)
} else {
scale = fmt.Sprintf("scale=%d:-2", profile.Width)
}
- args = append(args, []string{
- "-vf", scale,
- "-c:v", "libx264",
- "-preset", "faster",
- "-profile:v", "high",
- "-level:v", "4.0",
- "-b:v", fmt.Sprintf("%dk", profile.Bitrate),
- }...)
+ if vaapiDevice != "" {
+ if profile.Width >= profile.Height {
+ scale = fmt.Sprintf("scale_vaapi=w=-2:h=%d:format=nv12", profile.Height)
+ } else {
+ scale = fmt.Sprintf("scale_vaapi=w=%d:h=-2:format=nv12", profile.Width)
+ }
+ args = append(args, []string{
+ "-vf", scale, "-c:v", "h264_vaapi", "-profile:v", "high",
+ "-level:v", "4.0", "-b:v", fmt.Sprintf("%dk", profile.Bitrate),
+ }...)
+ } else {
+ args = append(args, []string{
+ "-vf", scale, "-c:v", "libx264", "-preset", "faster",
+ "-profile:v", "high", "-level:v", "4.0",
+ "-b:v", fmt.Sprintf("%dk", profile.Bitrate),
+ }...)
+ }
}
// Audio specs