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. diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index e013ca881e..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" @@ -18191,3 +18196,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/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 diff --git a/addons/skin.confluence/media/KeyboardKeyNFVS.png b/addons/skin.confluence/media/KeyboardKeyNFVS.png new file mode 100644 index 0000000000..1037034217 Binary files /dev/null and b/addons/skin.confluence/media/KeyboardKeyNFVS.png differ diff --git a/addons/skin.confluence/media/KeyboardKeyVS.png b/addons/skin.confluence/media/KeyboardKeyVS.png new file mode 100644 index 0000000000..1a3335de92 Binary files /dev/null and b/addons/skin.confluence/media/KeyboardKeyVS.png differ 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/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/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp index e262cddde1..465a394922 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++; @@ -546,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); @@ -614,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); } diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp index de6bbf6d63..fcf3e55274 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; @@ -3292,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 @@ -3383,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/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/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/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..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 @@ -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 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 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 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; 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/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; 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 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) 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)); 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);