Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp
- index 563ce78..61813f9 100644
- --- a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp
- +++ b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/DVDOverlayCodecFFmpeg.cpp
- @@ -28,6 +28,7 @@
- #include "utils/Win32Exception.h"
- #include "utils/log.h"
- #include "utils/EndianSwap.h"
- +#include "settings/AdvancedSettings.h"
- CDVDOverlayCodecFFmpeg::CDVDOverlayCodecFFmpeg() : CDVDOverlayCodec("FFmpeg Subtitle Decoder")
- {
- @@ -245,7 +246,8 @@ CDVDOverlay* CDVDOverlayCodecFFmpeg::GetOverlay()
- CDVDOverlayImage* overlay = new CDVDOverlayImage();
- overlay->iPTSStartTime = DVD_MSEC_TO_TIME(m_Subtitle.start_display_time);
- - overlay->iPTSStopTime = DVD_MSEC_TO_TIME(m_Subtitle.end_display_time);
- + //ffmpeg pgssub default to 20 seconds which is so annoying that we override with our own advanced setting if less
- + overlay->iPTSStopTime = std::min(DVD_SEC_TO_TIME(g_advancedSettings.m_videoSubsOverlayMaxLinger), DVD_MSEC_TO_TIME(m_Subtitle.end_display_time));
- overlay->replace = true;
- overlay->linesize = rect.w;
- overlay->data = (BYTE*)malloc(rect.w * rect.h);
- diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp
- index 9267b6f..d4e0cc0 100644
- --- a/xbmc/cores/dvdplayer/DVDPlayer.cpp
- +++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp
- @@ -3314,7 +3314,7 @@ bool CDVDPlayer::GetCurrentSubtitle(CStdString& strSubtitle)
- m_dvdPlayerSubtitle.GetCurrentSubtitle(strSubtitle, pts - m_dvdPlayerVideo.GetSubtitleDelay());
- // In case we stalled, don't output any subs
- - if (m_dvdPlayerVideo.IsStalled() || m_dvdPlayerAudio.IsStalled())
- + if (m_dvdPlayerVideo.IsStalled())
- strSubtitle = m_lastSub;
- else
- m_lastSub = strSubtitle;
- diff --git a/xbmc/guilib/GUIFontManager.cpp b/xbmc/guilib/GUIFontManager.cpp
- index 98c4bd0..96576e0 100644
- --- a/xbmc/guilib/GUIFontManager.cpp
- +++ b/xbmc/guilib/GUIFontManager.cpp
- @@ -75,7 +75,7 @@ void GUIFontManager::RescaleFontSizeAndAspect(float *size, float *aspect, RESOLU
- *size /= g_graphicsContext.GetGUIScaleY();
- }
- -CGUIFont* GUIFontManager::LoadTTF(const CStdString& strFontName, const CStdString& strFilename, color_t textColor, color_t shadowColor, const int iSize, const int iStyle, bool border, float lineSpacing, float aspect, RESOLUTION sourceRes, bool preserveAspect)
- +CGUIFont* GUIFontManager::LoadTTF(const CStdString& strFontName, const CStdString& strFilename, color_t textColor, color_t shadowColor, const int iSize, const int iStyle, bool border, float lineSpacing, float aspect, RESOLUTION sourceRes, bool preserveAspect, bool precache /*= false */)
- {
- float originalAspect = aspect;
- @@ -121,7 +121,7 @@ CGUIFont* GUIFontManager::LoadTTF(const CStdString& strFontName, const CStdStrin
- if (!pFontFile)
- {
- pFontFile = new CGUIFontTTF(TTFfontName);
- - bool bFontLoaded = pFontFile->Load(strPath, newSize, aspect, 1.0f, border);
- + bool bFontLoaded = pFontFile->Load(strPath, newSize, aspect, 1.0f, border, precache);
- if (!bFontLoaded)
- {
- diff --git a/xbmc/guilib/GUIFontManager.h b/xbmc/guilib/GUIFontManager.h
- index acdc46b..bf0764f 100644
- --- a/xbmc/guilib/GUIFontManager.h
- +++ b/xbmc/guilib/GUIFontManager.h
- @@ -63,7 +63,8 @@ public:
- void Unload(const CStdString& strFontName);
- void LoadFonts(const CStdString& strFontSet);
- - CGUIFont* LoadTTF(const CStdString& strFontName, const CStdString& strFilename, color_t textColor, color_t shadowColor, const int iSize, const int iStyle, bool border = false, float lineSpacing = 1.0f, float aspect = 1.0f, RESOLUTION res = RES_INVALID, bool preserveAspect = false);
- + CGUIFont* LoadTTF(const CStdString& strFontName, const CStdString& strFilename, color_t textColor, color_t shadowColor, const int iSize, const int iStyle, bool border = false, float lineSpacing = 1.0f, float aspect = 1.0f, RESOLUTION res = RES_INVALID, bool preserveAspect = false, bool precache = false);
- +
- CGUIFont* GetFont(const CStdString& strFontName, bool fallback = true);
- /*! \brief return a default font
- diff --git a/xbmc/guilib/GUIFontTTF.cpp b/xbmc/guilib/GUIFontTTF.cpp
- index b72de5c..d976682 100644
- --- a/xbmc/guilib/GUIFontTTF.cpp
- +++ b/xbmc/guilib/GUIFontTTF.cpp
- @@ -28,6 +28,8 @@
- #include "utils/MathUtils.h"
- #include "utils/log.h"
- #include "windowing/WindowingFactory.h"
- +#include "utils/TimeUtils.h"
- +#include "settings/AdvancedSettings.h"
- #include <math.h>
- @@ -226,7 +228,7 @@ void CGUIFontTTFBase::Clear()
- m_vertex_count = 0;
- }
- -bool CGUIFontTTFBase::Load(const CStdString& strFilename, float height, float aspect, float lineSpacing, bool border)
- +bool CGUIFontTTFBase::Load(const CStdString& strFilename, float height, float aspect, float lineSpacing, bool border, bool precache /* = false */)
- {
- // we now know that this object is unique - only the GUIFont objects are non-unique, so no need
- // for reference tracking these fonts
- @@ -247,6 +249,10 @@ bool CGUIFontTTFBase::Load(const CStdString& strFilename, float height, float as
- FT_Pos strength = FT_MulFix( m_face->units_per_EM, m_face->size->metrics.y_scale) / 12;
- if (strength < 128)
- strength = 128;
- + // I don't see why strength should make m_CellHeight more than double and it uses up valuable texture space and CPU so clamp to double for large values
- + else if (strength > 256 && strength > (int)m_cellHeight)
- + strength = m_cellHeight;
- +
- m_cellHeight += 2*strength;
- if (m_stroker)
- @@ -302,9 +308,63 @@ bool CGUIFontTTFBase::Load(const CStdString& strFilename, float height, float as
- Character *ellipse = GetCharacter(L'.');
- if (ellipse) m_ellipsesWidth = ellipse->advance;
- + if (precache)
- + {
- + int64_t start = CurrentHostCounter();
- + CGUIFontTTFBase::PreCacheCharacters();
- + CLog::Log(LOGDEBUG, "CGUIFontTTFBase::Load finished pre-caching characters in %i ms (currently cached %i)", (int)((CurrentHostCounter() - start) * 1000 / CurrentHostFrequency()), m_numChars);
- + }
- +
- return true;
- }
- +bool CGUIFontTTFBase::PreCacheCharacters()
- +{
- + int count = 0;
- + if ((int)g_advancedSettings.m_SubsTTFPreCacheCodes.size() > 0)
- + {
- + CLog::Log(LOGNOTICE, "CGUIFontTTFBase::PreCacheCharacters Pre-caching custom character codes in 4 styles");
- + for (int i = 0; i < (int)g_advancedSettings.m_SubsTTFPreCacheCodes.size(); i++)
- + {
- + if ((int)g_advancedSettings.m_SubsTTFPreCacheCodes[i] == 13)
- + continue; //line breaks don't get cached
- + for (uint32_t style = 0; style <= 3; style++)
- + {
- + if (! GetCharacter((character_t)(g_advancedSettings.m_SubsTTFPreCacheCodes[i] | ((style & 3) << 24))))
- + {
- + CLog::Log(LOGWARNING, "CGUIFontTTFBase::PreCacheCharacters failure to cache character, aborting pre-caching");
- + return false;
- + }
- + count++;
- + }
- + }
- + }
- + else
- + {
- + CLog::Log(LOGNOTICE, "CGUIFontTTFBase::PreCacheCharacters Pre-caching character codes 0-255 in 4 styles");
- + for (uint32_t i = 0; i < 256; i++)
- + {
- + if ((int)i == 13)
- + continue; //line breaks don't get cached
- + for (uint32_t style = 0; style <= 3; style++)
- + {
- + if (! GetCharacter((character_t)(i | ((style & 3) << 24))))
- + {
- + CLog::Log(LOGWARNING, "CGUIFontTTFBase::PreCacheCharacters failure to cache character, aborting pre-caching");
- + return false;
- + }
- + count++;
- + }
- + }
- + }
- + if (m_numChars < count)
- + {
- + //issue a warning that we may have missed some - due to problems along the way (eg max raster size exceeded)
- + CLog::Log(LOGWARNING, "CGUIFontTTFBase::PreCacheCharacters cached character count is less than the attempted pre-cache number - a problem may have occurred [attempts: %i, total cached: %i]", count, m_numChars);
- + }
- + return true;
- +}
- +
- void CGUIFontTTFBase::DrawTextInternal(float x, float y, const vecColors &colors, const vecText &text, uint32_t alignment, float maxPixelWidth, bool scrolling)
- {
- Begin();
- @@ -504,7 +564,7 @@ CGUIFontTTFBase::Character* CGUIFontTTFBase::GetCharacter(character_t chr)
- if (nestedBeginCount) End();
- if (!CacheCharacter(letter, style, m_char + low))
- { // unable to cache character - try clearing them all out and starting over
- - CLog::Log(LOGDEBUG, "GUIFontTTF::GetCharacter: Unable to cache character. Clearing character cache of %i characters", m_numChars);
- + CLog::Log(LOGWARNING, "GUIFontTTF::GetCharacter: Unable to cache character. Clearing character cache of %i characters", m_numChars);
- ClearCharacterCache();
- low = 0;
- if (!CacheCharacter(letter, style, m_char + low))
- @@ -539,7 +599,7 @@ bool CGUIFontTTFBase::CacheCharacter(wchar_t letter, uint32_t style, Character *
- FT_Glyph glyph = NULL;
- if (FT_Load_Glyph( m_face, glyph_index, FT_LOAD_TARGET_LIGHT ))
- {
- - CLog::Log(LOGDEBUG, "%s Failed to load glyph %x", __FUNCTION__, letter);
- + CLog::Log(LOGWARNING, "%s Failed to load glyph %x", __FUNCTION__, letter);
- return false;
- }
- // make bold if applicable
- @@ -551,7 +611,7 @@ bool CGUIFontTTFBase::CacheCharacter(wchar_t letter, uint32_t style, Character *
- // grab the glyph
- if (FT_Get_Glyph(m_face->glyph, &glyph))
- {
- - CLog::Log(LOGDEBUG, "%s Failed to get glyph %x", __FUNCTION__, letter);
- + CLog::Log(LOGWARNING, "%s Failed to get glyph %x", __FUNCTION__, letter);
- return false;
- }
- if (m_stroker)
- @@ -559,7 +619,7 @@ bool CGUIFontTTFBase::CacheCharacter(wchar_t letter, uint32_t style, Character *
- // render the glyph
- if (FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, NULL, 1))
- {
- - CLog::Log(LOGDEBUG, "%s Failed to render glyph %x to a bitmap", __FUNCTION__, letter);
- + CLog::Log(LOGWARNING, "%s Failed to render glyph %x to a bitmap", __FUNCTION__, letter);
- return false;
- }
- FT_BitmapGlyph bitGlyph = (FT_BitmapGlyph)glyph;
- @@ -582,7 +642,7 @@ bool CGUIFontTTFBase::CacheCharacter(wchar_t letter, uint32_t style, Character *
- // check for max height
- if (newHeight > g_Windowing.GetMaxTextureSize())
- {
- - CLog::Log(LOGDEBUG, "GUIFontTTF::CacheCharacter: New cache texture is too large (%u > %u pixels long)", newHeight, g_Windowing.GetMaxTextureSize());
- + CLog::Log(LOGWARNING, "GUIFontTTF::CacheCharacter: New cache texture is too large (%u > %u pixels long)", newHeight, g_Windowing.GetMaxTextureSize());
- FT_Done_Glyph(glyph);
- return false;
- }
- @@ -592,7 +652,7 @@ bool CGUIFontTTFBase::CacheCharacter(wchar_t letter, uint32_t style, Character *
- if(newTexture == NULL)
- {
- FT_Done_Glyph(glyph);
- - CLog::Log(LOGDEBUG, "GUIFontTTF::CacheCharacter: Failed to allocate new texture of height %u", newHeight);
- + CLog::Log(LOGWARNING, "GUIFontTTF::CacheCharacter: Failed to allocate new texture of height %u", newHeight);
- return false;
- }
- m_texture = newTexture;
- diff --git a/xbmc/guilib/GUIFontTTF.h b/xbmc/guilib/GUIFontTTF.h
- index c509ad0..7230aff 100644
- --- a/xbmc/guilib/GUIFontTTF.h
- +++ b/xbmc/guilib/GUIFontTTF.h
- @@ -72,7 +72,7 @@ public:
- void Clear();
- - bool Load(const CStdString& strFilename, float height = 20.0f, float aspect = 1.0f, float lineSpacing = 1.0f, bool border = false);
- + bool Load(const CStdString& strFilename, float height = 20.0f, float aspect = 1.0f, float lineSpacing = 1.0f, bool border = false, bool precache = false);
- virtual void Begin() = 0;
- virtual void End() = 0;
- @@ -107,6 +107,7 @@ protected:
- bool CacheCharacter(wchar_t letter, uint32_t style, Character *ch);
- void RenderCharacter(float posX, float posY, const Character *ch, color_t color, bool roundX);
- void ClearCharacterCache();
- + bool PreCacheCharacters();
- virtual CBaseTexture* ReallocTexture(unsigned int& newHeight) = 0;
- virtual bool CopyCharToTexture(FT_BitmapGlyph bitGlyph, Character *ch) = 0;
- diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp
- index 17b2476..3a76a24 100644
- --- a/xbmc/settings/AdvancedSettings.cpp
- +++ b/xbmc/settings/AdvancedSettings.cpp
- @@ -64,6 +64,10 @@ void CAdvancedSettings::Initialize()
- m_audioPlayCountMinimumPercent = 90.0f;
- m_audioHost = "default";
- + m_videoSubsTTFPreCache = false;
- + m_videoSubsTTFBorderFontDisable = false;
- + m_videoSubsOverlayMaxLinger = 5;
- +
- m_videoSubsDelayRange = 10;
- m_videoAudioDelayRange = 10;
- m_videoSmallStepBackSeconds = 7;
- @@ -430,6 +434,56 @@ bool CAdvancedSettings::Load()
- XMLUtils::GetFloat(pElement,"autoscalemaxfps",m_videoAutoScaleMaxFps, 0.0f, 1000.0f);
- XMLUtils::GetBoolean(pElement,"allowmpeg4vdpau",m_videoAllowMpeg4VDPAU);
- + XMLUtils::GetBoolean(pElement, "substtfprecache", m_videoSubsTTFPreCache);
- + XMLUtils::GetBoolean(pElement, "substtfborderfontdisable", m_videoSubsTTFBorderFontDisable);
- + XMLUtils::GetInt(pElement, "subsoverlaymaxlinger", m_videoSubsOverlayMaxLinger, 0, 30);
- +
- + TiXmlElement* pSubsTTFPreCacheCodes = pElement->FirstChildElement("substtfprecachecodes");
- + if (pSubsTTFPreCacheCodes)
- + {
- + m_SubsTTFPreCacheCodes.clear();
- + TiXmlNode* pAdd = pSubsTTFPreCacheCodes->FirstChild("add");
- +
- + while (pAdd)
- + {
- +
- + CStdString strAdd;
- + if (pAdd)
- + strAdd = pAdd->FirstChild()->Value();
- + if (!strAdd.IsEmpty())
- + {
- +
- + CStdStringArray components;
- + StringUtils::SplitString(strAdd,",",components);
- + for (unsigned int i=0;i<components.size();++i)
- + {
- + // check for a range
- + CLog::Log(LOGDEBUG,"Advanced Settings Load substtf pre-cache code add %s", components[i].c_str());
- + CStdStringArray rangecomponents;
- + StringUtils::SplitString(components[i],"-",rangecomponents);
- + if (rangecomponents.size() == 2)
- + {
- + unsigned int min = strtoul(rangecomponents[0].c_str(), NULL, 0);
- + unsigned int max = strtoul(rangecomponents[1].c_str(), NULL, 0);
- + for (unsigned int j=min; j<=max; j++)
- + {
- + m_SubsTTFPreCacheCodes.push_back(j);
- + }
- + }
- + else
- + {
- + // not sure which c++ method is provided for better than strtoul conversion but for now the 0 issue is not worth worrying about as we may as well cache it anyway
- + unsigned int code = strtoul(components[i].c_str(), NULL, 0);
- + m_SubsTTFPreCacheCodes.push_back(code);
- + }
- + }
- + }
- +
- + // get next one
- + pAdd = pAdd->NextSibling("add");
- + }
- + }
- +
- TiXmlElement* pAdjustRefreshrate = pElement->FirstChildElement("adjustrefreshrate");
- if (pAdjustRefreshrate)
- {
- diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h
- index 571b3ad..df3d9ff 100644
- --- a/xbmc/settings/AdvancedSettings.h
- +++ b/xbmc/settings/AdvancedSettings.h
- @@ -206,6 +206,11 @@ class CAdvancedSettings
- CStdString m_videoItemSeparator;
- std::vector<CStdString> m_musicTagsFromFileFilters;
- + bool m_videoSubsTTFPreCache;
- + bool m_videoSubsTTFBorderFontDisable;
- + int m_videoSubsOverlayMaxLinger;
- + std::vector<unsigned int> m_SubsTTFPreCacheCodes;
- +
- bool m_bVideoLibraryHideAllItems;
- bool m_bVideoLibraryAllItemsOnBottom;
- int m_iVideoLibraryRecentlyAddedItems;
- diff --git a/xbmc/video/windows/GUIWindowFullScreen.cpp b/xbmc/video/windows/GUIWindowFullScreen.cpp
- index de31f14..53c56c7 100644
- --- a/xbmc/video/windows/GUIWindowFullScreen.cpp
- +++ b/xbmc/video/windows/GUIWindowFullScreen.cpp
- @@ -586,12 +586,22 @@ bool CGUIWindowFullScreen::OnMessage(CGUIMessage& message)
- fontPath += g_guiSettings.GetString("subtitles.font");
- // We scale based on PAL4x3 - this at least ensures all sizing is constant across resolutions.
- - CGUIFont *subFont = g_fontManager.LoadTTF("__subtitle__", fontPath, color[g_guiSettings.GetInt("subtitles.color")], 0, g_guiSettings.GetInt("subtitles.height"), g_guiSettings.GetInt("subtitles.style"), false, 1.0f, 1.0f, RES_PAL_4x3, true);
- - CGUIFont *borderFont = g_fontManager.LoadTTF("__subtitleborder__", fontPath, 0xFF000000, 0, g_guiSettings.GetInt("subtitles.height"), g_guiSettings.GetInt("subtitles.style"), true, 1.0f, 1.0f, RES_PAL_4x3, true);
- - if (!subFont || !borderFont)
- + bool precache = g_advancedSettings.m_videoSubsTTFPreCache;
- + CLog::Log(LOGDEBUG, "CGUIWindowFullScreen::OnMessage g_advancedSettings.m_videoSubsTTFPreCache: %i, g_advancedSettings.m_videoSubsTTFBorderFontDisable: %i", (int)g_advancedSettings.m_videoSubsTTFPreCache, (int)g_advancedSettings.m_videoSubsTTFBorderFontDisable);
- + CGUIFont *subFont = g_fontManager.LoadTTF("__subtitle__", fontPath, color[g_guiSettings.GetInt("subtitles.color")], 0, g_guiSettings.GetInt("subtitles.height"), g_guiSettings.GetInt("subtitles.style"), false, 1.0f, 1.0f, RES_PAL_4x3, true, precache);
- + CGUIFont *borderFont = NULL;
- + bool borderfontenabled = !g_advancedSettings.m_videoSubsTTFBorderFontDisable;
- + if (borderfontenabled)
- + borderFont = g_fontManager.LoadTTF("__subtitleborder__", fontPath, 0xFF000000, 0, g_guiSettings.GetInt("subtitles.height"), g_guiSettings.GetInt("subtitles.style"), true, 1.0f, 1.0f, RES_PAL_4x3, true, precache);
- +
- + if (!subFont || (borderfontenabled && !borderFont))
- CLog::Log(LOGERROR, "CGUIWindowFullScreen::OnMessage(WINDOW_INIT) - Unable to load subtitle font");
- else
- + {
- m_subsLayout = new CGUITextLayout(subFont, true, 0, borderFont);
- + //force some subtitles to render initially render to pre-initialise that area to avoid video render delays later
- + RenderTTFSubtitles(true);
- + }
- }
- else
- m_subsLayout = NULL;
- @@ -846,10 +856,10 @@ void CGUIWindowFullScreen::Render()
- CGUIWindow::Render();
- }
- -void CGUIWindowFullScreen::RenderTTFSubtitles()
- +void CGUIWindowFullScreen::RenderTTFSubtitles(bool forcetest /* = false */)
- {
- if ((g_application.GetCurrentPlayer() == EPC_MPLAYER || g_application.GetCurrentPlayer() == EPC_DVDPLAYER) &&
- - CUtil::IsUsingTTFSubtitles() && (g_application.m_pPlayer->GetSubtitleVisible()))
- + CUtil::IsUsingTTFSubtitles() && (forcetest || g_application.m_pPlayer->GetSubtitleVisible()))
- {
- CSingleLock lock (m_fontLock);
- @@ -857,8 +867,11 @@ void CGUIWindowFullScreen::RenderTTFSubtitles()
- return;
- CStdString subtitleText = "How now brown cow";
- - if (g_application.m_pPlayer->GetCurrentSubtitle(subtitleText))
- + if (forcetest || g_application.m_pPlayer->GetCurrentSubtitle(subtitleText))
- {
- + if (forcetest)
- + subtitleText = "INVISIBLE SUBS FOR INIT";
- +
- // Remove HTML-like tags from the subtitles until
- subtitleText.Replace("\\r", "");
- subtitleText.Replace("\r", "");
- @@ -890,7 +903,10 @@ void CGUIWindowFullScreen::RenderTTFSubtitles()
- float x = maxWidth * 0.5f + g_settings.m_ResInfo[res].Overscan.left;
- float y = g_settings.m_ResInfo[res].iSubtitles - textHeight;
- - m_subsLayout->RenderOutline(x, y, 0, 0xFF000000, XBFONT_CENTER_X, maxWidth);
- + if (forcetest)
- + m_subsLayout->RenderOutline(x, y, 0x00FFFFFF, 0x00FFFFFF, XBFONT_CENTER_X, maxWidth); //00 alpha=transparent, FF red FF green FF blue (note 0x0 does not work)
- + else
- + m_subsLayout->RenderOutline(x, y, 0, 0xFF000000, XBFONT_CENTER_X, maxWidth);
- }
- }
- }
- diff --git a/xbmc/video/windows/GUIWindowFullScreen.h b/xbmc/video/windows/GUIWindowFullScreen.h
- index 26e7ba5..8ff04b1 100644
- --- a/xbmc/video/windows/GUIWindowFullScreen.h
- +++ b/xbmc/video/windows/GUIWindowFullScreen.h
- @@ -48,7 +48,7 @@ protected:
- virtual void OnDeinitWindow(int nextWindow) {}; // no out window animation for fullscreen video
- private:
- - void RenderTTFSubtitles();
- + void RenderTTFSubtitles(bool forcetest = false);
- void SeekChapter(int iChapter);
- void ToggleOSD();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement