detached 214a5d3

fix(webkit): implement auto hardware decoding mode with software fallback to fix Twitch Error #4000

commit
214a5d34e6da828135a3e1af60819c2b37f37a2b
author
brice · · 2025-12-18 18:27 UTC
parent
94c2fc4
signature
unsigned
1 file · +21 -3
M internal/infrastructure/webkit/settings.go +21 -3
@@ -95,9 +95,27 @@ func (sm *SettingsManager) applySettings(ctx context.Context, settings *webkit.S
9595 settings.SetEnableEncryptedMedia(true)
9696 settings.SetMediaPlaybackRequiresUserGesture(true)
9797 settings.SetMediaPlaybackAllowsInline(true)
98- // Force hardware decoding for video content via GStreamer VA-API/NVDEC
99- hwMediaTypes := "video/mp4;video/webm;video/x-h264;video/av01"
100- settings.SetMediaContentTypesRequiringHardwareSupport(&hwMediaTypes)
98+
99+ // Hardware decoding mode - THE FIX for Twitch Error #4000
100+ // Default "auto" allows GStreamer to choose best decoder with software fallback
101+ switch cfg.Media.HardwareDecodingMode {
102+ case config.HardwareDecodingForce:
103+ // Force hardware - will fail if unavailable (not recommended)
104+ // Prioritize AV1 (most efficient codec) when user wants forced HW
105+ hwTypes := "video/av01;video/mp4;video/webm;video/x-h264;video/x-h265"
106+ settings.SetMediaContentTypesRequiringHardwareSupport(&hwTypes)
107+ log.Debug().Msg("hardware decoding: forced (may fail without hw support)")
108+ case config.HardwareDecodingDisable:
109+ // Force software only
110+ settings.SetHardwareAccelerationPolicy(webkit.HardwareAccelerationPolicyNeverValue)
111+ log.Debug().Msg("hardware decoding: disabled (software only)")
112+ default: // HardwareDecodingAuto
113+ // Empty string = let GStreamer choose best decoder with software fallback
114+ // This fixes Twitch Error #4000 by allowing playback when HW unavailable
115+ emptyTypes := ""
116+ settings.SetMediaContentTypesRequiringHardwareSupport(&emptyTypes)
117+ log.Debug().Msg("hardware decoding: auto (hw preferred, software fallback)")
118+ }
101119
102120 // HTML5 storage
103121 settings.SetEnableHtml5LocalStorage(true)
@@ -95,9 +95,27 @@ func (sm *SettingsManager) applySettings(ctx context.Context, settings *webkit.S
95 settings.SetEnableEncryptedMedia(true)95 settings.SetEnableEncryptedMedia(true)
96 settings.SetMediaPlaybackRequiresUserGesture(true)96 settings.SetMediaPlaybackRequiresUserGesture(true)
97 settings.SetMediaPlaybackAllowsInline(true)97 settings.SetMediaPlaybackAllowsInline(true)
98- // Force hardware decoding for video content via GStreamer VA-API/NVDEC98+
99- hwMediaTypes := "video/mp4;video/webm;video/x-h264;video/av01"99+ // Hardware decoding mode - THE FIX for Twitch Error #4000
100- settings.SetMediaContentTypesRequiringHardwareSupport(&hwMediaTypes)100+ // Default "auto" allows GStreamer to choose best decoder with software fallback
101+ switch cfg.Media.HardwareDecodingMode {
102+ case config.HardwareDecodingForce:
103+ // Force hardware - will fail if unavailable (not recommended)
104+ // Prioritize AV1 (most efficient codec) when user wants forced HW
105+ hwTypes := "video/av01;video/mp4;video/webm;video/x-h264;video/x-h265"
106+ settings.SetMediaContentTypesRequiringHardwareSupport(&hwTypes)
107+ log.Debug().Msg("hardware decoding: forced (may fail without hw support)")
108+ case config.HardwareDecodingDisable:
109+ // Force software only
110+ settings.SetHardwareAccelerationPolicy(webkit.HardwareAccelerationPolicyNeverValue)
111+ log.Debug().Msg("hardware decoding: disabled (software only)")
112+ default: // HardwareDecodingAuto
113+ // Empty string = let GStreamer choose best decoder with software fallback
114+ // This fixes Twitch Error #4000 by allowing playback when HW unavailable
115+ emptyTypes := ""
116+ settings.SetMediaContentTypesRequiringHardwareSupport(&emptyTypes)
117+ log.Debug().Msg("hardware decoding: auto (hw preferred, software fallback)")
118+ }
101 119
102 // HTML5 storage120 // HTML5 storage
103 settings.SetEnableHtml5LocalStorage(true)121 settings.SetEnableHtml5LocalStorage(true)

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close