Package: release.debian.org Severity: normal Tags: bullseye User: release.debian....@packages.debian.org Usertags: pu
Please unblock package kodi [ Reason ] This is a second point release of Kodi 19 "Matrix". It consists of 69 commits, closing 40 upstream bugs. Most notable bugs fixed include 8 PVR issues, that led to Kodi crashes under certain circumstances, and 4 fixes for Kodi's default skin, Estuary. Another must-have bugfix for users controlling their Kodi set-ups remotely is the proper handling of partial websocket messages. Debian packaging changes requested by users include the patch adding metainfo file to /usr/share/metainfo, needed by GNOME 40 integration. Apart from that, translations of i10n were updated to fix users' complaints. These changes produce a lot of changes in .po files, so I filtered the debdiff as follows to get rid of noise not related to code: filterdiff kodi_19.1+dfsg2-2_19.2+dfsg1-1.debdiff \ -x "*/addons/*.xml" \ -x "*/addons/*.po" \ -x "*/cmake/scripts/windows/*" \ -x "*/docs/*" \ -x "*/Changelog" \ -x "*/Makefile.in" \ -x "*/*.m4" \ -x "*/configure" \ -x "*/msvc/*" \ -x "*/media/*" \ -x "*/system/*" \ -x "*/tools/buildsteps/windows/*" \ -x "*/xbmc/cores/VideoPlayer/VideoRenderers/windows/*" \ -x "*/xbmc/windowing/win10/*" \ -x "*/xbmc/windowing/windows/*" \ 1>kodi_19.1+dfsg2-2_19.2+dfsg1-1.filterdiff [ Impact ] Users receive fixes for problems reported upstream [ Tests ] Automated tests + manual testing by Kodi users [ Risks ] The struct release policy of upstream ensures no breaking changes are allowed past BETA releases. Point releases bring only bugfixes and security fixes, so risk is low. Furthermore, I have become the official member of Team Kodi! That should contribute in the mitigation of risks :) [ Checklist ] [x] all changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in testing [ Changes ] Here is the outline of changes merged in 19.2: https://github.com/xbmc/xbmc/pull/20224 ('Bump to 19.2. final'): 1 commit(s) - "Bump to 19.2. final" https://github.com/xbmc/xbmc/pull/20189 ('[CGUIDialogVolumeBar] Fix dialog not updating values if smartredraw i…'): 1 commit(s) - "[CGUIDialogVolumeBar] Fix dialog not updating values if smartredraw is enabled" https://github.com/xbmc/xbmc/pull/20185 ('[Backport] Sync game controllers for language updates'): 1 commit(s) - "Sync game controllers for language updates" https://github.com/xbmc/xbmc/pull/20178 ('[Matrix] PVR: fix "Delete permanently" of recordings from trash'): 1 commit(s) - "PVR: fix "Delete permanently" of recordings from trash" https://github.com/xbmc/xbmc/pull/20161 ('[Backport][linux] Use posix_memalign to implement AlignedMalloc'): 1 commit(s) - "[linux] Use posix_memalign to implement AlignedMalloc" https://github.com/xbmc/xbmc/pull/20140 ('[Backport] Websocket: handle partial messages'): 1 commit(s) - "Websocket: handle partial messages" https://github.com/xbmc/xbmc/pull/20119 ('[Matrix][PVR] Search missing channel icons job must be executed by PVR manage…'): 1 commit(s) - "[PVR] Search missing channel icons job must be executed by PVR manager thread to avoid races in complex restart scenarios." https://github.com/xbmc/xbmc/pull/20116 ('[Matrix][Estuary] PVR Guide window: Truncated channel names should scroll whe…'): 1 commit(s) - "[Estuary] PVR Guide window: Truncated channel names should scroll when focused." https://github.com/xbmc/xbmc/pull/20115 ('[Matrix][Estuary] PVR channel guide dialog changes.'): 1 commit(s) - "[Estuary] PVR channel guide dialog changes." https://github.com/xbmc/xbmc/pull/20114 ('[Matrix][Estuary] Default PVR radio channel icon should have transparent background'): 1 commit(s) - "[Estuary] Default PVR radio channel icon should have transparent background." https://github.com/xbmc/xbmc/pull/20092 ('[Matrix][PVR] Fix and simplify addon connection state change handling.'): 1 commit(s) - "[PVR] Fix and simplify addon connection state change handling." https://github.com/xbmc/xbmc/pull/20060 ('[addons] sync service.xbmc.versioncheck with repo'): 1 commit(s) - "[addons] sync service.xbmc.versioncheck with repo" https://github.com/xbmc/xbmc/pull/20053 ('[Music] Fix grouping discs by subtitle if first disc has one'): 1 commit(s) - "[MUSIC] Ensure grouping discs by title if subtitles present" https://github.com/xbmc/xbmc/pull/20051 ('[bp][addons] Update default and SNES controller addons'): 1 commit(s) - "[addons] Update default and SNES controller addons" https://github.com/xbmc/xbmc/pull/20047 ('[bp][addons] fix display logic for official/3rd party modules'): 3 commit(s) - "[addons] fix display logic for official/3rd party modules" - "[cleanup] remove advanced settings 'showalldependencies' (obsolete)" - "[addons] move sort out of for-loop that fills the vector to be sorted" https://github.com/xbmc/xbmc/pull/20037 ('change explanation string for cddb'): 1 commit(s) - "change explanation string for cddb" https://github.com/xbmc/xbmc/pull/20035 ('[BP][tools/depends/target][python3] enable multiprocessing module'): 1 commit(s) - "[tools/depends/target][python3] enable multiprocessing module" https://github.com/xbmc/xbmc/pull/20026 ('[Music][GUIInfo] Expose ListItem.DateAdded for music library content'): 1 commit(s) - "[Music][GUIInfo] Expose ListItem.DateAdded for music library content" https://github.com/xbmc/xbmc/pull/20004 ('[Matrix][PVR][JSON-RPC] Expose EPG tag's series number as 'seasonnum' property.'): 1 commit(s) - "[PVR][JSON-RPC] Expose EPG tag's series number as 'seasonnum' property." https://github.com/xbmc/xbmc/pull/19979 ('[Xbox] Fix SSL certs verification errors on Python add-ons'): 1 commit(s) - "[Xbox] Fix SSL certs verification errors on Python add-ons" https://github.com/xbmc/xbmc/pull/19976 ('[Matrix][PVR] Trigger play channel on startup also on wake from suspend, …'): 1 commit(s) - "[PVR] Trigger play channel on startup also on wake from suspend, not only on Kodi application startup." https://github.com/xbmc/xbmc/pull/19974 ('[FIX] Avoid calls to remote servers if saving streamdetails for dvd/b…'): 1 commit(s) - "[FIX] Avoid calls to remote servers if saving streamdetails for dvd/bluray" https://github.com/xbmc/xbmc/pull/19972 ('[Matrix][PVR][JSON-RPC] Expose EPG tag's icon path as 'thumbnail' property.'): 1 commit(s) - "[PVR][JSON-RPC] Expose EPG tag's icon path as 'thumbnail' property." https://github.com/xbmc/xbmc/pull/19945 ('[weblate] update README.md'): 1 commit(s) - "Update README.md" https://github.com/xbmc/xbmc/pull/19937 ('[Backport][Python] Add Python lzma module'): 2 commit(s) - "[Python] Add lzma module" - "[tools/depends][target] xz set dependency on gettext" https://github.com/xbmc/xbmc/pull/19929 ('Workaround for #19883: Check if applied locale correctly lowers chars and fallback'): 2 commit(s) - "Check if applied locale correctly lowers chars and fallback" - "kodi.sh.in: Unset LC_{ALL,CTYPE}, LANG" https://github.com/xbmc/xbmc/pull/19926 ('Bump openssl'): 2 commit(s) - "[depends] bump openssl to 1.1.1k" - "[depends] bump gnutls to 3.6.16" https://github.com/xbmc/xbmc/pull/19920 ('[Xbox] DX fixes and improvements'): 1 commit(s) - "[Xbox] DX fixes and improvements" https://github.com/xbmc/xbmc/pull/19915 ('[Backport][PVR] Resolve "EPG Grid can get locked into a short timeframe during/after Clear Data operation"'): 1 commit(s) - "[PVR] Resolve 'EPG Grid can get locked into a short timeframe during/after Clear Data operation'" https://github.com/xbmc/xbmc/pull/19904 ('[utils] include fmt/xchar.h'): 1 commit(s) - "[utils] include fmt/xchar.h" https://github.com/xbmc/xbmc/pull/19894 ('[Android] Fix HDR static metadata - Matrix'): 1 commit(s) - "[Android] Fix HDR static metadata" https://github.com/xbmc/xbmc/pull/19891 ('[swig] fix illegal access warnings/errors with Java >= 9'): 1 commit(s) - "[swig] fix illegal access warnings/errors with Java >= 9" https://github.com/xbmc/xbmc/pull/19890 ('[FIX][JSONRPC] Respect boolean values when exporting video/audio via …'): 1 commit(s) - "[FIX][JSONRPC] Respect boolean values when exporting video/audio via json" https://github.com/xbmc/xbmc/pull/19884 ('[Backport][Addons][Filesystem] Resolve int <--> bool compiler warnings on MSVC'): 1 commit(s) - "[Addons][Filesystem] Resolve int <--> bool compiler wanrings on MSVC" https://github.com/xbmc/xbmc/pull/19880 ('[UWP] [Xbox] Removed non working HDR toggle code'): 1 commit(s) - "[UWP] [Xbox] Removed non working HDR toggle code" https://github.com/xbmc/xbmc/pull/19876 ('[depends] Update fffmpeg 4.3.2 to include correct satip patch'): 1 commit(s) - "[depends] Update fffmpeg 4.3.2 to include correct satip patch" https://github.com/xbmc/xbmc/pull/19871 ('[UWP] [Xbox] Fix curl CA certs bundle path to be usable'): 1 commit(s) - "UWP curl https fix - CURLOPT_CAINFO required" https://github.com/xbmc/xbmc/pull/19870 ('Fix of the lookup texture for Spline/Lanczos3'): 1 commit(s) - "Fix of the lookup texture for Spline/Lanczos3" https://github.com/xbmc/xbmc/pull/19868 ('[BP][Docs][Apple] Update apple platform build docs'): 1 commit(s) - "[Docs][Apple] Update apple platform build docs" https://github.com/xbmc/xbmc/pull/19857 ('[Backport] #19855 Fix segmentation fault when accessing invalid PVR channel from favourites'): 1 commit(s) - "[Backport] Fix segmentation fault when accessing invalid PVR channel" https://github.com/xbmc/xbmc/pull/19841 ('[Music][Backport]Fix MySQL problem with fetching artist discography'): 1 commit(s) - "Fix MySQL problem with fetching artist discography" https://github.com/xbmc/xbmc/pull/19830 ('[DXVA2] Fix: check if HDR10 RGB limited range is supported by video driver'): 1 commit(s) - "[DXVA2] Fix: check if HDR10 RGB limited range is supported by video driver (don't assume it's always supported)" https://github.com/xbmc/xbmc/pull/19806 ('[Matrix][Android] Storage Manager: Try fallback to obtain drives if running on Android 6 and older'): 1 commit(s) - "[Android] Storage Manager: Try fallback to obtain drives if running on Android 6 and older (SDK API level < 24) or in case of error." https://github.com/xbmc/xbmc/pull/19804 ('[Windows] Fix: possible crash if Windows HDR switch is toggled externally'): 2 commit(s) - "[Windows] Implements DestroySwapChain method to avoid duplicated code" - "[Windows] Fix: possible crash when Windows HDR is toggled (externally) while Kodi is running" https://github.com/xbmc/xbmc/pull/19802 ('[Windows] Fix: crash if WS-Discovery receives partial or malformed list of properties from network devices'): 2 commit(s) - "Silence C++ warnings" - "[Windows] Fix: crash if WS-Discovery receives partial or malformed list of properties from network devices" https://github.com/xbmc/xbmc/pull/19793 ('[Xbox] Fix: 4K resolutions infos reported as 1080p'): 1 commit(s) - "[Xbox] Fix: 4K resolutions infos reported as 1080p" https://github.com/xbmc/xbmc/pull/19792 ('[Estuary][Backport]Fix label 2 in list views'): 1 commit(s) - "[Estuary] fix label 2 in list views" https://github.com/xbmc/xbmc/pull/19783 ('[Windows] Fix crash when Kodi is moved to another monitor with different video adapter'): 1 commit(s) - "[Windows] Fix crash when Kodi is moved to another monitor with different video adapter due to hardware changed" https://github.com/xbmc/xbmc/pull/19781 ('[Xbox] Implements alternate method to get display refresh rate'): 1 commit(s) - "[Xbox] Implements alternate method to get display refresh rate" https://github.com/xbmc/xbmc/pull/19775 ('[Windows] DX swapchain improvements'): 1 commit(s) - "[Windows] DX swapchain improvements" https://github.com/xbmc/xbmc/pull/19774 ('Fix audio passthrough at display lost/reset events'): 1 commit(s) - "Fix audio passthrough at display reset events" https://github.com/xbmc/xbmc/pull/19773 ('[Windows] Fix: crash when the monitor is turned off and Kodi goes to another monitor'): 1 commit(s) - "[Windows] Fix: crash when the monitor is turned off and Kodi goes to another monitor" https://github.com/xbmc/xbmc/pull/19762 ('[Matrix] [video] don't overwrite unique IDs in CVideoDatabase::SetDetailsForFoo() (fixes #17444)'): 1 commit(s) - "[video] don't overwrite unique IDs in CVideoDatabase::SetDetailsForFoo() (fixes #17444)" https://github.com/xbmc/xbmc/pull/19746 ('[Matrix][PVR] CFileItem: Add fallbacks to channel icon and default images to …'): 1 commit(s) - "[PVR] CFileItem: Add fallbacks to channel icon and default images to EPG, timer and recording items, like we already had for channels." https://github.com/xbmc/xbmc/pull/19739 ('Backport: AudioTrack HD Passthrough Fixes'): 2 commit(s) - "AESinkAudioTrack: Reduce the probe buffer size" - "AESinkAudioTrack: Reduce periods and buffer for 8 channel HD-Audio formats" https://github.com/xbmc/xbmc/pull/19737 ('[Matrix][PVR] Fix wrong 'all channels' label in radio guide search dialog.'): 1 commit(s) - "[PVR] Fix wrong 'all channels' label in radio guide search dialog." https://github.com/xbmc/xbmc/pull/19736 ('[Matrix][PVR] Fix wrong search window opened when executing 'Find similar' on a timer item.'): 1 commit(s) - "[PVR] Fix wrong search window opened when executing 'Find similar' on a timer item." https://github.com/xbmc/xbmc/pull/19723 ('[Backport][PVR][GUI] Hide context menu items not relevant to the associated client'): 1 commit(s) - "[PVR][GUI] Hide context menu items not relevant to the associated client" https://github.com/xbmc/xbmc/pull/19709 ('[GUI] Fix scroll gesture on wrap lists'): 1 commit(s) - "[GUI] Fix scroll gesture on wrap lists" https://github.com/xbmc/xbmc/pull/19705 ('[Estuary] Fix OSD Button Visibility'): 1 commit(s) - "[Estuary] Fix OSD Button Visibility" https://github.com/xbmc/xbmc/pull/19659 ('[UWP] [Xbox] Fix 4K HEVC crash due out of memory'): 1 commit(s) - "[UWP] [Xbox] Fix 4K HEVC crash due out of memory" ------- Total commit count = 69 [ Other info ] unblock kodi/2:19.2+dfsg1-1~deb11u1
diff -Nru kodi-19.1+dfsg2/addons/service.xbmc.versioncheck/resources/lib/version_check/service.py kodi-19.2+dfsg1/addons/service.xbmc.versioncheck/resources/lib/version_check/service.py --- kodi-19.1+dfsg2/addons/service.xbmc.versioncheck/resources/lib/version_check/service.py 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/addons/service.xbmc.versioncheck/resources/lib/version_check/service.py 2021-10-06 08:49:25.000000000 +0000 @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @@ -34,17 +33,21 @@ from .json_interface import get_installed_version from .versions import compare_version -if sys.version_info[0] == 3 and sys.version_info[1] >= 8: - try: - from .distro import distro - DISTRIBUTION = distro.linux_distribution(full_distribution_name=False)[0].lower() +DISTRIBUTION = '' - except (AttributeError, ImportError): - DISTRIBUTION = '' +if sys.platform.startswith('linux'): + if sys.version_info[0] == 3 and sys.version_info[1] >= 8: + try: + from .distro import distro -else: - DISTRIBUTION = platform.linux_distribution(full_distribution_name=0)[0].lower() # pylint: disable=deprecated-method + DISTRIBUTION = distro.linux_distribution(full_distribution_name=False)[0].lower() + + except (AttributeError, ImportError): + DISTRIBUTION = '' + + else: + DISTRIBUTION = platform.linux_distribution(full_distribution_name=0)[0].lower() # pylint: disable=deprecated-method if not DISTRIBUTION: DISTRIBUTION = platform.uname()[0].lower() diff -Nru kodi-19.1+dfsg2/addons/service.xbmc.versioncheck/resources/versions.txt kodi-19.2+dfsg1/addons/service.xbmc.versioncheck/resources/versions.txt --- kodi-19.1+dfsg2/addons/service.xbmc.versioncheck/resources/versions.txt 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/addons/service.xbmc.versioncheck/resources/versions.txt 2021-10-06 08:49:25.000000000 +0000 @@ -3,6 +3,24 @@ "releases": { "stable": [ { + "major": "19", + "minor": "1", + "tag": "stable", + "tagversion":"", + "revision": "20210508-85e05228b4", + "extrainfo": "final", + "addon_support": "yes" + }, + { + "major": "19", + "minor": "0", + "tag": "stable", + "tagversion":"", + "revision": "20210218-f44fdfbf67", + "extrainfo": "final", + "addon_support": "yes" + }, + { "major": "18", "minor": "9", "tag": "stable", @@ -302,6 +320,15 @@ ], "releasecandidate": [ { + "major": "19", + "minor": "0", + "tag": "releasecandidate", + "tagversion":"1", + "revision": "20210115-90a1e12804", + "extrainfo": "RC1", + "addon_support": "yes" + }, + { "major": "18", "minor": "0", "tag": "releasecandidate", @@ -529,6 +556,24 @@ ], "beta": [ { + "major": "19", + "minor": "0", + "tag": "beta", + "tagversion":"2", + "revision": "20201207-8cc9e80e41", + "extrainfo": "beta2", + "addon_support": "yes" + }, + { + "major": "19", + "minor": "0", + "tag": "beta", + "tagversion":"1", + "revision": "20201117-88e186e4b4", + "extrainfo": "beta1", + "addon_support": "yes" + }, + { "major": "18", "minor": "0", "tag": "beta", @@ -839,6 +884,15 @@ { "major": "19", "minor": "0", + "tag": "alpha", + "tagversion":"3", + "revision": "20201031-bb0699db41", + "extrainfo": "alpha3", + "addon_support": "yes" + }, + { + "major": "19", + "minor": "0", "tag": "alpha", "tagversion":"2", "revision": "20201005-54be31bc5c", diff -Nru kodi-19.1+dfsg2/cmake/modules/FindPython.cmake kodi-19.2+dfsg1/cmake/modules/FindPython.cmake --- kodi-19.1+dfsg2/cmake/modules/FindPython.cmake 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/cmake/modules/FindPython.cmake 2021-10-06 08:49:25.000000000 +0000 @@ -21,6 +21,10 @@ if(NOT CORE_SYSTEM_NAME STREQUAL android) set(PYTHON_DEP_LIBRARIES pthread dl util) + if(CORE_SYSTEM_NAME STREQUAL linux) + # python archive built via depends requires librt for _posixshmem library + list(APPEND PYTHON_DEP_LIBRARIES rt) + endif() endif() set(PYTHON_LIBRARIES ${PYTHON_LIBRARY} ${FFI_LIBRARY} ${EXPAT_LIBRARY} ${INTL_LIBRARY} ${GMP_LIBRARY} ${PYTHON_DEP_LIBRARIES}) diff -Nru kodi-19.1+dfsg2/debian/changelog kodi-19.2+dfsg1/debian/changelog --- kodi-19.1+dfsg2/debian/changelog 2021-06-24 20:44:30.000000000 +0000 +++ kodi-19.2+dfsg1/debian/changelog 2021-10-06 10:59:56.000000000 +0000 @@ -1,3 +1,13 @@ +kodi (2:19.2+dfsg1-1) unstable; urgency=medium + + * New upstream version 19.2+dfsg1 + * Restrict watchfile to current Debian stable codename + * Bump standard version + * Refresh patches + * Install package metainfo + + -- Vasyl Gello <vasek.ge...@gmail.com> Wed, 06 Oct 2021 10:59:56 +0000 + kodi (2:19.1+dfsg2-2) unstable; urgency=medium * Add runtime locale test and fallback (Closes: #989814) diff -Nru kodi-19.1+dfsg2/debian/control kodi-19.2+dfsg1/debian/control --- kodi-19.1+dfsg2/debian/control 2021-06-24 20:44:30.000000000 +0000 +++ kodi-19.2+dfsg1/debian/control 2021-10-06 10:59:56.000000000 +0000 @@ -104,7 +104,7 @@ waylandpp-dev, zip, zlib1g-dev -Standards-Version: 4.5.1 +Standards-Version: 4.6.0 Rules-Requires-Root: no Vcs-Browser: https://salsa.debian.org/multimedia-team/kodi-media-center/kodi Vcs-Git: https://salsa.debian.org/multimedia-team/kodi-media-center/kodi.git diff -Nru kodi-19.1+dfsg2/debian/kodi.install kodi-19.2+dfsg1/debian/kodi.install --- kodi-19.1+dfsg2/debian/kodi.install 2021-06-24 20:44:30.000000000 +0000 +++ kodi-19.2+dfsg1/debian/kodi.install 2021-10-06 10:59:56.000000000 +0000 @@ -1,3 +1,4 @@ usr/bin/kodi usr/bin/kodi-standalone usr/share/applications +usr/share/metainfo diff -Nru kodi-19.1+dfsg2/debian/patches/kodi/0005-use-system-groovy.patch kodi-19.2+dfsg1/debian/patches/kodi/0005-use-system-groovy.patch --- kodi-19.1+dfsg2/debian/patches/kodi/0005-use-system-groovy.patch 2021-06-24 20:44:30.000000000 +0000 +++ kodi-19.2+dfsg1/debian/patches/kodi/0005-use-system-groovy.patch 2021-10-06 10:59:56.000000000 +0000 @@ -26,7 +26,7 @@ COMMAND ${SWIG_EXECUTABLE} ARGS -w401 -c++ -o ${file}.xml -xml -I${CMAKE_SOURCE_DIR}/xbmc -xmllang python ${CMAKE_CURRENT_SOURCE_DIR}/../swig/${file} - COMMAND ${Java_JAVA_EXECUTABLE} -- ARGS -cp "${classpath}" groovy.ui.GroovyMain ${CMAKE_SOURCE_DIR}/tools/codegenerator/Generator.groovy ${file}.xml ${CMAKE_CURRENT_SOURCE_DIR}/../python/PythonSwig.cpp.template ${file}.cpp > ${devnull} +- ARGS ${JAVA_OPEN_OPTS} -cp "${classpath}" groovy.ui.GroovyMain ${CMAKE_SOURCE_DIR}/tools/codegenerator/Generator.groovy ${file}.xml ${CMAKE_CURRENT_SOURCE_DIR}/../python/PythonSwig.cpp.template ${file}.cpp > ${devnull} + COMMAND groovy + ARGS -cp "${classpath}" ${CMAKE_SOURCE_DIR}/tools/codegenerator/Generator.groovy ${file}.xml ${CMAKE_CURRENT_SOURCE_DIR}/../python/PythonSwig.cpp.template ${file}.cpp > ${devnull} ${CLANG_FORMAT_COMMAND} diff -Nru kodi-19.1+dfsg2/debian/patches/kodi/0022-Add-metainfo.patch kodi-19.2+dfsg1/debian/patches/kodi/0022-Add-metainfo.patch --- kodi-19.1+dfsg2/debian/patches/kodi/0022-Add-metainfo.patch 1970-01-01 00:00:00.000000000 +0000 +++ kodi-19.2+dfsg1/debian/patches/kodi/0022-Add-metainfo.patch 2021-10-06 10:59:56.000000000 +0000 @@ -0,0 +1,156 @@ +From 7398e5599f8c9c98eb4bac84384eed896c8b630d Mon Sep 17 00:00:00 2001 +From: Razze <razz...@gmail.com> +Date: Sun, 3 Oct 2021 21:49:44 +0200 +Subject: [PATCH] Add metainfo and install it + +This was based on the meta info from https://github.com/flathub/tv.kodi.Kodi/pull/115 +--- + cmake/scripts/linux/Install.cmake | 9 +++ + tools/Linux/kodi.metainfo.xml.in | 108 ++++++++++++++++++++++++++++++ + 2 files changed, 117 insertions(+) + create mode 100644 tools/Linux/kodi.metainfo.xml.in + +diff --git a/cmake/scripts/linux/Install.cmake b/cmake/scripts/linux/Install.cmake +index acfd3ff564..43875d59b3 100644 +--- a/cmake/scripts/linux/Install.cmake ++++ b/cmake/scripts/linux/Install.cmake +@@ -47,6 +47,10 @@ configure_file(${CMAKE_SOURCE_DIR}/tools/Linux/kodi-xsession.desktop.in + configure_file(${CMAKE_SOURCE_DIR}/tools/Linux/kodi.desktop.in + ${CORE_BUILD_DIR}/${APP_NAME_LC}.desktop @ONLY) + ++# Configure metainfo ++configure_file(${CMAKE_SOURCE_DIR}/tools/Linux/kodi.metainfo.xml.in ++ ${CORE_BUILD_DIR}/${APP_NAME_LC}.metainfo.xml @ONLY) ++ + # Install app + install(TARGETS ${APP_NAME_LC} + DESTINATION ${libdir}/${APP_NAME_LC} +@@ -92,6 +96,11 @@ install(FILES ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${APP_NAME_LC}.desktop + DESTINATION ${datarootdir}/applications + COMPONENT kodi) + ++# Install metainfo ++install(FILES ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${APP_NAME_LC}.metainfo.xml ++ DESTINATION ${datarootdir}/metainfo ++ COMPONENT kodi) ++ + # Install icons + install(FILES ${CMAKE_SOURCE_DIR}/tools/Linux/packaging/media/icon16x16.png + RENAME ${APP_NAME_LC}.png +diff --git a/tools/Linux/kodi.metainfo.xml.in b/tools/Linux/kodi.metainfo.xml.in +new file mode 100644 +index 0000000000..ad273c3095 +--- /dev/null ++++ b/tools/Linux/kodi.metainfo.xml.in +@@ -0,0 +1,108 @@ ++<?xml version="1.0" encoding="UTF-8"?> ++<component type="desktop-application"> ++ <id>tv.kodi.Kodi</id> ++ <name>Kodi</name> ++ <project_license>GPL-2.0-only GPL-2.0-or-later LGPL-2.1-or-later MIT BSD-3-Clause BSD-4-Clause</project_license> ++ <metadata_license>CC0-1.0</metadata_license> ++ <developer_name>Team Kodi</developer_name> ++ <summary>The ultimate entertainment center</summary> ++ <url type="homepage">https://kodi.tv/</url> ++ <url type="donation">https://kodi.tv/contribute/donate</url> ++ <url type="bugtracker">https://github.com/xbmc/xbmc/issues</url> ++ <url type="faq">https://kodi.wiki/view/FAQs</url> ++ <url type="help">https://forum.kodi.tv/</url> ++ <url type="translate">https://kodi.weblate.cloud/</url> ++ <description> ++ <p>Kodi allows users to play and view videos, music, podcasts, ++ and other digital media files from local storage, network storage ++ and the internet. It's optimized for a 10-foot user interface to be ++ used with televisions and remote controls.</p> ++ ++ <p>Kodi spawned from the love of media. It is an entertainment hub ++ that brings all your digital media together into a beautiful ++ and user friendly package. It is 100% free and open source, ++ very customisable and runs on a wide variety of devices. It is ++ supported by a dedicated team of volunteers and a huge community.</p> ++ </description> ++ <launchable type="desktop-id">tv.kodi.Kodi.desktop</launchable> ++ <screenshots> ++ <screenshot type="default"> ++ <image>https://mirrors.kodi.tv/screenshots/kodi-recently-added.jpg</image> ++ <caption>The homescreen keeps your media organized</caption> ++ </screenshot> ++ <screenshot> ++ <image>https://mirrors.kodi.tv/screenshots/kodi-videolibrary.jpg</image> ++ <caption>Easily browse your movies and series</caption> ++ </screenshot> ++ <screenshot> ++ <image>https://mirrors.kodi.tv/screenshots/kodi-video-info.jpg</image> ++ <caption>Get additional infos about your movies or series</caption> ++ </screenshot> ++ <screenshot> ++ <image>https://mirrors.kodi.tv/screenshots/kodi-tvshow.jpg</image> ++ <caption>Browse TV shows by seasons</caption> ++ </screenshot> ++ <screenshot> ++ <image>https://mirrors.kodi.tv/screenshots/kodi-music-info.jpg</image> ++ <caption>Use the music library to organize and read about your artists</caption> ++ </screenshot> ++ <screenshot> ++ <image>https://mirrors.kodi.tv/screenshots/kodi-epg.jpg</image> ++ <caption>Use the EPG to manage your TV stations</caption> ++ </screenshot> ++ <screenshot> ++ <image>https://mirrors.kodi.tv/screenshots/kodi-addons.jpg</image> ++ <caption>Extend what Kodi can do, just use addons</caption> ++ </screenshot> ++ <screenshot> ++ <image>https://mirrors.kodi.tv/screenshots/kodi-weather.jpg</image> ++ <caption>Keep the weather in check</caption> ++ </screenshot> ++ <screenshot> ++ <image>https://mirrors.kodi.tv/screenshots/kodi-webinterface.jpg</image> ++ <caption>The webinterface enables you to manage your Kodi from other devices</caption> ++ </screenshot> ++ </screenshots> ++ <releases> ++ <release date="2021-05-09" version="19.1-Matrix"/> ++ <release date="2021-02-19" version="19.0-Matrix"/> ++ <release date="2020-10-24" version="18.9-Leia"/> ++ <release date="2020-07-28" version="18.8-Leia"/> ++ <release date="2020-05-21" version="18.7-Leia"/> ++ <release date="2020-02-29" version="18.6-Leia"/> ++ <release date="2019-11-18" version="18.5-Leia"/> ++ <release date="2019-08-31" version="18.4-Leia"/> ++ <release date="2019-06-27" version="18.3-Leia"/> ++ <release date="2019-04-22" version="18.2-Leia"/> ++ <release date="2019-02-17" version="18.1-Leia"/> ++ </releases> ++ <content_rating type="oars-1.0"> ++ <content_attribute id="violence-cartoon">none</content_attribute> ++ <content_attribute id="violence-fantasy">none</content_attribute> ++ <content_attribute id="violence-realistic">none</content_attribute> ++ <content_attribute id="violence-bloodshed">none</content_attribute> ++ <content_attribute id="violence-sexual">none</content_attribute> ++ <content_attribute id="drugs-alcohol">none</content_attribute> ++ <content_attribute id="drugs-narcotics">none</content_attribute> ++ <content_attribute id="drugs-tobacco">none</content_attribute> ++ <content_attribute id="sex-nudity">none</content_attribute> ++ <content_attribute id="sex-themes">none</content_attribute> ++ <content_attribute id="language-profanity">none</content_attribute> ++ <content_attribute id="language-humor">none</content_attribute> ++ <content_attribute id="language-discrimination">none</content_attribute> ++ <content_attribute id="social-chat">none</content_attribute> ++ <content_attribute id="social-info">none</content_attribute> ++ <content_attribute id="social-audio">none</content_attribute> ++ <content_attribute id="social-location">none</content_attribute> ++ <content_attribute id="social-contacts">none</content_attribute> ++ <content_attribute id="money-purchasing">none</content_attribute> ++ <content_attribute id="money-gambling">none</content_attribute> ++ </content_rating> ++ <recommends> ++ <control>keyboard</control> ++ <control>pointing</control> ++ <control>touch</control> ++ <control>tv-remote</control> ++ <control>gamepad</control> ++ </recommends> ++</component> +-- +2.33.0 + diff -Nru kodi-19.1+dfsg2/debian/patches/kodi/0022-Workaround-989814.patch kodi-19.2+dfsg1/debian/patches/kodi/0022-Workaround-989814.patch --- kodi-19.1+dfsg2/debian/patches/kodi/0022-Workaround-989814.patch 2021-06-24 20:44:30.000000000 +0000 +++ kodi-19.2+dfsg1/debian/patches/kodi/0022-Workaround-989814.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -From 8b8e97dbec5c6268d1b81eb7799cfc945ca9520e Mon Sep 17 00:00:00 2001 -From: Vasyl Gello <vasek.ge...@gmail.com> -Date: Fri, 25 Jun 2021 01:37:02 +0000 -Subject: [PATCH 1/2] Check if applied locale correctly lowers chars and - fallback - -.. to default region if it does not. - -Fixes #19883. - -Signed-off-by: Vasyl Gello <vasek.ge...@gmail.com> ---- - xbmc/LangInfo.cpp | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -diff --git a/xbmc/LangInfo.cpp b/xbmc/LangInfo.cpp -index 24f0419cfe..ace72e1ffe 100644 ---- a/xbmc/LangInfo.cpp -+++ b/xbmc/LangInfo.cpp -@@ -981,6 +981,16 @@ void CLangInfo::SetCurrentRegion(const std::string& strName) - - m_currentRegion->SetGlobalLocale(); - -+ // Check if locale is not affected by #19883 -+ int test19883 = std::tolower('i') - std::tolower('I'); -+ if (test19883 != 0) -+ { -+ CLog::Log(LOGWARNING, "region '{}' is affected by #19883 - falling back to default region '{}'", -+ m_currentRegion->m_strName, m_defaultRegion.m_strName); -+ m_currentRegion = &m_defaultRegion; -+ m_currentRegion->SetGlobalLocale(); -+ } -+ - const std::shared_ptr<CSettings> settings = CServiceBroker::GetSettingsComponent()->GetSettings(); - if (settings->GetString(CSettings::SETTING_LOCALE_SHORTDATEFORMAT) == SETTING_REGIONAL_DEFAULT) - SetShortDateFormat(m_currentRegion->m_strDateFormatShort); --- -2.32.0.rc0 - - -From 114ee13138389c96a759d6e5b73717093dd4030d Mon Sep 17 00:00:00 2001 -From: Vasyl Gello <vasek.ge...@gmail.com> -Date: Sun, 27 Jun 2021 19:31:39 +0000 -Subject: [PATCH 2/2] kodi.sh.in: Unset LC_{ALL,CTYPE}, LANG - -Signed-off-by: Vasyl Gello <vasek.ge...@gmail.com> ---- - tools/Linux/kodi.sh.in | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/tools/Linux/kodi.sh.in b/tools/Linux/kodi.sh.in -index 108c0b007b..29d17d2c0f 100644 ---- a/tools/Linux/kodi.sh.in -+++ b/tools/Linux/kodi.sh.in -@@ -171,6 +171,9 @@ if command_exists gdb; then - fi - fi - -+# Unset CTYPE, LANG and ALL - see issue #19883 -+unset LC_CTYPE LC_ALL LANG -+ - LOOP=1 - while [ $(( $LOOP )) = "1" ] - do --- -2.32.0.rc0 - diff -Nru kodi-19.1+dfsg2/debian/patches/series kodi-19.2+dfsg1/debian/patches/series --- kodi-19.1+dfsg2/debian/patches/series 2021-06-24 20:44:30.000000000 +0000 +++ kodi-19.2+dfsg1/debian/patches/series 2021-10-06 10:59:56.000000000 +0000 @@ -19,7 +19,7 @@ kodi/0019-Disable-GetCPUFrequency-test.patch kodi/0020-Fix-C++-example-includes.patch kodi/0021-Detect-and-honor-big-endian-arch.patch -kodi/0022-Workaround-989814.patch +kodi/0022-Add-metainfo.patch libdvdnav/0001-xbmc-dvdnav-allow-get-set-vm-state.patch libdvdnav/0002-xbmc-dvdnav-expose-dvdnav_get_vm-dvdnav_get_button_i.patch libdvdnav/0003-xbmc-dvdnav-detection-of-dvd-name.patch diff -Nru kodi-19.1+dfsg2/debian/watch kodi-19.2+dfsg1/debian/watch --- kodi-19.1+dfsg2/debian/watch 2021-06-24 20:44:30.000000000 +0000 +++ kodi-19.2+dfsg1/debian/watch 2021-10-06 10:59:56.000000000 +0000 @@ -23,13 +23,14 @@ #HEAD debian # Tagged releases +# TODO: Change Kodi codename in tarball URL before packaging next Kodi major release # opts="repack, \ compression=xz, \ repacksuffix=+dfsg1,\ uversionmangle=s/\([\.0-9a-zA-Z]\)-.*$/\1/;s/rc/~rc/;s/a/~alpha/;s/b/~beta/;s/RC/~rc/;s/A/~alpha/;s/B/~beta/, \ dversionmangle=auto" \ -https://github.com/xbmc/xbmc/releases .*archive/refs/tags/?(\d\S*)-[A-Z].*\.tar\.gz +https://github.com/xbmc/xbmc/releases .*archive/refs/tags/?(\d\S*)-Matrix\.tar\.gz # date Binary files /tmp/McgmkW7nZ0/kodi-19.1+dfsg2/media/splash.jpg and /tmp/ZAWCey_cOj/kodi-19.2+dfsg1/media/splash.jpg differ diff -Nru kodi-19.1+dfsg2/README.md kodi-19.2+dfsg1/README.md --- kodi-19.1+dfsg2/README.md 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/README.md 2021-10-06 08:49:25.000000000 +0000 @@ -53,7 +53,7 @@ * **Coding:** Developers can help Kodi by **[fixing a bug](https://github.com/xbmc/xbmc/issues)**, adding new features, making our technology smaller and faster and making development easier for others. Kodi's codebase consists mainly of C++ with small parts written in a variety of coding languages. Our add-ons mainly consist of python and XML. For more information, please have a look at our **[contributing guide](docs/CONTRIBUTING.md)**. * **Helping users:** Our support process relies on enthusiastic contributors like you to help others get the most out of Kodi. The #1 priority is always answering questions in our **[support forums](https://forum.kodi.tv/)**. Everyday new people discover Kodi, and everyday they are virtually guaranteed to have questions. -* **Localization:** Translate **[Kodi](https://www.transifex.com/teamxbmc/kodi-main/)**, **[add-ons](https://www.transifex.com/teamxbmc/xbmc-addons/)** and **[skins](https://www.transifex.com/teamxbmc/xbmc-skins/)** into your native language. +* **Localization:** Translate **[Kodi](https://kodi.weblate.cloud/projects/kodi-core/kodi-main/)**, **[add-ons, skins etc.](https://kodi.weblate.cloud/)** into your native language. * **Add-ons:** **[Add-ons](https://kodi.tv/addons)** are what make Kodi the most extensible and customizable entertainment hub available. **[Get started building an add-on](https://kodi.tv/create-an-addon)**. * **Documentation:** Kodi's **[wiki pages](https://kodi.wiki/)** are the hub for information about Kodi and surrounding ecosystem. Help make our documentation better by writing new content or correcting existing material. diff -Nru kodi-19.1+dfsg2/tools/Linux/kodi.sh.in kodi-19.2+dfsg1/tools/Linux/kodi.sh.in --- kodi-19.1+dfsg2/tools/Linux/kodi.sh.in 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/tools/Linux/kodi.sh.in 2021-10-06 08:49:25.000000000 +0000 @@ -171,6 +171,11 @@ fi fi + +# Check if locale is affected by "Turkish I" +# See https://github.com/xbmc/xbmc/issues/19883 for details +unset LC_CTYPE LC_ALL LANG + LOOP=1 while [ $(( $LOOP )) = "1" ] do diff -Nru kodi-19.1+dfsg2/version.txt kodi-19.2+dfsg1/version.txt --- kodi-19.1+dfsg2/version.txt 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/version.txt 2021-10-06 08:49:25.000000000 +0000 @@ -3,9 +3,9 @@ COPYRIGHT_YEARS 2005-2021 WEBSITE http://kodi.tv VERSION_MAJOR 19 -VERSION_MINOR 1 +VERSION_MINOR 2 VERSION_TAG -VERSION_CODE 19.1.0 +VERSION_CODE 19.2.0 ADDON_API 19.1.0 ADDON_REPOS repository.xbmc.org|https://mirrors.kodi.tv APP_PACKAGE org.xbmc.kodi diff -Nru kodi-19.1+dfsg2/xbmc/addons/gui/GUIDialogAddonInfo.cpp kodi-19.2+dfsg1/xbmc/addons/gui/GUIDialogAddonInfo.cpp --- kodi-19.1+dfsg2/xbmc/addons/gui/GUIDialogAddonInfo.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/addons/gui/GUIDialogAddonInfo.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -15,6 +15,7 @@ #include "addons/AddonDatabase.h" #include "addons/AddonInstaller.h" #include "addons/AddonManager.h" +#include "addons/AddonRepos.h" #include "addons/AddonSystemSettings.h" #include "addons/IAddon.h" #include "addons/gui/GUIDialogAddonSettings.h" @@ -646,15 +647,20 @@ } } - item->SetLabel2(StringUtils::Format( - g_localizeStrings.Get(messageId).c_str(), it.m_depInfo.versionMin.asString().c_str(), - it.m_installed ? it.m_installed->Version().asString().c_str() : "", - it.m_available ? it.m_available->Version().asString().c_str() : "", - it.m_depInfo.optional ? g_localizeStrings.Get(24184).c_str() : "")); - - item->SetArt("icon", infoAddon->Icon()); - item->SetProperty("addon_id", it.m_depInfo.id); - items.Add(item); + if (entryPoint == EntryPoint::SHOW_DEPENDENCIES || + infoAddon->MainType() != ADDON_SCRIPT_MODULE || + !CAddonRepos::IsFromOfficialRepo(infoAddon, CheckAddonPath::NO)) + { + item->SetLabel2(StringUtils::Format( + g_localizeStrings.Get(messageId), it.m_depInfo.versionMin.asString(), + it.m_installed ? it.m_installed->Version().asString() : "", + it.m_available ? it.m_available->Version().asString() : "", + it.m_depInfo.optional ? g_localizeStrings.Get(24184) : "")); + + item->SetArt("icon", infoAddon->Icon()); + item->SetProperty("addon_id", it.m_depInfo.id); + items.Add(item); + } } } else @@ -746,9 +752,6 @@ m_deps = CServiceBroker::GetAddonMgr().GetDepsRecursive(m_item->GetAddonInfo()->ID(), OnlyEnabledRootAddon::NO); - const bool showAllDependencies = - CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_showAllDependencies; - for (const auto& dep : m_deps) { std::shared_ptr<IAddon> addonInstalled; @@ -769,33 +772,43 @@ if (!addonInstalled) { - // after pushing the install button the dependency install dialog will - // pop up only if non-module dependencies are going to be installed or - // dependencies are unavailable. the latter is for informational purposes - if (showAllDependencies || !addonAvailable || - addonAvailable->MainType() != ADDON_SCRIPT_MODULE) + // after pushing the install button the dependency install dialog + // will be opened only if... + // - dependencies are unavailable (for informational purposes) OR + // - the dependency is not a script/module OR + // - the script/module is not available at an official repo + if (!addonAvailable || addonAvailable->MainType() != ADDON_SCRIPT_MODULE || + !CAddonRepos::IsFromOfficialRepo(addonAvailable, CheckAddonPath::NO)) { m_showDepDialogOnInstall = true; } } - - // AddonType ADDON_SCRIPT_MODULE needs to be filtered as these low-level add-ons - // should be hidden to the user in the dependency select dialog - - if (showAllDependencies || - (addonInstalled && addonInstalled->MainType() != ADDON_SCRIPT_MODULE) || - (addonAvailable && addonAvailable->MainType() != ADDON_SCRIPT_MODULE) || - (!addonAvailable && !addonInstalled)) + else { - m_depsInstalledWithAvailable.emplace_back( - CInstalledWithAvailable{dep, addonInstalled, addonAvailable}); - } - // sort optional add-ons to top of the list + // only display dialog if updates for already installed dependencies will install + if (addonAvailable && addonAvailable->Version() > addonInstalled->Version()) + { + m_showDepDialogOnInstall = true; + } + } - std::sort( - m_depsInstalledWithAvailable.begin(), m_depsInstalledWithAvailable.end(), - [](const auto& a, const auto& b) { return a.m_depInfo.optional > b.m_depInfo.optional; }); + m_depsInstalledWithAvailable.emplace_back( + CInstalledWithAvailable{dep, addonInstalled, addonAvailable}); } + + // sort criteria in dialog: + // 1. optional add-ons to top + // 2. scripts/modules to bottom + std::sort(m_depsInstalledWithAvailable.begin(), m_depsInstalledWithAvailable.end(), + [](const auto& a, const auto& b) { + if (a.m_depInfo.optional != b.m_depInfo.optional) + { + return a.m_depInfo.optional; + } + + const std::shared_ptr<IAddon>& depA = a.m_installed ? a.m_installed : a.m_available; + return (depA && depA->MainType() != ADDON_SCRIPT_MODULE); + }); } diff -Nru kodi-19.1+dfsg2/xbmc/addons/interfaces/Filesystem.cpp kodi-19.2+dfsg1/xbmc/addons/interfaces/Filesystem.cpp --- kodi-19.1+dfsg2/xbmc/addons/interfaces/Filesystem.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/addons/interfaces/Filesystem.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -999,7 +999,7 @@ { CLog::Log(LOGERROR, "Interface_VFS::{} - invalid data (addon='{}', file='{}')", __FUNCTION__, kodiBase, file); - return -1; + return false; } return static_cast<CFile*>(file)->IoControl(EIoControl::IOCTRL_SEEK_POSSIBLE, nullptr) != 0 @@ -1016,7 +1016,7 @@ { CLog::Log(LOGERROR, "Interface_VFS::{} - invalid data (addon='{}', file='{}, status='{}')", __FUNCTION__, kodiBase, file, static_cast<const void*>(status)); - return -1; + return false; } SCacheStatus data = {0}; @@ -1039,7 +1039,7 @@ { CLog::Log(LOGERROR, "Interface_VFS::{} - invalid data (addon='{}', file='{}')", __FUNCTION__, kodiBase, file); - return -1; + return false; } return static_cast<CFile*>(file)->IoControl(EIoControl::IOCTRL_CACHE_SETRATE, &rate) >= 0 ? true @@ -1053,7 +1053,7 @@ { CLog::Log(LOGERROR, "Interface_VFS::{} - invalid data (addon='{}', file='{}')", __FUNCTION__, kodiBase, file); - return -1; + return false; } return static_cast<CFile*>(file)->IoControl(EIoControl::IOCTRL_SET_RETRY, &retry) >= 0 ? true diff -Nru kodi-19.1+dfsg2/xbmc/Application.cpp kodi-19.2+dfsg1/xbmc/Application.cpp --- kodi-19.1+dfsg2/xbmc/Application.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/Application.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -3182,12 +3182,9 @@ // check if VideoPlayer should set file item stream details from its current streams if (file.GetProperty("get_stream_details_from_player").asBoolean() || ((!file.HasVideoInfoTag() || !file.GetVideoInfoTag()->HasStreamDetails()) - && (file.IsDiscImage() + && (URIUtils::IsBluray(file.GetPath()) || file.IsDVDFile() - || file.IsBDFile() - || file.IsBluray() - || file.IsDVD() - || file.IsOnDVD()))) + || file.IsDiscImage()))) m_appPlayer.SetUpdateStreamDetails(); if (m_stackHelper.IsPlayingISOStack() || m_stackHelper.IsPlayingRegularStack()) diff -Nru kodi-19.1+dfsg2/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp kodi-19.2+dfsg1/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp --- kodi-19.1+dfsg2/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -267,7 +267,7 @@ // make sure to have enough buffer as minimum might not be enough to open if (!isRaw) - minBufferSize *= 4; + minBufferSize *= 2; if (supported) { @@ -490,17 +490,31 @@ { m_format.m_frameSize = m_format.m_channelLayout.Count() * (CAEUtil::DataFormatToBits(m_format.m_dataFormat) / 8); m_sink_frameSize = m_format.m_frameSize; - // aim at 200 ms buffer and 50 ms periods - m_audiotrackbuffer_sec = - static_cast<double>(m_min_buffer_size) / (m_sink_frameSize * m_sink_sampleRate); - while (m_audiotrackbuffer_sec < 0.15) + bool isHDiec = ((m_format.m_streamInfo.m_type == CAEStreamInfo::STREAM_TYPE_TRUEHD) || + (m_format.m_streamInfo.m_type == CAEStreamInfo::STREAM_TYPE_DTSHD_MA)); + if (m_passthrough && isHDiec) { - m_min_buffer_size += min_buffer; + // Certain boxes have issues opening DTS-HD / TrueHD with this large amount of data + // adjust accordingly + m_min_buffer_size *= 2; + m_format.m_frames = static_cast<int>(m_min_buffer_size / m_format.m_frameSize) / 2; m_audiotrackbuffer_sec = static_cast<double>(m_min_buffer_size) / (m_sink_frameSize * m_sink_sampleRate); } - // division by 4 -> 4 periods into one buffer - m_format.m_frames = static_cast<int>(m_min_buffer_size / m_format.m_frameSize) / 4; + else + { + // aim at 200 ms buffer and 50 ms periods + m_audiotrackbuffer_sec = + static_cast<double>(m_min_buffer_size) / (m_sink_frameSize * m_sink_sampleRate); + while (m_audiotrackbuffer_sec < 0.15) + { + m_min_buffer_size += min_buffer; + m_audiotrackbuffer_sec = + static_cast<double>(m_min_buffer_size) / (m_sink_frameSize * m_sink_sampleRate); + } + // division by 4 -> 4 periods into one buffer + m_format.m_frames = static_cast<int>(m_min_buffer_size / m_format.m_frameSize) / 4; + } } if (m_passthrough && !m_info.m_wantsIECPassthrough) diff -Nru kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp --- kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -1237,24 +1237,39 @@ std::vector<uint8_t> CDVDVideoCodecAndroidMediaCodec::GetHDRStaticMetadata() { std::vector<uint8_t> metadata; - if (m_hints.masteringMetadata && m_hints.contentLightMetadata) + if (m_hints.masteringMetadata) { - static const double MAX_CHROMATICITY = 5000; + // for more information, see CTA+861.3-A standard document + static const double MAX_CHROMATICITY = 50000; + static const double MAX_LUMINANCE = 10000; metadata.resize(25); metadata[0] = 0; - short* data = reinterpret_cast<short*>(&metadata[1]); - data[0] = static_cast<short>(av_q2d(m_hints.masteringMetadata->display_primaries[0][0]) * MAX_CHROMATICITY + 0.5); - data[1] = static_cast<short>(av_q2d(m_hints.masteringMetadata->display_primaries[1][1]) * MAX_CHROMATICITY + 0.5); - data[2] = static_cast<short>(av_q2d(m_hints.masteringMetadata->display_primaries[1][0]) * MAX_CHROMATICITY + 0.5); - data[3] = static_cast<short>(av_q2d(m_hints.masteringMetadata->display_primaries[2][1]) * MAX_CHROMATICITY + 0.5); - data[4] = static_cast<short>(av_q2d(m_hints.masteringMetadata->display_primaries[2][0]) * MAX_CHROMATICITY + 0.5); - data[5] = static_cast<short>(av_q2d(m_hints.masteringMetadata->display_primaries[0][1]) * MAX_CHROMATICITY + 0.5); - data[6] = static_cast<short>(av_q2d(m_hints.masteringMetadata->white_point[0]) * MAX_CHROMATICITY + 0.5); - data[7] = static_cast<short>(av_q2d(m_hints.masteringMetadata->white_point[1]) * MAX_CHROMATICITY + 0.5); - data[8] = static_cast<short>(av_q2d(m_hints.masteringMetadata->max_luminance) + 0.5); - data[9] = static_cast<short>(av_q2d(m_hints.masteringMetadata->min_luminance) + 0.5); - data[10] = static_cast<short>(m_hints.contentLightMetadata->MaxCLL); - data[11] = static_cast<short>(m_hints.contentLightMetadata->MaxFALL); + unsigned short* data = reinterpret_cast<unsigned short*>(&metadata[1]); + data[0] = static_cast<unsigned short>( + av_q2d(m_hints.masteringMetadata->display_primaries[0][0]) * MAX_CHROMATICITY + 0.5); + data[1] = static_cast<unsigned short>( + av_q2d(m_hints.masteringMetadata->display_primaries[0][1]) * MAX_CHROMATICITY + 0.5); + data[2] = static_cast<unsigned short>( + av_q2d(m_hints.masteringMetadata->display_primaries[1][0]) * MAX_CHROMATICITY + 0.5); + data[3] = static_cast<unsigned short>( + av_q2d(m_hints.masteringMetadata->display_primaries[1][1]) * MAX_CHROMATICITY + 0.5); + data[4] = static_cast<unsigned short>( + av_q2d(m_hints.masteringMetadata->display_primaries[2][0]) * MAX_CHROMATICITY + 0.5); + data[5] = static_cast<unsigned short>( + av_q2d(m_hints.masteringMetadata->display_primaries[2][1]) * MAX_CHROMATICITY + 0.5); + data[6] = static_cast<unsigned short>( + av_q2d(m_hints.masteringMetadata->white_point[0]) * MAX_CHROMATICITY + 0.5); + data[7] = static_cast<unsigned short>( + av_q2d(m_hints.masteringMetadata->white_point[1]) * MAX_CHROMATICITY + 0.5); + data[8] = static_cast<unsigned short>(av_q2d(m_hints.masteringMetadata->max_luminance) + 0.5); + data[9] = static_cast<unsigned short>( + av_q2d(m_hints.masteringMetadata->min_luminance) * MAX_LUMINANCE + 0.5); + // we can have HDR content that does not provide content light level metadata + if (m_hints.contentLightMetadata) + { + data[10] = static_cast<unsigned short>(m_hints.contentLightMetadata->MaxCLL); + data[11] = static_cast<unsigned short>(m_hints.contentLightMetadata->MaxFALL); + } } return metadata; } diff -Nru kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp --- kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -1078,24 +1078,6 @@ && avctx->color_trc == AVCOL_TRC_GAMMA28; } -// UHD HEVC Main10 causes crash on Xbox One S/X -static bool HasXbox4kHevcMain10Bug(AVCodecContext* avctx) -{ - if (CSysInfo::GetWindowsDeviceFamily() != CSysInfo::Xbox) - return false; - - if (avctx->codec_id != AV_CODEC_ID_HEVC) - return false; - - if (avctx->profile != FF_PROFILE_HEVC_MAIN_10) - return false; - - if (avctx->height <= 1080 || avctx->width <= 1920) - return false; - - return true; -} - static bool CheckCompatibility(AVCodecContext* avctx) { if (avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO && HasATIMP2Bug(avctx)) @@ -1195,16 +1177,12 @@ case AV_CODEC_ID_HEVC: /* the HEVC DXVA2 spec asks for 128 pixel aligned surfaces to ensure all coding features have enough room to work with */ + m_surface_alignment = 128; + // a driver may use multi-thread decoding internally (PC only) if (CSysInfo::GetWindowsDeviceFamily() != CSysInfo::Xbox) - { - m_surface_alignment = 128; - // a driver may use multi-thread decoding internally m_refs += CServiceBroker::GetCPUInfo()->GetCPUCount(); - } - // by specification hevc decoder can hold up to 8 unique refs - /* For some reason avctx->refs returns always 1 ref frame (tested - with well known 3 refs frames encodes) */ + // ffmpeg may report only 1 refs frame when is unknown or not present in headers m_refs += (avctx->refs > 1) ? avctx->refs : 8; break; case AV_CODEC_ID_H264: @@ -1238,14 +1216,6 @@ m_refs = 16; } - /* On the Xbox 1/S with limited memory we have to - limit refs to avoid crashing device completely */ - if (HasXbox4kHevcMain10Bug(avctx) && m_refs > 16) - { - CLog::LogFunction(LOGWARNING, "DXVA", "source requires to much refs which is not supported on Xbox One S/X. dxva will not be used."); - return false; - } - if (!OpenDecoder()) { m_bufferPool.reset(); diff -Nru kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/DVDMessage.h kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/DVDMessage.h --- kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/DVDMessage.h 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/DVDMessage.h 2021-10-06 08:49:25.000000000 +0000 @@ -21,6 +21,7 @@ class CDVDMsg : public IDVDResourceCounted<CDVDMsg> { public: + // clang-format off enum Message { NONE = 1000, @@ -53,6 +54,7 @@ PLAYER_ABORT, PLAYER_REPORT_STATE, PLAYER_FRAME_ADVANCE, + PLAYER_DISPLAY_RESET, // report display reset event // demuxer related messages DEMUXER_PACKET, // data packet @@ -66,6 +68,7 @@ SUBTITLE_CLUTCHANGE, SUBTITLE_ADDFILE }; + // clang-format on explicit CDVDMsg(Message msg) { diff -Nru kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp --- kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/VideoPlayerAudio.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -413,8 +413,11 @@ { onlyPrioMsgs = true; } - - } // demuxer packet + } + else if (pMsg->IsType(CDVDMsg::PLAYER_DISPLAY_RESET)) + { + m_displayReset = true; + } pMsg->Release(); } @@ -469,6 +472,17 @@ } } + // Display reset event has occurred + // See if we should enable passthrough + if (m_displayReset) + { + if (SwitchCodecIfNeeded()) + { + audioframe.nb_frames = 0; + return false; + } + } + // demuxer reads metatags that influence channel layout if (m_streaminfo.codec == AV_CODEC_ID_FLAC && m_streaminfo.channellayout) audioframe.format.m_channelLayout = CAEUtil::GetAEChannelLayout(m_streaminfo.channellayout); @@ -605,7 +619,13 @@ bool CVideoPlayerAudio::SwitchCodecIfNeeded() { - CLog::Log(LOGDEBUG, "CVideoPlayerAudio: stream props changed, checking for passthrough"); + if (m_displayReset) + CLog::Log(LOGINFO, "CVideoPlayerAudio: display reset occurred, checking for passthrough"); + else + CLog::Log(LOGDEBUG, "CVideoPlayerAudio: stream props changed, checking for passthrough"); + + m_displayReset = false; + bool allowpassthrough = !CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_VIDEOPLAYER_USEDISPLAYASCLOCK); if (m_processInfo.IsRealtimeStream() || m_synctype == SYNC_RESAMPLE) allowpassthrough = false; diff -Nru kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/VideoPlayerAudio.h kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/VideoPlayerAudio.h --- kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/VideoPlayerAudio.h 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/VideoPlayerAudio.h 2021-10-06 08:49:25.000000000 +0000 @@ -104,5 +104,7 @@ mutable CCriticalSection m_info_section; SInfo m_info; + + bool m_displayReset = false; }; diff -Nru kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/VideoPlayer.cpp kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/VideoPlayer.cpp --- kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/VideoPlayer.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/VideoPlayer.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -4914,6 +4914,7 @@ m_VideoPlayerVideo->SendMessage(new CDVDMsgBool(CDVDMsg::GENERAL_PAUSE, false), 1); m_clock.Pause(false); m_displayLost = false; + m_VideoPlayerAudio->SendMessage(new CDVDMsg(CDVDMsg::PLAYER_DISPLAY_RESET), 1); } void CVideoPlayer::UpdateFileItemStreamDetails(CFileItem& item) diff -Nru kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.cpp kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.cpp --- kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -201,20 +201,30 @@ } } - // Check if HLG color space conversion is supported by driver ComPtr<ID3D11VideoProcessorEnumerator1> pEnumerator1; if (SUCCEEDED(m_pEnumerator.As(&pEnumerator1))) { DXGI_FORMAT format = DX::Windowing()->GetBackBuffer().GetFormat(); BOOL supported = 0; - HRESULT hr = pEnumerator1->CheckVideoProcessorFormatConversion( + HRESULT hr; + + // Check if HLG color space conversion is supported by driver + hr = pEnumerator1->CheckVideoProcessorFormatConversion( DXGI_FORMAT_P010, DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_TOPLEFT_P2020, format, DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709, &supported); m_bSupportHLG = SUCCEEDED(hr) && !!supported; + + // Check if HDR10 RGB limited range output is supported by driver + hr = pEnumerator1->CheckVideoProcessorFormatConversion( + DXGI_FORMAT_P010, DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020, format, + DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020, &supported); + m_bSupportHDR10Limited = SUCCEEDED(hr) && !!supported; } CLog::LogF(LOGDEBUG, "HLG color space conversion is{}supported.", m_bSupportHLG ? " " : " NOT "); + CLog::LogF(LOGDEBUG, "HDR10 RGB limited range output is{}supported.", + m_bSupportHDR10Limited ? " " : " NOT "); return true; } @@ -406,7 +416,7 @@ return DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709; } -DXGI_COLOR_SPACE_TYPE CProcessorHD::GetDXGIColorSpaceTarget(CRenderBuffer* view) +DXGI_COLOR_SPACE_TYPE CProcessorHD::GetDXGIColorSpaceTarget(CRenderBuffer* view, bool supportHDR) { DXGI_COLOR_SPACE_TYPE color; @@ -420,8 +430,16 @@ if (view->primaries == AVCOL_PRI_BT2020 && (view->color_transfer == AVCOL_TRC_SMPTE2084 || view->color_transfer == AVCOL_TRC_ARIB_STD_B67)) { - color = DX::Windowing()->UseLimitedColor() ? DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020 - : DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020; + if (supportHDR) + { + color = DX::Windowing()->UseLimitedColor() ? DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020 + : DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020; + } + else + { + color = DX::Windowing()->UseLimitedColor() ? DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020 + : DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020; + } } return color; @@ -534,9 +552,12 @@ ComPtr<ID3D11VideoContext1> videoCtx1; if (SUCCEEDED(m_pVideoContext.As(&videoCtx1))) { + bool supportHDR = DX::Windowing()->IsHDROutput() && + (m_bSupportHDR10Limited || !DX::Windowing()->UseLimitedColor()); + const DXGI_COLOR_SPACE_TYPE sourceColor = - GetDXGIColorSpaceSource(views[2], DX::Windowing()->IsHDROutput(), m_bSupportHLG); - const DXGI_COLOR_SPACE_TYPE targetColor = GetDXGIColorSpaceTarget(views[2]); + GetDXGIColorSpaceSource(views[2], supportHDR, m_bSupportHLG); + const DXGI_COLOR_SPACE_TYPE targetColor = GetDXGIColorSpaceTarget(views[2], supportHDR); videoCtx1->VideoProcessorSetStreamColorSpace1(m_pVideoProcessor.Get(), DEFAULT_STREAM_INDEX, sourceColor); diff -Nru kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.h kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.h --- kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.h 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.h 2021-10-06 08:49:25.000000000 +0000 @@ -49,7 +49,7 @@ void OnDestroyDevice(bool) override { CSingleLock lock(m_section); UnInit(); } static DXGI_COLOR_SPACE_TYPE GetDXGIColorSpaceSource(CRenderBuffer* view, bool supportHDR, bool supportHLG); - static DXGI_COLOR_SPACE_TYPE GetDXGIColorSpaceTarget(CRenderBuffer* view); + static DXGI_COLOR_SPACE_TYPE GetDXGIColorSpaceTarget(CRenderBuffer* view, bool supportHDR); protected: bool ReInit(); @@ -69,6 +69,7 @@ D3D11_VIDEO_PROCESSOR_CAPS m_vcaps = {}; D3D11_VIDEO_PROCESSOR_RATE_CONVERSION_CAPS m_rateCaps = {}; bool m_bSupportHLG = false; + bool m_bSupportHDR10Limited = false; struct ProcAmpInfo { diff -Nru kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/YUV2RGBShaderGL.cpp kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/YUV2RGBShaderGL.cpp --- kodi-19.1+dfsg2/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/YUV2RGBShaderGL.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/YUV2RGBShaderGL.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -360,6 +360,7 @@ glBindTexture(GL_TEXTURE_1D, m_kernelTex); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); GLvoid* data = (GLvoid*)kernel.GetFloatPixels(); glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA32F, kernel.GetSize(), 0, GL_RGBA, GL_FLOAT, data); diff -Nru kodi-19.1+dfsg2/xbmc/dialogs/GUIDialogVolumeBar.cpp kodi-19.2+dfsg1/xbmc/dialogs/GUIDialogVolumeBar.cpp --- kodi-19.1+dfsg2/xbmc/dialogs/GUIDialogVolumeBar.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/dialogs/GUIDialogVolumeBar.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -30,13 +30,13 @@ if (g_application.IsMuted() || g_application.GetVolumeRatio() <= VOLUME_MINIMUM) { // cancel the timer, dialog needs to stay visible CancelAutoClose(); - return true; } else { // reset the timer, as we've changed the volume level SetAutoClose(VOLUME_BAR_DISPLAY_TIME); - return true; } + MarkDirtyRegion(); + return true; } return CGUIDialog::OnAction(action); } diff -Nru kodi-19.1+dfsg2/xbmc/FileItem.cpp kodi-19.2+dfsg1/xbmc/FileItem.cpp --- kodi-19.1+dfsg2/xbmc/FileItem.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/FileItem.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -169,6 +169,10 @@ SetArt("icon", tag->Icon()); else if (channel && !channel->IconPath().empty()) SetArt("icon", channel->IconPath()); + else if (tag->IsRadio()) + SetArt("icon", "DefaultMusicSongs.png"); + else + SetArt("icon", "DefaultTVShows.png"); FillMusicInfoTag(channel, tag); FillInMimeType(false); @@ -188,7 +192,7 @@ if (!channel->IconPath().empty()) SetArt("icon", channel->IconPath()); else if (channel->IsRadio()) - SetArt("icon", "DefaultAudio.png"); + SetArt("icon", "DefaultMusicSongs.png"); else SetArt("icon", "DefaultTVShows.png"); @@ -213,8 +217,16 @@ // Set art if (!record->m_strIconPath.empty()) - { SetArt("icon", record->m_strIconPath); + else + { + const std::shared_ptr<CPVRChannel> channel = record->Channel(); + if (channel && !channel->IconPath().empty()) + SetArt("icon", channel->IconPath()); + else if (record->IsRadio()) + SetArt("icon", "DefaultMusicSongs.png"); + else + SetArt("icon", "DefaultTVShows.png"); } if (!record->m_strThumbnailPath.empty()) @@ -238,6 +250,10 @@ if (!timer->ChannelIcon().empty()) SetArt("icon", timer->ChannelIcon()); + else if (timer->m_bIsRadio) + SetArt("icon", "DefaultMusicSongs.png"); + else + SetArt("icon", "DefaultTVShows.png"); FillInMimeType(false); } @@ -1337,7 +1353,7 @@ if (IsPVRChannel()) { if (GetPVRChannelInfoTag()->IsRadio()) - SetArt("icon", "DefaultAudio.png"); + SetArt("icon", "DefaultMusicSongs.png"); else SetArt("icon", "DefaultTVShows.png"); } diff -Nru kodi-19.1+dfsg2/xbmc/filesystem/CurlFile.cpp kodi-19.2+dfsg1/xbmc/filesystem/CurlFile.cpp --- kodi-19.1+dfsg2/xbmc/filesystem/CurlFile.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/filesystem/CurlFile.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -670,9 +670,12 @@ // set CA bundle file std::string caCert = CSpecialProtocol::TranslatePath( CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_caTrustFile); +#ifdef TARGET_WINDOWS_STORE + // UWP Curl - Setting CURLOPT_CAINFO with a valid cacert file path is required for UWP + g_curlInterface.easy_setopt(h, CURLOPT_CAINFO, "system\\certs\\cacert.pem"); +#endif if (!caCert.empty() && XFILE::CFile::Exists(caCert)) g_curlInterface.easy_setopt(h, CURLOPT_CAINFO, caCert.c_str()); - } void CCurlFile::SetRequestHeaders(CReadState* state) diff -Nru kodi-19.1+dfsg2/xbmc/guilib/GUIBaseContainer.cpp kodi-19.2+dfsg1/xbmc/guilib/GUIBaseContainer.cpp --- kodi-19.1+dfsg2/xbmc/guilib/GUIBaseContainer.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/guilib/GUIBaseContainer.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -753,7 +753,6 @@ const int absCursor = CorrectOffset(GetOffset(), GetCursor()); SetOffset(offset); ValidateOffset(); - CGUIBaseContainer::SetCursor(absCursor - CorrectOffset(GetOffset(), 0)); // Notify Application if Inertial scrolling reaches lists end if (m_waitForScrollEnd) { @@ -765,6 +764,10 @@ else m_lastScrollValue = m_scroller.GetValue(); } + else + { + CGUIBaseContainer::SetCursor(absCursor - CorrectOffset(GetOffset(), 0)); + } return EVENT_RESULT_HANDLED; } else if (event.m_id == ACTION_GESTURE_END || event.m_id == ACTION_GESTURE_ABORT) diff -Nru kodi-19.1+dfsg2/xbmc/guilib/guiinfo/MusicGUIInfo.cpp kodi-19.2+dfsg1/xbmc/guilib/guiinfo/MusicGUIInfo.cpp --- kodi-19.1+dfsg2/xbmc/guilib/guiinfo/MusicGUIInfo.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/guilib/guiinfo/MusicGUIInfo.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -387,6 +387,13 @@ value = CURL(value).GetWithoutUserDetails(); return true; + case LISTITEM_DATE_ADDED: + if (tag->GetDateAdded().IsValid()) + { + value = tag->GetDateAdded().GetAsLocalizedDate(); + return true; + } + break; } } diff -Nru kodi-19.1+dfsg2/xbmc/interfaces/json-rpc/AudioLibrary.cpp kodi-19.2+dfsg1/xbmc/interfaces/json-rpc/AudioLibrary.cpp --- kodi-19.1+dfsg2/xbmc/interfaces/json-rpc/AudioLibrary.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/interfaces/json-rpc/AudioLibrary.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -1040,9 +1040,11 @@ else { cmd = "exportlibrary2(music, library, dummy, albums, albumartists"; - if (parameterObject["options"].asBoolean("images")) + if (parameterObject["options"]["images"].isBoolean() && + parameterObject["options"]["images"].asBoolean() == true) cmd += ", artwork"; - if (parameterObject["options"].asBoolean("overwrite")) + if (parameterObject["options"]["overwrite"].isBoolean() && + parameterObject["options"]["overwrite"].asBoolean() == true) cmd += ", overwrite"; cmd += ")"; } diff -Nru kodi-19.1+dfsg2/xbmc/interfaces/json-rpc/schema/types.json kodi-19.2+dfsg1/xbmc/interfaces/json-rpc/schema/types.json --- kodi-19.1+dfsg2/xbmc/interfaces/json-rpc/schema/types.json 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/interfaces/json-rpc/schema/types.json 2021-10-06 08:49:25.000000000 +0000 @@ -1019,7 +1019,7 @@ "wasactive", "thumbnail", "rating", "originaltitle", "cast", "director", "writer", "year", "imdbnumber", "hastimerrule", "hasrecording", "recording", "isseries", "isplayable", "clientid", - "hasreminder" ] + "hasreminder", "seasonnum" ] } }, "PVR.Details.Broadcast": { @@ -1057,7 +1057,8 @@ "isseries": { "type": "boolean" }, "isplayable": { "type": "boolean", "description": "Deprecated - Use GetBroadcastIsPlayable instead" }, "clientid": { "$ref": "Library.Id" }, - "hasreminder": { "type": "boolean" } + "hasreminder": { "type": "boolean" }, + "seasonnum": { "type": "integer" } } }, "PVR.Fields.Channel": { diff -Nru kodi-19.1+dfsg2/xbmc/interfaces/json-rpc/schema/version.txt kodi-19.2+dfsg1/xbmc/interfaces/json-rpc/schema/version.txt --- kodi-19.1+dfsg2/xbmc/interfaces/json-rpc/schema/version.txt 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/interfaces/json-rpc/schema/version.txt 2021-10-06 08:49:25.000000000 +0000 @@ -1 +1 @@ -JSONRPC_VERSION 12.3.0 +JSONRPC_VERSION 12.4.0 diff -Nru kodi-19.1+dfsg2/xbmc/interfaces/json-rpc/VideoLibrary.cpp kodi-19.2+dfsg1/xbmc/interfaces/json-rpc/VideoLibrary.cpp --- kodi-19.1+dfsg2/xbmc/interfaces/json-rpc/VideoLibrary.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/interfaces/json-rpc/VideoLibrary.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -966,11 +966,14 @@ else { cmd = "exportlibrary2(video, separate, dummy"; - if (parameterObject["options"].asBoolean("images")) + if (parameterObject["options"]["images"].isBoolean() && + parameterObject["options"]["images"].asBoolean() == true) cmd += ", artwork"; - if (parameterObject["options"].asBoolean("overwrite")) + if (parameterObject["options"]["overwrite"].isBoolean() && + parameterObject["options"]["overwrite"].asBoolean() == true) cmd += ", overwrite"; - if (parameterObject["options"].asBoolean("actorthumbs")) + if (parameterObject["options"]["actorthumbs"].isBoolean() && + parameterObject["options"]["actorthumbs"].asBoolean() == true) cmd += ", actorthumbs"; cmd += ")"; } diff -Nru kodi-19.1+dfsg2/xbmc/interfaces/python/AddonPythonInvoker.cpp kodi-19.2+dfsg1/xbmc/interfaces/python/AddonPythonInvoker.cpp --- kodi-19.1+dfsg2/xbmc/interfaces/python/AddonPythonInvoker.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/interfaces/python/AddonPythonInvoker.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -46,6 +46,12 @@ "sys.modules['pkg_resources'] = pkg_resources\n" \ "" +#define RUNSCRIPT_SETUP_ENVIROMENT_VARIABLES \ + "" \ + "from os import environ\n" \ + "environ['SSL_CERT_FILE'] = 'system/certs/cacert.pem'\n" \ + "" + #define RUNSCRIPT_POSTSCRIPT \ "print('-->Python Interpreter Initialized<--')\n" \ "" @@ -55,6 +61,11 @@ #define RUNSCRIPT_COMPLIANT \ RUNSCRIPT_PREAMBLE RUNSCRIPT_SETUPTOOLS_HACK RUNSCRIPT_POSTSCRIPT +#elif defined(TARGET_WINDOWS_STORE) + +#define RUNSCRIPT_COMPLIANT \ + RUNSCRIPT_PREAMBLE RUNSCRIPT_SETUP_ENVIROMENT_VARIABLES RUNSCRIPT_POSTSCRIPT + #else #define RUNSCRIPT_COMPLIANT \ diff -Nru kodi-19.1+dfsg2/xbmc/interfaces/python/XBPython.cpp kodi-19.2+dfsg1/xbmc/interfaces/python/XBPython.cpp --- kodi-19.1+dfsg2/xbmc/interfaces/python/XBPython.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/interfaces/python/XBPython.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -502,8 +502,12 @@ CEnvironment::putenv(buf); buf = "PYTHONOPTIMIZE=1"; CEnvironment::putenv(buf); - buf = "OS=win32"; - CEnvironment::putenv(buf); + +#ifdef TARGET_WINDOWS_STORE + CEnvironment::putenv("OS=win10"); +#else + CEnvironment::putenv("OS=win32"); +#endif std::wstring pythonHomeW; CCharsetConverter::utf8ToW(CSpecialProtocol::TranslatePath("special://xbmc/system/python"), diff -Nru kodi-19.1+dfsg2/xbmc/interfaces/swig/CMakeLists.txt kodi-19.2+dfsg1/xbmc/interfaces/swig/CMakeLists.txt --- kodi-19.1+dfsg2/xbmc/interfaces/swig/CMakeLists.txt 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/interfaces/swig/CMakeLists.txt 2021-10-06 08:49:25.000000000 +0000 @@ -14,11 +14,16 @@ if(CLANGFORMAT_FOUND) set(CLANG_FORMAT_COMMAND COMMAND ${CLANG_FORMAT_EXECUTABLE} ARGS -i ${CPP_FILE}) endif() + + if(Java_VERSION_MAJOR GREATER 8) + set(JAVA_OPEN_OPTS --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.regex=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED) + endif() + add_custom_command(OUTPUT ${CPP_FILE} COMMAND ${SWIG_EXECUTABLE} ARGS -w401 -c++ -o ${file}.xml -xml -I${CMAKE_SOURCE_DIR}/xbmc -xmllang python ${CMAKE_CURRENT_SOURCE_DIR}/../swig/${file} COMMAND ${Java_JAVA_EXECUTABLE} - ARGS -cp "${classpath}" groovy.ui.GroovyMain ${CMAKE_SOURCE_DIR}/tools/codegenerator/Generator.groovy ${file}.xml ${CMAKE_CURRENT_SOURCE_DIR}/../python/PythonSwig.cpp.template ${file}.cpp > ${devnull} + ARGS ${JAVA_OPEN_OPTS} -cp "${classpath}" groovy.ui.GroovyMain ${CMAKE_SOURCE_DIR}/tools/codegenerator/Generator.groovy ${file}.xml ${CMAKE_CURRENT_SOURCE_DIR}/../python/PythonSwig.cpp.template ${file}.cpp > ${devnull} ${CLANG_FORMAT_COMMAND} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../swig/${file} ${CMAKE_CURRENT_SOURCE_DIR}/../python/PythonSwig.cpp.template) set(SOURCES ${SOURCES} "${CPP_FILE}" PARENT_SCOPE) diff -Nru kodi-19.1+dfsg2/xbmc/LangInfo.cpp kodi-19.2+dfsg1/xbmc/LangInfo.cpp --- kodi-19.1+dfsg2/xbmc/LangInfo.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/LangInfo.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -979,6 +979,18 @@ m_currentRegion->SetGlobalLocale(); + // Check if locale is affected by "Turkish I" + // See https://github.com/xbmc/xbmc/issues/19883 for details + if (std::tolower('i') != std::tolower('I')) + { + CLog::Log( + LOGWARNING, + "region '{}' is affected by 'Turkish I' problem - falling back to default region '{}'", + m_currentRegion->m_strName, m_defaultRegion.m_strName); + m_currentRegion = &m_defaultRegion; + m_currentRegion->SetGlobalLocale(); + } + const std::shared_ptr<CSettings> settings = CServiceBroker::GetSettingsComponent()->GetSettings(); if (settings->GetString(CSettings::SETTING_LOCALE_SHORTDATEFORMAT) == SETTING_REGIONAL_DEFAULT) SetShortDateFormat(m_currentRegion->m_strDateFormatShort); diff -Nru kodi-19.1+dfsg2/xbmc/music/MusicDatabase.cpp kodi-19.2+dfsg1/xbmc/music/MusicDatabase.cpp --- kodi-19.1+dfsg2/xbmc/music/MusicDatabase.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/music/MusicDatabase.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -2096,58 +2096,67 @@ but SQLite not support updatable joins. */ m_pDS->exec("CREATE TABLE tempDisco " - "(strAlbum TEXT, iYear INTEGER, mbid TEXT, idAlbum INTEGER)"); + "(strAlbum TEXT, strYear VARCHAR(4), mbid TEXT, idAlbum INTEGER)"); + m_pDS->exec("CREATE TABLE tempAlbum " + "(strAlbum TEXT, strYear VARCHAR(4), mbid TEXT, idAlbum INTEGER)"); std::string strSQL; - strSQL = PrepareSQL("INSERT INTO tempDisco(strAlbum, iYear, mbid, idAlbum) " - "SELECT strAlbum, CAST(discography.strYear AS INTEGER) AS iYear, " + strSQL = PrepareSQL("INSERT INTO tempDisco(strAlbum, strYear, mbid, idAlbum) " + "SELECT strAlbum, SUBSTR(discography.strYear, 1, 4) AS strYear, " "strReleaseGroupMBID, NULL " "FROM discography WHERE idArtist = %i", idArtist); m_pDS->exec(strSQL); + strSQL = PrepareSQL("INSERT INTO tempAlbum(strAlbum, strYear, mbid, idAlbum) " + "SELECT strAlbum, SUBSTR(strOrigReleaseDate, 1, 4) AS strYear, " + "strReleaseGroupMBID, album.idAlbum " + "FROM album JOIN album_artist ON album_artist.idAlbum = album.idAlbum " + "WHERE idArtist = %i", + idArtist); + m_pDS->exec(strSQL); + // Match albums on release group mbid, if multi-releases then first used - strSQL = "UPDATE tempDisco SET idAlbum = (SELECT album.idAlbum FROM album " - "WHERE album.strReleaseGroupMBID = tempDisco.mbid " - "AND album.strReleaseGroupMBID IS NOT NULL)"; + // Only use albums credited to this artist + strSQL = "UPDATE tempDisco SET idAlbum = (SELECT tempAlbum.idAlbum FROM tempAlbum " + "WHERE tempAlbum.mbid = tempDisco.mbid AND tempAlbum.mbid IS NOT NULL)"; + m_pDS->exec(strSQL); + //Delete matched albums + strSQL = "DELETE FROM tempAlbum " + "WHERE EXISTS(SELECT 1 FROM tempDisco WHERE tempDisco.idAlbum = tempAlbum.idAlbum)"; m_pDS->exec(strSQL); + // Match remaining to albums by artist on title and year - strSQL = PrepareSQL("UPDATE tempDisco SET idAlbum = (SELECT album.idAlbum FROM album " - "JOIN album_artist ON album_artist.idAlbum = album.idAlbum " - "WHERE album_artist.idArtist = %i " - "AND NOT EXISTS(SELECT 1 FROM tempDisco AS td " - "WHERE td.idAlbum = album.idAlbum) " - "AND CAST(strOrigReleaseDate AS INTEGER) = tempDisco.iYear " - "AND album.strAlbum = tempDisco.strAlbum) " - "WHERE tempDisco.idAlbum is NULL", - idArtist); + strSQL = "UPDATE tempDisco SET idAlbum = (SELECT idAlbum FROM tempAlbum " + "WHERE tempAlbum.strAlbum = tempDisco.strAlbum " + "AND tempAlbum.strYear = tempDisco.strYear) " + "WHERE tempDisco.idAlbum is NULL"; m_pDS->exec(strSQL); + //Delete matched albums + strSQL = "DELETE FROM tempAlbum " + "WHERE EXISTS(SELECT 1 FROM tempDisco WHERE tempDisco.idAlbum = tempAlbum.idAlbum)"; + m_pDS->exec(strSQL); + // Match remaining to albums by artist on title only - strSQL = PrepareSQL("UPDATE tempDisco SET idAlbum = (SELECT album.idAlbum FROM album " - "JOIN album_artist ON album_artist.idAlbum = album.idAlbum " - "WHERE album_artist.idArtist = %i " - "AND NOT EXISTS(SELECT 1 FROM tempDisco AS td " - "WHERE td.idAlbum = album.idAlbum) " - "AND album.strAlbum = tempDisco.strAlbum) " - "WHERE tempDisco.idAlbum is NULL", - idArtist); + strSQL = "UPDATE tempDisco SET idAlbum = (SELECT idAlbum FROM tempAlbum " + "WHERE tempAlbum.strAlbum = tempDisco.strAlbum) " + "WHERE tempDisco.idAlbum is NULL"; + m_pDS->exec(strSQL); + // Use year from album table, when matched by title only as it could be different + strSQL = "UPDATE tempDisco SET strYear = (SELECT strYear FROM tempAlbum " + "WHERE tempAlbum.idAlbum = tempDisco.idAlbum) " + "WHERE EXISTS(SELECT 1 FROM tempAlbum WHERE tempAlbum.idAlbum = tempDisco.idAlbum)"; m_pDS->exec(strSQL); - // Use year from album table, when matched by name only it could be different - strSQL = PrepareSQL("UPDATE tempDisco " - "SET iYear = (SELECT CAST(album.strOrigReleaseDate AS INTEGER) FROM album " - "WHERE album.idAlbum = tempDisco.idAlbum) " - "WHERE tempDisco.idAlbum > 0"); + //Delete matched albums + strSQL = "DELETE FROM tempAlbum " + "WHERE EXISTS(SELECT 1 FROM tempDisco WHERE tempDisco.idAlbum = tempAlbum.idAlbum)"; m_pDS->exec(strSQL); - // Combine distinctly with albums by artist that are not in discography - strSQL = - PrepareSQL("SELECT strAlbum, iYear, idAlbum FROM tempDisco " - "UNION " - "SELECT strAlbum, CAST(strOrigReleaseDate AS INTEGER) AS iYear, album.idAlbum " - "FROM album JOIN album_artist ON album_artist.idAlbum = album.idAlbum " - "WHERE album_artist.idArtist = %i " - "ORDER BY iYear, strAlbum, idAlbum", - idArtist); + // Combine distinctly with any remaining unmatched albums by artist + strSQL = "SELECT strAlbum, strYear, idAlbum FROM tempDisco " + "UNION " + "SELECT strAlbum, strYear, idAlbum FROM tempAlbum " + "ORDER BY strYear, strAlbum, idAlbum"; if (!m_pDS->query(strSQL)) return false; @@ -2167,7 +2176,7 @@ if (!strAlbum.empty()) { CFileItemPtr pItem(new CFileItem(strAlbum)); - pItem->SetLabel2(m_pDS->fv("iYear").get_asString()); + pItem->SetLabel2(m_pDS->fv("strYear").get_asString()); pItem->GetMusicInfoTag()->SetDatabaseId(idAlbum, MediaTypeAlbum); items.Add(pItem); } @@ -2177,12 +2186,14 @@ // cleanup m_pDS->close(); m_pDS->exec("DROP TABLE tempDisco"); + m_pDS->exec("DROP TABLE tempAlbum"); return true; } catch (...) { m_pDS->exec("DROP TABLE tempDisco"); + m_pDS->exec("DROP TABLE tempAlbum"); CLog::Log(LOGERROR, "%s failed", __FUNCTION__); } return false; @@ -5547,7 +5558,7 @@ items.Reserve(total); int albumOffset = 2; CAlbum album; - bool useTitle = false; + bool useTitle = true; // Assume we want to match by disc title later unless we have no titles std::string oldDiscTitle; const dbiplus::query_data& data = m_pDS->get_result_set().records; for (const auto& i : results) @@ -5558,23 +5569,22 @@ { if (album.idAlbum != record->at(albumOffset + album_idAlbum).get_asInt()) { // New album - useTitle = false; + useTitle = true; album = GetAlbumFromDataset(record, albumOffset); } int discnum = record->at(0).get_asInt(); std::string strDiscSubtitle = record->at(1).get_asString(); if (strDiscSubtitle.empty()) - // Make (fake) disc title from disc number - strDiscSubtitle = StringUtils::Format("%s %i", g_localizeStrings.Get(427), discnum); + { // Make (fake) disc title from disc number, group by disc number as no real title to match + strDiscSubtitle = StringUtils::Format("{} {}", g_localizeStrings.Get(427), discnum); + useTitle = false; + } else if (oldDiscTitle == strDiscSubtitle) - { // When real disc titles are provided (as they ALWAYS are for boxed sets) - // group discs together by title not number. - useTitle = true; + { // disc title already added to list, fetch the next disc continue; } - else - oldDiscTitle = strDiscSubtitle; + oldDiscTitle = strDiscSubtitle; CMusicDbUrl itemUrl = musicUrl; std::string path = StringUtils::Format("%i/", discnum); diff -Nru kodi-19.1+dfsg2/xbmc/network/TCPServer.cpp kodi-19.2+dfsg1/xbmc/network/TCPServer.cpp --- kodi-19.1+dfsg2/xbmc/network/TCPServer.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/network/TCPServer.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -48,7 +48,12 @@ using namespace JSONRPC; -#define RECEIVEBUFFER 1024 +#define RECEIVEBUFFER 4096 + +namespace +{ +constexpr size_t maxBufferLength = 64 * 1024; +} CTCPServer *CTCPServer::ServerInstance = NULL; @@ -637,11 +642,13 @@ CTCPServer::CWebSocketClient::CWebSocketClient(CWebSocket *websocket) { m_websocket = websocket; + m_buffer.reserve(maxBufferLength); } CTCPServer::CWebSocketClient::CWebSocketClient(const CWebSocketClient& client) { *this = client; + m_buffer.reserve(maxBufferLength); } CTCPServer::CWebSocketClient::CWebSocketClient(CWebSocket *websocket, const CTCPClient& client) @@ -649,6 +656,7 @@ Copy(client); m_websocket = websocket; + m_buffer.reserve(maxBufferLength); } CTCPServer::CWebSocketClient::~CWebSocketClient() @@ -661,6 +669,7 @@ Copy(client); m_websocket = client.m_websocket; + m_buffer = client.m_buffer; return *this; } @@ -680,10 +689,21 @@ { bool send; const CWebSocketMessage *msg = NULL; - size_t len = length; + + if (m_buffer.size() + length > maxBufferLength) + { + CLog::Log(LOGINFO, "WebSocket: client buffer size {} exceeded", maxBufferLength); + return Disconnect(); + } + + m_buffer.append(buffer, length); + + const char* buf = m_buffer.data(); + size_t len = m_buffer.size(); + do { - if ((msg = m_websocket->Handle(buffer, len, send)) != NULL && msg->IsComplete()) + if ((msg = m_websocket->Handle(buf, len, send)) != NULL && msg->IsComplete()) { std::vector<const CWebSocketFrame *> frames = msg->GetFrames(); if (send) @@ -702,6 +722,9 @@ } while (len > 0 && msg != NULL); + if (len < m_buffer.size()) + m_buffer = m_buffer.substr(m_buffer.size() - len); + if (m_websocket->GetState() == WebSocketStateClosed) Disconnect(); } @@ -721,4 +744,3 @@ CTCPClient::Disconnect(); } } - diff -Nru kodi-19.1+dfsg2/xbmc/network/TCPServer.h kodi-19.2+dfsg1/xbmc/network/TCPServer.h --- kodi-19.1+dfsg2/xbmc/network/TCPServer.h 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/network/TCPServer.h 2021-10-06 08:49:25.000000000 +0000 @@ -104,6 +104,7 @@ private: CWebSocket *m_websocket; + std::string m_buffer; }; std::vector<CTCPClient*> m_connections; diff -Nru kodi-19.1+dfsg2/xbmc/platform/linux/MemUtils.cpp kodi-19.2+dfsg1/xbmc/platform/linux/MemUtils.cpp --- kodi-19.1+dfsg2/xbmc/platform/linux/MemUtils.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/platform/linux/MemUtils.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -18,7 +18,9 @@ void* AlignedMalloc(size_t s, size_t alignTo) { - return aligned_alloc(alignTo, s); + void* p = nullptr; + posix_memalign(&p, alignTo, s); + return p; } void AlignedFree(void* p) diff -Nru kodi-19.1+dfsg2/xbmc/pvr/addons/PVRClient.cpp kodi-19.2+dfsg1/xbmc/pvr/addons/PVRClient.cpp --- kodi-19.1+dfsg2/xbmc/pvr/addons/PVRClient.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/pvr/addons/PVRClient.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -222,6 +222,13 @@ void CPVRClient::SetConnectionState(PVR_CONNECTION_STATE state) { + if (state == PVR_CONNECTION_STATE_CONNECTED) + { + // update properties - some will only be available after add-on is connected to backend + if (!GetAddonProperties()) + CLog::LogF(LOGERROR, "Error reading PVR client properties"); + } + CSingleLock lock(m_critSection); m_prevConnectionState = m_connectionState; @@ -231,7 +238,7 @@ m_ignoreClient = false; else if (m_connectionState == PVR_CONNECTION_STATE_CONNECTING && m_prevConnectionState == PVR_CONNECTION_STATE_UNKNOWN) - m_ignoreClient = true; + m_ignoreClient = true; // ignore until connected } PVR_CONNECTION_STATE CPVRClient::GetPreviousConnectionState() const @@ -1376,7 +1383,7 @@ if (m_bBlockAddonCalls) return PVR_ERROR_SERVER_ERROR; - if (!m_bReadyToUse && bCheckReadyToUse) + if (bCheckReadyToUse && (!ReadyToUse() || IgnoreClient())) return PVR_ERROR_SERVER_ERROR; // Call. diff -Nru kodi-19.1+dfsg2/xbmc/pvr/addons/PVRClient.h kodi-19.2+dfsg1/xbmc/pvr/addons/PVRClient.h --- kodi-19.1+dfsg2/xbmc/pvr/addons/PVRClient.h 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/pvr/addons/PVRClient.h 2021-10-06 08:49:25.000000000 +0000 @@ -915,12 +915,6 @@ PVR_ERROR GetStreamTimes(PVR_STREAM_TIMES* times); /*! - * @brief reads the client's properties. - * @return True on success, false otherwise. - */ - bool GetAddonProperties(); - - /*! * @brief Get the client's menu hooks. * @return The hooks. Guaranteed never to be nullptr. */ @@ -1012,6 +1006,12 @@ void ResetProperties(int iClientId = PVR_INVALID_CLIENT_ID); /*! + * @brief reads the client's properties. + * @return True on success, false otherwise. + */ + bool GetAddonProperties(); + + /*! * @brief Copy over group info from xbmcGroup to addonGroup. * @param xbmcGroup The group on XBMC's side. * @param addonGroup The group on the addon's side. diff -Nru kodi-19.1+dfsg2/xbmc/pvr/addons/PVRClientMenuHooks.cpp kodi-19.2+dfsg1/xbmc/pvr/addons/PVRClientMenuHooks.cpp --- kodi-19.1+dfsg2/xbmc/pvr/addons/PVRClientMenuHooks.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/pvr/addons/PVRClientMenuHooks.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -77,6 +77,11 @@ return m_hook->category == PVR_MENUHOOK_SETTING; } +std::string CPVRClientMenuHook::GetAddonId() const +{ + return m_addonId; +} + unsigned int CPVRClientMenuHook::GetId() const { return m_hook->iHookId; diff -Nru kodi-19.1+dfsg2/xbmc/pvr/addons/PVRClientMenuHooks.h kodi-19.2+dfsg1/xbmc/pvr/addons/PVRClientMenuHooks.h --- kodi-19.1+dfsg2/xbmc/pvr/addons/PVRClientMenuHooks.h 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/pvr/addons/PVRClientMenuHooks.h 2021-10-06 08:49:25.000000000 +0000 @@ -35,6 +35,7 @@ bool IsDeletedRecordingHook() const; bool IsSettingsHook() const; + std::string GetAddonId() const; unsigned int GetId() const; unsigned int GetLabelId() const; std::string GetLabel() const; diff -Nru kodi-19.1+dfsg2/xbmc/pvr/addons/PVRClients.cpp kodi-19.2+dfsg1/xbmc/pvr/addons/PVRClients.cpp --- kodi-19.1+dfsg2/xbmc/pvr/addons/PVRClients.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/pvr/addons/PVRClients.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -717,15 +717,6 @@ // Notify user. CJobManager::GetInstance().AddJob(new CPVREventLogJob(bNotify, bError, client->Name(), strMsg, client->Icon()), nullptr); - - if (newState == PVR_CONNECTION_STATE_CONNECTED) - { - // update properties on connect - if (!client->GetAddonProperties()) - CLog::LogF(LOGERROR, "Error reading PVR client properties"); - - CServiceBroker::GetPVRManager().Start(); - } } PVR_ERROR CPVRClients::ForCreatedClients(const char* strFunctionName, diff -Nru kodi-19.1+dfsg2/xbmc/pvr/dialogs/GUIDialogPVRGuideSearch.cpp kodi-19.2+dfsg1/xbmc/pvr/dialogs/GUIDialogPVRGuideSearch.cpp --- kodi-19.1+dfsg2/xbmc/pvr/dialogs/GUIDialogPVRGuideSearch.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/pvr/dialogs/GUIDialogPVRGuideSearch.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -58,7 +58,10 @@ int iChannelGroup = GetSpinValue(CONTROL_SPIN_GROUPS); std::vector< std::pair<std::string, int> > labels; - labels.emplace_back(g_localizeStrings.Get(19217), EPG_SEARCH_UNSET); + if (m_searchFilter->IsRadio()) + labels.emplace_back(g_localizeStrings.Get(19216), EPG_SEARCH_UNSET); // All radio channels + else + labels.emplace_back(g_localizeStrings.Get(19217), EPG_SEARCH_UNSET); // All TV channels std::shared_ptr<CPVRChannelGroup> group; if (iChannelGroup == EPG_SEARCH_UNSET) diff -Nru kodi-19.1+dfsg2/xbmc/pvr/epg/EpgInfoTag.cpp kodi-19.2+dfsg1/xbmc/pvr/epg/EpgInfoTag.cpp --- kodi-19.1+dfsg2/xbmc/pvr/epg/EpgInfoTag.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/pvr/epg/EpgInfoTag.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -161,6 +161,7 @@ value["plotoutline"] = m_strPlotOutline; value["plot"] = m_strPlot; value["originaltitle"] = m_strOriginalTitle; + value["thumbnail"] = m_strIconPath; value["cast"] = DeTokenize(m_cast); value["director"] = DeTokenize(m_directors); value["writer"] = DeTokenize(m_writers); @@ -177,6 +178,7 @@ value["episodename"] = m_strEpisodeName; value["episodenum"] = m_iEpisodeNumber; value["episodepart"] = m_iEpisodePart; + value["seasonnum"] = m_iSeriesNumber; value["isactive"] = IsActive(); value["wasactive"] = WasActive(); value["isseries"] = IsSeries(); diff -Nru kodi-19.1+dfsg2/xbmc/pvr/epg/EpgTagsContainer.cpp kodi-19.2+dfsg1/xbmc/pvr/epg/EpgTagsContainer.cpp --- kodi-19.1+dfsg2/xbmc/pvr/epg/EpgTagsContainer.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/pvr/epg/EpgTagsContainer.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -600,7 +600,7 @@ if (m_database) { const CDateTime dbResult = m_database->GetLastEndTime(m_iEpgID); - if (result.IsValid() || (dbResult.IsValid() && dbResult > result)) + if (!result.IsValid() || (dbResult.IsValid() && dbResult > result)) result = dbResult; } diff -Nru kodi-19.1+dfsg2/xbmc/pvr/guilib/PVRGUIActions.cpp kodi-19.2+dfsg1/xbmc/pvr/guilib/PVRGUIActions.cpp --- kodi-19.1+dfsg2/xbmc/pvr/guilib/PVRGUIActions.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/pvr/guilib/PVRGUIActions.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -156,7 +156,7 @@ bool bReturn = true; for (const auto& itemToDelete : items) { - if (itemToDelete->IsUsablePVRRecording() && + if (itemToDelete->IsPVRRecording() && (!m_bWatchedOnly || itemToDelete->GetPVRRecordingInfoTag()->GetPlayCount() > 0)) bReturn &= itemToDelete->GetPVRRecordingInfoTag()->Delete(); } @@ -1514,7 +1514,12 @@ { CFileItemPtr pvrItem(item); if (URIUtils::IsPVRChannel(item->GetPath()) && !item->HasPVRChannelInfoTag()) - pvrItem = std::make_shared<CFileItem>(CServiceBroker::GetPVRManager().ChannelGroups()->GetByPath(item->GetPath())); + { + const std::shared_ptr<CPVRChannel> pvrChannel = + CServiceBroker::GetPVRManager().ChannelGroups()->GetByPath(item->GetPath()); + if (pvrChannel) + pvrItem = std::make_shared<CFileItem>(pvrChannel); + } else if (URIUtils::IsPVRRecording(item->GetPath()) && !item->HasPVRRecordingInfoTag()) pvrItem = std::make_shared<CFileItem>(CServiceBroker::GetPVRManager().Recordings()->GetByPath(item->GetPath())); diff -Nru kodi-19.1+dfsg2/xbmc/pvr/PVRContextMenus.cpp kodi-19.2+dfsg1/xbmc/pvr/PVRContextMenus.cpp --- kodi-19.1+dfsg2/xbmc/pvr/PVRContextMenus.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/pvr/PVRContextMenus.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -602,6 +602,10 @@ bool PVRClientMenuHook::IsVisible(const CFileItem& item) const { + const std::shared_ptr<CPVRClient> client = CServiceBroker::GetPVRManager().GetClient(item); + if (!client || m_hook.GetAddonId() != client->ID()) + return false; + if (m_hook.IsAllHook()) return !item.m_bIsFolder && !URIUtils::PathEquals(item.GetPath(), CPVRTimersPath::PATH_ADDTIMER); else if (m_hook.IsEpgHook()) diff -Nru kodi-19.1+dfsg2/xbmc/pvr/PVRItem.cpp kodi-19.2+dfsg1/xbmc/pvr/PVRItem.cpp --- kodi-19.1+dfsg2/xbmc/pvr/PVRItem.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/pvr/PVRItem.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -59,7 +59,7 @@ } else if (m_item->IsPVRTimer()) { - const std::shared_ptr<CPVRChannel> channel =m_item->GetPVRTimerInfoTag()->Channel(); + const std::shared_ptr<CPVRChannel> channel = m_item->GetPVRTimerInfoTag()->Channel(); if (channel) return channel->GetEPGNext(); } @@ -143,6 +143,10 @@ { return m_item->GetPVRRecordingInfoTag()->IsRadio(); } + else if (m_item->IsPVRTimer()) + { + return m_item->GetPVRTimerInfoTag()->m_bIsRadio; + } else { CLog::LogF(LOGERROR, "Unsupported item type!"); diff -Nru kodi-19.1+dfsg2/xbmc/pvr/PVRManager.cpp kodi-19.2+dfsg1/xbmc/pvr/PVRManager.cpp --- kodi-19.1+dfsg2/xbmc/pvr/PVRManager.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/pvr/PVRManager.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -613,6 +613,9 @@ /* start job to search for missing channel icons */ TriggerSearchMissingChannelIcons(); + /* try to play channel on startup */ + TriggerPlayChannelOnStartup(); + /* trigger PVR data updates */ TriggerChannelGroupsUpdate(); TriggerChannelsUpdate(); @@ -807,26 +810,22 @@ void CPVRManager::TriggerSearchMissingChannelIcons() { - if (IsStarted()) - { - CJobManager::GetInstance().Submit([this] { - CPVRGUIChannelIconUpdater updater({ChannelGroups()->GetGroupAllTV(), ChannelGroups()->GetGroupAllRadio()}, true); - updater.SearchAndUpdateMissingChannelIcons(); - return true; - }); - } + m_pendingUpdates->Append("pvr-search-missing-channel-icons", [this]() { + CPVRGUIChannelIconUpdater updater( + {ChannelGroups()->GetGroupAllTV(), ChannelGroups()->GetGroupAllRadio()}, true); + updater.SearchAndUpdateMissingChannelIcons(); + return true; + }); } void CPVRManager::TriggerSearchMissingChannelIcons(const std::shared_ptr<CPVRChannelGroup>& group) { - if (IsStarted()) - { - CJobManager::GetInstance().Submit([group] { - CPVRGUIChannelIconUpdater updater({group}, false); - updater.SearchAndUpdateMissingChannelIcons(); - return true; - }); - } + m_pendingUpdates->Append("pvr-search-missing-channel-icons-" + std::to_string(group->GroupID()), + [group]() { + CPVRGUIChannelIconUpdater updater({group}, false); + updater.SearchAndUpdateMissingChannelIcons(); + return true; + }); } void CPVRManager::ConnectionStateChange(CPVRClient* client, @@ -836,6 +835,10 @@ { CJobManager::GetInstance().Submit([this, client, connectString, state, message] { Clients()->ConnectionStateChange(client, connectString, state, message); + + if (state == PVR_CONNECTION_STATE_CONNECTED) + Start(); // start over + return true; }); } diff -Nru kodi-19.1+dfsg2/xbmc/rendering/dx/DeviceResources.cpp kodi-19.2+dfsg1/xbmc/rendering/dx/DeviceResources.cpp --- kodi-19.1+dfsg2/xbmc/rendering/dx/DeviceResources.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/rendering/dx/DeviceResources.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -24,6 +24,15 @@ #include "platform/win32/CharsetConverter.h" #include "platform/win32/WIN32Util.h" +#ifdef TARGET_WINDOWS_STORE +#include <winrt/Windows.Graphics.Display.Core.h> + +extern "C" +{ +#include <libavutil/rational.h> +} +#endif + #ifdef _DEBUG #include <dxgidebug.h> #pragma comment(lib, "dxgi.lib") @@ -94,14 +103,8 @@ ReleaseBackBuffer(); OnDeviceLost(true); + DestroySwapChain(); - // leave fullscreen before destroying - BOOL bFullScreen; - m_swapChain->GetFullscreenState(&bFullScreen, nullptr); - if (!!bFullScreen) - m_swapChain->SetFullscreenState(false, nullptr); - - m_swapChain = nullptr; m_adapter = nullptr; m_dxgiFactory = nullptr; m_output = nullptr; @@ -170,6 +173,17 @@ else mode->ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE; } +#else + using namespace winrt::Windows::Graphics::Display::Core; + + auto hdmiInfo = HdmiDisplayInformation::GetForCurrentView(); + if (hdmiInfo) // Xbox only + { + auto currentMode = hdmiInfo.GetCurrentDisplayMode(); + AVRational refresh = av_d2q(currentMode.RefreshRate(), 60000); + mode->RefreshRate.Numerator = refresh.num; + mode->RefreshRate.Denominator = refresh.den; + } #endif } @@ -191,7 +205,7 @@ bool DX::DeviceResources::SetFullScreen(bool fullscreen, RESOLUTION_INFO& res) { - if (!m_bDeviceCreated) + if (!m_bDeviceCreated || !m_swapChain) return false; critical_section::scoped_lock lock(m_criticalSection); @@ -515,6 +529,21 @@ return hr; } +void DX::DeviceResources::DestroySwapChain() +{ + if (!m_swapChain) + return; + + BOOL bFullcreen = 0; + m_swapChain->GetFullscreenState(&bFullcreen, nullptr); + if (!!bFullcreen) + m_swapChain->SetFullscreenState(false, nullptr); // mandatory before releasing swapchain + m_swapChain = nullptr; + m_deferrContext->Flush(); + m_d3dContext->Flush(); + m_IsTransferPQ = false; +} + void DX::DeviceResources::ResizeBuffers() { if (!m_bDeviceCreated) @@ -525,7 +554,6 @@ bool bHWStereoEnabled = RENDER_STEREO_MODE_HARDWAREBASED == CServiceBroker::GetWinSystem()->GetGfxContext().GetStereoMode(); bool windowed = true; - bool isHdrEnabled = false; HRESULT hr = E_FAIL; DXGI_SWAP_CHAIN_DESC1 scDesc = {}; @@ -534,34 +562,16 @@ BOOL bFullcreen = 0; m_swapChain->GetFullscreenState(&bFullcreen, nullptr); if (!!bFullcreen) - { windowed = false; - } - // check if swapchain needs to be recreated m_swapChain->GetDesc1(&scDesc); - - if ((scDesc.Stereo == TRUE) != bHWStereoEnabled) - { - // check fullscreen state and go to windowing if necessary - if (!!bFullcreen) - { - m_swapChain->SetFullscreenState(false, nullptr); // mandatory before releasing swapchain - } - m_swapChain = nullptr; - m_deferrContext->Flush(); - m_d3dContext->Flush(); - } + if ((scDesc.Stereo == TRUE) != bHWStereoEnabled) // check if swapchain needs to be recreated + DestroySwapChain(); } - isHdrEnabled = (HDR_STATUS::HDR_ON == CWIN32Util::GetWindowsHDRStatus()); - - if (m_swapChain != nullptr) + if (m_swapChain) // If the swap chain already exists, resize it. { - // If the swap chain already exists, resize it. m_swapChain->GetDesc1(&scDesc); - isHdrEnabled ? scDesc.Format = DXGI_FORMAT_R10G10B10A2_UNORM - : scDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; hr = m_swapChain->ResizeBuffers(scDesc.BufferCount, lround(m_outputSize.Width), lround(m_outputSize.Height), scDesc.Format, windowed ? 0 : DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH); @@ -575,21 +585,34 @@ // and correctly set up the new device. return; } + else if (hr == DXGI_ERROR_INVALID_CALL) + { + // Called when Windows HDR is toggled externally to Kodi. + // Is forced to re-create swap chain to avoid crash. + CreateWindowSizeDependentResources(); + return; + } CHECK_ERR(); } - else + else // Otherwise, create a new one using the same adapter as the existing Direct3D device. { - // Otherwise, create a new one using the same adapter as the existing Direct3D device. + HDR_STATUS hdrStatus = CWIN32Util::GetWindowsHDRStatus(); + const bool isHdrEnabled = (hdrStatus == HDR_STATUS::HDR_ON); + const bool is10bitSafe = (hdrStatus != HDR_STATUS::HDR_UNSUPPORTED); + DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {}; swapChainDesc.Width = lround(m_outputSize.Width); swapChainDesc.Height = lround(m_outputSize.Height); swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; swapChainDesc.Stereo = bHWStereoEnabled; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - // HDR 60 fps needs 6 buffers to avoid frame drops but it's good for all - swapChainDesc.BufferCount = 6; +#ifdef TARGET_WINDOWS_DESKTOP + swapChainDesc.BufferCount = 6; // HDR 60 fps needs 6 buffers to avoid frame drops +#else + swapChainDesc.BufferCount = 3; // Xbox don't like 6 backbuffers (3 is fine even for 4K 60 fps) +#endif // FLIP_DISCARD improves performance (needed in some systems for 4K HDR 60 fps) - swapChainDesc.SwapEffect = (m_d3dFeatureLevel >= D3D_FEATURE_LEVEL_12_0) + swapChainDesc.SwapEffect = CSysInfo::IsWindowsVersionAtLeast(CSysInfo::WindowsVersionWin10) ? DXGI_SWAP_EFFECT_FLIP_DISCARD : DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; swapChainDesc.Flags = windowed ? 0 : DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; @@ -604,7 +627,7 @@ ComPtr<IDXGISwapChain1> swapChain; if (m_d3dFeatureLevel >= D3D_FEATURE_LEVEL_11_0 && !bHWStereoEnabled && (CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_bTry10bitOutput || - isHdrEnabled)) + isHdrEnabled || is10bitSafe)) { swapChainDesc.Format = DXGI_FORMAT_R10G10B10A2_UNORM; hr = CreateSwapChain(swapChainDesc, scFSDesc, &swapChain); @@ -667,6 +690,11 @@ { ReleaseBackBuffer(); + DestroySwapChain(); + + if (!m_dxgiFactory->IsCurrent()) // HDR toggling requires re-create factory + CreateFactory(); + UpdateRenderTargetSize(); ResizeBuffers(); @@ -858,7 +886,8 @@ if (backbuferExists) ReleaseBackBuffer(); - m_swapChain = nullptr; + DestroySwapChain(); + CreateDeviceResources(); UpdateRenderTargetSize(); ResizeBuffers(); @@ -922,8 +951,6 @@ { CreateWindowSizeDependentResources(); } - if (!m_dxgiFactory->IsCurrent()) - CreateFactory(); } if (m_d3dContext == m_deferrContext) @@ -1123,7 +1150,7 @@ { ComPtr<IDXGISwapChain4> swapChain4; - if (m_swapChain == nullptr) + if (!m_swapChain) return; if (SUCCEEDED(m_swapChain.As(&swapChain4))) @@ -1169,7 +1196,7 @@ { ComPtr<IDXGISwapChain3> swapChain3; - if (m_swapChain == nullptr) + if (!m_swapChain) return; if (SUCCEEDED(m_swapChain.As(&swapChain3))) @@ -1203,14 +1230,7 @@ if (m_swapChain && hdrStatus != HDR_STATUS::HDR_TOGGLE_FAILED) { CLog::LogF(LOGDEBUG, "Re-create swapchain due HDR <-> SDR switch"); - BOOL bFullcreen = 0; - m_swapChain->GetFullscreenState(&bFullcreen, nullptr); - if (!!bFullcreen) - m_swapChain->SetFullscreenState(false, nullptr); - m_swapChain = nullptr; - m_deferrContext->Flush(); - m_d3dContext->Flush(); - m_IsTransferPQ = false; + DestroySwapChain(); } DX::Windowing()->SetAlteringWindow(false); @@ -1228,7 +1248,7 @@ DEBUG_INFO_RENDER DX::DeviceResources::GetDebugInfo() const { - if (m_swapChain == nullptr) + if (!m_swapChain) return {}; DXGI_SWAP_CHAIN_DESC1 desc = {}; @@ -1254,8 +1274,8 @@ m_IsTransferPQ ? "PQ" : "SDR", m_IsHDROutput ? "on" : "off"); info.videoOutput = StringUtils::Format( - "Output: {}x{}{} @ {:.2f} Hz, pixel: {} {}-bit, range: {} ({}-{})", desc.Width, desc.Height, - (md.ScanlineOrdering == DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE) ? "p" : "i", + "Surfaces: {}x{}{} @ {:.3f} Hz, pixel: {} {}-bit, range: {} ({}-{})", desc.Width, desc.Height, + (md.ScanlineOrdering > DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE) ? "i" : "p", static_cast<double>(md.RefreshRate.Numerator) / static_cast<double>(md.RefreshRate.Denominator), (desc.Format == DXGI_FORMAT_R10G10B10A2_UNORM) ? "R10G10B10A2" : "B8G8R8A8", bits, diff -Nru kodi-19.1+dfsg2/xbmc/rendering/dx/DeviceResources.h kodi-19.2+dfsg1/xbmc/rendering/dx/DeviceResources.h --- kodi-19.1+dfsg2/xbmc/rendering/dx/DeviceResources.h 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/rendering/dx/DeviceResources.h 2021-10-06 08:49:25.000000000 +0000 @@ -123,6 +123,7 @@ }; HRESULT CreateSwapChain(DXGI_SWAP_CHAIN_DESC1 &desc, DXGI_SWAP_CHAIN_FULLSCREEN_DESC &fsDesc, IDXGISwapChain1 **ppSwapChain) const; + void DestroySwapChain(); void CreateDeviceIndependentResources(); void CreateDeviceResources(); void CreateWindowSizeDependentResources(); diff -Nru kodi-19.1+dfsg2/xbmc/settings/AdvancedSettings.cpp kodi-19.2+dfsg1/xbmc/settings/AdvancedSettings.cpp --- kodi-19.1+dfsg2/xbmc/settings/AdvancedSettings.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/settings/AdvancedSettings.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -349,7 +349,6 @@ #endif m_showExitButton = true; m_splashImage = true; - m_showAllDependencies = false; m_playlistRetries = 100; m_playlistTimeout = 20; // 20 seconds timeout @@ -897,7 +896,6 @@ XMLUtils::GetBoolean(pRootElement, "fullscreen", m_startFullScreen); #endif XMLUtils::GetBoolean(pRootElement, "splash", m_splashImage); - XMLUtils::GetBoolean(pRootElement, "showalldependencies", m_showAllDependencies); XMLUtils::GetBoolean(pRootElement, "showexitbutton", m_showExitButton); XMLUtils::GetBoolean(pRootElement, "canwindowed", m_canWindowed); diff -Nru kodi-19.1+dfsg2/xbmc/settings/AdvancedSettings.h kodi-19.2+dfsg1/xbmc/settings/AdvancedSettings.h --- kodi-19.1+dfsg2/xbmc/settings/AdvancedSettings.h 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/settings/AdvancedSettings.h 2021-10-06 08:49:25.000000000 +0000 @@ -302,12 +302,6 @@ bool m_GLRectangleHack; int m_iSkipLoopFilter; - /*!< @brief Decision flag to show or hide specific dependencies in the list of the AddonInfo dialog - as this information usually adds no value for a consumer. - True to recursively show any dependency of the selected add-on - False to hide 'low-level' dependencies like e.g. scripts/modules (default) */ - bool m_showAllDependencies; - bool m_bVirtualShares; bool m_bTry10bitOutput; diff -Nru kodi-19.1+dfsg2/xbmc/utils/StringUtils.h kodi-19.2+dfsg1/xbmc/utils/StringUtils.h --- kodi-19.1+dfsg2/xbmc/utils/StringUtils.h 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/utils/StringUtils.h 2021-10-06 08:49:25.000000000 +0000 @@ -36,6 +36,9 @@ #if FMT_VERSION >= 40000 #include <fmt/printf.h> #endif +#if FMT_VERSION >= 80000 +#include <fmt/xchar.h> +#endif #include "XBDateTime.h" #include "utils/params_check_macros.h" diff -Nru kodi-19.1+dfsg2/xbmc/video/VideoDatabase.cpp kodi-19.2+dfsg1/xbmc/video/VideoDatabase.cpp --- kodi-19.1+dfsg2/xbmc/video/VideoDatabase.cpp 2021-05-08 16:20:52.000000000 +0000 +++ kodi-19.2+dfsg1/xbmc/video/VideoDatabase.cpp 2021-10-06 08:49:25.000000000 +0000 @@ -2449,7 +2449,7 @@ details.m_iIdRating = AddRatings(idMovie, MediaTypeMovie, details.m_ratings, details.GetDefaultRating()); // add unique ids - details.m_iIdUniqueID = UpdateUniqueIDs(idMovie, MediaTypeMovie, details); + details.m_iIdUniqueID = AddUniqueIDs(idMovie, MediaTypeMovie, details); // add set... int idSet = -1; @@ -2733,7 +2733,7 @@ details.m_iIdRating = AddRatings(idTvShow, MediaTypeTvShow, details.m_ratings, details.GetDefaultRating()); // add unique ids - details.m_iIdUniqueID = UpdateUniqueIDs(idTvShow, MediaTypeTvShow, details); + details.m_iIdUniqueID = AddUniqueIDs(idTvShow, MediaTypeTvShow, details); // add "all seasons" - the rest are added in SetDetailsForEpisode AddSeason(idTvShow, -1); @@ -2865,7 +2865,7 @@ details.m_iIdRating = AddRatings(idEpisode, MediaTypeEpisode, details.m_ratings, details.GetDefaultRating()); // add unique ids - details.m_iIdUniqueID = UpdateUniqueIDs(idEpisode, MediaTypeEpisode, details); + details.m_iIdUniqueID = AddUniqueIDs(idEpisode, MediaTypeEpisode, details); if (details.HasStreamDetails()) {