From 59e5e486e8499ed50db4637c7fea2c8fca3aa2d7 Mon Sep 17 00:00:00 2001 From: Chris Browet Date: Mon, 11 Apr 2016 21:01:02 +0200 Subject: [PATCH 01/16] ADD: Selective disabling of h/w acceleration in settings (#208) --- .../resources/strings.po | 15 ++++ system/settings/settings.xml | 41 +++++++++ .../dvdplayer/DVDCodecs/DVDFactoryCodec.cpp | 89 ++++++++++++------- xbmc/settings/Settings.cpp | 3 + xbmc/settings/Settings.h | 3 + 5 files changed, 120 insertions(+), 31 deletions(-) diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index e013ca881e..b94b98b3a7 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -18191,3 +18191,18 @@ msgctxt "#38113" msgid "This option uses frame-packing to output full resolution for 3D through HDMI" msgstr "" +msgctxt "#39000" +msgid "HD and up" +msgstr "" + +msgctxt "#39001" +msgid "Accelerate MPEG2" +msgstr "" + +msgctxt "#39002" +msgid "Accelerate MPEG4" +msgstr "" + +msgctxt "#39003" +msgid "Accelerate h264" +msgstr "" diff --git a/system/settings/settings.xml b/system/settings/settings.xml index 0107d9d35a..c902ad3afe 100644 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -844,6 +844,47 @@ + + + 2 + 800 + + + + + + + + + + + + 2 + 800 + + + + + + + + + + + + 2 + 0 + + + + + + + + + + + diff --git a/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp index 54368b0dc6..5b2c128157 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp @@ -218,12 +218,18 @@ CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, const C case AV_CODEC_ID_MPEG4: case AV_CODEC_ID_MSMPEG4V2: case AV_CODEC_ID_MSMPEG4V3: + if (hint.width > CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ACCELMPEG2)) + if ( (pCodec = OpenCodec(new CDVDVideoCodecAmlogic(), hint, options)) ) return pCodec; + break; case AV_CODEC_ID_MPEG1VIDEO: case AV_CODEC_ID_MPEG2VIDEO: - // Avoid h/w decoder for SD; Those files might use features - // not supported and can easily be soft-decoded - if (hint.width <= 800) - break; + if (hint.width >CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ACCELMPEG2)) + if ( (pCodec = OpenCodec(new CDVDVideoCodecAmlogic(), hint, options)) ) return pCodec; + break; + case AV_CODEC_ID_H264: + if (hint.width >CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ACCELH264)) + if ( (pCodec = OpenCodec(new CDVDVideoCodecAmlogic(), hint, options)) ) return pCodec; + break; default: if ( (pCodec = OpenCodec(new CDVDVideoCodecAmlogic(), hint, options)) ) return pCodec; } @@ -272,48 +278,69 @@ CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, const C { switch(hint.codec) { - case AV_CODEC_ID_MPEG4: - case AV_CODEC_ID_MSMPEG4V2: - case AV_CODEC_ID_MSMPEG4V3: - // Avoid h/w decoder for SD; Those files might use features - // not supported and can easily be soft-decoded - if (hint.width <= 800) - break; - default: - CLog::Log(LOGINFO, "MediaCodec (Surface) Video Decoder..."); + case AV_CODEC_ID_MPEG4: + case AV_CODEC_ID_MSMPEG4V2: + case AV_CODEC_ID_MSMPEG4V3: + if (hint.width > CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ACCELMPEG4)) + if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(true), hint, options)) ) return pCodec; + break; + case AV_CODEC_ID_MPEG1VIDEO: + case AV_CODEC_ID_MPEG2VIDEO: + if (hint.width > CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ACCELMPEG2)) if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(true), hint, options)) ) return pCodec; + break; + case AV_CODEC_ID_H264: + if (hint.width > CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ACCELH264)) + if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(true), hint, options)) ) return pCodec; + break; + default: + if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(true), hint, options)) ) return pCodec; } } if (!hint.software && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEMEDIACODEC)) { switch(hint.codec) { - case AV_CODEC_ID_MPEG4: - case AV_CODEC_ID_MSMPEG4V2: - case AV_CODEC_ID_MSMPEG4V3: - // Avoid h/w decoder for SD; Those files might use features - // not supported and can easily be soft-decoded - if (hint.width <= 800) - break; - default: - CLog::Log(LOGINFO, "MediaCodec Video Decoder..."); + case AV_CODEC_ID_MPEG4: + case AV_CODEC_ID_MSMPEG4V2: + case AV_CODEC_ID_MSMPEG4V3: + if (hint.width > CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ACCELMPEG4)) if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(false), hint, options)) ) return pCodec; + break; + case AV_CODEC_ID_MPEG1VIDEO: + case AV_CODEC_ID_MPEG2VIDEO: + if (hint.width > CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ACCELMPEG2)) + if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(false), hint, options)) ) return pCodec; + break; + case AV_CODEC_ID_H264: + if (hint.width > CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ACCELH264)) + if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(false), hint, options)) ) return pCodec; + break; + default: + if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(false), hint, options)) ) return pCodec; } } if (!hint.software && hint.height <= 1080 && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEMEDIACODECSURFACE)) { switch(hint.codec) { - case AV_CODEC_ID_MPEG4: - case AV_CODEC_ID_MSMPEG4V2: - case AV_CODEC_ID_MSMPEG4V3: - // Avoid h/w decoder for SD; Those files might use features - // not supported and can easily be soft-decoded - if (hint.width <= 800) - break; - default: - CLog::Log(LOGINFO, "MediaCodec (Surface) Video Decoder..."); + case AV_CODEC_ID_MPEG4: + case AV_CODEC_ID_MSMPEG4V2: + case AV_CODEC_ID_MSMPEG4V3: + if (hint.width > CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ACCELMPEG4)) + if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(true), hint, options)) ) return pCodec; + break; + case AV_CODEC_ID_MPEG1VIDEO: + case AV_CODEC_ID_MPEG2VIDEO: + if (hint.width > CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ACCELMPEG2)) if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(true), hint, options)) ) return pCodec; + break; + case AV_CODEC_ID_H264: + if (hint.width > CSettings::GetInstance().GetInt(CSettings::SETTING_VIDEOPLAYER_ACCELH264)) + if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(true), hint, options)) ) return pCodec; + break; + default: + if ( (pCodec = OpenCodec(new CDVDVideoCodecAndroidMediaCodec(true), hint, options)) ) return pCodec; } } #endif diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp index 59bb449ffc..68ed9ef7f2 100644 --- a/xbmc/settings/Settings.cpp +++ b/xbmc/settings/Settings.cpp @@ -181,6 +181,9 @@ const std::string CSettings::SETTING_VIDEOPLAYER_USEVIDEOTOOLBOX = "videoplayer. const std::string CSettings::SETTING_VIDEOPLAYER_USEVDA = "videoplayer.usevda"; const std::string CSettings::SETTING_VIDEOPLAYER_USEMMAL = "videoplayer.usemmal"; const std::string CSettings::SETTING_VIDEOPLAYER_USESTAGEFRIGHT = "videoplayer.usestagefright"; +const std::string CSettings::SETTING_VIDEOPLAYER_ACCELMPEG2 = "videoplayer.accelmpeg2"; +const std::string CSettings::SETTING_VIDEOPLAYER_ACCELMPEG4 = "videoplayer.accelmpeg4"; +const std::string CSettings::SETTING_VIDEOPLAYER_ACCELH264 = "videoplayer.accelh264"; const std::string CSettings::SETTING_VIDEOPLAYER_LIMITGUIUPDATE = "videoplayer.limitguiupdate"; const std::string CSettings::SETTING_MYVIDEOS_SELECTACTION = "myvideos.selectaction"; const std::string CSettings::SETTING_MYVIDEOS_EXTRACTFLAGS = "myvideos.extractflags"; diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h index 071c6f0428..0464d5d43e 100644 --- a/xbmc/settings/Settings.h +++ b/xbmc/settings/Settings.h @@ -137,6 +137,9 @@ class CSettings : public CSettingCreator, public CSettingControlCreator static const std::string SETTING_VIDEOPLAYER_USEVDA; static const std::string SETTING_VIDEOPLAYER_USEMMAL; static const std::string SETTING_VIDEOPLAYER_USESTAGEFRIGHT; + static const std::string SETTING_VIDEOPLAYER_ACCELMPEG2; + static const std::string SETTING_VIDEOPLAYER_ACCELMPEG4; + static const std::string SETTING_VIDEOPLAYER_ACCELH264; static const std::string SETTING_VIDEOPLAYER_LIMITGUIUPDATE; static const std::string SETTING_MYVIDEOS_SELECTACTION; static const std::string SETTING_MYVIDEOS_EXTRACTFLAGS; From 1b84caba684c42f2510767854bb1f57cc413ca10 Mon Sep 17 00:00:00 2001 From: "Chris \"koying\" Browet" Date: Wed, 13 Apr 2016 18:08:52 +0200 Subject: [PATCH 02/16] Revert "FIX: [64bits] int <-> void* conversion in fontTTF" This reverts commit 103e72daa3cae5b5645778762642f3dbf3e0b1d8. --- xbmc/guilib/GUIFontCache.h | 6 +++--- xbmc/guilib/GUIFontTTFGL.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/xbmc/guilib/GUIFontCache.h b/xbmc/guilib/GUIFontCache.h index 08c437e159..7cbe91d488 100644 --- a/xbmc/guilib/GUIFontCache.h +++ b/xbmc/guilib/GUIFontCache.h @@ -231,10 +231,10 @@ struct CGUIFontCacheDynamicPosition struct CVertexBuffer { - int bufferHandle; + void *bufferHandle; size_t size; - CVertexBuffer() : bufferHandle(0), size(0), m_font(NULL) {} - CVertexBuffer(int bufferHandle, size_t size, const CGUIFontTTFBase *font) : bufferHandle(bufferHandle), size(size), m_font(font) {} + CVertexBuffer() : bufferHandle(NULL), size(0), m_font(NULL) {} + CVertexBuffer(void *bufferHandle, size_t size, const CGUIFontTTFBase *font) : bufferHandle(bufferHandle), size(size), m_font(font) {} CVertexBuffer(const CVertexBuffer &other) : bufferHandle(other.bufferHandle), size(other.size), m_font(other.m_font) { /* In practice, the copy constructor is only called before a vertex buffer diff --git a/xbmc/guilib/GUIFontTTFGL.cpp b/xbmc/guilib/GUIFontTTFGL.cpp index f06ccae841..d19a2e0e1a 100644 --- a/xbmc/guilib/GUIFontTTFGL.cpp +++ b/xbmc/guilib/GUIFontTTFGL.cpp @@ -285,7 +285,7 @@ CVertexBuffer CGUIFontTTFGL::CreateVertexBuffer(const std::vector &vert // Unbind GL_ARRAY_BUFFER glBindBuffer(GL_ARRAY_BUFFER, 0); - return CVertexBuffer(bufferHandle, vertices.size() / 4, this); + return CVertexBuffer((void *) bufferHandle, vertices.size() / 4, this); } void CGUIFontTTFGL::DestroyVertexBuffer(CVertexBuffer &buffer) const From 7105864c75477da1b4aa3d20a87a33b59ed74144 Mon Sep 17 00:00:00 2001 From: "Chris \"koying\" Browet" Date: Wed, 13 Apr 2016 18:24:41 +0200 Subject: [PATCH 03/16] FIX: [64bits] GLuint <-> void* conversion in fontTTFGL --- xbmc/guilib/GUIFontTTFGL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/guilib/GUIFontTTFGL.cpp b/xbmc/guilib/GUIFontTTFGL.cpp index d19a2e0e1a..129844c89f 100644 --- a/xbmc/guilib/GUIFontTTFGL.cpp +++ b/xbmc/guilib/GUIFontTTFGL.cpp @@ -232,7 +232,7 @@ void CGUIFontTTFGL::LastEnd() glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glMatrixModview.Get()); // Bind the buffer to the OpenGL context's GL_ARRAY_BUFFER binding point - glBindBuffer(GL_ARRAY_BUFFER, (GLuint) m_vertexTrans[i].vertexBuffer->bufferHandle); + glBindBuffer(GL_ARRAY_BUFFER, (GLuint) ((long)(m_vertexTrans[i].vertexBuffer->bufferHandle) & 0xffff)); // Do the actual drawing operation, split into groups of characters no // larger than the pre-determined size of the element array From 66cfed76f3d8bffa785d7b564a8d7db539bba74c Mon Sep 17 00:00:00 2001 From: "Chris \"Koying\" Browet" Date: Tue, 12 Apr 2016 20:38:23 +0200 Subject: [PATCH 04/16] fixup GLES HQ scalers --- .../VideoRenderers/LinuxRendererGLES.cpp | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp index de6bbf6d63..db4a8cc5b9 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp @@ -1355,7 +1355,10 @@ void CLinuxRendererGLES::RenderSinglePass(int index, int field) void CLinuxRendererGLES::RenderToFBO(int index, int field, bool weave /*= false*/) { - YUVPLANES &planesf = m_buffers[index].fields[field]; + YV12Image &im = m_buffers[index].image; + YUVFIELDS &fields = m_buffers[index].fields; + YUVPLANES &planes = fields[FIELD_FULL]; + YUVPLANES &planesf = fields[field]; if (m_reloadShaders) { @@ -1368,19 +1371,19 @@ void CLinuxRendererGLES::RenderToFBO(int index, int field, bool weave /*= false* // Y glEnable(m_textureTarget); glActiveTexture(GL_TEXTURE0); - glBindTexture(m_textureTarget, planesf[0].id); + glBindTexture(m_textureTarget, planes[0].id); VerifyGLState(); // U glActiveTexture(GL_TEXTURE1); glEnable(m_textureTarget); - glBindTexture(m_textureTarget, planesf[1].id); + glBindTexture(m_textureTarget, planes[1].id); VerifyGLState(); // V glActiveTexture(GL_TEXTURE2); glEnable(m_textureTarget); - glBindTexture(m_textureTarget, planesf[2].id); + glBindTexture(m_textureTarget, planes[2].id); VerifyGLState(); glActiveTexture(GL_TEXTURE0); @@ -1397,15 +1400,15 @@ void CLinuxRendererGLES::RenderToFBO(int index, int field, bool weave /*= false* m_fbo.fbo.BeginRender(); VerifyGLState(); - m_fbo.width = planesf[0].rect.x2 - planesf[0].rect.x1; - m_fbo.height = planesf[0].rect.y2 - planesf[0].rect.y1; + m_fbo.width = planes[0].rect.x2 - planes[0].rect.x1; + m_fbo.height = planes[0].rect.y2 - planes[0].rect.y1; if (m_textureTarget == GL_TEXTURE_2D) { - m_fbo.width *= planesf[0].texwidth; - m_fbo.height *= planesf[0].texheight; + m_fbo.width *= planes[0].texwidth; + m_fbo.height *= planes[0].texheight; } - m_fbo.width *= planesf[0].pixpertex_x; - m_fbo.height *= planesf[0].pixpertex_y; + m_fbo.width *= planes[0].pixpertex_x; + m_fbo.height *= planes[0].pixpertex_y; if (weave) m_fbo.height *= 2; From d9579104ca35a3babea73eda010a092f9962e421 Mon Sep 17 00:00:00 2001 From: "Chris \"Koying\" Browet" Date: Wed, 13 Apr 2016 19:54:50 +0200 Subject: [PATCH 05/16] ADD: ffmpeg deinterlace option + call yadif by its name --- .../resource.language.en_gb/resources/strings.po | 9 +++++++-- xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp | 16 ++++++++++------ .../DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 2 ++ xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 11 +++++++++-- xbmc/settings/VideoSettings.h | 6 ++++-- xbmc/video/dialogs/GUIDialogVideoSettings.cpp | 5 +++-- 6 files changed, 35 insertions(+), 14 deletions(-) diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index b94b98b3a7..0d424f1dee 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -7972,7 +7972,7 @@ msgstr "" #: xbmc/video/dialogs/GUIDialogVideoSettings.cpp msgctxt "#16020" -msgid "Deinterlace" +msgid "Yadif" msgstr "" #: xbmc/video/dialogs/GUIDialogVideoSettings.cpp @@ -8344,7 +8344,12 @@ msgctxt "#16335" msgid "IMX - Fast motion (double)" msgstr "" -#empty strings from id 16336 to 16399 +#: xbmc/video/dialogs/GUIDialogVideoSettings.cpp +msgctxt "#16336" +msgid "Software - FFmpeg" +msgstr "" + +#empty strings from id 16337 to 16399 #: xbmc/video/dialogs/GUIDialogVideoSettings.cpp msgctxt "#16400" diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp index db4a8cc5b9..fcf3e55274 100644 --- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp +++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp @@ -3295,12 +3295,16 @@ bool CLinuxRendererGLES::Supports(EINTERLACEMETHOD method) return false; } -#if !defined(TARGET_ANDROID) && (defined(__i386__) || defined(__x86_64__)) - if(method == VS_INTERLACEMETHOD_DEINTERLACE - || method == VS_INTERLACEMETHOD_DEINTERLACE_HALF - || method == VS_INTERLACEMETHOD_SW_BLEND) +#if (defined(__i386__) || defined(__x86_64__)) + if(method == VS_INTERLACEMETHOD_YADIF + || method == VS_INTERLACEMETHOD_YADIF_HALF + || method == VS_INTERLACEMETHOD_RENDER_BOB + || method == VS_INTERLACEMETHOD_SW_FFMPEG + || method == VS_INTERLACEMETHOD_SW_BLEND + || method == VS_INTERLACEMETHOD_RENDER_BOB_INVERTED) #else - if(method == VS_INTERLACEMETHOD_SW_BLEND + if(method == VS_INTERLACEMETHOD_SW_FFMPEG + || method == VS_INTERLACEMETHOD_SW_BLEND || method == VS_INTERLACEMETHOD_RENDER_BOB || method == VS_INTERLACEMETHOD_RENDER_BOB_INVERTED) #endif @@ -3386,7 +3390,7 @@ EINTERLACEMETHOD CLinuxRendererGLES::AutoInterlaceMethod() return VS_INTERLACEMETHOD_IMX_FASTMOTION; #if !defined(TARGET_ANDROID) && (defined(__i386__) || defined(__x86_64__)) - return VS_INTERLACEMETHOD_DEINTERLACE_HALF; + return VS_INTERLACEMETHOD_YADIF_HALF; #else return VS_INTERLACEMETHOD_RENDER_BOB; #endif diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp index 3498503af2..547056af4e 100644 --- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp @@ -412,6 +412,7 @@ unsigned int CDVDVideoCodecFFmpeg::SetFilters(unsigned int flags) } } +#if (defined(__i386__) || defined(__x86_64__)) if(flags & FILTER_DEINTERLACE_YADIF) { if(flags & FILTER_DEINTERLACE_HALFED) @@ -424,6 +425,7 @@ unsigned int CDVDVideoCodecFFmpeg::SetFilters(unsigned int flags) flags &= ~FILTER_DEINTERLACE_ANY | FILTER_DEINTERLACE_YADIF; } +#endif return flags; } diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp index c81164959c..3701cd976d 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp @@ -553,9 +553,9 @@ void CDVDPlayerVideo::Process() if (mDeintMode != VS_DEINTERLACEMODE_OFF) { - if (mInt == VS_INTERLACEMETHOD_DEINTERLACE) + if (mInt == VS_INTERLACEMETHOD_YADIF) mFilters = CDVDVideoCodec::FILTER_DEINTERLACE_ANY; - else if(mInt == VS_INTERLACEMETHOD_DEINTERLACE_HALF) + else if(mInt == VS_INTERLACEMETHOD_YADIF_HALF) mFilters = CDVDVideoCodec::FILTER_DEINTERLACE_ANY | CDVDVideoCodec::FILTER_DEINTERLACE_HALFED; if (mDeintMode == VS_DEINTERLACEMODE_AUTO && mFilters) @@ -678,6 +678,13 @@ void CDVDPlayerVideo::Process() sPostProcessType += g_advancedSettings.m_videoPPFFmpegDeint; bPostProcessDeint = true; } + else if(mInt == VS_INTERLACEMETHOD_SW_FFMPEG) + { + if (!sPostProcessType.empty()) + sPostProcessType += ","; + sPostProcessType += "ffmpegdeint"; + bPostProcessDeint = true; + } } if (CMediaSettings::GetInstance().GetCurrentVideoSettings().m_PostProcess) diff --git a/xbmc/settings/VideoSettings.h b/xbmc/settings/VideoSettings.h index 03050586b0..aa30dc6c7c 100644 --- a/xbmc/settings/VideoSettings.h +++ b/xbmc/settings/VideoSettings.h @@ -45,7 +45,7 @@ enum EINTERLACEMETHOD VS_INTERLACEMETHOD_RENDER_BOB_INVERTED=5, VS_INTERLACEMETHOD_RENDER_BOB=6, - VS_INTERLACEMETHOD_DEINTERLACE=7, + VS_INTERLACEMETHOD_YADIF=7, VS_INTERLACEMETHOD_VDPAU_BOB=8, VS_INTERLACEMETHOD_INVERSE_TELECINE=9, @@ -55,7 +55,7 @@ enum EINTERLACEMETHOD VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF=13, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL=14, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF=15, - VS_INTERLACEMETHOD_DEINTERLACE_HALF=16, + VS_INTERLACEMETHOD_YADIF_HALF=16, VS_INTERLACEMETHOD_DXVA_BOB = 17, VS_INTERLACEMETHOD_DXVA_BEST = 18, // VS_INTERLACEMETHOD_DXVA_ANY = 19, Legacy @@ -75,6 +75,8 @@ enum EINTERLACEMETHOD VS_INTERLACEMETHOD_IMX_FASTMOTION = 29, VS_INTERLACEMETHOD_IMX_FASTMOTION_DOUBLE = 30, + VS_INTERLACEMETHOD_SW_FFMPEG = 31, + VS_INTERLACEMETHOD_MAX // do not use and keep as last enum value. }; diff --git a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp index b24856632a..f50307c5d1 100644 --- a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp +++ b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp @@ -252,9 +252,10 @@ void CGUIDialogVideoSettings::InitializeSettings() entries.push_back(std::make_pair(20129, VS_INTERLACEMETHOD_RENDER_WEAVE)); entries.push_back(std::make_pair(16022, VS_INTERLACEMETHOD_RENDER_BOB_INVERTED)); entries.push_back(std::make_pair(16021, VS_INTERLACEMETHOD_RENDER_BOB)); - entries.push_back(std::make_pair(16020, VS_INTERLACEMETHOD_DEINTERLACE)); - entries.push_back(std::make_pair(16036, VS_INTERLACEMETHOD_DEINTERLACE_HALF)); + entries.push_back(std::make_pair(16020, VS_INTERLACEMETHOD_YADIF)); + entries.push_back(std::make_pair(16036, VS_INTERLACEMETHOD_YADIF_HALF)); entries.push_back(std::make_pair(16324, VS_INTERLACEMETHOD_SW_BLEND)); + entries.push_back(std::make_pair(16336, VS_INTERLACEMETHOD_SW_FFMPEG)); entries.push_back(std::make_pair(16314, VS_INTERLACEMETHOD_INVERSE_TELECINE)); entries.push_back(std::make_pair(16311, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL)); entries.push_back(std::make_pair(16310, VS_INTERLACEMETHOD_VDPAU_TEMPORAL)); From c8f55b05bd225018e70a2fb7efa23d5dfd0ffc19 Mon Sep 17 00:00:00 2001 From: "Chris \"Koying\" Browet" Date: Sun, 17 Apr 2016 13:52:18 +0200 Subject: [PATCH 06/16] FIX: [AT] use timestamp frame pos --- .../AudioEngine/Sinks/AESinkAUDIOTRACK.cpp | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp index e262cddde1..958294ab8e 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp @@ -496,10 +496,29 @@ void CAESinkAUDIOTRACK::GetDelay(AEDelayStatus& status) return; } - // In their infinite wisdom, Google decided to make getPlaybackHeadPosition - // return a 32bit "int" that you should "interpret as unsigned." As such, - // for wrap saftey, we need to do all ops on it in 32bit integer math. - uint32_t head_pos = (uint32_t)m_at_jni->getPlaybackHeadPosition(); + uint32_t head_pos = 0; + double frameDiffMilli = 0; + if (CJNIBuild::SDK_INT >= 23) + { + CJNIAudioTimestamp ts; + int64_t systime = CJNISystem::nanoTime(); + if (m_at_jni->getTimestamp(ts)) + { + head_pos = (uint32_t)ts.get_framePosition(); + frameDiffMilli = (systime - ts.get_nanoTime()) / 1000000000.0; + + if (g_advancedSettings.CanLogComponent(LOGAUDIO)) + CLog::Log(LOGDEBUG, "CAESinkAUDIOTRACK::GetDelay timestamp: pos(%lld) time(%lld) diff(%f)", ts.get_framePosition(), ts.get_nanoTime(), frameDiffMilli); + } + } + if (!head_pos) + { + // In their infinite wisdom, Google decided to make getPlaybackHeadPosition + // return a 32bit "int" that you should "interpret as unsigned." As such, + // for wrap saftey, we need to do all ops on it in 32bit integer math. + head_pos = (uint32_t)m_at_jni->getPlaybackHeadPosition(); + } + if (!head_pos) { status.SetDelay(m_duration_written); @@ -512,22 +531,8 @@ void CAESinkAUDIOTRACK::GetDelay(AEDelayStatus& status) #endif double delay = m_duration_written - ((double)head_pos / m_sink_sampleRate); - double frameDiffMilli = 0; if (m_duration_written != m_last_duration_written && head_pos != m_last_head_pos) { - if (CJNIBuild::SDK_INT >= 23) - { - CJNIAudioTimestamp ts; - int64_t systime = CJNISystem::nanoTime(); - if (m_at_jni->getTimestamp(ts)) - { - frameDiffMilli = (systime - ts.get_nanoTime()) / 1000000000.0; - - if (m_passthrough && g_advancedSettings.CanLogComponent(LOGAUDIO)) - CLog::Log(LOGDEBUG, "CAESinkAUDIOTRACK::GetDelay timestamp: pos(%lld) time(%lld) diff(%f)", ts.get_framePosition(), ts.get_nanoTime(), frameDiffMilli); - } - } - m_smoothedDelayVec.push_back(delay - frameDiffMilli); if (m_smoothedDelayCount <= SMOOTHED_DELAY_MAX) m_smoothedDelayCount++; From 22ca2c0f4c4b8b01761d26352cbc868c9a2ec212 Mon Sep 17 00:00:00 2001 From: "Chris \"Koying\" Browet" Date: Sun, 17 Apr 2016 13:53:18 +0200 Subject: [PATCH 07/16] FIX: [AT] proper sleep calculation --- .../AudioEngine/Sinks/AESinkAUDIOTRACK.cpp | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp index 958294ab8e..465a394922 100644 --- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp +++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp @@ -551,7 +551,7 @@ void CAESinkAUDIOTRACK::GetDelay(AEDelayStatus& status) if (m_passthrough && !WantsIEC61937() && m_smoothedDelayCount == SMOOTHED_DELAY_MAX && !m_sink_delay) m_sink_delay = smootheDelay; - if (m_passthrough && g_advancedSettings.CanLogComponent(LOGAUDIO)) + if (g_advancedSettings.CanLogComponent(LOGAUDIO)) CLog::Log(LOGDEBUG, "CAESinkAUDIOTRACK::GetDelay m_duration_written/head_pos %f/%u %f(%f)", m_duration_written, head_pos, smootheDelay, delay); status.SetDelay(smootheDelay); @@ -619,21 +619,17 @@ unsigned int CAESinkAUDIOTRACK::AddPackets(uint8_t **data, unsigned int frames, double duration = (double)(written / m_format.m_frameSize) / m_format.m_sampleRate; m_duration_written += duration; - uint32_t sleep_ms; - if (m_lastAddTimeMs) - sleep_ms = (duration * 1000.0) - (XbmcThreads::SystemClockMillis() - m_lastAddTimeMs) - 2 /* overhead */; - else - sleep_ms = (duration * 1000.0); - + if (!m_lastAddTimeMs) + m_lastAddTimeMs = XbmcThreads::SystemClockMillis(); + int32_t diff = XbmcThreads::SystemClockMillis() - m_lastAddTimeMs; + int32_t sleep_ms = (duration * 1000.0) - diff; + m_lastAddTimeMs = XbmcThreads::SystemClockMillis(); if (sleep_ms > 0) usleep(sleep_ms * 1000.0); - } - - if (m_passthrough && g_advancedSettings.CanLogComponent(LOGAUDIO)) - CLog::Log(LOGDEBUG, "CAESinkAUDIOTRACK::AddPackets written %d(%d), tm:%d", written, size, XbmcThreads::SystemClockMillis() - m_lastAddTimeMs); - - m_lastAddTimeMs = XbmcThreads::SystemClockMillis(); + if (g_advancedSettings.CanLogComponent(LOGAUDIO)) + CLog::Log(LOGDEBUG, "CAESinkAUDIOTRACK::AddPackets written %d(%d), tm:%d(%d;%d)", written, size, XbmcThreads::SystemClockMillis() - m_lastAddTimeMs, diff, sleep_ms); + } return (unsigned int)(written/m_format.m_frameSize); } From 2a00a7bf3e06284f56cac8a8aff8d77f076daeba Mon Sep 17 00:00:00 2001 From: "Chris \"Koying\" Browet" Date: Sun, 17 Apr 2016 18:26:48 +0200 Subject: [PATCH 08/16] FIX: [refclock] use provided timestamp --- xbmc/video/videosync/VideoSyncAndroid.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/xbmc/video/videosync/VideoSyncAndroid.cpp b/xbmc/video/videosync/VideoSyncAndroid.cpp index 8e01060b8d..0939970e92 100644 --- a/xbmc/video/videosync/VideoSyncAndroid.cpp +++ b/xbmc/video/videosync/VideoSyncAndroid.cpp @@ -81,14 +81,14 @@ void CVideoSyncAndroid::FrameCallback(int64_t frameTimeNanos) int64_t nowtime = CurrentHostCounter(); //calculate how many vblanks happened - VBlankTime = (double)(nowtime - m_LastVBlankTime) / (double)g_VideoReferenceClock.GetFrequency(); + int64_t FT = (frameTimeNanos - m_LastVBlankTime); + VBlankTime = FT / (double)g_VideoReferenceClock.GetFrequency(); NrVBlanks = MathUtils::round_int(VBlankTime * m_fps); -// int64_t FT = (nowtime - m_LastVBlankTime); -// CLog::Log(LOGDEBUG, "CVideoSyncAndroid::FrameCallback %lld(%f fps)", FT, 1.0/((double)FT/1000000000)); + // CLog::Log(LOGDEBUG, "CVideoSyncAndroid::FrameCallback %lld(%f fps), %d", FT, 1.0/((double)FT/1000000000), NrVBlanks); //save the timestamp of this vblank so we can calculate how many happened next time - m_LastVBlankTime = nowtime; + m_LastVBlankTime = frameTimeNanos; //update the vblank timestamp, update the clock and send a signal that we got a vblank UpdateClock(NrVBlanks, nowtime); From 11cbae6e2099f3374228d57c9345848d69d9dc98 Mon Sep 17 00:00:00 2001 From: "Chris \"koying\" Browet" Date: Wed, 20 Apr 2016 19:04:30 +0200 Subject: [PATCH 09/16] fixup alphanumeric sorting --- xbmc/utils/StringUtils.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/xbmc/utils/StringUtils.cpp b/xbmc/utils/StringUtils.cpp index 1015db65aa..f774268f85 100644 --- a/xbmc/utils/StringUtils.cpp +++ b/xbmc/utils/StringUtils.cpp @@ -764,7 +764,6 @@ int StringUtils::FindNumber(const std::string& strInput, const std::string &strF int64_t StringUtils::AlphaNumericCompare(const wchar_t *left, const wchar_t *right) { bool isNumeric = true; - int64_t numericResult = 0; wchar_t *l = (wchar_t *)left; wchar_t *r = (wchar_t *)right; wchar_t *ld = nullptr, *rd = nullptr; @@ -772,6 +771,7 @@ int64_t StringUtils::AlphaNumericCompare(const wchar_t *left, const wchar_t *rig int64_t lnum, rnum; const std::collate& coll = std::use_facet >(g_langInfo.GetSystemLocale()); int cmp_res = 0; + while (*l != 0 && *r != 0) { // check if we have a numerical value @@ -792,23 +792,24 @@ int64_t StringUtils::AlphaNumericCompare(const wchar_t *left, const wchar_t *rig rnum += *rd++ - L'0'; } // do we have numbers? - if (lnum != rnum) - { // yes - and they're different! - numericResult = lnum - rnum; + if ((*ld == 0 || *ld == L' ') && (*rd == 0 || *rd == L' ')) + { + if (lnum != rnum) + return lnum - rnum; + } + else + { + // Restart + isNumeric = false; + ld = rd = nullptr; + l = (wchar_t *)left; + r = (wchar_t *)right; + continue; } l = ld; r = rd; continue; } - if (isNumeric && (ld || rd)) - { - // Restart - isNumeric = false; - ld = rd = nullptr; - l = (wchar_t *)left; - r = (wchar_t *)right; - continue; - } // do case less comparison lc = *l; if (lc >= L'A' && lc <= L'Z') @@ -824,9 +825,6 @@ int64_t StringUtils::AlphaNumericCompare(const wchar_t *left, const wchar_t *rig } l++; r++; } - if (isNumeric) - return numericResult; - if (*r) { // r is longer return -1; From 64d69de039974f5268c1415db8f47f814a2ad8b3 Mon Sep 17 00:00:00 2001 From: "Chris \"koying\" Browet" Date: Wed, 20 Apr 2016 19:04:59 +0200 Subject: [PATCH 10/16] fixup speedup: consider stream details --- xbmc/video/VideoThumbLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/video/VideoThumbLoader.cpp b/xbmc/video/VideoThumbLoader.cpp index 6ded07453d..b96a7df874 100644 --- a/xbmc/video/VideoThumbLoader.cpp +++ b/xbmc/video/VideoThumbLoader.cpp @@ -324,7 +324,7 @@ bool CVideoThumbLoader::LoadItemCached(CFileItem* pItem) m_videoDatabase->Close(); - return pItem->HasArt("thumb"); + return pItem->HasArt("thumb") && pItem->HasVideoInfoTag() && pItem->GetVideoInfoTag()->HasStreamDetails(); } bool CVideoThumbLoader::LoadItemLookup(CFileItem* pItem) From 4e83cfe1c91abce37248084733ff21986cdcbe57 Mon Sep 17 00:00:00 2001 From: Anton Fedchin Date: Fri, 1 Apr 2016 23:18:27 +0300 Subject: [PATCH 11/16] [RenderSystemDX] Fix possible segfault after ba2ff03 --- xbmc/rendering/dx/RenderSystemDX.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/xbmc/rendering/dx/RenderSystemDX.cpp b/xbmc/rendering/dx/RenderSystemDX.cpp index 9060b1eb82..4911abe488 100644 --- a/xbmc/rendering/dx/RenderSystemDX.cpp +++ b/xbmc/rendering/dx/RenderSystemDX.cpp @@ -842,6 +842,20 @@ bool CRenderSystemDX::CreateWindowSizeDependentResources() hr = dxgiFactory2->CreateSwapChainForHwnd(m_pD3DDev, m_hFocusWnd, &scDesc1, &scFSDesc, NULL, &m_pSwapChain1); + // some drivers (AMD) are denied to switch in stereoscopic 3D mode, if so then fallback to mono mode + if (FAILED(hr) && bHWStereoEnabled) + { + // switch to stereo mode failed, create mono swapchain + CLog::Log(LOGERROR, "%s - Creating stereo swap chain failed with error: %s.", __FUNCTION__, GetErrorDescription(hr).c_str()); + CLog::Log(LOGNOTICE, "%s - Fallback to monoscopic mode.", __FUNCTION__); + + scDesc1.Stereo = false; + hr = dxgiFactory2->CreateSwapChainForHwnd(m_pD3DDev, m_hFocusWnd, &scDesc1, &scFSDesc, NULL, &m_pSwapChain1); + + // fallback to split_horisontal mode. + g_graphicsContext.SetStereoMode(RENDER_STEREO_MODE_SPLIT_HORIZONTAL); + } + if (SUCCEEDED(hr)) { m_pSwapChain1->QueryInterface(__uuidof(IDXGISwapChain), reinterpret_cast(&m_pSwapChain)); @@ -861,17 +875,6 @@ bool CRenderSystemDX::CreateWindowSizeDependentResources() } m_bHWStereoEnabled = bHWStereoEnabled; } - else if (bHWStereoEnabled) - { - // switch to stereo mode failed, create mono swapchain - CLog::Log(LOGERROR, "%s - Creating swap chain failed with error: %s.", __FUNCTION__, GetErrorDescription(hr).c_str()); - - scDesc1.Stereo = false; - hr = dxgiFactory2->CreateSwapChainForHwnd(m_pD3DDev, m_hFocusWnd, &scDesc1, &scFSDesc, NULL, &m_pSwapChain1); - - // fallback to split_horisontal mode. - g_graphicsContext.SetStereoMode(RENDER_STEREO_MODE_SPLIT_HORIZONTAL); - } dxgiFactory2->Release(); } else From 9b9de1fa9ab67f0e6fbb9a5017347e6685bc14cf Mon Sep 17 00:00:00 2001 From: txtranslation Date: Sun, 3 Apr 2016 21:12:11 +0100 Subject: [PATCH 12/16] [lang] updated language files from Transifex --- addons/repository.xbmc.org/addon.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/repository.xbmc.org/addon.xml b/addons/repository.xbmc.org/addon.xml index 2064d8f015..e966d920e5 100644 --- a/addons/repository.xbmc.org/addon.xml +++ b/addons/repository.xbmc.org/addon.xml @@ -1,7 +1,7 @@ @@ -111,7 +111,7 @@ Превземи и инсталирај Додатоци од официјалниот Kodi.tv склад.[CR] Со користење на официјалниот склад ќе бидете во можност да ги користите предностите на нашата богата датотека со услуги која ви помага да добиете побрзи превземања од регионот блиску до вас.[CR] Сите Додатоци во овој склад се основно тестирани, ако најдете неисправни или додатоци кои не работат пријавете го тоа на тимот на Kodi така што ќе можеме да превземеме било каква акција што е потребна. Muat turun dan pasang tambahan PVR melalui repositori rasmi Kodi.tv[CR] Dengan menggunakan Repositori rasmi anda dapat perkhidmatan cermin fail yang luas supaya dapat memuat turun lebih pantas menerusi kawasan berhampiran anda.[CR] Semua tambahan di dalam repositori ini telah lulus pengujian asas, jika anda temui tambahan yang rosak atau tidak berfungsi sila laporkannya kepada Team-Kodi supaya kami boleh membuat tindakan yang sewajarnya. Niżżel u nstalla add-ons mir-repożitorju uffiċjali ta Kodi.tv.[CR] Permezz ta' dan ir-ripożitorju uffiċjali tista' tieħu vantaġġ mis-servizz ta' file mirrors estensiv li jgħinek tniżżel l-add-ons iktar malajr minn postijiet li huma ġeografikament qrib tiegħek.[CR] L-Add-ons kollha f'dan ir-repożitorju għaddew minn testijiet bażiċi, f'każ li tinzerta xi add-on miksura jew mhux taħdem jekk jpgħġbok irrportha lil Team-Kodi biex inkunu nistgħu nieħdu l-azzjoni li jkun hemm bżonn. - Last ned og installer utvidelser fra den offisielle Kodi.tv pakkebrønnen.[CR] Når du benytter den offisielle pakkebrønnen kan du dra nytte av vår omfattende arkivtjeneste slik at du får raskere nedlasting fra en server nær deg.[CR] Alle tillegg i denne brønnen har gått gjennom grunnleggende testing, men hvis du finner et tillegg som ikke fungerer, vennligst rapporter det til Team-Kodi så vi får sett på det. + Last ned og installer utvidelser fra den offisielle Kodi.tv pakkebrønnen.[CR] Når du benytter den offisielle pakkebrønnen kan du dra nytte av vår omfattende arkivtjeneste slik at du får raskere nedlasting fra en tjener nær deg.[CR] Alle utvidelser i denne brønnen har gått gjennom grunnleggende testing, men hvis du finner en utvidelse som ikke fungerer, vennligst rapporter det til Team-Kodi så vi får sett på det. Download en installeer add-ons uit de officiële Kodi.tv add-on depot.[CR] Wanneer u de officiële depot gebruikt beschikt u over onze uitgebreide mirrorservice, waardoor u snel kan downloaden van locaties in uw buurt.[CR] Alle add-ons in dit depot ondergingen standaardtests; indien u een defecte of niet-werkende add-on vindt, meld dit dan aan Team-Kodi zodat zij actie kunnen ondernemen. Pobieraj i instaluj dodatki z oficjalnego repozytorium Kodi.tv.[CR] Używając oficjalnego repozytorium korzystasz z serwerów lustrzanych, rozsianych po całym świecie. Wybierany jest ten, który znajduje się najbliżej ciebie, zapewniając dużą prędkość połączenia.[CR]Wszystkie dodatki znajdujące się w tym repozytorium są testowane, ale mogą okazać się niesprawne. Zgłoś wówczas błąd, aby zespół Kodi mógł podjąć odpowiednie działanie. Transfira e instale add-ons a partir do repositório oficial do Kodi.tv.[CR]|Ao utilizar o repositório oficial, você será capaz de tirar proveito do nosso serviço de espelhamento de arquivos, auxiliando em downloads mais rápidos a partir de uma região perto de você.[CR]|Todos os add-ons neste repositório passam por testes básicos, se você encontrar algum quebrado ou que não esteja funcionando, por favor reporte para a equipe do Kodi, para que possamos tomar as ações necessárias. From 9f9e102def0a97122955165d65e9e4cf7ba17020 Mon Sep 17 00:00:00 2001 From: anaconda Date: Tue, 5 Apr 2016 01:42:08 +0200 Subject: [PATCH 13/16] videoinfotag: fix typo introduced in e6e2d0ace5cfe6191b8f7727ced1747854254ce4 Fixes the crash reported at http://forum.kodi.tv/showthread.php?tid=125749&pid=2302058#pid2302058 --- xbmc/video/VideoInfoTag.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbmc/video/VideoInfoTag.cpp b/xbmc/video/VideoInfoTag.cpp index 20bcd97740..707da3a3e0 100644 --- a/xbmc/video/VideoInfoTag.cpp +++ b/xbmc/video/VideoInfoTag.cpp @@ -771,7 +771,7 @@ void CVideoInfoTag::ParseNative(const TiXmlElement* movie, bool prioritise) namedSeason->Attribute("number", &seasonNumber) != nullptr) m_namedSeasons.insert(std::make_pair(seasonNumber, seasonName)); - namedSeason = thumb->NextSiblingElement("namedseason"); + namedSeason = namedSeason->NextSiblingElement("namedseason"); } // cast From 2661aa323f5ecb991814ec06adb257c7651df8e8 Mon Sep 17 00:00:00 2001 From: DaveTBlake Date: Thu, 14 Apr 2016 18:37:45 +0100 Subject: [PATCH 14/16] Fix song reported on playback of songs from cuesheet --- xbmc/FileItem.cpp | 7 ++++++- xbmc/interfaces/json-rpc/schema/version.txt | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/xbmc/FileItem.cpp b/xbmc/FileItem.cpp index 1903ec88e2..018693044d 100644 --- a/xbmc/FileItem.cpp +++ b/xbmc/FileItem.cpp @@ -1480,7 +1480,12 @@ void CFileItem::SetFromSong(const CSong &song) { if (!song.strTitle.empty()) SetLabel(song.strTitle); - if (!song.strFileName.empty()) + if (song.idSong > 0) + { + std::string strExt = URIUtils::GetExtension(song.strFileName); + m_strPath = StringUtils::Format("musicdb://songs/%i%s", song.idSong, strExt.c_str()); + } + else if (!song.strFileName.empty()) m_strPath = song.strFileName; GetMusicInfoTag()->SetSong(song); m_lStartOffset = song.iStartOffset; diff --git a/xbmc/interfaces/json-rpc/schema/version.txt b/xbmc/interfaces/json-rpc/schema/version.txt index d9589113ad..73b46b0715 100644 --- a/xbmc/interfaces/json-rpc/schema/version.txt +++ b/xbmc/interfaces/json-rpc/schema/version.txt @@ -1 +1 @@ -6.32.4 +6.32.5 From 9f6c9742477808260dae09ffe9adec557152ec56 Mon Sep 17 00:00:00 2001 From: live4ever Date: Thu, 21 Apr 2016 15:27:34 -0400 Subject: [PATCH 15/16] Added files via upload --- .../skin.confluence/media/KeyboardKeyNFVS.png | Bin 0 -> 5597 bytes addons/skin.confluence/media/KeyboardKeyVS.png | Bin 0 -> 10281 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 addons/skin.confluence/media/KeyboardKeyNFVS.png create mode 100644 addons/skin.confluence/media/KeyboardKeyVS.png diff --git a/addons/skin.confluence/media/KeyboardKeyNFVS.png b/addons/skin.confluence/media/KeyboardKeyNFVS.png new file mode 100644 index 0000000000000000000000000000000000000000..10370342170a337a9190825156a48b5597865ef4 GIT binary patch literal 5597 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 Date: Thu, 21 Apr 2016 15:31:53 -0400 Subject: [PATCH 16/16] Update DialogKeyboard.xml Change from IP label to a image texture for voice search. --- addons/skin.confluence/720p/DialogKeyboard.xml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/addons/skin.confluence/720p/DialogKeyboard.xml b/addons/skin.confluence/720p/DialogKeyboard.xml index 55f0f3a3bb..4e7164de6d 100644 --- a/addons/skin.confluence/720p/DialogKeyboard.xml +++ b/addons/skin.confluence/720p/DialogKeyboard.xml @@ -388,18 +388,15 @@ 0 horizontal - IP Input button + Android Voice Search 100 50 303 300 - - KeyboardKeyNF.png - KeyboardKey.png + KeyboardKeyNFVS.png + KeyboardKeyVS.png center center - font13 - black Symbols button