From 50f2f1ac3ca45e1d8a8304e96d74e5dd2866b4a9 Mon Sep 17 00:00:00 2001 From: mani Date: Mon, 5 Jan 2026 18:47:29 +0100 Subject: [PATCH] Add configurable transcode target video codec support Adds new playback options to select transcode target codec (H.264, H.265/HEVC, AV1) and force H.264 transcoding. This enables optimal codec selection for client hardware, especially useful for devices with H.265 hardware decoding like Raspberry Pi 5. Target codec and source codec filtering now work independently for maximum flexibility. --- .../language/resource.language.de/strings.po | 24 +++++++++++++++++++ .../resource.language.en_gb/strings.po | 24 +++++++++++++++++++ resources/lib/play_utils.py | 18 +++++++++++++- resources/settings.xml | 3 +++ 4 files changed, 68 insertions(+), 1 deletion(-) diff --git a/resources/language/resource.language.de/strings.po b/resources/language/resource.language.de/strings.po index 558e697..a5ad46d 100644 --- a/resources/language/resource.language.de/strings.po +++ b/resources/language/resource.language.de/strings.po @@ -1233,3 +1233,27 @@ msgstr "Alle – Favoriten" msgctxt "#30678" msgid "TV Shows per page" msgstr "Fernsehsendungen pro Seite" + +msgctxt "#30679" +msgid "Transcode Ziel-Video-Codec" +msgstr "Transcode Ziel-Video-Codec" + +msgctxt "#30680" +msgid "H.264 (Standard)" +msgstr "H.264 (Standard)" + +msgctxt "#30681" +msgid "H.265 (HEVC)" +msgstr "H.265 (HEVC)" + +msgctxt "#30682" +msgid "H264 zum Transcoding zwingen" +msgstr "H264 zum Transcoding zwingen" + +msgctxt "#30683" +msgid "AV1" +msgstr "AV1" + +msgctxt "#30684" +msgid "Disk-Caching deaktivieren (nur RAM)" +msgstr "Disk-Caching deaktivieren (nur RAM)" diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po index 04bb92e..0101da1 100644 --- a/resources/language/resource.language.en_gb/strings.po +++ b/resources/language/resource.language.en_gb/strings.po @@ -1224,3 +1224,27 @@ msgstr "Recap Skipper" msgctxt "#30678" msgid "TV Shows per page" msgstr "TV Shows per page" + +msgctxt "#30679" +msgid "Transcode target video codec" +msgstr "Transcode target video codec" + +msgctxt "#30680" +msgid "H.264 (default)" +msgstr "H.264 (default)" + +msgctxt "#30681" +msgid "H.265 (HEVC)" +msgstr "H.265 (HEVC)" + +msgctxt "#30682" +msgid "Force transcode h264" +msgstr "Force transcode h264" + +msgctxt "#30683" +msgid "AV1" +msgstr "AV1" + +msgctxt "#30684" +msgid "Disable disk caching (RAM only)" +msgstr "Disable disk caching (RAM only)" diff --git a/resources/lib/play_utils.py b/resources/lib/play_utils.py index a4fa08c..8f0641d 100644 --- a/resources/lib/play_utils.py +++ b/resources/lib/play_utils.py @@ -1540,7 +1540,12 @@ class PlaybackService(xbmc.Monitor): def get_item_playback_info(item_id, force_transcode): + # Filter codecs that should NEVER be played directly (always force transcoding) + # These settings work independently from the target codec setting below + # Example: force_transcode_h264=true + target=hevc means: H.264 files will be transcoded to H.265 filtered_codecs = [] + if settings.getSetting("force_transcode_h264") == "true": + filtered_codecs.append("h264") if settings.getSetting("force_transcode_h265") == "true": filtered_codecs.append("hevc") filtered_codecs.append("h265") @@ -1564,6 +1569,17 @@ def get_item_playback_info(item_id, force_transcode): audio_bitrate = int(audio_playback_bitrate) * 1000 + # Determine target video codec for transcoding + # Note: force_transcode_* settings filter codecs for DirectPlay independently + # This setting only affects what codec the server transcodes TO when transcoding is needed + transcode_target_codec_setting = settings.getSetting("transcode_target_video_codec") + if transcode_target_codec_setting == "1": + transcode_video_codec = "hevc" + elif transcode_target_codec_setting == "2": + transcode_video_codec = "av1" + else: + transcode_video_codec = "h264" + profile = { "Name": "Kodi", "MaxStaticBitrate": bitrate, @@ -1579,7 +1595,7 @@ def get_item_playback_info(item_id, force_transcode): "Protocol": "hls", "Type": "Video", "AudioCodec": audio_codec, - "VideoCodec": "h264", + "VideoCodec": transcode_video_codec, "MaxAudioChannels": audio_max_channels }, { diff --git a/resources/settings.xml b/resources/settings.xml index fba244a..4bd42cb 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -30,6 +30,8 @@ + + @@ -157,6 +159,7 @@ +