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"
33 CDummyVideoPlayer::CDummyVideoPlayer(IPlayerCallback& callback)
35 CThread("CDummyVideoPlayer")
43 CDummyVideoPlayer::~CDummyVideoPlayer()
48 bool CDummyVideoPlayer::OpenFile(const CFileItem& file, const CPlayerOptions &options)
53 if( options.starttime > 0 )
54 SeekTime( (int64_t)(options.starttime * 1000) );
59 CLog::Log(LOGERROR,"%s - Exception thrown on open", __FUNCTION__);
64 bool CDummyVideoPlayer::CloseFile()
70 bool CDummyVideoPlayer::IsPlaying() const
75 void CDummyVideoPlayer::Process()
78 m_lastTime = XbmcThreads::SystemClockMillis();
80 m_callback.OnPlayBackStarted();
84 m_clock += (XbmcThreads::SystemClockMillis() - m_lastTime)*m_speed;
85 m_lastTime = XbmcThreads::SystemClockMillis();
87 g_graphicsContext.Lock();
88 if (g_graphicsContext.IsFullScreenVideo())
91 g_Windowing.Get3DDevice()->BeginScene();
93 g_graphicsContext.Clear();
94 g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false);
96 g_application.RenderNoPresent();
98 g_Windowing.Get3DDevice()->EndScene();
101 g_graphicsContext.Unlock();
104 m_callback.OnPlayBackEnded();
107 void CDummyVideoPlayer::Pause()
110 m_callback.OnPlayBackResumed();
112 m_callback.OnPlayBackPaused();
113 m_paused = !m_paused;
116 bool CDummyVideoPlayer::IsPaused() const
121 bool CDummyVideoPlayer::HasVideo() const
126 bool CDummyVideoPlayer::HasAudio() const
131 void CDummyVideoPlayer::SwitchToNextLanguage()
135 void CDummyVideoPlayer::ToggleSubtitles()
139 bool CDummyVideoPlayer::CanSeek()
141 return GetTotalTime() > 0;
144 void CDummyVideoPlayer::Seek(bool bPlus, bool bLargeStep)
146 if (g_advancedSettings.m_videoUseTimeSeeking && GetTotalTime() > 2000*g_advancedSettings.m_videoTimeSeekForwardBig)
150 seek = bPlus ? g_advancedSettings.m_videoTimeSeekForwardBig : g_advancedSettings.m_videoTimeSeekBackwardBig;
152 seek = bPlus ? g_advancedSettings.m_videoTimeSeekForward : g_advancedSettings.m_videoTimeSeekBackward;
154 SeekTime(GetTime() + seek * 1000);
158 float percent = GetPercentage();
160 percent += bPlus ? g_advancedSettings.m_videoPercentSeekForwardBig : g_advancedSettings.m_videoPercentSeekBackwardBig;
162 percent += bPlus ? g_advancedSettings.m_videoPercentSeekForward : g_advancedSettings.m_videoPercentSeekBackward;
164 if (percent >= 0 && percent <= 100)
166 // should be modified to seektime
167 SeekPercentage(percent);
172 void CDummyVideoPlayer::GetAudioInfo(CStdString& strAudioInfo)
174 strAudioInfo = "DummyVideoPlayer - nothing to see here";
177 void CDummyVideoPlayer::GetVideoInfo(CStdString& strVideoInfo)
179 strVideoInfo = "DummyVideoPlayer - nothing to see here";
182 void CDummyVideoPlayer::GetGeneralInfo(CStdString& strGeneralInfo)
184 strGeneralInfo = "DummyVideoPlayer - what are you still looking for?";
187 void CDummyVideoPlayer::SwitchToNextAudioLanguage()
191 void CDummyVideoPlayer::SeekPercentage(float iPercent)
193 int64_t iTime = (int64_t)(GetTotalTime() * iPercent / 100);
197 float CDummyVideoPlayer::GetPercentage()
199 int64_t iTotalTime = GetTotalTime();
203 return GetTime() * 100 / (float)iTotalTime;
209 //This is how much audio is delayed to video, we count the oposite in the dvdplayer
210 void CDummyVideoPlayer::SetAVDelay(float fValue)
214 float CDummyVideoPlayer::GetAVDelay()
219 void CDummyVideoPlayer::SetSubTitleDelay(float fValue)
223 float CDummyVideoPlayer::GetSubTitleDelay()
228 void CDummyVideoPlayer::SeekTime(int64_t iTime)
230 int seekOffset = (int)(iTime - m_clock);
232 m_callback.OnPlayBackSeek((int)iTime, seekOffset);
235 // return the time in milliseconds
236 int64_t CDummyVideoPlayer::GetTime()
241 // return length in milliseconds
242 int64_t CDummyVideoPlayer::GetTotalTime()
247 void CDummyVideoPlayer::ToFFRW(int iSpeed)
250 m_callback.OnPlayBackSpeedChanged(iSpeed);
253 void CDummyVideoPlayer::ShowOSD(bool bOnoff)
257 CStdString CDummyVideoPlayer::GetPlayerState()
262 bool CDummyVideoPlayer::SetPlayerState(CStdString state)
267 void CDummyVideoPlayer::Render()
269 const CRect vw = g_graphicsContext.GetViewWindow();
271 D3DVIEWPORT9 newviewport;
272 D3DVIEWPORT9 oldviewport;
273 g_Windowing.Get3DDevice()->GetViewport(&oldviewport);
274 newviewport.MinZ = 0.0f;
275 newviewport.MaxZ = 1.0f;
276 newviewport.X = (DWORD)vw.x1;
277 newviewport.Y = (DWORD)vw.y1;
278 newviewport.Width = (DWORD)vw.Width();
279 newviewport.Height = (DWORD)vw.Height();
280 g_graphicsContext.SetClipRegion(vw.x1, vw.y1, vw.Width(), vw.Height());
282 g_graphicsContext.SetViewPort(vw.x1, vw.y1, vw.Width(), vw.Height());
284 CGUIFont *font = g_fontManager.GetFont("font13");
287 // minor issue: The font rendering here is performed in screen coords
288 // so shouldn't really be scaled
289 int mins = (int)(m_clock / 60000);
290 int secs = (int)((m_clock / 1000) % 60);
291 int ms = (int)(m_clock % 1000);
292 CStdString currentTime;
293 currentTime.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();