diff -Nru kodi-18.0+git20190128.1934-final/addons/resource.language.en_gb/resources/strings.po kodi-18.1+git20190217.1232-final/addons/resource.language.en_gb/resources/strings.po --- kodi-18.0+git20190128.1934-final/addons/resource.language.en_gb/resources/strings.po 2018-12-16 20:13:02.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/resource.language.en_gb/resources/strings.po 2019-02-11 10:31:27.000000000 +0000 @@ -10920,7 +10920,11 @@ msgid "Do you want to record the selected programme or to switch to the current programme?" msgstr "" -#empty string with id 19303 +#. label for PVR settings close channel OSD after channel switch control +#: system/settings/settings.xml +msgctxt "#19303" +msgid "Close channel OSD after switching channels" +msgstr "" #. Label for context menu entry to open settings dialog for a timer rule (read-only) #: xbmc/pvr/PVRContextMenus.cpp @@ -18641,7 +18645,10 @@ msgid "Duration of instant recordings when pressing the record button. This value will be taken into account if \"Instant recording action\" is set to \"Record for a fixed period of time\"" msgstr "" -#empty string with id 36235 +#: system/settings/settings.xml +msgctxt "#36235" +msgid "Close the on screen display controls after switching channels." +msgstr "" #: system/settings/settings.xml msgctxt "#36236" diff -Nru kodi-18.0+git20190128.1934-final/addons/skin.estouchy/language/resource.language.en_gb/strings.po kodi-18.1+git20190217.1232-final/addons/skin.estouchy/language/resource.language.en_gb/strings.po --- kodi-18.0+git20190128.1934-final/addons/skin.estouchy/language/resource.language.en_gb/strings.po 2018-10-23 16:19:50.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/skin.estouchy/language/resource.language.en_gb/strings.po 2019-02-11 10:31:27.000000000 +0000 @@ -62,7 +62,9 @@ msgid "Episodes" msgstr "" -#empty string with id 31015 +msgctxt "#31015" +msgid "Player info" +msgstr "" msgctxt "#31016" msgid "Albums" @@ -111,7 +113,11 @@ msgid "Updated:" msgstr "" -#empty strings from id 31040 to 31043 +#empty strings from id 31040 to 31042 + +msgctxt "#31043" +msgid "PAUSED" +msgstr "" msgctxt "#31044" msgid "FAST FORWARD" Binary files /tmp/tmpxTNgpJ/FgPlq7ssVA/kodi-18.0+git20190128.1934-final/addons/skin.estouchy/media/OverlayUnwatched.png and /tmp/tmpxTNgpJ/zDwpjAVej5/kodi-18.1+git20190217.1232-final/addons/skin.estouchy/media/OverlayUnwatched.png differ diff -Nru kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/Defaults.xml kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/Defaults.xml --- kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/Defaults.xml 2017-11-15 01:02:38.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/Defaults.xml 2019-02-11 10:31:27.000000000 +0000 @@ -38,7 +38,6 @@ 0 0 - 0 0 diff -Nru kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/DialogAddonInfo.xml kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/DialogAddonInfo.xml --- kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/DialogAddonInfo.xml 2018-07-31 18:47:37.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/DialogAddonInfo.xml 2019-02-11 10:31:27.000000000 +0000 @@ -217,7 +217,6 @@ right center - font20_title selected !String.IsEmpty(ListItem.AddonBroken) diff -Nru kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/DialogAddonSettings.xml kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/DialogAddonSettings.xml --- kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/DialogAddonSettings.xml 2019-01-28 18:34:06.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/DialogAddonSettings.xml 2019-02-11 10:31:27.000000000 +0000 @@ -72,7 +72,6 @@ 60 5 center - center horizontal 3 3 diff -Nru kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/DialogKeyboard.xml kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/DialogKeyboard.xml --- kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/DialogKeyboard.xml 2018-06-21 18:59:46.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/DialogKeyboard.xml 2019-02-11 10:31:27.000000000 +0000 @@ -169,6 +169,12 @@ 131 KeyboardButton + + (0,12) key button + 306 + 132 + KeyboardButton + 0 0 diff -Nru kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/DialogSettings.xml kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/DialogSettings.xml --- kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/DialogSettings.xml 2019-01-28 18:34:06.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/DialogSettings.xml 2019-02-11 10:31:27.000000000 +0000 @@ -4,7 +4,7 @@ 16x9_xPos_Relocation Window_OpenClose_Animation_Zoom - 240 + 140 80 @@ -12,14 +12,14 @@ 0 0 - 800 + 1000 60 dialog_header.png 0 60 - 800 + 1000 740 dialog_back.png @@ -27,18 +27,18 @@ 20 0 WindowTitleCommons - 700 + 910 - 730 + 930 0 DialogCloseButtonCommons 0 60 - 750 + 1000 630 -1 60 @@ -95,7 +95,7 @@ 70 font25 - 300 + 400 0 @@ -108,7 +108,7 @@ 0 720 - 800 + 1000 60 5 center diff -Nru kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/Includes.xml kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/Includes.xml --- kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/Includes.xml 2018-10-23 16:19:50.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/Includes.xml 2019-02-11 10:31:27.000000000 +0000 @@ -1153,7 +1153,7 @@ MenuButtonCommonValues - ActivateWindow(122) + ActivateWindow(visualisationpresetlist) @@ -2492,7 +2492,7 @@ VideoPlayer.HasMenu + !VideoPlayer.Content(LiveTV) - + MenuButtonCommonValues ClearProperty(PopupMenuVisible,Home) ActivateWindow(playerprocessinfo) diff -Nru kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/MyMusicPlaylistEditor.xml kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/MyMusicPlaylistEditor.xml --- kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/MyMusicPlaylistEditor.xml 2018-05-01 00:00:09.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/MyMusicPlaylistEditor.xml 2019-02-11 10:31:27.000000000 +0000 @@ -1,6 +1,6 @@ - 6 + 6 50 ClearProperty(PopupMenuVisible,Home) diff -Nru kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/MyWeather.xml kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/MyWeather.xml --- kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/MyWeather.xml 2017-11-15 01:02:38.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/MyWeather.xml 2019-02-11 10:31:27.000000000 +0000 @@ -102,7 +102,7 @@ current temp Value auto 130 - font16_title + font18_title center @@ -388,7 +388,7 @@ - + noop !Weather.IsFetched diff -Nru kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/SettingsScreenCalibration.xml kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/SettingsScreenCalibration.xml --- kodi-18.0+git20190128.1934-final/addons/skin.estouchy/xml/SettingsScreenCalibration.xml 2017-11-15 01:02:38.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/skin.estouchy/xml/SettingsScreenCalibration.xml 2019-02-11 10:31:27.000000000 +0000 @@ -78,23 +78,24 @@ 20 80 + 16x9_xPos_Relocation coordinates label 0 10 - 1240 + 1280 center - font13caps + font24_title help information 0 40 - 1240 + 1280 center - font13caps + font24_title Binary files /tmp/tmpxTNgpJ/FgPlq7ssVA/kodi-18.0+git20190128.1934-final/addons/skin.estuary/media/icons/infodialogs/set.png and /tmp/tmpxTNgpJ/zDwpjAVej5/kodi-18.1+git20190217.1232-final/addons/skin.estuary/media/icons/infodialogs/set.png differ diff -Nru kodi-18.0+git20190128.1934-final/addons/skin.estuary/xml/DialogKeyboard.xml kodi-18.1+git20190217.1232-final/addons/skin.estuary/xml/DialogKeyboard.xml --- kodi-18.0+git20190128.1934-final/addons/skin.estuary/xml/DialogKeyboard.xml 2018-10-03 07:06:26.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/skin.estuary/xml/DialogKeyboard.xml 2019-02-11 10:31:27.000000000 +0000 @@ -157,6 +157,13 @@ 131 KeyboardButton + + (0,12) key button + 172 + 9010 + 132 + KeyboardButton + @@ -239,7 +246,7 @@ (1,12) key button - 172 + 112 152 KeyboardButton @@ -412,7 +419,7 @@ (3,12) key button 152 - 132 + 112 KeyboardButton diff -Nru kodi-18.0+git20190128.1934-final/addons/skin.estuary/xml/DialogVideoInfo.xml kodi-18.1+git20190217.1232-final/addons/skin.estuary/xml/DialogVideoInfo.xml --- kodi-18.0+git20190128.1934-final/addons/skin.estuary/xml/DialogVideoInfo.xml 2018-10-23 16:19:50.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/skin.estuary/xml/DialogVideoInfo.xml 2019-02-11 10:31:27.000000000 +0000 @@ -93,8 +93,8 @@ SetProperty(TextViewer_Text,$ESCINFO[ListItem.Plot],home) ActivateWindow(1102) 50 - 138 - 138 + 4000 + 4000 5000 dialogs/dialog-bg.png Integer.IsGreater(Container(4000).NumItems,0) @@ -118,8 +118,8 @@ SetProperty(TextViewer_Text,$ESCINFO[ListItem.Plot],home) ActivateWindow(1102) 50 - 139 - 139 + 4000 + 4000 5000 dialogs/dialog-bg.png !Integer.IsGreater(Container(4000).NumItems,0) @@ -145,9 +145,9 @@ vertical - 730 + 755 488 - 355 + 377 -8 5000 50 @@ -156,61 +156,73 @@ + + + + + + + + + + - + + - + + @@ -469,6 +481,14 @@ + + + + + + + + diff -Nru kodi-18.0+git20190128.1934-final/addons/skin.estuary/xml/Includes_Buttons.xml kodi-18.1+git20190217.1232-final/addons/skin.estuary/xml/Includes_Buttons.xml --- kodi-18.0+git20190128.1934-final/addons/skin.estuary/xml/Includes_Buttons.xml 2017-11-15 01:02:40.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/addons/skin.estuary/xml/Includes_Buttons.xml 2019-02-11 10:31:27.000000000 +0000 @@ -19,16 +19,21 @@ 0 - - 505 + + 472 49 - 40 + 16 center font12 - + lists/focus.png + lists/focus.png + noop + noop + $PARAM[altlabel] + Control.HasFocus($PARAM[control_id]) $PARAM[visible] diff -Nru kodi-18.0+git20190128.1934-final/BUILDDATE kodi-18.1+git20190217.1232-final/BUILDDATE --- kodi-18.0+git20190128.1934-final/BUILDDATE 2019-01-28 18:34:23.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/BUILDDATE 2019-02-17 11:32:30.000000000 +0000 @@ -1 +1 @@ -20190128 +20190217 diff -Nru kodi-18.0+git20190128.1934-final/cmake/scripts/common/AddonHelpers.cmake kodi-18.1+git20190217.1232-final/cmake/scripts/common/AddonHelpers.cmake --- kodi-18.0+git20190128.1934-final/cmake/scripts/common/AddonHelpers.cmake 2018-10-23 16:19:50.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/cmake/scripts/common/AddonHelpers.cmake 2019-02-11 10:31:27.000000000 +0000 @@ -199,7 +199,7 @@ endif() # TODO: remove this hack after v18 - string(REPLACE "\@PLATFORM\@" "@PLATFORM_TAG@" addon_file "${addon_file}") + string(REPLACE "\@PLATFORM\@" "\@PLATFORM_TAG\@" addon_file "${addon_file}") string(CONFIGURE "${addon_file}" addon_file_conf @ONLY) file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target}/addon.xml CONTENT "${addon_file_conf}") diff -Nru kodi-18.0+git20190128.1934-final/debian/changelog kodi-18.1+git20190217.1232-final/debian/changelog --- kodi-18.0+git20190128.1934-final/debian/changelog 2019-01-28 18:44:35.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/debian/changelog 2019-02-17 11:42:43.000000000 +0000 @@ -1,4 +1,404 @@ -kodi (2:18.0+git20190128.1934-final-0xenial) xenial; urgency=high +kodi (2:18.1+git20190217.1232-final-0xenial) xenial; urgency=high + + [peak3d] + * [Android] Queue AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM buffer only for API >= 26 + + [Philipp Kerling] + * [wayland] Fix startup crash + + [peak3d] + * Set m_bRenderGUI in RenderManager::PreInit + + [arnova] + * fixed: NFO/tag loading for http/https sources was broken (fixes #15481) + + [Martijn Kaijser] + * bump for 18.1 final + + + [peak3d] + * [Android] Queue AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM buffer only for API >= 26 + + [Philipp Kerling] + * [wayland] Fix startup crash + + [peak3d] + * Set m_bRenderGUI in RenderManager::PreInit + + + [arnova] + * fixed: NFO/tag loading for http/https sources was broken (fixes #15481) + + + + + + [fritsch] + * UPNPPlayer: Do not use memset on non-trivial type + + + [fritsch] + * UPNPPlayer: Do not use memset on non-trivial type + + [Memphiz] + * Revert "[DetectDVDType]: fix Crash due to non-checked error state" + + [Alwin Esch] + * X11: remove not needed CGLContextEGL::IsSuitableVisual + + [Alwin Esch] + * X11: fix usage of required configuration values + + [Alwin Esch] + * [addons] not pass nullptr to std::string + + [peak3d] + * [VideoPlayer] Uninitialize RenderManager early on playback stop + + [JimmyS83] + * Add date to the log records + + [Anton Fedchin] + * [videoplayer] WinRenderer: remove `dxvaallowhqscaling` setting + + [Kai Sommerfeld] + * [pvr] Improve documentation for advanced epg settings. + + [Kai Sommerfeld] + * [pvr] Define a senseful default value for advanced settings 'updateemptytagsinterval'. + + [Anton Fedchin] + * [windowing] win32: update handling WM_DPICHANGED event + + [Anton Fedchin] + * [xbmc] application: handle resize event even in full screen state on windows. + + [peak3d] + * [Android] Fix MediaCodec freeze when early disposing stream + + [peak3d] + * [DllLoader] No warning if resolve fals for optional dependencies + + [Kai Sommerfeld] + * [PVR] Ignore very first 'server not reachable' notification. + + [Kai Sommerfeld] + * [guiinfo] Fixed ListItemPosition. + + [Kai Sommerfeld] + * [guiinfo] Fixed ListItemAbsolute(0). + + [Philipp Kerling] + * [sqlite] Fix DbErrors format strings + + [Philipp Kerling] + * [sqlite] Use error message returned by sqlite3_exec() + + [Philipp Kerling] + * [sqlite] Include sqlite3_errmsg() result in error messages + + [Philipp Kerling] + * [sqlite] Use extended result codes + + [peak3d] + * [Android] Fix invalid PTS decoder value (fix) + + [peak3d] + * [Android] Fix invalid PTS decoder value + + [Kai Sommerfeld] + * [PVR] Fix CPVRTimers::GetRecordingTimerForRecording to respect timer's start and stop padding time + optimize to check epg event uids if present. + + [Alwin Esch] + * [addons] add for test purpose only script for debian package generation + + [Rechi] + * update SSL CA trust store + + [DaveTBlake] + * [JSON]Speed up player and playlist operations using post rather than send for messages that don't need to wait. Fix GUI playist change notification to be done consistently by app rather than partially by JSON. + + [Rechi] + * [TexturePacker] use std:: instead of using namespace std + + [Rechi] + * [JsonSchemaBuilder] use std:: instead of using namespace std + + [fritsch] + * RenderCapture: Fix wrong printout + + [DaveTBlake] + * Fix how limits applied to artist and album smart playlists or custom nodes + + [Kai Sommerfeld] + * [PVR][settings] Reintroduce setting "Close channel OSD after switching channels", which got accidentally removed for Leia 18.0 + + [peak3d] + * [Threads] revert #15263, log tid instead posix thread + + [peak3d] + * [Binary Addon] provide API versions to addon for better downgrade handling + + [linknetx] + * Update PVRTimers.cpp + + [fritsch] + * RenderCapture: Switch to non-arb occlusion queries + + [DaVukovic] + * [skins] Estuary + Estouchy keyboard layout fixes + + [fritsch] + * VideoSync: Fixup vsync clock + + [Anton Fedchin] + * [guilib] d3dtexture: fixed wrong render target index. + + [peak3d] + * [Android] check if intent is valid + + [Rechi] + * [TexturePacker] update windows dirent implementation + + [peak3d] + * [Resolution] Check current mode if whitelist doesn't match + + [Anton Fedchin] + * [win10] filesystem: catch an exception while reading or writing a file. + + [Anton Fedchin] + * [videoplayer] winrenderer: do scaling in output shader instead of yuv2rgb, this fixes the issue with green border with nv12 texture. + + [Kai Sommerfeld] + * [PVR][videoplayer] Fix PVR input stream creation for pvr file items only containing a path and no recording/channel tag. Fixes broken recording playback using official Kodi Remote iOS app. + + [Rechi] + * [depends] remove unused platform lib + + [peak3d] + * [Demux] VP9 does not provide extradata + + [Rechi] + * [cmake] fix policy CMP0053 + + [DaveTBlake] + * Fix announcement manager locking to use separate sections for queue and listener list + + [Rechi] + * [fix] logical or operation + + [Philipp Kerling] + * [guilib] Handle empty vertex buffers in GUIFontTTFGL + + [DaveTBlake] + * Avoid trying to load music info for smartplaylists and menu items + + [Martijn Kaijser] + * bump to v18.1 RC1 + + [ronie] + * [Estouchy] cosmetic fixes + + [ronie] + * [Estuary] videoinfo - add movieset button + + [ronie] + * [Estuary] make mediainfo list focusable + + [Michael Brehm] + * Check the system capabilities to support sleep states S1/S2/S3/S4 before reporing them as available + + [KOPRajs] + * [games] Fix crash by reverting part of the PR #14146 + + + [Memphiz] + * Revert "[DetectDVDType]: fix Crash due to non-checked error state" + + [Alwin Esch] + * [addons] not pass nullptr to std::string + + [peak3d] + * [VideoPlayer] Uninitialize RenderManager early on playback stop + + [Anton Fedchin] + * [videoplayer] WinRenderer: remove `dxvaallowhqscaling` setting + + [Kai Sommerfeld] + * [pvr] Improve documentation for advanced epg settings. + + [Kai Sommerfeld] + * [pvr] Define a senseful default value for advanced settings 'updateemptytagsinterval'. + + [peak3d] + * [DllLoader] No warning if resolve fals for optional dependencies + + [DaveTBlake] + * [JSON]Speed up player and playlist operations using post rather than send for messages that don't need to wait. Fix GUI playist change notification to be done consistently by app rather than partially by JSON. + + + [Alwin Esch] + * X11: remove not needed CGLContextEGL::IsSuitableVisual + + [Alwin Esch] + * X11: fix usage of required configuration values + + [JimmyS83] + * Add date to the log records + + + + [Anton Fedchin] + * [windowing] win32: update handling WM_DPICHANGED event + + [Anton Fedchin] + * [xbmc] application: handle resize event even in full screen state on windows. + + [peak3d] + * [Android] Fix MediaCodec freeze when early disposing stream + + [Kai Sommerfeld] + * [PVR] Ignore very first 'server not reachable' notification. + + [Kai Sommerfeld] + * [guiinfo] Fixed ListItemPosition. + + [Kai Sommerfeld] + * [guiinfo] Fixed ListItemAbsolute(0). + + [Philipp Kerling] + * [sqlite] Fix DbErrors format strings + + [Philipp Kerling] + * [sqlite] Use error message returned by sqlite3_exec() + + [Philipp Kerling] + * [sqlite] Include sqlite3_errmsg() result in error messages + + [Philipp Kerling] + * [sqlite] Use extended result codes + + [Alwin Esch] + * [addons] add for test purpose only script for debian package generation + + + [peak3d] + * [Android] Fix invalid PTS decoder value (fix) + + [peak3d] + * [Android] Fix invalid PTS decoder value + + [Kai Sommerfeld] + * [PVR] Fix CPVRTimers::GetRecordingTimerForRecording to respect timer's start and stop padding time + optimize to check epg event uids if present. + + [Rechi] + * update SSL CA trust store + + [peak3d] + * [Binary Addon] provide API versions to addon for better downgrade handling + + [DaveTBlake] + * Fix announcement manager locking to use separate sections for queue and listener list + + + [Rechi] + * [TexturePacker] use std:: instead of using namespace std + + [Rechi] + * [JsonSchemaBuilder] use std:: instead of using namespace std + + [fritsch] + * RenderCapture: Fix wrong printout + + [Philipp Kerling] + * [guilib] Handle empty vertex buffers in GUIFontTTFGL + + + [DaveTBlake] + * Fix how limits applied to artist and album smart playlists or custom nodes + + [Kai Sommerfeld] + * [PVR][settings] Reintroduce setting "Close channel OSD after switching channels", which got accidentally removed for Leia 18.0 + + [peak3d] + * [Threads] revert #15263, log tid instead posix thread + + [DaveTBlake] + * Avoid trying to load music info for smartplaylists and menu items + + + [linknetx] + * Update PVRTimers.cpp + + [fritsch] + * RenderCapture: Switch to non-arb occlusion queries + + [DaVukovic] + * [skins] Estuary + Estouchy keyboard layout fixes + + [fritsch] + * VideoSync: Fixup vsync clock + + + [Anton Fedchin] + * [guilib] d3dtexture: fixed wrong render target index. + + + [peak3d] + * [Android] check if intent is valid + + [Rechi] + * [TexturePacker] update windows dirent implementation + + [peak3d] + * [Resolution] Check current mode if whitelist doesn't match + + [Kai Sommerfeld] + * [PVR][videoplayer] Fix PVR input stream creation for pvr file items only containing a path and no recording/channel tag. Fixes broken recording playback using official Kodi Remote iOS app. + + + [Anton Fedchin] + * [win10] filesystem: catch an exception while reading or writing a file. + + [Anton Fedchin] + * [videoplayer] winrenderer: do scaling in output shader instead of yuv2rgb, this fixes the issue with green border with nv12 texture. + + [Rechi] + * [depends] remove unused platform lib + + [peak3d] + * [Demux] VP9 does not provide extradata + + + [Rechi] + * [cmake] fix policy CMP0053 + + + [Rechi] + * [fix] logical or operation + + [Martijn Kaijser] + * bump to v18.1 RC1 + + [ronie] + * [Estouchy] cosmetic fixes + + [ronie] + * [Estuary] videoinfo - add movieset button + + [ronie] + * [Estuary] make mediainfo list focusable + + [Michael Brehm] + * Check the system capabilities to support sleep states S1/S2/S3/S4 before reporing them as available + + + [Martijn Kaijser] + * bump to v18.0 final + + [KOPRajs] + * [games] Fix crash by reverting part of the PR #14146 + [DaveTBlake] * Apply limit and random sort in SQL rather than fetch all artists or albums into fileitem list then pick random few to show. diff -Nru kodi-18.0+git20190128.1934-final/debian/changelog.tmp kodi-18.1+git20190217.1232-final/debian/changelog.tmp --- kodi-18.0+git20190128.1934-final/debian/changelog.tmp 2019-01-28 18:34:54.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/debian/changelog.tmp 2019-02-17 11:33:04.000000000 +0000 @@ -1,4 +1,404 @@ -kodi (2:18.0+git20190128.1934-final-0dist) dist; urgency=high +kodi (2:18.1+git20190217.1232-final-0dist) dist; urgency=high + + [peak3d] + * [Android] Queue AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM buffer only for API >= 26 + + [Philipp Kerling] + * [wayland] Fix startup crash + + [peak3d] + * Set m_bRenderGUI in RenderManager::PreInit + + [arnova] + * fixed: NFO/tag loading for http/https sources was broken (fixes #15481) + + [Martijn Kaijser] + * bump for 18.1 final + + + [peak3d] + * [Android] Queue AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM buffer only for API >= 26 + + [Philipp Kerling] + * [wayland] Fix startup crash + + [peak3d] + * Set m_bRenderGUI in RenderManager::PreInit + + + [arnova] + * fixed: NFO/tag loading for http/https sources was broken (fixes #15481) + + + + + + [fritsch] + * UPNPPlayer: Do not use memset on non-trivial type + + + [fritsch] + * UPNPPlayer: Do not use memset on non-trivial type + + [Memphiz] + * Revert "[DetectDVDType]: fix Crash due to non-checked error state" + + [Alwin Esch] + * X11: remove not needed CGLContextEGL::IsSuitableVisual + + [Alwin Esch] + * X11: fix usage of required configuration values + + [Alwin Esch] + * [addons] not pass nullptr to std::string + + [peak3d] + * [VideoPlayer] Uninitialize RenderManager early on playback stop + + [JimmyS83] + * Add date to the log records + + [Anton Fedchin] + * [videoplayer] WinRenderer: remove `dxvaallowhqscaling` setting + + [Kai Sommerfeld] + * [pvr] Improve documentation for advanced epg settings. + + [Kai Sommerfeld] + * [pvr] Define a senseful default value for advanced settings 'updateemptytagsinterval'. + + [Anton Fedchin] + * [windowing] win32: update handling WM_DPICHANGED event + + [Anton Fedchin] + * [xbmc] application: handle resize event even in full screen state on windows. + + [peak3d] + * [Android] Fix MediaCodec freeze when early disposing stream + + [peak3d] + * [DllLoader] No warning if resolve fals for optional dependencies + + [Kai Sommerfeld] + * [PVR] Ignore very first 'server not reachable' notification. + + [Kai Sommerfeld] + * [guiinfo] Fixed ListItemPosition. + + [Kai Sommerfeld] + * [guiinfo] Fixed ListItemAbsolute(0). + + [Philipp Kerling] + * [sqlite] Fix DbErrors format strings + + [Philipp Kerling] + * [sqlite] Use error message returned by sqlite3_exec() + + [Philipp Kerling] + * [sqlite] Include sqlite3_errmsg() result in error messages + + [Philipp Kerling] + * [sqlite] Use extended result codes + + [peak3d] + * [Android] Fix invalid PTS decoder value (fix) + + [peak3d] + * [Android] Fix invalid PTS decoder value + + [Kai Sommerfeld] + * [PVR] Fix CPVRTimers::GetRecordingTimerForRecording to respect timer's start and stop padding time + optimize to check epg event uids if present. + + [Alwin Esch] + * [addons] add for test purpose only script for debian package generation + + [Rechi] + * update SSL CA trust store + + [DaveTBlake] + * [JSON]Speed up player and playlist operations using post rather than send for messages that don't need to wait. Fix GUI playist change notification to be done consistently by app rather than partially by JSON. + + [Rechi] + * [TexturePacker] use std:: instead of using namespace std + + [Rechi] + * [JsonSchemaBuilder] use std:: instead of using namespace std + + [fritsch] + * RenderCapture: Fix wrong printout + + [DaveTBlake] + * Fix how limits applied to artist and album smart playlists or custom nodes + + [Kai Sommerfeld] + * [PVR][settings] Reintroduce setting "Close channel OSD after switching channels", which got accidentally removed for Leia 18.0 + + [peak3d] + * [Threads] revert #15263, log tid instead posix thread + + [peak3d] + * [Binary Addon] provide API versions to addon for better downgrade handling + + [linknetx] + * Update PVRTimers.cpp + + [fritsch] + * RenderCapture: Switch to non-arb occlusion queries + + [DaVukovic] + * [skins] Estuary + Estouchy keyboard layout fixes + + [fritsch] + * VideoSync: Fixup vsync clock + + [Anton Fedchin] + * [guilib] d3dtexture: fixed wrong render target index. + + [peak3d] + * [Android] check if intent is valid + + [Rechi] + * [TexturePacker] update windows dirent implementation + + [peak3d] + * [Resolution] Check current mode if whitelist doesn't match + + [Anton Fedchin] + * [win10] filesystem: catch an exception while reading or writing a file. + + [Anton Fedchin] + * [videoplayer] winrenderer: do scaling in output shader instead of yuv2rgb, this fixes the issue with green border with nv12 texture. + + [Kai Sommerfeld] + * [PVR][videoplayer] Fix PVR input stream creation for pvr file items only containing a path and no recording/channel tag. Fixes broken recording playback using official Kodi Remote iOS app. + + [Rechi] + * [depends] remove unused platform lib + + [peak3d] + * [Demux] VP9 does not provide extradata + + [Rechi] + * [cmake] fix policy CMP0053 + + [DaveTBlake] + * Fix announcement manager locking to use separate sections for queue and listener list + + [Rechi] + * [fix] logical or operation + + [Philipp Kerling] + * [guilib] Handle empty vertex buffers in GUIFontTTFGL + + [DaveTBlake] + * Avoid trying to load music info for smartplaylists and menu items + + [Martijn Kaijser] + * bump to v18.1 RC1 + + [ronie] + * [Estouchy] cosmetic fixes + + [ronie] + * [Estuary] videoinfo - add movieset button + + [ronie] + * [Estuary] make mediainfo list focusable + + [Michael Brehm] + * Check the system capabilities to support sleep states S1/S2/S3/S4 before reporing them as available + + [KOPRajs] + * [games] Fix crash by reverting part of the PR #14146 + + + [Memphiz] + * Revert "[DetectDVDType]: fix Crash due to non-checked error state" + + [Alwin Esch] + * [addons] not pass nullptr to std::string + + [peak3d] + * [VideoPlayer] Uninitialize RenderManager early on playback stop + + [Anton Fedchin] + * [videoplayer] WinRenderer: remove `dxvaallowhqscaling` setting + + [Kai Sommerfeld] + * [pvr] Improve documentation for advanced epg settings. + + [Kai Sommerfeld] + * [pvr] Define a senseful default value for advanced settings 'updateemptytagsinterval'. + + [peak3d] + * [DllLoader] No warning if resolve fals for optional dependencies + + [DaveTBlake] + * [JSON]Speed up player and playlist operations using post rather than send for messages that don't need to wait. Fix GUI playist change notification to be done consistently by app rather than partially by JSON. + + + [Alwin Esch] + * X11: remove not needed CGLContextEGL::IsSuitableVisual + + [Alwin Esch] + * X11: fix usage of required configuration values + + [JimmyS83] + * Add date to the log records + + + + [Anton Fedchin] + * [windowing] win32: update handling WM_DPICHANGED event + + [Anton Fedchin] + * [xbmc] application: handle resize event even in full screen state on windows. + + [peak3d] + * [Android] Fix MediaCodec freeze when early disposing stream + + [Kai Sommerfeld] + * [PVR] Ignore very first 'server not reachable' notification. + + [Kai Sommerfeld] + * [guiinfo] Fixed ListItemPosition. + + [Kai Sommerfeld] + * [guiinfo] Fixed ListItemAbsolute(0). + + [Philipp Kerling] + * [sqlite] Fix DbErrors format strings + + [Philipp Kerling] + * [sqlite] Use error message returned by sqlite3_exec() + + [Philipp Kerling] + * [sqlite] Include sqlite3_errmsg() result in error messages + + [Philipp Kerling] + * [sqlite] Use extended result codes + + [Alwin Esch] + * [addons] add for test purpose only script for debian package generation + + + [peak3d] + * [Android] Fix invalid PTS decoder value (fix) + + [peak3d] + * [Android] Fix invalid PTS decoder value + + [Kai Sommerfeld] + * [PVR] Fix CPVRTimers::GetRecordingTimerForRecording to respect timer's start and stop padding time + optimize to check epg event uids if present. + + [Rechi] + * update SSL CA trust store + + [peak3d] + * [Binary Addon] provide API versions to addon for better downgrade handling + + [DaveTBlake] + * Fix announcement manager locking to use separate sections for queue and listener list + + + [Rechi] + * [TexturePacker] use std:: instead of using namespace std + + [Rechi] + * [JsonSchemaBuilder] use std:: instead of using namespace std + + [fritsch] + * RenderCapture: Fix wrong printout + + [Philipp Kerling] + * [guilib] Handle empty vertex buffers in GUIFontTTFGL + + + [DaveTBlake] + * Fix how limits applied to artist and album smart playlists or custom nodes + + [Kai Sommerfeld] + * [PVR][settings] Reintroduce setting "Close channel OSD after switching channels", which got accidentally removed for Leia 18.0 + + [peak3d] + * [Threads] revert #15263, log tid instead posix thread + + [DaveTBlake] + * Avoid trying to load music info for smartplaylists and menu items + + + [linknetx] + * Update PVRTimers.cpp + + [fritsch] + * RenderCapture: Switch to non-arb occlusion queries + + [DaVukovic] + * [skins] Estuary + Estouchy keyboard layout fixes + + [fritsch] + * VideoSync: Fixup vsync clock + + + [Anton Fedchin] + * [guilib] d3dtexture: fixed wrong render target index. + + + [peak3d] + * [Android] check if intent is valid + + [Rechi] + * [TexturePacker] update windows dirent implementation + + [peak3d] + * [Resolution] Check current mode if whitelist doesn't match + + [Kai Sommerfeld] + * [PVR][videoplayer] Fix PVR input stream creation for pvr file items only containing a path and no recording/channel tag. Fixes broken recording playback using official Kodi Remote iOS app. + + + [Anton Fedchin] + * [win10] filesystem: catch an exception while reading or writing a file. + + [Anton Fedchin] + * [videoplayer] winrenderer: do scaling in output shader instead of yuv2rgb, this fixes the issue with green border with nv12 texture. + + [Rechi] + * [depends] remove unused platform lib + + [peak3d] + * [Demux] VP9 does not provide extradata + + + [Rechi] + * [cmake] fix policy CMP0053 + + + [Rechi] + * [fix] logical or operation + + [Martijn Kaijser] + * bump to v18.1 RC1 + + [ronie] + * [Estouchy] cosmetic fixes + + [ronie] + * [Estuary] videoinfo - add movieset button + + [ronie] + * [Estuary] make mediainfo list focusable + + [Michael Brehm] + * Check the system capabilities to support sleep states S1/S2/S3/S4 before reporing them as available + + + [Martijn Kaijser] + * bump to v18.0 final + + [KOPRajs] + * [games] Fix crash by reverting part of the PR #14146 + [DaveTBlake] * Apply limit and random sort in SQL rather than fetch all artists or albums into fileitem list then pick random few to show. diff -Nru kodi-18.0+git20190128.1934-final/debian/changelog.tmp.old kodi-18.1+git20190217.1232-final/debian/changelog.tmp.old --- kodi-18.0+git20190128.1934-final/debian/changelog.tmp.old 2019-01-28 18:34:23.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/debian/changelog.tmp.old 2019-02-17 11:32:30.000000000 +0000 @@ -1,5 +1,564 @@ kodi (2:18.0+git20180719.0202-3231481-0dist) dist; urgency=high + [peak3d] + * [Android] Queue AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM buffer only for API >= 26 + + [Philipp Kerling] + * [wayland] Fix startup crash + + [peak3d] + * Set m_bRenderGUI in RenderManager::PreInit + + + [arnova] + * fixed: NFO/tag loading for http/https sources was broken (fixes #15481) + + + + + + [fritsch] + * UPNPPlayer: Do not use memset on non-trivial type + + + [fritsch] + * UPNPPlayer: Do not use memset on non-trivial type + + [Memphiz] + * Revert "[DetectDVDType]: fix Crash due to non-checked error state" + + [Alwin Esch] + * X11: remove not needed CGLContextEGL::IsSuitableVisual + + [Alwin Esch] + * X11: fix usage of required configuration values + + [Alwin Esch] + * [addons] not pass nullptr to std::string + + [peak3d] + * [VideoPlayer] Uninitialize RenderManager early on playback stop + + [JimmyS83] + * Add date to the log records + + [Anton Fedchin] + * [videoplayer] WinRenderer: remove `dxvaallowhqscaling` setting + + [Kai Sommerfeld] + * [pvr] Improve documentation for advanced epg settings. + + [Kai Sommerfeld] + * [pvr] Define a senseful default value for advanced settings 'updateemptytagsinterval'. + + [Anton Fedchin] + * [windowing] win32: update handling WM_DPICHANGED event + + [Anton Fedchin] + * [xbmc] application: handle resize event even in full screen state on windows. + + [peak3d] + * [Android] Fix MediaCodec freeze when early disposing stream + + [peak3d] + * [DllLoader] No warning if resolve fals for optional dependencies + + [Kai Sommerfeld] + * [PVR] Ignore very first 'server not reachable' notification. + + [Kai Sommerfeld] + * [guiinfo] Fixed ListItemPosition. + + [Kai Sommerfeld] + * [guiinfo] Fixed ListItemAbsolute(0). + + [Philipp Kerling] + * [sqlite] Fix DbErrors format strings + + [Philipp Kerling] + * [sqlite] Use error message returned by sqlite3_exec() + + [Philipp Kerling] + * [sqlite] Include sqlite3_errmsg() result in error messages + + [Philipp Kerling] + * [sqlite] Use extended result codes + + [peak3d] + * [Android] Fix invalid PTS decoder value (fix) + + [peak3d] + * [Android] Fix invalid PTS decoder value + + [Kai Sommerfeld] + * [PVR] Fix CPVRTimers::GetRecordingTimerForRecording to respect timer's start and stop padding time + optimize to check epg event uids if present. + + [Alwin Esch] + * [addons] add for test purpose only script for debian package generation + + [Rechi] + * update SSL CA trust store + + [DaveTBlake] + * [JSON]Speed up player and playlist operations using post rather than send for messages that don't need to wait. Fix GUI playist change notification to be done consistently by app rather than partially by JSON. + + [Rechi] + * [TexturePacker] use std:: instead of using namespace std + + [Rechi] + * [JsonSchemaBuilder] use std:: instead of using namespace std + + [fritsch] + * RenderCapture: Fix wrong printout + + [DaveTBlake] + * Fix how limits applied to artist and album smart playlists or custom nodes + + [Kai Sommerfeld] + * [PVR][settings] Reintroduce setting "Close channel OSD after switching channels", which got accidentally removed for Leia 18.0 + + [peak3d] + * [Threads] revert #15263, log tid instead posix thread + + [peak3d] + * [Binary Addon] provide API versions to addon for better downgrade handling + + [linknetx] + * Update PVRTimers.cpp + + [fritsch] + * RenderCapture: Switch to non-arb occlusion queries + + [DaVukovic] + * [skins] Estuary + Estouchy keyboard layout fixes + + [fritsch] + * VideoSync: Fixup vsync clock + + [Anton Fedchin] + * [guilib] d3dtexture: fixed wrong render target index. + + [peak3d] + * [Android] check if intent is valid + + [Rechi] + * [TexturePacker] update windows dirent implementation + + [peak3d] + * [Resolution] Check current mode if whitelist doesn't match + + [Anton Fedchin] + * [win10] filesystem: catch an exception while reading or writing a file. + + [Anton Fedchin] + * [videoplayer] winrenderer: do scaling in output shader instead of yuv2rgb, this fixes the issue with green border with nv12 texture. + + [Kai Sommerfeld] + * [PVR][videoplayer] Fix PVR input stream creation for pvr file items only containing a path and no recording/channel tag. Fixes broken recording playback using official Kodi Remote iOS app. + + [Rechi] + * [depends] remove unused platform lib + + [peak3d] + * [Demux] VP9 does not provide extradata + + [Rechi] + * [cmake] fix policy CMP0053 + + [DaveTBlake] + * Fix announcement manager locking to use separate sections for queue and listener list + + [Rechi] + * [fix] logical or operation + + [Philipp Kerling] + * [guilib] Handle empty vertex buffers in GUIFontTTFGL + + [DaveTBlake] + * Avoid trying to load music info for smartplaylists and menu items + + [Martijn Kaijser] + * bump to v18.1 RC1 + + [ronie] + * [Estouchy] cosmetic fixes + + [ronie] + * [Estuary] videoinfo - add movieset button + + [ronie] + * [Estuary] make mediainfo list focusable + + [Michael Brehm] + * Check the system capabilities to support sleep states S1/S2/S3/S4 before reporing them as available + + [KOPRajs] + * [games] Fix crash by reverting part of the PR #14146 + + + [Memphiz] + * Revert "[DetectDVDType]: fix Crash due to non-checked error state" + + [Alwin Esch] + * [addons] not pass nullptr to std::string + + [peak3d] + * [VideoPlayer] Uninitialize RenderManager early on playback stop + + [Anton Fedchin] + * [videoplayer] WinRenderer: remove `dxvaallowhqscaling` setting + + [Kai Sommerfeld] + * [pvr] Improve documentation for advanced epg settings. + + [Kai Sommerfeld] + * [pvr] Define a senseful default value for advanced settings 'updateemptytagsinterval'. + + [peak3d] + * [DllLoader] No warning if resolve fals for optional dependencies + + [DaveTBlake] + * [JSON]Speed up player and playlist operations using post rather than send for messages that don't need to wait. Fix GUI playist change notification to be done consistently by app rather than partially by JSON. + + + [Alwin Esch] + * X11: remove not needed CGLContextEGL::IsSuitableVisual + + [Alwin Esch] + * X11: fix usage of required configuration values + + [JimmyS83] + * Add date to the log records + + + + [Anton Fedchin] + * [windowing] win32: update handling WM_DPICHANGED event + + [Anton Fedchin] + * [xbmc] application: handle resize event even in full screen state on windows. + + [peak3d] + * [Android] Fix MediaCodec freeze when early disposing stream + + [Kai Sommerfeld] + * [PVR] Ignore very first 'server not reachable' notification. + + [Kai Sommerfeld] + * [guiinfo] Fixed ListItemPosition. + + [Kai Sommerfeld] + * [guiinfo] Fixed ListItemAbsolute(0). + + [Philipp Kerling] + * [sqlite] Fix DbErrors format strings + + [Philipp Kerling] + * [sqlite] Use error message returned by sqlite3_exec() + + [Philipp Kerling] + * [sqlite] Include sqlite3_errmsg() result in error messages + + [Philipp Kerling] + * [sqlite] Use extended result codes + + [Alwin Esch] + * [addons] add for test purpose only script for debian package generation + + + [peak3d] + * [Android] Fix invalid PTS decoder value (fix) + + [peak3d] + * [Android] Fix invalid PTS decoder value + + [Kai Sommerfeld] + * [PVR] Fix CPVRTimers::GetRecordingTimerForRecording to respect timer's start and stop padding time + optimize to check epg event uids if present. + + [Rechi] + * update SSL CA trust store + + [peak3d] + * [Binary Addon] provide API versions to addon for better downgrade handling + + [DaveTBlake] + * Fix announcement manager locking to use separate sections for queue and listener list + + + [Rechi] + * [TexturePacker] use std:: instead of using namespace std + + [Rechi] + * [JsonSchemaBuilder] use std:: instead of using namespace std + + [fritsch] + * RenderCapture: Fix wrong printout + + [Philipp Kerling] + * [guilib] Handle empty vertex buffers in GUIFontTTFGL + + + [DaveTBlake] + * Fix how limits applied to artist and album smart playlists or custom nodes + + [Kai Sommerfeld] + * [PVR][settings] Reintroduce setting "Close channel OSD after switching channels", which got accidentally removed for Leia 18.0 + + [peak3d] + * [Threads] revert #15263, log tid instead posix thread + + [DaveTBlake] + * Avoid trying to load music info for smartplaylists and menu items + + + [linknetx] + * Update PVRTimers.cpp + + [fritsch] + * RenderCapture: Switch to non-arb occlusion queries + + [DaVukovic] + * [skins] Estuary + Estouchy keyboard layout fixes + + [fritsch] + * VideoSync: Fixup vsync clock + + + [Anton Fedchin] + * [guilib] d3dtexture: fixed wrong render target index. + + + [peak3d] + * [Android] check if intent is valid + + [Rechi] + * [TexturePacker] update windows dirent implementation + + [peak3d] + * [Resolution] Check current mode if whitelist doesn't match + + [Kai Sommerfeld] + * [PVR][videoplayer] Fix PVR input stream creation for pvr file items only containing a path and no recording/channel tag. Fixes broken recording playback using official Kodi Remote iOS app. + + + [Anton Fedchin] + * [win10] filesystem: catch an exception while reading or writing a file. + + [Anton Fedchin] + * [videoplayer] winrenderer: do scaling in output shader instead of yuv2rgb, this fixes the issue with green border with nv12 texture. + + [Rechi] + * [depends] remove unused platform lib + + [peak3d] + * [Demux] VP9 does not provide extradata + + + [Rechi] + * [cmake] fix policy CMP0053 + + + [Rechi] + * [fix] logical or operation + + [Martijn Kaijser] + * bump to v18.1 RC1 + + [ronie] + * [Estouchy] cosmetic fixes + + [ronie] + * [Estuary] videoinfo - add movieset button + + [ronie] + * [Estuary] make mediainfo list focusable + + [Michael Brehm] + * Check the system capabilities to support sleep states S1/S2/S3/S4 before reporing them as available + + + [Martijn Kaijser] + * bump to v18.0 final + + [KOPRajs] + * [games] Fix crash by reverting part of the PR #14146 + + + [DaveTBlake] + * Apply limit and random sort in SQL rather than fetch all artists or albums into fileitem list then pick random few to show. + + [Kai Sommerfeld] + * [PVR] Fix CPVRClients::GetTimerTypes not to overwrite in multi-client setups. + + [Kai Sommerfeld] + * [PVR] client priority must be reset on stop of pvr component, because it must be re-read from db after restart. + + [Kai Sommerfeld] + * [PVR] Fix duplicate channnel numbers. Do not let slip thru numbers from channel groups to main channel instance. + + [linknetx] + * Active Skin Update - Force Close TextureBundle + + [bb10] + * Update joystick.xml + + [Rechi] + * [cleanup] remove repository.pvr-win32.xbmc.org from installdata + + [peak3d] + * [File] use dynpath for mime-type detection + + [Jonas Karlman] + * [GLES] fix check for GL_EXT_unpack_subimage + + [peak3d] + * [Windowing] fix width / screenWidth comparision. More fuzzy when searching whitelist matchse + + [DaveTBlake] + * [JSON]Fix AudioLibrary.GetGenres return of empty "sourceid" as [] Genres may not have related sources if db migrated from earlier version but rescan of files not completed. + + [Rechi] + * [cmake] replace patch file with actual commands in add_addon_depends + + [Alwin Esch] + * [addons] add define ATTRIBUTE_FORCEINLINE on addon header + + [peak3d] + * [VideoPlayer] Improve forced aspect_ratio + + [peak3d] + * check for GL_EXT_unpack_subimage + + [peak3d] + * check runtime gles version + + [peak3d] + * [GLES] memcpy intead multi glTexSubImage2D for planes with pitch + + [mglae] + * [CryptThreading] Support CRYPTO_THREADID_set_callback() of OpenSSL 1.0.x + + [fritsch] + * GLContextEGL: Properly guard members + + [peak3d] + * [GUI] refresh debug overlay if smartredraw is activated + + [Martijn Kaijser] + * bump to v18.0 final + + [Arne Morten Kvarving] + * fixed: do no add cache=no option to zip urls unless zip:// protocol + + [ronie] + * [skins] define textwidth for sliderex controls + + [wsnipex] + * [StringUtils] fix crash on addon install when using fmt 5.3 + + [fritsch] + * ProcessInfoAndroid: Register with WinSystemAndroid + + [fritsch] + * Android: Properly overwrite ProcessInfo and use Deinterlace Half by default + + [Anton Fedchin] + * [videoplayer] dxva: fixed uhd hevc-main10 playback on xbox + + [enen92] + * [docs] Add pvr.seek to possible actions of SliderControl + + [enen92] + * [Estuary] Improve VolumeSlider Dialog + + [enen92] + * [guilib] GUISliderControl - avoid scalling base textures if dimensions are zero + + [Dimitry Ishenko] + * Improve audio book bookmark handling + + [Dimitry Ishenko] + * Fix audio book resume function + + [Dimitry Ishenko] + * CApplication: remove useless fallback conversion + + [Dimitry Ishenko] + * CMusicDatabase: use actual file path to identify bookmarks + + [Dimitry Ishenko] + * CMusicDatabase: take CFileItem as argument in GetResumeBookmarkForAudioBook() + + [Attila Jakosa] + * [lang][skin.estouchy] updated language files from Transifex + + [Attila Jakosa] + * [lang][skin.estuary] updated language files from Transifex + + [DaveTBlake] + * Use artist table in GetArtist rather than artistview to avoid MySQL slowness in party mode startup + + [enen92] + * [guilib] Ensure ListItems release the layout before it is destroyed + + [DaveTBlake] + * Fix getting discography for MySQL GetArtist not query discography by default Use artist ID when have it to fetch artist props for fileitem + + [Kai Sommerfeld] + * [video][filesystem] Fix XFILE::CFileFactory::CreateLoader - unsupported protocol(pvr) logspam. + + [enen92] + * [MacOS] Fix stack-buffer-underflow + + [Kai Sommerfeld] + * [Estuary] Tweak PVR guide layout. Fixes #15271. + + [Philipp Kerling] + * [database] Promote MySQL server version message to LOGNOTICE + + [Philipp Kerling] + * [database] Log warning for MySQL < 5.6, MariaDB < 5.5 + + [bb10] + * Update joystick.xml + + [ronie] + * [py-docs] fix version info for getDbId + + [peak3d] + * [Android] Log kernel ThreadId instead pthread_self + + [Attila Jakosa] + * [lang][skin.estouchy] updated language files from Transifex + + [Attila Jakosa] + * [lang][skin.estuary] updated language files from Transifex + + [ronie] + * [Estuary] fix undefined font references + + [fritsch] + * FFmpeg: Fix missing include + + [Anton Fedchin] + * [videopayer] WinRenderer: don't keep past frames for progressive material + + [Garrett Brown] + * Game add-ons: Skip profile directory if empty + + [Kostas Andrianos] + * Add missing POP to return to the calling directory after error + + [Memphiz] + * [osx/WinSystem] - always log all found monitors and resolutions for debug purposes + + [Memphiz] + * [osx/WinSystem] - ensure that monitor names are unique by appending displayid + + [KOPRajs] + * [games] Fix crash by reverting part of the PR #14146 + + [DaveTBlake] * Apply limit and random sort in SQL rather than fetch all artists or albums into fileitem list then pick random few to show. diff -Nru kodi-18.0+git20190128.1934-final/debian/control kodi-18.1+git20190217.1232-final/debian/control --- kodi-18.0+git20190128.1934-final/debian/control 2019-01-28 18:34:23.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/debian/control 2019-02-17 11:32:30.000000000 +0000 @@ -111,6 +111,7 @@ fonts-liberation | ttf-liberation, fonts-dejavu-core | ttf-dejavu-core, python-bluez | python-lightblue, + python-cryptodome | python-pycryptodome, python-pil | python-imaging, python-simplejson, libass9 | libass5 | libass4, Binary files /tmp/tmpxTNgpJ/FgPlq7ssVA/kodi-18.0+git20190128.1934-final/media/splash.jpg and /tmp/tmpxTNgpJ/zDwpjAVej5/kodi-18.1+git20190217.1232-final/media/splash.jpg differ diff -Nru kodi-18.0+git20190128.1934-final/system/settings/settings.xml kodi-18.1+git20190217.1232-final/system/settings/settings.xml --- kodi-18.0+git20190128.1934-final/system/settings/settings.xml 2018-12-16 20:13:02.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/system/settings/settings.xml 2019-02-11 10:31:27.000000000 +0000 @@ -1294,6 +1294,11 @@ 14045 + + 2 + true + + diff -Nru kodi-18.0+git20190128.1934-final/system/shaders/yuv2rgb_d3d.fx kodi-18.1+git20190217.1232-final/system/shaders/yuv2rgb_d3d.fx --- kodi-18.0+git20190128.1934-final/system/shaders/yuv2rgb_d3d.fx 2018-05-01 00:00:13.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/system/shaders/yuv2rgb_d3d.fx 2019-02-11 10:31:27.000000000 +0000 @@ -32,16 +32,8 @@ { AddressU = CLAMP; AddressV = CLAMP; - Filter = MIN_MAG_MIP_LINEAR; -}; -#ifdef NV12_SNORM_UV -SamplerState UVSamplerSNORM : IMMUTABLE -{ - AddressU = CLAMP; - AddressV = CLAMP; Filter = MIN_MAG_MIP_POINT; }; -#endif struct VS_INPUT { @@ -93,7 +85,7 @@ #elif defined(XBMC_NV12) float4 YUV = float4(g_Texture[0].Sample(YUVSampler, In.TextureY).r #if defined(NV12_SNORM_UV) - , unormUV(g_Texture[1].Sample(UVSamplerSNORM, In.TextureUV).rg) + , unormUV(g_Texture[1].Sample(YUVSampler, In.TextureUV).rg) #else , g_Texture[1].Sample(YUVSampler, In.TextureUV).rg #endif diff -Nru kodi-18.0+git20190128.1934-final/tools/depends/native/JsonSchemaBuilder/src/JsonSchemaBuilder.cpp kodi-18.1+git20190217.1232-final/tools/depends/native/JsonSchemaBuilder/src/JsonSchemaBuilder.cpp --- kodi-18.0+git20190128.1934-final/tools/depends/native/JsonSchemaBuilder/src/JsonSchemaBuilder.cpp 2018-06-21 18:59:47.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/tools/depends/native/JsonSchemaBuilder/src/JsonSchemaBuilder.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -24,26 +24,24 @@ #include #include -using namespace std; - -void print_version(ifstream &in, ofstream &out) +void print_version(std::ifstream &in, std::ofstream &out) { - string line; + std::string line; if (getline(in, line)) - out << regex_replace(line, regex("(\\s+)?JSONRPC_VERSION\\s+|(\\s+)?#.*"), ""); + out << std::regex_replace(line, std::regex("(\\s+)?JSONRPC_VERSION\\s+|(\\s+)?#.*"), ""); } -void print_license(ifstream &in, ofstream &out) +void print_license(std::ifstream &in, std::ofstream &out) { - string line; + std::string line; while (getline(in, line, '\n')) - out << line << endl; + out << line << std::endl; } -void print_json(ifstream &in, ofstream &out) +void print_json(std::ifstream &in, std::ofstream &out) { - string line; + std::string line; unsigned int count = 0; bool closing = false; @@ -52,18 +50,18 @@ // No need to handle the last line if (line == "}") { - out << endl; + out << std::endl; continue; } // If we just closed a whole object we need to print the separator if (closing) - out << "," << endl; + out << "," << std::endl; out << " "; bool started = false; closing = false; - for (string::iterator itr = line.begin(); itr != line.end(); itr++) + for (std::string::iterator itr = line.begin(); itr != line.end(); itr++) { // Skip \r characters if (*itr == '\r') { @@ -114,13 +112,13 @@ // Only print a newline if we haven't just closed a whole object if (!closing) - out << endl; + out << std::endl; } } void print_usage(const char *application) { - cout << application << " version.txt license.txt methods.json types.json notifications.json" << endl; + std::cout << application << " version.txt license.txt methods.json types.json notifications.json" << std::endl; } int main(int argc, char* argv[]) @@ -131,48 +129,48 @@ return -1; } - ofstream out ("ServiceDescription.h", ofstream::binary); + std::ofstream out ("ServiceDescription.h", std::ofstream::binary); - ifstream version(argv[1], ios_base::in); - ifstream license(argv[2], ios_base::in); - ifstream methods(argv[3], ios_base::in); - ifstream types(argv[4], ios_base::in); - ifstream notifications(argv[5], ios_base::in); + std::ifstream version(argv[1], std::ios_base::in); + std::ifstream license(argv[2], std::ios_base::in); + std::ifstream methods(argv[3], std::ios_base::in); + std::ifstream types(argv[4], std::ios_base::in); + std::ifstream notifications(argv[5], std::ios_base::in); if (!(version && license && methods && types && notifications)) { - cout << "Failed to find one or more of version.txt, license.txt, methods.json, types.json or notifications.json" << endl; + std::cout << "Failed to find one or more of version.txt, license.txt, methods.json, types.json or notifications.json" << std::endl; return -1; } - out << "#pragma once" << endl; + out << "#pragma once" << std::endl; print_license(license, out); - out << endl; + out << std::endl; - out << "namespace JSONRPC" << endl; - out << "{" << endl; - out << " const char* const JSONRPC_SERVICE_ID = \"http://xbmc.org/jsonrpc/ServiceDescription.json\";" << endl; - out << " const char* const JSONRPC_SERVICE_VERSION = \""; print_version(version, out); out << "\";" << endl; - out << " const char* const JSONRPC_SERVICE_DESCRIPTION = \"JSON-RPC API of XBMC\";" << endl; - out << endl; + out << "namespace JSONRPC" << std::endl; + out << "{" << std::endl; + out << " const char* const JSONRPC_SERVICE_ID = \"http://xbmc.org/jsonrpc/ServiceDescription.json\";" << std::endl; + out << " const char* const JSONRPC_SERVICE_VERSION = \""; print_version(version, out); out << "\";" << std::endl; + out << " const char* const JSONRPC_SERVICE_DESCRIPTION = \"JSON-RPC API of XBMC\";" << std::endl; + out << std::endl; out << " const char* const JSONRPC_SERVICE_TYPES[] = {"; print_json(types, out); - out << " };" << endl; - out << endl; + out << " };" << std::endl; + out << std::endl; out << " const char* const JSONRPC_SERVICE_METHODS[] = {"; print_json(methods, out); - out << " };" << endl; - out << endl; + out << " };" << std::endl; + out << std::endl; out << " const char* const JSONRPC_SERVICE_NOTIFICATIONS[] = {"; print_json(notifications, out); - out << " };" << endl; + out << " };" << std::endl; - out << "}" << endl; + out << "}" << std::endl; return 0; } diff -Nru kodi-18.0+git20190128.1934-final/tools/depends/native/TexturePacker/src/TexturePacker.cpp kodi-18.1+git20190217.1232-final/tools/depends/native/TexturePacker/src/TexturePacker.cpp --- kodi-18.0+git20190128.1934-final/tools/depends/native/TexturePacker/src/TexturePacker.cpp 2018-06-21 18:59:47.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/tools/depends/native/TexturePacker/src/TexturePacker.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -47,8 +47,6 @@ #include #include -using namespace std; - #define FLAGS_USE_LZO 1 #define DIR_SEPARATOR "/" @@ -223,8 +221,8 @@ } static bool checkDupe(struct MD5Context* ctx, - map& hashes, - vector& dupes, unsigned int pos) + std::map& hashes, + std::vector& dupes, unsigned int pos) { unsigned char digest[17]; MD5Final(digest,ctx); @@ -236,14 +234,14 @@ digest[9], digest[10], digest[11], digest[12], digest[13], digest[14], digest[15]); hex[32] = 0; - map::iterator it = hashes.find(hex); + std::map::iterator it = hashes.find(hex); if (it != hashes.end()) { dupes[pos] = it->second; return true; } - hashes.insert(make_pair(hex,pos)); + hashes.insert(std::make_pair(hex,pos)); dupes[pos] = pos; return false; @@ -258,8 +256,8 @@ return 1; } - map hashes; - vector dupes; + std::map hashes; + std::vector dupes; CreateSkeletonHeader(writer, InputDir); std::vector files = writer.GetFiles(); diff -Nru kodi-18.0+git20190128.1934-final/tools/depends/native/TexturePacker/src/Win32/dirent.c kodi-18.1+git20190217.1232-final/tools/depends/native/TexturePacker/src/Win32/dirent.c --- kodi-18.0+git20190128.1934-final/tools/depends/native/TexturePacker/src/Win32/dirent.c 2015-04-04 00:00:13.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/tools/depends/native/TexturePacker/src/Win32/dirent.c 2019-02-11 10:31:27.000000000 +0000 @@ -3,7 +3,7 @@ Implementation of POSIX directory browsing functions and types for Win32. Author: Kevlin Henney (kevlin@acm.org, kevlin@curbralan.com) - History: Created March 1997. Updated June 2003. + History: Created March 1997. Updated June 2003 and July 2012. Copyright Kevlin Henney, 1997, 2003. All rights reserved. @@ -28,9 +28,11 @@ { #endif +typedef ptrdiff_t handle_type; /* C99's intptr_t not sufficiently portable */ + struct DIR { - long handle; /* -1 for failed rewind */ + handle_type handle; /* -1 for failed rewind */ struct _finddata_t info; struct dirent result; /* d_name null iff first time */ char *name; /* null-terminated char string */ @@ -51,7 +53,7 @@ { strcat(strcpy(dir->name, name), all); - if((dir->handle = (long) _findfirst(dir->name, &dir->info)) != -1) + if ((dir->handle = (handle_type)_findfirst(dir->name, &dir->info)) != -1) { dir->result.d_name = 0; dir->result.d_type = 0; @@ -127,7 +129,7 @@ if(dir && dir->handle != -1) { _findclose(dir->handle); - dir->handle = (long) _findfirst(dir->name, &dir->info); + dir->handle = (handle_type)_findfirst(dir->name, &dir->info); dir->result.d_name = 0; dir->result.d_type = 0; } diff -Nru kodi-18.0+git20190128.1934-final/tools/depends/target/Makefile kodi-18.1+git20190217.1232-final/tools/depends/target/Makefile --- kodi-18.0+git20190128.1934-final/tools/depends/target/Makefile 2018-12-29 14:31:08.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/tools/depends/target/Makefile 2019-02-11 10:31:27.000000000 +0000 @@ -14,7 +14,7 @@ libplist libcec libbluray tinyxml \ taglib libusb libnfs \ pythonmodule-pil pythonmodule-pycryptodome pythonmodule-setuptools \ - libxslt ffmpeg platform crossguid \ + libxslt ffmpeg crossguid \ libdvdread libdvdnav libdvdcss p8-platform flatbuffers @@ -109,7 +109,6 @@ pythonmodule-setuptools: $(PYMODULE_DEPS) python27 libxslt: libgcrypt libxml2 ffmpeg: $(ICONV) $(ZLIB) bzip2 $(FFMPEG_DEPENDS) -platform: p8-platform libcec: p8-platform crossguid: $(CROSSGUID_DEPS) libdvdnav: libdvdread diff -Nru kodi-18.0+git20190128.1934-final/tools/depends/target/openssl/cacert.pem kodi-18.1+git20190217.1232-final/tools/depends/target/openssl/cacert.pem --- kodi-18.0+git20190128.1934-final/tools/depends/target/openssl/cacert.pem 2018-08-26 13:40:15.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/tools/depends/target/openssl/cacert.pem 2019-02-11 10:31:27.000000000 +0000 @@ -1,7 +1,7 @@ ## ## Bundle of CA Root Certificates ## -## Certificate data from Mozilla as of: Wed Aug 1 10:00:00 2018 GMT +## Certificate data from Mozilla as of: Wed Feb 6 10:00:00 2019 GMT ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates @@ -14,7 +14,7 @@ ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl version 1.27. -## SHA256: c80f571d9f4ebca4a91e0ad3a546f263153d71afffc845c6f8f52ce9d1a2e8ec +## SHA256: 18372117493b5b7ec006c31d966143fc95a9464a2b5f8d5188e23c5557b2292d ## @@ -261,28 +261,6 @@ X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- -Visa eCommerce Root -=================== ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG -EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug -QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 -WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm -VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL -F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b -RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 -TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI -/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs -GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc -CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW -YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz -zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- @@ -2792,126 +2770,6 @@ dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- -Certplus Root CA G1 -=================== ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUAMD4xCzAJBgNV -BAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTAe -Fw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhD -ZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHN -r49aiZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt6kuJPKNx -Qv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP0FG7Yn2ksYyy/yARujVj -BYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTv -LRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDEEW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2 -z4QTd28n6v+WZxcIbekN1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc -4nBvCGrch2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCTmehd -4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV4EJQeIQEQWGw9CEj -jy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPOWftwenMGE9nTdDckQQoRb5fc5+R+ -ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0G -A1UdDgQWBBSowcCbkahDFXxdBie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHY -lwuBsTANBgkqhkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh -66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7/SMNkPX0XtPG -YX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BSS7CTKtQ+FjPlnsZlFT5kOwQ/ -2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F -6ALEUz65noe8zDUa3qHpimOHZR4RKttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilX -CNQ314cnrUlZp5GrRHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWe -tUNy6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEVV/xuZDDC -VRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5g4VCXA9DO2pJNdWY9BW/ -+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl++O/QmueD6i9a5jc2NvLi6Td11n0bt3+ -qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= ------END CERTIFICATE----- - -Certplus Root CA G2 -=================== ------BEGIN CERTIFICATE----- -MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT -AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x -NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0 -cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN -Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud -IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV -HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl -vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw== ------END CERTIFICATE----- - -OpenTrust Root CA G1 -==================== ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcx -MB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM -CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7fa -Yp6bwiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX/uMftk87 -ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR077F9jAHiOH3BX2pfJLKO -YheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGPuY4zbGneWK2gDqdkVBFpRGZPTBKnjix9 -xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLxp2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO -9z0M+Yo0FMT7MzUj8czxKselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq -3ywgsNw2TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+WG+Oi -n6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPwvFEVVJSmdz7QdFG9 -URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYYEQRVzXR7z2FwefR7LFxckvzluFqr -TJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUl0YhVyE12jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/Px -N3DlCPaTKbYwDQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E -PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kfgLMtMrpkZ2Cv -uVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbSFXJfLkur1J1juONI5f6ELlgK -n0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLh -X4SPgPL0DTatdrOjteFkdjpY3H1PXlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80 -nR14SohWZ25g/4/Ii+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcm -GS3tTAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L9109S5zvE/ -bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/KyPu1svf0OnWZzsD2097+o -4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJAwSQiumPv+i2tCqjI40cHLI5kqiPAlxA -OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx ------END CERTIFICATE----- - -OpenTrust Root CA G2 -==================== ------BEGIN CERTIFICATE----- -MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUAMEAxCzAJBgNV -BAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEcy -MB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoM -CU9wZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+ -Ntmh/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78eCbY2albz -4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/61UWY0jUJ9gNDlP7ZvyCV -eYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fEFY8ElggGQgT4hNYdvJGmQr5J1WqIP7wt -UdGejeBSzFfdNTVY27SPJIjki9/ca1TSgSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz -3GIZ38i1MH/1PCZ1Eb3XG7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj -3CzMpSZyYhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaHvGOz -9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4t/bQWVyJ98LVtZR0 -0dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/gh7PU3+06yzbXfZqfUAkBXKJOAGT -y3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUajn6QiL35okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59 -M4PLuG53hq8wDQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz -Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0nXGEL8pZ0keI -mUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qTRmTFAHneIWv2V6CG1wZy7HBG -S4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpTwm+bREx50B1ws9efAvSyB7DH5fitIw6mVskp -EndI2S9G/Tvw/HRwkqWOOAgfZDC2t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ -6e18CL13zSdkzJTaTkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97kr -gCf2o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU3jg9CcCo -SmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eAiN1nE28daCSLT7d0geX0 -YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14fWKGVyasvc0rQLW6aWQ9VGHgtPFGml4vm -u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK ------END CERTIFICATE----- - -OpenTrust Root CA G3 -==================== ------BEGIN CERTIFICATE----- -MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT -AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X -DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w -ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B -ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB -/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf -BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM -BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta -3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB ------END CERTIFICATE----- - ISRG Root X1 ============ -----BEGIN CERTIFICATE----- @@ -3312,3 +3170,232 @@ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- + +GlobalSign Root CA - R6 +======================= +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX +R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i +YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs +U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss +grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE +3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF +vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM +PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ +azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O +WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy +CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP +0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN +b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV +HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 +lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY +BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym +Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr +3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 +0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T +uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK +oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t +JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GC CA +=============================== +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD +SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo +MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa +Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL +ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr +VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab +NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E +AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk +AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +GTS Root R1 +=========== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG +EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv +b3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG +A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx +9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7r +aKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnW +r4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqM +LnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly +4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr +06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 +wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om +3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNu +JLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEM +BQADggIBADiWCu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73sv +fuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xm +ld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9b +gsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq +4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWEr +tXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyyF62ARPBo +pY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9SQ98POyDGCBDTtWTurQ0 +sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQcu51OyLemGhmW/HGY0dVHLql +CFF1pkgl +-----END CERTIFICATE----- + +GTS Root R2 +=========== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG +EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv +b3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG +A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTuk +k3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo +7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWI +m8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5Gm +dFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbu +ak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscsz +cTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW +Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73Vululycsl +aVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy +5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEM +BQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ ++YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw +c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3Da +WsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5r +n/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56Gtmwfu +Nmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ +7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXs +gWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ld +o/DUhgkC +-----END CERTIFICATE----- + +GTS Root R3 +=========== +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUU +Rout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24Cej +QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP +0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0 +glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOa +KaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +GTS Root R4 +=========== +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa +6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqj +QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV +2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoI +N+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11x +zPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +UCA Global G2 Root +================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x +NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU +cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT +oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV +8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS +h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o +LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ +R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe +KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa +4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc +OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 +8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo +5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A +Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 +yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX +c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo +jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk +bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x +ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn +RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== +-----END CERTIFICATE----- + +UCA Extended Validation Root +============================ +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u +IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G +A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs +iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF +Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu +eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR +59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH +0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR +el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv +B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth +WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS +NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS +3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL +BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM +aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 +dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb ++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW +F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi +GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc +GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi +djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr +dhh2n1ax +-----END CERTIFICATE----- + +Certigna Root CA +================ +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE +BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ +MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda +MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz +MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX +stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz +KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 +JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 +XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq +4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej +wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ +lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI +jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ +/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy +dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h +LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl +cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt +OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP +TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq +7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 +4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd +8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS +6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY +tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS +aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde +E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- diff -Nru kodi-18.0+git20190128.1934-final/tools/depends/target/platform/Makefile kodi-18.1+git20190217.1232-final/tools/depends/target/platform/Makefile --- kodi-18.0+git20190128.1934-final/tools/depends/target/platform/Makefile 2018-05-01 00:00:20.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/tools/depends/target/platform/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -include ../../Makefile.include -DEPS= ../../Makefile.include Makefile - -# lib name, version -LIBNAME=platform -VERSION=1.0.10 -SOURCE=$(LIBNAME)-$(VERSION) -ARCHIVE=$(SOURCE).tar.gz - -LIBDYLIB=$(PLATFORM)/build/lib$(LIBNAME).a - -all: .installed-$(PLATFORM) - -$(TARBALLS_LOCATION)/$(ARCHIVE): - cd $(TARBALLS_LOCATION); $(RETRIEVE_TOOL) $(RETRIEVE_TOOL_FLAGS) $(BASE_URL)/$(ARCHIVE) - -$(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS) - rm -rf $(PLATFORM); mkdir -p $(PLATFORM)/build - cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) - cd $(PLATFORM)/build; $(CMAKE) -DBUILD_SHARED_LIBS=0 -DCMAKE_INSTALL_LIBDIR=$(PREFIX)/lib .. - -$(LIBDYLIB): $(PLATFORM) - $(MAKE) -C $(PLATFORM)/build - -.installed-$(PLATFORM): $(LIBDYLIB) - $(MAKE) -C $(PLATFORM)/build install - touch $@ - -clean: - rm -rf $(PLATFORM) .installed-$(PLATFORM) - -distclean:: - rm -rf $(PLATFORM) .installed-$(PLATFORM) - diff -Nru kodi-18.0+git20190128.1934-final/VERSION kodi-18.1+git20190217.1232-final/VERSION --- kodi-18.0+git20190128.1934-final/VERSION 2019-01-28 18:34:23.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/VERSION 2019-02-17 11:32:30.000000000 +0000 @@ -1 +1 @@ -d81c34c +8cfdc89 diff -Nru kodi-18.0+git20190128.1934-final/version.txt kodi-18.1+git20190217.1232-final/version.txt --- kodi-18.0+git20190128.1934-final/version.txt 2019-01-28 18:34:07.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/version.txt 2019-02-17 11:32:04.000000000 +0000 @@ -3,10 +3,10 @@ COPYRIGHT_YEARS 2005-2018 WEBSITE http://kodi.tv VERSION_MAJOR 18 -VERSION_MINOR 0 +VERSION_MINOR 1 VERSION_TAG -VERSION_CODE 18.0.0 -ADDON_API 18.0.0 +VERSION_CODE 18.1.0 +ADDON_API 18.1.0 APP_PACKAGE org.xbmc.kodi PACKAGE_IDENTITY XBMCFoundation.Kodi PACKAGE_PUBLISHER C62BD90A-CDD8-477F-96C3-B25992247B97 diff -Nru kodi-18.0+git20190128.1934-final/xbmc/addons/binary-addons/AddonDll.cpp kodi-18.1+git20190217.1232-final/xbmc/addons/binary-addons/AddonDll.cpp --- kodi-18.0+git20190128.1934-final/xbmc/addons/binary-addons/AddonDll.cpp 2018-11-04 08:12:28.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/addons/binary-addons/AddonDll.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -215,7 +215,10 @@ /* Call Create to make connections, initializing data or whatever is needed to become the AddOn running */ - ADDON_STATUS status = m_pDll->Create(m_pHelpers->GetCallbacks(), info); + ADDON_STATUS status = m_pDll->CreateEx_available() + ? m_pDll->CreateEx(m_pHelpers->GetCallbacks(), kodi::addon::GetTypeVersion(ADDON_GLOBAL_MAIN), info) + : m_pDll->Create(m_pHelpers->GetCallbacks(), info); + if (status == ADDON_STATUS_OK) { m_initialized = true; @@ -263,7 +266,10 @@ /* Call Create to make connections, initializing data or whatever is needed to become the AddOn running */ - ADDON_STATUS status = m_pDll->Create(&m_interface, nullptr); + ADDON_STATUS status = m_pDll->CreateEx_available() + ? m_pDll->CreateEx(&m_interface, kodi::addon::GetTypeVersion(ADDON_GLOBAL_MAIN), nullptr) + : m_pDll->Create(&m_interface, nullptr); + if (status == ADDON_STATUS_OK) { m_initialized = true; @@ -323,7 +329,11 @@ return ADDON_STATUS_PERMANENT_FAILURE; KODI_HANDLE addonInstance; - status = m_interface.toAddon->create_instance(instanceType, instanceID.c_str(), instance, &addonInstance, parentInstance); + if (!m_interface.toAddon->create_instance_ex) + status = m_interface.toAddon->create_instance(instanceType, instanceID.c_str(), instance, &addonInstance, parentInstance); + else + status = m_interface.toAddon->create_instance_ex(instanceType, instanceID.c_str(), instance, &addonInstance, parentInstance, kodi::addon::GetTypeVersion(instanceType)); + if (status == ADDON_STATUS_OK) { m_usedInstances[instanceID] = std::make_pair(instanceType, addonInstance); @@ -334,6 +344,9 @@ void CAddonDll::DestroyInstance(const std::string& instanceID) { + if (m_usedInstances.empty()) + return; + auto it = m_usedInstances.find(instanceID); if (it != m_usedInstances.end()) { @@ -450,6 +463,9 @@ /* check the API version */ AddonVersion kodiMinVersion(kodi::addon::GetTypeMinVersion(type)); AddonVersion addonVersion(m_pDll->GetAddonTypeVersion(type)); + AddonVersion addonMinVersion = m_pDll->GetAddonTypeMinVersion_available() + ? AddonVersion(m_pDll->GetAddonTypeMinVersion(type)) + : addonVersion; /* Check the global usage from addon * if not used from addon becomes "0.0.0" returned @@ -461,13 +477,15 @@ * present. */ if (kodiMinVersion > addonVersion || - addonVersion > AddonVersion(kodi::addon::GetTypeVersion(type))) + addonMinVersion > AddonVersion(kodi::addon::GetTypeVersion(type))) { - CLog::Log(LOGERROR, "Add-on '%s' is using an incompatible API version for type '%s'. Kodi API min version = '%s', add-on API version '%s'", - Name().c_str(), - kodi::addon::GetTypeName(type), - kodiMinVersion.asString().c_str(), - addonVersion.asString().c_str()); + CLog::Log(LOGERROR, "Add-on '{}' is using an incompatible API version for type '{}'. Kodi API min version = '{}/{}', add-on API version '{}/{}'", + Name(), + kodi::addon::GetTypeName(type), + kodi::addon::GetTypeVersion(type), + kodiMinVersion.asString(), + addonMinVersion.asString(), + addonVersion.asString()); CEventLog &eventLog = CServiceBroker::GetEventLog(); eventLog.AddWithNotification(EventPtr(new CNotificationEvent(Name(), 24152, EventLevel::Error))); diff -Nru kodi-18.0+git20190128.1934-final/xbmc/addons/binary-addons/DllAddon.h kodi-18.1+git20190217.1232-final/xbmc/addons/binary-addons/DllAddon.h --- kodi-18.0+git20190128.1934-final/xbmc/addons/binary-addons/DllAddon.h 2018-07-31 18:47:38.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/addons/binary-addons/DllAddon.h 2019-02-11 10:31:27.000000000 +0000 @@ -17,10 +17,12 @@ virtual ~DllAddonInterface() = default; virtual void GetAddon(void* pAddon) =0; virtual ADDON_STATUS Create(void *cb, void *info) =0; + virtual ADDON_STATUS CreateEx(void *cb, const char* globalApiVersion, void *info) = 0; virtual void Destroy() =0; virtual ADDON_STATUS GetStatus() =0; virtual ADDON_STATUS SetSetting(const char *settingName, const void *settingValue) =0; virtual const char* GetAddonTypeVersion(int type)=0; + virtual const char* GetAddonTypeMinVersion(int type) = 0; }; class DllAddon : public DllDynamic, public DllAddonInterface @@ -28,18 +30,24 @@ public: DECLARE_DLL_WRAPPER_TEMPLATE(DllAddon) DEFINE_METHOD2(ADDON_STATUS, Create, (void* p1, void* p2)) + DEFINE_METHOD3(ADDON_STATUS, CreateEx, (void* p1, const char* p2, void* p3)) + bool CreateEx_available() { return m_CreateEx != nullptr; } DEFINE_METHOD0(void, Destroy) DEFINE_METHOD0(ADDON_STATUS, GetStatus) DEFINE_METHOD2(ADDON_STATUS, SetSetting, (const char *p1, const void *p2)) DEFINE_METHOD1(void, GetAddon, (void* p1)) DEFINE_METHOD1(const char*, GetAddonTypeVersion, (int p1)) + DEFINE_METHOD1(const char*, GetAddonTypeMinVersion, (int p1)) + bool GetAddonTypeMinVersion_available() { return m_GetAddonTypeMinVersion != nullptr; } BEGIN_METHOD_RESOLVE() RESOLVE_METHOD_RENAME(get_addon,GetAddon) RESOLVE_METHOD_RENAME(ADDON_Create, Create) + RESOLVE_METHOD_RENAME_OPTIONAL(ADDON_CreateEx, CreateEx) RESOLVE_METHOD_RENAME(ADDON_Destroy, Destroy) RESOLVE_METHOD_RENAME(ADDON_GetStatus, GetStatus) RESOLVE_METHOD_RENAME(ADDON_SetSetting, SetSetting) RESOLVE_METHOD_RENAME(ADDON_GetTypeVersion, GetAddonTypeVersion) + RESOLVE_METHOD_RENAME_OPTIONAL(ADDON_GetTypeMinVersion, GetAddonTypeMinVersion) END_METHOD_RESOLVE() }; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/addons/interfaces/GUI/controls/FadeLabel.cpp kodi-18.1+git20190217.1232-final/xbmc/addons/interfaces/GUI/controls/FadeLabel.cpp --- kodi-18.0+git20190128.1934-final/xbmc/addons/interfaces/GUI/controls/FadeLabel.cpp 2018-07-31 18:47:38.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/addons/interfaces/GUI/controls/FadeLabel.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -53,7 +53,7 @@ { CAddonDll* addon = static_cast(kodiBase); CGUIFadeLabelControl* control = static_cast(handle); - if (!addon || !control | !label) + if (!addon || !control || !label) { CLog::Log(LOGERROR, "Interface_GUIControlFadeLabel::%s - invalid handler data (kodiBase='%p', handle='%p', label='%p') on addon '%s'", __FUNCTION__, kodiBase, handle, label, addon ? addon->ID().c_str() : "unknown"); diff -Nru kodi-18.0+git20190128.1934-final/xbmc/addons/interfaces/GUI/ListItem.cpp kodi-18.1+git20190217.1232-final/xbmc/addons/interfaces/GUI/ListItem.cpp --- kodi-18.0+git20190128.1934-final/xbmc/addons/interfaces/GUI/ListItem.cpp 2018-07-31 18:47:38.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/addons/interfaces/GUI/ListItem.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -274,7 +274,7 @@ { CAddonDll* addon = static_cast(kodiBase); CFileItemPtr* item = static_cast(handle); - if (!addon || !item || !type | !label) + if (!addon || !item || !type || !label) { CLog::Log(LOGERROR, "Interface_GUIListItem::%s - invalid handler data (kodiBase='%p', handle='%p', type= " diff -Nru kodi-18.0+git20190128.1934-final/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h kodi-18.1+git20190217.1232-final/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h --- kodi-18.0+git20190128.1934-final/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h 2019-01-28 18:34:07.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/addons/kodi-addon-dev-kit/include/kodi/AddonBase.h 2019-02-11 10:31:27.000000000 +0000 @@ -193,6 +193,7 @@ ADDON_STATUS (*create_instance)(int instanceType, const char* instanceID, KODI_HANDLE instance, KODI_HANDLE* addonInstance, KODI_HANDLE parent); void (*destroy_instance)(int instanceType, KODI_HANDLE instance); ADDON_STATUS (*set_setting)(const char *settingName, const void *settingValue); + ADDON_STATUS(*create_instance_ex)(int instanceType, const char* instanceID, KODI_HANDLE instance, KODI_HANDLE* addonInstance, KODI_HANDLE parent, const char* version); } KodiToAddonFuncTable_Addon; /* @@ -251,6 +252,11 @@ return ADDON_STATUS_NOT_IMPLEMENTED; } + virtual ADDON_STATUS CreateInstanceEx(int instanceType, std::string instanceID, KODI_HANDLE instance, KODI_HANDLE& addonInstance, const std::string &version) + { + return CreateInstance(instanceType, instanceID, instance, addonInstance); + } + const ADDON_TYPE m_type; }; } /* namespace addon */ @@ -292,6 +298,9 @@ CAddonBase::m_interface->toAddon->create_instance = ADDONBASE_CreateInstance; CAddonBase::m_interface->toAddon->destroy_instance = ADDONBASE_DestroyInstance; CAddonBase::m_interface->toAddon->set_setting = ADDONBASE_SetSetting; + // If version is present, we know that kodi has create_instance_ex implemented + if (!CAddonBase::m_strGlobalApiVersion.empty()) + CAddonBase::m_interface->toAddon->create_instance_ex = ADDONBASE_CreateInstanceEx; } virtual ~CAddonBase() = default; @@ -320,8 +329,14 @@ return ADDON_STATUS_UNKNOWN; } + virtual ADDON_STATUS CreateInstanceEx(int instanceType, std::string instanceID, KODI_HANDLE instance, KODI_HANDLE& addonInstance, const std::string &version) + { + return CreateInstance(instanceType, instanceID, instance, addonInstance); + } + /* Global variables of class */ static AddonGlobalInterface* m_interface; // Interface function table to hold addresses on add-on and from kodi + static std::string m_strGlobalApiVersion; /*private:*/ /* Needed public as long the old call functions becomes used! */ static inline void ADDONBASE_Destroy() @@ -339,16 +354,21 @@ static inline ADDON_STATUS ADDONBASE_CreateInstance(int instanceType, const char* instanceID, KODI_HANDLE instance, KODI_HANDLE* addonInstance, KODI_HANDLE parent) { + return ADDONBASE_CreateInstanceEx(instanceType, instanceID, instance, addonInstance, parent, ""); + } + + static inline ADDON_STATUS ADDONBASE_CreateInstanceEx(int instanceType, const char* instanceID, KODI_HANDLE instance, KODI_HANDLE* addonInstance, KODI_HANDLE parent, const char* version) + { ADDON_STATUS status = ADDON_STATUS_NOT_IMPLEMENTED; if (parent != nullptr) - status = static_cast(parent)->CreateInstance(instanceType, instanceID, instance, *addonInstance); + status = static_cast(parent)->CreateInstanceEx(instanceType, instanceID, instance, *addonInstance, version); if (status == ADDON_STATUS_NOT_IMPLEMENTED) - status = CAddonBase::m_interface->addonBase->CreateInstance(instanceType, instanceID, instance, *addonInstance); + status = CAddonBase::m_interface->addonBase->CreateInstanceEx(instanceType, instanceID, instance, *addonInstance, version); if (*addonInstance == nullptr) - throw std::logic_error("kodi::addon::CAddonBase CreateInstance returns a empty instance pointer!"); + throw std::logic_error("kodi::addon::CAddonBase CreateInstanceEx returns a empty instance pointer!"); if (static_cast<::kodi::addon::IAddonInstance*>(*addonInstance)->m_type != instanceType) - throw std::logic_error("kodi::addon::CAddonBase CreateInstance with difference on given and returned instance type!"); + throw std::logic_error("kodi::addon::CAddonBase CreateInstanceEx with difference on given and returned instance type!"); return status; } @@ -650,6 +670,11 @@ kodi::addon::CAddonBase::m_interface->addonBase = new AddonClass; \ return kodi::addon::CAddonBase::m_interface->addonBase->Create(); \ } \ + extern "C" __declspec(dllexport) ADDON_STATUS ADDON_CreateEx(KODI_HANDLE addonInterface, const char* globalApiVersion, void *unused) \ + { \ + kodi::addon::CAddonBase::m_strGlobalApiVersion = globalApiVersion; \ + return ADDON_Create(addonInterface, unused); \ + } \ extern "C" __declspec(dllexport) void ADDON_Destroy() \ { \ kodi::addon::CAddonBase::ADDONBASE_Destroy(); \ @@ -666,4 +691,10 @@ { \ return kodi::addon::GetTypeVersion(type); \ } \ - AddonGlobalInterface* kodi::addon::CAddonBase::m_interface = nullptr; + extern "C" __declspec(dllexport) const char* ADDON_GetTypeMinVersion(int type) \ + { \ + return kodi::addon::GetTypeMinVersion(type); \ + } \ + AddonGlobalInterface* kodi::addon::CAddonBase::m_interface = nullptr; \ + std::string kodi::addon::CAddonBase::m_strGlobalApiVersion; + diff -Nru kodi-18.0+git20190128.1934-final/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_addon_dll.h kodi-18.1+git20190217.1232-final/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_addon_dll.h --- kodi-18.0+git20190128.1934-final/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_addon_dll.h 2018-07-31 18:47:38.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_addon_dll.h 2019-02-11 10:31:27.000000000 +0000 @@ -15,6 +15,7 @@ #endif ADDON_STATUS __declspec(dllexport) ADDON_Create(void *callbacks, void* props); + ADDON_STATUS __declspec(dllexport) ADDON_CreateEx(void *callbacks, const char* globalApiVersion, void* props); void __declspec(dllexport) ADDON_Destroy(); ADDON_STATUS __declspec(dllexport) ADDON_GetStatus(); ADDON_STATUS __declspec(dllexport) ADDON_SetSetting(const char *settingName, const void *settingValue); @@ -22,6 +23,10 @@ { return kodi::addon::GetTypeVersion(type); } + __declspec(dllexport) const char* ADDON_GetTypeMinVersion(int type) + { + return kodi::addon::GetTypeMinVersion(type); + } #ifdef __cplusplus }; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/addons/kodi-addon-dev-kit/tools/debian-addon-package-test.sh kodi-18.1+git20190217.1232-final/xbmc/addons/kodi-addon-dev-kit/tools/debian-addon-package-test.sh --- kodi-18.0+git20190128.1934-final/xbmc/addons/kodi-addon-dev-kit/tools/debian-addon-package-test.sh 1970-01-01 00:00:00.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/addons/kodi-addon-dev-kit/tools/debian-addon-package-test.sh 2019-02-11 10:31:27.000000000 +0000 @@ -0,0 +1,141 @@ +#!/bin/bash + +# This script is for purely testing purposes! +# +# It is meant to be able to test at binary addons the creation of a debian +# package. +# +# The created files are below the source code folder. +# +# Example: +# ./build-debian-addon-package.sh $HOME/your_path/screensaver.stars +# +# To remove generated code: +# ./build-debian-addon-package.sh $HOME/your_path/screensaver.stars --clean +# + +BASE_DIR="" +REPO_DIR="" +PACKAGEVERSION="" +VERSION_MAIN="" +VERSION_MINOR="" +VERSION_REVISON="" +GIT_REV="" +DIST="" +TAGREV=${TAGREV:-"0"} + +function usage { + echo "\ +-------------------------------------------------------------------------------- + +This script builds a Kodi addon debian package from the given addon source. + +As value, the path to the addon must be given. +In addition --clean can be used to remove the created debian files. + +WARNING: This script is for testing purposes only! + +--------------------------------------------------------------------------------" +} + +function checkEnv { + echo "#------ build environment ------#" + echo "BASE_DIR: $BASE_DIR" + echo "REPO_DIR: $REPO_DIR" + getVersion + echo "VERSION_MAIN: $VERSION_MAIN" + echo "VERSION_MINOR: $VERSION_MINOR" + echo "VERSION_REVISON: $VERSION_REVISON" + if [ $GIT_REV ]; then + echo "GIT_REV: $GIT_REV" + fi + echo "TAGREV: $TAGREV" + echo "DIST: $DIST" + echo "ARCHS: $ARCHS" + + echo "#-------------------------------#" +} + +function getVersion { + if [ -d ${BASE_DIR}/.git ]; then + getGitRev + fi + PACKAGEVERSION=$(cat ${BASE_DIR}/$REPO_DIR/addon.xml.in | sed -n '/version/ s/.*version=\"\([0-9]\+\.[0-9]\+\.[0-9]\+\)\".*/\1/p') + VERSION_MAIN=$(echo $PACKAGEVERSION | awk -F. '{print $1}') + VERSION_MINOR=$(echo $PACKAGEVERSION | awk -F. '{print $2}') + VERSION_REVISON=$(echo $PACKAGEVERSION | awk -F. '{print $3}') +} + +function getGitRev { + cd $BASE_DIR || exit 1 + GIT_REV=$(git log -1 --pretty=format:"%h") +} + +function cleanup() { + echo "Starting to remove debian generated files" + cd ${BASE_DIR} + rm -rf obj-$ARCHS-linux-gnu + rm -rf debian/.debhelper + rm -rf debian/"kodi-"$(echo $REPO_DIR | tr . -) + rm -rf debian/"kodi-"$(echo $REPO_DIR | tr . -)-dbg + rm -rf debian/tmp + rm -f debian/changelog + rm -f debian/debhelper-build-stamp + rm -f debian/files + rm -f debian/*.log + rm -f debian/*.substvars +} + +if [[ $1 = "-h" ]] || [[ $1 = "--help" ]]; then + echo "$0:" + usage + exit +fi + +if [ ! $1 ] || [ ${1} = "--clean" ]; then + printf "$0:\nERROR: Addon source code must be given as the first parameter!\n" + usage + exit 1 +elif [ ! -d $1 ]; then + printf "$0:\nERROR: Given folder is not present or not a valid addon source!\n" + usage + exit 1 +fi + +ARCHS=$(uname -m) +BASE_DIR=$(realpath ${1}) +REPO_DIR=$(basename ${1}) +DIST=$(lsb_release -cs) + +if [ ! -f ${BASE_DIR}/$REPO_DIR/addon.xml.in ]; then + echo "$0: +ERROR: \"required $REPO_DIR/addon.xml.in\" not found! + +The base source dir and addon.xml.in containing directory names must be equal" + usage + exit 1 +fi + +checkEnv + +ORIGTARBALL="kodi-"$(echo $REPO_DIR | tr . -)"_${PACKAGEVERSION}.orig.tar.gz" + +if [[ ${2} = "--clean" ]]; then + cleanup + exit +fi + +echo "Detected addon package version: ${PACKAGEVERSION}" + +sed -e "s/#PACKAGEVERSION#/${PACKAGEVERSION}/g" \ + -e "s/#TAGREV#/${TAGREV}/g" \ + -e "s/#DIST#/${DIST}/g" ${BASE_DIR}/debian/changelog.in > ${BASE_DIR}/debian/changelog + +echo "Create needed compressed source code file: ${BASE_DIR}/../${ORIGTARBALL}.tar.gz" + +# git archive --format=tar.gz -o ${BASE_DIR}/../${ORIGTARBALL} HEAD # Unused git, leaved as optional way +EXCLUDE=$(cat .gitignore | sed -e '/#/d' -e '/^\s*$/d' -e 's/^/--exclude=/' -e 's/\/$//' | tr '\n' ' ') +tar -zcvf ${BASE_DIR}/../${ORIGTARBALL} --exclude=.git $EXCLUDE * # Used to prevent on code changed for test a git commit + +echo "Building debian-source package for ${DIST}" +dpkg-buildpackage -us -uc --diff-ignore="()$" diff -Nru kodi-18.0+git20190128.1934-final/xbmc/addons/PVRClient.cpp kodi-18.1+git20190217.1232-final/xbmc/addons/PVRClient.cpp --- kodi-18.0+git20190128.1934-final/xbmc/addons/PVRClient.cpp 2019-01-28 18:34:07.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/addons/PVRClient.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -1218,8 +1218,22 @@ (m_clientCapabilities.SupportsRadio() && channel->IsRadio()))); } -PVR_ERROR CPVRClient::OpenLiveStream(const CPVRChannelPtr &channel) +PVR_ERROR CPVRClient::OpenLiveStream(const CFileItem& channelItem) { + std::shared_ptr channel = channelItem.GetPVRChannelInfoTag(); + if (!channel) + { + const std::shared_ptr item = CServiceBroker::GetPVRManager().ChannelGroups()->GetByPath(channelItem.GetPath()); + if (item) + channel = item->GetPVRChannelInfoTag(); + } + + if (!channel) + { + CLog::LogFC(LOGERROR, LOGPVR, "Unable to obtain channel for path '%s'", channelItem.GetPath().c_str()); + return PVR_ERROR_INVALID_PARAMETERS; + } + return DoAddonCall(__FUNCTION__, [this, channel](const AddonInstance* addon) { CloseLiveStream(); @@ -1238,8 +1252,22 @@ }); } -PVR_ERROR CPVRClient::OpenRecordedStream(const CPVRRecordingPtr &recording) +PVR_ERROR CPVRClient::OpenRecordedStream(const CFileItem& recordingItem) { + std::shared_ptr recording = recordingItem.GetPVRRecordingInfoTag(); + if (!recording) + { + const std::shared_ptr item = CServiceBroker::GetPVRManager().Recordings()->GetByPath(recordingItem.GetPath()); + if (item) + recording = item->GetPVRRecordingInfoTag(); + } + + if (!recording) + { + CLog::LogFC(LOGERROR, LOGPVR, "Unable to obtain recording for path '%s'", recordingItem.GetPath().c_str()); + return PVR_ERROR_INVALID_PARAMETERS; + } + return DoAddonCall(__FUNCTION__, [this, recording](const AddonInstance* addon) { CloseRecordedStream(); diff -Nru kodi-18.0+git20190128.1934-final/xbmc/addons/PVRClient.h kodi-18.1+git20190217.1232-final/xbmc/addons/PVRClient.h --- kodi-18.0+git20190128.1934-final/xbmc/addons/PVRClient.h 2018-10-23 16:19:50.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/addons/PVRClient.h 2019-02-11 10:31:27.000000000 +0000 @@ -609,10 +609,10 @@ /*! * @brief Open a live stream on the server. - * @param channel The channel to stream. + * @param channelItem The channel to stream. * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. */ - PVR_ERROR OpenLiveStream(const CPVRChannelPtr &channel); + PVR_ERROR OpenLiveStream(const CFileItem& channelItem); /*! * @brief Close an open live stream. @@ -711,10 +711,10 @@ /*! * @brief Open a recording on the server. - * @param recording The recording to open. + * @param recordingItem The recording to open. * @return PVR_ERROR_NO_ERROR on success, respective error code otherwise. */ - PVR_ERROR OpenRecordedStream(const CPVRRecordingPtr &recording); + PVR_ERROR OpenRecordedStream(const CFileItem& recordingItem); /*! * @brief Close an open recording stream. diff -Nru kodi-18.0+git20190128.1934-final/xbmc/Application.cpp kodi-18.1+git20190217.1232-final/xbmc/Application.cpp --- kodi-18.0+git20190128.1934-final/xbmc/Application.cpp 2019-01-28 18:34:07.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/Application.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -278,6 +278,18 @@ settings->SetInt(CSettings::SETTING_WINDOW_HEIGHT, newEvent.resize.h); settings->Save(); } +#ifdef TARGET_WINDOWS + else + { + // this may occurs when OS tries to resize application window + //CDisplaySettings::GetInstance().SetCurrentResolution(RES_DESKTOP, true); + //auto& gfxContext = CServiceBroker::GetWinSystem()->GetGfxContext(); + //gfxContext.SetVideoResolution(gfxContext.GetVideoResolution(), true); + // try to resize window back to it's full screen size + auto& res_info = CDisplaySettings::GetInstance().GetResolutionInfo(RES_DESKTOP); + CServiceBroker::GetWinSystem()->ResizeWindow(res_info.iScreenWidth, res_info.iScreenHeight, 0, 0); + } +#endif } break; case XBMC_VIDEOMOVE: diff -Nru kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp --- kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp 2018-12-29 14:31:08.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp 2019-02-17 11:32:04.000000000 +0000 @@ -480,6 +480,9 @@ } m_mime = "video/x-vnd.on2.vp9"; m_formatname = "amc-vp9"; + free(m_hints.extradata); + m_hints.extradata = nullptr; + m_hints.extrasize = 0; break; case AV_CODEC_ID_AVS: case AV_CODEC_ID_CAVS: @@ -715,7 +718,7 @@ if (!ConfigureMediaCodec()) goto FAIL; - if (m_codecname.find("OMX", 0, 3) == 0) + if (m_codecname.find("OMX.Nvidia", 0, 10) == 0) m_invalidPTSValue = AV_NOPTS_VALUE; else m_invalidPTSValue = 0; @@ -763,15 +766,15 @@ if (!m_opened) return; + // invalidate any inflight outputbuffers + FlushInternal(); + if (m_videoBufferPool) { m_videoBufferPool->ResetMediaCodec(); m_videoBufferPool = nullptr; } - // invalidate any inflight outputbuffers - FlushInternal(); - m_videobuffer.iFlags = 0; if (m_codec->codec()) @@ -1051,6 +1054,9 @@ { // invalidate any existing inflight buffers and create // new ones to match the number of output buffers + if (m_indexInputBuffer >=0 && CJNIBase::GetSDKVersion() >= 26) + AMediaCodec_queueInputBuffer(m_codec->codec(), m_indexInputBuffer, 0, 0, 0, AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM); + m_OutputDuration = 0; m_lastPTS = -1; m_dtsShift = DVD_NOPTS_VALUE; @@ -1161,8 +1167,7 @@ return -1; } - int flags = bufferInfo.flags; - if (flags & AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM) + if (bufferInfo.flags & AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM) { CLog::Log(LOGDEBUG, "CDVDVideoCodecAndroidMediaCodec:: BUFFER_FLAG_END_OF_STREAM"); AMediaCodec_releaseOutputBuffer(m_codec->codec(), index, false); diff -Nru kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp --- kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp 2018-12-16 20:13:02.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -14,7 +14,6 @@ #define FF_MAX_EXTRADATA_SIZE ((1 << 28) - AV_INPUT_BUFFER_PADDING_SIZE) - class CDemuxStreamClientInternal { public: @@ -122,7 +121,7 @@ if (st == nullptr) return change; - if (st->ExtraSize) + if (st->ExtraSize || !CodecHasExtraData(st->codec)) return change; CDemuxStreamClientInternal* stream = dynamic_cast(st); @@ -570,6 +569,7 @@ { if (stream.first == m_videoStreamPlaying && stream.second->type == STREAM_VIDEO && + CodecHasExtraData(stream.second->codec) && stream.second->ExtraData == nullptr) return false; } @@ -604,6 +604,10 @@ strName = "h264"; else if (stream->codec == AV_CODEC_ID_EAC3) strName = "eac3"; + else if (stream->codec == AV_CODEC_ID_VP8) + strName = "vp8"; + else if (stream->codec == AV_CODEC_ID_VP9) + strName = "vp9"; } return strName; } @@ -659,3 +663,14 @@ m_IDemux->SetVideoResolution(width, height); } } + +bool CDVDDemuxClient::CodecHasExtraData(AVCodecID id) +{ + switch (id) + { + case AV_CODEC_ID_VP9: + return false; + default: + return true; + } +} diff -Nru kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.h kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.h --- kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.h 2018-10-23 16:19:50.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.h 2019-02-11 10:31:27.000000000 +0000 @@ -56,5 +56,8 @@ double m_dtsAtDisplayTime; std::unique_ptr m_packet; int m_videoStreamPlaying = -1; + +private: + static inline bool CodecHasExtraData(AVCodecID id); }; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/DVDInputStreams/DVDFactoryInputStream.cpp kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/DVDInputStreams/DVDFactoryInputStream.cpp --- kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/DVDInputStreams/DVDFactoryInputStream.cpp 2018-10-03 07:06:27.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/DVDInputStreams/DVDFactoryInputStream.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -84,9 +84,9 @@ if (fileitem.IsDVDFile(false, true)) return std::shared_ptr(new CDVDInputStreamNavigator(pPlayer, fileitem)); - else if (fileitem.IsPVRChannel() && StringUtils::StartsWithNoCase(file, "pvr://")) + else if (URIUtils::IsPVRChannel(file)) return std::shared_ptr(new CInputStreamPVRChannel(pPlayer, fileitem)); - else if (fileitem.IsUsablePVRRecording() && StringUtils::StartsWithNoCase(file, "pvr://")) + else if (URIUtils::IsPVRRecording(file)) return std::shared_ptr(new CInputStreamPVRRecording(pPlayer, fileitem)); #ifdef HAVE_LIBBLURAY else if (fileitem.IsType(".bdmv") || fileitem.IsType(".mpls") || StringUtils::StartsWithNoCase(file, "bluray:")) diff -Nru kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRChannel.cpp kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRChannel.cpp --- kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRChannel.cpp 2018-07-31 18:47:39.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRChannel.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -32,7 +32,7 @@ bool CInputStreamPVRChannel::OpenPVRStream() { - if (m_client && (m_client->OpenLiveStream(m_item.GetPVRChannelInfoTag()) == PVR_ERROR_NO_ERROR)) + if (m_client && (m_client->OpenLiveStream(m_item) == PVR_ERROR_NO_ERROR)) { m_bDemuxActive = m_client->GetClientCapabilities().HandlesDemuxing(); CLog::Log(LOGDEBUG, "CInputStreamPVRChannel - %s - opened channel stream %s", __FUNCTION__, m_item.GetPath().c_str()); diff -Nru kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRRecording.cpp kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRRecording.cpp --- kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRRecording.cpp 2018-07-31 18:47:39.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamPVRRecording.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -23,7 +23,7 @@ bool CInputStreamPVRRecording::OpenPVRStream() { - if (m_client && (m_client->OpenRecordedStream(m_item.GetPVRRecordingInfoTag()) == PVR_ERROR_NO_ERROR)) + if (m_client && (m_client->OpenRecordedStream(m_item) == PVR_ERROR_NO_ERROR)) { CLog::Log(LOGDEBUG, "CInputStreamPVRRecording - %s - opened recording stream %s", __FUNCTION__, m_item.GetPath().c_str()); return true; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/VideoPlayer.cpp kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/VideoPlayer.cpp --- kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/VideoPlayer.cpp 2019-01-13 07:51:35.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/VideoPlayer.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -742,6 +742,8 @@ if(m_pInputStream) m_pInputStream->Abort(); + m_renderManager.UnInit(); + CLog::Log(LOGNOTICE, "VideoPlayer: waiting for threads to exit"); // wait for the main thread to finish up @@ -758,7 +760,6 @@ m_HasAudio = false; CLog::Log(LOGNOTICE, "VideoPlayer: finished waiting"); - m_renderManager.UnInit(); return true; } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp --- kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp 2018-10-23 16:19:50.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -103,14 +103,14 @@ { if (m_pbo) { - glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, m_pbo); - glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB); - glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); - glDeleteBuffersARB(1, &m_pbo); + glBindBuffer(GL_PIXEL_PACK_BUFFER, m_pbo); + glUnmapBuffer(GL_PIXEL_PACK_BUFFER); + glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); + glDeleteBuffers(1, &m_pbo); } if (m_query) - glDeleteQueriesARB(1, &m_query); + glDeleteQueries(1, &m_query); } #endif @@ -127,16 +127,29 @@ if (!m_asyncChecked) { #ifndef HAS_GLES - m_asyncSupported = CServiceBroker::GetRenderSystem()->IsExtSupported("GL_ARB_pixel_buffer_object"); - m_occlusionQuerySupported = CServiceBroker::GetRenderSystem()->IsExtSupported("GL_ARB_occlusion_query"); - + unsigned int major, minor, glversion; + CServiceBroker::GetRenderSystem()->GetRenderVersion(major, minor); + glversion = 10 * major + minor; + if (glversion >= 21) + { + m_asyncSupported = true; + m_occlusionQuerySupported = true; + } + else if (glversion > 14) + { + m_occlusionQuerySupported = true; + } + else + { + CLog::Log(LOGWARNING, "CRenderCaptureGL: Occlusion_query not supported, upgrade your GL drivers to support at least GL 2.1"); + } if (m_flags & CAPTUREFLAG_CONTINUOUS) { if (!m_occlusionQuerySupported) - CLog::Log(LOGWARNING, "CRenderCaptureGL: GL_ARB_occlusion_query not supported, performance might suffer"); + CLog::Log(LOGWARNING, "CRenderCaptureGL: Occlusion_query not supported, performance might suffer"); if (!CServiceBroker::GetRenderSystem()->IsExtSupported("GL_ARB_pixel_buffer_object")) CLog::Log(LOGWARNING, "CRenderCaptureGL: GL_ARB_pixel_buffer_object not supported, performance might suffer"); - if (UseOcclusionQuery()) + if (!UseOcclusionQuery()) CLog::Log(LOGWARNING, "CRenderCaptureGL: GL_ARB_occlusion_query disabled, performance might suffer"); } #endif @@ -153,28 +166,28 @@ { //generate an occlusion query if we don't have one if (!m_query) - glGenQueriesARB(1, &m_query); + glGenQueries(1, &m_query); } else { //don't use an occlusion query, clean up any old one if (m_query) { - glDeleteQueriesARB(1, &m_query); + glDeleteQueries(1, &m_query); m_query = 0; } } //start the occlusion query if (m_query) - glBeginQueryARB(GL_SAMPLES_PASSED_ARB, m_query); + glBeginQuery(GL_SAMPLES_PASSED, m_query); //allocate data on the pbo and pixel buffer - glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, m_pbo); + glBindBuffer(GL_PIXEL_PACK_BUFFER, m_pbo); if (m_bufferSize != m_width * m_height * 4) { m_bufferSize = m_width * m_height * 4; - glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, m_bufferSize, 0, GL_STREAM_READ_ARB); + glBufferData(GL_PIXEL_PACK_BUFFER, m_bufferSize, 0, GL_STREAM_READ); delete[] m_pixels; m_pixels = new uint8_t[m_bufferSize]; } @@ -196,10 +209,10 @@ #ifndef HAS_GLES if (m_asyncSupported) { - glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); + glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); if (m_query) - glEndQueryARB(GL_SAMPLES_PASSED_ARB); + glEndQuery(GL_SAMPLES_PASSED); if (m_flags & CAPTUREFLAG_IMMEDIATELY) PboToBuffer(); @@ -238,7 +251,7 @@ GLuint readout = 1; if (m_query) - glGetQueryObjectuivARB(m_query, GL_QUERY_RESULT_AVAILABLE_ARB, &readout); + glGetQueryObjectuiv(m_query, GL_QUERY_RESULT_AVAILABLE, &readout); if (readout) PboToBuffer(); @@ -249,8 +262,8 @@ void CRenderCaptureGL::PboToBuffer() { #ifndef HAS_GLES - glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, m_pbo); - GLvoid* pboPtr = glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB); + glBindBuffer(GL_PIXEL_PACK_BUFFER, m_pbo); + GLvoid* pboPtr = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); if (pboPtr) { @@ -259,12 +272,12 @@ } else { - CLog::Log(LOGERROR, "CRenderCaptureGL::PboToBuffer: glMapBufferARB failed"); + CLog::Log(LOGERROR, "CRenderCaptureGL::PboToBuffer: glMapBuffer failed"); SetState(CAPTURESTATE_FAILED); } - glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB); - glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); + glUnmapBufferARB(GL_PIXEL_PACK_BUFFER); + glBindBufferARB(GL_PIXEL_PACK_BUFFER, 0); #endif } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp --- kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp 2018-11-21 19:38:54.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp 2019-02-17 11:32:04.000000000 +0000 @@ -90,6 +90,9 @@ { CSingleLock lock(m_statelock); + if (!m_bRenderGUI) + return true; + if (m_width == picture.iWidth && m_height == picture.iHeight && m_dwidth == picture.iDisplayWidth && @@ -373,6 +376,7 @@ m_QueueSize = 2; m_QueueSkip = 0; m_presentstep = PRESENT_IDLE; + m_bRenderGUI = true; m_initEvent.Set(); } @@ -399,6 +403,7 @@ m_renderState = STATE_UNCONFIGURED; m_width = 0; m_height = 0; + m_bRenderGUI = false; RemoveCaptures(); m_initEvent.Set(); diff -Nru kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.cpp kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.cpp --- kodi-18.0+git20190128.1934-final/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.cpp 2019-01-28 18:34:07.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -493,42 +493,25 @@ switch (m_scalingMethod) { - case VS_SCALINGMETHOD_NEAREST: - case VS_SCALINGMETHOD_LINEAR: - break; - case VS_SCALINGMETHOD_CUBIC: case VS_SCALINGMETHOD_LANCZOS2: case VS_SCALINGMETHOD_SPLINE36_FAST: case VS_SCALINGMETHOD_LANCZOS3_FAST: - m_bUseHQScaler = true; - break; - case VS_SCALINGMETHOD_SPLINE36: case VS_SCALINGMETHOD_LANCZOS3: m_bUseHQScaler = true; break; - case VS_SCALINGMETHOD_SINC8: - CLog::Log(LOGERROR, "D3D: TODO: This scaler has not yet been implemented"); - break; - - case VS_SCALINGMETHOD_BICUBIC_SOFTWARE: - case VS_SCALINGMETHOD_LANCZOS_SOFTWARE: - case VS_SCALINGMETHOD_SINC_SOFTWARE: - CLog::Log(LOGERROR, "D3D: TODO: Software scaling has not yet been implemented"); - break; - default: break; } if (m_scalingMethod == VS_SCALINGMETHOD_AUTO) { - bool scaleSD = m_sourceHeight < 720 && m_sourceWidth < 1280; - bool scaleUp = static_cast(m_sourceHeight) < CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight() + const bool scaleSD = m_sourceHeight < 720 && m_sourceWidth < 1280; + const bool scaleUp = static_cast(m_sourceHeight) < CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight() && static_cast(m_sourceWidth) < CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth(); - bool scaleFps = m_fps < (CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_videoAutoScaleMaxFps + 0.01f); + const bool scaleFps = m_fps < CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_videoAutoScaleMaxFps + 0.01f; if (m_renderMethod == RENDER_DXVA) { @@ -540,6 +523,8 @@ m_scalingMethod = VS_SCALINGMETHOD_LANCZOS3_FAST; m_bUseHQScaler = true; } + else + m_scalingMethod = VS_SCALINGMETHOD_LINEAR; } if (m_renderOrientation) m_bUseHQScaler = false; @@ -574,11 +559,8 @@ } } - if (m_bUseHQScaler && !CreateIntermediateRenderTarget(m_sourceWidth, m_sourceHeight, false)) - { - m_scalerShader.reset(); - m_bUseHQScaler = false; - } + if (m_renderMethod != RENDER_DXVA || m_bUseHQScaler) + CreateIntermediateRenderTarget(m_sourceWidth, m_sourceHeight, false); m_colorShader.reset(); @@ -592,7 +574,7 @@ } m_colorShader = std::make_unique(); - if (!m_colorShader->Create(m_bufferFormat, AVColorPrimaries::AVCOL_PRI_BT709, m_srcPrimaries, m_bUseHQScaler ? nullptr : m_outputShader.get())) + if (!m_colorShader->Create(m_bufferFormat, AVCOL_PRI_BT709, m_srcPrimaries)) { if (m_bUseHQScaler) { @@ -796,44 +778,50 @@ void CWinRenderer::RenderPS(CD3DTexture* target) { - if (m_bUseHQScaler) - target = &m_IntermediateTarget; - - CD3D11_VIEWPORT viewPort(0.0f, 0.0f, static_cast(target->GetWidth()), static_cast(target->GetHeight())); - - if (m_bUseHQScaler) - DX::Windowing()->ResetScissors(); + CD3D11_VIEWPORT viewPort(0.0f, 0.0f, static_cast(m_sourceWidth), static_cast(m_sourceHeight)); + // reset scissors + DX::Windowing()->ResetScissors(); // reset view port DX::DeviceResources::Get()->GetD3DContext()->RSSetViewports(1, &viewPort); - // select destination rectangle - CPoint destPoints[4]; - if (m_renderOrientation) - { - for (size_t i = 0; i < 4; i++) - destPoints[i] = m_rotatedDestCoords[i]; - } - else - { - CRect destRect = m_bUseHQScaler ? m_sourceRect : CServiceBroker::GetWinSystem()->GetGfxContext().StereoCorrection(m_destRect); - destPoints[0] = { destRect.x1, destRect.y1 }; - destPoints[1] = { destRect.x2, destRect.y1 }; - destPoints[2] = { destRect.x2, destRect.y2 }; - destPoints[3] = { destRect.x1, destRect.y2 }; - } - CRenderBuffer& buf = m_renderBuffers[m_iYV12RenderBuffer]; - // set params - m_outputShader->SetDisplayMetadata(buf.hasDisplayMetadata, buf.displayMetadata, buf.hasLightMetadata, buf.lightMetadata); - m_outputShader->SetToneMapParam(m_videoSettings.m_ToneMapParam); - + CPoint srcPoints[4]; + m_sourceRect.GetQuad(srcPoints); + // set converter params m_colorShader->SetParams(m_videoSettings.m_Contrast, m_videoSettings.m_Brightness, DX::Windowing()->UseLimitedColor()); m_colorShader->SetColParams(buf.color_space, buf.bits, !buf.full_range, buf.texBits); + // convert YUV -> RGB + m_colorShader->Render(m_sourceRect, srcPoints, &buf, &m_IntermediateTarget); - // render video frame - m_colorShader->Render(m_sourceRect, destPoints, &buf, target); + if (!m_bUseHQScaler) + { + // second pass (bilinear scaling) + // select destination rectangle + CPoint destPoints[4]; + if (m_renderOrientation) + { + for (size_t i = 0; i < 4; i++) + destPoints[i] = m_rotatedDestCoords[i]; + } + else + { + CServiceBroker::GetWinSystem()->GetGfxContext().StereoCorrection(m_destRect).GetQuad(destPoints); + } + // set params + m_outputShader->SetDisplayMetadata(buf.hasDisplayMetadata, buf.displayMetadata, buf.hasLightMetadata, buf.lightMetadata); + m_outputShader->SetToneMapParam(m_videoSettings.m_ToneMapParam); + + viewPort.Width = static_cast(target->GetWidth()); + viewPort.Height = static_cast(target->GetHeight()); + // set viewport to the whole target + DX::DeviceResources::Get()->GetD3DContext()->RSSetViewports(1, &viewPort); + // restore scissors + DX::Windowing()->SetScissors(CServiceBroker::GetWinSystem()->GetGfxContext().StereoCorrection(CServiceBroker::GetWinSystem()->GetGfxContext().GetScissors())); + // render frame + m_outputShader->Render(m_IntermediateTarget, m_sourceWidth, m_sourceHeight, m_sourceRect, destPoints, target); + } // Restore our view port. DX::Windowing()->RestoreViewPort(); } @@ -1034,21 +1022,17 @@ bool CWinRenderer::Supports(ESCALINGMETHOD method) { - if (m_renderMethod == RENDER_PS || m_renderMethod == RENDER_DXVA) - { - if (m_renderMethod == RENDER_DXVA) - { - if (method == VS_SCALINGMETHOD_DXVA_HARDWARE - || method == VS_SCALINGMETHOD_AUTO) - return true; - if (!CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_DXVAAllowHqScaling || m_renderOrientation) - return false; - } + if (method == VS_SCALINGMETHOD_AUTO) + return true; - if ( method == VS_SCALINGMETHOD_AUTO - || (method == VS_SCALINGMETHOD_LINEAR && m_renderMethod == RENDER_PS)) - return true; + if (method == VS_SCALINGMETHOD_LINEAR && m_renderMethod != RENDER_DXVA) + return true; + if (method == VS_SCALINGMETHOD_DXVA_HARDWARE && m_renderMethod == RENDER_DXVA) + return true; + + if (m_renderMethod == RENDER_PS || m_renderMethod == RENDER_DXVA) + { if (DX::DeviceResources::Get()->GetDeviceFeatureLevel() >= D3D_FEATURE_LEVEL_9_3 && !m_renderOrientation) { if (method == VS_SCALINGMETHOD_CUBIC @@ -1068,12 +1052,7 @@ } } } - else if(m_renderMethod == RENDER_SW) - { - if (method == VS_SCALINGMETHOD_AUTO - || method == VS_SCALINGMETHOD_LINEAR) - return true; - } + return false; } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/dbwrappers/sqlitedataset.cpp kodi-18.1+git20190217.1232-final/xbmc/dbwrappers/sqlitedataset.cpp --- kodi-18.0+git20190128.1934-final/xbmc/dbwrappers/sqlitedataset.cpp 2018-07-31 18:47:39.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/dbwrappers/sqlitedataset.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -11,7 +11,9 @@ */ #include +#include #include +#include #include "sqlitedataset.h" #include "utils/log.h" @@ -21,6 +23,137 @@ #include "platform/linux/XTimeUtils.h" #endif +namespace { +#define X(VAL) std::make_pair(VAL, #VAL) +//!@todo Remove ifdefs when sqlite version requirement has been bumped to at least 3.26.0 +const std::map g_SqliteErrorStrings = +{ + X(SQLITE_OK), + X(SQLITE_ERROR), + X(SQLITE_INTERNAL), + X(SQLITE_PERM), + X(SQLITE_ABORT), + X(SQLITE_BUSY), + X(SQLITE_LOCKED), + X(SQLITE_NOMEM), + X(SQLITE_READONLY), + X(SQLITE_INTERRUPT), + X(SQLITE_IOERR), + X(SQLITE_CORRUPT), + X(SQLITE_NOTFOUND), + X(SQLITE_FULL), + X(SQLITE_CANTOPEN), + X(SQLITE_PROTOCOL), + X(SQLITE_EMPTY), + X(SQLITE_SCHEMA), + X(SQLITE_TOOBIG), + X(SQLITE_CONSTRAINT), + X(SQLITE_MISMATCH), + X(SQLITE_MISUSE), + X(SQLITE_NOLFS), + X(SQLITE_AUTH), + X(SQLITE_FORMAT), + X(SQLITE_RANGE), + X(SQLITE_NOTADB), + X(SQLITE_NOTICE), + X(SQLITE_WARNING), + X(SQLITE_ROW), + X(SQLITE_DONE), +#if defined(SQLITE_ERROR_MISSING_COLLSEQ) + X(SQLITE_ERROR_MISSING_COLLSEQ), +#endif +#if defined(SQLITE_ERROR_RETRY) + X(SQLITE_ERROR_RETRY), +#endif +#if defined(SQLITE_ERROR_SNAPSHOT) + X(SQLITE_ERROR_SNAPSHOT), +#endif + X(SQLITE_IOERR_READ), + X(SQLITE_IOERR_SHORT_READ), + X(SQLITE_IOERR_WRITE), + X(SQLITE_IOERR_FSYNC), + X(SQLITE_IOERR_DIR_FSYNC), + X(SQLITE_IOERR_TRUNCATE), + X(SQLITE_IOERR_FSTAT), + X(SQLITE_IOERR_UNLOCK), + X(SQLITE_IOERR_RDLOCK), + X(SQLITE_IOERR_DELETE), + X(SQLITE_IOERR_BLOCKED), + X(SQLITE_IOERR_NOMEM), + X(SQLITE_IOERR_ACCESS), + X(SQLITE_IOERR_CHECKRESERVEDLOCK), + X(SQLITE_IOERR_LOCK), + X(SQLITE_IOERR_CLOSE), + X(SQLITE_IOERR_DIR_CLOSE), + X(SQLITE_IOERR_SHMOPEN), + X(SQLITE_IOERR_SHMSIZE), + X(SQLITE_IOERR_SHMLOCK), + X(SQLITE_IOERR_SHMMAP), + X(SQLITE_IOERR_SEEK), + X(SQLITE_IOERR_DELETE_NOENT), + X(SQLITE_IOERR_MMAP), + X(SQLITE_IOERR_GETTEMPPATH), + X(SQLITE_IOERR_CONVPATH), + X(SQLITE_IOERR_VNODE), + X(SQLITE_IOERR_AUTH), +#if defined(SQLITE_IOERR_BEGIN_ATOMIC) + X(SQLITE_IOERR_BEGIN_ATOMIC), +#endif +#if defined(SQLITE_IOERR_COMMIT_ATOMIC) + X(SQLITE_IOERR_COMMIT_ATOMIC), +#endif +#if defined(SQLITE_IOERR_ROLLBACK_ATOMIC) + X(SQLITE_IOERR_ROLLBACK_ATOMIC), +#endif + X(SQLITE_LOCKED_SHAREDCACHE), +#if defined(SQLITE_LOCKED_VTAB) + X(SQLITE_LOCKED_VTAB), +#endif + X(SQLITE_BUSY_RECOVERY), + X(SQLITE_BUSY_SNAPSHOT), + X(SQLITE_CANTOPEN_NOTEMPDIR), + X(SQLITE_CANTOPEN_ISDIR), + X(SQLITE_CANTOPEN_FULLPATH), + X(SQLITE_CANTOPEN_CONVPATH), +#if defined(SQLITE_CANTOPEN_DIRTYWAL) + X(SQLITE_CANTOPEN_DIRTYWAL), +#endif + X(SQLITE_CORRUPT_VTAB), +#if defined(SQLITE_CORRUPT_SEQUENCE) + X(SQLITE_CORRUPT_SEQUENCE), +#endif + X(SQLITE_READONLY_RECOVERY), + X(SQLITE_READONLY_CANTLOCK), + X(SQLITE_READONLY_ROLLBACK), + X(SQLITE_READONLY_DBMOVED), +#if defined(SQLITE_READONLY_CANTINIT) + X(SQLITE_READONLY_CANTINIT), +#endif +#if defined(SQLITE_READONLY_DIRECTORY) + X(SQLITE_READONLY_DIRECTORY), +#endif + X(SQLITE_ABORT_ROLLBACK), + X(SQLITE_CONSTRAINT_CHECK), + X(SQLITE_CONSTRAINT_COMMITHOOK), + X(SQLITE_CONSTRAINT_FOREIGNKEY), + X(SQLITE_CONSTRAINT_FUNCTION), + X(SQLITE_CONSTRAINT_NOTNULL), + X(SQLITE_CONSTRAINT_PRIMARYKEY), + X(SQLITE_CONSTRAINT_TRIGGER), + X(SQLITE_CONSTRAINT_UNIQUE), + X(SQLITE_CONSTRAINT_VTAB), + X(SQLITE_CONSTRAINT_ROWID), + X(SQLITE_NOTICE_RECOVER_WAL), + X(SQLITE_NOTICE_RECOVER_ROLLBACK), + X(SQLITE_WARNING_AUTOINDEX), + X(SQLITE_AUTH_USER), +#if defined(SQLITE_OK_LOAD_PERMANENTLY) + X(SQLITE_OK_LOAD_PERMANENTLY), +#endif +}; +#undef X +} + namespace dbiplus { //************* Callback function *************************** @@ -129,56 +262,19 @@ return DB_CONNECTION_OK; } -int SqliteDatabase::setErr(int err_code, const char * qry){ - switch (err_code) { - case SQLITE_OK: error ="Successful result"; - break; - case SQLITE_ERROR: error = "SQL error or missing database"; - break; - case SQLITE_INTERNAL: error = "An internal logic error in SQLite"; - break; - case SQLITE_PERM: error ="Access permission denied"; - break; - case SQLITE_ABORT: error = "Callback routine requested an abort"; - break; - case SQLITE_BUSY: error = "The database file is locked"; - break; - case SQLITE_LOCKED: error = "A table in the database is locked"; - break; - case SQLITE_NOMEM: error = "A malloc() failed"; - break; - case SQLITE_READONLY: error = "Attempt to write a readonly database"; - break; - case SQLITE_INTERRUPT: error = "Operation terminated by sqlite_interrupt()"; - break; - case SQLITE_IOERR: error = "Some kind of disk I/O error occurred"; - break; - case SQLITE_CORRUPT: error = "The database disk image is malformed"; - break; - case SQLITE_NOTFOUND: error = "(Internal Only) Table or record not found"; - break; - case SQLITE_FULL: error = "Insertion failed because database is full"; - break; - case SQLITE_CANTOPEN: error = "Unable to open the database file"; - break; - case SQLITE_PROTOCOL: error = "Database lock protocol error"; - break; - case SQLITE_EMPTY: error = "(Internal Only) Database table is empty"; - break; - case SQLITE_SCHEMA: error = "The database schema changed"; - break; - case SQLITE_TOOBIG: error = "Too much data for one row of a table"; - break; - case SQLITE_CONSTRAINT: error = "Abort due to constraint violation"; - break; - case SQLITE_MISMATCH: error = "Data type mismatch"; - break; - default : error = "Undefined SQLite error"; - } - error = "[" + db + "] " + error; - error += "\nQuery: "; - error += qry; - error += "\n"; +int SqliteDatabase::setErr(int err_code, const char * qry) { + std::stringstream ss; + ss << "[" << db << "] "; + auto errorIt = g_SqliteErrorStrings.find(err_code); + if (errorIt != g_SqliteErrorStrings.end()) { + ss << "SQLite error " << errorIt->second; + } else { + ss << "Undefined SQLite error " << err_code; + } + if (conn) + ss << " (" << sqlite3_errmsg(conn) << ")"; + ss << "\nQuery: " << qry; + error = ss.str(); return err_code; } @@ -208,11 +304,12 @@ } else if (errorCode == SQLITE_OK) { + sqlite3_extended_result_codes(conn, 1); sqlite3_busy_handler(conn, busy_callback, NULL); char* err=NULL; if (setErr(sqlite3_exec(getHandle(),"PRAGMA empty_result_callbacks=ON",NULL,NULL,&err),"PRAGMA empty_result_callbacks=ON") != SQLITE_OK) { - throw DbErrors(getErrorMsg()); + throw DbErrors("%s", getErrorMsg()); } else if (sqlite3_db_readonly(conn, nullptr) == 1) { @@ -523,7 +620,14 @@ char* err=NULL; Dataset::parse_sql(query); if (db->setErr(sqlite3_exec(this->handle(),query.c_str(),NULL,NULL,&err),query.c_str())!=SQLITE_OK) { - throw DbErrors(db->getErrorMsg()); + std::string message = db->getErrorMsg(); + if (err) { + message.append(" ("); + message.append(err); + message.append(")"); + sqlite3_free(err); + } + throw DbErrors("%s", message.c_str()); } } // end of for @@ -651,7 +755,10 @@ return res; else { - throw DbErrors(db->getErrorMsg()); + if (errmsg) + throw DbErrors("%s (%s)", db->getErrorMsg(), errmsg); + else + throw DbErrors("%s", db->getErrorMsg()); } } @@ -676,7 +783,7 @@ sqlite3_stmt *stmt = NULL; if (db->setErr(sqlite3_prepare_v2(handle(),query.c_str(),-1,&stmt, NULL),query.c_str()) != SQLITE_OK) - throw DbErrors(db->getErrorMsg()); + throw DbErrors("%s", db->getErrorMsg()); // column headers const unsigned int numColumns = sqlite3_column_count(stmt); @@ -724,7 +831,7 @@ } else { - throw DbErrors(db->getErrorMsg()); + throw DbErrors("%s", db->getErrorMsg()); } } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/DynamicDll.h kodi-18.1+git20190217.1232-final/xbmc/DynamicDll.h --- kodi-18.0+git20190128.1934-final/xbmc/DynamicDll.h 2018-07-31 18:47:38.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/DynamicDll.h 2019-02-11 10:31:27.000000000 +0000 @@ -125,7 +125,7 @@ public: \ virtual result name args override \ { \ - return m_##name args2; \ + return m_##name ? m_##name args2 : (result) 0; \ } #define DEFINE_METHOD_LINKAGE0(result, linkage, name) \ @@ -381,11 +381,11 @@ #define RESOLVE_METHOD_OPTIONAL(method) \ m_##method##_ptr = nullptr; \ - m_dll->ResolveExport( #method , & m_##method##_ptr ); + m_dll->ResolveExport( #method , & m_##method##_ptr, false ); #define RESOLVE_METHOD_OPTIONAL_FP(method) \ method##_ptr = NULL; \ - m_dll->ResolveExport( #method , & method##_ptr ); + m_dll->ResolveExport( #method , & method##_ptr, false ); @@ -403,6 +403,10 @@ if (!m_dll->ResolveExport( #dllmethod , & m_##method##_ptr )) \ return false; +#define RESOLVE_METHOD_RENAME_OPTIONAL(dllmethod, method) \ + m_##method##_ptr = nullptr; \ + m_dll->ResolveExport( #dllmethod , & m_##method##_ptr, false ); + #define RESOLVE_METHOD_RENAME_FP(dllmethod, method) \ if (!m_dll->ResolveExport( #dllmethod , & method##_ptr )) \ return false; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/games/addons/GameClient.cpp kodi-18.1+git20190217.1232-final/xbmc/games/addons/GameClient.cpp --- kodi-18.0+git20190128.1934-final/xbmc/games/addons/GameClient.cpp 2019-01-28 18:34:08.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/games/addons/GameClient.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -252,8 +252,6 @@ CloseFile(); - Streams().Initialize(streamManager); - GAME_ERROR error = GAME_ERROR_FAILED; try { LogError(error = m_struct.toAddon.LoadGame(path.c_str()), "LoadGame()"); } @@ -262,13 +260,11 @@ if (error != GAME_ERROR_NO_ERROR) { NotifyError(error); - Streams().Deinitialize(); return false; } if (!InitializeGameplay(file.GetPath(), streamManager, input)) { - Streams().Deinitialize(); return false; } @@ -286,8 +282,6 @@ CloseFile(); - Streams().Initialize(streamManager); - GAME_ERROR error = GAME_ERROR_FAILED; try { LogError(error = m_struct.toAddon.LoadStandalone(), "LoadStandalone()"); } @@ -296,13 +290,11 @@ if (error != GAME_ERROR_NO_ERROR) { NotifyError(error); - Streams().Deinitialize(); return false; } if (!InitializeGameplay("", streamManager, input)) { - Streams().Deinitialize(); return false; } @@ -313,6 +305,7 @@ { if (LoadGameInfo()) { + Streams().Initialize(streamManager); Input().Start(input); m_bIsPlaying = true; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/guilib/D3DResource.cpp kodi-18.1+git20190217.1232-final/xbmc/guilib/D3DResource.cpp --- kodi-18.0+git20190128.1934-final/xbmc/guilib/D3DResource.cpp 2018-07-31 18:47:39.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/guilib/D3DResource.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -322,7 +322,7 @@ { if (!m_renderTargets[m_viewIdx]) GetRenderTargetInternal(m_viewIdx); - return m_renderTargets[0].GetAddressOf(); + return m_renderTargets[m_viewIdx].GetAddressOf(); } void CD3DTexture::Release() diff -Nru kodi-18.0+git20190128.1934-final/xbmc/guilib/GUIFontTTFGL.cpp kodi-18.1+git20190217.1232-final/xbmc/guilib/GUIFontTTFGL.cpp --- kodi-18.0+git20190128.1934-final/xbmc/guilib/GUIFontTTFGL.cpp 2018-12-29 14:31:08.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/guilib/GUIFontTTFGL.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -221,6 +221,11 @@ for (size_t i = 0; i < m_vertexTrans.size(); i++) { + if (m_vertexTrans[i].vertexBuffer->bufferHandle == 0) + { + continue; + } + // Apply the clip rectangle CRect clip = renderSystem->ClipRectToScissorRect(m_vertexTrans[i].clip); if (!clip.IsEmpty()) @@ -282,20 +287,23 @@ CVertexBuffer CGUIFontTTFGL::CreateVertexBuffer(const std::vector &vertices) const { - assert(!vertices.empty()); assert(vertices.size() % 4 == 0); + GLuint bufferHandle = 0; - // Generate a unique buffer object name and put it in bufferHandle - GLuint bufferHandle; - glGenBuffers(1, &bufferHandle); - // Bind the buffer to the OpenGL context's GL_ARRAY_BUFFER binding point - glBindBuffer(GL_ARRAY_BUFFER, bufferHandle); - // Create a data store for the buffer object bound to the GL_ARRAY_BUFFER - // binding point (i.e. our buffer object) and initialise it from the - // specified client-side pointer - glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof (SVertex), vertices.data(), GL_STATIC_DRAW); - // Unbind GL_ARRAY_BUFFER - glBindBuffer(GL_ARRAY_BUFFER, 0); + // Do not create empty buffers, leave buffer as 0, it will be ignored in drawing stage + if (!vertices.empty()) + { + // Generate a unique buffer object name and put it in bufferHandle + glGenBuffers(1, &bufferHandle); + // Bind the buffer to the OpenGL context's GL_ARRAY_BUFFER binding point + glBindBuffer(GL_ARRAY_BUFFER, bufferHandle); + // Create a data store for the buffer object bound to the GL_ARRAY_BUFFER + // binding point (i.e. our buffer object) and initialise it from the + // specified client-side pointer + glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(SVertex), vertices.data(), GL_STATIC_DRAW); + // Unbind GL_ARRAY_BUFFER + glBindBuffer(GL_ARRAY_BUFFER, 0); + } return CVertexBuffer(bufferHandle, vertices.size() / 4, this); } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/guilib/guiinfo/GUIInfoHelper.cpp kodi-18.1+git20190217.1232-final/xbmc/guilib/guiinfo/GUIInfoHelper.cpp --- kodi-18.0+git20190128.1934-final/xbmc/guilib/guiinfo/GUIInfoHelper.cpp 2018-08-01 00:00:33.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/guilib/guiinfo/GUIInfoHelper.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -163,7 +163,11 @@ { CGUIListItemPtr item; - if (containerId == 0 && itemOffset == 0 && !(itemFlags & INFOFLAG_LISTITEM_CONTAINER)) + if (containerId == 0 && + itemOffset == 0 && + !(itemFlags & INFOFLAG_LISTITEM_CONTAINER) && + !(itemFlags & INFOFLAG_LISTITEM_ABSOLUTE) && + !(itemFlags & INFOFLAG_LISTITEM_POSITION)) item = GetCurrentListItemFromWindow(contextWindow); if (!item) diff -Nru kodi-18.0+git20190128.1934-final/xbmc/interfaces/AnnouncementManager.cpp kodi-18.1+git20190217.1232-final/xbmc/interfaces/AnnouncementManager.cpp --- kodi-18.0+git20190128.1934-final/xbmc/interfaces/AnnouncementManager.cpp 2018-08-26 13:40:15.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/interfaces/AnnouncementManager.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -42,7 +42,7 @@ m_bStop = true; m_queueEvent.Set(); StopThread(); - CSingleLock lock (m_critSection); + CSingleLock lock (m_announcersCritSection); m_announcers.clear(); } @@ -51,7 +51,7 @@ if (!listener) return; - CSingleLock lock (m_critSection); + CSingleLock lock (m_announcersCritSection); m_announcers.push_back(listener); } @@ -60,7 +60,7 @@ if (!listener) return; - CSingleLock lock (m_critSection); + CSingleLock lock (m_announcersCritSection); for (unsigned int i = 0; i < m_announcers.size(); i++) { if (m_announcers[i] == listener) @@ -100,7 +100,7 @@ announcement.item = CFileItemPtr(new CFileItem(*item)); { - CSingleLock lock (m_critSection); + CSingleLock lock (m_queueCritSection); m_announcementQueue.push_back(announcement); } m_queueEvent.Set(); @@ -110,9 +110,10 @@ { CLog::Log(LOGDEBUG, "CAnnouncementManager - Announcement: %s from %s", message, sender); - CSingleLock lock (m_critSection); + CSingleLock lock(m_announcersCritSection); // Make a copy of announcers. They may be removed or even remove themselves during execution of IAnnouncer::Announce()! + std::vector announcers(m_announcers); for (unsigned int i = 0; i < announcers.size(); i++) announcers[i]->Announce(flag, sender, message, data); @@ -271,19 +272,19 @@ while (!m_bStop) { - CSingleLock lock (m_critSection); + CSingleLock lock (m_queueCritSection); if (!m_announcementQueue.empty()) { auto announcement = m_announcementQueue.front(); m_announcementQueue.pop_front(); { - CSingleExit ex(m_critSection); + CSingleExit ex(m_queueCritSection); DoAnnounce(announcement.flag, announcement.sender.c_str(), announcement.message.c_str(), announcement.item, announcement.data); } } else { - CSingleExit ex(m_critSection); + CSingleExit ex(m_queueCritSection); m_queueEvent.Wait(); } } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/interfaces/AnnouncementManager.h kodi-18.1+git20190217.1232-final/xbmc/interfaces/AnnouncementManager.h --- kodi-18.0+git20190128.1934-final/xbmc/interfaces/AnnouncementManager.h 2018-08-26 13:40:15.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/interfaces/AnnouncementManager.h 2019-02-11 10:31:27.000000000 +0000 @@ -61,7 +61,8 @@ CAnnouncementManager(const CAnnouncementManager&) = delete; CAnnouncementManager const& operator=(CAnnouncementManager const&) = delete; - CCriticalSection m_critSection; + CCriticalSection m_announcersCritSection; + CCriticalSection m_queueCritSection; std::vector m_announcers; }; } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/interfaces/json-rpc/PlayerOperations.cpp kodi-18.1+git20190217.1232-final/xbmc/interfaces/json-rpc/PlayerOperations.cpp --- kodi-18.0+git20190128.1934-final/xbmc/interfaces/json-rpc/PlayerOperations.cpp 2018-10-03 07:06:27.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/interfaces/json-rpc/PlayerOperations.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -322,7 +322,7 @@ { case Video: case Audio: - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP, static_cast(parameterObject["playerid"].asInteger())); + CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_STOP, static_cast(parameterObject["playerid"].asInteger())); return ACK; case Picture: @@ -536,8 +536,7 @@ { case PLAYLIST_MUSIC: case PLAYLIST_VIDEO: - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PLAY, playlistid, playlistStartPosition); - OnPlaylistChanged(); + CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, playlistid, playlistStartPosition); break; case PLAYLIST_PICTURE: @@ -572,7 +571,7 @@ { if (g_partyModeManager.IsEnabled()) g_partyModeManager.Disable(); - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, "playercontrol(partymode(" + parameterObject["item"]["partymode"].asString() + "))"); + CApplicationMessenger::GetInstance().PostMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, "playercontrol(partymode(" + parameterObject["item"]["partymode"].asString() + "))"); return ACK; } else if (parameterObject["item"].isMember("channelid")) @@ -691,7 +690,7 @@ auto l = new CFileItemList(); //don't delete l->Copy(list); - CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PLAY, -1, -1, static_cast(l), playername); + CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, -1, -1, static_cast(l), playername); } return ACK; @@ -758,7 +757,6 @@ return FailedToExecute; } - OnPlaylistChanged(); return ACK; } @@ -781,7 +779,6 @@ (shuffle.isString() && shuffle.asString() == "toggle")) { CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_SHUFFLE, playlistid, 0); - OnPlaylistChanged(); } } else @@ -790,7 +787,6 @@ (shuffle.isString() && shuffle.asString() == "toggle")) { CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_SHUFFLE, playlistid, 1); - OnPlaylistChanged(); } } break; @@ -846,7 +842,6 @@ repeat = (REPEAT_STATE)ParseRepeatState(parameterObject["repeat"]); CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_REPEAT, playlistid, repeat); - OnPlaylistChanged(); break; } @@ -899,7 +894,7 @@ } if (change) - CApplicationMessenger::GetInstance().SendMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, "playercontrol(partymode(" + strContext + "))"); + CApplicationMessenger::GetInstance().PostMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, "playercontrol(partymode(" + strContext + "))"); break; } @@ -1168,12 +1163,6 @@ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_SLIDESHOW, -1, static_cast(new CAction(actionID))); } -void CPlayerOperations::OnPlaylistChanged() -{ - CGUIMessage msg(GUI_MSG_PLAYLIST_CHANGED, 0, 0); - CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg); -} - JSONRPC_STATUS CPlayerOperations::GetPropertyValue(PlayerType player, const std::string &property, CVariant &result) { if (player == None) diff -Nru kodi-18.0+git20190128.1934-final/xbmc/interfaces/json-rpc/PlayerOperations.h kodi-18.1+git20190217.1232-final/xbmc/interfaces/json-rpc/PlayerOperations.h --- kodi-18.0+git20190128.1934-final/xbmc/interfaces/json-rpc/PlayerOperations.h 2018-08-26 13:40:15.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/interfaces/json-rpc/PlayerOperations.h 2019-02-11 10:31:27.000000000 +0000 @@ -62,7 +62,6 @@ static int GetPlaylist(PlayerType player); static JSONRPC_STATUS StartSlideshow(const std::string& path, bool recursive, bool random, const std::string &firstPicturePath = ""); static void SendSlideshowAction(int actionID); - static void OnPlaylistChanged(); static JSONRPC_STATUS GetPropertyValue(PlayerType player, const std::string &property, CVariant &result); static int ParseRepeatState(const CVariant &repeat); diff -Nru kodi-18.0+git20190128.1934-final/xbmc/interfaces/json-rpc/PlaylistOperations.cpp kodi-18.1+git20190217.1232-final/xbmc/interfaces/json-rpc/PlaylistOperations.cpp --- kodi-18.0+git20190128.1934-final/xbmc/interfaces/json-rpc/PlaylistOperations.cpp 2018-07-31 18:47:39.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/interfaces/json-rpc/PlaylistOperations.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -119,7 +119,7 @@ { auto tmpList = new CFileItemList(); tmpList->Copy(list); - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_ADD, playlist, -1, static_cast(tmpList)); + CApplicationMessenger::GetInstance().PostMsg(TMSG_PLAYLISTPLAYER_ADD, playlist, -1, static_cast(tmpList)); break; } case PLAYLIST_PICTURE: @@ -138,7 +138,6 @@ return InvalidParams; } - NotifyAll(); return ACK; } @@ -154,10 +153,9 @@ auto tmpList = new CFileItemList(); tmpList->Copy(list); - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_INSERT, GetPlaylist(parameterObject["playlistid"]), + CApplicationMessenger::GetInstance().PostMsg(TMSG_PLAYLISTPLAYER_INSERT, GetPlaylist(parameterObject["playlistid"]), static_cast(parameterObject["position"].asInteger()), static_cast(tmpList)); - NotifyAll(); return ACK; } @@ -171,9 +169,8 @@ if (CServiceBroker::GetPlaylistPlayer().GetCurrentPlaylist() == playlist && CServiceBroker::GetPlaylistPlayer().GetCurrentSong() == position) return InvalidParams; - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_REMOVE, playlist, position); + CApplicationMessenger::GetInstance().PostMsg(TMSG_PLAYLISTPLAYER_REMOVE, playlist, position); - NotifyAll(); return ACK; } @@ -185,19 +182,18 @@ { case PLAYLIST_MUSIC: case PLAYLIST_VIDEO: - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_CLEAR, playlist); + CApplicationMessenger::GetInstance().PostMsg(TMSG_PLAYLISTPLAYER_CLEAR, playlist); break; case PLAYLIST_PICTURE: slideshow = CServiceBroker::GetGUI()->GetWindowManager().GetWindow(WINDOW_SLIDESHOW); if (!slideshow) return FailedToExecute; - CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_SLIDESHOW, -1, static_cast(new CAction(ACTION_STOP))); + CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTION, WINDOW_SLIDESHOW, -1, static_cast(new CAction(ACTION_STOP))); slideshow->Reset(); break; } - NotifyAll(); return ACK; } @@ -210,9 +206,8 @@ auto tmpVec = new std::vector(); tmpVec->push_back(static_cast(parameterObject["position1"].asInteger())); tmpVec->push_back(static_cast(parameterObject["position2"].asInteger())); - CApplicationMessenger::GetInstance().SendMsg(TMSG_PLAYLISTPLAYER_SWAP, playlist, -1, static_cast(tmpVec)); + CApplicationMessenger::GetInstance().PostMsg(TMSG_PLAYLISTPLAYER_SWAP, playlist, -1, static_cast(tmpVec)); - NotifyAll(); return ACK; } @@ -225,12 +220,6 @@ return PLAYLIST_NONE; } -void CPlaylistOperations::NotifyAll() -{ - CGUIMessage msg(GUI_MSG_PLAYLIST_CHANGED, 0, 0); - CServiceBroker::GetGUI()->GetWindowManager().SendThreadMessage(msg); -} - JSONRPC_STATUS CPlaylistOperations::GetPropertyValue(int playlist, const std::string &property, CVariant &result) { if (property == "type") diff -Nru kodi-18.0+git20190128.1934-final/xbmc/interfaces/json-rpc/PlaylistOperations.h kodi-18.1+git20190217.1232-final/xbmc/interfaces/json-rpc/PlaylistOperations.h --- kodi-18.0+git20190128.1934-final/xbmc/interfaces/json-rpc/PlaylistOperations.h 2018-07-31 18:47:39.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/interfaces/json-rpc/PlaylistOperations.h 2019-02-11 10:31:27.000000000 +0000 @@ -30,7 +30,6 @@ static JSONRPC_STATUS Swap(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result); private: static int GetPlaylist(const CVariant &playlist); - static inline void NotifyAll(); static JSONRPC_STATUS GetPropertyValue(int playlist, const std::string &property, CVariant &result); static bool CheckMediaParameter(int playlist, const CVariant &itemObject); static bool HandleItemsParameter(int playlistid, const CVariant &itemParam, CFileItemList &items); diff -Nru kodi-18.0+git20190128.1934-final/xbmc/interfaces/json-rpc/schema/version.txt kodi-18.1+git20190217.1232-final/xbmc/interfaces/json-rpc/schema/version.txt --- kodi-18.0+git20190128.1934-final/xbmc/interfaces/json-rpc/schema/version.txt 2019-01-28 18:34:07.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/interfaces/json-rpc/schema/version.txt 2019-02-11 10:31:27.000000000 +0000 @@ -1 +1 @@ -JSONRPC_VERSION 10.1.1 +JSONRPC_VERSION 10.1.2 diff -Nru kodi-18.0+git20190128.1934-final/xbmc/music/MusicDatabase.cpp kodi-18.1+git20190217.1232-final/xbmc/music/MusicDatabase.cpp --- kodi-18.0+git20190128.1934-final/xbmc/music/MusicDatabase.cpp 2019-01-28 18:34:07.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/music/MusicDatabase.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -4293,7 +4293,7 @@ sorting = sortDescription; if (limitedInSQL && sortDescription.sortBy == SortByRandom) sorting.sortBy = SortByNone; - if (!SortUtils::SortFromDataset(sorting, MediaTypeSong, m_pDS, results)) + if (!SortUtils::SortFromDataset(sorting, MediaTypeArtist, m_pDS, results)) return false; // get data from returned rows @@ -4467,7 +4467,7 @@ sorting = sortDescription; if (limitedInSQL && sortDescription.sortBy == SortByRandom) sorting.sortBy = SortByNone; - if (!SortUtils::SortFromDataset(sorting, MediaTypeSong, m_pDS, results)) + if (!SortUtils::SortFromDataset(sorting, MediaTypeAlbum, m_pDS, results)) return false; // get data from returned rows diff -Nru kodi-18.0+git20190128.1934-final/xbmc/music/MusicInfoLoader.cpp kodi-18.1+git20190217.1232-final/xbmc/music/MusicInfoLoader.cpp --- kodi-18.0+git20190128.1934-final/xbmc/music/MusicInfoLoader.cpp 2018-10-23 16:19:51.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/music/MusicInfoLoader.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -147,7 +147,10 @@ bool CMusicInfoLoader::LoadItemCached(CFileItem* pItem) { if ((pItem->m_bIsFolder && !pItem->IsAudio()) || - pItem->IsPlayList() || pItem->IsNFO() || pItem->IsInternetStream()) + pItem->IsPlayList() || pItem->IsSmartPlayList() || + StringUtils::StartsWithNoCase(pItem->GetPath(), "newplaylist://") || + StringUtils::StartsWithNoCase(pItem->GetPath(), "newsmartplaylist://") || + pItem->IsNFO() || pItem->IsInternetStream()) return false; // Get thumb for item @@ -161,8 +164,11 @@ if (m_pProgressCallback && !pItem->m_bIsFolder) m_pProgressCallback->SetProgressAdvance(); - if ((pItem->m_bIsFolder && !pItem->IsAudio()) || pItem->IsPlayList() || - pItem->IsNFO() || pItem->IsInternetStream()) + if ((pItem->m_bIsFolder && !pItem->IsAudio()) || + pItem->IsPlayList() || pItem->IsSmartPlayList() || + StringUtils::StartsWithNoCase(pItem->GetPath(), "newplaylist://") || + StringUtils::StartsWithNoCase(pItem->GetPath(), "newsmartplaylist://") || + pItem->IsNFO() || pItem->IsInternetStream()) return false; if (!pItem->HasMusicInfoTag() || !pItem->GetMusicInfoTag()->Loaded()) diff -Nru kodi-18.0+git20190128.1934-final/xbmc/network/upnp/UPnPPlayer.cpp kodi-18.1+git20190217.1232-final/xbmc/network/upnp/UPnPPlayer.cpp --- kodi-18.0+git20190128.1934-final/xbmc/network/upnp/UPnPPlayer.cpp 2018-07-31 18:47:40.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/network/upnp/UPnPPlayer.cpp 2019-02-12 01:00:27.000000000 +0000 @@ -54,7 +54,7 @@ , m_callback(callback) , m_postime(0) { - memset(&m_posinfo, 0, sizeof(m_posinfo)); + m_posinfo = {}; m_device->FindServiceByType("urn:schemas-upnp-org:service:AVTransport:1", m_transport); } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/platform/android/activity/XBMCApp.cpp kodi-18.1+git20190217.1232-final/xbmc/platform/android/activity/XBMCApp.cpp --- kodi-18.0+git20190128.1934-final/xbmc/platform/android/activity/XBMCApp.cpp 2018-12-16 20:13:02.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/platform/android/activity/XBMCApp.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -1083,6 +1083,12 @@ void CXBMCApp::onNewIntent(CJNIIntent intent) { + if (!intent) + { + CLog::Log(LOGNOTICE, "CXBMCApp::onNewIntent - Got invalid intent."); + return; + } + std::string action = intent.getAction(); CLog::Log(LOGDEBUG, "CXBMCApp::onNewIntent - Got intent. Action: %s", action.c_str()); std::string targetFile = GetFilenameFromIntent(intent); diff -Nru kodi-18.0+git20190128.1934-final/xbmc/platform/posix/utils/PosixInterfaceForCLog.cpp kodi-18.1+git20190217.1232-final/xbmc/platform/posix/utils/PosixInterfaceForCLog.cpp --- kodi-18.0+git20190128.1934-final/xbmc/platform/posix/utils/PosixInterfaceForCLog.cpp 2018-07-31 18:47:40.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/platform/posix/utils/PosixInterfaceForCLog.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -83,13 +83,16 @@ #endif // _DEBUG } -void CPosixInterfaceForCLog::GetCurrentLocalTime(int &hour, int &minute, int &second, double &milliseconds) +void CPosixInterfaceForCLog::GetCurrentLocalTime(int& year, int& month, int& day, int &hour, int& minute, int& second, double& milliseconds) { struct tm localTime; struct timeval tv; if (gettimeofday(&tv, nullptr) != -1 && localtime_r(&tv.tv_sec, &localTime) != NULL) { + year = localTime.tm_year + 1900; + month = localTime.tm_mon + 1; + day = localTime.tm_mday; hour = localTime.tm_hour; minute = localTime.tm_min; second = localTime.tm_sec; @@ -97,7 +100,7 @@ } else { - hour = minute = second = 0; + year = month = day = hour = minute = second = 0; milliseconds = 0.0; } } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/platform/posix/utils/PosixInterfaceForCLog.h kodi-18.1+git20190217.1232-final/xbmc/platform/posix/utils/PosixInterfaceForCLog.h --- kodi-18.0+git20190128.1934-final/xbmc/platform/posix/utils/PosixInterfaceForCLog.h 2018-07-31 18:47:40.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/platform/posix/utils/PosixInterfaceForCLog.h 2019-02-11 10:31:27.000000000 +0000 @@ -21,7 +21,7 @@ void CloseLogFile(void); bool WriteStringToLog(const std::string& logString); void PrintDebugString(const std::string& debugString); - static void GetCurrentLocalTime(int& hour, int& minute, int& second, double& millisecond); + static void GetCurrentLocalTime(int& year, int& month, int& day, int& hour, int& minute, int& second, double& millisecond); private: FILEWRAP* m_file; }; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/platform/win10/filesystem/WinLibraryFile.cpp kodi-18.1+git20190217.1232-final/xbmc/platform/win10/filesystem/WinLibraryFile.cpp --- kodi-18.0+git20190128.1934-final/xbmc/platform/win10/filesystem/WinLibraryFile.cpp 2018-08-26 13:40:15.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/platform/win10/filesystem/WinLibraryFile.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -85,8 +85,7 @@ { if (m_fileStream != nullptr) { - // see https://docs.microsoft.com/en-us/uwp/api/windows.storage.streams.irandomaccessstream - // m_fileStream->Close(); // where it is? + m_fileStream.Close(); m_fileStream = nullptr; } if (m_sFile) @@ -99,9 +98,17 @@ return -1; IBuffer buf = winrt::make(lpBuf, static_cast(uiBufSize)); - Wait(m_fileStream.ReadAsync(buf, buf.Capacity(), InputStreamOptions::None)); - - return static_cast(buf.Length()); + try + { + Wait(m_fileStream.ReadAsync(buf, buf.Capacity(), InputStreamOptions::None)); + return static_cast(buf.Length()); + } + catch (const winrt::hresult_error& ex) + { + using KODI::PLATFORM::WINDOWS::FromW; + CLog::LogF(LOGERROR, "unable to read file ({})", FromW(ex.message().c_str())); + return -1; + } } ssize_t CWinLibraryFile::Write(const void* lpBuf, size_t uiBufSize) @@ -110,10 +117,19 @@ return -1; uint8_t* buff = (uint8_t*)lpBuf; - auto winrt_buffer = CryptographicBuffer::CreateFromByteArray({ buff, buff + uiBufSize }); + const auto winrt_buffer = CryptographicBuffer::CreateFromByteArray({ buff, buff + uiBufSize }); - uint32_t result = Wait(m_fileStream.WriteAsync(winrt_buffer)); - return static_cast(result); + try + { + const uint32_t result = Wait(m_fileStream.WriteAsync(winrt_buffer)); + return static_cast(result); + } + catch (const winrt::hresult_error& ex) + { + using KODI::PLATFORM::WINDOWS::FromW; + CLog::LogF(LOGERROR, "unable write to file ({})", FromW(ex.message().c_str())); + return -1; + } } int64_t CWinLibraryFile::Seek(int64_t iFilePosition, int iWhence) diff -Nru kodi-18.0+git20190128.1934-final/xbmc/platform/win32/powermanagement/Win32PowerSyscall.cpp kodi-18.1+git20190217.1232-final/xbmc/platform/win32/powermanagement/Win32PowerSyscall.cpp --- kodi-18.0+git20190128.1934-final/xbmc/platform/win32/powermanagement/Win32PowerSyscall.cpp 2018-08-26 13:40:15.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/platform/win32/powermanagement/Win32PowerSyscall.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -110,6 +110,7 @@ CWin32PowerSyscall::CWin32PowerSyscall() { + m_hascapabilities = GetPwrCapabilities(&m_capabilities); m_worker.Create(); } @@ -142,10 +143,14 @@ } bool CWin32PowerSyscall::CanSuspend() { + if (m_hascapabilities) + return (m_capabilities.SystemS1 == TRUE || m_capabilities.SystemS2 == TRUE || m_capabilities.SystemS3 == TRUE); return true; } bool CWin32PowerSyscall::CanHibernate() { + if (m_hascapabilities) + return (m_capabilities.SystemS4 == TRUE && m_capabilities.HiberFilePresent == TRUE); return true; } bool CWin32PowerSyscall::CanReboot() diff -Nru kodi-18.0+git20190128.1934-final/xbmc/platform/win32/powermanagement/Win32PowerSyscall.h kodi-18.1+git20190217.1232-final/xbmc/platform/win32/powermanagement/Win32PowerSyscall.h --- kodi-18.0+git20190128.1934-final/xbmc/platform/win32/powermanagement/Win32PowerSyscall.h 2018-08-26 13:40:15.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/platform/win32/powermanagement/Win32PowerSyscall.h 2019-02-11 10:31:27.000000000 +0000 @@ -58,6 +58,8 @@ static bool IsSuspending() { return m_OnSuspend; } private: + BOOLEAN m_hascapabilities; + SYSTEM_POWER_CAPABILITIES m_capabilities; CWin32PowerStateWorker m_worker; static bool m_OnResume; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/platform/win32/utils/Win32InterfaceForCLog.cpp kodi-18.1+git20190217.1232-final/xbmc/platform/win32/utils/Win32InterfaceForCLog.cpp --- kodi-18.0+git20190128.1934-final/xbmc/platform/win32/utils/Win32InterfaceForCLog.cpp 2018-07-31 18:47:40.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/platform/win32/utils/Win32InterfaceForCLog.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -105,10 +105,13 @@ #endif // _DEBUG } -void CWin32InterfaceForCLog::GetCurrentLocalTime(int& hour, int& minute, int& second, double& millisecond) +void CWin32InterfaceForCLog::GetCurrentLocalTime(int& year, int& month, int& day, int& hour, int& minute, int& second, double& millisecond) { SYSTEMTIME time; GetLocalTime(&time); + year = time.wYear; + month = time.wMonth; + day = time.wDay; hour = time.wHour; minute = time.wMinute; second = time.wSecond; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/platform/win32/utils/Win32InterfaceForCLog.h kodi-18.1+git20190217.1232-final/xbmc/platform/win32/utils/Win32InterfaceForCLog.h --- kodi-18.0+git20190128.1934-final/xbmc/platform/win32/utils/Win32InterfaceForCLog.h 2018-07-31 18:47:40.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/platform/win32/utils/Win32InterfaceForCLog.h 2019-02-11 10:31:28.000000000 +0000 @@ -21,7 +21,7 @@ void CloseLogFile(void); bool WriteStringToLog(const std::string& logString); void PrintDebugString(const std::string& debugString); - static void GetCurrentLocalTime(int& hour, int& minute, int& second, double& millisecond); + static void GetCurrentLocalTime(int& year, int& month, int& day, int& hour, int& minute, int& second, double& millisecond); private: HANDLE m_hFile; }; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/PlayListPlayer.cpp kodi-18.1+git20190217.1232-final/xbmc/PlayListPlayer.cpp --- kodi-18.0+git20190128.1934-final/xbmc/PlayListPlayer.cpp 2018-10-23 16:19:50.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/PlayListPlayer.cpp 2019-02-11 10:31:27.000000000 +0000 @@ -523,6 +523,13 @@ } } + // its likely that the playlist changed + if (CServiceBroker::GetGUI() != nullptr) + { + CGUIMessage msg(GUI_MSG_PLAYLIST_CHANGED, 0, 0); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); + } + AnnouncePropertyChanged(iPlaylist, "shuffled", IsShuffled(iPlaylist)); } @@ -575,6 +582,14 @@ data = "off"; break; } + + // its likely that the playlist changed + if (CServiceBroker::GetGUI() != nullptr) + { + CGUIMessage msg(GUI_MSG_PLAYLIST_CHANGED, 0, 0); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); + } + AnnouncePropertyChanged(iPlaylist, "repeat", data); } @@ -644,6 +659,10 @@ list.Add(items); if (list.IsShuffled()) ReShuffle(iPlaylist, iSize); + + // its likely that the playlist changed + CGUIMessage msg(GUI_MSG_PLAYLIST_CHANGED, 0, 0); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); } void CPlayListPlayer::Insert(int iPlaylist, const CPlayList& playlist, int iIndex) @@ -683,6 +702,10 @@ ReShuffle(iPlaylist, iSize); else if (m_iCurrentPlayList == iPlaylist && m_iCurrentSong >= iIndex) m_iCurrentSong++; + + // its likely that the playlist changed + CGUIMessage msg(GUI_MSG_PLAYLIST_CHANGED, 0, 0); + CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); } void CPlayListPlayer::Remove(int iPlaylist, int iPosition) diff -Nru kodi-18.0+git20190128.1934-final/xbmc/pvr/addons/PVRClients.cpp kodi-18.1+git20190217.1232-final/xbmc/pvr/addons/PVRClients.cpp --- kodi-18.0+git20190128.1934-final/xbmc/pvr/addons/PVRClients.cpp 2019-01-28 18:34:07.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/pvr/addons/PVRClients.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -596,6 +596,13 @@ { case PVR_CONNECTION_STATE_SERVER_UNREACHABLE: iMsg = 35505; // Server is unreachable + if (client->GetPreviousConnectionState() == PVR_CONNECTION_STATE_UNKNOWN || + client->GetPreviousConnectionState() == PVR_CONNECTION_STATE_CONNECTING) + { + // Make our users happy. There were so many complaints about this notification because their TV backend + // was not up quick enough after Kodi start. So, ignore the very first 'server not reachable' notification. + bNotify = false; + } break; case PVR_CONNECTION_STATE_SERVER_MISMATCH: iMsg = 35506; // Server does not respond properly diff -Nru kodi-18.0+git20190128.1934-final/xbmc/pvr/dialogs/GUIDialogPVRChannelsOSD.cpp kodi-18.1+git20190217.1232-final/xbmc/pvr/dialogs/GUIDialogPVRChannelsOSD.cpp --- kodi-18.0+git20190128.1934-final/xbmc/pvr/dialogs/GUIDialogPVRChannelsOSD.cpp 2018-10-23 16:19:51.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/pvr/dialogs/GUIDialogPVRChannelsOSD.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -15,6 +15,8 @@ #include "guilib/GUIMessage.h" #include "input/Key.h" #include "messaging/ApplicationMessenger.h" +#include "settings/Settings.h" +#include "settings/SettingsComponent.h" #include "pvr/PVRGUIActions.h" #include "pvr/PVRManager.h" @@ -214,7 +216,9 @@ // Preserve the item before closing self, because this will clear m_vecItems const CFileItemPtr itemptr = m_vecItems->Get(item); - Close(); + if (CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_PVRMENU_CLOSECHANNELOSDONSWITCH)) + Close(); + CServiceBroker::GetPVRManager().GUIActions()->SwitchToChannel(itemptr, true /* bCheckResume */); } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/pvr/PVRManager.cpp kodi-18.1+git20190217.1232-final/xbmc/pvr/PVRManager.cpp --- kodi-18.0+git20190128.1934-final/xbmc/pvr/PVRManager.cpp 2018-11-21 19:38:54.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/pvr/PVRManager.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -21,6 +21,7 @@ #include "utils/JobManager.h" #include "utils/Stopwatch.h" #include "utils/StringUtils.h" +#include "utils/URIUtils.h" #include "utils/Variant.h" #include "utils/log.h" @@ -203,7 +204,18 @@ iClientID = item.GetPVRTimerInfoTag()->m_iClientId; else if (item.HasEPGInfoTag()) iClientID = item.GetEPGInfoTag()->ClientID(); - + else if (URIUtils::IsPVRChannel(item.GetPath())) + { + const std::shared_ptr channelItem = m_channelGroups->GetByPath(item.GetPath()); + if (channelItem) + iClientID = channelItem->GetPVRChannelInfoTag()->ClientID(); + } + else if (URIUtils::IsPVRRecording(item.GetPath())) + { + const std::shared_ptr recordingItem = m_recordings->GetByPath(item.GetPath()); + if (recordingItem) + iClientID = recordingItem->GetPVRRecordingInfoTag()->ClientID(); + } return GetClient(iClientID); } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/pvr/timers/PVRTimers.cpp kodi-18.1+git20190217.1232-final/xbmc/pvr/timers/PVRTimers.cpp --- kodi-18.0+git20190128.1934-final/xbmc/pvr/timers/PVRTimers.cpp 2018-07-31 18:47:40.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/pvr/timers/PVRTimers.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -683,6 +683,8 @@ CLog::LogF(LOGERROR, "Unable to obtain timer rule for given timer"); return TimerOperationResult::FAILED; } + + return ruleTag->DeleteFromClient(bForce); } return tag->DeleteFromClient(bForce); @@ -794,11 +796,19 @@ if (timersEntry->IsRecording() && !timersEntry->IsTimerRule() && timersEntry->m_iClientId == recording.ClientID() && - timersEntry->m_iClientChannelUid == recording.ChannelUid() && - timersEntry->StartAsUTC() <= recording.RecordingTimeAsUTC() && - timersEntry->EndAsUTC() >= recording.EndTimeAsUTC()) + timersEntry->m_iClientChannelUid == recording.ChannelUid()) { - return timersEntry; + // first, match epg event uids, if available + if (timersEntry->UniqueBroadcastID() == recording.BroadcastUid() && + timersEntry->UniqueBroadcastID() != EPG_TAG_INVALID_UID) + return timersEntry; + + // alternatively, match start and end times + const CDateTime timerStart = timersEntry->StartAsUTC() - CDateTimeSpan(0, 0, timersEntry->m_iMarginStart, 0); + const CDateTime timerEnd = timersEntry->EndAsUTC() + CDateTimeSpan(0, 0, timersEntry->m_iMarginEnd, 0); + if (timerStart <= recording.RecordingTimeAsUTC() && + timerEnd >= recording.EndTimeAsUTC()) + return timersEntry; } } } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/rendering/dx/DeviceResources.cpp kodi-18.1+git20190217.1232-final/xbmc/rendering/dx/DeviceResources.cpp --- kodi-18.0+git20190128.1934-final/xbmc/rendering/dx/DeviceResources.cpp 2018-12-16 20:13:02.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/rendering/dx/DeviceResources.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -739,11 +739,9 @@ // This method is called in the event handler for the DpiChanged event. void DX::DeviceResources::SetDpi(float dpi) { + dpi = std::max(dpi, DisplayMetrics::Dpi100); if (dpi != m_dpi) - { m_dpi = dpi; - CreateWindowSizeDependentResources(); - } } // This method is called in the event handler for the DisplayContentsInvalidated event. diff -Nru kodi-18.0+git20190128.1934-final/xbmc/rendering/dx/DeviceResources.h kodi-18.1+git20190217.1232-final/xbmc/rendering/dx/DeviceResources.h --- kodi-18.0+git20190128.1934-final/xbmc/rendering/dx/DeviceResources.h 2018-07-31 18:47:40.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/rendering/dx/DeviceResources.h 2019-02-11 10:31:28.000000000 +0000 @@ -27,24 +27,6 @@ namespace DX { - namespace DisplayMetrics - { - // High resolution displays can require a lot of GPU and battery power to render. - // High resolution phones, for example, may suffer from poor battery life if - // games attempt to render at 60 frames per second at full fidelity. - // The decision to render at full fidelity across all platforms and form factors - // should be deliberate. - static const bool SupportHighResolutions = true; - - // The default thresholds that define a "high resolution" display. If the thresholds - // are exceeded and SupportHighResolutions is false, the dimensions will be scaled - // by 50%. - static const float Dpi100 = 96.0f; // 100% of standard desktop display. - static const float DpiThreshold = 192.0f; // 200% of standard desktop display. - static const float WidthThreshold = 1920.0f; // 1080p width. - static const float HeightThreshold = 1080.0f; // 1080p height. - }; - interface IDeviceNotify { virtual void OnDXDeviceLost() = 0; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/rendering/dx/DirectXHelper.h kodi-18.1+git20190217.1232-final/xbmc/rendering/dx/DirectXHelper.h --- kodi-18.0+git20190128.1934-final/xbmc/rendering/dx/DirectXHelper.h 2018-10-23 16:19:51.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/rendering/dx/DirectXHelper.h 2019-02-11 10:31:28.000000000 +0000 @@ -20,6 +20,24 @@ #define RATIONAL_TO_FLOAT(rational) ((rational.Denominator != 0) ? \ static_cast(rational.Numerator) / static_cast(rational.Denominator) : 0.0f) + namespace DisplayMetrics + { + // High resolution displays can require a lot of GPU and battery power to render. + // High resolution phones, for example, may suffer from poor battery life if + // games attempt to render at 60 frames per second at full fidelity. + // The decision to render at full fidelity across all platforms and form factors + // should be deliberate. + static const bool SupportHighResolutions = true; + + // The default thresholds that define a "high resolution" display. If the thresholds + // are exceeded and SupportHighResolutions is false, the dimensions will be scaled + // by 50%. + static const float Dpi100 = 96.0f; // 100% of standard desktop display. + static const float DpiThreshold = 192.0f; // 200% of standard desktop display. + static const float WidthThreshold = 1920.0f; // 1080p width. + static const float HeightThreshold = 1080.0f; // 1080p height. + }; + inline void BreakIfFailed(HRESULT hr) { if (FAILED(hr)) @@ -32,18 +50,18 @@ } } - // Converts a length in device-independent pixels (DIPs) to a length in physical pixels. - inline float ConvertDipsToPixels(float dips, float dpi) - { - static const float dipsPerInch = 96.0f; - return floorf(dips * dpi / dipsPerInch + 0.5f); // Round to nearest integer. - } - - inline float ConvertPixelsToDips(float pixels, float dpi) - { - static const float dipsPerInch = 96.0f; - return floorf(pixels / (dpi / dipsPerInch) + 0.5f); // Round to nearest integer. - } + // Converts a length in device-independent pixels (DIPs) to a length in physical pixels. + inline float ConvertDipsToPixels(float dips, float dpi) + { + static const float dipsPerInch = DisplayMetrics::Dpi100; + return floorf(dips * dpi / dipsPerInch + 0.5f); // Round to nearest integer. + } + + inline float ConvertPixelsToDips(float pixels, float dpi) + { + static const float dipsPerInch = DisplayMetrics::Dpi100; + return floorf(pixels / (dpi / dipsPerInch) + 0.5f); // Round to nearest integer. + } inline float RationalToFloat(DXGI_RATIONAL rational) { diff -Nru kodi-18.0+git20190128.1934-final/xbmc/settings/AdvancedSettings.cpp kodi-18.1+git20190217.1232-final/xbmc/settings/AdvancedSettings.cpp --- kodi-18.0+git20190128.1934-final/xbmc/settings/AdvancedSettings.cpp 2018-12-29 14:31:08.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/settings/AdvancedSettings.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -173,7 +173,6 @@ m_DXVACheckCompatibility = false; m_DXVACheckCompatibilityPresent = false; m_DXVAForceProcessorRenderer = true; - m_DXVAAllowHqScaling = true; m_videoFpsDetect = 1; m_maxTempo = 1.55f; m_videoPreferStereoStream = false; @@ -324,13 +323,30 @@ m_videoMovieSetExtraArt = {}; m_videoMusicVideoExtraArt = {}; - m_iEpgUpdateCheckInterval = 300; /* check if tables need to be updated every 5 minutes */ - m_iEpgCleanupInterval = 900; /* remove old entries from the EPG every 15 minutes */ - m_iEpgActiveTagCheckInterval = 60; /* check for updated active tags every minute */ - m_iEpgRetryInterruptedUpdateInterval = 30; /* retry an interrupted epg update after 30 seconds */ - m_iEpgUpdateEmptyTagsInterval = 60; /* override user selectable EPG update interval for empty EPG tags */ - m_bEpgDisplayUpdatePopup = true; /* display a progress popup while updating EPG data from clients */ - m_bEpgDisplayIncrementalUpdatePopup = false; /* also display a progress popup while doing incremental EPG updates */ + m_iEpgUpdateCheckInterval = 300; /* Check every X seconds, if EPG data need to be updated. This does not mean that + every X seconds an EPG update is actually triggered, it's just the interval how + often to check whether an update should be triggered. If this value is greater + than GUI setting 'epg.epgupdate' value, then EPG updates will done with the value + specified for 'updatecheckinterval', effectively overriding the GUI setting's value. */ + m_iEpgCleanupInterval = 900; /* Remove old entries from the EPG every X seconds */ + m_iEpgActiveTagCheckInterval = 60; /* Check for updated active tags every X seconds */ + m_iEpgRetryInterruptedUpdateInterval = 30; /* Retry an interrupted EPG update after X seconds */ + m_iEpgUpdateEmptyTagsInterval = 7200; /* If a TV channel has no EPG data, try to obtain data for that channel every + X seconds. This overrides the GUI setting 'epg.epgupdate' value, but only + for channels without EPG data. If this value is less than 'updatecheckinterval' + value, then data update will be done with the interval specified by + 'updatecheckinterval'. + Example 1: epg.epgupdate = 120 (minutes!), updatecheckinterval = 300, + updateemptytagsinterval = 60 => trigger an EPG update for every + channel without EPG data every 5 minutes and trigger an EPG update + for every channel with EPG data every 2 hours. + Example 2: epg.epgupdate = 120 (minutes!), updatecheckinterval = 300, + updateemptytagsinterval = 3600 => trigger an EPG update for every + channel without EPG data every 2 hours and trigger an EPG update + for every channel with EPG data every 1 hour. */ + m_bEpgDisplayUpdatePopup = true; /* Display a progress popup while updating EPG data from clients */ + m_bEpgDisplayIncrementalUpdatePopup = false; /* Display a progress popup while doing incremental EPG updates, but + only if 'displayupdatepopup' is also enabled. */ m_bEdlMergeShortCommBreaks = false; // Off by default m_iEdlMaxCommBreakLength = 8 * 30 + 10; // Just over 8 * 30 second commercial break. @@ -718,7 +734,6 @@ m_DXVACheckCompatibilityPresent = XMLUtils::GetBoolean(pElement,"checkdxvacompatibility", m_DXVACheckCompatibility); XMLUtils::GetBoolean(pElement,"forcedxvarenderer", m_DXVAForceProcessorRenderer); - XMLUtils::GetBoolean(pElement, "dxvaallowhqscaling", m_DXVAAllowHqScaling); XMLUtils::GetBoolean(pElement, "usedisplaycontrolhwstereo", m_useDisplayControlHWStereo); XMLUtils::GetBoolean(pElement, "allowdiscretedecoder", m_allowUseSeparateDeviceForDecoding); //0 = disable fps detect, 1 = only detect on timestamps with uniform spacing, 2 detect on all timestamps diff -Nru kodi-18.0+git20190128.1934-final/xbmc/settings/AdvancedSettings.h kodi-18.1+git20190217.1232-final/xbmc/settings/AdvancedSettings.h --- kodi-18.0+git20190128.1934-final/xbmc/settings/AdvancedSettings.h 2018-12-29 14:31:08.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/settings/AdvancedSettings.h 2019-02-11 10:31:28.000000000 +0000 @@ -179,7 +179,6 @@ bool m_DXVACheckCompatibility; bool m_DXVACheckCompatibilityPresent; bool m_DXVAForceProcessorRenderer; - bool m_DXVAAllowHqScaling; int m_videoFpsDetect; bool m_mediacodecForceSoftwareRendering; float m_maxTempo; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/settings/Settings.cpp kodi-18.1+git20190217.1232-final/xbmc/settings/Settings.cpp --- kodi-18.0+git20190128.1934-final/xbmc/settings/Settings.cpp 2018-12-29 14:31:08.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/settings/Settings.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -201,6 +201,7 @@ const std::string CSettings::SETTING_PVRMANAGER_CHANNELSCAN = "pvrmanager.channelscan"; const std::string CSettings::SETTING_PVRMANAGER_RESETDB = "pvrmanager.resetdb"; const std::string CSettings::SETTING_PVRMENU_DISPLAYCHANNELINFO = "pvrmenu.displaychannelinfo"; +const std::string CSettings::SETTING_PVRMENU_CLOSECHANNELOSDONSWITCH = "pvrmenu.closechannelosdonswitch"; const std::string CSettings::SETTING_PVRMENU_ICONPATH = "pvrmenu.iconpath"; const std::string CSettings::SETTING_PVRMENU_SEARCHICONS = "pvrmenu.searchicons"; const std::string CSettings::SETTING_EPG_PAST_DAYSTODISPLAY = "epg.pastdaystodisplay"; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/settings/Settings.h kodi-18.1+git20190217.1232-final/xbmc/settings/Settings.h --- kodi-18.0+git20190128.1934-final/xbmc/settings/Settings.h 2018-12-16 20:13:02.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/settings/Settings.h 2019-02-11 10:31:28.000000000 +0000 @@ -161,6 +161,7 @@ static const std::string SETTING_PVRMANAGER_CHANNELSCAN; static const std::string SETTING_PVRMANAGER_RESETDB; static const std::string SETTING_PVRMENU_DISPLAYCHANNELINFO; + static const std::string SETTING_PVRMENU_CLOSECHANNELOSDONSWITCH; static const std::string SETTING_PVRMENU_ICONPATH; static const std::string SETTING_PVRMENU_SEARCHICONS; static const std::string SETTING_EPG_PAST_DAYSTODISPLAY; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/storage/DetectDVDType.cpp kodi-18.1+git20190217.1232-final/xbmc/storage/DetectDVDType.cpp --- kodi-18.0+git20190128.1934-final/xbmc/storage/DetectDVDType.cpp 2018-11-21 19:38:54.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/storage/DetectDVDType.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -328,11 +328,6 @@ } laststatus = status; m_cdio->cdio_destroy(cdio); - - if (status == DRIVER_OP_UNSUPPORTED) - { - return DRIVE_NONE; - } } else return DRIVE_NOT_READY; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/threads/platform/pthreads/ThreadImpl.cpp kodi-18.1+git20190217.1232-final/xbmc/threads/platform/pthreads/ThreadImpl.cpp --- kodi-18.0+git20190128.1934-final/xbmc/threads/platform/pthreads/ThreadImpl.cpp 2019-01-28 18:34:07.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/threads/platform/pthreads/ThreadImpl.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -116,20 +116,21 @@ ThreadIdentifier CThread::GetCurrentThreadId() { + return pthread_self(); +} + +ThreadIdentifier CThread::GetDisplayThreadId(const ThreadIdentifier tid) +{ #if defined(TARGET_ANDROID) - return gettid(); + return pthread_gettid_np(tid); #else - return pthread_self(); + return tid; #endif } bool CThread::IsCurrentThread(const ThreadIdentifier tid) { -#if defined(TARGET_ANDROID) - return gettid() == tid; -#else return pthread_equal(pthread_self(), tid); -#endif } int CThread::GetMinPriority(void) diff -Nru kodi-18.0+git20190128.1934-final/xbmc/threads/platform/win/ThreadImpl.cpp kodi-18.1+git20190217.1232-final/xbmc/threads/platform/win/ThreadImpl.cpp --- kodi-18.0+git20190128.1934-final/xbmc/threads/platform/win/ThreadImpl.cpp 2018-07-31 18:47:40.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/threads/platform/win/ThreadImpl.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -70,6 +70,11 @@ return ::GetCurrentThreadId(); } +ThreadIdentifier CThread::GetDisplayThreadId(const ThreadIdentifier tid) +{ + return tid; +} + bool CThread::IsCurrentThread(const ThreadIdentifier tid) { return (::GetCurrentThreadId() == tid); diff -Nru kodi-18.0+git20190128.1934-final/xbmc/threads/Thread.cpp kodi-18.1+git20190217.1232-final/xbmc/threads/Thread.cpp --- kodi-18.0+git20190128.1934-final/xbmc/threads/Thread.cpp 2018-07-31 18:47:40.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/threads/Thread.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -103,7 +103,7 @@ } name = pThread->m_ThreadName; - id = pThread->m_ThreadId; + id = GetDisplayThreadId(pThread->m_ThreadId); autodelete = pThread->m_bAutoDelete; pThread->SetThreadInfo(); diff -Nru kodi-18.0+git20190128.1934-final/xbmc/threads/Thread.h kodi-18.1+git20190217.1232-final/xbmc/threads/Thread.h --- kodi-18.0+git20190128.1934-final/xbmc/threads/Thread.h 2018-07-31 18:47:40.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/threads/Thread.h 2019-02-11 10:31:28.000000000 +0000 @@ -61,6 +61,7 @@ static bool IsCurrentThread(const ThreadIdentifier tid); static ThreadIdentifier GetCurrentThreadId(); + static ThreadIdentifier GetDisplayThreadId(const ThreadIdentifier tid); static CThread* GetCurrentThread(); virtual void OnException(){} // signal termination handler diff -Nru kodi-18.0+git20190128.1934-final/xbmc/utils/Geometry.h kodi-18.1+git20190217.1232-final/xbmc/utils/Geometry.h --- kodi-18.0+git20190128.1934-final/xbmc/utils/Geometry.h 2018-07-31 18:47:40.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/utils/Geometry.h 2019-02-11 10:31:28.000000000 +0000 @@ -452,6 +452,14 @@ return fragmentsList; } + void GetQuad(point_type (&points)[4]) + { + points[0] = { x1, y1 }; + points[1] = { x2, y1 }; + points[2] = { x2, y2 }; + points[3] = { x1, y2 }; + } + T x1{}, y1{}, x2{}, y2{}; private: static constexpr T clamp_range(T x, T l, T h) XBMC_FORCE_INLINE diff -Nru kodi-18.0+git20190128.1934-final/xbmc/utils/log.cpp kodi-18.1+git20190217.1232-final/xbmc/utils/log.cpp --- kodi-18.0+git20190128.1934-final/xbmc/utils/log.cpp 2018-10-23 16:19:51.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/utils/log.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -188,22 +188,25 @@ bool CLog::WriteLogString(int logLevel, const std::string& logString) { - static const char* prefixFormat = "%02d:%02d:%02d.%03d T:%" PRIu64" %7s: "; + static const char* prefixFormat = "%02d-%02d-%02d %02d:%02d:%02d.%03d T:%" PRIu64" %7s: "; std::string strData(logString); /* fixup newline alignment, number of spaces should equal prefix length */ StringUtils::Replace(strData, "\n", "\n "); - int hour, minute, second; + int year, month, day, hour, minute, second; double millisecond; - g_logState.m_platform.GetCurrentLocalTime(hour, minute, second, millisecond); + g_logState.m_platform.GetCurrentLocalTime(year, month, day, hour, minute, second, millisecond); strData = StringUtils::Format(prefixFormat, + year, + month, + day, hour, minute, second, static_cast(millisecond), - (uint64_t)CThread::GetCurrentThreadId(), + (uint64_t)CThread::GetDisplayThreadId(CThread::GetCurrentThreadId()), levelNames[logLevel]) + strData; return g_logState.m_platform.WriteStringToLog(strData); diff -Nru kodi-18.0+git20190128.1934-final/xbmc/video/tags/VideoInfoTagLoaderFactory.cpp kodi-18.1+git20190217.1232-final/xbmc/video/tags/VideoInfoTagLoaderFactory.cpp --- kodi-18.0+git20190128.1934-final/xbmc/video/tags/VideoInfoTagLoaderFactory.cpp 2018-10-23 16:19:51.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/video/tags/VideoInfoTagLoaderFactory.cpp 2019-02-17 11:32:04.000000000 +0000 @@ -22,10 +22,6 @@ bool lookInFolder, bool forceRefresh) { - // don't try to read tags for streams - if (item.IsInternetStream()) - return nullptr; - if (item.IsPlugin() && info && info->ID() == "metadata.local") { // Direct loading from plugin source with metadata.local scraper diff -Nru kodi-18.0+git20190128.1934-final/xbmc/windowing/Resolution.cpp kodi-18.1+git20190217.1232-final/xbmc/windowing/Resolution.cpp --- kodi-18.0+git20190128.1934-final/xbmc/windowing/Resolution.cpp 2019-01-28 18:34:07.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/windowing/Resolution.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -73,6 +73,8 @@ void CResolutionUtils::FindResolutionFromWhitelist(float fps, int width, int height, bool is3D, RESOLUTION &resolution) { RESOLUTION_INFO curr = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo(resolution); + CLog::Log(LOGNOTICE, "Whitelist search for: width: %d, height: %d, fps: %0.3f, 3D: %s", + width, height, fps, is3D ? "true" : "false"); std::vector indexList = CServiceBroker::GetSettingsComponent()->GetSettings()->GetList(CSettings::SETTING_VIDEOSCREEN_WHITELIST); if (indexList.empty()) @@ -143,6 +145,16 @@ CLog::Log(LOGDEBUG, "No double refresh rate whitelisted resolution matched, trying current resolution"); + if (width <= curr.iScreenWidth + && height <= curr.iScreenHeight + && (MathUtils::FloatEquals(curr.fRefreshRate, fps, 0.01f) || MathUtils::FloatEquals(curr.fRefreshRate, fps * 2, 0.01f))) + { + CLog::Log(LOGDEBUG, "Matched current Resolution %s (%d)", curr.strMode.c_str(), resolution); + return; + } + + CLog::Log(LOGDEBUG, "Current resolution doesn't match, trying default resolution"); + const RESOLUTION_INFO desktop_info = CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo(CDisplaySettings::GetInstance().GetCurrentResolution()); for (const auto &mode : indexList) @@ -161,7 +173,7 @@ } } - CLog::Log(LOGDEBUG, "No larger whitelisted resolution matched, trying current resolution with double refreshrate"); + CLog::Log(LOGDEBUG, "Default resolution doesn't provide reqired refreshrate, trying default resolution with double refreshrate"); for (const auto &mode : indexList) { diff -Nru kodi-18.0+git20190128.1934-final/xbmc/windowing/wayland/WinSystemWayland.cpp kodi-18.1+git20190217.1232-final/xbmc/windowing/wayland/WinSystemWayland.cpp --- kodi-18.0+git20190128.1934-final/xbmc/windowing/wayland/WinSystemWayland.cpp 2019-01-13 07:51:36.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/windowing/wayland/WinSystemWayland.cpp 2019-02-17 11:32:04.000000000 +0000 @@ -299,6 +299,19 @@ m_windowDecorator.reset(new CWindowDecorator(*this, *m_connection, m_surface)); + m_seatInputProcessing.reset(new CSeatInputProcessing(m_surface, *this)); + m_seatRegistry.reset(new CRegistry{*m_connection}); + // version 2 adds name event -> optional + // version 4 adds wl_keyboard repeat_info -> optional + // version 5 adds discrete axis events in wl_pointer -> unused + m_seatRegistry->Request(1, 5, std::bind(&CWinSystemWayland::OnSeatAdded, this, _1, _2), std::bind(&CWinSystemWayland::OnSeatRemoved, this, _1)); + m_seatRegistry->Bind(); + + if (m_seats.empty()) + { + CLog::Log(LOGWARNING, "Wayland compositor did not announce a wl_seat - you will not have any input devices for the time being"); + } + if (fullScreen) { m_shellSurfaceState.set(IShellSurface::STATE_FULLSCREEN); @@ -350,19 +363,6 @@ UpdateDesktopResolution(res, m_bufferSize.Width(), m_bufferSize.Height(), res.fRefreshRate, 0); res.bFullScreen = fullScreen; - m_seatInputProcessing.reset(new CSeatInputProcessing(m_surface, *this)); - m_seatRegistry.reset(new CRegistry{*m_connection}); - // version 2 adds name event -> optional - // version 4 adds wl_keyboard repeat_info -> optional - // version 5 adds discrete axis events in wl_pointer -> unused - m_seatRegistry->Request(1, 5, std::bind(&CWinSystemWayland::OnSeatAdded, this, _1, _2), std::bind(&CWinSystemWayland::OnSeatRemoved, this, _1)); - m_seatRegistry->Bind(); - - if (m_seats.empty()) - { - CLog::Log(LOGWARNING, "Wayland compositor did not announce a wl_seat - you will not have any input devices for the time being"); - } - // Now start processing events // // There are two stages to the event handling: diff -Nru kodi-18.0+git20190128.1934-final/xbmc/windowing/windows/WinEventsWin32.cpp kodi-18.1+git20190217.1232-final/xbmc/windowing/windows/WinEventsWin32.cpp --- kodi-18.0+git20190128.1934-final/xbmc/windowing/windows/WinEventsWin32.cpp 2018-10-23 16:19:51.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/windowing/windows/WinEventsWin32.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -550,13 +550,14 @@ // the new DPI. { // get the suggested size of the window on the new display with a different DPI - unsigned short dpi = LOWORD(wParam); - RECT resizeRect = *reinterpret_cast(lParam); - DX::Windowing()->DPIChanged(dpi, resizeRect); + uint16_t dpi = HIWORD(wParam); + RECT rc = *reinterpret_cast(lParam); + CLog::LogFC(LOGDEBUG, LOGWINDOWING, "dpi changed event -> %d (%d, %d, %d, %d)", dpi, rc.left, rc.top, rc.right, rc.bottom); + DX::Windowing()->DPIChanged(dpi, rc); return(0); } case WM_DISPLAYCHANGE: - CLog::LogF(LOGDEBUG, "display change event"); + CLog::LogFC(LOGDEBUG, LOGWINDOWING, "display change event"); if (g_application.GetRenderGUI() && !DX::Windowing()->IsAlteringWindow() && GET_X_LPARAM(lParam) > 0 && GET_Y_LPARAM(lParam) > 0) { DX::Windowing()->UpdateResolutions(); diff -Nru kodi-18.0+git20190128.1934-final/xbmc/windowing/windows/WinSystemWin32.cpp kodi-18.1+git20190217.1232-final/xbmc/windowing/windows/WinSystemWin32.cpp --- kodi-18.0+git20190128.1934-final/xbmc/windowing/windows/WinSystemWin32.cpp 2018-12-29 14:31:08.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/windowing/windows/WinSystemWin32.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -566,22 +566,31 @@ { MONITORINFOEX monitorInfo; monitorInfo.cbSize = sizeof(MONITORINFOEX); - GetMonitorInfo(hMon, &monitorInfo); - RECT wr = monitorInfo.rcWork; - long wrWidth = wr.right - wr.left; - long wrHeight = wr.bottom - wr.top; - long resizeWidth = resizeRect.right - resizeRect.left; - long resizeHeight = resizeRect.bottom - resizeRect.top; + GetMonitorInfoW(hMon, &monitorInfo); - if (resizeWidth > wrWidth) + if (m_state == WINDOW_STATE_FULLSCREEN_WINDOW || + m_state == WINDOW_STATE_FULLSCREEN) { - resizeRect.right = resizeRect.left + wrWidth; + resizeRect = monitorInfo.rcMonitor; // the whole screen } - - // make sure suggested windows size is not taller or wider than working area of new monitor (considers the toolbar) - if (resizeHeight > wrHeight) + else { - resizeRect.bottom = resizeRect.top + wrHeight; + RECT wr = monitorInfo.rcWork; // it excludes task bar + long wrWidth = wr.right - wr.left; + long wrHeight = wr.bottom - wr.top; + long resizeWidth = resizeRect.right - resizeRect.left; + long resizeHeight = resizeRect.bottom - resizeRect.top; + + if (resizeWidth > wrWidth) + { + resizeRect.right = resizeRect.left + wrWidth; + } + + // make sure suggested windows size is not taller or wider than working area of new monitor (considers the toolbar) + if (resizeHeight > wrHeight) + { + resizeRect.bottom = resizeRect.top + wrHeight; + } } } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/windowing/windows/WinSystemWin32DX.cpp kodi-18.1+git20190217.1232-final/xbmc/windowing/windows/WinSystemWin32DX.cpp --- kodi-18.0+git20190128.1934-final/xbmc/windowing/windows/WinSystemWin32DX.cpp 2018-12-16 20:13:02.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/windowing/windows/WinSystemWin32DX.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -14,6 +14,7 @@ #include "settings/Settings.h" #include "settings/SettingsComponent.h" #include "utils/log.h" +#include "utils/SystemInfo.h" #include "windowing/GraphicContext.h" #include "system.h" @@ -133,9 +134,13 @@ bool CWinSystemWin32DX::DPIChanged(WORD dpi, RECT windowRect) const { + // on Win10 FCU the OS keeps window size exactly the same size as it was + if (CSysInfo::IsWindowsVersionAtLeast(CSysInfo::WindowsVersionWin10_FCU)) + return true; + m_deviceResources->SetDpi(dpi); if (!IsAlteringWindow()) - return CWinSystemWin32::DPIChanged(dpi, windowRect); + return __super::DPIChanged(dpi, windowRect); return true; } diff -Nru kodi-18.0+git20190128.1934-final/xbmc/windowing/X11/GLContextEGL.cpp kodi-18.1+git20190217.1232-final/xbmc/windowing/X11/GLContextEGL.cpp --- kodi-18.0+git20190128.1934-final/xbmc/windowing/X11/GLContextEGL.cpp 2019-01-28 18:34:07.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/windowing/X11/GLContextEGL.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -129,26 +129,19 @@ return false; } - if (!IsSuitableVisual(vInfo)) - { - CLog::Log(LOGWARNING, "Visual 0x%x of the window is not suitable", (unsigned) vInfo->visualid); - XFree(vInfo); - Destroy(); - return false; - } - - CLog::Log(LOGNOTICE, "Using visual 0x%x", (unsigned) vInfo->visualid); - + unsigned int visualid = static_cast(vInfo->visualid); m_eglConfig = GetEGLConfig(m_eglDisplay, vInfo); XFree(vInfo); if (m_eglConfig == EGL_NO_CONFIG) { - CLog::Log(LOGERROR, "failed to get eglconfig for visual id"); + CLog::Log(LOGERROR, "failed to get suitable eglconfig for visual 0x%x", visualid); Destroy(); return false; } + CLog::Log(LOGNOTICE, "Using visual 0x%x", visualid); + m_eglSurface = eglCreateWindowSurface(m_eglDisplay, m_eglConfig, glWindow, NULL); if (m_eglSurface == EGL_NO_SURFACE) { @@ -332,21 +325,19 @@ } } -bool CGLContextEGL::IsSuitableVisual(XVisualInfo *vInfo) +bool CGLContextEGL::SuitableCheck(EGLDisplay eglDisplay, EGLConfig config) { - EGLConfig config = GetEGLConfig(m_eglDisplay, vInfo); if (config == EGL_NO_CONFIG) - { - CLog::Log(LOGERROR, "Failed to determine egl config for visual info"); return false; - } - EGLint value; - if (!eglGetConfigAttrib(m_eglDisplay, config, EGL_RED_SIZE, &value) || value < 8) + EGLint value; + if (!eglGetConfigAttrib(eglDisplay, config, EGL_RED_SIZE, &value) || value < 8) return false; - if (!eglGetConfigAttrib(m_eglDisplay, config, EGL_GREEN_SIZE, &value) || value < 8) + if (!eglGetConfigAttrib(eglDisplay, config, EGL_GREEN_SIZE, &value) || value < 8) return false; - if (!eglGetConfigAttrib(m_eglDisplay, config, EGL_BLUE_SIZE, &value) || value < 8) + if (!eglGetConfigAttrib(eglDisplay, config, EGL_BLUE_SIZE, &value) || value < 8) + return false; + if (!eglGetConfigAttrib(eglDisplay, config, EGL_DEPTH_SIZE, &value) || value < 24) return false; return true; @@ -382,13 +373,17 @@ } for (EGLint i = 0; i < numConfigs; ++i) { + if (!SuitableCheck(eglDisplay, eglConfigs[i])) + continue; + EGLint value; if (!eglGetConfigAttrib(eglDisplay, eglConfigs[i], EGL_NATIVE_VISUAL_ID, &value)) { CLog::Log(LOGERROR, "Failed to query EGL_NATIVE_VISUAL_ID for egl config."); break; } - if (value == (EGLint)vInfo->visualid) { + if (value == (EGLint)vInfo->visualid) + { eglConfig = eglConfigs[i]; break; } @@ -510,7 +505,7 @@ CSingleLock lock(m_syncLock); msc = m_sync.msc2; - interval = (m_sync.cont > 5) ? m_sync.interval : m_sync.ust2 - m_sync.ust1; + interval = (m_sync.cont >= 5) ? m_sync.interval : m_sync.ust2 - m_sync.ust1; if (interval == 0) return 0; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/windowing/X11/GLContextEGL.h kodi-18.1+git20190217.1232-final/xbmc/windowing/X11/GLContextEGL.h --- kodi-18.0+git20190128.1934-final/xbmc/windowing/X11/GLContextEGL.h 2019-01-28 18:34:07.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/windowing/X11/GLContextEGL.h 2019-02-11 10:31:28.000000000 +0000 @@ -34,7 +34,7 @@ EGLContext m_eglContext; EGLConfig m_eglConfig; protected: - bool IsSuitableVisual(XVisualInfo *vInfo); + bool SuitableCheck(EGLDisplay eglDisplay, EGLConfig config); EGLConfig GetEGLConfig(EGLDisplay eglDisplay, XVisualInfo *vInfo); PFNEGLGETSYNCVALUESCHROMIUMPROC eglGetSyncValuesCHROMIUM = nullptr; PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT = nullptr; diff -Nru kodi-18.0+git20190128.1934-final/xbmc/windowing/X11/VideoSyncOML.cpp kodi-18.1+git20190217.1232-final/xbmc/windowing/X11/VideoSyncOML.cpp --- kodi-18.0+git20190128.1934-final/xbmc/windowing/X11/VideoSyncOML.cpp 2018-08-26 13:40:16.000000000 +0000 +++ kodi-18.1+git20190217.1232-final/xbmc/windowing/X11/VideoSyncOML.cpp 2019-02-11 10:31:28.000000000 +0000 @@ -45,7 +45,14 @@ timeSinceVblank = m_winSystem.GetVblankTiming(newMsc, interval); if (newMsc == msc) + { + newMsc++; + } + else if (newMsc < msc) + { + timeSinceVblank = interval; continue; + } uint64_t now = CurrentHostCounter(); UpdateClock(newMsc - msc, now, m_refClock);