Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

1045 lines (937 sloc) 36.592 kb
/*
* Copyright (C) 2005-2008 Team XBMC
* http://www.xbmc.org
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This Program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XBMC; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
* http://www.gnu.org/copyleft/gpl.html
*
*/
#include "system.h"
#include "GUIWindowFullScreen.h"
#include "Application.h"
#include "Util.h"
#ifdef HAS_VIDEO_PLAYBACK
#include "cores/VideoRenderers/RenderManager.h"
#endif
#include "GUIInfoManager.h"
#include "guilib/GUIProgressControl.h"
#include "guilib/GUIAudioManager.h"
#include "guilib/GUILabelControl.h"
#include "video/dialogs/GUIDialogVideoOSD.h"
#include "guilib/GUIFontManager.h"
#include "guilib/GUITextLayout.h"
#include "guilib/GUIWindowManager.h"
#include "video/dialogs/GUIDialogFullScreenInfo.h"
#include "video/dialogs/GUIDialogAudioSubtitleSettings.h"
#include "dialogs/GUIDialogNumeric.h"
#include "dialogs/GUIDialogKaiToast.h"
#include "guilib/GUISliderControl.h"
#include "settings/Settings.h"
#include "FileItem.h"
#include "video/VideoReferenceClock.h"
#include "settings/AdvancedSettings.h"
#include "utils/CPUInfo.h"
#include "settings/GUISettings.h"
#include "guilib/LocalizeStrings.h"
#include "threads/SingleLock.h"
#include "utils/log.h"
#include "utils/TimeUtils.h"
#include "utils/URIUtils.h"
#include "XBDateTime.h"
#include "input/ButtonTranslator.h"
#include <stdio.h>
#ifdef __APPLE__
#include "linux/LinuxResourceCounter.h"
#endif
#define BLUE_BAR 0
#define LABEL_ROW1 10
#define LABEL_ROW2 11
#define LABEL_ROW3 12
#define BTN_OSD_VIDEO 13
#define BTN_OSD_AUDIO 14
#define BTN_OSD_SUBTITLE 15
#define MENU_ACTION_AVDELAY 1
#define MENU_ACTION_SEEK 2
#define MENU_ACTION_SUBTITLEDELAY 3
#define MENU_ACTION_SUBTITLEONOFF 4
#define MENU_ACTION_SUBTITLELANGUAGE 5
#define MENU_ACTION_INTERLEAVED 6
#define MENU_ACTION_FRAMERATECONVERSIONS 7
#define MENU_ACTION_AUDIO_STREAM 8
#define MENU_ACTION_NEW_BOOKMARK 9
#define MENU_ACTION_NEXT_BOOKMARK 10
#define MENU_ACTION_CLEAR_BOOKMARK 11
#define MENU_ACTION_NOCACHE 12
#define IMG_PAUSE 16
#define IMG_2X 17
#define IMG_4X 18
#define IMG_8X 19
#define IMG_16X 20
#define IMG_32X 21
#define IMG_2Xr 117
#define IMG_4Xr 118
#define IMG_8Xr 119
#define IMG_16Xr 120
#define IMG_32Xr 121
//Displays current position, visible after seek or when forced
//Alt, use conditional visibility Player.DisplayAfterSeek
#define LABEL_CURRENT_TIME 22
//Displays when video is rebuffering
//Alt, use conditional visibility Player.IsCaching
#define LABEL_BUFFERING 24
//Progressbar used for buffering status and after seeking
#define CONTROL_PROGRESS 23
#ifdef __APPLE__
static CLinuxResourceCounter m_resourceCounter;
#endif
static color_t color[8] = { 0xFFFFFF00, 0xFFFFFFFF, 0xFF0099FF, 0xFF00FF00, 0xFFCCFF00, 0xFF00FFFF, 0xFFE5E5E5, 0xFFC0C0C0 };
CGUIWindowFullScreen::CGUIWindowFullScreen(void)
: CGUIWindow(WINDOW_FULLSCREEN_VIDEO, "VideoFullScreen.xml")
{
m_timeCodeStamp[0] = 0;
m_timeCodePosition = 0;
m_timeCodeShow = false;
m_timeCodeTimeout = 0;
m_bShowViewModeInfo = false;
m_dwShowViewModeTimeout = 0;
m_bShowCurrentTime = false;
m_subsLayout = NULL;
m_sliderAction = 0;
// audio
// - language
// - volume
// - stream
// video
// - Create Bookmark (294)
// - Cycle bookmarks (295)
// - Clear bookmarks (296)
// - jump to specific time
// - slider
// - av delay
// subtitles
// - delay
// - language
}
CGUIWindowFullScreen::~CGUIWindowFullScreen(void)
{}
void CGUIWindowFullScreen::AllocResources(bool forceLoad)
{
CGUIWindow::AllocResources(forceLoad);
DynamicResourceAlloc(false);
}
void CGUIWindowFullScreen::FreeResources(bool forceUnload)
{
g_settings.Save();
DynamicResourceAlloc(true);
CGUIWindow::FreeResources(forceUnload);
}
bool CGUIWindowFullScreen::OnAction(const CAction &action)
{
if (g_application.m_pPlayer != NULL && g_application.m_pPlayer->OnAction(action))
return true;
if (m_timeCodePosition > 0 && action.GetButtonCode())
{ // check whether we have a mapping in our virtual videotimeseek "window" and have a select action
CKey key(action.GetButtonCode());
CAction timeSeek = CButtonTranslator::GetInstance().GetAction(WINDOW_VIDEO_TIME_SEEK, key, false);
if (timeSeek.GetID() == ACTION_SELECT_ITEM)
{
SeekToTimeCodeStamp(SEEK_ABSOLUTE);
return true;
}
}
const unsigned int MsgTime = 300;
const unsigned int DisplTime = 2000;
switch (action.GetID())
{
case ACTION_SHOW_OSD:
ToggleOSD();
return true;
case ACTION_SHOW_GUI:
{
// switch back to the menu
OutputDebugString("Switching to GUI\n");
g_windowManager.PreviousWindow();
OutputDebugString("Now in GUI\n");
return true;
}
break;
case ACTION_PLAYER_PLAY:
case ACTION_PAUSE:
if (m_timeCodePosition > 0)
{
SeekToTimeCodeStamp(SEEK_ABSOLUTE);
return true;
}
break;
case ACTION_STEP_BACK:
if (m_timeCodePosition > 0)
SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD);
else
g_application.m_pPlayer->Seek(false, false);
return true;
break;
case ACTION_STEP_FORWARD:
if (m_timeCodePosition > 0)
SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_FORWARD);
else
g_application.m_pPlayer->Seek(true, false);
return true;
break;
case ACTION_BIG_STEP_BACK:
if (m_timeCodePosition > 0)
SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD);
else
g_application.m_pPlayer->Seek(false, true);
return true;
break;
case ACTION_BIG_STEP_FORWARD:
if (m_timeCodePosition > 0)
SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_FORWARD);
else
g_application.m_pPlayer->Seek(true, true);
return true;
break;
case ACTION_NEXT_SCENE:
if (g_application.m_pPlayer->SeekScene(true))
g_infoManager.SetDisplayAfterSeek();
return true;
break;
case ACTION_PREV_SCENE:
if (g_application.m_pPlayer->SeekScene(false))
g_infoManager.SetDisplayAfterSeek();
return true;
break;
case ACTION_SHOW_OSD_TIME:
m_bShowCurrentTime = !m_bShowCurrentTime;
if(!m_bShowCurrentTime)
g_infoManager.SetDisplayAfterSeek(0); //Force display off
g_infoManager.SetShowTime(m_bShowCurrentTime);
return true;
break;
case ACTION_SHOW_SUBTITLES:
{
g_settings.m_currentVideoSettings.m_SubtitleOn = !g_settings.m_currentVideoSettings.m_SubtitleOn;
g_application.m_pPlayer->SetSubtitleVisible(g_settings.m_currentVideoSettings.m_SubtitleOn);
CStdString sub, lang;
if (g_settings.m_currentVideoSettings.m_SubtitleOn)
{
g_application.m_pPlayer->GetSubtitleName(g_application.m_pPlayer->GetSubtitle(),sub);
g_application.m_pPlayer->GetSubtitleLanguage(g_application.m_pPlayer->GetSubtitle(),lang);
if (sub != lang)
{
CStdString filename;
g_application.m_pPlayer->GetSubtitleFilename(g_application.m_pPlayer->GetSubtitle(),filename);
if (sub != URIUtils::GetFileName(filename))
sub.Format("%s [%s]", sub.c_str(), lang.c_str());
else
sub.Format("%s [%s]", lang.c_str(), sub.c_str());
}
}
else
sub = g_localizeStrings.Get(1223);
CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info,
g_localizeStrings.Get(287), sub, DisplTime, false, MsgTime);
}
return true;
break;
case ACTION_SHOW_INFO:
{
CGUIDialogFullScreenInfo* pDialog = (CGUIDialogFullScreenInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_FULLSCREEN_INFO);
if (pDialog)
{
pDialog->DoModal();
return true;
}
break;
}
case ACTION_NEXT_SUBTITLE:
{
if (g_application.m_pPlayer->GetSubtitleCount() == 0)
return true;
if(g_settings.m_currentVideoSettings.m_SubtitleStream < 0)
g_settings.m_currentVideoSettings.m_SubtitleStream = g_application.m_pPlayer->GetSubtitle();
if (g_settings.m_currentVideoSettings.m_SubtitleOn)
{
g_settings.m_currentVideoSettings.m_SubtitleStream++;
if (g_settings.m_currentVideoSettings.m_SubtitleStream >= g_application.m_pPlayer->GetSubtitleCount())
{
g_settings.m_currentVideoSettings.m_SubtitleStream = 0;
g_settings.m_currentVideoSettings.m_SubtitleOn = false;
g_application.m_pPlayer->SetSubtitleVisible(false);
}
g_application.m_pPlayer->SetSubtitle(g_settings.m_currentVideoSettings.m_SubtitleStream);
}
else
{
g_settings.m_currentVideoSettings.m_SubtitleOn = true;
g_application.m_pPlayer->SetSubtitleVisible(true);
}
CStdString sub, lang;
if (g_settings.m_currentVideoSettings.m_SubtitleOn)
{
g_application.m_pPlayer->GetSubtitleName(g_settings.m_currentVideoSettings.m_SubtitleStream,sub);
g_application.m_pPlayer->GetSubtitleLanguage(g_settings.m_currentVideoSettings.m_SubtitleStream,lang);
if (sub != lang)
{
CStdString filename;
g_application.m_pPlayer->GetSubtitleFilename(g_settings.m_currentVideoSettings.m_SubtitleStream,filename);
if (sub != URIUtils::GetFileName(filename))
sub.Format("%s [%s]", sub.c_str(), lang.c_str());
else
sub.Format("%s [%s]", lang.c_str(), sub.c_str());
}
}
else
sub = g_localizeStrings.Get(1223);
CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(287), sub, DisplTime, false, MsgTime);
}
return true;
break;
case ACTION_SUBTITLE_DELAY_MIN:
g_settings.m_currentVideoSettings.m_SubtitleDelay -= 0.1f;
if (g_settings.m_currentVideoSettings.m_SubtitleDelay < -g_advancedSettings.m_videoSubsDelayRange)
g_settings.m_currentVideoSettings.m_SubtitleDelay = -g_advancedSettings.m_videoSubsDelayRange;
if (g_application.m_pPlayer)
g_application.m_pPlayer->SetSubTitleDelay(g_settings.m_currentVideoSettings.m_SubtitleDelay);
ShowSlider(action.GetID(), 22006, g_settings.m_currentVideoSettings.m_SubtitleDelay,
-g_advancedSettings.m_videoSubsDelayRange, 0.1f,
g_advancedSettings.m_videoSubsDelayRange);
return true;
break;
case ACTION_SUBTITLE_DELAY_PLUS:
g_settings.m_currentVideoSettings.m_SubtitleDelay += 0.1f;
if (g_settings.m_currentVideoSettings.m_SubtitleDelay > g_advancedSettings.m_videoSubsDelayRange)
g_settings.m_currentVideoSettings.m_SubtitleDelay = g_advancedSettings.m_videoSubsDelayRange;
if (g_application.m_pPlayer)
g_application.m_pPlayer->SetSubTitleDelay(g_settings.m_currentVideoSettings.m_SubtitleDelay);
ShowSlider(action.GetID(), 22006, g_settings.m_currentVideoSettings.m_SubtitleDelay,
-g_advancedSettings.m_videoSubsDelayRange, 0.1f,
g_advancedSettings.m_videoSubsDelayRange);
return true;
break;
case ACTION_SUBTITLE_DELAY:
ShowSlider(action.GetID(), 22006, g_settings.m_currentVideoSettings.m_SubtitleDelay,
-g_advancedSettings.m_videoSubsDelayRange, 0.1f,
g_advancedSettings.m_videoSubsDelayRange, true);
return true;
break;
case ACTION_AUDIO_DELAY:
ShowSlider(action.GetID(), 297, g_settings.m_currentVideoSettings.m_AudioDelay,
-g_advancedSettings.m_videoAudioDelayRange, 0.025f,
g_advancedSettings.m_videoAudioDelayRange, true);
return true;
break;
case ACTION_AUDIO_DELAY_MIN:
g_settings.m_currentVideoSettings.m_AudioDelay -= 0.025f;
if (g_settings.m_currentVideoSettings.m_AudioDelay < -g_advancedSettings.m_videoAudioDelayRange)
g_settings.m_currentVideoSettings.m_AudioDelay = -g_advancedSettings.m_videoAudioDelayRange;
if (g_application.m_pPlayer)
g_application.m_pPlayer->SetAVDelay(g_settings.m_currentVideoSettings.m_AudioDelay);
ShowSlider(action.GetID(), 297, g_settings.m_currentVideoSettings.m_AudioDelay,
-g_advancedSettings.m_videoAudioDelayRange, 0.025f,
g_advancedSettings.m_videoAudioDelayRange);
return true;
break;
case ACTION_AUDIO_DELAY_PLUS:
g_settings.m_currentVideoSettings.m_AudioDelay += 0.025f;
if (g_settings.m_currentVideoSettings.m_AudioDelay > g_advancedSettings.m_videoAudioDelayRange)
g_settings.m_currentVideoSettings.m_AudioDelay = g_advancedSettings.m_videoAudioDelayRange;
if (g_application.m_pPlayer)
g_application.m_pPlayer->SetAVDelay(g_settings.m_currentVideoSettings.m_AudioDelay);
ShowSlider(action.GetID(), 297, g_settings.m_currentVideoSettings.m_AudioDelay,
-g_advancedSettings.m_videoAudioDelayRange, 0.025f,
g_advancedSettings.m_videoAudioDelayRange);
return true;
break;
case ACTION_AUDIO_NEXT_LANGUAGE:
{
if (g_application.m_pPlayer->GetAudioStreamCount() == 1)
return true;
g_settings.m_currentVideoSettings.m_AudioStream++;
if (g_settings.m_currentVideoSettings.m_AudioStream >= g_application.m_pPlayer->GetAudioStreamCount())
g_settings.m_currentVideoSettings.m_AudioStream = 0;
g_application.m_pPlayer->SetAudioStream(g_settings.m_currentVideoSettings.m_AudioStream); // Set the audio stream to the one selected
CStdString aud;
g_application.m_pPlayer->GetAudioStreamName(g_settings.m_currentVideoSettings.m_AudioStream,aud);
CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Info, g_localizeStrings.Get(460), aud, DisplTime, false, MsgTime);
return true;
}
break;
case REMOTE_0:
case REMOTE_1:
case REMOTE_2:
case REMOTE_3:
case REMOTE_4:
case REMOTE_5:
case REMOTE_6:
case REMOTE_7:
case REMOTE_8:
case REMOTE_9:
{
if (g_application.CurrentFileItem().IsLiveTV())
{
int channelNr = -1;
CStdString strChannel;
strChannel.Format("%i", action.GetID() - REMOTE_0);
if (CGUIDialogNumeric::ShowAndGetNumber(strChannel, g_localizeStrings.Get(19000)))
channelNr = atoi(strChannel.c_str());
if (channelNr > 0)
OnAction(CAction(ACTION_CHANNEL_SWITCH, (float)channelNr));
}
else
{
ChangetheTimeCode(action.GetID());
}
return true;
}
break;
case ACTION_ASPECT_RATIO:
{ // toggle the aspect ratio mode (only if the info is onscreen)
if (m_bShowViewModeInfo)
{
#ifdef HAS_VIDEO_PLAYBACK
g_renderManager.SetViewMode(++g_settings.m_currentVideoSettings.m_ViewMode);
#endif
}
m_bShowViewModeInfo = true;
m_dwShowViewModeTimeout = CTimeUtils::GetTimeMS();
}
return true;
break;
case ACTION_SMALL_STEP_BACK:
if (m_timeCodePosition > 0)
SeekToTimeCodeStamp(SEEK_RELATIVE, SEEK_BACKWARD);
else
{
int orgpos = (int)g_application.GetTime();
int jumpsize = g_advancedSettings.m_videoSmallStepBackSeconds; // secs
int setpos = (orgpos > jumpsize) ? orgpos - jumpsize : 0;
g_application.SeekTime((double)setpos);
}
return true;
break;
case ACTION_ZOOM_IN:
{
g_settings.m_currentVideoSettings.m_CustomZoomAmount += 0.01f;
if (g_settings.m_currentVideoSettings.m_CustomZoomAmount > 2.f)
g_settings.m_currentVideoSettings.m_CustomZoomAmount = 2.f;
g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM;
g_renderManager.SetViewMode(VIEW_MODE_CUSTOM);
ShowSlider(action.GetID(), 216, g_settings.m_currentVideoSettings.m_CustomZoomAmount, 0.5f, 0.1f, 2.0f);
}
return true;
break;
case ACTION_ZOOM_OUT:
{
g_settings.m_currentVideoSettings.m_CustomZoomAmount -= 0.01f;
if (g_settings.m_currentVideoSettings.m_CustomZoomAmount < 0.5f)
g_settings.m_currentVideoSettings.m_CustomZoomAmount = 0.5f;
g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM;
g_renderManager.SetViewMode(VIEW_MODE_CUSTOM);
ShowSlider(action.GetID(), 216, g_settings.m_currentVideoSettings.m_CustomZoomAmount, 0.5f, 0.1f, 2.0f);
}
return true;
break;
case ACTION_INCREASE_PAR:
{
g_settings.m_currentVideoSettings.m_CustomPixelRatio += 0.01f;
if (g_settings.m_currentVideoSettings.m_CustomPixelRatio > 2.f)
g_settings.m_currentVideoSettings.m_CustomZoomAmount = 2.f;
g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM;
g_renderManager.SetViewMode(VIEW_MODE_CUSTOM);
ShowSlider(action.GetID(), 217, g_settings.m_currentVideoSettings.m_CustomPixelRatio, 0.5f, 0.1f, 2.0f);
}
return true;
break;
case ACTION_DECREASE_PAR:
{
g_settings.m_currentVideoSettings.m_CustomPixelRatio -= 0.01f;
if (g_settings.m_currentVideoSettings.m_CustomZoomAmount < 0.5f)
g_settings.m_currentVideoSettings.m_CustomPixelRatio = 0.5f;
g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM;
g_renderManager.SetViewMode(VIEW_MODE_CUSTOM);
ShowSlider(action.GetID(), 217, g_settings.m_currentVideoSettings.m_CustomPixelRatio, 0.5f, 0.1f, 2.0f);
}
return true;
break;
case ACTION_VSHIFT_UP:
{
g_settings.m_currentVideoSettings.m_CustomVerticalShift -= 0.01f;
if (g_settings.m_currentVideoSettings.m_CustomVerticalShift < -2.0f)
g_settings.m_currentVideoSettings.m_CustomVerticalShift = -2.0f;
g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM;
g_renderManager.SetViewMode(VIEW_MODE_CUSTOM);
ShowSlider(action.GetID(), 225, g_settings.m_currentVideoSettings.m_CustomVerticalShift, -2.0f, 0.1f, 2.0f);
}
return true;
break;
case ACTION_VSHIFT_DOWN:
{
g_settings.m_currentVideoSettings.m_CustomVerticalShift += 0.01f;
if (g_settings.m_currentVideoSettings.m_CustomVerticalShift > 2.0f)
g_settings.m_currentVideoSettings.m_CustomVerticalShift = 2.0f;
g_settings.m_currentVideoSettings.m_ViewMode = VIEW_MODE_CUSTOM;
g_renderManager.SetViewMode(VIEW_MODE_CUSTOM);
ShowSlider(action.GetID(), 225, g_settings.m_currentVideoSettings.m_CustomVerticalShift, -2.0f, 0.1f, 2.0f);
}
return true;
break;
default:
break;
}
return CGUIWindow::OnAction(action);
}
void CGUIWindowFullScreen::OnWindowLoaded()
{
CGUIWindow::OnWindowLoaded();
// override the clear colour - we must never clear fullscreen
m_clearBackground = 0;
CGUIProgressControl* pProgress = (CGUIProgressControl*)GetControl(CONTROL_PROGRESS);
if(pProgress)
{
if( pProgress->GetInfo() == 0 || pProgress->GetVisibleCondition() == 0)
{
pProgress->SetInfo(PLAYER_PROGRESS);
pProgress->SetVisibleCondition(PLAYER_DISPLAY_AFTER_SEEK, false);
pProgress->SetVisible(true);
}
}
CGUILabelControl* pLabel = (CGUILabelControl*)GetControl(LABEL_BUFFERING);
if(pLabel && pLabel->GetVisibleCondition() == 0)
{
pLabel->SetVisibleCondition(PLAYER_CACHING, false);
pLabel->SetVisible(true);
}
pLabel = (CGUILabelControl*)GetControl(LABEL_CURRENT_TIME);
if(pLabel && pLabel->GetVisibleCondition() == 0)
{
pLabel->SetVisibleCondition(PLAYER_DISPLAY_AFTER_SEEK, false);
pLabel->SetVisible(true);
pLabel->SetLabel("$INFO(VIDEOPLAYER.TIME) / $INFO(VIDEOPLAYER.DURATION)");
}
}
bool CGUIWindowFullScreen::OnMessage(CGUIMessage& message)
{
switch (message.GetMessage())
{
case GUI_MSG_WINDOW_INIT:
{
// check whether we've come back here from a window during which time we've actually
// stopped playing videos
if (message.GetParam1() == WINDOW_INVALID && !g_application.IsPlayingVideo())
{ // why are we here if nothing is playing???
g_windowManager.PreviousWindow();
return true;
}
g_infoManager.SetShowInfo(false);
g_infoManager.SetShowCodec(false);
m_bShowCurrentTime = false;
g_infoManager.SetDisplayAfterSeek(0); // Make sure display after seek is off.
// switch resolution
g_graphicsContext.SetFullScreenVideo(true);
#ifdef HAS_VIDEO_PLAYBACK
// make sure renderer is uptospeed
g_renderManager.Update(false);
#endif
// now call the base class to load our windows
CGUIWindow::OnMessage(message);
m_bShowViewModeInfo = false;
if (CUtil::IsUsingTTFSubtitles())
{
CSingleLock lock (m_fontLock);
CStdString fontPath = "special://xbmc/media/Fonts/";
fontPath += g_guiSettings.GetString("subtitles.font");
// We scale based on PAL4x3 - this at least ensures all sizing is constant across resolutions.
RESOLUTION_INFO pal(720, 576, 0);
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, &pal, 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, &pal, true);
if (!subFont || !borderFont)
CLog::Log(LOGERROR, "CGUIWindowFullScreen::OnMessage(WINDOW_INIT) - Unable to load subtitle font");
else
m_subsLayout = new CGUITextLayout(subFont, true, 0, borderFont);
}
else
m_subsLayout = NULL;
return true;
}
case GUI_MSG_WINDOW_DEINIT:
{
CGUIWindow::OnMessage(message);
CGUIDialog *pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_OSD_TELETEXT);
if (pDialog) pDialog->Close(true);
CGUIDialogSlider *slider = (CGUIDialogSlider *)g_windowManager.GetWindow(WINDOW_DIALOG_SLIDER);
if (slider) slider->Close(true);
pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_VIDEO_OSD);
if (pDialog) pDialog->Close(true);
pDialog = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_FULLSCREEN_INFO);
if (pDialog) pDialog->Close(true);
FreeResources(true);
CSingleLock lock (g_graphicsContext);
g_graphicsContext.SetFullScreenVideo(false);
lock.Leave();
#ifdef HAS_VIDEO_PLAYBACK
// make sure renderer is uptospeed
g_renderManager.Update(false);
#endif
CSingleLock lockFont(m_fontLock);
if (m_subsLayout)
{
g_fontManager.Unload("__subtitle__");
g_fontManager.Unload("__subtitleborder__");
delete m_subsLayout;
m_subsLayout = NULL;
}
return true;
}
case GUI_MSG_SETFOCUS:
case GUI_MSG_LOSTFOCUS:
if (message.GetSenderId() != WINDOW_FULLSCREEN_VIDEO) return true;
break;
}
return CGUIWindow::OnMessage(message);
}
EVENT_RESULT CGUIWindowFullScreen::OnMouseEvent(const CPoint &point, const CMouseEvent &event)
{
if (event.m_id == ACTION_MOUSE_RIGHT_CLICK)
{ // no control found to absorb this click - go back to GUI
OnAction(CAction(ACTION_SHOW_GUI));
return EVENT_RESULT_HANDLED;
}
if (event.m_id == ACTION_MOUSE_WHEEL_UP)
{
return g_application.OnAction(CAction(ACTION_ANALOG_SEEK_FORWARD, 0.5f)) ? EVENT_RESULT_HANDLED : EVENT_RESULT_UNHANDLED;
}
if (event.m_id == ACTION_MOUSE_WHEEL_DOWN)
{
return g_application.OnAction(CAction(ACTION_ANALOG_SEEK_BACK, 0.5f)) ? EVENT_RESULT_HANDLED : EVENT_RESULT_UNHANDLED;
}
if (event.m_id != ACTION_MOUSE_MOVE || event.m_offsetX || event.m_offsetY)
{ // some other mouse action has occurred - bring up the OSD
CGUIDialogVideoOSD *pOSD = (CGUIDialogVideoOSD *)g_windowManager.GetWindow(WINDOW_DIALOG_VIDEO_OSD);
if (pOSD)
{
pOSD->SetAutoClose(3000);
pOSD->DoModal();
}
return EVENT_RESULT_HANDLED;
}
return EVENT_RESULT_UNHANDLED;
}
void CGUIWindowFullScreen::FrameMove()
{
if (g_application.GetPlaySpeed() != 1)
g_infoManager.SetDisplayAfterSeek();
if (m_bShowCurrentTime)
g_infoManager.SetDisplayAfterSeek();
if (!g_application.m_pPlayer) return;
if( g_application.m_pPlayer->IsCaching() )
{
g_infoManager.SetDisplayAfterSeek(0); //Make sure these stuff aren't visible now
}
//------------------------
if (g_infoManager.GetBool(PLAYER_SHOWCODEC))
{
// show audio codec info
CStdString strAudio, strVideo, strGeneral;
g_application.m_pPlayer->GetAudioInfo(strAudio);
{
CGUIMessage msg(GUI_MSG_LABEL_SET, GetID(), LABEL_ROW1);
msg.SetLabel(strAudio);
OnMessage(msg);
}
// show video codec info
g_application.m_pPlayer->GetVideoInfo(strVideo);
{
CGUIMessage msg(GUI_MSG_LABEL_SET, GetID(), LABEL_ROW2);
msg.SetLabel(strVideo);
OnMessage(msg);
}
// show general info
g_application.m_pPlayer->GetGeneralInfo(strGeneral);
{
CStdString strGeneralFPS;
#ifdef __APPLE__
// We show CPU usage for the entire process, as it's arguably more useful.
double dCPU = m_resourceCounter.GetCPUUsage();
CStdString strCores;
strCores.Format("cpu:%.0f%%", dCPU);
#else
CStdString strCores = g_cpuInfo.GetCoresUsageString();
#endif
int missedvblanks;
int refreshrate;
double clockspeed;
CStdString strClock;
if (g_VideoReferenceClock.GetClockInfo(missedvblanks, clockspeed, refreshrate))
strClock.Format("S( refresh:%i missed:%i speed:%+.3f%% %s )"
, refreshrate
, missedvblanks
, clockspeed - 100.0
, g_renderManager.GetVSyncState().c_str());
strGeneralFPS.Format("%s\nW( fps:%02.2f %s ) %s"
, strGeneral.c_str()
, g_infoManager.GetFPS()
, strCores.c_str(), strClock.c_str() );
CGUIMessage msg(GUI_MSG_LABEL_SET, GetID(), LABEL_ROW3);
msg.SetLabel(strGeneralFPS);
OnMessage(msg);
}
}
//----------------------
// ViewMode Information
//----------------------
if (m_bShowViewModeInfo && CTimeUtils::GetTimeMS() - m_dwShowViewModeTimeout > 2500)
{
m_bShowViewModeInfo = false;
}
if (m_bShowViewModeInfo)
{
{
// get the "View Mode" string
CStdString strTitle = g_localizeStrings.Get(629);
CStdString strMode = g_localizeStrings.Get(630 + g_settings.m_currentVideoSettings.m_ViewMode);
CStdString strInfo;
strInfo.Format("%s : %s", strTitle.c_str(), strMode.c_str());
CGUIMessage msg(GUI_MSG_LABEL_SET, GetID(), LABEL_ROW1);
msg.SetLabel(strInfo);
OnMessage(msg);
}
// show sizing information
CRect SrcRect, DestRect;
float fAR;
g_application.m_pPlayer->GetVideoRect(SrcRect, DestRect);
g_application.m_pPlayer->GetVideoAspectRatio(fAR);
{
CStdString strSizing;
strSizing.Format(g_localizeStrings.Get(245),
(int)SrcRect.Width(), (int)SrcRect.Height(),
(int)DestRect.Width(), (int)DestRect.Height(),
g_settings.m_fZoomAmount, fAR*g_settings.m_fPixelRatio,
g_settings.m_fPixelRatio, g_settings.m_fVerticalShift);
CGUIMessage msg(GUI_MSG_LABEL_SET, GetID(), LABEL_ROW2);
msg.SetLabel(strSizing);
OnMessage(msg);
}
// show resolution information
int iResolution = g_graphicsContext.GetVideoResolution();
{
CStdString strStatus;
if (g_settings.m_ResInfo[iResolution].bFullScreen)
strStatus.Format("%s %ix%i@%.2fHz - %s",
g_localizeStrings.Get(13287), g_settings.m_ResInfo[iResolution].iWidth,
g_settings.m_ResInfo[iResolution].iHeight, g_settings.m_ResInfo[iResolution].fRefreshRate,
g_localizeStrings.Get(244));
else
strStatus.Format("%s %ix%i - %s",
g_localizeStrings.Get(13287), g_settings.m_ResInfo[iResolution].iWidth,
g_settings.m_ResInfo[iResolution].iHeight, g_localizeStrings.Get(242));
CGUIMessage msg(GUI_MSG_LABEL_SET, GetID(), LABEL_ROW3);
msg.SetLabel(strStatus);
OnMessage(msg);
}
}
if (m_timeCodeShow && m_timeCodePosition != 0)
{
if ( (CTimeUtils::GetTimeMS() - m_timeCodeTimeout) >= 2500)
{
m_timeCodeShow = false;
m_timeCodePosition = 0;
}
CStdString strDispTime = "00:00:00";
CGUIMessage msg(GUI_MSG_LABEL_SET, GetID(), LABEL_ROW1);
for (int pos = 7, i = m_timeCodePosition; pos >= 0 && i > 0; pos--)
{
if (strDispTime[pos] != ':')
{
i -= 1;
strDispTime[pos] = (char)m_timeCodeStamp[i] + '0';
}
}
strDispTime += "/" + g_infoManager.GetDuration(TIME_FORMAT_HH_MM_SS) + " [" + g_infoManager.GetCurrentPlayTime(TIME_FORMAT_HH_MM_SS) + "]"; // duration [ time ]
msg.SetLabel(strDispTime);
OnMessage(msg);
}
if (g_infoManager.GetBool(PLAYER_SHOWCODEC) || m_bShowViewModeInfo)
{
SET_CONTROL_VISIBLE(LABEL_ROW1);
SET_CONTROL_VISIBLE(LABEL_ROW2);
SET_CONTROL_VISIBLE(LABEL_ROW3);
SET_CONTROL_VISIBLE(BLUE_BAR);
}
else if (m_timeCodeShow)
{
SET_CONTROL_VISIBLE(LABEL_ROW1);
SET_CONTROL_HIDDEN(LABEL_ROW2);
SET_CONTROL_HIDDEN(LABEL_ROW3);
SET_CONTROL_VISIBLE(BLUE_BAR);
}
else
{
SET_CONTROL_HIDDEN(LABEL_ROW1);
SET_CONTROL_HIDDEN(LABEL_ROW2);
SET_CONTROL_HIDDEN(LABEL_ROW3);
SET_CONTROL_HIDDEN(BLUE_BAR);
}
}
void CGUIWindowFullScreen::Process(unsigned int currentTime, CDirtyRegionList &dirtyregion)
{
// TODO: This isn't quite optimal - ideally we'd only be dirtying up the actual video render rect
// which is probably the job of the renderer as it can more easily track resizing etc.
MarkDirtyRegion();
CGUIWindow::Process(currentTime, dirtyregion);
m_renderRegion.SetRect(0, 0, (float)g_graphicsContext.GetWidth(), (float)g_graphicsContext.GetHeight());
}
void CGUIWindowFullScreen::Render()
{
if (g_application.m_pPlayer)
RenderTTFSubtitles();
CGUIWindow::Render();
}
void CGUIWindowFullScreen::RenderTTFSubtitles()
{
if ((g_application.GetCurrentPlayer() == EPC_MPLAYER || g_application.GetCurrentPlayer() == EPC_DVDPLAYER) &&
CUtil::IsUsingTTFSubtitles() && (g_application.m_pPlayer->GetSubtitleVisible()))
{
CSingleLock lock (m_fontLock);
if(!m_subsLayout)
return;
CStdString subtitleText = "How now brown cow";
if (g_application.m_pPlayer->GetCurrentSubtitle(subtitleText))
{
// Remove HTML-like tags from the subtitles until
subtitleText.Replace("\\r", "");
subtitleText.Replace("\r", "");
subtitleText.Replace("\\n", "[CR]");
subtitleText.Replace("\n", "[CR]");
subtitleText.Replace("<br>", "[CR]");
subtitleText.Replace("\\N", "[CR]");
subtitleText.Replace("<i>", "[I]");
subtitleText.Replace("</i>", "[/I]");
subtitleText.Replace("<b>", "[B]");
subtitleText.Replace("</b>", "[/B]");
subtitleText.Replace("<u>", "");
subtitleText.Replace("<p>", "");
subtitleText.Replace("<P>", "");
subtitleText.Replace("&nbsp;", "");
subtitleText.Replace("</u>", "");
subtitleText.Replace("</i", "[/I]"); // handle tags which aren't closed properly (happens).
subtitleText.Replace("</b", "[/B]");
subtitleText.Replace("</u", "");
RESOLUTION res = g_graphicsContext.GetVideoResolution();
g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false);
float maxWidth = (float) g_settings.m_ResInfo[res].Overscan.right - g_settings.m_ResInfo[res].Overscan.left;
m_subsLayout->Update(subtitleText, maxWidth * 0.9f, false, true); // true to force LTR reading order (most Hebrew subs are this format)
float textWidth, textHeight;
m_subsLayout->GetTextExtent(textWidth, textHeight);
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);
// reset rendering resolution
g_graphicsContext.SetRenderingResolution(m_coordsRes, m_needsScaling);
}
}
}
void CGUIWindowFullScreen::ChangetheTimeCode(int remote)
{
if (remote >= REMOTE_0 && remote <= REMOTE_9)
{
m_timeCodeShow = true;
m_timeCodeTimeout = CTimeUtils::GetTimeMS();
if (m_timeCodePosition < 6)
m_timeCodeStamp[m_timeCodePosition++] = remote - REMOTE_0;
else
{
// rotate around
for (int i = 0; i < 5; i++)
m_timeCodeStamp[i] = m_timeCodeStamp[i+1];
m_timeCodeStamp[5] = remote - REMOTE_0;
}
}
}
void CGUIWindowFullScreen::SeekToTimeCodeStamp(SEEK_TYPE type, SEEK_DIRECTION direction)
{
double total = GetTimeCodeStamp();
if (type == SEEK_RELATIVE)
total = g_application.GetTime() + (((direction == SEEK_FORWARD) ? 1 : -1) * total);
if (total < g_application.GetTotalTime())
g_application.SeekTime(total);
m_timeCodePosition = 0;
m_timeCodeShow = false;
}
double CGUIWindowFullScreen::GetTimeCodeStamp()
{
// Convert the timestamp into an integer
int tot = 0;
for (int i = 0; i < m_timeCodePosition; i++)
tot = tot * 10 + m_timeCodeStamp[i];
// Interpret result as HHMMSS
int s = tot % 100; tot /= 100;
int m = tot % 100; tot /= 100;
int h = tot % 100;
return h * 3600 + m * 60 + s;
}
void CGUIWindowFullScreen::SeekChapter(int iChapter)
{
g_application.m_pPlayer->SeekChapter(iChapter);
// Make sure gui items are visible.
g_infoManager.SetDisplayAfterSeek();
}
void CGUIWindowFullScreen::ShowSlider(int action, int label, float value, float min, float delta, float max, bool modal)
{
m_sliderAction = action;
if (modal)
CGUIDialogSlider::ShowAndGetInput(g_localizeStrings.Get(label), value, min, delta, max, this);
else
CGUIDialogSlider::Display(label, value, min, delta, max, this);
}
void CGUIWindowFullScreen::OnSliderChange(void *data, CGUISliderControl *slider)
{
if (!slider)
return;
if (m_sliderAction == ACTION_ZOOM_OUT || m_sliderAction == ACTION_ZOOM_IN ||
m_sliderAction == ACTION_INCREASE_PAR || m_sliderAction == ACTION_DECREASE_PAR ||
m_sliderAction == ACTION_VSHIFT_UP || m_sliderAction == ACTION_VSHIFT_DOWN)
{
CStdString strValue;
strValue.Format("%1.2f",slider->GetFloatValue());
slider->SetTextValue(strValue);
}
else
slider->SetTextValue(CGUIDialogAudioSubtitleSettings::FormatDelay(slider->GetFloatValue(), 0.025f));
if (g_application.m_pPlayer)
{
if (m_sliderAction == ACTION_AUDIO_DELAY)
{
g_settings.m_currentVideoSettings.m_AudioDelay = slider->GetFloatValue();
g_application.m_pPlayer->SetAVDelay(g_settings.m_currentVideoSettings.m_AudioDelay);
}
else if (m_sliderAction == ACTION_SUBTITLE_DELAY)
{
g_settings.m_currentVideoSettings.m_SubtitleDelay = slider->GetFloatValue();
g_application.m_pPlayer->SetSubTitleDelay(g_settings.m_currentVideoSettings.m_SubtitleDelay);
}
}
}
void CGUIWindowFullScreen::ToggleOSD()
{
CGUIDialogVideoOSD *pOSD = (CGUIDialogVideoOSD *)g_windowManager.GetWindow(WINDOW_DIALOG_VIDEO_OSD);
if (pOSD)
{
if (pOSD->IsDialogRunning())
pOSD->Close();
else
pOSD->DoModal();
}
}
Jump to Line
Something went wrong with that request. Please try again.