Skip to content

Commit 88cecb0

Browse files
committed
Skip hardware probe when decode is disabled
1 parent 28900d5 commit 88cecb0

3 files changed

Lines changed: 70 additions & 0 deletions

File tree

internal/config/config.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,36 @@ type Transcode struct {
4040
IdleTimeout time.Duration `json:"-"`
4141
}
4242

43+
func (t *Transcode) UnmarshalJSON(data []byte) error {
44+
type transcodeAlias Transcode
45+
aux := struct {
46+
HardwareDecode json.RawMessage `json:"hardware_decode"`
47+
*transcodeAlias
48+
}{
49+
transcodeAlias: (*transcodeAlias)(t),
50+
}
51+
if err := json.Unmarshal(data, &aux); err != nil {
52+
return err
53+
}
54+
if len(aux.HardwareDecode) == 0 || string(aux.HardwareDecode) == "null" {
55+
return nil
56+
}
57+
var text string
58+
if err := json.Unmarshal(aux.HardwareDecode, &text); err == nil {
59+
t.HardwareDecode = text
60+
return nil
61+
}
62+
var enabled bool
63+
if err := json.Unmarshal(aux.HardwareDecode, &enabled); err == nil {
64+
if !enabled {
65+
t.HardwareDecode = "false"
66+
return nil
67+
}
68+
return errors.New(`transcode.hardware_decode boolean true is not supported; use "vaapi"`)
69+
}
70+
return errors.New(`transcode.hardware_decode must be a string or false`)
71+
}
72+
4373
type ClientProfile struct {
4474
Name string `json:"name"`
4575
Match []string `json:"match"`

internal/config/config_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,23 @@ func TestLoadSupportsVAAPIHardwareDecode(t *testing.T) {
9999
t.Fatalf("hardware device = %q", cfg.Transcode.HardwareDevice)
100100
}
101101
}
102+
103+
func TestLoadSupportsBooleanFalseHardwareDecode(t *testing.T) {
104+
path := filepath.Join(t.TempDir(), "config.json")
105+
err := os.WriteFile(path, []byte(`{
106+
"upstream": {"url": "http://upstream.local"},
107+
"transcode": {"hardware_decode": false}
108+
}`), 0o600)
109+
if err != nil {
110+
t.Fatal(err)
111+
}
112+
113+
cfg, err := config.Load(path)
114+
if err != nil {
115+
t.Fatal(err)
116+
}
117+
118+
if cfg.Transcode.HardwareDecode != "false" {
119+
t.Fatalf("hardware decode = %q", cfg.Transcode.HardwareDecode)
120+
}
121+
}

internal/transcode/ffmpeg_args_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,26 @@ func TestResolveHardwareDecodeFallsBackToSoftwareWhenProbeFails(t *testing.T) {
247247
}
248248
}
249249

250+
func TestResolveHardwareDecodeFalseSkipsHardwareProbe(t *testing.T) {
251+
called := false
252+
options, err := resolveHardwareDecodeOptionsStrict("/definitely/missing/ffmpeg", FFmpegOptions{
253+
HardwareDecode: "false",
254+
HardwareDevice: "/dev/dri/renderD128",
255+
}, func(string, FFmpegOptions) error {
256+
called = true
257+
return errors.New("probe should not run")
258+
})
259+
if err != nil {
260+
t.Fatal(err)
261+
}
262+
if called {
263+
t.Fatal("hardware probe should not run when hardware decode is false")
264+
}
265+
if options.HardwareDecode != "" || options.HardwareDevice != "" {
266+
t.Fatalf("expected software options, got %+v", options)
267+
}
268+
}
269+
250270
func TestDefaultHardwareProbeRejectsVAAPIWhenDeviceInitializationFails(t *testing.T) {
251271
tempDir := t.TempDir()
252272
ffmpegPath := filepath.Join(tempDir, "ffmpeg")

0 commit comments

Comments
 (0)