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.
This commit is contained in:
mani
2026-01-05 18:47:29 +01:00
parent 8041a0b9d8
commit 50f2f1ac3c
4 changed files with 68 additions and 1 deletions

View File

@@ -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)"

View File

@@ -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)"

View File

@@ -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
},
{

View File

@@ -30,6 +30,8 @@
<setting type="sep" />
<setting id="max_stream_bitrate" type="enum" label="30208" values="0.5 Mbps|1 Mbps|1.5 Mbps|2.0 Mbps|2.5 Mbps|3.0 Mbps|4.0 Mbps|5.0 Mbps|6.0 Mbps|7.0 Mbps|8.0 Mbps|9.0 Mbps|10.0 Mbps|12.0 Mbps|14.0 Mbps|16.0 Mbps|18.0 Mbps|20.0 Mbps|25.0 Mbps|30.0 Mbps|35.0 Mbps|40.0 Mbps|100.0 Mbps|1000.0 Mbps [default]|Maximum" visible="true" default="23" />
<setting id="allow_direct_file_play" type="bool" label="30433" default="false" visible="true" enable="true" />
<setting id="transcode_target_video_codec" type="select" label="30679" lvalues="30680|30681|30683" default="0" visible="true" enable="true" />
<setting id="force_transcode_h264" type="bool" label="30682" default="false" visible="true" enable="true" />
<setting id="force_transcode_h265" type="bool" label="30236" default="false" visible="true" enable="true" />
<setting id="force_transcode_mpeg2" type="bool" label="30239" default="false" visible="true" enable="true" />
<setting id="force_transcode_msmpeg4v3" type="bool" label="30240" default="false" visible="true" enable="true" />
@@ -157,6 +159,7 @@
<setting id="profile_count" type="slider" label="30010" default="0" range="0,1,20" option="int" visible="true" />
<setting id="log_debug" type="bool" label="30027" default="false" visible="true" enable="true" />
<setting id="log_timing" type="bool" label="30015" default="false" visible="true" enable="true" />
<setting id="disable_disk_cache" type="bool" label="30684" default="false" visible="true" enable="true" />
<setting id="use_cache" type="bool" label="30345" default="true" visible="true" enable="true" />
<setting id="use_cached_widget_data" type="bool" label="30441" default="false" visible="true" enable="true" />
<setting id="showLoadProgress" type="bool" label="30120" default="false" visible="true" enable="true" />