summaryrefslogtreecommitdiffstats
path: root/abs
diff options
context:
space:
mode:
authorBritney Fransen <brfransen@gmail.com>2018-04-19 19:12:11 (GMT)
committerBritney Fransen <brfransen@gmail.com>2018-04-19 19:12:11 (GMT)
commit49df8a95c611ea5e3e99569bfc2f1a20d940e5a4 (patch)
tree8d92f530a798e68ab842d4f4269211c06db18420 /abs
parent0d6f96566d886701b01c55f1c518e01b07ebe1dd (diff)
downloadlinhes_pkgbuild-49df8a95c611ea5e3e99569bfc2f1a20d940e5a4.zip
linhes_pkgbuild-49df8a95c611ea5e3e99569bfc2f1a20d940e5a4.tar.gz
linhes_pkgbuild-49df8a95c611ea5e3e99569bfc2f1a20d940e5a4.tar.bz2
kodi: update to 17.6. refs #1011
Diffstat (limited to 'abs')
-rw-r--r--abs/extra/kodi/10160.patch22
-rw-r--r--abs/extra/kodi/10775.patch839
-rw-r--r--abs/extra/kodi/9703.patch1432
-rw-r--r--abs/extra/kodi/PKGBUILD234
-rw-r--r--abs/extra/kodi/cheat-sse-build.patch11
-rw-r--r--abs/extra/kodi/cpuinfo4
-rw-r--r--abs/extra/kodi/fix-ftpparse.patch71
-rw-r--r--abs/extra/kodi/fix-python-lib-path.patch29
-rw-r--r--abs/extra/kodi/kodi.install9
9 files changed, 2574 insertions, 77 deletions
diff --git a/abs/extra/kodi/10160.patch b/abs/extra/kodi/10160.patch
new file mode 100644
index 0000000..73923ea
--- /dev/null
+++ b/abs/extra/kodi/10160.patch
@@ -0,0 +1,22 @@
+diff --git a/xbmc/filesystem/DllLibCurl.h b/xbmc/filesystem/DllLibCurl.h
+index 1bdaae1..9e78a91 100644
+--- a/xbmc/filesystem/DllLibCurl.h
++++ b/xbmc/filesystem/DllLibCurl.h
+@@ -52,7 +52,7 @@ namespace XCURL
+ virtual CURLMcode multi_fdset(CURLM *multi_handle, fd_set *read_fd_set, fd_set *write_fd_set, fd_set *exc_fd_set, int *max_fd)=0;
+ virtual CURLMcode multi_timeout(CURLM *multi_handle, long *timeout)=0;
+ virtual CURLMsg* multi_info_read(CURLM *multi_handle, int *msgs_in_queue)=0;
+- virtual void multi_cleanup(CURL_HANDLE * handle )=0;
++ virtual CURLMcode multi_cleanup(CURLM * handle )=0;
+ virtual struct curl_slist* slist_append(struct curl_slist *, const char *)=0;
+ virtual void slist_free_all(struct curl_slist *)=0;
+ };
+@@ -77,7 +77,7 @@ namespace XCURL
+ DEFINE_METHOD5(CURLMcode, multi_fdset, (CURLM *p1, fd_set *p2, fd_set *p3, fd_set *p4, int *p5))
+ DEFINE_METHOD2(CURLMcode, multi_timeout, (CURLM *p1, long *p2))
+ DEFINE_METHOD2(CURLMsg*, multi_info_read, (CURLM *p1, int *p2))
+- DEFINE_METHOD1(void, multi_cleanup, (CURLM *p1))
++ DEFINE_METHOD1(CURLMcode, multi_cleanup, (CURLM *p1))
+ DEFINE_METHOD2(struct curl_slist*, slist_append, (struct curl_slist * p1, const char * p2))
+ DEFINE_METHOD1(void, slist_free_all, (struct curl_slist * p1))
+ DEFINE_METHOD1(const char *, easy_strerror, (CURLcode p1))
diff --git a/abs/extra/kodi/10775.patch b/abs/extra/kodi/10775.patch
new file mode 100644
index 0000000..6188484
--- /dev/null
+++ b/abs/extra/kodi/10775.patch
@@ -0,0 +1,839 @@
+From cc3ae0339faf2b669bee20cb360c526410910f42 Mon Sep 17 00:00:00 2001
+From: Lars Op den Kamp <lars@opdenkamp.eu>
+Date: Fri, 11 Nov 2016 10:09:36 +0100
+Subject: [PATCH 1/4] [cec] bump to libCEC 4.0.0
+
+---
+ .../resource.language.en_gb/resources/strings.po | 5 -
+ configure.ac | 4 +-
+ project/BuildDependencies/scripts/0_package.list | 2 +-
+ project/cmake/modules/FindCEC.cmake | 2 +-
+ system/peripherals.xml | 1 -
+ tools/depends/target/Makefile | 5 +-
+ tools/depends/target/libcec/Makefile | 4 +-
+ tools/depends/target/p8-platform/Makefile | 34 ++++
+ xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 192 +++++++++------------
+ xbmc/peripherals/devices/PeripheralCecAdapter.h | 17 +-
+ 10 files changed, 138 insertions(+), 128 deletions(-)
+ create mode 100644 tools/depends/target/p8-platform/Makefile
+
+diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po
+index e3f8a37..e482196 100644
+--- a/addons/resource.language.en_gb/resources/strings.po
++++ b/addons/resource.language.en_gb/resources/strings.po
+@@ -16376,11 +16376,6 @@ msgctxt "#36021"
+ msgid "Physical address (overrules HDMI port)"
+ msgstr ""
+
+-#: system/peripherals.xml
+-msgctxt "#36022"
+-msgid "COM port (leave empty unless needed)"
+-msgstr ""
+-
+ #: xbmc/peripherals/devices/peripheralcecadapter.cpp
+ msgctxt "#36023"
+ msgid "Configuration updated"
+diff --git a/configure.ac b/configure.ac
+index e61d4ae..34fe643 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1453,9 +1453,9 @@ if test "x$use_libcec" != "xno"; then
+ # libcec is dyloaded, so we need to check for its headers and link any depends.
+ if test "x$use_libcec" != "xno"; then
+ if test "x$use_libcec" != "xauto"; then
+- PKG_CHECK_MODULES([CEC],[libcec >= 3.0.0],,[use_libcec="no";AC_MSG_ERROR($libcec_disabled)])
++ PKG_CHECK_MODULES([CEC],[libcec >= 4.0.0],,[use_libcec="no";AC_MSG_ERROR($libcec_disabled)])
+ else
+- PKG_CHECK_MODULES([CEC],[libcec >= 3.0.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)])
++ PKG_CHECK_MODULES([CEC],[libcec >= 4.0.0],,[use_libcec="no";AC_MSG_RESULT($libcec_disabled)])
+ fi
+
+ if test "x$use_libcec" != "xno"; then
+diff --git a/project/BuildDependencies/scripts/0_package.list b/project/BuildDependencies/scripts/0_package.list
+index 9a5bccb..7b6ec1a 100644
+--- a/project/BuildDependencies/scripts/0_package.list
++++ b/project/BuildDependencies/scripts/0_package.list
+@@ -19,7 +19,7 @@ jsonschemabuilder-1.0.0-win32-3.7z
+ libass-0.12.1-win32.7z
+ libbluray-0.8.1-win32-vc120.7z
+ libcdio-0.83-win32-2.7z
+-libcec-3.0.0-win32-2.7z
++libcec-4.0.0-win32-vc140.7z
+ libexpat_2.0.1-win32.7z
+ libflac-1.2.1-win32.7z
+ libfribidi-0.19.2-win32.7z
+diff --git a/system/peripherals.xml b/system/peripherals.xml
+index f939c0b..58a9d24 100644
+--- a/system/peripherals.xml
++++ b/system/peripherals.xml
+@@ -24,7 +24,6 @@
+ <setting key="connected_device" type="enum" label="36019" value="36037" lvalues="36037|36038" order="12" />
+ <setting key="cec_hdmi_port" type="int" value="1" min="1" max="15" label="36015" order="13" />
+ <setting key="physical_address" type="string" label="36021" value="0" order="14" />
+- <setting key="port" type="string" value="" label="36022" order="15" />
+
+ <setting key="tv_vendor" type="int" value="0" configurable="0" />
+ <setting key="device_name" type="string" value="Kodi" configurable="0" />
+diff --git a/tools/depends/target/Makefile b/tools/depends/target/Makefile
+index 9bca188..82b378d 100644
+--- a/tools/depends/target/Makefile
++++ b/tools/depends/target/Makefile
+@@ -15,7 +15,7 @@
+ python26 libshairplay \
+ libplist libcec libbluray boost tinyxml dummy-libxbmc \
+ libamplayer libssh taglib libusb libnfs \
+- pythonmodule-pil libxslt ffmpeg platform crossguid libdcadec giflib
++ pythonmodule-pil libxslt ffmpeg platform crossguid libdcadec giflib p8-platform
+
+ FFMPEG_DEPENDS = gnutls libdcadec
+
+@@ -101,7 +101,8 @@ pythonmodule-setuptools: python27
+ libsdl2: $(LINUX_SYSTEM_LIBS)
+ libxslt: libgcrypt
+ ffmpeg: $(ICONV) $(ZLIB) bzip2 libvorbis $(FFMPEG_DEPENDS)
+-libcec: platform
++platform: p8-platform
++libcec: p8-platform
+ crossguid: $(CROSSGUID_DEPS)
+
+ .installed-$(PLATFORM): $(DEPENDS)
+diff --git a/tools/depends/target/libcec/Makefile b/tools/depends/target/libcec/Makefile
+index f54af9e..c75b300 100644
+--- a/tools/depends/target/libcec/Makefile
++++ b/tools/depends/target/libcec/Makefile
+@@ -3,12 +3,12 @@ DEPS= ../../Makefile.include Makefile
+
+ # lib name, version
+ LIBNAME=libcec
+-VERSION_MAJOR=3
++VERSION_MAJOR=4
+ VERSION_MINOR=0
+ VERSION_PATCH=0
+
+ VERSION=$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH)
+-SOURCE=$(LIBNAME)-$(VERSION)-6
++SOURCE=$(LIBNAME)-$(VERSION)
+ ARCHIVE=$(SOURCE).tar.gz
+
+ LIBDYLIB=$(PLATFORM)/build/src/$(LIBNAME).la
+diff --git a/tools/depends/target/p8-platform/Makefile b/tools/depends/target/p8-platform/Makefile
+new file mode 100644
+index 0000000..d5918d7
+--- /dev/null
++++ b/tools/depends/target/p8-platform/Makefile
+@@ -0,0 +1,34 @@
++include ../../Makefile.include
++DEPS= ../../Makefile.include Makefile
++
++# lib name, version
++LIBNAME=p8-platform
++VERSION=2.1.0.1
++SOURCE=$(LIBNAME)-$(VERSION)
++ARCHIVE=$(SOURCE).tar.gz
++
++LIBDYLIB=$(PLATFORM)/build/src/$(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 --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
+index e6bcbce..a71dc4b 100644
+--- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
++++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
+@@ -43,7 +43,7 @@ using namespace PERIPHERALS;
+ using namespace ANNOUNCEMENT;
+ using namespace CEC;
+
+-#define CEC_LIB_SUPPORTED_VERSION LIBCEC_VERSION_TO_UINT(3, 0, 0)
++#define CEC_LIB_SUPPORTED_VERSION LIBCEC_VERSION_TO_UINT(4, 0, 0)
+
+ /* time in seconds to ignore standby commands from devices after the screensaver has been activated */
+ #define SCREENSAVER_TIMEOUT 20
+@@ -119,25 +119,30 @@ void CPeripheralCecAdapter::ResetMembers(void)
+ m_dll->CECDestroy(m_cecAdapter);
+ m_cecAdapter = NULL;
+ delete m_dll;
+- m_dll = NULL;
+- m_bStarted = false;
+- m_bHasButton = false;
+- m_bIsReady = false;
+- m_bHasConnectedAudioSystem = false;
+- m_strMenuLanguage = "???";
+- m_lastKeypress = 0;
+- m_lastChange = VOLUME_CHANGE_NONE;
+- m_iExitCode = EXITCODE_QUIT;
+- m_bIsMuted = false; // TODO fetch the correct initial value when system audiostatus is implemented in libCEC
+- m_bGoingToStandby = false;
+- m_bIsRunning = false;
+- m_bDeviceRemoved = false;
+- m_bActiveSourcePending = false;
+- m_bStandbyPending = false;
++ m_dll = NULL;
++ m_bStarted = false;
++ m_bHasButton = false;
++ m_bIsReady = false;
++ m_bHasConnectedAudioSystem = false;
++ m_strMenuLanguage = "???";
++ m_lastKeypress = 0;
++ m_lastChange = VOLUME_CHANGE_NONE;
++ m_iExitCode = EXITCODE_QUIT;
++ m_bIsMuted = false; //! @todo fetch the correct initial value when system audiostatus is implemented in libCEC
++ m_bGoingToStandby = false;
++ m_bIsRunning = false;
++ m_bDeviceRemoved = false;
++ m_bActiveSourcePending = false;
++ m_bStandbyPending = false;
+ m_bActiveSourceBeforeStandby = false;
+- m_bOnPlayReceived = false;
+- m_bPlaybackPaused = false;
+- m_queryThread = NULL;
++ m_bOnPlayReceived = false;
++ m_bPlaybackPaused = false;
++ m_queryThread = NULL;
++ m_bPowerOnScreensaver = false;
++ m_bUseTVMenuLanguage = false;
++ m_bSendInactiveSource = false;
++ m_bPowerOffScreensaver = false;
++ m_bShutdownOnStandby = false;
+
+ m_currentButton.iButton = 0;
+ m_currentButton.iDuration = 0;
+@@ -166,8 +171,8 @@ void CPeripheralCecAdapter::Announce(AnnouncementFlag flag, const char *sender,
+ if (bIgnoreDeactivate)
+ CLog::Log(LOGDEBUG, "%s - ignoring OnScreensaverDeactivated for power action", __FUNCTION__);
+ }
+- if (m_configuration.bPowerOnScreensaver == 1 && !bIgnoreDeactivate &&
+- m_configuration.bActivateSource == 1)
++ if (m_bPowerOnScreensaver && !bIgnoreDeactivate &&
++ m_configuration.bActivateSource)
+ {
+ ActivateSource();
+ }
+@@ -175,7 +180,7 @@ void CPeripheralCecAdapter::Announce(AnnouncementFlag flag, const char *sender,
+ else if (flag == GUI && !strcmp(sender, "xbmc") && !strcmp(message, "OnScreensaverActivated") && m_bIsReady)
+ {
+ // Don't put devices to standby if application is currently playing
+- if ((!g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused()) && m_configuration.bPowerOffScreensaver == 1)
++ if (!g_application.m_pPlayer->IsPlaying() && m_bPowerOffScreensaver)
+ {
+ // only power off when we're the active source
+ if (m_cecAdapter->IsLibCECActiveSource())
+@@ -241,14 +246,14 @@ bool CPeripheralCecAdapter::InitialiseFeature(const PeripheralFeature feature)
+
+ SetConfigurationFromSettings();
+ m_callbacks.Clear();
+- m_callbacks.CBCecLogMessage = &CecLogMessage;
+- m_callbacks.CBCecKeyPress = &CecKeyPress;
+- m_callbacks.CBCecCommand = &CecCommand;
+- m_callbacks.CBCecConfigurationChanged = &CecConfiguration;
+- m_callbacks.CBCecAlert = &CecAlert;
+- m_callbacks.CBCecSourceActivated = &CecSourceActivated;
+- m_configuration.callbackParam = this;
+- m_configuration.callbacks = &m_callbacks;
++ m_callbacks.logMessage = &CecLogMessage;
++ m_callbacks.keyPress = &CecKeyPress;
++ m_callbacks.commandReceived = &CecCommand;
++ m_callbacks.configurationChanged = &CecConfiguration;
++ m_callbacks.alert = &CecAlert;
++ m_callbacks.sourceActivated = &CecSourceActivated;
++ m_configuration.callbackParam = this;
++ m_configuration.callbacks = &m_callbacks;
+
+ m_dll = new DllLibCEC;
+ if (m_dll->Load() && m_dll->IsLoaded())
+@@ -414,7 +419,7 @@ void CPeripheralCecAdapter::Process(void)
+ m_standbySent = CDateTime::GetCurrentDateTime();
+ m_cecAdapter->StandbyDevices();
+ }
+- else if (m_configuration.bSendInactiveSource == 1)
++ else if (m_bSendInactiveSource)
+ {
+ CLog::Log(LOGDEBUG, "%s - sending inactive source commands", __FUNCTION__);
+ m_cecAdapter->SetInactiveView();
+@@ -614,43 +619,43 @@ void CPeripheralCecAdapter::SetMenuLanguage(const char *strLanguage)
+ CLog::Log(LOGWARNING, "%s - TV menu language set to unknown value '%s'", __FUNCTION__, strLanguage);
+ }
+
+-int CPeripheralCecAdapter::CecCommand(void *cbParam, const cec_command command)
++void CPeripheralCecAdapter::CecCommand(void *cbParam, const cec_command* command)
+ {
+- CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam;
++ CPeripheralCecAdapter *adapter = static_cast<CPeripheralCecAdapter *>(cbParam);
+ if (!adapter)
+- return 0;
++ return;
+
+ if (adapter->m_bIsReady)
+ {
+- switch (command.opcode)
++ switch (command->opcode)
+ {
+ case CEC_OPCODE_STANDBY:
+ /* a device was put in standby mode */
+- if (command.initiator == CECDEVICE_TV &&
+- (adapter->m_configuration.bPowerOffOnStandby == 1 || adapter->m_configuration.bShutdownOnStandby == 1) &&
++ if (command->initiator == CECDEVICE_TV &&
++ (adapter->m_configuration.bPowerOffOnStandby == 1 || adapter->m_bShutdownOnStandby) &&
+ (!adapter->m_standbySent.IsValid() || CDateTime::GetCurrentDateTime() - adapter->m_standbySent > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT)))
+ {
+ adapter->m_bStarted = false;
+ if (adapter->m_configuration.bPowerOffOnStandby == 1)
+ g_application.ExecuteXBMCAction("Suspend");
+- else if (adapter->m_configuration.bShutdownOnStandby == 1)
++ else if (adapter->m_bShutdownOnStandby)
+ g_application.ExecuteXBMCAction("Shutdown");
+ }
+ break;
+ case CEC_OPCODE_SET_MENU_LANGUAGE:
+- if (adapter->m_configuration.bUseTVMenuLanguage == 1 && command.initiator == CECDEVICE_TV && command.parameters.size == 3)
++ if (adapter->m_bUseTVMenuLanguage == 1 && command->initiator == CECDEVICE_TV && command->parameters.size == 3)
+ {
+ char strNewLanguage[4];
+ for (int iPtr = 0; iPtr < 3; iPtr++)
+- strNewLanguage[iPtr] = command.parameters[iPtr];
++ strNewLanguage[iPtr] = command->parameters[iPtr];
+ strNewLanguage[3] = 0;
+ adapter->SetMenuLanguage(strNewLanguage);
+ }
+ break;
+ case CEC_OPCODE_DECK_CONTROL:
+- if (command.initiator == CECDEVICE_TV &&
+- command.parameters.size == 1 &&
+- command.parameters[0] == CEC_DECK_CONTROL_MODE_STOP)
++ if (command->initiator == CECDEVICE_TV &&
++ command->parameters.size == 1 &&
++ command->parameters[0] == CEC_DECK_CONTROL_MODE_STOP)
+ {
+ cec_keypress key;
+ key.duration = 500;
+@@ -659,17 +664,17 @@ int CPeripheralCecAdapter::CecCommand(void *cbParam, const cec_command command)
+ }
+ break;
+ case CEC_OPCODE_PLAY:
+- if (command.initiator == CECDEVICE_TV &&
+- command.parameters.size == 1)
++ if (command->initiator == CECDEVICE_TV &&
++ command->parameters.size == 1)
+ {
+- if (command.parameters[0] == CEC_PLAY_MODE_PLAY_FORWARD)
++ if (command->parameters[0] == CEC_PLAY_MODE_PLAY_FORWARD)
+ {
+ cec_keypress key;
+ key.duration = 500;
+ key.keycode = CEC_USER_CONTROL_CODE_PLAY;
+ adapter->PushCecKeypress(key);
+ }
+- else if (command.parameters[0] == CEC_PLAY_MODE_PLAY_STILL)
++ else if (command->parameters[0] == CEC_PLAY_MODE_PLAY_STILL)
+ {
+ cec_keypress key;
+ key.duration = 500;
+@@ -682,25 +687,23 @@ int CPeripheralCecAdapter::CecCommand(void *cbParam, const cec_command command)
+ break;
+ }
+ }
+- return 1;
+ }
+
+-int CPeripheralCecAdapter::CecConfiguration(void *cbParam, const libcec_configuration config)
++void CPeripheralCecAdapter::CecConfiguration(void *cbParam, const libcec_configuration* config)
+ {
+- CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam;
++ CPeripheralCecAdapter *adapter = static_cast<CPeripheralCecAdapter *>(cbParam);
+ if (!adapter)
+- return 0;
++ return;
+
+ CSingleLock lock(adapter->m_critSection);
+- adapter->SetConfigurationFromLibCEC(config);
+- return 1;
++ adapter->SetConfigurationFromLibCEC(*config);
+ }
+
+-int CPeripheralCecAdapter::CecAlert(void *cbParam, const libcec_alert alert, const libcec_parameter data)
++void CPeripheralCecAdapter::CecAlert(void *cbParam, const libcec_alert alert, const libcec_parameter data)
+ {
+- CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam;
++ CPeripheralCecAdapter *adapter = static_cast<CPeripheralCecAdapter *>(cbParam);
+ if (!adapter)
+- return 0;
++ return;
+
+ bool bReopenConnection(false);
+ int iAlertString(0);
+@@ -743,18 +746,13 @@ int CPeripheralCecAdapter::CecAlert(void *cbParam, const libcec_alert alert, con
+
+ if (bReopenConnection)
+ adapter->ReopenConnection();
+-
+- return 1;
+ }
+
+-int CPeripheralCecAdapter::CecKeyPress(void *cbParam, const cec_keypress key)
++void CPeripheralCecAdapter::CecKeyPress(void *cbParam, const cec_keypress* key)
+ {
+- CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam;
+- if (!adapter)
+- return 0;
+-
+- adapter->PushCecKeypress(key);
+- return 1;
++ CPeripheralCecAdapter *adapter = static_cast<CPeripheralCecAdapter *>(cbParam);
++ if (!!adapter)
++ adapter->PushCecKeypress(*key);
+ }
+
+ void CPeripheralCecAdapter::GetNextKey(void)
+@@ -1154,7 +1152,7 @@ void CPeripheralCecAdapter::OnSettingChanged(const std::string &strChangedSettin
+
+ void CPeripheralCecAdapter::CecSourceActivated(void *cbParam, const CEC::cec_logical_address address, const uint8_t activated)
+ {
+- CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam;
++ CPeripheralCecAdapter *adapter = static_cast<CPeripheralCecAdapter *>(cbParam);
+ if (!adapter)
+ return;
+
+@@ -1196,14 +1194,14 @@ void CPeripheralCecAdapter::CecSourceActivated(void *cbParam, const CEC::cec_log
+ }
+ }
+
+-int CPeripheralCecAdapter::CecLogMessage(void *cbParam, const cec_log_message message)
++void CPeripheralCecAdapter::CecLogMessage(void *cbParam, const cec_log_message* message)
+ {
+- CPeripheralCecAdapter *adapter = (CPeripheralCecAdapter *)cbParam;
++ CPeripheralCecAdapter *adapter = static_cast<CPeripheralCecAdapter *>(cbParam);
+ if (!adapter)
+- return 0;
++ return;
+
+ int iLevel = -1;
+- switch (message.level)
++ switch (message->level)
+ {
+ case CEC_LOG_ERROR:
+ iLevel = LOGERROR;
+@@ -1223,9 +1221,7 @@ int CPeripheralCecAdapter::CecLogMessage(void *cbParam, const cec_log_message me
+ }
+
+ if (iLevel >= CEC_LOG_NOTICE || (iLevel >= 0 && CLog::IsLogLevelLogged(LOGDEBUG) && g_advancedSettings.CanLogComponent(LOGCEC)))
+- CLog::Log(iLevel, "%s - %s", __FUNCTION__, message.message);
+-
+- return 1;
++ CLog::Log(iLevel, "%s - %s", __FUNCTION__, message->message);
+ }
+
+ void CPeripheralCecAdapter::SetConfigurationFromLibCEC(const CEC::libcec_configuration &config)
+@@ -1270,35 +1266,18 @@ void CPeripheralCecAdapter::SetConfigurationFromLibCEC(const CEC::libcec_configu
+ bChanged |= WriteLogicalAddresses(config.powerOffDevices, "standby_devices", "standby_devices_advanced");
+
+ // set the boolean settings
+- m_configuration.bUseTVMenuLanguage = config.bUseTVMenuLanguage;
+- bChanged |= SetSetting("use_tv_menu_language", m_configuration.bUseTVMenuLanguage == 1);
+-
+ m_configuration.bActivateSource = config.bActivateSource;
+ bChanged |= SetSetting("activate_source", m_configuration.bActivateSource == 1);
+
+- m_configuration.bPowerOffScreensaver = config.bPowerOffScreensaver;
+- bChanged |= SetSetting("cec_standby_screensaver", m_configuration.bPowerOffScreensaver == 1);
+-
+- m_configuration.bPowerOnScreensaver = config.bPowerOnScreensaver;
+- bChanged |= SetSetting("cec_wake_screensaver", m_configuration.bPowerOnScreensaver == 1);
+-
+ m_configuration.bPowerOffOnStandby = config.bPowerOffOnStandby;
+
+- m_configuration.bSendInactiveSource = config.bSendInactiveSource;
+- bChanged |= SetSetting("send_inactive_source", m_configuration.bSendInactiveSource == 1);
+-
+ m_configuration.iFirmwareVersion = config.iFirmwareVersion;
+- m_configuration.bShutdownOnStandby = config.bShutdownOnStandby;
+
+ memcpy(m_configuration.strDeviceLanguage, config.strDeviceLanguage, 3);
+ m_configuration.iFirmwareBuildDate = config.iFirmwareBuildDate;
+
+ SetVersionInfo(m_configuration);
+
+- bChanged |= SetSetting("standby_pc_on_tv_standby",
+- m_configuration.bPowerOffOnStandby == 1 ? 13011 :
+- m_configuration.bShutdownOnStandby == 1 ? 13005 : 36028);
+-
+ if (bChanged)
+ CLog::Log(LOGDEBUG, "SetConfigurationFromLibCEC - settings updated by libCEC");
+ }
+@@ -1306,7 +1285,7 @@ void CPeripheralCecAdapter::SetConfigurationFromLibCEC(const CEC::libcec_configu
+ void CPeripheralCecAdapter::SetConfigurationFromSettings(void)
+ {
+ // client version matches the version of libCEC that we originally used the API from
+- m_configuration.clientVersion = LIBCEC_VERSION_TO_UINT(3, 0, 0);
++ m_configuration.clientVersion = LIBCEC_VERSION_TO_UINT(4, 0, 0);
+
+ // device name 'XBMC'
+ snprintf(m_configuration.strDeviceName, 13, "%s", GetSettingString("device_name").c_str());
+@@ -1373,16 +1352,16 @@ void CPeripheralCecAdapter::SetConfigurationFromSettings(void)
+ ReadLogicalAddresses(GetSettingInt("standby_devices"), m_configuration.powerOffDevices);
+
+ // read the boolean settings
+- m_configuration.bUseTVMenuLanguage = GetSettingBool("use_tv_menu_language") ? 1 : 0;
++ m_bUseTVMenuLanguage = GetSettingBool("use_tv_menu_language") ? 1 : 0;
+ m_configuration.bActivateSource = GetSettingBool("activate_source") ? 1 : 0;
+- m_configuration.bPowerOffScreensaver = GetSettingBool("cec_standby_screensaver") ? 1 : 0;
+- m_configuration.bPowerOnScreensaver = GetSettingBool("cec_wake_screensaver") ? 1 : 0;
+- m_configuration.bSendInactiveSource = GetSettingBool("send_inactive_source") ? 1 : 0;
++ m_bPowerOffScreensaver = GetSettingBool("cec_standby_screensaver") ? 1 : 0;
++ m_bPowerOnScreensaver = GetSettingBool("cec_wake_screensaver") ? 1 : 0;
++ m_bSendInactiveSource = GetSettingBool("send_inactive_source") ? 1 : 0;
+
+ // read the mutually exclusive boolean settings
+ int iStandbyAction(GetSettingInt("standby_pc_on_tv_standby"));
+ m_configuration.bPowerOffOnStandby = iStandbyAction == 13011 ? 1 : 0;
+- m_configuration.bShutdownOnStandby = iStandbyAction == 13005 ? 1 : 0;
++ m_bShutdownOnStandby = iStandbyAction == 13005;
+
+ #if defined(CEC_DOUBLE_TAP_TIMEOUT_MS_OLD)
+ // double tap prevention timeout in ms. libCEC uses 50ms units for this in 2.2.0, so divide by 50
+@@ -1529,14 +1508,11 @@ bool CPeripheralCecAdapterUpdateThread::WaitReady(void)
+ void CPeripheralCecAdapterUpdateThread::UpdateMenuLanguage(void)
+ {
+ // request the menu language of the TV
+- if (m_configuration.bUseTVMenuLanguage == 1)
++ if (m_adapter->m_bUseTVMenuLanguage == 1)
+ {
+ CLog::Log(LOGDEBUG, "%s - requesting the menu language of the TV", __FUNCTION__);
+- cec_menu_language language;
+- if (m_adapter->m_cecAdapter->GetDeviceMenuLanguage(CECDEVICE_TV, &language))
+- m_adapter->SetMenuLanguage(language.language);
+- else
+- CLog::Log(LOGDEBUG, "%s - unknown menu language", __FUNCTION__);
++ std::string language(m_adapter->m_cecAdapter->GetDeviceMenuLanguage(CECDEVICE_TV));
++ m_adapter->SetMenuLanguage(language.c_str());
+ }
+ else
+ {
+@@ -1553,9 +1529,9 @@ std::string CPeripheralCecAdapterUpdateThread::UpdateAudioSystemStatus(void)
+ if (m_adapter->m_cecAdapter->IsActiveDeviceType(CEC_DEVICE_TYPE_AUDIO_SYSTEM))
+ {
+ // request the OSD name of the amp
+- cec_osd_name ampName = m_adapter->m_cecAdapter->GetDeviceOSDName(CECDEVICE_AUDIOSYSTEM);
+- CLog::Log(LOGDEBUG, "%s - CEC capable amplifier found (%s). volume will be controlled on the amp", __FUNCTION__, ampName.name);
+- strAmpName += StringUtils::Format("%s", ampName.name);
++ std::string ampName(m_adapter->m_cecAdapter->GetDeviceOSDName(CECDEVICE_AUDIOSYSTEM));
++ CLog::Log(LOGDEBUG, "%s - CEC capable amplifier found (%s). volume will be controlled on the amp", __FUNCTION__, ampName.c_str());
++ strAmpName += StringUtils::Format("%s", ampName.c_str());
+
+ // set amp present
+ m_adapter->SetAudioSystemConnected(true);
+@@ -1592,8 +1568,8 @@ bool CPeripheralCecAdapterUpdateThread::SetInitialConfiguration(void)
+
+ // request the OSD name of the TV
+ std::string strNotification;
+- cec_osd_name tvName = m_adapter->m_cecAdapter->GetDeviceOSDName(CECDEVICE_TV);
+- strNotification = StringUtils::Format("%s: %s", g_localizeStrings.Get(36016).c_str(), tvName.name);
++ std::string tvName(m_adapter->m_cecAdapter->GetDeviceOSDName(CECDEVICE_TV));
++ strNotification = StringUtils::Format("%s: %s", g_localizeStrings.Get(36016).c_str(), tvName.c_str());
+
+ std::string strAmpName = UpdateAudioSystemStatus();
+ if (!strAmpName.empty())
+@@ -1766,7 +1742,7 @@ void CPeripheralCecAdapter::ProcessStandbyDevices(void)
+ m_standbySent = CDateTime::GetCurrentDateTime();
+ m_cecAdapter->StandbyDevices(CECDEVICE_BROADCAST);
+ }
+- else if (m_configuration.bSendInactiveSource == 1)
++ else if (m_bSendInactiveSource == 1)
+ {
+ CLog::Log(LOGDEBUG, "%s - sending inactive source commands", __FUNCTION__);
+ m_cecAdapter->SetInactiveView();
+diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.h b/xbmc/peripherals/devices/PeripheralCecAdapter.h
+index e7f769f..30b22c9 100644
+--- a/xbmc/peripherals/devices/PeripheralCecAdapter.h
++++ b/xbmc/peripherals/devices/PeripheralCecAdapter.h
+@@ -146,12 +146,12 @@ namespace PERIPHERALS
+ void SetMenuLanguage(const char *strLanguage);
+
+ // callbacks from libCEC
+- static int CecLogMessage(void *cbParam, const CEC::cec_log_message message);
+- static int CecCommand(void *cbParam, const CEC::cec_command command);
+- static int CecConfiguration(void *cbParam, const CEC::libcec_configuration config);
+- static int CecAlert(void *cbParam, const CEC::libcec_alert alert, const CEC::libcec_parameter data);
++ static void CecLogMessage(void *cbParam, const CEC::cec_log_message* message);
++ static void CecCommand(void *cbParam, const CEC::cec_command* command);
++ static void CecConfiguration(void *cbParam, const CEC::libcec_configuration* config);
++ static void CecAlert(void *cbParam, const CEC::libcec_alert alert, const CEC::libcec_parameter data);
+ static void CecSourceActivated(void *param, const CEC::cec_logical_address address, const uint8_t activated);
+- static int CecKeyPress(void *cbParam, const CEC::cec_keypress key);
++ static void CecKeyPress(void *cbParam, const CEC::cec_keypress* key);
+
+ DllLibCEC* m_dll;
+ CEC::ICECAdapter* m_cecAdapter;
+@@ -181,7 +181,12 @@ namespace PERIPHERALS
+ bool m_bActiveSourceBeforeStandby;
+ bool m_bOnPlayReceived;
+ bool m_bPlaybackPaused;
+- std::string m_strComPort;
++ std::string m_strComPort;
++ bool m_bPowerOnScreensaver;
++ bool m_bUseTVMenuLanguage;
++ bool m_bSendInactiveSource;
++ bool m_bPowerOffScreensaver;
++ bool m_bShutdownOnStandby;
+ };
+
+ class CPeripheralCecAdapterUpdateThread : public CThread
+
+From 82fe52deb8c11df31fbdf8c298b28a5e1a1491aa Mon Sep 17 00:00:00 2001
+From: Lars Op den Kamp <lars@opdenkamp.eu>
+Date: Fri, 11 Nov 2016 10:09:48 +0100
+Subject: [PATCH 2/4] [cec] Added advanced settings for action when TV goes
+ standby
+
+Added advances settings for action when TV goes standby : Pause
+playback, Stop playback, Exit Kodi
+---
+ system/peripherals.xml | 2 +-
+ xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 47 ++++++++++++++++++-----
+ xbmc/peripherals/devices/PeripheralCecAdapter.h | 1 +
+ 3 files changed, 39 insertions(+), 11 deletions(-)
+
+diff --git a/system/peripherals.xml b/system/peripherals.xml
+index 58a9d24..1fa31e1 100644
+--- a/system/peripherals.xml
++++ b/system/peripherals.xml
+@@ -16,7 +16,7 @@
+ <setting key="send_inactive_source" type="bool" value="1" label="36025" order="5" />
+ <setting key="cec_standby_screensaver" type="bool" value="0" label="36009" order="6" />
+ <setting key="cec_wake_screensaver" type="bool" value="1" label="36010" order="7" />
+- <setting key="standby_pc_on_tv_standby" type="enum" value="13011" label="36029" order="8" lvalues="36028|13005|13011" />
++ <setting key="standby_pc_on_tv_standby" type="enum" value="13011" label="36029" order="8" lvalues="36028|13005|13011|13009|36043|36045" />
+ <setting key="standby_tv_on_pc_standby" type="bool" value="1" label="36026" order="9" />
+ <setting key="use_tv_menu_language" type="bool" value="1" label="36018" order="10" />
+ <setting key="pause_playback_on_deactivate" type="bool" value="1" label="36033" configurable="0" />
+diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
+index a71dc4b..1b7c38e 100644
+--- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
++++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
+@@ -55,6 +55,10 @@ using namespace CEC;
+ #define LOCALISED_ID_TV_AVR 36039
+ #define LOCALISED_ID_STOP 36044
+ #define LOCALISED_ID_PAUSE 36045
++#define LOCALISED_ID_POWEROFF 13005
++#define LOCALISED_ID_SUSPEND 13011
++#define LOCALISED_ID_QUIT 13009
++#define LOCALISED_ID_IGNORE 36028
+
+ #define LOCALISED_ID_NONE 231
+
+@@ -619,6 +623,35 @@ void CPeripheralCecAdapter::SetMenuLanguage(const char *strLanguage)
+ CLog::Log(LOGWARNING, "%s - TV menu language set to unknown value '%s'", __FUNCTION__, strLanguage);
+ }
+
++void CPeripheralCecAdapter::OnTvStandby(void)
++{
++ int iActionOnTvStandby = GetSettingInt("standby_pc_on_tv_standby");
++ switch (iActionOnTvStandby)
++ {
++ case LOCALISED_ID_POWEROFF:
++ m_bStarted = false;
++ g_application.ExecuteXBMCAction("Shutdown");
++ break;
++ case LOCALISED_ID_SUSPEND:
++ m_bStarted = false;
++ g_application.ExecuteXBMCAction("Suspend");
++ break;
++ case LOCALISED_ID_QUIT:
++ m_bStarted = false;
++ g_application.ExecuteXBMCAction("Quit");
++ break;
++ case LOCALISED_ID_PAUSE:
++ g_application.OnAction(CAction(ACTION_PAUSE));
++ break;
++ case LOCALISED_ID_STOP:
++ g_application.StopPlaying();
++ break;
++ default:
++ CLog::Log(LOGERROR, "%s - Unexpected [standby_pc_on_tv_standby] setting value", __FUNCTION__);
++ break;
++ }
++}
++
+ void CPeripheralCecAdapter::CecCommand(void *cbParam, const cec_command* command)
+ {
+ CPeripheralCecAdapter *adapter = static_cast<CPeripheralCecAdapter *>(cbParam);
+@@ -630,16 +663,10 @@ void CPeripheralCecAdapter::CecCommand(void *cbParam, const cec_command* command
+ switch (command->opcode)
+ {
+ case CEC_OPCODE_STANDBY:
+- /* a device was put in standby mode */
+ if (command->initiator == CECDEVICE_TV &&
+- (adapter->m_configuration.bPowerOffOnStandby == 1 || adapter->m_bShutdownOnStandby) &&
+ (!adapter->m_standbySent.IsValid() || CDateTime::GetCurrentDateTime() - adapter->m_standbySent > CDateTimeSpan(0, 0, 0, SCREENSAVER_TIMEOUT)))
+ {
+- adapter->m_bStarted = false;
+- if (adapter->m_configuration.bPowerOffOnStandby == 1)
+- g_application.ExecuteXBMCAction("Suspend");
+- else if (adapter->m_bShutdownOnStandby)
+- g_application.ExecuteXBMCAction("Shutdown");
++ adapter->OnTvStandby();
+ }
+ break;
+ case CEC_OPCODE_SET_MENU_LANGUAGE:
+@@ -1360,8 +1387,8 @@ void CPeripheralCecAdapter::SetConfigurationFromSettings(void)
+
+ // read the mutually exclusive boolean settings
+ int iStandbyAction(GetSettingInt("standby_pc_on_tv_standby"));
+- m_configuration.bPowerOffOnStandby = iStandbyAction == 13011 ? 1 : 0;
+- m_bShutdownOnStandby = iStandbyAction == 13005;
++ m_configuration.bPowerOffOnStandby = iStandbyAction == LOCALISED_ID_SUSPEND ? 1 : 0;
++ m_bShutdownOnStandby = iStandbyAction == LOCALISED_ID_POWEROFF;
+
+ #if defined(CEC_DOUBLE_TAP_TIMEOUT_MS_OLD)
+ // double tap prevention timeout in ms. libCEC uses 50ms units for this in 2.2.0, so divide by 50
+@@ -1373,7 +1400,7 @@ void CPeripheralCecAdapter::SetConfigurationFromSettings(void)
+
+ if (GetSettingBool("pause_playback_on_deactivate"))
+ {
+- SetSetting("pause_or_stop_playback_on_deactivate", 36045);
++ SetSetting("pause_or_stop_playback_on_deactivate", LOCALISED_ID_PAUSE);
+ SetSetting("pause_playback_on_deactivate", false);
+ }
+ }
+diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.h b/xbmc/peripherals/devices/PeripheralCecAdapter.h
+index 30b22c9..9274eab 100644
+--- a/xbmc/peripherals/devices/PeripheralCecAdapter.h
++++ b/xbmc/peripherals/devices/PeripheralCecAdapter.h
+@@ -144,6 +144,7 @@ namespace PERIPHERALS
+
+ void SetAudioSystemConnected(bool bSetTo);
+ void SetMenuLanguage(const char *strLanguage);
++ void OnTvStandby(void);
+
+ // callbacks from libCEC
+ static void CecLogMessage(void *cbParam, const CEC::cec_log_message* message);
+
+From f0e1725617e41e841c9c24a20f1fc9b37347c8c3 Mon Sep 17 00:00:00 2001
+From: Lars Op den Kamp <lars@opdenkamp.eu>
+Date: Fri, 11 Nov 2016 10:09:56 +0100
+Subject: [PATCH 3/4] [cec] add CEC IMX adapter as known type and set no
+ polling.
+
+that eliminates extensive periodic /sys walkthrough
+
+(this is reused Lars's commit e59d7e028288464e6890141a830e4a83d4b9d065)
+---
+ xbmc/peripherals/PeripheralTypes.h | 5 +++++
+ xbmc/peripherals/bus/virtual/PeripheralBusCEC.cpp | 6 ++++++
+ 2 files changed, 11 insertions(+)
+
+diff --git a/xbmc/peripherals/PeripheralTypes.h b/xbmc/peripherals/PeripheralTypes.h
+index 34ce2ef..c87242f 100644
+--- a/xbmc/peripherals/PeripheralTypes.h
++++ b/xbmc/peripherals/PeripheralTypes.h
+@@ -38,7 +38,8 @@
+ PERIPHERAL_BUS_USB,
+ PERIPHERAL_BUS_PCI,
+ PERIPHERAL_BUS_RPI,
+- PERIPHERAL_BUS_CEC
++ PERIPHERAL_BUS_CEC,
++ PERIPHERAL_BUS_IMX
+ };
+
+ enum PeripheralFeature
+@@ -173,6 +174,8 @@ namespace PERIPHERALS
+ return "pci";
+ case PERIPHERAL_BUS_RPI:
+ return "rpi";
++ case PERIPHERAL_BUS_IMX:
++ return "imx";
+ case PERIPHERAL_BUS_CEC:
+ return "cec";
+ case PERIPHERAL_BUS_ADDON:
+@@ -197,6 +200,8 @@ namespace PERIPHERALS
+ return PERIPHERAL_BUS_PCI;
+ else if (strTypeLowerCase == "rpi")
+ return PERIPHERAL_BUS_RPI;
++ else if (strTypeLowerCase == "imx")
++ return PERIPHERAL_BUS_IMX;
+ else if (strTypeLowerCase == "cec")
+ return PERIPHERAL_BUS_CEC;
+ else if (strTypeLowerCase == "addon")
+diff --git a/xbmc/peripherals/bus/virtual/PeripheralBusCEC.cpp b/xbmc/peripherals/bus/virtual/PeripheralBusCEC.cpp
+index b04fe00..abd0a6b 100644
+--- a/xbmc/peripherals/bus/virtual/PeripheralBusCEC.cpp
++++ b/xbmc/peripherals/bus/virtual/PeripheralBusCEC.cpp
+@@ -102,6 +102,12 @@ bool CPeripheralBusCEC::PerformDeviceScan(PeripheralScanResults &results)
+ /** the Pi's adapter cannot be removed, no need to rescan */
+ m_bNeedsPolling = false;
+ break;
++#if defined(HAS_IMXVPU)
++ case ADAPTERTYPE_IMX:
++ result.m_mappedBusType = PERIPHERAL_BUS_IMX;
++ m_bNeedsPolling = false;
++ break;
++#endif
+ default:
+ break;
+ }
+
+From cfcfb4c98cf1a6d756fc3962e6d803c297917684 Mon Sep 17 00:00:00 2001
+From: Lars Op den Kamp <lars@opdenkamp.eu>
+Date: Fri, 11 Nov 2016 10:10:07 +0100
+Subject: [PATCH 4/4] [cec] added: setting to make libCEC wake up the AVR
+ explicitly when activating the source.
+
+ref: https://github.com/Pulse-Eight/libcec/issues/156
+---
+ addons/resource.language.en_gb/resources/strings.po | 7 ++++++-
+ system/peripherals.xml | 3 ++-
+ xbmc/peripherals/devices/PeripheralCecAdapter.cpp | 1 +
+ 3 files changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/system/peripherals.xml b/system/peripherals.xml
+index 1fa31e1..ed707b6 100644
+--- a/system/peripherals.xml
++++ b/system/peripherals.xml
+@@ -16,7 +16,7 @@
+ <setting key="send_inactive_source" type="bool" value="1" label="36025" order="5" />
+ <setting key="cec_standby_screensaver" type="bool" value="0" label="36009" order="6" />
+ <setting key="cec_wake_screensaver" type="bool" value="1" label="36010" order="7" />
+- <setting key="standby_pc_on_tv_standby" type="enum" value="13011" label="36029" order="8" lvalues="36028|13005|13011|13009|36043|36045" />
++ <setting key="standby_pc_on_tv_standby" type="enum" value="13011" label="36029" order="8" lvalues="36028|13005|13011|13009|36044|36046" />
+ <setting key="standby_tv_on_pc_standby" type="bool" value="1" label="36026" order="9" />
+ <setting key="use_tv_menu_language" type="bool" value="1" label="36018" order="10" />
+ <setting key="pause_playback_on_deactivate" type="bool" value="1" label="36033" configurable="0" />
+@@ -24,6 +24,7 @@
+ <setting key="connected_device" type="enum" label="36019" value="36037" lvalues="36037|36038" order="12" />
+ <setting key="cec_hdmi_port" type="int" value="1" min="1" max="15" label="36015" order="13" />
+ <setting key="physical_address" type="string" label="36021" value="0" order="14" />
++ <setting key="power_avr_on_as" type="bool" label="36045" value="0" order="15" />
+
+ <setting key="tv_vendor" type="int" value="0" configurable="0" />
+ <setting key="device_name" type="string" value="Kodi" configurable="0" />
+diff --git a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
+index 1b7c38e..d032ffd 100644
+--- a/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
++++ b/xbmc/peripherals/devices/PeripheralCecAdapter.cpp
+@@ -1384,6 +1384,7 @@ void CPeripheralCecAdapter::SetConfigurationFromSettings(void)
+ m_bPowerOffScreensaver = GetSettingBool("cec_standby_screensaver") ? 1 : 0;
+ m_bPowerOnScreensaver = GetSettingBool("cec_wake_screensaver") ? 1 : 0;
+ m_bSendInactiveSource = GetSettingBool("send_inactive_source") ? 1 : 0;
++ m_configuration.bAutoWakeAVR = GetSettingBool("power_avr_on_as") ? 1 : 0;
+
+ // read the mutually exclusive boolean settings
+ int iStandbyAction(GetSettingInt("standby_pc_on_tv_standby"));
diff --git a/abs/extra/kodi/9703.patch b/abs/extra/kodi/9703.patch
new file mode 100644
index 0000000..9c96dfa
--- /dev/null
+++ b/abs/extra/kodi/9703.patch
@@ -0,0 +1,1432 @@
+From 8f82e51563f0e1bc9b7a8adf669ad2b66e7ce3e5 Mon Sep 17 00:00:00 2001
+From: Bernd Kuhls <bernd.kuhls@t-online.de>
+Date: Thu, 28 Apr 2016 17:17:40 +0200
+Subject: [PATCH] lib/cximage-6.0: fix compilation with gcc6
+
+For a quick fix I renamed min() to cxmin() and max() to cxmax() to
+prevent the conflict with the gcc definition.
+
+Forum thread for reference:
+http://forum.kodi.tv/showthread.php?tid=263884
+---
+ lib/cximage-6.0/CxImage/ximabmp.cpp | 6 +-
+ lib/cximage-6.0/CxImage/ximadef.h | 8 +-
+ lib/cximage-6.0/CxImage/ximadsp.cpp | 182 +++++++++++++++++------------------
+ lib/cximage-6.0/CxImage/ximage.cpp | 4 +-
+ lib/cximage-6.0/CxImage/ximagif.cpp | 6 +-
+ lib/cximage-6.0/CxImage/ximahist.cpp | 12 +--
+ lib/cximage-6.0/CxImage/ximaint.cpp | 8 +-
+ lib/cximage-6.0/CxImage/ximaiter.h | 4 +-
+ lib/cximage-6.0/CxImage/ximajbg.cpp | 2 +-
+ lib/cximage-6.0/CxImage/ximapal.cpp | 14 +--
+ lib/cximage-6.0/CxImage/ximapng.cpp | 12 +--
+ lib/cximage-6.0/CxImage/ximaraw.cpp | 4 +-
+ lib/cximage-6.0/CxImage/ximasel.cpp | 50 +++++-----
+ lib/cximage-6.0/CxImage/ximath.cpp | 8 +-
+ lib/cximage-6.0/CxImage/ximatif.cpp | 6 +-
+ lib/cximage-6.0/CxImage/ximatran.cpp | 138 +++++++++++++-------------
+ lib/cximage-6.0/CxImage/ximawnd.cpp | 16 +--
+ 17 files changed, 236 insertions(+), 244 deletions(-)
+
+diff --git a/lib/cximage-6.0/CxImage/ximabmp.cpp b/lib/cximage-6.0/CxImage/ximabmp.cpp
+index 726ff91..55842b1 100644
+--- a/lib/cximage-6.0/CxImage/ximabmp.cpp
++++ b/lib/cximage-6.0/CxImage/ximabmp.cpp
+@@ -46,7 +46,7 @@ bool CxImageBMP::Encode(CxFile * hFile)
+ bihtoh(&infohdr);
+
+ // Write the file header
+- hFile->Write(&hdr,min(14,sizeof(BITMAPFILEHEADER)),1);
++ hFile->Write(&hdr,cxmin(14,sizeof(BITMAPFILEHEADER)),1);
+ hFile->Write(&infohdr,sizeof(BITMAPINFOHEADER),1);
+ //and DIB+ALPHA interlaced
+ BYTE *srcalpha = AlphaGetPointer();
+@@ -64,7 +64,7 @@ bool CxImageBMP::Encode(CxFile * hFile)
+ #endif //CXIMAGE_SUPPORT_ALPHA
+ {
+ // Write the file header
+- hFile->Write(&hdr,min(14,sizeof(BITMAPFILEHEADER)),1);
++ hFile->Write(&hdr,cxmin(14,sizeof(BITMAPFILEHEADER)),1);
+ //copy attributes
+ memcpy(pDib,&head,sizeof(BITMAPINFOHEADER));
+ bihtoh((BITMAPINFOHEADER*)pDib);
+@@ -86,7 +86,7 @@ bool CxImageBMP::Decode(CxFile * hFile)
+ BITMAPFILEHEADER bf;
+ DWORD off = hFile->Tell(); //<CSC>
+ cx_try {
+- if (hFile->Read(&bf,min(14,sizeof(bf)),1)==0) cx_throw("Not a BMP");
++ if (hFile->Read(&bf,cxmin(14,sizeof(bf)),1)==0) cx_throw("Not a BMP");
+
+ bf.bfSize = my_ntohl(bf.bfSize);
+ bf.bfOffBits = my_ntohl(bf.bfOffBits);
+diff --git a/lib/cximage-6.0/CxImage/ximadef.h b/lib/cximage-6.0/CxImage/ximadef.h
+index fe383bf..53ea452 100644
+--- a/lib/cximage-6.0/CxImage/ximadef.h
++++ b/lib/cximage-6.0/CxImage/ximadef.h
+@@ -53,12 +53,8 @@
+ #define CXIMAGE_SUPPORT_WINDOWS 0
+ #endif
+
+-#ifndef min
+-#define min(a,b) (((a)<(b))?(a):(b))
+-#endif
+-#ifndef max
+-#define max(a,b) (((a)>(b))?(a):(b))
+-#endif
++#define cxmin(a,b) (((a)<(b))?(a):(b))
++#define cxmax(a,b) (((a)>(b))?(a):(b))
+
+ #ifndef PI
+ #define PI 3.141592653589793f
+diff --git a/lib/cximage-6.0/CxImage/ximadsp.cpp b/lib/cximage-6.0/CxImage/ximadsp.cpp
+index 8425bb2..813253b 100644
+--- a/lib/cximage-6.0/CxImage/ximadsp.cpp
++++ b/lib/cximage-6.0/CxImage/ximadsp.cpp
+@@ -389,8 +389,8 @@ RGBQUAD CxImage::RGBtoHSL(RGBQUAD lRGBColor)
+ G = lRGBColor.rgbGreen;
+ B = lRGBColor.rgbBlue;
+
+- cMax = max( max(R,G), B); /* calculate lightness */
+- cMin = min( min(R,G), B);
++ cMax = cxmax( cxmax(R,G), B); /* calculate lightness */
++ cMin = cxmin( cxmin(R,G), B);
+ L = (BYTE)((((cMax+cMin)*HSLMAX)+RGBMAX)/(2*RGBMAX));
+
+ if (cMax==cMin){ /* r=g=b --> achromatic case */
+@@ -489,9 +489,9 @@ RGBQUAD CxImage::YUVtoRGB(RGBQUAD lYUVColor)
+ G = (int)( Y - 0.344f * U - 0.714f * V);
+ B = (int)( Y + 1.770f * U);
+
+- R= min(255,max(0,R));
+- G= min(255,max(0,G));
+- B= min(255,max(0,B));
++ R= cxmin(255,cxmax(0,R));
++ G= cxmin(255,cxmax(0,G));
++ B= cxmin(255,cxmax(0,B));
+ RGBQUAD rgb={(BYTE)B,(BYTE)G,(BYTE)R,0};
+ return rgb;
+ }
+@@ -510,9 +510,9 @@ RGBQUAD CxImage::RGBtoYUV(RGBQUAD lRGBColor)
+ U = (int)((B-Y) * 0.565f + 128);
+ V = (int)((R-Y) * 0.713f + 128);
+
+- Y= min(255,max(0,Y));
+- U= min(255,max(0,U));
+- V= min(255,max(0,V));
++ Y= cxmin(255,cxmax(0,Y));
++ U= cxmin(255,cxmax(0,U));
++ V= cxmin(255,cxmax(0,V));
+ RGBQUAD yuv={(BYTE)V,(BYTE)U,(BYTE)Y,0};
+ return yuv;
+ }
+@@ -528,9 +528,9 @@ RGBQUAD CxImage::YIQtoRGB(RGBQUAD lYIQColor)
+ G = (int)( Y - 0.273f * I - 0.647f * Q);
+ B = (int)( Y - 1.104f * I + 1.701f * Q);
+
+- R= min(255,max(0,R));
+- G= min(255,max(0,G));
+- B= min(255,max(0,B));
++ R= cxmin(255,cxmax(0,R));
++ G= cxmin(255,cxmax(0,G));
++ B= cxmin(255,cxmax(0,B));
+ RGBQUAD rgb={(BYTE)B,(BYTE)G,(BYTE)R,0};
+ return rgb;
+ }
+@@ -546,9 +546,9 @@ RGBQUAD CxImage::RGBtoYIQ(RGBQUAD lRGBColor)
+ I = (int)( 0.5960f * R - 0.2742f * G - 0.3219f * B + 128);
+ Q = (int)( 0.2109f * R - 0.5229f * G + 0.3120f * B + 128);
+
+- Y= min(255,max(0,Y));
+- I= min(255,max(0,I));
+- Q= min(255,max(0,Q));
++ Y= cxmin(255,cxmax(0,Y));
++ I= cxmin(255,cxmax(0,I));
++ Q= cxmin(255,cxmax(0,Q));
+ RGBQUAD yiq={(BYTE)Q,(BYTE)I,(BYTE)Y,0};
+ return yiq;
+ }
+@@ -565,9 +565,9 @@ RGBQUAD CxImage::XYZtoRGB(RGBQUAD lXYZColor)
+ G = (int)( -0.969256f * X + 1.875992f * Y + 0.041556f * Z * k);
+ B = (int)( 0.055648f * X - 0.204043f * Y + 1.057311f * Z * k);
+
+- R= min(255,max(0,R));
+- G= min(255,max(0,G));
+- B= min(255,max(0,B));
++ R= cxmin(255,cxmax(0,R));
++ G= cxmin(255,cxmax(0,G));
++ B= cxmin(255,cxmax(0,B));
+ RGBQUAD rgb={(BYTE)B,(BYTE)G,(BYTE)R,0};
+ return rgb;
+ }
+@@ -583,9 +583,9 @@ RGBQUAD CxImage::RGBtoXYZ(RGBQUAD lRGBColor)
+ Y = (int)( 0.212671f * R + 0.715160f * G + 0.072169f * B);
+ Z = (int)((0.019334f * R + 0.119193f * G + 0.950227f * B)*0.918483657f);
+
+- //X= min(255,max(0,X));
+- //Y= min(255,max(0,Y));
+- //Z= min(255,max(0,Z));
++ //X= cxmin(255,cxmax(0,X));
++ //Y= cxmin(255,cxmax(0,Y));
++ //Z= cxmin(255,cxmax(0,Z));
+ RGBQUAD xyz={(BYTE)Z,(BYTE)Y,(BYTE)X,0};
+ return xyz;
+ }
+@@ -707,7 +707,7 @@ bool CxImage::Light(long brightness, long contrast)
+
+ BYTE cTable[256]; //<nipper>
+ for (int i=0;i<256;i++) {
+- cTable[i] = (BYTE)max(0,min(255,(int)((i-128)*c + brightness + 0.5f)));
++ cTable[i] = (BYTE)cxmax(0,cxmin(255,(int)((i-128)*c + brightness + 0.5f)));
+ }
+
+ return Lut(cTable);
+@@ -830,11 +830,11 @@ bool CxImage::Filter(long* kernel, long Ksize, long Kfactor, long Koffset)
+ }
+ }
+ if (Kfactor==0 || ksumcur==0){
+- cPtr2[iY1] = (BYTE)min(255, max(0,(int)(b + Koffset)));
++ cPtr2[iY1] = (BYTE)cxmin(255, cxmax(0,(int)(b + Koffset)));
+ } else if (ksumtot == ksumcur) {
+- cPtr2[iY1] = (BYTE)min(255, max(0,(int)(b/Kfactor + Koffset)));
++ cPtr2[iY1] = (BYTE)cxmin(255, cxmax(0,(int)(b/Kfactor + Koffset)));
+ } else {
+- cPtr2[iY1] = (BYTE)min(255, max(0,(int)((b*ksumtot)/(ksumcur*Kfactor) + Koffset)));
++ cPtr2[iY1] = (BYTE)cxmin(255, cxmax(0,(int)((b*ksumtot)/(ksumcur*Kfactor) + Koffset)));
+ }
+ }
+ }
+@@ -863,17 +863,17 @@ bool CxImage::Filter(long* kernel, long Ksize, long Kfactor, long Koffset)
+ }
+ }
+ if (Kfactor==0 || ksumcur==0){
+- c.rgbRed = (BYTE)min(255, max(0,(int)(r + Koffset)));
+- c.rgbGreen = (BYTE)min(255, max(0,(int)(g + Koffset)));
+- c.rgbBlue = (BYTE)min(255, max(0,(int)(b + Koffset)));
++ c.rgbRed = (BYTE)cxmin(255, cxmax(0,(int)(r + Koffset)));
++ c.rgbGreen = (BYTE)cxmin(255, cxmax(0,(int)(g + Koffset)));
++ c.rgbBlue = (BYTE)cxmin(255, cxmax(0,(int)(b + Koffset)));
+ } else if (ksumtot == ksumcur) {
+- c.rgbRed = (BYTE)min(255, max(0,(int)(r/Kfactor + Koffset)));
+- c.rgbGreen = (BYTE)min(255, max(0,(int)(g/Kfactor + Koffset)));
+- c.rgbBlue = (BYTE)min(255, max(0,(int)(b/Kfactor + Koffset)));
++ c.rgbRed = (BYTE)cxmin(255, cxmax(0,(int)(r/Kfactor + Koffset)));
++ c.rgbGreen = (BYTE)cxmin(255, cxmax(0,(int)(g/Kfactor + Koffset)));
++ c.rgbBlue = (BYTE)cxmin(255, cxmax(0,(int)(b/Kfactor + Koffset)));
+ } else {
+- c.rgbRed = (BYTE)min(255, max(0,(int)((r*ksumtot)/(ksumcur*Kfactor) + Koffset)));
+- c.rgbGreen = (BYTE)min(255, max(0,(int)((g*ksumtot)/(ksumcur*Kfactor) + Koffset)));
+- c.rgbBlue = (BYTE)min(255, max(0,(int)((b*ksumtot)/(ksumcur*Kfactor) + Koffset)));
++ c.rgbRed = (BYTE)cxmin(255, cxmax(0,(int)((r*ksumtot)/(ksumcur*Kfactor) + Koffset)));
++ c.rgbGreen = (BYTE)cxmin(255, cxmax(0,(int)((g*ksumtot)/(ksumcur*Kfactor) + Koffset)));
++ c.rgbBlue = (BYTE)cxmin(255, cxmax(0,(int)((b*ksumtot)/(ksumcur*Kfactor) + Koffset)));
+ }
+ tmp.BlindSetPixelColor(x,y,c);
+ }
+@@ -1078,8 +1078,8 @@ bool CxImage::Edge(long Ksize)
+ //
+ void CxImage::Mix(CxImage & imgsrc2, ImageOpType op, long lXOffset, long lYOffset, bool bMixAlpha)
+ {
+- long lWide = min(GetWidth(),imgsrc2.GetWidth()-lXOffset);
+- long lHeight = min(GetHeight(),imgsrc2.GetHeight()-lYOffset);
++ long lWide = cxmin(GetWidth(),imgsrc2.GetWidth()-lXOffset);
++ long lHeight = cxmin(GetHeight(),imgsrc2.GetHeight()-lYOffset);
+
+ bool bEditAlpha = imgsrc2.AlphaIsValid() & bMixAlpha;
+
+@@ -1112,16 +1112,16 @@ void CxImage::Mix(CxImage & imgsrc2, ImageOpType op, long lXOffset, long lYOffse
+ if (bEditAlpha) rgbDest.rgbReserved = (BYTE)((rgb1.rgbReserved+rgb2.rgbReserved)/2);
+ break;
+ case OpAdd:
+- rgbDest.rgbBlue = (BYTE)max(0,min(255,rgb1.rgbBlue+rgb2.rgbBlue));
+- rgbDest.rgbGreen = (BYTE)max(0,min(255,rgb1.rgbGreen+rgb2.rgbGreen));
+- rgbDest.rgbRed = (BYTE)max(0,min(255,rgb1.rgbRed+rgb2.rgbRed));
+- if (bEditAlpha) rgbDest.rgbReserved = (BYTE)max(0,min(255,rgb1.rgbReserved+rgb2.rgbReserved));
++ rgbDest.rgbBlue = (BYTE)cxmax(0,cxmin(255,rgb1.rgbBlue+rgb2.rgbBlue));
++ rgbDest.rgbGreen = (BYTE)cxmax(0,cxmin(255,rgb1.rgbGreen+rgb2.rgbGreen));
++ rgbDest.rgbRed = (BYTE)cxmax(0,cxmin(255,rgb1.rgbRed+rgb2.rgbRed));
++ if (bEditAlpha) rgbDest.rgbReserved = (BYTE)cxmax(0,cxmin(255,rgb1.rgbReserved+rgb2.rgbReserved));
+ break;
+ case OpSub:
+- rgbDest.rgbBlue = (BYTE)max(0,min(255,rgb1.rgbBlue-rgb2.rgbBlue));
+- rgbDest.rgbGreen = (BYTE)max(0,min(255,rgb1.rgbGreen-rgb2.rgbGreen));
+- rgbDest.rgbRed = (BYTE)max(0,min(255,rgb1.rgbRed-rgb2.rgbRed));
+- if (bEditAlpha) rgbDest.rgbReserved = (BYTE)max(0,min(255,rgb1.rgbReserved-rgb2.rgbReserved));
++ rgbDest.rgbBlue = (BYTE)cxmax(0,cxmin(255,rgb1.rgbBlue-rgb2.rgbBlue));
++ rgbDest.rgbGreen = (BYTE)cxmax(0,cxmin(255,rgb1.rgbGreen-rgb2.rgbGreen));
++ rgbDest.rgbRed = (BYTE)cxmax(0,cxmin(255,rgb1.rgbRed-rgb2.rgbRed));
++ if (bEditAlpha) rgbDest.rgbReserved = (BYTE)cxmax(0,cxmin(255,rgb1.rgbReserved-rgb2.rgbReserved));
+ break;
+ case OpAnd:
+ rgbDest.rgbBlue = (BYTE)(rgb1.rgbBlue&rgb2.rgbBlue);
+@@ -1202,11 +1202,11 @@ void CxImage::Mix(CxImage & imgsrc2, ImageOpType op, long lXOffset, long lYOffse
+ double dSmallAmt = dSmall*((double)rgb2.rgbBlue);
+
+ if( lAverage < lThresh+1){
+- rgbDest.rgbBlue = (BYTE)max(0,min(255,(int)(dLarge*((double)rgb1.rgbBlue) +
++ rgbDest.rgbBlue = (BYTE)cxmax(0,cxmin(255,(int)(dLarge*((double)rgb1.rgbBlue) +
+ dSmallAmt)));
+- rgbDest.rgbGreen = (BYTE)max(0,min(255,(int)(dLarge*((double)rgb1.rgbGreen) +
++ rgbDest.rgbGreen = (BYTE)cxmax(0,cxmin(255,(int)(dLarge*((double)rgb1.rgbGreen) +
+ dSmallAmt)));
+- rgbDest.rgbRed = (BYTE)max(0,min(255,(int)(dLarge*((double)rgb1.rgbRed) +
++ rgbDest.rgbRed = (BYTE)cxmax(0,cxmin(255,(int)(dLarge*((double)rgb1.rgbRed) +
+ dSmallAmt)));
+ }
+ else
+@@ -1274,9 +1274,9 @@ bool CxImage::ShiftRGB(long r, long g, long b)
+ #endif //CXIMAGE_SUPPORT_SELECTION
+ {
+ color = BlindGetPixelColor(x,y);
+- color.rgbRed = (BYTE)max(0,min(255,(int)(color.rgbRed + r)));
+- color.rgbGreen = (BYTE)max(0,min(255,(int)(color.rgbGreen + g)));
+- color.rgbBlue = (BYTE)max(0,min(255,(int)(color.rgbBlue + b)));
++ color.rgbRed = (BYTE)cxmax(0,cxmin(255,(int)(color.rgbRed + r)));
++ color.rgbGreen = (BYTE)cxmax(0,cxmin(255,(int)(color.rgbGreen + g)));
++ color.rgbBlue = (BYTE)cxmax(0,cxmin(255,(int)(color.rgbBlue + b)));
+ BlindSetPixelColor(x,y,color);
+ }
+ }
+@@ -1284,9 +1284,9 @@ bool CxImage::ShiftRGB(long r, long g, long b)
+ } else {
+ for(DWORD j=0; j<head.biClrUsed; j++){
+ color = GetPaletteColor((BYTE)j);
+- color.rgbRed = (BYTE)max(0,min(255,(int)(color.rgbRed + r)));
+- color.rgbGreen = (BYTE)max(0,min(255,(int)(color.rgbGreen + g)));
+- color.rgbBlue = (BYTE)max(0,min(255,(int)(color.rgbBlue + b)));
++ color.rgbRed = (BYTE)cxmax(0,cxmin(255,(int)(color.rgbRed + r)));
++ color.rgbGreen = (BYTE)cxmax(0,cxmin(255,(int)(color.rgbGreen + g)));
++ color.rgbBlue = (BYTE)cxmax(0,cxmin(255,(int)(color.rgbBlue + b)));
+ SetPaletteColor((BYTE)j,color);
+ }
+ }
+@@ -1310,7 +1310,7 @@ bool CxImage::Gamma(float gamma)
+
+ BYTE cTable[256]; //<nipper>
+ for (int i=0;i<256;i++) {
+- cTable[i] = (BYTE)max(0,min(255,(int)( pow((double)i, dinvgamma) / dMax)));
++ cTable[i] = (BYTE)cxmax(0,cxmin(255,(int)( pow((double)i, dinvgamma) / dMax)));
+ }
+
+ return Lut(cTable);
+@@ -1337,21 +1337,21 @@ bool CxImage::GammaRGB(float gammaR, float gammaG, float gammaB)
+ dMax = pow(255.0, dinvgamma) / 255.0;
+ BYTE cTableR[256];
+ for (i=0;i<256;i++) {
+- cTableR[i] = (BYTE)max(0,min(255,(int)( pow((double)i, dinvgamma) / dMax)));
++ cTableR[i] = (BYTE)cxmax(0,cxmin(255,(int)( pow((double)i, dinvgamma) / dMax)));
+ }
+
+ dinvgamma = 1/gammaG;
+ dMax = pow(255.0, dinvgamma) / 255.0;
+ BYTE cTableG[256];
+ for (i=0;i<256;i++) {
+- cTableG[i] = (BYTE)max(0,min(255,(int)( pow((double)i, dinvgamma) / dMax)));
++ cTableG[i] = (BYTE)cxmax(0,cxmin(255,(int)( pow((double)i, dinvgamma) / dMax)));
+ }
+
+ dinvgamma = 1/gammaB;
+ dMax = pow(255.0, dinvgamma) / 255.0;
+ BYTE cTableB[256];
+ for (i=0;i<256;i++) {
+- cTableB[i] = (BYTE)max(0,min(255,(int)( pow((double)i, dinvgamma) / dMax)));
++ cTableB[i] = (BYTE)cxmax(0,cxmin(255,(int)( pow((double)i, dinvgamma) / dMax)));
+ }
+
+ return Lut(cTableR, cTableG, cTableB);
+@@ -1442,11 +1442,11 @@ bool CxImage::Noise(long level)
+ {
+ color = BlindGetPixelColor(x,y);
+ n=(long)((rand()/(float)RAND_MAX - 0.5)*level);
+- color.rgbRed = (BYTE)max(0,min(255,(int)(color.rgbRed + n)));
++ color.rgbRed = (BYTE)cxmax(0,cxmin(255,(int)(color.rgbRed + n)));
+ n=(long)((rand()/(float)RAND_MAX - 0.5)*level);
+- color.rgbGreen = (BYTE)max(0,min(255,(int)(color.rgbGreen + n)));
++ color.rgbGreen = (BYTE)cxmax(0,cxmin(255,(int)(color.rgbGreen + n)));
+ n=(long)((rand()/(float)RAND_MAX - 0.5)*level);
+- color.rgbBlue = (BYTE)max(0,min(255,(int)(color.rgbBlue + n)));
++ color.rgbBlue = (BYTE)cxmax(0,cxmin(255,(int)(color.rgbBlue + n)));
+ BlindSetPixelColor(x,y,color);
+ }
+ }
+@@ -1561,8 +1561,8 @@ bool CxImage::FFT2(CxImage* srcReal, CxImage* srcImag, CxImage* dstReal, CxImage
+
+ //DFT buffers
+ double *real2,*imag2;
+- real2 = (double*)malloc(max(w,h) * sizeof(double));
+- imag2 = (double*)malloc(max(w,h) * sizeof(double));
++ real2 = (double*)malloc(cxmax(w,h) * sizeof(double));
++ imag2 = (double*)malloc(cxmax(w,h) * sizeof(double));
+
+ /* Transform the rows */
+ real = (double *)malloc(w * sizeof(double));
+@@ -1617,7 +1617,7 @@ bool CxImage::FFT2(CxImage* srcReal, CxImage* srcImag, CxImage* dstReal, CxImage
+
+ /* converting from double to byte, there is a HUGE loss in the dynamics
+ "nn" tries to keep an acceptable SNR, but 8bit=48dB: don't ask more */
+- double nn=pow((double)2,(double)log((double)max(w,h))/(double)log((double)2)-4);
++ double nn=pow((double)2,(double)log((double)cxmax(w,h))/(double)log((double)2)-4);
+ //reversed gain for reversed transform
+ if (direction==-1) nn=1/nn;
+ //bMagnitude : just to see it on the screen
+@@ -1626,15 +1626,15 @@ bool CxImage::FFT2(CxImage* srcReal, CxImage* srcImag, CxImage* dstReal, CxImage
+ for (j=0;j<h;j++) {
+ for (k=0;k<w;k++) {
+ if (bMagnitude){
+- tmpReal->SetPixelIndex(k,j,(BYTE)max(0,min(255,(nn*(3+log(_cabs(grid[k][j])))))));
++ tmpReal->SetPixelIndex(k,j,(BYTE)cxmax(0,cxmin(255,(nn*(3+log(_cabs(grid[k][j])))))));
+ if (grid[k][j].x==0){
+- tmpImag->SetPixelIndex(k,j,(BYTE)max(0,min(255,(128+(atan(grid[k][j].y/0.0000000001)*nn)))));
++ tmpImag->SetPixelIndex(k,j,(BYTE)cxmax(0,cxmin(255,(128+(atan(grid[k][j].y/0.0000000001)*nn)))));
+ } else {
+- tmpImag->SetPixelIndex(k,j,(BYTE)max(0,min(255,(128+(atan(grid[k][j].y/grid[k][j].x)*nn)))));
++ tmpImag->SetPixelIndex(k,j,(BYTE)cxmax(0,cxmin(255,(128+(atan(grid[k][j].y/grid[k][j].x)*nn)))));
+ }
+ } else {
+- tmpReal->SetPixelIndex(k,j,(BYTE)max(0,min(255,(128 + grid[k][j].x*nn))));
+- tmpImag->SetPixelIndex(k,j,(BYTE)max(0,min(255,(128 + grid[k][j].y*nn))));
++ tmpReal->SetPixelIndex(k,j,(BYTE)cxmax(0,cxmin(255,(128 + grid[k][j].x*nn))));
++ tmpImag->SetPixelIndex(k,j,(BYTE)cxmax(0,cxmin(255,(128 + grid[k][j].y*nn))));
+ }
+ }
+ }
+@@ -1922,7 +1922,7 @@ bool CxImage::RepairChannel(CxImage *ch, float radius)
+
+ correction = ((1.0+iy*iy)*ixx - ix*iy*ixy + (1.0+ix*ix)*iyy)/(1.0+ix*ix+iy*iy);
+
+- tmp.BlindSetPixelIndex(x,y,(BYTE)min(255,max(0,(xy0 + radius * correction + 0.5))));
++ tmp.BlindSetPixelIndex(x,y,(BYTE)cxmin(255,cxmax(0,(xy0 + radius * correction + 0.5))));
+ }
+ }
+
+@@ -1943,7 +1943,7 @@ bool CxImage::RepairChannel(CxImage *ch, float radius)
+
+ correction = ((1.0+iy*iy)*ixx - ix*iy*ixy + (1.0+ix*ix)*iyy)/(1.0+ix*ix+iy*iy);
+
+- tmp.BlindSetPixelIndex(x,y,(BYTE)min(255,max(0,(xy0 + radius * correction + 0.5))));
++ tmp.BlindSetPixelIndex(x,y,(BYTE)cxmin(255,cxmax(0,(xy0 + radius * correction + 0.5))));
+ }
+ }
+ for (x=0;x<=w;x+=w){
+@@ -1963,7 +1963,7 @@ bool CxImage::RepairChannel(CxImage *ch, float radius)
+
+ correction = ((1.0+iy*iy)*ixx - ix*iy*ixy + (1.0+ix*ix)*iyy)/(1.0+ix*ix+iy*iy);
+
+- tmp.BlindSetPixelIndex(x,y,(BYTE)min(255,max(0,(xy0 + radius * correction + 0.5))));
++ tmp.BlindSetPixelIndex(x,y,(BYTE)cxmin(255,cxmax(0,(xy0 + radius * correction + 0.5))));
+ }
+ }
+
+@@ -2621,8 +2621,8 @@ bool CxImage::SelectiveBlur(float radius, BYTE threshold, CxImage* iDst)
+ }
+
+ //build the difference mask
+- BYTE thresh_dw = (BYTE)max( 0 ,(int)(128 - threshold));
+- BYTE thresh_up = (BYTE)min(255,(int)(128 + threshold));
++ BYTE thresh_dw = (BYTE)cxmax( 0 ,(int)(128 - threshold));
++ BYTE thresh_up = (BYTE)cxmin(255,(int)(128 + threshold));
+ long kernel[]={-100,-100,-100,-100,801,-100,-100,-100,-100};
+ if (!Tmp.Filter(kernel,3,800,128)){
+ delete [] pPalette;
+@@ -2755,7 +2755,7 @@ bool CxImage::UnsharpMask(float radius /*= 5.0*/, float amount /*= 0.5*/, int th
+ if (abs(diff) < threshold){
+ dest_row[z] = cur_row[z];
+ } else {
+- dest_row[z] = (BYTE)min(255, max(0,(int)(cur_row[z] + amount * diff)));
++ dest_row[z] = (BYTE)cxmin(255, cxmax(0,(int)(cur_row[z] + amount * diff)));
+ }
+ }
+ }
+@@ -2952,7 +2952,7 @@ bool CxImage::RedEyeRemove(float strength)
+ float a = 1.0f-5.0f*((float)((x-0.5f*(xmax+xmin))*(x-0.5f*(xmax+xmin))+(y-0.5f*(ymax+ymin))*(y-0.5f*(ymax+ymin))))/((float)((xmax-xmin)*(ymax-ymin)));
+ if (a<0) a=0;
+ color = BlindGetPixelColor(x,y);
+- color.rgbRed = (BYTE)(a*min(color.rgbGreen,color.rgbBlue)+(1.0f-a)*color.rgbRed);
++ color.rgbRed = (BYTE)(a*cxmin(color.rgbGreen,color.rgbBlue)+(1.0f-a)*color.rgbRed);
+ BlindSetPixelColor(x,y,color);
+ }
+ }
+@@ -2990,7 +2990,7 @@ bool CxImage::Saturate(const long saturation, const long colorspace)
+ case 1:
+ {
+ for (int i=0;i<256;i++) {
+- cTable[i] = (BYTE)max(0,min(255,(int)(i + saturation)));
++ cTable[i] = (BYTE)cxmax(0,cxmin(255,(int)(i + saturation)));
+ }
+ for(long y=ymin; y<ymax; y++){
+ info.nProgress = (long)(100*(y-ymin)/(ymax-ymin));
+@@ -3012,7 +3012,7 @@ bool CxImage::Saturate(const long saturation, const long colorspace)
+ case 2:
+ {
+ for (int i=0;i<256;i++) {
+- cTable[i] = (BYTE)max(0,min(255,(int)((i-128)*(100 + saturation)/100.0f + 128.5f)));
++ cTable[i] = (BYTE)cxmax(0,cxmin(255,(int)((i-128)*(100 + saturation)/100.0f + 128.5f)));
+ }
+ for(long y=ymin; y<ymax; y++){
+ info.nProgress = (long)(100*(y-ymin)/(ymax-ymin));
+@@ -3242,10 +3242,10 @@ int CxImage::OptimalThreshold(long method, RECT * pBox, CxImage* pContrastMask)
+
+ long xmin,xmax,ymin,ymax;
+ if (pBox){
+- xmin = max(pBox->left,0);
+- xmax = min(pBox->right,head.biWidth);
+- ymin = max(pBox->bottom,0);
+- ymax = min(pBox->top,head.biHeight);
++ xmin = cxmax(pBox->left,0);
++ xmax = cxmin(pBox->right,head.biWidth);
++ ymin = cxmax(pBox->bottom,0);
++ ymax = cxmin(pBox->top,head.biHeight);
+ } else {
+ xmin = ymin = 0;
+ xmax = head.biWidth; ymax=head.biHeight;
+@@ -3463,7 +3463,7 @@ bool CxImage::AdaptiveThreshold(long method, long nBoxSize, CxImage* pContrastMa
+ r.top = r.bottom + nBoxSize;
+ int threshold = OptimalThreshold(method, &r, pContrastMask);
+ if (threshold <0) return false;
+- mask.SetPixelIndex(x,y,(BYTE)max(0,min(255,nBias+((1.0f-fGlobalLocalBalance)*threshold + fGlobalLocalBalance*globalthreshold))));
++ mask.SetPixelIndex(x,y,(BYTE)cxmax(0,cxmin(255,nBias+((1.0f-fGlobalLocalBalance)*threshold + fGlobalLocalBalance*globalthreshold))));
+ }
+ }
+
+@@ -3490,10 +3490,6 @@ bool CxImage::AdaptiveThreshold(long method, long nBoxSize, CxImage* pContrastMa
+ * Note: nOpacity=0 && bSelectFilledArea=true act as a "magic wand"
+ * \return true if everything is ok
+ */
+-#if defined(XBMC) && !defined(_WIN32)
+-int max(int a, int b) { return a > b ? a : b; }
+-int min(int a, int b) { return a < b ? a : b; }
+-#endif
+
+ bool CxImage::FloodFill(const long xStart, const long yStart, const RGBQUAD cFillColor, const BYTE nTolerance,
+ BYTE nOpacity, const bool bSelectFilledArea, const BYTE nSelectionLevel)
+@@ -3538,8 +3534,8 @@ bool CxImage::FloodFill(const long xStart, const long yStart, const RGBQUAD cFil
+ if (IsIndexed()){ //--- Generic indexed image, no tolerance OR Grayscale image with tolerance
+ BYTE idxRef = GetPixelIndex(xStart,yStart);
+ BYTE idxFill = GetNearestIndex(cFillColor);
+- BYTE idxMin = (BYTE)min(255, max(0,(int)(idxRef - nTolerance)));
+- BYTE idxMax = (BYTE)min(255, max(0,(int)(idxRef + nTolerance)));
++ BYTE idxMin = (BYTE)cxmin(255, cxmax(0,(int)(idxRef - nTolerance)));
++ BYTE idxMax = (BYTE)cxmin(255, cxmax(0,(int)(idxRef + nTolerance)));
+
+ while(!q.empty())
+ {
+@@ -3575,12 +3571,12 @@ bool CxImage::FloodFill(const long xStart, const long yStart, const RGBQUAD cFil
+ } else { //--- RGB image
+ RGBQUAD cRef = GetPixelColor(xStart,yStart);
+ RGBQUAD cRefMin, cRefMax;
+- cRefMin.rgbRed = (BYTE)min(255, max(0,(int)(cRef.rgbRed - nTolerance)));
+- cRefMin.rgbGreen = (BYTE)min(255, max(0,(int)(cRef.rgbGreen - nTolerance)));
+- cRefMin.rgbBlue = (BYTE)min(255, max(0,(int)(cRef.rgbBlue - nTolerance)));
+- cRefMax.rgbRed = (BYTE)min(255, max(0,(int)(cRef.rgbRed + nTolerance)));
+- cRefMax.rgbGreen = (BYTE)min(255, max(0,(int)(cRef.rgbGreen + nTolerance)));
+- cRefMax.rgbBlue = (BYTE)min(255, max(0,(int)(cRef.rgbBlue + nTolerance)));
++ cRefMin.rgbRed = (BYTE)cxmin(255, cxmax(0,(int)(cRef.rgbRed - nTolerance)));
++ cRefMin.rgbGreen = (BYTE)cxmin(255, cxmax(0,(int)(cRef.rgbGreen - nTolerance)));
++ cRefMin.rgbBlue = (BYTE)cxmin(255, cxmax(0,(int)(cRef.rgbBlue - nTolerance)));
++ cRefMax.rgbRed = (BYTE)cxmin(255, cxmax(0,(int)(cRef.rgbRed + nTolerance)));
++ cRefMax.rgbGreen = (BYTE)cxmin(255, cxmax(0,(int)(cRef.rgbGreen + nTolerance)));
++ cRefMax.rgbBlue = (BYTE)cxmin(255, cxmax(0,(int)(cRef.rgbBlue + nTolerance)));
+
+ while(!q.empty())
+ {
+diff --git a/lib/cximage-6.0/CxImage/ximage.cpp b/lib/cximage-6.0/CxImage/ximage.cpp
+index e81d3c6..26c6993 100644
+--- a/lib/cximage-6.0/CxImage/ximage.cpp
++++ b/lib/cximage-6.0/CxImage/ximage.cpp
+@@ -460,7 +460,7 @@ bool CxImage::CreateFromArray(BYTE* pArray,DWORD dwWidth,DWORD dwHeight,DWORD dw
+ src+=4;
+ }
+ } else {
+- memcpy(dst,src,min(info.dwEffWidth,dwBytesperline));
++ memcpy(dst,src,cxmin(info.dwEffWidth,dwBytesperline));
+ }
+ }
+ return true;
+@@ -500,7 +500,7 @@ bool CxImage::CreateFromMatrix(BYTE** ppMatrix,DWORD dwWidth,DWORD dwHeight,DWOR
+ src+=4;
+ }
+ } else {
+- memcpy(dst,src,min(info.dwEffWidth,dwBytesperline));
++ memcpy(dst,src,cxmin(info.dwEffWidth,dwBytesperline));
+ }
+ }
+ }
+diff --git a/lib/cximage-6.0/CxImage/ximagif.cpp b/lib/cximage-6.0/CxImage/ximagif.cpp
+index b89e061..64b1ccc 100644
+--- a/lib/cximage-6.0/CxImage/ximagif.cpp
++++ b/lib/cximage-6.0/CxImage/ximagif.cpp
+@@ -478,7 +478,7 @@ bool CxImageGIF::Encode(CxFile * fp, CxImage ** pImages, int pagecount, bool bLo
+ ghost.EncodeHeader(fp);
+
+ if (m_loops!=1){
+- ghost.SetLoops(max(0,m_loops-1));
++ ghost.SetLoops(cxmax(0,m_loops-1));
+ ghost.EncodeLoopExtension(fp);
+ }
+
+@@ -1340,10 +1340,10 @@ void CxImageGIF::GetComment(char* sz_comment_out)
+ ////////////////////////////////////////////////////////////////////////////////
+ void CxImageGIF::GifMix(CxImage & imgsrc2, struct_image & imgdesc)
+ {
+- long ymin = max(0,(long)(GetHeight()-imgdesc.t - imgdesc.h));
++ long ymin = cxmax(0,(long)(GetHeight()-imgdesc.t - imgdesc.h));
+ long ymax = GetHeight()-imgdesc.t;
+ long xmin = imgdesc.l;
+- long xmax = min(GetWidth(), (DWORD)(imgdesc.l + imgdesc.w));
++ long xmax = cxmin(GetWidth(), (DWORD)(imgdesc.l + imgdesc.w));
+
+ long ibg2= imgsrc2.GetTransIndex();
+ BYTE i2;
+diff --git a/lib/cximage-6.0/CxImage/ximahist.cpp b/lib/cximage-6.0/CxImage/ximahist.cpp
+index a2aed03..5391107 100644
+--- a/lib/cximage-6.0/CxImage/ximahist.cpp
++++ b/lib/cximage-6.0/CxImage/ximahist.cpp
+@@ -110,7 +110,7 @@ bool CxImage::HistogramStretch(long method, double threshold)
+ // calculate LUT
+ BYTE lut[256];
+ for (x = 0; x <256; x++){
+- lut[x] = (BYTE)max(0,min(255,(255 * (x - minc) / (maxc - minc))));
++ lut[x] = (BYTE)cxmax(0,cxmin(255,(255 * (x - minc) / (maxc - minc))));
+ }
+
+ for (y=0; y<head.biHeight; y++) {
+@@ -152,7 +152,7 @@ bool CxImage::HistogramStretch(long method, double threshold)
+ // calculate LUT
+ BYTE lut[256];
+ for (x = 0; x <256; x++){
+- lut[x] = (BYTE)max(0,min(255,(255 * (x - minc) / (maxc - minc))));
++ lut[x] = (BYTE)cxmax(0,cxmin(255,(255 * (x - minc) / (maxc - minc))));
+ }
+
+ // normalize image
+@@ -225,7 +225,7 @@ bool CxImage::HistogramStretch(long method, double threshold)
+ BYTE range = maxR - minR;
+ if (range != 0) {
+ for (x = 0; x <256; x++){
+- lutR[x] = (BYTE)max(0,min(255,(255 * (x - minR) / range)));
++ lutR[x] = (BYTE)cxmax(0,cxmin(255,(255 * (x - minR) / range)));
+ }
+ } else lutR[minR] = minR;
+
+@@ -233,7 +233,7 @@ bool CxImage::HistogramStretch(long method, double threshold)
+ range = maxG - minG;
+ if (range != 0) {
+ for (x = 0; x <256; x++){
+- lutG[x] = (BYTE)max(0,min(255,(255 * (x - minG) / range)));
++ lutG[x] = (BYTE)cxmax(0,cxmin(255,(255 * (x - minG) / range)));
+ }
+ } else lutG[minG] = minG;
+
+@@ -241,7 +241,7 @@ bool CxImage::HistogramStretch(long method, double threshold)
+ range = maxB - minB;
+ if (range != 0) {
+ for (x = 0; x <256; x++){
+- lutB[x] = (BYTE)max(0,min(255,(255 * (x - minB) / range)));
++ lutB[x] = (BYTE)cxmax(0,cxmin(255,(255 * (x - minB) / range)));
+ }
+ } else lutB[minB] = minB;
+
+@@ -292,7 +292,7 @@ bool CxImage::HistogramStretch(long method, double threshold)
+ // calculate LUT
+ BYTE lut[256];
+ for (x = 0; x <256; x++){
+- lut[x] = (BYTE)max(0,min(255,(255 * (x - minc) / (maxc - minc))));
++ lut[x] = (BYTE)cxmax(0,cxmin(255,(255 * (x - minc) / (maxc - minc))));
+ }
+
+ for(y=0; y<head.biHeight; y++){
+diff --git a/lib/cximage-6.0/CxImage/ximaint.cpp b/lib/cximage-6.0/CxImage/ximaint.cpp
+index 989d76c..5d49213 100644
+--- a/lib/cximage-6.0/CxImage/ximaint.cpp
++++ b/lib/cximage-6.0/CxImage/ximaint.cpp
+@@ -26,8 +26,8 @@ void CxImage::OverflowCoordinates(long &x, long &y, OverflowMethod const ofMetho
+ switch (ofMethod) {
+ case OM_REPEAT:
+ //clip coordinates
+- x=max(x,0); x=min(x, head.biWidth-1);
+- y=max(y,0); y=min(y, head.biHeight-1);
++ x=cxmax(x,0); x=cxmin(x, head.biWidth-1);
++ y=cxmax(y,0); y=cxmin(y, head.biHeight-1);
+ break;
+ case OM_WRAP:
+ //wrap coordinates
+@@ -59,8 +59,8 @@ void CxImage::OverflowCoordinates(float &x, float &y, OverflowMethod const ofMet
+ switch (ofMethod) {
+ case OM_REPEAT:
+ //clip coordinates
+- x=max(x,0); x=min(x, head.biWidth-1);
+- y=max(y,0); y=min(y, head.biHeight-1);
++ x=cxmax(x,0); x=cxmin(x, head.biWidth-1);
++ y=cxmax(y,0); y=cxmin(y, head.biHeight-1);
+ break;
+ case OM_WRAP:
+ //wrap coordinates
+diff --git a/lib/cximage-6.0/CxImage/ximaiter.h b/lib/cximage-6.0/CxImage/ximaiter.h
+index 9788919..01a720b 100644
+--- a/lib/cximage-6.0/CxImage/ximaiter.h
++++ b/lib/cximage-6.0/CxImage/ximaiter.h
+@@ -140,7 +140,7 @@ inline void CImageIterator::SetY(int y)
+ inline void CImageIterator::SetRow(BYTE *buf, int n)
+ {
+ if (n<0) n = (int)ima->GetEffWidth();
+- else n = min(n,(int)ima->GetEffWidth());
++ else n = cxmin(n,(int)ima->GetEffWidth());
+
+ if ((IterImage!=NULL)&&(buf!=NULL)&&(n>0)) memcpy(IterImage,buf,n);
+ }
+@@ -148,7 +148,7 @@ inline void CImageIterator::SetRow(BYTE *buf, int n)
+ inline void CImageIterator::GetRow(BYTE *buf, int n)
+ {
+ if ((IterImage!=NULL)&&(buf!=NULL)&&(n>0))
+- memcpy(buf,IterImage,min(n,(int)ima->GetEffWidth()));
++ memcpy(buf,IterImage,cxmin(n,(int)ima->GetEffWidth()));
+ }
+ /////////////////////////////////////////////////////////////////////
+ inline BYTE* CImageIterator::GetRow()
+diff --git a/lib/cximage-6.0/CxImage/ximajbg.cpp b/lib/cximage-6.0/CxImage/ximajbg.cpp
+index 06fb9bf..8a01e28 100644
+--- a/lib/cximage-6.0/CxImage/ximajbg.cpp
++++ b/lib/cximage-6.0/CxImage/ximajbg.cpp
+@@ -145,7 +145,7 @@ bool CxImageJBG::Encode(CxFile * hFile)
+ jbg_enc_init(&jbig_state, w, h, planes, &buffer, jbig_data_out, hFile);
+
+ //jbg_enc_layers(&jbig_state, 2);
+- //jbg_enc_lrlmax(&jbig_state, 800, 600);
++ //jbg_enc_lrlcxmax(&jbig_state, 800, 600);
+
+ // Specify a few other options (each is ignored if negative)
+ int dl = -1, dh = -1, d = -1, l0 = -1, mx = -1;
+diff --git a/lib/cximage-6.0/CxImage/ximapal.cpp b/lib/cximage-6.0/CxImage/ximapal.cpp
+index b3bd3da..3788c98 100644
+--- a/lib/cximage-6.0/CxImage/ximapal.cpp
++++ b/lib/cximage-6.0/CxImage/ximapal.cpp
+@@ -398,8 +398,8 @@ void CxImage::RGBtoBGR(BYTE *buffer, int length)
+ {
+ if (buffer && (head.biClrUsed==0)){
+ BYTE temp;
+- length = min(length,(int)info.dwEffWidth);
+- length = min(length,(int)(3*head.biWidth));
++ length = cxmin(length,(int)info.dwEffWidth);
++ length = cxmin(length,(int)(3*head.biWidth));
+ for (int i=0;i<length;i+=3){
+ temp = buffer[i]; buffer[i] = buffer[i+2]; buffer[i+2] = temp;
+ }
+@@ -444,7 +444,7 @@ void CxImage::SetPalette(DWORD n, BYTE *r, BYTE *g, BYTE *b)
+ if (!g) g = r;
+ if (!b) b = g;
+ RGBQUAD* ppal=GetPalette();
+- DWORD m=min(n,head.biClrUsed);
++ DWORD m=cxmin(n,head.biClrUsed);
+ for (DWORD i=0; i<m;i++){
+ ppal[i].rgbRed=r[i];
+ ppal[i].rgbGreen=g[i];
+@@ -457,7 +457,7 @@ void CxImage::SetPalette(rgb_color *rgb,DWORD nColors)
+ {
+ if ((!rgb)||(pDib==NULL)||(head.biClrUsed==0)) return;
+ RGBQUAD* ppal=GetPalette();
+- DWORD m=min(nColors,head.biClrUsed);
++ DWORD m=cxmin(nColors,head.biClrUsed);
+ for (DWORD i=0; i<m;i++){
+ ppal[i].rgbRed=rgb[i].r;
+ ppal[i].rgbGreen=rgb[i].g;
+@@ -469,7 +469,7 @@ void CxImage::SetPalette(rgb_color *rgb,DWORD nColors)
+ void CxImage::SetPalette(RGBQUAD* pPal,DWORD nColors)
+ {
+ if ((pPal==NULL)||(pDib==NULL)||(head.biClrUsed==0)) return;
+- memcpy(GetPalette(),pPal,min(GetPaletteSize(),nColors*sizeof(RGBQUAD)));
++ memcpy(GetPalette(),pPal,cxmin(GetPaletteSize(),nColors*sizeof(RGBQUAD)));
+ info.last_c_isvalid = false;
+ }
+ ////////////////////////////////////////////////////////////////////////////////
+@@ -654,10 +654,10 @@ void CxImage::SetClrImportant(DWORD ncolors)
+
+ switch(head.biBitCount){
+ case 1:
+- head.biClrImportant = min(ncolors,2);
++ head.biClrImportant = cxmin(ncolors,2);
+ break;
+ case 4:
+- head.biClrImportant = min(ncolors,16);
++ head.biClrImportant = cxmin(ncolors,16);
+ break;
+ case 8:
+ head.biClrImportant = ncolors;
+diff --git a/lib/cximage-6.0/CxImage/ximapng.cpp b/lib/cximage-6.0/CxImage/ximapng.cpp
+index a58441c..4b5cc50 100644
+--- a/lib/cximage-6.0/CxImage/ximapng.cpp
++++ b/lib/cximage-6.0/CxImage/ximapng.cpp
+@@ -206,9 +206,9 @@ bool CxImagePNG::Decode(CxFile *hFile)
+ } else SetGrayPalette(); //<DP> needed for grayscale PNGs
+
+ #ifdef USE_NEW_LIBPNG_API
+- int nshift = max(0,(_bit_depth>>3)-1)<<3;
++ int nshift = cxmax(0,(_bit_depth>>3)-1)<<3;
+ #else
+- int nshift = max(0,(info_ptr->bit_depth>>3)-1)<<3;
++ int nshift = cxmax(0,(info_ptr->bit_depth>>3)-1)<<3;
+ #endif
+
+ #ifdef USE_NEW_LIBPNG_API
+@@ -255,10 +255,10 @@ bool CxImagePNG::Decode(CxFile *hFile)
+ if (pal){
+ DWORD ip;
+ #ifdef USE_NEW_LIBPNG_API
+- for (ip=0;ip<min(head.biClrUsed,(unsigned long)_num_trans);ip++)
++ for (ip=0;ip<cxmin(head.biClrUsed,(unsigned long)_num_trans);ip++)
+ pal[ip].rgbReserved=_trans_alpha[ip];
+ #else
+- for (ip=0;ip<min(head.biClrUsed,(unsigned long)info_ptr->num_trans);ip++)
++ for (ip=0;ip<cxmin(head.biClrUsed,(unsigned long)info_ptr->num_trans);ip++)
+ #if PNG_LIBPNG_VER > 10399
+ pal[ip].rgbReserved=info_ptr->trans_alpha[ip];
+ #else
+@@ -737,9 +737,9 @@ bool CxImagePNG::Encode(CxFile *hFile)
+ #endif // CXIMAGE_SUPPORT_ALPHA // <vho>
+
+ #ifdef USE_NEW_LIBPNG_API
+- int row_size = max(info.dwEffWidth, (_width * _channels * _bit_depth / 8));
++ int row_size = cxmax(info.dwEffWidth, (_width * _channels * _bit_depth / 8));
+ #else
+- int row_size = max(info.dwEffWidth, info_ptr->width*info_ptr->channels*(info_ptr->bit_depth/8));
++ int row_size = cxmax(info.dwEffWidth, info_ptr->width*info_ptr->channels*(info_ptr->bit_depth/8));
+ info_ptr->rowbytes = row_size;
+ #endif
+ BYTE *row_pointers = new BYTE[row_size];
+diff --git a/lib/cximage-6.0/CxImage/ximaraw.cpp b/lib/cximage-6.0/CxImage/ximaraw.cpp
+index fd86f96..52d964d 100644
+--- a/lib/cximage-6.0/CxImage/ximaraw.cpp
++++ b/lib/cximage-6.0/CxImage/ximaraw.cpp
+@@ -216,7 +216,7 @@ bool CxImageRAW::Decode(CxFile *hFile)
+
+ DWORD size = dcr.width * (dcr.colors*dcr.opt.output_bps/8);
+ RGBtoBGR(ppm,size);
+- memcpy(GetBits(dcr.height - 1 - row), ppm, min(size,GetEffWidth()));
++ memcpy(GetBits(dcr.height - 1 - row), ppm, cxmin(size,GetEffWidth()));
+ }
+ free (ppm);
+
+@@ -298,7 +298,7 @@ bool CxImageRAW::GetExifThumbnail(const char *filename, const char *outname, int
+ // Resizing.
+ if (image.GetWidth() > 256 || image.GetHeight() > 256)
+ {
+- float amount = 256.0f / max(image.GetWidth(), image.GetHeight());
++ float amount = 256.0f / cxmax(image.GetWidth(), image.GetHeight());
+ image.Resample((long)(image.GetWidth() * amount), (long)(image.GetHeight() * amount), 0);
+ }
+
+diff --git a/lib/cximage-6.0/CxImage/ximasel.cpp b/lib/cximage-6.0/CxImage/ximasel.cpp
+index 3a7c9a1..37cd10f 100644
+--- a/lib/cximage-6.0/CxImage/ximasel.cpp
++++ b/lib/cximage-6.0/CxImage/ximasel.cpp
+@@ -113,15 +113,15 @@ bool CxImage::SelectionAddRect(RECT r, BYTE level)
+ if (r.left<r.right) {r2.left=r.left; r2.right=r.right; } else {r2.left=r.right ; r2.right=r.left; }
+ if (r.bottom<r.top) {r2.bottom=r.bottom; r2.top=r.top; } else {r2.bottom=r.top ; r2.top=r.bottom; }
+
+- if (info.rSelectionBox.top <= r2.top) info.rSelectionBox.top = max(0L,min(head.biHeight,r2.top+1));
+- if (info.rSelectionBox.left > r2.left) info.rSelectionBox.left = max(0L,min(head.biWidth,r2.left));
+- if (info.rSelectionBox.right <= r2.right) info.rSelectionBox.right = max(0L,min(head.biWidth,r2.right+1));
+- if (info.rSelectionBox.bottom > r2.bottom) info.rSelectionBox.bottom = max(0L,min(head.biHeight,r2.bottom));
++ if (info.rSelectionBox.top <= r2.top) info.rSelectionBox.top = cxmax(0L,cxmin(head.biHeight,r2.top+1));
++ if (info.rSelectionBox.left > r2.left) info.rSelectionBox.left = cxmax(0L,cxmin(head.biWidth,r2.left));
++ if (info.rSelectionBox.right <= r2.right) info.rSelectionBox.right = cxmax(0L,cxmin(head.biWidth,r2.right+1));
++ if (info.rSelectionBox.bottom > r2.bottom) info.rSelectionBox.bottom = cxmax(0L,cxmin(head.biHeight,r2.bottom));
+
+- long ymin = max(0L,min(head.biHeight,r2.bottom));
+- long ymax = max(0L,min(head.biHeight,r2.top+1));
+- long xmin = max(0L,min(head.biWidth,r2.left));
+- long xmax = max(0L,min(head.biWidth,r2.right+1));
++ long ymin = cxmax(0L,cxmin(head.biHeight,r2.bottom));
++ long ymax = cxmax(0L,cxmin(head.biHeight,r2.top+1));
++ long xmin = cxmax(0L,cxmin(head.biWidth,r2.left));
++ long xmax = cxmax(0L,cxmin(head.biWidth,r2.right+1));
+
+ for (long y=ymin; y<ymax; y++)
+ memset(pSelection + xmin + y * head.biWidth, level, xmax-xmin);
+@@ -144,18 +144,18 @@ bool CxImage::SelectionAddEllipse(RECT r, BYTE level)
+ long xcenter = (r.right + r.left)/2;
+ long ycenter = (r.top + r.bottom)/2;
+
+- if (info.rSelectionBox.left > (xcenter - xradius)) info.rSelectionBox.left = max(0L,min(head.biWidth,(xcenter - xradius)));
+- if (info.rSelectionBox.right <= (xcenter + xradius)) info.rSelectionBox.right = max(0L,min(head.biWidth,(xcenter + xradius + 1)));
+- if (info.rSelectionBox.bottom > (ycenter - yradius)) info.rSelectionBox.bottom = max(0L,min(head.biHeight,(ycenter - yradius)));
+- if (info.rSelectionBox.top <= (ycenter + yradius)) info.rSelectionBox.top = max(0L,min(head.biHeight,(ycenter + yradius + 1)));
++ if (info.rSelectionBox.left > (xcenter - xradius)) info.rSelectionBox.left = cxmax(0L,cxmin(head.biWidth,(xcenter - xradius)));
++ if (info.rSelectionBox.right <= (xcenter + xradius)) info.rSelectionBox.right = cxmax(0L,cxmin(head.biWidth,(xcenter + xradius + 1)));
++ if (info.rSelectionBox.bottom > (ycenter - yradius)) info.rSelectionBox.bottom = cxmax(0L,cxmin(head.biHeight,(ycenter - yradius)));
++ if (info.rSelectionBox.top <= (ycenter + yradius)) info.rSelectionBox.top = cxmax(0L,cxmin(head.biHeight,(ycenter + yradius + 1)));
+
+- long xmin = max(0L,min(head.biWidth,xcenter - xradius));
+- long xmax = max(0L,min(head.biWidth,xcenter + xradius + 1));
+- long ymin = max(0L,min(head.biHeight,ycenter - yradius));
+- long ymax = max(0L,min(head.biHeight,ycenter + yradius + 1));
++ long xmin = cxmax(0L,cxmin(head.biWidth,xcenter - xradius));
++ long xmax = cxmax(0L,cxmin(head.biWidth,xcenter + xradius + 1));
++ long ymin = cxmax(0L,cxmin(head.biHeight,ycenter - yradius));
++ long ymax = cxmax(0L,cxmin(head.biHeight,ycenter + yradius + 1));
+
+ long y,yo;
+- for (y=ymin; y<min(ycenter,ymax); y++){
++ for (y=ymin; y<cxmin(ycenter,ymax); y++){
+ for (long x=xmin; x<xmax; x++){
+ yo = (long)(ycenter - yradius * sqrt(1-pow((float)(x - xcenter)/(float)xradius,2)));
+ if (yo<y) pSelection[x + y * head.biWidth] = level;
+@@ -268,10 +268,10 @@ bool CxImage::SelectionAddPolygon(POINT *points, long npoints, BYTE level)
+ RECT r2;
+ if (current->x < next->x) {r2.left=current->x; r2.right=next->x; } else {r2.left=next->x ; r2.right=current->x; }
+ if (current->y < next->y) {r2.bottom=current->y; r2.top=next->y; } else {r2.bottom=next->y ; r2.top=current->y; }
+- if (localbox.top < r2.top) localbox.top = max(0L,min(head.biHeight-1,r2.top+1));
+- if (localbox.left > r2.left) localbox.left = max(0L,min(head.biWidth-1,r2.left-1));
+- if (localbox.right < r2.right) localbox.right = max(0L,min(head.biWidth-1,r2.right+1));
+- if (localbox.bottom > r2.bottom) localbox.bottom = max(0L,min(head.biHeight-1,r2.bottom-1));
++ if (localbox.top < r2.top) localbox.top = cxmax(0L,cxmin(head.biHeight-1,r2.top+1));
++ if (localbox.left > r2.left) localbox.left = cxmax(0L,cxmin(head.biWidth-1,r2.left-1));
++ if (localbox.right < r2.right) localbox.right = cxmax(0L,cxmin(head.biWidth-1,r2.right+1));
++ if (localbox.bottom > r2.bottom) localbox.bottom = cxmax(0L,cxmin(head.biHeight-1,r2.bottom-1));
+
+ i++;
+ }
+@@ -385,10 +385,10 @@ bool CxImage::SelectionAddPolygon(POINT *points, long npoints, BYTE level)
+ for (x=localbox.left; x<=localbox.right; x++)
+ if (plocal[x + yoffset]!=1) pSelection[x + yoffset]=level;
+ }
+- if (info.rSelectionBox.top <= localbox.top) info.rSelectionBox.top = min(head.biHeight,localbox.top + 1);
+- if (info.rSelectionBox.left > localbox.left) info.rSelectionBox.left = min(head.biWidth,localbox.left);
+- if (info.rSelectionBox.right <= localbox.right) info.rSelectionBox.right = min(head.biWidth,localbox.right + 1);
+- if (info.rSelectionBox.bottom > localbox.bottom) info.rSelectionBox.bottom = min(head.biHeight,localbox.bottom);
++ if (info.rSelectionBox.top <= localbox.top) info.rSelectionBox.top = cxmin(head.biHeight,localbox.top + 1);
++ if (info.rSelectionBox.left > localbox.left) info.rSelectionBox.left = cxmin(head.biWidth,localbox.left);
++ if (info.rSelectionBox.right <= localbox.right) info.rSelectionBox.right = cxmin(head.biWidth,localbox.right + 1);
++ if (info.rSelectionBox.bottom > localbox.bottom) info.rSelectionBox.bottom = cxmin(head.biHeight,localbox.bottom);
+
+ free(plocal);
+ free(pix);
+diff --git a/lib/cximage-6.0/CxImage/ximath.cpp b/lib/cximage-6.0/CxImage/ximath.cpp
+index 37533e2..f84eb72 100644
+--- a/lib/cximage-6.0/CxImage/ximath.cpp
++++ b/lib/cximage-6.0/CxImage/ximath.cpp
+@@ -64,10 +64,10 @@ CxRect2 CxRect2::CrossSection(CxRect2 const &r2) const
+ */
+ {
+ CxRect2 cs;
+- cs.botLeft.x=max(botLeft.x, r2.botLeft.x);
+- cs.botLeft.y=max(botLeft.y, r2.botLeft.y);
+- cs.topRight.x=min(topRight.x, r2.topRight.x);
+- cs.topRight.y=min(topRight.y, r2.topRight.y);
++ cs.botLeft.x=cxmax(botLeft.x, r2.botLeft.x);
++ cs.botLeft.y=cxmax(botLeft.y, r2.botLeft.y);
++ cs.topRight.x=cxmin(topRight.x, r2.topRight.x);
++ cs.topRight.y=cxmin(topRight.y, r2.topRight.y);
+ if (cs.botLeft.x<=cs.topRight.x && cs.botLeft.y<=cs.topRight.y) {
+ return cs;
+ } else {
+diff --git a/lib/cximage-6.0/CxImage/ximatif.cpp b/lib/cximage-6.0/CxImage/ximatif.cpp
+index 658392a..002766c 100644
+--- a/lib/cximage-6.0/CxImage/ximatif.cpp
++++ b/lib/cximage-6.0/CxImage/ximatif.cpp
+@@ -470,9 +470,9 @@ bool CxImageTIF::Decode(CxFile * hFile)
+ if ( cb > 0.00304 ) cb = 1.055 * pow(cb,0.41667) - 0.055;
+ else cb = 12.92 * cb;
+
+- c.rgbRed =(BYTE)max(0,min(255,(int)(cr*255)));
+- c.rgbGreen=(BYTE)max(0,min(255,(int)(cg*255)));
+- c.rgbBlue =(BYTE)max(0,min(255,(int)(cb*255)));
++ c.rgbRed =(BYTE)cxmax(0,cxmin(255,(int)(cr*255)));
++ c.rgbGreen=(BYTE)cxmax(0,cxmin(255,(int)(cg*255)));
++ c.rgbBlue =(BYTE)cxmax(0,cxmin(255,(int)(cb*255)));
+
+ SetPixelColor(xi,yi,c);
+ #if CXIMAGE_SUPPORT_ALPHA
+diff --git a/lib/cximage-6.0/CxImage/ximatran.cpp b/lib/cximage-6.0/CxImage/ximatran.cpp
+index 64a71e7..84d5e03 100644
+--- a/lib/cximage-6.0/CxImage/ximatran.cpp
++++ b/lib/cximage-6.0/CxImage/ximatran.cpp
+@@ -302,12 +302,12 @@ bool CxImage::RotateLeft(CxImage* iDst)
+ for (ys = 0; ys < newHeight; ys+=RBLOCK) {
+ if (head.biBitCount==24) {
+ //RGB24 optimized pixel access:
+- for (x = xs; x < min(newWidth, xs+RBLOCK); x++){ //do rotation
++ for (x = xs; x < cxmin(newWidth, xs+RBLOCK); x++){ //do rotation
+ info.nProgress = (long)(100*x/newWidth);
+ x2=newWidth-x-1;
+ dstPtr = (BYTE*) imgDest.BlindGetPixelPointer(x,ys);
+ srcPtr = (BYTE*) BlindGetPixelPointer(ys, x2);
+- for (y = ys; y < min(newHeight, ys+RBLOCK); y++){
++ for (y = ys; y < cxmin(newHeight, ys+RBLOCK); y++){
+ //imgDest.SetPixelColor(x, y, GetPixelColor(y, x2));
+ *(dstPtr) = *(srcPtr);
+ *(dstPtr+1) = *(srcPtr+1);
+@@ -318,19 +318,19 @@ bool CxImage::RotateLeft(CxImage* iDst)
+ }//for x
+ } else {
+ //anything else than 24bpp (and 1bpp): palette
+- for (x = xs; x < min(newWidth, xs+RBLOCK); x++){
++ for (x = xs; x < cxmin(newWidth, xs+RBLOCK); x++){
+ info.nProgress = (long)(100*x/newWidth); //<Anatoly Ivasyuk>
+ x2=newWidth-x-1;
+- for (y = ys; y < min(newHeight, ys+RBLOCK); y++){
++ for (y = ys; y < cxmin(newHeight, ys+RBLOCK); y++){
+ imgDest.SetPixelIndex(x, y, BlindGetPixelIndex(y, x2));
+ }//for y
+ }//for x
+ }//if (version selection)
+ #if CXIMAGE_SUPPORT_ALPHA
+ if (AlphaIsValid()) {
+- for (x = xs; x < min(newWidth, xs+RBLOCK); x++){
++ for (x = xs; x < cxmin(newWidth, xs+RBLOCK); x++){
+ x2=newWidth-x-1;
+- for (y = ys; y < min(newHeight, ys+RBLOCK); y++){
++ for (y = ys; y < cxmin(newHeight, ys+RBLOCK); y++){
+ imgDest.AlphaSet(x,y,BlindAlphaGet(y, x2));
+ }//for y
+ }//for x
+@@ -343,9 +343,9 @@ bool CxImage::RotateLeft(CxImage* iDst)
+ imgDest.info.rSelectionBox.right = newWidth-info.rSelectionBox.bottom;
+ imgDest.info.rSelectionBox.bottom = info.rSelectionBox.left;
+ imgDest.info.rSelectionBox.top = info.rSelectionBox.right;
+- for (x = xs; x < min(newWidth, xs+RBLOCK); x++){
++ for (x = xs; x < cxmin(newWidth, xs+RBLOCK); x++){
+ x2=newWidth-x-1;
+- for (y = ys; y < min(newHeight, ys+RBLOCK); y++){
++ for (y = ys; y < cxmin(newHeight, ys+RBLOCK); y++){
+ imgDest.SelectionSet(x,y,BlindSelectionGet(y, x2));
+ }//for y
+ }//for x
+@@ -447,12 +447,12 @@ bool CxImage::RotateRight(CxImage* iDst)
+ for (ys = 0; ys < newHeight; ys+=RBLOCK) {
+ if (head.biBitCount==24) {
+ //RGB24 optimized pixel access:
+- for (y = ys; y < min(newHeight, ys+RBLOCK); y++){
++ for (y = ys; y < cxmin(newHeight, ys+RBLOCK); y++){
+ info.nProgress = (long)(100*y/newHeight); //<Anatoly Ivasyuk>
+ y2=newHeight-y-1;
+ dstPtr = (BYTE*) imgDest.BlindGetPixelPointer(xs,y);
+ srcPtr = (BYTE*) BlindGetPixelPointer(y2, xs);
+- for (x = xs; x < min(newWidth, xs+RBLOCK); x++){
++ for (x = xs; x < cxmin(newWidth, xs+RBLOCK); x++){
+ //imgDest.SetPixelColor(x, y, GetPixelColor(y2, x));
+ *(dstPtr) = *(srcPtr);
+ *(dstPtr+1) = *(srcPtr+1);
+@@ -463,19 +463,19 @@ bool CxImage::RotateRight(CxImage* iDst)
+ }//for y
+ } else {
+ //anything else than BW & RGB24: palette
+- for (y = ys; y < min(newHeight, ys+RBLOCK); y++){
++ for (y = ys; y < cxmin(newHeight, ys+RBLOCK); y++){
+ info.nProgress = (long)(100*y/newHeight); //<Anatoly Ivasyuk>
+ y2=newHeight-y-1;
+- for (x = xs; x < min(newWidth, xs+RBLOCK); x++){
++ for (x = xs; x < cxmin(newWidth, xs+RBLOCK); x++){
+ imgDest.SetPixelIndex(x, y, BlindGetPixelIndex(y2, x));
+ }//for x
+ }//for y
+ }//if
+ #if CXIMAGE_SUPPORT_ALPHA
+ if (AlphaIsValid()){
+- for (y = ys; y < min(newHeight, ys+RBLOCK); y++){
++ for (y = ys; y < cxmin(newHeight, ys+RBLOCK); y++){
+ y2=newHeight-y-1;
+- for (x = xs; x < min(newWidth, xs+RBLOCK); x++){
++ for (x = xs; x < cxmin(newWidth, xs+RBLOCK); x++){
+ imgDest.AlphaSet(x,y,BlindAlphaGet(y2, x));
+ }//for x
+ }//for y
+@@ -488,9 +488,9 @@ bool CxImage::RotateRight(CxImage* iDst)
+ imgDest.info.rSelectionBox.right = info.rSelectionBox.top;
+ imgDest.info.rSelectionBox.bottom = newHeight-info.rSelectionBox.right;
+ imgDest.info.rSelectionBox.top = newHeight-info.rSelectionBox.left;
+- for (y = ys; y < min(newHeight, ys+RBLOCK); y++){
++ for (y = ys; y < cxmin(newHeight, ys+RBLOCK); y++){
+ y2=newHeight-y-1;
+- for (x = xs; x < min(newWidth, xs+RBLOCK); x++){
++ for (x = xs; x < cxmin(newWidth, xs+RBLOCK); x++){
+ imgDest.SelectionSet(x,y,BlindSelectionGet(y2, x));
+ }//for x
+ }//for y
+@@ -608,10 +608,10 @@ bool CxImage::Rotate(float angle, CxImage* iDst)
+ newP4.x = (float)(p4.x*cos_angle - p4.y*sin_angle);
+ newP4.y = (float)(p4.x*sin_angle + p4.y*cos_angle);
+
+- leftTop.x = min(min(newP1.x,newP2.x),min(newP3.x,newP4.x));
+- leftTop.y = min(min(newP1.y,newP2.y),min(newP3.y,newP4.y));
+- rightBottom.x = max(max(newP1.x,newP2.x),max(newP3.x,newP4.x));
+- rightBottom.y = max(max(newP1.y,newP2.y),max(newP3.y,newP4.y));
++ leftTop.x = cxmin(cxmin(newP1.x,newP2.x),cxmin(newP3.x,newP4.x));
++ leftTop.y = cxmin(cxmin(newP1.y,newP2.y),cxmin(newP3.y,newP4.y));
++ rightBottom.x = cxmax(cxmax(newP1.x,newP2.x),cxmax(newP3.x,newP4.x));
++ rightBottom.y = cxmax(cxmax(newP1.y,newP2.y),cxmax(newP3.y,newP4.y));
+ leftBottom.x = leftTop.x;
+ leftBottom.y = rightBottom.y;
+ rightTop.x = rightBottom.x;
+@@ -740,10 +740,10 @@ bool CxImage::Rotate2(float angle,
+ }//if
+
+ //(read new dimensions from location of corners)
+- float minx = (float) min(min(newp[0].x,newp[1].x),min(newp[2].x,newp[3].x));
+- float miny = (float) min(min(newp[0].y,newp[1].y),min(newp[2].y,newp[3].y));
+- float maxx = (float) max(max(newp[0].x,newp[1].x),max(newp[2].x,newp[3].x));
+- float maxy = (float) max(max(newp[0].y,newp[1].y),max(newp[2].y,newp[3].y));
++ float minx = (float) cxmin(cxmin(newp[0].x,newp[1].x),cxmin(newp[2].x,newp[3].x));
++ float miny = (float) cxmin(cxmin(newp[0].y,newp[1].y),cxmin(newp[2].y,newp[3].y));
++ float maxx = (float) cxmax(cxmax(newp[0].x,newp[1].x),cxmax(newp[2].x,newp[3].x));
++ float maxy = (float) cxmax(cxmax(newp[0].y,newp[1].y),cxmax(newp[2].y,newp[3].y));
+ int newWidth = (int) floor(maxx-minx+0.5f);
+ int newHeight= (int) floor(maxy-miny+0.5f);
+ float ssx=((maxx+minx)- ((float) newWidth-1))/2.0f; //start for x
+@@ -1003,12 +1003,12 @@ bool CxImage::Resample(long newx, long newy, int mode, CxImage* iDst)
+ if (info.nEscape) break;
+ fY = y * yScale;
+ ifY = (int)fY;
+- ifY1 = min(ymax, ifY+1);
++ ifY1 = cxmin(ymax, ifY+1);
+ dy = fY - ifY;
+ for(long x=0; x<newx; x++){
+ fX = x * xScale;
+ ifX = (int)fX;
+- ifX1 = min(xmax, ifX+1);
++ ifX1 = cxmin(xmax, ifX+1);
+ dx = fX - ifX;
+ // Interpolate using the four nearest pixels in the source
+ if (head.biClrUsed){
+@@ -1328,9 +1328,9 @@ bool CxImage::DecreaseBpp(DWORD nbit, bool errordiffusion, RGBQUAD* ppal, DWORD
+ eb=(long)c.rgbBlue - (long)ce.rgbBlue;
+
+ c = GetPixelColor(x+1,y);
+- c.rgbRed = (BYTE)min(255L,max(0L,(long)c.rgbRed + ((er*7)/16)));
+- c.rgbGreen = (BYTE)min(255L,max(0L,(long)c.rgbGreen + ((eg*7)/16)));
+- c.rgbBlue = (BYTE)min(255L,max(0L,(long)c.rgbBlue + ((eb*7)/16)));
++ c.rgbRed = (BYTE)cxmin(255L,cxmax(0L,(long)c.rgbRed + ((er*7)/16)));
++ c.rgbGreen = (BYTE)cxmin(255L,cxmax(0L,(long)c.rgbGreen + ((eg*7)/16)));
++ c.rgbBlue = (BYTE)cxmin(255L,cxmax(0L,(long)c.rgbBlue + ((eb*7)/16)));
+ SetPixelColor(x+1,y,c);
+ int coeff=1;
+ for(int i=-1; i<2; i++){
+@@ -1343,9 +1343,9 @@ bool CxImage::DecreaseBpp(DWORD nbit, bool errordiffusion, RGBQUAD* ppal, DWORD
+ coeff=1; break;
+ }
+ c = GetPixelColor(x+i,y+1);
+- c.rgbRed = (BYTE)min(255L,max(0L,(long)c.rgbRed + ((er * coeff)/16)));
+- c.rgbGreen = (BYTE)min(255L,max(0L,(long)c.rgbGreen + ((eg * coeff)/16)));
+- c.rgbBlue = (BYTE)min(255L,max(0L,(long)c.rgbBlue + ((eb * coeff)/16)));
++ c.rgbRed = (BYTE)cxmin(255L,cxmax(0L,(long)c.rgbRed + ((er * coeff)/16)));
++ c.rgbGreen = (BYTE)cxmin(255L,cxmax(0L,(long)c.rgbGreen + ((eg * coeff)/16)));
++ c.rgbBlue = (BYTE)cxmin(255L,cxmax(0L,(long)c.rgbBlue + ((eb * coeff)/16)));
+ SetPixelColor(x+i,y+1,c);
+ }
+ }
+@@ -1566,10 +1566,10 @@ bool CxImage::Dither(long method)
+ }
+
+ nlevel = GetPixelIndex(x + 1, y) + (error * 8) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + 1, y, level);
+ nlevel = GetPixelIndex(x + 2, y) + (error * 4) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + 2, y, level);
+ int i;
+ for (i = -2; i < 3; i++) {
+@@ -1591,7 +1591,7 @@ bool CxImage::Dither(long method)
+ break;
+ }
+ nlevel = GetPixelIndex(x + i, y + 1) + (error * coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + i, y + 1, level);
+ }
+ }
+@@ -1620,10 +1620,10 @@ bool CxImage::Dither(long method)
+ }
+
+ nlevel = GetPixelIndex(x + 1, y) + (error * 8) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + 1, y, level);
+ nlevel = GetPixelIndex(x + 2, y) + (error * 4) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + 2, y, level);
+ int i;
+ for (i = -2; i < 3; i++) {
+@@ -1645,7 +1645,7 @@ bool CxImage::Dither(long method)
+ break;
+ }
+ nlevel = GetPixelIndex(x + i, y + 1) + (error * coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + i, y + 1, level);
+ }
+ for (i = -2; i < 3; i++) {
+@@ -1667,7 +1667,7 @@ bool CxImage::Dither(long method)
+ break;
+ }
+ nlevel = GetPixelIndex(x + i, y + 2) + (error * coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + i, y + 2, level);
+ }
+ }
+@@ -1696,10 +1696,10 @@ bool CxImage::Dither(long method)
+ }
+
+ nlevel = GetPixelIndex(x + 1, y) + (error * 7) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + 1, y, level);
+ nlevel = GetPixelIndex(x + 2, y) + (error * 5) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + 2, y, level);
+ int i;
+ for (i = -2; i < 3; i++) {
+@@ -1721,7 +1721,7 @@ bool CxImage::Dither(long method)
+ break;
+ }
+ nlevel = GetPixelIndex(x + i, y + 1) + (error * coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + i, y + 1, level);
+ }
+ for (i = -2; i < 3; i++) {
+@@ -1743,7 +1743,7 @@ bool CxImage::Dither(long method)
+ break;
+ }
+ nlevel = GetPixelIndex(x + i, y + 2) + (error * coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + i, y + 2, level);
+ }
+ }
+@@ -1772,10 +1772,10 @@ bool CxImage::Dither(long method)
+ }
+
+ nlevel = GetPixelIndex(x + 1, y) + (error * 5) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + 1, y, level);
+ nlevel = GetPixelIndex(x + 2, y) + (error * 3) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + 2, y, level);
+ int i;
+ for (i = -2; i < 3; i++) {
+@@ -1797,7 +1797,7 @@ bool CxImage::Dither(long method)
+ break;
+ }
+ nlevel = GetPixelIndex(x + i, y + 1) + (error * coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + i, y + 1, level);
+ }
+ for (i = -1; i < 2; i++) {
+@@ -1813,7 +1813,7 @@ bool CxImage::Dither(long method)
+ break;
+ }
+ nlevel = GetPixelIndex(x + i, y + 2) + (error * coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(x + i, y + 2, level);
+ }
+ }
+@@ -1845,76 +1845,76 @@ bool CxImage::Dither(long method)
+ int tmp_index_y = y;
+ int tmp_coeff = 32;
+ nlevel = GetPixelIndex(tmp_index_x, tmp_index_y) + (error * tmp_coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(tmp_index_x, tmp_index_y, level);
+
+ tmp_index_x = x - 3;
+ tmp_index_y = y + 1;
+ tmp_coeff = 12;
+ nlevel = GetPixelIndex(tmp_index_x, tmp_index_y) + (error * tmp_coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(tmp_index_x, tmp_index_y, level);
+
+ tmp_index_x = x - 1;
+ tmp_coeff = 26;
+ nlevel = GetPixelIndex(tmp_index_x, tmp_index_y) + (error * tmp_coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(tmp_index_x, tmp_index_y, level);
+
+ tmp_index_x = x + 1;
+ tmp_coeff = 30;
+ nlevel = GetPixelIndex(tmp_index_x, tmp_index_y) + (error * tmp_coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(tmp_index_x, tmp_index_y, level);
+
+ tmp_index_x = x + 3;
+ tmp_coeff = 16;
+ nlevel = GetPixelIndex(tmp_index_x, tmp_index_y) + (error * tmp_coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(tmp_index_x, tmp_index_y, level);
+
+ tmp_index_x = x - 2;
+ tmp_index_y = y + 2;
+ tmp_coeff = 12;
+ nlevel = GetPixelIndex(tmp_index_x, tmp_index_y) + (error * tmp_coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(tmp_index_x, tmp_index_y, level);
+
+ tmp_index_x = x;
+ tmp_coeff = 26;
+ nlevel = GetPixelIndex(tmp_index_x, tmp_index_y) + (error * tmp_coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(tmp_index_x, tmp_index_y, level);
+
+ tmp_index_x = x + 2;
+ tmp_coeff = 12;
+ nlevel = GetPixelIndex(tmp_index_x, tmp_index_y) + (error * tmp_coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(tmp_index_x, tmp_index_y, level);
+
+ tmp_index_x = x - 3;
+ tmp_index_y = y + 3;
+ tmp_coeff = 5;
+ nlevel = GetPixelIndex(tmp_index_x, tmp_index_y) + (error * tmp_coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(tmp_index_x, tmp_index_y, level);
+
+ tmp_index_x = x - 1;
+ tmp_coeff = 12;
+ nlevel = GetPixelIndex(tmp_index_x, tmp_index_y) + (error * tmp_coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(tmp_index_x, tmp_index_y, level);
+
+ tmp_index_x = x + 1;
+ tmp_coeff = 12;
+ nlevel = GetPixelIndex(tmp_index_x, tmp_index_y) + (error * tmp_coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(tmp_index_x, tmp_index_y, level);
+
+ tmp_index_x = x + 3;
+ tmp_coeff = 5;
+ nlevel = GetPixelIndex(tmp_index_x, tmp_index_y) + (error * tmp_coeff) / TotalCoeffSum;
+- level = (BYTE)min(255, max(0, (int)nlevel));
++ level = (BYTE)cxmin(255, cxmax(0, (int)nlevel));
+ SetPixelIndex(tmp_index_x, tmp_index_y, level);
+ }
+ }
+@@ -1941,7 +1941,7 @@ bool CxImage::Dither(long method)
+ Bmatrix[i] = (BYTE)(dither);
+ }
+
+- int scale = max(0,(8-2*order));
++ int scale = cxmax(0,(8-2*order));
+ int level;
+ for (long y=0;y<head.biHeight;y++){
+ info.nProgress = (long)(100*y/head.biHeight);
+@@ -1981,7 +1981,7 @@ bool CxImage::Dither(long method)
+ }
+
+ nlevel = GetPixelIndex(x+1,y) + (error * 7)/16;
+- level = (BYTE)min(255,max(0,(int)nlevel));
++ level = (BYTE)cxmin(255,cxmax(0,(int)nlevel));
+ SetPixelIndex(x+1,y,level);
+ for(int i=-1; i<2; i++){
+ switch(i){
+@@ -1993,7 +1993,7 @@ bool CxImage::Dither(long method)
+ coeff=1; break;
+ }
+ nlevel = GetPixelIndex(x+i,y+1) + (error * coeff)/16;
+- level = (BYTE)min(255,max(0,(int)nlevel));
++ level = (BYTE)cxmin(255,cxmax(0,(int)nlevel));
+ SetPixelIndex(x+i,y+1,level);
+ }
+ }
+@@ -2031,7 +2031,7 @@ bool CxImage::CropRotatedRectangle( long topx, long topy, long width, long heigh
+ if ( fabs(angle)<0.0002 )
+ return Crop( topx, topy, topx+width, topy+height, iDst);
+
+- startx = min(topx, topx - (long)(sin_angle*(double)height));
++ startx = cxmin(topx, topx - (long)(sin_angle*(double)height));
+ endx = topx + (long)(cos_angle*(double)width);
+ endy = topy + (long)(cos_angle*(double)height + sin_angle*(double)width);
+ // check: corners of the rectangle must be inside
+@@ -2079,10 +2079,10 @@ bool CxImage::Crop(long left, long top, long right, long bottom, CxImage* iDst)
+ {
+ if (!pDib) return false;
+
+- long startx = max(0L,min(left,head.biWidth));
+- long endx = max(0L,min(right,head.biWidth));
+- long starty = head.biHeight - max(0L,min(top,head.biHeight));
+- long endy = head.biHeight - max(0L,min(bottom,head.biHeight));
++ long startx = cxmax(0L,cxmin(left,head.biWidth));
++ long endx = cxmax(0L,cxmin(right,head.biWidth));
++ long starty = head.biHeight - cxmax(0L,cxmin(top,head.biHeight));
++ long endy = head.biHeight - cxmax(0L,cxmin(bottom,head.biHeight));
+
+ if (startx==endx || starty==endy) return false;
+
+@@ -2443,8 +2443,8 @@ bool CxImage::CircleTransform(int type,long rmax,float Koeff)
+ nx=x+(x%32)-16;
+ ny=y;
+ }
+-// nx=max(xmin,min(nx,xmax));
+-// ny=max(ymin,min(ny,ymax));
++// nx=cxmax(xmin,cxmin(nx,xmax));
++// ny=cxmax(ymin,cxmin(ny,ymax));
+ }
+ else { nx=-1;ny=-1;}
+ if (head.biClrUsed==0){
+diff --git a/lib/cximage-6.0/CxImage/ximawnd.cpp b/lib/cximage-6.0/CxImage/ximawnd.cpp
+index 2ae2f93..7029cc7 100644
+--- a/lib/cximage-6.0/CxImage/ximawnd.cpp
++++ b/lib/cximage-6.0/CxImage/ximawnd.cpp
+@@ -682,10 +682,10 @@ long CxImage::Draw(HDC hdc, long x, long y, long cx, long cy, RECT* pClipRect, b
+ RECT clipbox,paintbox;
+ GetClipBox(hdc,&clipbox);
+
+- paintbox.top = min(clipbox.bottom,max(clipbox.top,y));
+- paintbox.left = min(clipbox.right,max(clipbox.left,x));
+- paintbox.right = max(clipbox.left,min(clipbox.right,x+cx));
+- paintbox.bottom = max(clipbox.top,min(clipbox.bottom,y+cy));
++ paintbox.top = cxmin(clipbox.bottom,cxmax(clipbox.top,y));
++ paintbox.left = cxmin(clipbox.right,cxmax(clipbox.left,x));
++ paintbox.right = cxmax(clipbox.left,cxmin(clipbox.right,x+cx));
++ paintbox.bottom = cxmax(clipbox.top,cxmin(clipbox.bottom,y+cy));
+
+ long destw = paintbox.right - paintbox.left;
+ long desth = paintbox.bottom - paintbox.top;
+@@ -730,12 +730,12 @@ long CxImage::Draw(HDC hdc, long x, long y, long cx, long cy, RECT* pClipRect, b
+
+ for(yy=0;yy<desth;yy++){
+ dy = head.biHeight-(ymax-yy-y)*fy;
+- sy = max(0L,(long)floor(dy));
++ sy = cxmax(0L,(long)floor(dy));
+ psrc = info.pImage+sy*info.dwEffWidth;
+ pdst = pbase+yy*ew;
+ for(xx=0;xx<destw;xx++){
+ dx = (xx+xmin-x)*fx;
+- sx = max(0L,(long)floor(dx));
++ sx = cxmax(0L,(long)floor(dx));
+ #if CXIMAGE_SUPPORT_INTERPOLATION
+ if (bSmooth){
+ if (fx > 1 && fy > 1) {
+@@ -813,7 +813,7 @@ long CxImage::Draw(HDC hdc, long x, long y, long cx, long cy, RECT* pClipRect, b
+
+ for(yy=0;yy<desth;yy++){
+ dy = head.biHeight-(ymax-yy-y)*fy;
+- sy = max(0L,(long)floor(dy));
++ sy = cxmax(0L,(long)floor(dy));
+
+ alphaoffset = sy*head.biWidth;
+ pdst = pbase + yy*ew;
+@@ -821,7 +821,7 @@ long CxImage::Draw(HDC hdc, long x, long y, long cx, long cy, RECT* pClipRect, b
+
+ for(xx=0;xx<destw;xx++){
+ dx = (xx+xmin-x)*fx;
+- sx = max(0L,(long)floor(dx));
++ sx = cxmax(0L,(long)floor(dx));
+
+ if (bAlpha) a=pAlpha[alphaoffset+sx]; else a=255;
+ a =(BYTE)((a*(1+info.nAlphaMax))>>8);
diff --git a/abs/extra/kodi/PKGBUILD b/abs/extra/kodi/PKGBUILD
index 6623868..14c19f9 100644
--- a/abs/extra/kodi/PKGBUILD
+++ b/abs/extra/kodi/PKGBUILD
@@ -2,121 +2,154 @@
# $Id$
# Maintainer: Sergej Pupykin <pupykin.s+arch@gmail.com>
# Maintainer: BlackIkeEagle < ike DOT devolder AT gmail DOT com >
+# Contributor: graysky <graysky AT archlinux DOT us>
+# Contributor: DonVla <donvla@users.sourceforge.net>
+# Contributor: Ulf Winkelvos <ulf [at] winkelvos [dot] de>
+# Contributor: Ralf Barth <archlinux dot org at haggy dot org>
+# Contributor: B & monty - Thanks for your hints :)
+# Contributor: marzoul
+# Contributor: Sergej Pupykin <pupykin.s+arch@gmail.com>
# Contributor: Brad Fanella <bradfanella@archlinux.us>
# Contributor: [vEX] <niechift.dot.vex.at.gmail.dot.com>
# Contributor: Zeqadious <zeqadious.at.gmail.dot.com>
-# Contributor: BlackIkeEagle < ike DOT devolder AT gmail DOT com >
# Contributor: Bartłomiej Piotrowski <bpiotrowski@archlinux.org>
# Contributor: Maxime Gauduin <alucryd@gmail.com>
+#
+# Original credits go to Edgar Hucek <gimli at dark-green dot com>
+# for his xbmc-vdpau-vdr PKGBUILD at https://archvdr.svn.sourceforge.net/svnroot/archvdr/trunk/archvdr/xbmc-vdpau-vdr/PKGBUILD
pkgbase=kodi
-pkgname=('kodi' 'kodi-eventclients')
-pkgver=16.1
-_codename=Jarvis
-pkgrel=2
-arch=('i686' 'x86_64')
+pkgname=('kodi' 'kodi-eventclients' 'kodi-tools-texturepacker' 'kodi-dev')
+pkgver=17.6
+_codename=Krypton
+pkgrel=5
+arch=('x86_64')
url="http://kodi.tv"
license=('GPL2')
makedepends=(
- 'afpfs-ng' 'bluez-libs' 'boost' 'cmake' 'curl' 'cwiid' 'doxygen' 'git' 'glew'
+ 'afpfs-ng' 'bluez-libs' 'cmake' 'curl' 'doxygen' 'glew'
'gperf' 'hicolor-icon-theme' 'jasper' 'java-runtime' 'libaacs' 'libass'
'libbluray' 'libcdio' 'libcec' 'libgl' 'libmysqlclient' 'libmicrohttpd'
'libmodplug' 'libmpeg2' 'libnfs' 'libplist' 'libssh' 'libva'
'libvdpau' 'libxrandr' 'libxslt' 'lzo' 'mesa' 'nasm' 'nss-mdns'
- 'python2-pillow' 'python2-pybluez' 'python2-simplejson' 'rtmpdump' 'sdl2'
- 'sdl_image' 'shairplay' 'smbclient' 'swig' 'taglib' 'tinyxml' 'unzip' 'upower'
- 'yajl' 'zip' 'mesa' 'dcadec' 'libcrossguid'
+ 'python2-pillow' 'python2-pybluez' 'python2-simplejson' 'rtmpdump'
+ 'shairplay' 'smbclient' 'speex' 'swig' 'taglib' 'tinyxml' 'unzip' 'upower'
+ 'yajl' 'zip' 'git' 'giflib'
)
+_libdvdcss_commit="2f12236bc1c92f73c21e973363f79eb300de603f"
+_libdvdnav_commit="981488f7f27554b103cca10c1fbeba027396c94a"
+_libdvdread_commit="17d99db97e7b8f23077b342369d3c22a6250affd"
+_ffmpeg_version="3.1.11-$_codename-17.5"
source=(
- "$pkgname-$pkgver-$_codename.tar.gz::https://github.com/xbmc/xbmc/archive/$pkgver-$_codename.tar.gz"
+ "$pkgbase-$pkgver-$_codename.tar.gz::https://github.com/xbmc/xbmc/archive/$pkgver-$_codename.tar.gz"
+ "$pkgbase-libdvdcss-$_libdvdcss_commit.tar.gz::https://github.com/xbmc/libdvdcss/archive/$_libdvdcss_commit.tar.gz"
+ "$pkgbase-libdvdnav-$_libdvdnav_commit.tar.gz::https://github.com/xbmc/libdvdnav/archive/$_libdvdnav_commit.tar.gz"
+ "$pkgbase-libdvdread-$_libdvdread_commit.tar.gz::https://github.com/xbmc/libdvdread/archive/$_libdvdread_commit.tar.gz"
+ "$pkgbase-ffmpeg-$_ffmpeg_version.tar.gz::https://github.com/xbmc/FFmpeg/archive/$_ffmpeg_version.tar.gz"
+ 'fix-python-lib-path.patch'
+ 'cheat-sse-build.patch'
+ 'cpuinfo'
'kodi.sh'
'kodi_lib.conf'
)
-
+noextract=(
+ "$pkgbase-libdvdcss-$_libdvdcss_commit.tar.gz"
+ "$pkgbase-libdvdnav-$_libdvdnav_commit.tar.gz"
+ "$pkgbase-libdvdread-$_libdvdread_commit.tar.gz"
+ "$pkgbase-ffmpeg-$_ffmpeg_version.tar.gz"
+)
+sha512sums=('1f1ba91e6129ab423f9ad47b63d7bb75775dbf18638a96413a572aaa790f4f0d738ca35486513e158a7f55d501f78f08dd9d68aabe2fbb80a729c6091b264111'
+ '12ba7aa653fcb26d5336bf2a8110c924d634cec79f684bbf19dc38ea33f69fb68c22c97f4c09e5ca7c35f95f6c324a6d70ccc2c501a99122a9321cafd33b2cd9'
+ '005355da5e3d34f69737f7c3fe7884e82ffdc8f654f337e97d4a4d1e486c9f346f63b4dee74de2765e7a8d94925de5d25c3c82da732d2e8d4f58fcfeb9dd2586'
+ 'e59ae0bfdc62698e407e3d70503c6a7c5e308545c9dae7843e25db3b5b62d9b26256be77ef4e884263add6b4abec3438c324bfd5715f6ca2ce7fa5962d43a6c2'
+ 'b28bb6970c6767213f34e5f4f3e48ad5219a6c668a5264ff7de0a42712cb7393f389ddd88f56785a2dc8089f8231ae5fd05adfa10dbf15ea3e0ad7bc2ccd4d73'
+ '0f41604e38648969572a66d1124d6e090c3bfca4f9d8ccabcd1806254c38b178ee08df35e1bbbd1228f820729df52353321b3257122af601c3233dbc6405c6d2'
+ 'be8d6b77088373d0173dee6434ebd04c9382fb00190641b392a6f9f5338b35d186f6d871aaea4a01908f283a452b23de3a1113947d9070e77fde531e32458f7e'
+ '539b33f30f6735caaf57fb9f19de449b8a8902362ae9e66a6fceabd530d02888533d2ab262fb187670780c997e5c1d23bd715a3c6860fd50280c1031f47865f7'
+ '554a2f1f82fdf93f6b2f0c0bd3947e17660d728a0d53fcb3592fb0dfb992c9174ad741e3aa1c04ae0ec534a6c4b78423effc39428a58cab8750663644679b988'
+ 'f4085fbc75c0a0df4ca4cdd5356e6214f2a2e81895d410a8c3181708b91bd34de64719e4cac1e9fe3496b82e950839937ec0438a9cf6ce91cb3eacc29f81cb3b')
prepare() {
- cd "$srcdir/xbmc-$pkgver-$_codename"
-
- find -type f -name *.py -exec sed 's|^#!.*python$|#!/usr/bin/python2|' -i "{}" +
- sed 's|^#!.*python$|#!/usr/bin/python2|' -i tools/depends/native/rpl-native/rpl
- sed 's/python/python2/' -i tools/Linux/kodi.sh.in
- sed 's/shell python/shell python2/' -i tools/EventClients/Makefile.in
-
- # patches
+ [[ -d kodi-build ]] && rm -rf kodi-build
+ mkdir kodi-build
+
+ cd "xbmc-$pkgver-$_codename"
+ patch -p1 -i "$srcdir/fix-python-lib-path.patch"
+ # detect if building in arch chroot
+ if [[ "$srcdir" =~ ^\/build.* ]]; then
+ patch -p1 -i "$srcdir/cheat-sse-build.patch"
+ fi
}
build() {
- cd "$srcdir/xbmc-$pkgver-$_codename"
-
- # Bootstrapping
- MAKEFLAGS=-j1 ./bootstrap
-
- #./configure --help
- #return 1
-
- # Configuring XBMC
- export PYTHON_VERSION=2 # external python v2
- ./configure --prefix=/usr --exec-prefix=/usr \
- --disable-debug \
- --enable-optimizations \
- --enable-libbluray \
- --enable-shared-libraries \
- --with-lirc-device=/run/lirc/lircd \
- ac_cv_type__Bool=yes
-
- # Now (finally) build
+ cd kodi-build
+ cmake -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_INSTALL_LIBDIR=/usr/lib \
+ -DENABLE_EVENTCLIENTS=ON \
+ -DLIRC_DEVICE=/run/lirc/lircd \
+ -Dlibdvdcss_URL="$srcdir/$pkgbase-libdvdcss-$_libdvdcss_commit.tar.gz" \
+ -Dlibdvdnav_URL="$srcdir/$pkgbase-libdvdnav-$_libdvdnav_commit.tar.gz" \
+ -Dlibdvdread_URL="$srcdir/$pkgbase-libdvdread-$_libdvdread_commit.tar.gz" \
+ -DFFMPEG_URL="$srcdir/$pkgbase-ffmpeg-$_ffmpeg_version.tar.gz" \
+ ../"xbmc-$pkgver-$_codename"/project/cmake
make
+ make preinstall
}
+# kodi
+# components: kodi, kodi-bin
+
package_kodi() {
pkgdesc="A software media player and entertainment hub for digital media"
-
- # depends expected for kodi plugins:
- # 'python2-pillow' 'python2-pybluez' 'python2-simplejson'
- # depends expeced in FEH.py
- # 'mesa-demos' 'xorg-xdpyinfo'
depends=(
- 'python2-pillow' 'python2-pybluez' 'python2-simplejson'
- 'mesa-demos' 'xorg-xdpyinfo'
- 'bluez-libs' 'fribidi' 'glew' 'hicolor-icon-theme' 'libass' 'libcdio'
- 'libjpeg-turbo' 'libmysqlclient' 'libmicrohttpd' 'libssh'
- 'libva' 'libxrandr' 'libxslt' 'lzo' 'sdl2' 'smbclient' 'taglib' 'tinyxml'
- 'yajl' 'mesa' 'dcadec' 'desktop-file-utils'
+ 'bluez-libs' 'desktop-file-utils' 'freetype2' 'fribidi'
+ 'hicolor-icon-theme' 'libass' 'libcdio' 'libjpeg-turbo' 'libmariadbclient'
+ 'libmicrohttpd' 'libssh' 'libva' 'libvdpau' 'libxrandr'
+ 'libxslt' 'lzo' 'mesa' 'python2-pillow' 'python2-simplejson' 'smbclient'
+ 'speex' 'taglib' 'tinyxml' 'xorg-xdpyinfo' 'yajl'
)
optdepends=(
'afpfs-ng: Apple shares support'
'bluez: Blutooth support'
+ 'python2-pybluez: Bluetooth support'
'libnfs: NFS shares support'
'libplist: AirPlay support'
'libcec: Pulse-Eight USB-CEC adapter support'
'lirc: Remote controller support'
+ 'lsb-release: log distro information in crashlog'
'shairplay: AirPlay support'
- 'udisks: Automount external drives'
'unrar: Archives support'
'unzip: Archives support'
'upower: Display battery level'
- 'lsb-release: log distro information in crashlog'
)
install="kodi.install"
provides=('xbmc')
conflicts=('xbmc')
replaces=('xbmc')
- cd "$srcdir/xbmc-$pkgver-$_codename"
- # Running make install
- make DESTDIR="$pkgdir" install
+ _components=(
+ 'kodi'
+ 'kodi-bin'
+ )
- # We will no longer support the xbmc name
- rm "$pkgdir/usr/share/xsessions/xbmc.desktop"
- rm "$pkgdir/usr/bin/"xbmc{,-standalone}
- # we will leave /usr/{include,lib,share}/xbmc for now
+ cd kodi-build
+ # install eventclients
+ for _cmp in ${_components[@]}; do
+ DESTDIR="$pkgdir" /usr/bin/cmake \
+ -DCMAKE_INSTALL_COMPONENT="$_cmp" \
+ -P cmake_install.cmake
+ done
# Licenses
- install -dm755 ${pkgdir}/usr/share/licenses/${pkgname}
+ install -dm755 "$pkgdir/usr/share/licenses/$pkgname"
for licensef in LICENSE.GPL copying.txt; do
- mv ${pkgdir}/usr/share/doc/kodi/${licensef} \
- ${pkgdir}/usr/share/licenses/${pkgname}
+ mv "$pkgdir/usr/share/doc/kodi/$licensef" \
+ "$pkgdir/usr/share/licenses/$pkgname"
done
+ # python2 is being used
+ cd "$pkgdir"
+ grep -lR '#!.*python' * | while read file; do sed -s 's/\(#!.*python\)/\12/g' -i "$file"; done
+
# LinHES stuff
mkdir -p ${pkgdir}/usr/LH/bin
install -D -m 0755 ${srcdir}/kodi.sh ${pkgdir}/usr/LH/bin
@@ -124,16 +157,81 @@ package_kodi() {
install -D -m0744 ${srcdir}/kodi_lib.conf ${pkgdir}/etc/gen_lib_xml.d/kodi_lib.conf
}
+# kodi-eventclients
+# components: kodi-eventclients-common kodi-eventclients-ps3 kodi-eventclients-wiiremote kodi-eventclients-xbmc-send
+
package_kodi-eventclients() {
pkgdesc="Kodi Event Clients"
+ conflicts=('kodi-eventclients')
+ optdepends=('python2: most eventclients are implemented in python2')
- depends=('cwiid')
+ _components=(
+ 'kodi-eventclients-common'
+ 'kodi-eventclients-ps3'
+ 'kodi-eventclients-xbmc-send'
+ )
- cd "$srcdir/xbmc-$pkgver-$_codename"
+ cd kodi-build
+ # install eventclients
+ for _cmp in ${_components[@]}; do
+ DESTDIR="$pkgdir" /usr/bin/cmake \
+ -DCMAKE_INSTALL_COMPONENT="$_cmp" \
+ -P cmake_install.cmake
+ done
- make DESTDIR="$pkgdir" eventclients WII_EXTRA_OPTS=-DCWIID_OLD
+ # python2 is being used
+ cd "$pkgdir"
+ grep -lR '#!.*python' * | while read file; do sed -s 's/\(#!.*python\)/\12/g' -i "$file"; done
}
-md5sums=('79358ad5f77f42c5498a9412d5a78dd5'
- 'f6adc8e06d7076143ca2ad118126b158'
- 'f04d1c89f5108c6aba36cf708a74cc95')
+# kodi-tools-texturepacker
+# components: kodi-tools-texturepacker
+
+package_kodi-tools-texturepacker() {
+ pkgdesc="Kodi Texturepacker tool"
+ depends=('libpng' 'giflib' 'libjpeg-turbo' 'lzo')
+
+ _components=(
+ 'kodi-tools-texturepacker'
+ )
+
+ cd kodi-build
+ # install eventclients
+ for _cmp in ${_components[@]}; do
+ DESTDIR="$pkgdir" /usr/bin/cmake \
+ -DCMAKE_INSTALL_COMPONENT="$_cmp" \
+ -P cmake_install.cmake
+ done
+}
+
+# kodi-dev
+# components: kodi-addon-dev kodi-audio-dev kodi-eventclients-dev kodi-game-dev kodi-inputstream-dev kodi-peripheral-dev kodi-pvr-dev kodi-screensaver-dev kodi-visualization-dev
+
+package_kodi-dev() {
+ pkgdesc="Kodi dev files"
+ depends=('kodi')
+
+ _components=(
+ 'kodi-addon-dev'
+ 'kodi-audio-dev'
+ 'kodi-eventclients-dev'
+ 'kodi-game-dev'
+ 'kodi-inputstream-dev'
+ 'kodi-peripheral-dev'
+ 'kodi-pvr-dev'
+ 'kodi-screensaver-dev'
+ 'kodi-visualization-dev'
+ )
+
+ cd kodi-build
+ # install eventclients
+ for _cmp in ${_components[@]}; do
+ DESTDIR="$pkgdir" /usr/bin/cmake \
+ -DCMAKE_INSTALL_COMPONENT="$_cmp" \
+ -P cmake_install.cmake
+ done
+
+ # python2 is being used
+ cd "$pkgdir"
+ grep -lR '#!.*python' * | while read file; do sed -s 's/\(#!.*python\)/\12/g' -i "$file"; done
+}
diff --git a/abs/extra/kodi/cheat-sse-build.patch b/abs/extra/kodi/cheat-sse-build.patch
new file mode 100644
index 0000000..8b4b3b1
--- /dev/null
+++ b/abs/extra/kodi/cheat-sse-build.patch
@@ -0,0 +1,11 @@
+--- a/project/cmake/modules/FindSSE.cmake 2017-08-22 09:29:22.000000000 +0200
++++ b/project/cmake/modules/FindSSE.cmake 2018-01-06 19:36:32.716303559 +0100
+@@ -4,7 +4,7 @@
+
+ if(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ if(CPU MATCHES "x86_64" OR CPU MATCHES "i.86")
+- exec_program(cat ARGS "/proc/cpuinfo" OUTPUT_VARIABLE CPUINFO)
++ exec_program(cat ARGS "/build/kodi/src/cpuinfo" OUTPUT_VARIABLE CPUINFO)
+
+ string(REGEX REPLACE "^.*(sse).*$" "\\1" _SSE_THERE ${CPUINFO})
+ string(COMPARE EQUAL "sse" "${_SSE_THERE}" _SSE_TRUE)
diff --git a/abs/extra/kodi/cpuinfo b/abs/extra/kodi/cpuinfo
new file mode 100644
index 0000000..b0884ec
--- /dev/null
+++ b/abs/extra/kodi/cpuinfo
@@ -0,0 +1,4 @@
+processor : 1
+vendor_id : KodiCheat
+model name : KodiCheat SSE
+flags : sse sse2 pni ssse3 sse4_1 sse4_2 avx avx2
diff --git a/abs/extra/kodi/fix-ftpparse.patch b/abs/extra/kodi/fix-ftpparse.patch
new file mode 100644
index 0000000..feec949
--- /dev/null
+++ b/abs/extra/kodi/fix-ftpparse.patch
@@ -0,0 +1,71 @@
+--- a/xbmc/filesystem/FTPParse.cpp 2017-05-24 22:49:32.000000000 +0200
++++ b/xbmc/filesystem/FTPParse.cpp 2017-07-15 14:15:54.908823456 +0200
+@@ -34,7 +34,7 @@
+ m_time = 0;
+ }
+
+-string CFTPParse::getName()
++std::string CFTPParse::getName()
+ {
+ return m_name;
+ }
+@@ -59,16 +59,16 @@
+ return m_time;
+ }
+
+-void CFTPParse::setTime(string str)
++void CFTPParse::setTime(std::string str)
+ {
+ /* Variables used to capture patterns via the regexes */
+- string month;
+- string day;
+- string year;
+- string hour;
+- string minute;
+- string second;
+- string am_or_pm;
++ std::string month;
++ std::string day;
++ std::string year;
++ std::string hour;
++ std::string minute;
++ std::string second;
++ std::string am_or_pm;
+
+ /* time struct used to set the time_t variable */
+ struct tm time_struct = {};
+@@ -338,21 +338,21 @@
+ return day_of_week;
+ }
+
+-int CFTPParse::FTPParse(string str)
++int CFTPParse::FTPParse(std::string str)
+ {
+ /* Various variable to capture patterns via the regexes */
+- string permissions;
+- string link_count;
+- string owner;
+- string group;
+- string size;
+- string date;
+- string name;
+- string type;
+- string stuff;
+- string facts;
+- string version;
+- string file_id;
++ std::string permissions;
++ std::string link_count;
++ std::string owner;
++ std::string group;
++ std::string size;
++ std::string date;
++ std::string name;
++ std::string type;
++ std::string stuff;
++ std::string facts;
++ std::string version;
++ std::string file_id;
+
+ /* Regex for standard Unix listing formats */
+ pcrecpp::RE unix_re("^([-bcdlps])" // type
diff --git a/abs/extra/kodi/fix-python-lib-path.patch b/abs/extra/kodi/fix-python-lib-path.patch
new file mode 100644
index 0000000..3956580
--- /dev/null
+++ b/abs/extra/kodi/fix-python-lib-path.patch
@@ -0,0 +1,29 @@
+--- a/project/cmake/scripts/linux/Install.cmake 2017-03-20 17:17:49.000000000 +0100
++++ b/project/cmake/scripts/linux/Install.cmake 2017-05-20 15:42:09.608550173 +0200
+@@ -199,7 +199,7 @@
+ install(PROGRAMS ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/bt/__init__.py
+ ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/bt/bt.py
+ ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/bt/hid.py
+- DESTINATION lib/python2.7/dist-packages/${APP_NAME_LC}/bt
++ DESTINATION lib/python2.7/site-packages/${APP_NAME_LC}/bt
+ COMPONENT kodi-eventclients-common)
+
+ # Install kodi-eventclients-common PS3 python files
+@@ -208,7 +208,7 @@
+ ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/ps3/sixaxis.py
+ ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/ps3/sixpair.py
+ ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/ps3/sixwatch.py
+- DESTINATION lib/python2.7/dist-packages/${APP_NAME_LC}/ps3
++ DESTINATION lib/python2.7/site-packages/${APP_NAME_LC}/ps3
+ COMPONENT kodi-eventclients-common)
+
+ # Install kodi-eventclients-common python files
+@@ -218,7 +218,7 @@
+ "${CORE_SOURCE_DIR}/tools/EventClients/Clients/PS3 BD Remote/ps3_remote.py"
+ ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/xbmcclient.py
+ ${CORE_SOURCE_DIR}/tools/EventClients/lib/python/zeroconf.py
+- DESTINATION lib/python2.7/dist-packages/${APP_NAME_LC}
++ DESTINATION lib/python2.7/site-packages/${APP_NAME_LC}
+ COMPONENT kodi-eventclients-common)
+
+ # Install kodi-eventclients-common icons
diff --git a/abs/extra/kodi/kodi.install b/abs/extra/kodi/kodi.install
index 01c138d..e271256 100644
--- a/abs/extra/kodi/kodi.install
+++ b/abs/extra/kodi/kodi.install
@@ -1,19 +1,10 @@
post_install() {
- update_icons
gen_lib_xml.py
}
post_upgrade() {
- update_icons
}
post_remove() {
- update_icons
gen_lib_xml.py
}
-
-update_icons() {
- type -p gtk-update-icon-cache > /dev/null 2>&1 && usr/bin/gtk-update-icon-cache -qtf usr/share/icons/hicolor
- type -p update-desktop-database > /dev/null 2>&1 && usr/bin/update-desktop-database -q usr/share/applications
- return 0
-}