2 * Copyright (C) 2005-2013 Team XBMC
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
21 #include "threads/SystemClock.h"
23 #include "DummyVideoPlayer.h"
24 #include "guilib/GUIFontManager.h"
25 #include "guilib/GUITextLayout.h"
26 #include "guilib/GUIFont.h" // for XBFONT_* defines
27 #include "Application.h"
28 #include "settings/AdvancedSettings.h"
29 #include "windowing/WindowingFactory.h"
30 #include "utils/log.h"
31 #include "utils/TimeUtils.h"
32 #include "utils/StringUtils.h"
34 CDummyVideoPlayer::CDummyVideoPlayer(IPlayerCallback& callback)
36 CThread("DummyVideoPlayer")
44 CDummyVideoPlayer::~CDummyVideoPlayer()
49 bool CDummyVideoPlayer::OpenFile(const CFileItem& file, const CPlayerOptions &options)
54 if( options.starttime > 0 )
55 SeekTime( (int64_t)(options.starttime * 1000) );
60 CLog::Log(LOGERROR,"%s - Exception thrown on open", __FUNCTION__);
65 bool CDummyVideoPlayer::CloseFile()
71 bool CDummyVideoPlayer::IsPlaying() const
76 void CDummyVideoPlayer::Process()
79 m_lastTime = XbmcThreads::SystemClockMillis();
81 m_callback.OnPlayBackStarted();
85 m_clock += (XbmcThreads::SystemClockMillis() - m_lastTime)*m_speed;
86 m_lastTime = XbmcThreads::SystemClockMillis();
88 g_graphicsContext.Lock();
89 if (g_graphicsContext.IsFullScreenVideo())
92 g_Windowing.Get3DDevice()->BeginScene();
94 g_graphicsContext.Clear();
95 g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false);
97 g_application.RenderNoPresent();
99 g_Windowing.Get3DDevice()->EndScene();
102 g_graphicsContext.Unlock();
105 m_callback.OnPlayBackEnded();
108 void CDummyVideoPlayer::Pause()
111 m_callback.OnPlayBackResumed();
113 m_callback.OnPlayBackPaused();
114 m_paused = !m_paused;
117 bool CDummyVideoPlayer::IsPaused() const
122 bool CDummyVideoPlayer::HasVideo() const
127 bool CDummyVideoPlayer::HasAudio() const
132 void CDummyVideoPlayer::SwitchToNextLanguage()
136 void CDummyVideoPlayer::ToggleSubtitles()
140 bool CDummyVideoPlayer::CanSeek()
142 return GetTotalTime() > 0;
145 void CDummyVideoPlayer::Seek(bool bPlus, bool bLargeStep, bool bChapterOverride)
147 if (g_advancedSettings.m_videoUseTimeSeeking && GetTotalTime() > 2000*g_advancedSettings.m_videoTimeSeekForwardBig)
151 seek = bPlus ? g_advancedSettings.m_videoTimeSeekForwardBig : g_advancedSettings.m_videoTimeSeekBackwardBig;
153 seek = bPlus ? g_advancedSettings.m_videoTimeSeekForward : g_advancedSettings.m_videoTimeSeekBackward;
155 SeekTime(GetTime() + seek * 1000);
159 float percent = GetPercentage();
161 percent += bPlus ? g_advancedSettings.m_videoPercentSeekForwardBig : g_advancedSettings.m_videoPercentSeekBackwardBig;
163 percent += bPlus ? g_advancedSettings.m_videoPercentSeekForward : g_advancedSettings.m_videoPercentSeekBackward;
165 if (percent >= 0 && percent <= 100)
167 // should be modified to seektime
168 SeekPercentage(percent);
173 void CDummyVideoPlayer::GetAudioInfo(CStdString& strAudioInfo)
175 strAudioInfo = "DummyVideoPlayer - nothing to see here";
178 void CDummyVideoPlayer::GetVideoInfo(CStdString& strVideoInfo)
180 strVideoInfo = "DummyVideoPlayer - nothing to see here";
183 void CDummyVideoPlayer::GetGeneralInfo(CStdString& strGeneralInfo)
185 strGeneralInfo = "DummyVideoPlayer - what are you still looking for?";
188 void CDummyVideoPlayer::SwitchToNextAudioLanguage()
192 void CDummyVideoPlayer::SeekPercentage(float iPercent)
194 int64_t iTime = (int64_t)(GetTotalTime() * iPercent / 100);
198 float CDummyVideoPlayer::GetPercentage()
200 int64_t iTotalTime = GetTotalTime();
204 return GetTime() * 100 / (float)iTotalTime;
210 //This is how much audio is delayed to video, we count the oposite in the dvdplayer
211 void CDummyVideoPlayer::SetAVDelay(float fValue)
215 float CDummyVideoPlayer::GetAVDelay()
220 void CDummyVideoPlayer::SetSubTitleDelay(float fValue)
224 float CDummyVideoPlayer::GetSubTitleDelay()
229 void CDummyVideoPlayer::SeekTime(int64_t iTime)
231 int seekOffset = (int)(iTime - m_clock);
233 m_callback.OnPlayBackSeek((int)iTime, seekOffset);
236 // return the time in milliseconds
237 int64_t CDummyVideoPlayer::GetTime()
242 // return length in milliseconds
243 int64_t CDummyVideoPlayer::GetTotalTime()
248 void CDummyVideoPlayer::ToFFRW(int iSpeed)
251 m_callback.OnPlayBackSpeedChanged(iSpeed);
254 void CDummyVideoPlayer::ShowOSD(bool bOnoff)
258 CStdString CDummyVideoPlayer::GetPlayerState()
263 bool CDummyVideoPlayer::SetPlayerState(CStdString state)
268 void CDummyVideoPlayer::Render()
270 const CRect vw = g_graphicsContext.GetViewWindow();
272 D3DVIEWPORT9 newviewport;
273 D3DVIEWPORT9 oldviewport;
274 g_Windowing.Get3DDevice()->GetViewport(&oldviewport);
275 newviewport.MinZ = 0.0f;
276 newviewport.MaxZ = 1.0f;
277 newviewport.X = (DWORD)vw.x1;
278 newviewport.Y = (DWORD)vw.y1;
279 newviewport.Width = (DWORD)vw.Width();
280 newviewport.Height = (DWORD)vw.Height();
281 g_graphicsContext.SetClipRegion(vw.x1, vw.y1, vw.Width(), vw.Height());
283 g_graphicsContext.SetViewPort(vw.x1, vw.y1, vw.Width(), vw.Height());
285 CGUIFont *font = g_fontManager.GetFont("font13");
288 // minor issue: The font rendering here is performed in screen coords
289 // so shouldn't really be scaled
290 int mins = (int)(m_clock / 60000);
291 int secs = (int)((m_clock / 1000) % 60);
292 int ms = (int)(m_clock % 1000);
293 CStdString currentTime = StringUtils::Format("Video goes here %02i:%02i:%03i", mins, secs, ms);
294 float posX = (vw.x1 + vw.x2) * 0.5f;
295 float posY = (vw.y1 + vw.y2) * 0.5f;
296 CGUITextLayout::DrawText(font, posX, posY, 0xffffffff, 0, currentTime, XBFONT_CENTER_X | XBFONT_CENTER_Y);
299 g_graphicsContext.RestoreClipRegion();
301 g_graphicsContext.RestoreViewPort();