diff options
51 files changed, 390 insertions, 100 deletions
diff --git a/addons/webinterface.default/index.html b/addons/webinterface.default/index.html index df3a5618ed..40b53037d0 100755 --- a/addons/webinterface.default/index.html +++ b/addons/webinterface.default/index.html @@ -1,10 +1,10 @@ <!DOCTYPE html> <html> <head> - <title>XBMC</title> + <title>Kodi</title> <meta http-equiv="Content-Language" content="EN" /> <meta http-equiv="Content-Type" content="UTF-8" /> - <!-- <link rel="search" href="provider.xml" type="application/opensearchdescription+xml" title="XBMC Library" /> --> + <!-- <link rel="search" href="provider.xml" type="application/opensearchdescription+xml" title="Kodi Library" /> --> <link rel="icon" href="favicon.ico" type="image/x-icon"> <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"> <!-- <link href="/images/logo.png" rel="image_src" /> --> diff --git a/configure.in b/configure.in index 3d54afa39f..0474a74c8f 100644 --- a/configure.in +++ b/configure.in @@ -2344,7 +2344,7 @@ fi if test "x$use_upnp" != "xno"; then final_message="$final_message\n UPnP support:\t\tYes" USE_UPNP=1 - UPNP_DEFINES='-DNPT_CONFIG_ENABLE_LOGGING -DPLT_HTTP_DEFAULT_USER_AGENT="\"UPnP/1.0 DLNADOC/1.50 XBMC\"" -DPLT_HTTP_DEFAULT_SERVER="\"UPnP/1.0 DLNADOC/1.50 XBMC\""' + UPNP_DEFINES='-DNPT_CONFIG_ENABLE_LOGGING -DPLT_HTTP_DEFAULT_USER_AGENT="\"UPnP/1.0 DLNADOC/1.50 Kodi\"" -DPLT_HTTP_DEFAULT_SERVER="\"UPnP/1.0 DLNADOC/1.50 Kodi\""' AC_DEFINE([USE_UPNP], [1], [Define to 1 to enable UPnP support.]) else USE_UPNP=0 diff --git a/language/English/strings.po b/language/English/strings.po index ca03c3c432..3b51f4984d 100755 --- a/language/English/strings.po +++ b/language/English/strings.po @@ -12686,7 +12686,7 @@ msgstr "" #. Info dialog after migrating userdata from xbmc to kodi #: xbmc/Application.cpp msgctxt "#24129" -msgid "The configuration of XBMC has been moved to the new location for Kodi. Please refer to http://kodi.wiki/view/Migration_from_XBMC_to_Kodi - this message will not be shown again!" +msgid "The configuration of XBMC has been moved to the new location for Kodi. Please refer to http://kodi.wiki/view/Migration - this message will not be shown again!" msgstr "" #empty strings from id 24130 to 24998 diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h index 0f7c892422..9e87599955 100644 --- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h +++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h @@ -97,8 +97,8 @@ #define PLT_FILTER_MASK_XBMC_DATEADDED NPT_UINT64_C(0x0000100000000000) #define PLT_FILTER_MASK_XBMC_RATING NPT_UINT64_C(0x0000200000000000) -#define PLT_FILTER_MASK_XBMC_VOTES NPT_UINT64_C(0x0000300000000000) -#define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000400000000000) +#define PLT_FILTER_MASK_XBMC_VOTES NPT_UINT64_C(0x0000400000000000) +#define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000800000000000) #define PLT_FILTER_FIELD_TITLE "dc:title" #define PLT_FILTER_FIELD_CREATOR "dc:creator" diff --git a/lib/libUPnP/patches/0033-platinum-fix-filter-mask-values-of-xbmc-votes-and-xb.patch b/lib/libUPnP/patches/0033-platinum-fix-filter-mask-values-of-xbmc-votes-and-xb.patch new file mode 100644 index 0000000000..072914b5ba --- /dev/null +++ b/lib/libUPnP/patches/0033-platinum-fix-filter-mask-values-of-xbmc-votes-and-xb.patch @@ -0,0 +1,28 @@ +From 210409361c07945de187be139519ff98d81919ee Mon Sep 17 00:00:00 2001 +From: montellese <montellese@xbmc.org> +Date: Sat, 29 Nov 2014 19:47:45 +0100 +Subject: [PATCH] platinum: fix filter mask values of xbmc:votes and + xbmc:artwork + +--- + lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h +index 0f7c892..9e87599 100644 +--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h ++++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltDidl.h +@@ -97,8 +97,8 @@ + + #define PLT_FILTER_MASK_XBMC_DATEADDED NPT_UINT64_C(0x0000100000000000) + #define PLT_FILTER_MASK_XBMC_RATING NPT_UINT64_C(0x0000200000000000) +-#define PLT_FILTER_MASK_XBMC_VOTES NPT_UINT64_C(0x0000300000000000) +-#define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000400000000000) ++#define PLT_FILTER_MASK_XBMC_VOTES NPT_UINT64_C(0x0000400000000000) ++#define PLT_FILTER_MASK_XBMC_ARTWORK NPT_UINT64_C(0x0000800000000000) + + #define PLT_FILTER_FIELD_TITLE "dc:title" + #define PLT_FILTER_FIELD_CREATOR "dc:creator" +-- +1.9.4.msysgit.2 + diff --git a/lib/libdvd/libdvdread/src/dvd_input.c b/lib/libdvd/libdvdread/src/dvd_input.c index 4a0252431a..7efff01acf 100644 --- a/lib/libdvd/libdvdread/src/dvd_input.c +++ b/lib/libdvd/libdvdread/src/dvd_input.c @@ -217,12 +217,14 @@ static int file_read(dvd_input_t dev, void *buffer, int blocks, int flags) { size_t len; ssize_t ret; + char *buf; + buf = (char*) buffer; len = (size_t)blocks * DVD_VIDEO_LB_LEN; while(len > 0) { - ret = read(dev->fd, buffer, len); + ret = read(dev->fd, buf, len); if(ret < 0) { /* One of the reads failed, too bad. We won't even bother @@ -241,6 +243,7 @@ static int file_read(dvd_input_t dev, void *buffer, int blocks, int flags) return (int) (bytes / DVD_VIDEO_LB_LEN); } + buf += ret; len -= ret; } diff --git a/lib/libdvd/patches/07-libdvdread-fix-partial-read.diff b/lib/libdvd/patches/07-libdvdread-fix-partial-read.diff new file mode 100644 index 0000000000..9685cd3dd8 --- /dev/null +++ b/lib/libdvd/patches/07-libdvdread-fix-partial-read.diff @@ -0,0 +1,30 @@ +see upstream patch here https://mailman.videolan.org/pipermail/libdvdnav-devel/2014-November/000346.html + +diff --git a/lib/libdvd/libdvdread/src/dvd_input.c b/lib/libdvd/libdvdread/src/dvd_input.c +index 4a02524..7efff01 100644 +--- a/lib/libdvd/libdvdread/src/dvd_input.c ++++ b/lib/libdvd/libdvdread/src/dvd_input.c +@@ -217,12 +217,14 @@ static int file_read(dvd_input_t dev, void *buffer, int blocks, int flags) + { + size_t len; + ssize_t ret; ++ char *buf; + ++ buf = (char*) buffer; + len = (size_t)blocks * DVD_VIDEO_LB_LEN; + + while(len > 0) { + +- ret = read(dev->fd, buffer, len); ++ ret = read(dev->fd, buf, len); + + if(ret < 0) { + /* One of the reads failed, too bad. We won't even bother +@@ -241,6 +243,7 @@ static int file_read(dvd_input_t dev, void *buffer, int blocks, int flags) + return (int) (bytes / DVD_VIDEO_LB_LEN); + } + ++ buf += ret; + len -= ret; + } + diff --git a/project/VS2010Express/XBMC.vcxproj b/project/VS2010Express/XBMC.vcxproj index 9c36fae5f4..ce1b60ac8e 100644 --- a/project/VS2010Express/XBMC.vcxproj +++ b/project/VS2010Express/XBMC.vcxproj @@ -76,7 +76,7 @@ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <PreprocessorDefinitions>NOMINMAX;_USE_32BIT_TIME_T;HAS_DX;D3D_DEBUG_INFO;__STDC_CONSTANT_MACROS;_SECURE_SCL=0;TAGLIB_STATIC;NPT_CONFIG_ENABLE_LOGGING;PLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 XBMC";PLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50";%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>NOMINMAX;_USE_32BIT_TIME_T;HAS_DX;D3D_DEBUG_INFO;__STDC_CONSTANT_MACROS;_SECURE_SCL=0;TAGLIB_STATIC;NPT_CONFIG_ENABLE_LOGGING;PLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 Kodi";PLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 Kodi";%(PreprocessorDefinitions)</PreprocessorDefinitions> <ExceptionHandling>Async</ExceptionHandling> <PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> @@ -108,7 +108,7 @@ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Testsuite|Win32'"> <ClCompile> <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;..\..\lib\gtest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <PreprocessorDefinitions>_CONSOLE;NOMINMAX;_USE_32BIT_TIME_T;HAS_DX;D3D_DEBUG_INFO;__STDC_CONSTANT_MACROS;_SECURE_SCL=0;TAGLIB_STATIC;NPT_CONFIG_ENABLE_LOGGING;PLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 XBMC";PLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50";%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>_CONSOLE;NOMINMAX;_USE_32BIT_TIME_T;HAS_DX;D3D_DEBUG_INFO;__STDC_CONSTANT_MACROS;_SECURE_SCL=0;TAGLIB_STATIC;NPT_CONFIG_ENABLE_LOGGING;PLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 Kodi";PLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 Kodi";%(PreprocessorDefinitions)</PreprocessorDefinitions> <ExceptionHandling>Async</ExceptionHandling> <PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> @@ -143,7 +143,7 @@ <ClCompile> <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions> <AdditionalIncludeDirectories>..\..\;..\..\xbmc\;..\..\xbmc\cores\dvdplayer;..\..\xbmc\win32;..\..\lib;..\..\lib\win32\ffmpeg;..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32;..\..\lib\win32\pcre;..\..\lib\win32;..\..\xbmc\cores\AudioEngine\;..\..\addons\library.xbmc.gui;..\..\addons\library.xbmc.addon;..\..\addons\library.xbmc.pvr;..\..\addons\library.xbmc.codec;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <PreprocessorDefinitions>NOMINMAX;_USE_32BIT_TIME_T;HAS_DX;__STDC_CONSTANT_MACROS;TAGLIB_STATIC;NPT_CONFIG_ENABLE_LOGGING;PLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 XBMC";PLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50";%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>NOMINMAX;_USE_32BIT_TIME_T;HAS_DX;__STDC_CONSTANT_MACROS;TAGLIB_STATIC;NPT_CONFIG_ENABLE_LOGGING;PLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 Kodi";PLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 Kodi";%(PreprocessorDefinitions)</PreprocessorDefinitions> <ExceptionHandling>Async</ExceptionHandling> <PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> diff --git a/project/VS2010Express/libPlatinum.vcxproj b/project/VS2010Express/libPlatinum.vcxproj index a4da7cc9e3..403ab0c2b9 100644 --- a/project/VS2010Express/libPlatinum.vcxproj +++ b/project/VS2010Express/libPlatinum.vcxproj @@ -51,7 +51,7 @@ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> <AdditionalIncludeDirectories>..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32</AdditionalIncludeDirectories> - <PreprocessorDefinitions>_LIB;NPT_CONFIG_ENABLE_LOGGING;PLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 XBMC";PLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 XBMC";_SECURE_SCL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>_LIB;NPT_CONFIG_ENABLE_LOGGING;PLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 Kodi";PLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 Kodi";_SECURE_SCL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PrecompiledHeader> </PrecompiledHeader> <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings> @@ -81,7 +81,7 @@ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ClCompile> <AdditionalIncludeDirectories>..\..\lib\libUPnP;..\..\lib\libUPnP\Platinum\Source\Platinum;..\..\lib\libUPnP\Platinum\Source\Core;..\..\lib\libUPnP\Platinum\Source\Extras;..\..\lib\libUPnP\Platinum\Source\Devices\MediaServer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaRenderer;..\..\lib\libUPnP\Platinum\Source\Devices\MediaConnect;..\..\lib\libUPnP\Neptune\Source\Core;..\..\lib\libUPnP\Neptune\Source\System\Win32</AdditionalIncludeDirectories> - <PreprocessorDefinitions>_LIB;NPT_CONFIG_ENABLE_LOGGING;PLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 XBMC";PLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 XBMC";%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>_LIB;NPT_CONFIG_ENABLE_LOGGING;PLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 Kodi";PLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 Kodi";%(PreprocessorDefinitions)</PreprocessorDefinitions> <PrecompiledHeader> </PrecompiledHeader> <DisableSpecificWarnings>4996;%(DisableSpecificWarnings)</DisableSpecificWarnings> diff --git a/project/Win32BuildSetup/BuildSetup.bat b/project/Win32BuildSetup/BuildSetup.bat index 8883607992..d262e80929 100644 --- a/project/Win32BuildSetup/BuildSetup.bat +++ b/project/Win32BuildSetup/BuildSetup.bat @@ -163,10 +163,13 @@ set WORKSPACE=%CD%\..\.. Echo exclude.txt>>exclude.txt Echo xbmc.log>>exclude.txt Echo xbmc.old.log>>exclude.txt + Echo kodi.log>>exclude.txt + Echo kodi.old.log>>exclude.txt rem Exclude userdata files Echo userdata\advancedsettings.xml>>exclude.txt Echo userdata\guisettings.xml>>exclude.txt Echo userdata\mediasources.xml>>exclude.txt + Echo userdata\ModeLines_template.xml>>exclude.txt Echo userdata\passwords.xml>>exclude.txt Echo userdata\profiles.xml>>exclude.txt Echo userdata\sources.xml>>exclude.txt diff --git a/project/Win32BuildSetup/genNsisInstaller.nsi b/project/Win32BuildSetup/genNsisInstaller.nsi index 1577d11ec2..d320dfd6a1 100644 --- a/project/Win32BuildSetup/genNsisInstaller.nsi +++ b/project/Win32BuildSetup/genNsisInstaller.nsi @@ -42,8 +42,11 @@ !define MUI_HEADERIMAGE !define MUI_ICON "..\..\tools\windows\packaging\media\application.ico" + !define MUI_UNICON "..\..\tools\windows\packaging\media\application.ico" !define MUI_HEADERIMAGE_BITMAP "..\..\tools\windows\packaging\media\installer\header.bmp" + !define MUI_HEADERIMAGE_UNBITMAP "..\..\tools\windows\packaging\media\installer\header.bmp" !define MUI_WELCOMEFINISHPAGE_BITMAP "..\..\tools\windows\packaging\media\installer\welcome-left.bmp" + !define MUI_UNWELCOMEFINISHPAGE_BITMAP "..\..\tools\windows\packaging\media\installer\welcome-left.bmp" !define MUI_COMPONENTSPAGE_SMALLDESC !define MUI_FINISHPAGE_LINK "Please visit ${WEBSITE} for more information." !define MUI_FINISHPAGE_LINK_LOCATION "${WEBSITE}" @@ -108,7 +111,7 @@ Function HandleUserdataMigration ${If} ${FileExists} "$APPDATA\XBMC\*.*" ${AndIfNot} ${FileExists} "$APPDATA\${APP_NAME}\*.*" Rename "$APPDATA\XBMC\" "$APPDATA\${APP_NAME}\" - MessageBox MB_OK|MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND "Your current XBMC userdata folder was moved to the new ${APP_NAME} userdata location.$\nThis to make the transition as smooth as possible without any user interactions needed." + MessageBox MB_OK|MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND "Your current XBMC settings and library data were moved to the new ${APP_NAME} userdata location.$\nThis is to make the transition without any user interaction needed." ;mark that it was migrated in the filesystem - kodi will show another info message during first Kodi startup ;for really making sure that the user has read that message. FileOpen $0 "$APPDATA\${APP_NAME}\.kodi_data_was_migrated" w @@ -118,7 +121,7 @@ Function HandleUserdataMigration ; old installation was found but not uninstalled - inform the user ; that his userdata is not automatically migrted ${If} $OldXBMCInstallationFound == "1" - MessageBox MB_OK|MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND "There was a former XBMC Installation detected but you didn't uninstall it. The older profile data will not be moved to the ${APP_NAME} userdata location. ${APP_NAME} will use default profile settings." + MessageBox MB_OK|MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND "There was a former XBMC Installation detected but you didn't uninstall it. The older settings and library data will not be moved to the ${APP_NAME} userdata location. ${APP_NAME} will use the default settings." ${EndIf} ${EndIf} FunctionEnd @@ -130,7 +133,7 @@ Function HandleOldXBMCInstallation ;ask if a former XBMC installation should be uninstalled if detected ${IfNot} $INSTDIR_XBMC_OLD == "" StrCpy $OldXBMCInstallationFound "1" - MessageBox MB_YESNO|MB_ICONQUESTION "A previous XBMC installation was detected. Would you like to uninstall it?" IDYES true IDNO false + MessageBox MB_YESNO|MB_ICONQUESTION "You are upgrading from XBMC to ${APP_NAME}. Would you like to copy your settings and library data from XBMC to ${APP_NAME}?$\nWARNING: If you do so, XBMC will be completely un-installed and removed. It is recommended that you back up your library before continuing.$\nFor more information visit http://kodi.wiki/view/Userdata " IDYES true IDNO false true: DetailPrint "Uninstalling $INSTDIR_XBMC" SetDetailsPrint none @@ -156,7 +159,7 @@ Function HandleOldKodiInstallation ${IfNot} $CleanDestDir == "0" ${AndIfNot} $INSTDIR_KODI == "" ${AndIfNot} $INSTDIR_KODI == $INSTDIR - MessageBox MB_YESNO|MB_ICONQUESTION "A previous ${APP_NAME} installation in a different folder was detected. Would you like to uninstall it?" IDYES true IDNO false + MessageBox MB_YESNO|MB_ICONQUESTION "A previous ${APP_NAME} installation in a different folder was detected. Would you like to uninstall it?$\nYour current settings and library data will be kept intact." IDYES true IDNO false true: DetailPrint "Uninstalling $INSTDIR_KODI" SetDetailsPrint none @@ -174,7 +177,7 @@ Function HandleKodiInDestDir ;if former Kodi installation was detected in the destination directory - uninstall it first ${IfNot} $INSTDIR == "" ${AndIf} ${FileExists} "$INSTDIR\uninstall.exe" - MessageBox MB_YESNO|MB_ICONQUESTION "A previous installation was detected in the selected destination folder. Do you really want to overwrite it?" IDYES true IDNO false + MessageBox MB_YESNO|MB_ICONQUESTION "A previous installation was detected in the selected destination folder. Do you really want to overwrite it?$\nYour settings and library data will be kept intact." IDYES true IDNO false true: StrCpy $CleanDestDir "1" Goto done @@ -229,15 +232,8 @@ Section "${APP_NAME}" SecAPP File /r "${app_root}\application\sounds\*.*" SetOutPath "$INSTDIR\system" File /r "${app_root}\application\system\*.*" - - ;Turn off overwrite to prevent files in APPDATA\Kodi\userdata\ from being overwritten - SetOverwrite off - IfFileExists $INSTDIR\userdata\*.* 0 +2 - SetOutPath "$APPDATA\${APP_NAME}\userdata" - File /r "${app_root}\application\userdata\*.*" - - ;Turn on overwrite for rest of install - SetOverwrite on + SetOutPath "$INSTDIR\userdata" + File /r "${app_root}\application\userdata\*.*" ;Store installation folder WriteRegStr HKCU "Software\${APP_NAME}" "" $INSTDIR @@ -315,19 +311,18 @@ Function un.UnPageProfile Abort ${EndIf} - ${NSD_CreateLabel} 0 0 100% 12u "Do you want to delete the profile folder?" + ${NSD_CreateLabel} 0 0 100% 12u "Do you want to delete the profile folder which contains your ${APP_NAME} settings and library data?" Pop $0 ${NSD_CreateText} 0 13u 100% 12u "$APPDATA\${APP_NAME}\" Pop $UnPageProfileEditBox SendMessage $UnPageProfileEditBox ${EM_SETREADONLY} 1 0 - ${NSD_CreateLabel} 0 46u 100% 24u "Leave unchecked to keep the profile folder for later use or check to delete the profile folder." + ${NSD_CreateLabel} 0 30u 100% 24u "Leave the option box below unchecked to keep the profile folder which contains ${APP_NAME}'s settings and library data for later use. If you are sure you want to delete the profile folder you may check the option box.$\nWARNING: Deletion of the profile folder cannot be undone and you will lose all settings and library data." Pop $0 - ${NSD_CreateCheckbox} 0 71u 100% 8u "Yes, also delete the profile folder." + ${NSD_CreateCheckbox} 0 71u 100% 8u "Yes, I am sure and grant permission to also delete the profile folder." Pop $UnPageProfileCheckbox - nsDialogs::Show FunctionEnd @@ -346,6 +341,7 @@ Section "Uninstall" RMDir /r "$INSTDIR\media" RMDir /r "$INSTDIR\sounds" RMDir /r "$INSTDIR\system" + RMDir /r "$INSTDIR\userdata" Delete "$INSTDIR\*.*" ;Un-install User Data if option is checked, otherwise skip diff --git a/system/keyboardlayouts.xml b/system/keyboardlayouts.xml index a2cc711914..b531de7cff 100644 --- a/system/keyboardlayouts.xml +++ b/system/keyboardlayouts.xml @@ -124,6 +124,26 @@ Default font lacks support for all characters <row>`~</row> </keyboard> </layout> + <layout name="Hungarian QWERTZ"> + <keyboard> + <row>0123456789öüó</row> + <row>qwertzuiopőú</row> + <row>asdfghjkléáű</row> + <row>íyxcvbnm,.-</row> + </keyboard> + <keyboard modifiers="shift"> + <row>0123456789ÖÜÓ</row> + <row>QWERTZUIOPŐÚ</row> + <row>ASDFGHJKLÉÁŰ</row> + <row>ÍYXCVBNM,.-</row> + </keyboard> + <keyboard modifiers="symbol,shift+symbol"> + <row>§'"+!/=()~</row> + <row>^;\|Ä€Í÷×ä</row> + <row>đĐ[]íłŁ$ߤ</row> + <row>#@{}<>*?:_</row> + </keyboard> + </layout> <layout name="Polish QWERTY"> <keyboard> <row>`1234567890-</row> diff --git a/tools/Linux/packaging/mk-debian-package.sh b/tools/Linux/packaging/mk-debian-package.sh index 4bdab82629..aea342d09d 100755 --- a/tools/Linux/packaging/mk-debian-package.sh +++ b/tools/Linux/packaging/mk-debian-package.sh @@ -99,6 +99,7 @@ function archiveRepo { cd $REPO_DIR || exit 1 git clean -xfd echo $REV > VERSION + tools/depends/target/ffmpeg/autobuild.sh -d DEST="kodi-${RELEASEV}~git$(date '+%Y%m%d.%H%M')-${TAG}" [[ -d debian ]] && rm -rf debian cd .. diff --git a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in index b1d73c724f..7181e87550 100644 --- a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in +++ b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in @@ -20,7 +20,6 @@ public class Main extends NativeActivity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - getWindow().setFormat(PixelFormat.TRANSPARENT); } @Override @@ -35,6 +34,13 @@ public class Main extends NativeActivity } @Override + public void onStart() + { + super.onStart(); + getWindow().setFormat(PixelFormat.TRANSPARENT); + } + + @Override public void onResume() { super.onResume(); diff --git a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in index b5f46fcdda..d3a3efb8ef 100644 --- a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in +++ b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in @@ -502,8 +502,7 @@ public class Splash extends Activity { } private boolean CheckCpuFeature(String feat) { - final Pattern FeaturePattern = Pattern.compile(":.*?\\s" + feat - + "(?:\\s|$)"); + final Pattern FeaturePattern = Pattern.compile("(?i):.*?\\s" + feat + "(?:\\s|$)"); Matcher m = FeaturePattern.matcher(mCpuinfo); return m.find(); } @@ -612,12 +611,13 @@ public class Splash extends Activity { if (curArch.equalsIgnoreCase("arm")) { // arm arch: check if the cpu supports neon boolean ret = ParseCpuFeature(); + //Log.d(TAG, "/proc/cpuinfo = " + mCpuinfo); if (!ret) { mErrorMsg = "Error! Cannot parse CPU features."; Log.e(TAG, mErrorMsg); mState = InError; } else { - ret = CheckCpuFeature("neon"); + ret = CheckCpuFeature("neon") || CheckCpuFeature("aarch64"); //aarch64 is always neon if (!ret) { mErrorMsg = "This @APP_NAME@ package is not compatible with your device (NEON).\nPlease check the <a href=\"http://wiki.kodi.tv/index.php?title=XBMC_for_Android_specific_FAQ\">Kodi Android wiki</a> for more information."; Log.e(TAG, mErrorMsg); diff --git a/tools/darwin/Configurations/Common.xcconfig.in b/tools/darwin/Configurations/Common.xcconfig.in index f682c6ce3f..0a9a74460e 100644 --- a/tools/darwin/Configurations/Common.xcconfig.in +++ b/tools/darwin/Configurations/Common.xcconfig.in @@ -21,6 +21,6 @@ APP_NAME=@APP_NAME@ XBMC_DEPENDS_ROOT = @DEPENDS_ROOT_FOR_XCODE@ -XBMC_GCC_PREPROCESSOR_DEFINITIONS_COMMON = TARGET_POSIX TARGET_DARWIN _LINUX _REENTRANT _FILE_DEFINED _FILE_OFFSET_BITS=64 _LARGEFILE64_SOURCE __STDC_CONSTANT_MACROS HAVE_CONFIG_H HAS_SPC_CODEC NPT_CONFIG_ENABLE_LOGGINGPLT_HTTP_DEFAULT_USER_AGENT="\"UPnP/1.0 DLNADOC/1.50 XBMC\"" PLT_HTTP_DEFAULT_SERVER="\"UPnP/1.0 DLNADOC/1.50 XBMC\"" +XBMC_GCC_PREPROCESSOR_DEFINITIONS_COMMON = TARGET_POSIX TARGET_DARWIN _LINUX _REENTRANT _FILE_DEFINED _FILE_OFFSET_BITS=64 _LARGEFILE64_SOURCE __STDC_CONSTANT_MACROS HAVE_CONFIG_H HAS_SPC_CODEC NPT_CONFIG_ENABLE_LOGGINGPLT_HTTP_DEFAULT_USER_AGENT="\"UPnP/1.0 DLNADOC/1.50 Kodi\"" PLT_HTTP_DEFAULT_SERVER="\"UPnP/1.0 DLNADOC/1.50 Kodi\"" DEBUG_INFORMATION_FORMAT = dwarf-with-dsym diff --git a/tools/depends/target/boblight/01-fix_fpermissive.patch b/tools/depends/target/boblight/01-fix_fpermissive.patch new file mode 100644 index 0000000000..29727a67bb --- /dev/null +++ b/tools/depends/target/boblight/01-fix_fpermissive.patch @@ -0,0 +1,11 @@ +--- src/util/miscorig.cpp 2014-11-27 18:31:54.778680630 +0000 ++++ src/util/misc.cpp 2014-11-27 18:32:21.986680437 +0000 +@@ -64,7 +64,7 @@ + //convert . or , to the current locale for correct conversion of ascii float + void ConvertFloatLocale(std::string& strfloat) + { +- static struct lconv* locale = localeconv(); ++ static const struct lconv* locale = localeconv(); + + size_t pos = strfloat.find_first_of(",."); + diff --git a/tools/depends/target/boblight/02-fixandroid.patch b/tools/depends/target/boblight/02-fixandroid.patch new file mode 100644 index 0000000000..8ce63e5b12 --- /dev/null +++ b/tools/depends/target/boblight/02-fixandroid.patch @@ -0,0 +1,35 @@ +--- src/util/daemonizeorig.cpp 2014-11-27 18:36:30.474678137 +0000 ++++ src/util/daemonize.cpp 2014-11-27 18:36:44.226678082 +0000 +@@ -35,10 +35,12 @@ + if (setsid() < 0) + fprintf(stderr, "setsid(): %s", GetErrno().c_str()); + ++#if !defined(__ANDROID__) + //route stdout and stderr to /dev/null + fclose(stdout); + stdout = fopen("/dev/null", "w"); + fclose(stderr); + stderr = fopen("/dev/null", "w"); ++#endif + } + +--- src/lib/boblightorig.h 2014-11-27 18:38:37.174677063 +0000 ++++ src/lib/boblight.h 2014-11-27 18:40:14.810676123 +0000 +@@ -61,7 +61,7 @@ + //gets a functionpointer from dlsym, and returns char* from dlerror if it didn't work + #define BOBLIGHT_FUNCTION(returnvalue, name, arguments) \ + name = BOBLIGHT_CAST(returnvalue (*) arguments)(dlsym(p_boblight, #name)); \ +- { char* error = dlerror(); if (error) return error; } ++ { char* error = (char *)dlerror(); if (error) return error; } + + void* p_boblight = NULL; //where we put the lib + +@@ -79,7 +79,7 @@ + + p_boblight = dlopen(filename, RTLD_NOW); + if (p_boblight == NULL) +- return dlerror(); ++ return (char *)dlerror(); + + //generate dlsym lines + #include "boblight-functions.h" diff --git a/tools/depends/target/boblight/Makefile b/tools/depends/target/boblight/Makefile new file mode 100644 index 0000000000..bd961ec622 --- /dev/null +++ b/tools/depends/target/boblight/Makefile @@ -0,0 +1,53 @@ +include ../../Makefile.include +DEPS= ../../Makefile.include Makefile + +#hint for building a fat lib - "lipo -arch i386 libboblight-i386.dylib -arch x86_64 libboblight-x86_64.dylib -output libboblight-fat.dylib" + +# lib name, version +LIBNAME=libboblight +VERSION=r478 +SOURCE=$(LIBNAME)-$(VERSION) +ARCHIVE=$(SOURCE).tar.gz + +# configuration settings +CONFIGURE=./configure --prefix=$(PREFIX) \ + --without-opengl \ + --without-portaudio \ + --without-x11 \ + --without-libusb + +LIBDYLIB=$(PLATFORM)/src/.libs/$(LIBNAME).a + +CLEAN_FILES=$(ARCHIVE) $(PLATFORM) + +all: $(LIBDYLIB) .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) + cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) + cd $(PLATFORM); patch -p0 < ../01-fix_fpermissive.patch + cd $(PLATFORM); patch -p0 < ../02-fixandroid.patch + cd $(PLATFORM); autoreconf -vif + cd $(PLATFORM); $(CONFIGURE) + +$(LIBDYLIB): $(PLATFORM) + $(MAKE) -C $(PLATFORM) + +.installed-$(PLATFORM): $(LIBDYLIB) +ifeq ($(OS),android) + rm -f $(PLATFORM)/src/.libs/libboblight.la $(PLATFORM)/src/.libs/libboblight.so $(PLATFORM)/src/.libs/libboblight.so.0 + mv -f $(PLATFORM)/src/.libs/libboblight.so.0.0.0 $(PLATFORM)/src/.libs/libboblight.so + $(RPL) -e "libboblight.so.0" "libboblight.so\x00\x00" $(PLATFORM)/src/.libs/libboblight.so + -$(READELF) --dynamic $(PLATFORM)/src/.libs/libboblight.so | grep ibrary +endif + echo "libboblight isn't a dependency of XBMC and won't be installed" + touch $@ +clean: + $(MAKE) -C $(PLATFORM) clean + rm -r .installed-$(PLATFORM) + +distclean:: + rm -rf $(PLATFORM) .installed-$(PLATFORM) diff --git a/tools/depends/target/sqlite3/Makefile b/tools/depends/target/sqlite3/Makefile index 9bc17fce92..28725e0c85 100644 --- a/tools/depends/target/sqlite3/Makefile +++ b/tools/depends/target/sqlite3/Makefile @@ -27,6 +27,9 @@ $(TARBALLS_LOCATION)/$(ARCHIVE): $(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS) rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM) cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE) +ifeq ($(OS),android) + cd $(PLATFORM); patch -p0 < ../fix-32bits-on-64bits.patch +endif cd $(PLATFORM); $(CONFIGURE) $(LIBDYLIB): $(PLATFORM) diff --git a/tools/depends/target/sqlite3/fix-32bits-on-64bits.patch b/tools/depends/target/sqlite3/fix-32bits-on-64bits.patch new file mode 100644 index 0000000000..cf4d75be1b --- /dev/null +++ b/tools/depends/target/sqlite3/fix-32bits-on-64bits.patch @@ -0,0 +1,11 @@ +--- sqlite3.c.orig 2014-11-19 13:14:16.633721369 +0100 ++++ sqlite3.c 2014-11-19 13:23:23.733711563 +0100 +@@ -25301,7 +25301,7 @@ + #if OS_VXWORKS + struct vxworksFileId *pId; /* Unique file ID for vxworks. */ + #else +- ino_t ino; /* Inode number */ ++ unsigned long long ino; /* Inode number */ + #endif + }; + diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp index 875ca391d6..9162708526 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp @@ -4364,8 +4364,9 @@ void CApplication::UpdateFileState() // Did the file change? if (m_progressTrackingItem->GetPath() != "" && m_progressTrackingItem->GetPath() != CurrentFile()) { - // Ignore for PVR channels, PerformChannelSwitch takes care of this - if (!m_progressTrackingItem->IsPVRChannel()) + // Ignore for PVR channels, PerformChannelSwitch takes care of this. + // Also ignore playlists as correct video settings have already been saved in PlayFile() - we're causing off-by-1 errors here. + if (!m_progressTrackingItem->IsPVRChannel() && g_playlistPlayer.GetCurrentPlaylist() == PLAYLIST_NONE) SaveFileState(); // Reset tracking item diff --git a/xbmc/GUIInfoManager.cpp b/xbmc/GUIInfoManager.cpp index e56bcb8a3b..5d83e37ddb 100644 --- a/xbmc/GUIInfoManager.cpp +++ b/xbmc/GUIInfoManager.cpp @@ -1758,10 +1758,7 @@ CStdString CGUIInfoManager::GetLabel(int info, int contextWindow, std::string *f { CURL url(((CGUIMediaWindow*)window)->CurrentDirectory().GetPath()); if (url.IsProtocol("plugin")) - { - strLabel = url.GetFileName(); - URIUtils::RemoveSlashAtEnd(strLabel); - } + strLabel = URIUtils::GetFileName(url.GetHostName()); } break; } diff --git a/xbmc/android/activity/XBMCApp.cpp b/xbmc/android/activity/XBMCApp.cpp index 62cf874825..4a336e7257 100644 --- a/xbmc/android/activity/XBMCApp.cpp +++ b/xbmc/android/activity/XBMCApp.cpp @@ -343,7 +343,7 @@ int CXBMCApp::android_printf(const char *format, ...) // For use before CLog is setup by XBMC_Run() va_list args; va_start(args, format); - int result = __android_log_vprint(ANDROID_LOG_VERBOSE, "XBMC", format, args); + int result = __android_log_vprint(ANDROID_LOG_VERBOSE, "Kodi", format, args); va_end(args); return result; } diff --git a/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp b/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp index 2bd41cd8a3..68ed4f143f 100644 --- a/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp +++ b/xbmc/cores/DllLoader/exports/emu_msvcrt.cpp @@ -530,7 +530,10 @@ extern "C" if (bWrite) bResult = pFile->OpenForWrite(CUtil::ValidatePath(str), bOverwrite); else - bResult = pFile->Open(CUtil::ValidatePath(str), READ_TRUNCATED); + bResult = pFile->Open(CUtil::ValidatePath(str), 0 /* READ_TRUNCATED */); // Disabled READ_TRUNCATED for release + /* Looks that libdvdnav / libdvdread / libdvdcss have bugs and do not process correctly partial reads */ + /* All found bug were eliminated but for safety READ_TRUNCATED is disabled for Helix release */ + /* TODO: enable READ_TRUNCATED after release of Helix */ if (bResult) { diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp index 468c51b2a0..ae7f649805 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGL.cpp @@ -1481,8 +1481,8 @@ void CLinuxRendererGL::RenderFromFBO() m_fbo.fbo.SetFiltering(GL_TEXTURE_2D, filter); m_pVideoFilterShader->SetSourceTexture(0); - m_pVideoFilterShader->SetWidth(m_fbo.width); - m_pVideoFilterShader->SetHeight(m_fbo.height); + m_pVideoFilterShader->SetWidth(m_sourceWidth); + m_pVideoFilterShader->SetHeight(m_sourceHeight); //disable non-linear stretch when a dvd menu is shown, parts of the menu are rendered through the overlay renderer //having non-linear stretch on breaks the alignment @@ -1502,8 +1502,8 @@ void CLinuxRendererGL::RenderFromFBO() VerifyGLState(); - float imgwidth = m_sourceWidth / m_fbo.width; - float imgheight = m_sourceHeight / m_fbo.height; + float imgwidth = m_fbo.width / m_sourceWidth; + float imgheight = m_fbo.height / m_sourceHeight; glBegin(GL_QUADS); diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecIMX.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecIMX.cpp index e8ccc67717..34db863517 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecIMX.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecIMX.cpp @@ -732,6 +732,13 @@ int CDVDVideoCodecIMX::Decode(BYTE *pData, int iSize, double dts, double pts) m_frameInfo.pExtInfo->nFrmWidth = (((m_frameInfo.pExtInfo->nFrmWidth) + 15) & ~15); m_frameInfo.pExtInfo->nFrmHeight = (((m_frameInfo.pExtInfo->nFrmHeight) + 15) & ~15); + /* quick & dirty fix to get proper timestamping for VP8 codec */ + if (m_decOpenParam.CodecFormat == VPU_V_VP8) + { + idx = VpuFindBuffer(m_frameInfo.pDisplayFrameBuf->pbufY); + m_outputBuffers[idx]->SetPts(pts); + } + retStatus |= VC_PICTURE; } //VPU_DEC_OUTPUT_DIS diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp index ed7bd74853..578b919ac1 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp @@ -146,6 +146,8 @@ bool CVAAPIContext::CreateContext() if (g_advancedSettings.CanLogComponent(LOGVIDEO)) CLog::Log(LOGDEBUG, "VAAPI - initialize version %d.%d", major_version, minor_version); + if (g_advancedSettings.CanLogComponent(LOGVIDEO)) + CLog::Log(LOGDEBUG, "VAAPI - driver in use: %s", vaQueryVendorString(m_display)); QueryCaps(); if (!m_profileCount || !m_attributeCount) diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp index 4218bfc7ae..4147a5764d 100644 --- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp @@ -897,6 +897,12 @@ bool CDVDDemuxFFmpeg::SeekTime(int time, bool backwords, double *startpts) CSingleLock lock(m_critSection); ret = av_seek_frame(m_pFormatContext, -1, seek_pts, backwords ? AVSEEK_FLAG_BACKWARD : 0); + // demuxer will return failure, if you seek behind eof + if (ret < 0 && m_pFormatContext->duration && seek_pts >= (m_pFormatContext->duration + m_pFormatContext->start_time)) + ret = 0; + else if (ret < 0 && m_pInput->IsEOF()) + ret = 0; + if(ret >= 0) UpdateCurrentPTS(); } @@ -910,10 +916,6 @@ bool CDVDDemuxFFmpeg::SeekTime(int time, bool backwords, double *startpts) if(startpts) *startpts = DVD_MSEC_TO_TIME(time); - // demuxer will return failure, if you seek to eof - if (m_pInput->IsEOF() && ret <= 0) - return true; - return (ret >= 0); } diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp index 7d6e69617c..b6bcb8d066 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp @@ -1728,6 +1728,13 @@ void CDVDPlayer::HandlePlaySpeed() error = m_clock.GetClock() - m_SpeedState.lastpts; error *= m_playSpeed / abs(m_playSpeed); + // allow a bigger error when going ff, the faster we go + // the the bigger is the error we allow + if (m_playSpeed > DVD_PLAYSPEED_NORMAL) + { + error /= m_playSpeed / DVD_PLAYSPEED_NORMAL; + } + if(error > DVD_MSEC_TO_TIME(1000)) { error = (int)DVD_TIME_TO_MSEC(m_clock.GetClock()) - m_SpeedState.lastseekpts; diff --git a/xbmc/filesystem/CacheStrategy.cpp b/xbmc/filesystem/CacheStrategy.cpp index c1d1409840..f7b4f0a0e5 100644 --- a/xbmc/filesystem/CacheStrategy.cpp +++ b/xbmc/filesystem/CacheStrategy.cpp @@ -235,17 +235,18 @@ int64_t CSimpleFileCache::Seek(int64_t iFilePosition) return iFilePosition; } -void CSimpleFileCache::Reset(int64_t iSourcePosition, bool clearAnyway) +bool CSimpleFileCache::Reset(int64_t iSourcePosition, bool clearAnyway) { if (!clearAnyway && IsCachedPosition(iSourcePosition)) { m_nReadPosition = m_cacheFileRead->Seek(iSourcePosition - m_nStartPosition, SEEK_SET); - return; + return false; } m_nStartPosition = iSourcePosition; m_nWritePosition = m_cacheFileWrite->Seek(0, SEEK_SET); m_nReadPosition = m_cacheFileRead->Seek(0, SEEK_SET); + return true; } void CSimpleFileCache::EndOfInput() @@ -327,17 +328,26 @@ int64_t CDoubleCache::WaitForData(unsigned int iMinAvail, unsigned int iMillis) int64_t CDoubleCache::Seek(int64_t iFilePosition) { - return m_pCache->Seek(iFilePosition); + /* Check whether position is NOT in our current cache but IS in our old cache. + * This is faster/more efficient than having to possibly wait for data in the + * Seek() call below + */ + if (!m_pCache->IsCachedPosition(iFilePosition) && + m_pCacheOld && m_pCacheOld->IsCachedPosition(iFilePosition)) + { + return CACHE_RC_ERROR; // Request seek event, so caches are swapped + } + + return m_pCache->Seek(iFilePosition); // Normal seek } -void CDoubleCache::Reset(int64_t iSourcePosition, bool clearAnyway) +bool CDoubleCache::Reset(int64_t iSourcePosition, bool clearAnyway) { if (!clearAnyway && m_pCache->IsCachedPosition(iSourcePosition) && (!m_pCacheOld || !m_pCacheOld->IsCachedPosition(iSourcePosition) || m_pCache->CachedDataEndPos() >= m_pCacheOld->CachedDataEndPos())) { - m_pCache->Reset(iSourcePosition, clearAnyway); - return; + return m_pCache->Reset(iSourcePosition, clearAnyway); } if (!m_pCacheOld) { @@ -345,18 +355,18 @@ void CDoubleCache::Reset(int64_t iSourcePosition, bool clearAnyway) if (pCacheNew->Open() != CACHE_RC_OK) { delete pCacheNew; - m_pCache->Reset(iSourcePosition, clearAnyway); - return; + return m_pCache->Reset(iSourcePosition, clearAnyway); } - pCacheNew->Reset(iSourcePosition, clearAnyway); + bool bRes = pCacheNew->Reset(iSourcePosition, clearAnyway); m_pCacheOld = m_pCache; m_pCache = pCacheNew; - return; + return bRes; } - m_pCacheOld->Reset(iSourcePosition, clearAnyway); + bool bRes = m_pCacheOld->Reset(iSourcePosition, clearAnyway); CCacheStrategy *tmp = m_pCacheOld; m_pCacheOld = m_pCache; m_pCache = tmp; + return bRes; } void CDoubleCache::EndOfInput() diff --git a/xbmc/filesystem/CacheStrategy.h b/xbmc/filesystem/CacheStrategy.h index 5067d01b26..9380a77490 100644 --- a/xbmc/filesystem/CacheStrategy.h +++ b/xbmc/filesystem/CacheStrategy.h @@ -50,7 +50,15 @@ public: virtual int64_t WaitForData(unsigned int iMinAvail, unsigned int iMillis) = 0; virtual int64_t Seek(int64_t iFilePosition) = 0; - virtual void Reset(int64_t iSourcePosition, bool clearAnyway=true) = 0; + + /*! + \brief Reset cache position + \param iSourcePosition position to reset to + \param clearAnyway whether to perform a full reset regardless of in cached range already + \return Whether a full reset was performed, or not (e.g. only cache swap) + \sa CCacheStrategy + */ + virtual bool Reset(int64_t iSourcePosition, bool clearAnyway=true) = 0; virtual void EndOfInput(); // mark the end of the input stream so that Read will know when to return EOF virtual bool IsEndOfInput(); @@ -83,7 +91,7 @@ public: virtual int64_t WaitForData(unsigned int iMinAvail, unsigned int iMillis) ; virtual int64_t Seek(int64_t iFilePosition); - virtual void Reset(int64_t iSourcePosition, bool clearAnyway=true); + virtual bool Reset(int64_t iSourcePosition, bool clearAnyway=true); virtual void EndOfInput(); virtual int64_t CachedDataEndPosIfSeekTo(int64_t iFilePosition); @@ -118,7 +126,7 @@ public: virtual int64_t WaitForData(unsigned int iMinAvail, unsigned int iMillis) ; virtual int64_t Seek(int64_t iFilePosition); - virtual void Reset(int64_t iSourcePosition, bool clearAnyway=true); + virtual bool Reset(int64_t iSourcePosition, bool clearAnyway=true); virtual void EndOfInput(); virtual bool IsEndOfInput(); virtual void ClearEndOfInput(); diff --git a/xbmc/filesystem/CircularCache.cpp b/xbmc/filesystem/CircularCache.cpp index 746a64a935..eb8c044959 100644 --- a/xbmc/filesystem/CircularCache.cpp +++ b/xbmc/filesystem/CircularCache.cpp @@ -232,17 +232,19 @@ int64_t CCircularCache::Seek(int64_t pos) return CACHE_RC_ERROR; } -void CCircularCache::Reset(int64_t pos, bool clearAnyway) +bool CCircularCache::Reset(int64_t pos, bool clearAnyway) { CSingleLock lock(m_sync); if (!clearAnyway && IsCachedPosition(pos)) { m_cur = pos; - return; + return false; } m_end = pos; m_beg = pos; m_cur = pos; + + return true; } int64_t CCircularCache::CachedDataEndPosIfSeekTo(int64_t iFilePosition) diff --git a/xbmc/filesystem/CircularCache.h b/xbmc/filesystem/CircularCache.h index f6aa6a792e..3954eaef86 100644 --- a/xbmc/filesystem/CircularCache.h +++ b/xbmc/filesystem/CircularCache.h @@ -42,7 +42,7 @@ public: virtual int64_t WaitForData(unsigned int minimum, unsigned int iMillis) ; virtual int64_t Seek(int64_t pos) ; - virtual void Reset(int64_t pos, bool clearAnyway=true) ; + virtual bool Reset(int64_t pos, bool clearAnyway=true) ; virtual int64_t CachedDataEndPosIfSeekTo(int64_t iFilePosition); virtual int64_t CachedDataEndPos(); diff --git a/xbmc/filesystem/FileCache.cpp b/xbmc/filesystem/FileCache.cpp index 1ac2848316..127d9fbdf6 100644 --- a/xbmc/filesystem/FileCache.cpp +++ b/xbmc/filesystem/FileCache.cpp @@ -44,20 +44,35 @@ public: m_stamp = XbmcThreads::SystemClockMillis(); m_pos = 0; m_pause = 0; + m_size = 0; + m_time = 0; } - void Reset(int64_t pos) + void Reset(int64_t pos, bool bResetAll = true) { m_stamp = XbmcThreads::SystemClockMillis(); m_pos = pos; + + if (bResetAll) + { + m_size = 0; + m_time = 0; + } } unsigned Rate(int64_t pos, unsigned int time_bias = 0) { - const unsigned ts = XbmcThreads::SystemClockMillis() + time_bias; - if (ts == m_stamp) + const unsigned ts = XbmcThreads::SystemClockMillis(); + + m_size += (pos - m_pos); + m_time += (ts - m_stamp); + m_pos = pos; + m_stamp = ts; + + if (m_time == 0) return 0; - return (unsigned)(1000 * (pos - m_pos) / (ts - m_stamp)); + + return (unsigned)(1000 * (m_size / (m_time + time_bias))); } void Pause() @@ -75,6 +90,8 @@ private: unsigned m_stamp; int64_t m_pos; unsigned m_pause; + unsigned m_time; + int64_t m_size; }; @@ -233,11 +250,11 @@ void CFileCache::Process() } if (!sourceSeekFailed) { - m_pCache->Reset(m_seekPos, false); + const bool bCompleteReset = m_pCache->Reset(m_seekPos, false); m_readPos = m_seekPos; m_writePos = m_pCache->CachedDataEndPos(); assert(m_writePos == cacheMaxPos); - average.Reset(m_writePos); + average.Reset(m_writePos, bCompleteReset); // Can only recalculate new average from scratch after a full reset (empty cache) limiter.Reset(m_writePos); m_cacheFull = (m_pCache->GetMaxWriteSize(m_chunkSize) == 0); m_nSeekResult = m_seekPos; diff --git a/xbmc/filesystem/MemBufferCache.cpp b/xbmc/filesystem/MemBufferCache.cpp index 7c1c61dad8..01583f6f8c 100644 --- a/xbmc/filesystem/MemBufferCache.cpp +++ b/xbmc/filesystem/MemBufferCache.cpp @@ -215,13 +215,14 @@ int64_t MemBufferCache::Seek(int64_t iFilePosition) return CACHE_RC_ERROR; } -void MemBufferCache::Reset(int64_t iSourcePosition) +bool MemBufferCache::Reset(int64_t iSourcePosition, bool clearAnyway) { CSingleLock lock(m_sync); m_nStartPosition = iSourcePosition; m_buffer.Clear(); m_HistoryBuffer.Clear(); m_forwardBuffer.Clear(); + return true; } diff --git a/xbmc/filesystem/MemBufferCache.h b/xbmc/filesystem/MemBufferCache.h index 56b8d9cbf2..7083b2d6d5 100644 --- a/xbmc/filesystem/MemBufferCache.h +++ b/xbmc/filesystem/MemBufferCache.h @@ -46,7 +46,7 @@ public: virtual int64_t WaitForData(unsigned int iMinAvail, unsigned int iMillis) ; virtual int64_t Seek(int64_t iFilePosition) ; - virtual void Reset(int64_t iSourcePosition) ; + virtual bool Reset(int64_t iSourcePosition, bool clearAnyway) ; protected: int64_t m_nStartPosition; diff --git a/xbmc/filesystem/PVRDirectory.cpp b/xbmc/filesystem/PVRDirectory.cpp index b3e5fae513..29f7693698 100644 --- a/xbmc/filesystem/PVRDirectory.cpp +++ b/xbmc/filesystem/PVRDirectory.cpp @@ -66,26 +66,16 @@ bool CPVRDirectory::GetDirectory(const CURL& url, CFileItemList &items) { CFileItemPtr item; - item.reset(new CFileItem(base + "/channels/", true)); + item.reset(new CFileItem(base + "channels/", true)); item->SetLabel(g_localizeStrings.Get(19019)); item->SetLabelPreformated(true); items.Add(item); - item.reset(new CFileItem(base + "/recordings/", true)); + item.reset(new CFileItem(base + "recordings/", true)); item->SetLabel(g_localizeStrings.Get(19017)); item->SetLabelPreformated(true); items.Add(item); - item.reset(new CFileItem(base + "/timers/", true)); - item->SetLabel(g_localizeStrings.Get(19040)); - item->SetLabelPreformated(true); - items.Add(item); - - item.reset(new CFileItem(base + "/guide/", true)); - item->SetLabel(g_localizeStrings.Get(19029)); - item->SetLabelPreformated(true); - items.Add(item); - // Sort by name only. Labels are preformated. items.AddSortMethod(SortByLabel, 551 /* Name */, LABEL_MASKS("%L", "", "%L", "")); diff --git a/xbmc/filesystem/SMBDirectory.cpp b/xbmc/filesystem/SMBDirectory.cpp index 1fa00e6bff..026bd02b65 100644 --- a/xbmc/filesystem/SMBDirectory.cpp +++ b/xbmc/filesystem/SMBDirectory.cpp @@ -253,7 +253,7 @@ int CSMBDirectory::OpenDir(const CURL& url, std::string& strAuth) fd = smbc_opendir(s.c_str()); } - if (fd < 0) /* only to avoid goto in following code */ + while (fd < 0) /* only to avoid goto in following code */ { std::string cError; @@ -261,15 +261,21 @@ int CSMBDirectory::OpenDir(const CURL& url, std::string& strAuth) { if (m_flags & DIR_FLAG_ALLOW_PROMPT) RequireAuthentication(urlIn); + break; } - else if (errno == ENODEV || errno == ENOENT) + + if (errno == ENODEV || errno == ENOENT) cError = StringUtils::Format(g_localizeStrings.Get(770).c_str(),errno); else cError = strerror(errno); if (m_flags & DIR_FLAG_ALLOW_PROMPT) SetErrorDialog(257, cError.c_str()); + break; + } + if (fd < 0) + { // write error to logfile CLog::Log(LOGERROR, "SMBDirectory->GetDirectory: Unable to open directory : '%s'\nunix_err:'%x' error : '%s'", CURL::GetRedacted(strAuth).c_str(), errno, strerror(errno)); } diff --git a/xbmc/filesystem/win32/Win32SMBFile.cpp b/xbmc/filesystem/win32/Win32SMBFile.cpp index ba605ed205..b8f95d1b43 100644 --- a/xbmc/filesystem/win32/Win32SMBFile.cpp +++ b/xbmc/filesystem/win32/Win32SMBFile.cpp @@ -151,7 +151,7 @@ int CWin32SMBFile::Stat(const CURL& url, struct __stat64* statData) if (CWin32File::Stat(url, statData) == 0) return 0; - if (!worthTryToConnect(GetLastError()) || !ConnectAndAuthenticate(url)) + if (!worthTryToConnect(m_lastSMBFileErr) || !ConnectAndAuthenticate(url)) return -1; return CWin32File::Stat(url, statData); diff --git a/xbmc/interfaces/json-rpc/AudioLibrary.cpp b/xbmc/interfaces/json-rpc/AudioLibrary.cpp index a32d56a59a..4ffcde9387 100644 --- a/xbmc/interfaces/json-rpc/AudioLibrary.cpp +++ b/xbmc/interfaces/json-rpc/AudioLibrary.cpp @@ -651,6 +651,20 @@ void CAudioLibrary::FillAlbumItem(const CAlbum &album, const std::string &path, item = CFileItemPtr(new CFileItem(path, album)); } +JSONRPC_STATUS CAudioLibrary::GetAdditionalDetails(const CVariant ¶meterObject, CFileItemList &items) +{ + if (items.IsEmpty()) + return OK; + + CMusicDatabase musicdb; + if (MediaTypes::IsMediaType(items.GetContent(), MediaTypeAlbum)) + return GetAdditionalAlbumDetails(parameterObject, items, musicdb); + else if (MediaTypes::IsMediaType(items.GetContent(), MediaTypeSong)) + return GetAdditionalSongDetails(parameterObject, items, musicdb); + + return OK; +} + JSONRPC_STATUS CAudioLibrary::GetAdditionalAlbumDetails(const CVariant ¶meterObject, CFileItemList &items, CMusicDatabase &musicdatabase) { if (!musicdatabase.Open()) diff --git a/xbmc/interfaces/json-rpc/AudioLibrary.h b/xbmc/interfaces/json-rpc/AudioLibrary.h index 5d6113f158..7b73a67369 100644 --- a/xbmc/interfaces/json-rpc/AudioLibrary.h +++ b/xbmc/interfaces/json-rpc/AudioLibrary.h @@ -55,6 +55,7 @@ namespace JSONRPC static bool FillFileItem(const std::string &strFilename, CFileItemPtr &item, const CVariant ¶meterObject = CVariant(CVariant::VariantTypeArray)); static bool FillFileItemList(const CVariant ¶meterObject, CFileItemList &list); + static JSONRPC_STATUS GetAdditionalDetails(const CVariant ¶meterObject, CFileItemList &items); static JSONRPC_STATUS GetAdditionalAlbumDetails(const CVariant ¶meterObject, CFileItemList &items, CMusicDatabase &musicdatabase); static JSONRPC_STATUS GetAdditionalSongDetails(const CVariant ¶meterObject, CFileItemList &items, CMusicDatabase &musicdatabase); diff --git a/xbmc/interfaces/json-rpc/FileOperations.cpp b/xbmc/interfaces/json-rpc/FileOperations.cpp index 50e74e1c19..6ba9d6e4c8 100644 --- a/xbmc/interfaces/json-rpc/FileOperations.cpp +++ b/xbmc/interfaces/json-rpc/FileOperations.cpp @@ -103,6 +103,14 @@ JSONRPC_STATUS CFileOperations::GetDirectory(const std::string &method, ITranspo if (CDirectory::GetDirectory(strPath, items, extensions)) { + // we might need to get additional information for music items + if (media == "music") + { + JSONRPC_STATUS status = CAudioLibrary::GetAdditionalDetails(parameterObject, items); + if (status != OK) + return status; + } + CFileItemList filteredFiles; for (unsigned int i = 0; i < (unsigned int)items.Size(); i++) { diff --git a/xbmc/interfaces/json-rpc/schema/version.txt b/xbmc/interfaces/json-rpc/schema/version.txt index 7ecad14053..facac91deb 100644 --- a/xbmc/interfaces/json-rpc/schema/version.txt +++ b/xbmc/interfaces/json-rpc/schema/version.txt @@ -1 +1 @@ -6.21.0 +6.21.2 diff --git a/xbmc/powermanagement/PowerManager.cpp b/xbmc/powermanagement/PowerManager.cpp index 27948b5e0a..5900f985ad 100644 --- a/xbmc/powermanagement/PowerManager.cpp +++ b/xbmc/powermanagement/PowerManager.cpp @@ -75,12 +75,12 @@ void CPowerManager::Initialize() m_instance = new CAndroidPowerSyscall(); #elif defined(TARGET_POSIX) #if defined(HAS_DBUS) - if (CLogindUPowerSyscall::HasLogind()) - m_instance = new CLogindUPowerSyscall(); - else if (CConsoleUPowerSyscall::HasConsoleKitAndUPower()) + if (CConsoleUPowerSyscall::HasConsoleKitAndUPower()) m_instance = new CConsoleUPowerSyscall(); else if (CConsoleDeviceKitPowerSyscall::HasDeviceConsoleKit()) m_instance = new CConsoleDeviceKitPowerSyscall(); + else if (CLogindUPowerSyscall::HasLogind()) + m_instance = new CLogindUPowerSyscall(); else if (CUPowerSyscall::HasUPower()) m_instance = new CUPowerSyscall(); else diff --git a/xbmc/pvr/PVRManager.cpp b/xbmc/pvr/PVRManager.cpp index 2b6018ba7a..e97dce6a49 100644 --- a/xbmc/pvr/PVRManager.cpp +++ b/xbmc/pvr/PVRManager.cpp @@ -111,7 +111,13 @@ void CPVRManager::Announce(AnnouncementFlag flag, const char *sender, const char return; if (strcmp(message, "OnWake") == 0) - ContinueLastChannel(); + { + { + CSingleLock lock(m_critSection); + m_bFirstStart = true; + } + Start(true); + } } CPVRManager &CPVRManager::Get(void) @@ -497,8 +503,9 @@ void CPVRManager::Process(void) /* start job to search for missing channel icons */ TriggerSearchMissingChannelIcons(); - /* continue last watched channel */ - ContinueLastChannel(); + /* try to continue last watched channel otherwise set group to last played group */ + if (!ContinueLastChannel()) + SetPlayingGroup(m_channelGroups->GetLastPlayedGroup()); } /* execute the next pending jobs if there are any */ try diff --git a/xbmc/pvr/channels/PVRChannel.cpp b/xbmc/pvr/channels/PVRChannel.cpp index 43ec0611d5..3416304c91 100644 --- a/xbmc/pvr/channels/PVRChannel.cpp +++ b/xbmc/pvr/channels/PVRChannel.cpp @@ -163,7 +163,12 @@ void CPVRChannel::Serialize(CVariant& value) const CEpgInfoTag epg; if (GetEPGNow(epg)) + { + // add the properties of the current EPG item to the main object + epg.Serialize(value); + // and add an extra sub-object with only the current EPG details epg.Serialize(value["broadcastnow"]); + } if (GetEPGNext(epg)) epg.Serialize(value["broadcastnext"]); diff --git a/xbmc/pvr/channels/PVRChannelGroup.cpp b/xbmc/pvr/channels/PVRChannelGroup.cpp index c021ef43e7..95395ebff8 100644 --- a/xbmc/pvr/channels/PVRChannelGroup.cpp +++ b/xbmc/pvr/channels/PVRChannelGroup.cpp @@ -234,7 +234,7 @@ bool CPVRChannelGroup::MoveChannel(unsigned int iOldChannelNumber, unsigned int CLog::Log(LOGNOTICE, "CPVRChannelGroup - %s - %s channel '%s' moved to channel number '%d'", __FUNCTION__, (m_bRadio ? "radio" : "tv"), entry.channel->ChannelName().c_str(), iNewChannelNumber); - return true; + return bReturn; } void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */) diff --git a/xbmc/pvr/channels/PVRChannelGroups.cpp b/xbmc/pvr/channels/PVRChannelGroups.cpp index 8d0388044a..98a186ab5d 100644 --- a/xbmc/pvr/channels/PVRChannelGroups.cpp +++ b/xbmc/pvr/channels/PVRChannelGroups.cpp @@ -368,7 +368,7 @@ int CPVRChannelGroups::GetGroupList(CFileItemList* results) const std::string strPath; for (std::vector<CPVRChannelGroupPtr>::const_iterator it = m_groups.begin(); it != m_groups.end(); it++) { - strPath = StringUtils::Format("channels/%s/%i", m_bRadio ? "radio" : "tv", (*it)->GroupID()); + strPath = StringUtils::Format("pvr://channels/%s/%s/", m_bRadio ? "radio" : "tv", (*it)->GroupName().c_str()); CFileItemPtr group(new CFileItem(strPath, true)); group->m_strTitle = (*it)->GroupName(); group->SetLabel((*it)->GroupName()); diff --git a/xbmc/pvr/channels/PVRChannelGroupsContainer.cpp b/xbmc/pvr/channels/PVRChannelGroupsContainer.cpp index def42c4033..9fb3b27249 100644 --- a/xbmc/pvr/channels/PVRChannelGroupsContainer.cpp +++ b/xbmc/pvr/channels/PVRChannelGroupsContainer.cpp @@ -143,6 +143,7 @@ CFileItemPtr CPVRChannelGroupsContainer::GetByPath(const std::string &strPath) c bool CPVRChannelGroupsContainer::GetDirectory(const std::string& strPath, CFileItemList &results) { std::string strBase(strPath); + URIUtils::RemoveSlashAtEnd(strBase); /* get the filename from curl */ CURL url(strPath); diff --git a/xbmc/settings/dialogs/GUIDialogContentSettings.cpp b/xbmc/settings/dialogs/GUIDialogContentSettings.cpp index fb671ea863..2e50632746 100644 --- a/xbmc/settings/dialogs/GUIDialogContentSettings.cpp +++ b/xbmc/settings/dialogs/GUIDialogContentSettings.cpp @@ -77,6 +77,7 @@ bool CGUIDialogContentSettings::OnMessage(CGUIMessage &message) { m_scrapers.clear(); m_vecItems->Clear(); + m_content = CONTENT_NONE; break; } |