changed: use the rendermanger's critical section for vdpau also
[xbmc:xbmc-antiquated.git] / XBMC / xbmc / cores / VideoRenderers / RenderManager.h
1 #pragma once
2
3 /*
4  *      Copyright (C) 2005-2008 Team XBMC
5  *      http://www.xbmc.org
6  *
7  *  This Program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2, or (at your option)
10  *  any later version.
11  *
12  *  This Program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with XBMC; see the file COPYING.  If not, write to
19  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20  *  http://www.gnu.org/copyleft/gpl.html
21  *
22  */
23
24 #if defined (HAS_SDL_OPENGL)
25 #include "LinuxRendererGL.h"
26 #elif defined(HAS_SDL)
27 #include "LinuxRenderer.h"
28 #elif defined (WIN32)
29 #include "WinRenderManager.h"
30 #endif
31
32 #include "utils/SharedSection.h"
33 #include "utils/Thread.h"
34
35 class CXBoxRenderManager
36 {
37 public:
38   CXBoxRenderManager();
39   ~CXBoxRenderManager();
40
41   // Functions called from the GUI
42   void GetVideoRect(RECT &rs, RECT &rd) { CSharedLock lock(m_sharedSection); if (m_pRenderer) m_pRenderer->GetVideoRect(rs, rd); };
43   float GetAspectRatio() { CSharedLock lock(m_sharedSection); if (m_pRenderer) return m_pRenderer->GetAspectRatio(); else return 1.0f; };
44   void AutoCrop(bool bCrop = true) { CSharedLock lock(m_sharedSection); if (m_pRenderer) m_pRenderer->AutoCrop(bCrop); };
45   void Update(bool bPauseDrawing);
46   void RenderUpdate(bool clear, DWORD flags = 0, DWORD alpha = 255);
47   void SetupScreenshot();
48
49 #ifndef HAS_SDL
50   void CreateThumbnail(LPDIRECT3DSURFACE8 surface, unsigned int width, unsigned int height);
51 #else
52   void CreateThumbnail(SDL_Surface *surface, unsigned int width, unsigned int height);
53 #endif
54
55   void SetViewMode(int iViewMode) { CSharedLock lock(m_sharedSection); if (m_pRenderer) m_pRenderer->SetViewMode(iViewMode); };
56
57   // Functions called from mplayer
58   bool Configure(unsigned int width, unsigned int height, unsigned int d_width, unsigned int d_height, float fps, unsigned flags);
59
60   // a call to GetImage must be followed by a call to releaseimage if getimage was successfull
61   // failure to do so will result in deadlock
62   inline int GetImage(YV12Image *image, int source = AUTOSOURCE, bool readonly = false)
63   {
64     CSharedLock lock(m_sharedSection);
65     if (m_pRenderer)
66       return m_pRenderer->GetImage(image, source, readonly);
67     return -1;
68   }
69   inline void ReleaseImage(int source = AUTOSOURCE, bool preserve = false)
70   {
71     CSharedLock lock(m_sharedSection);
72     if (m_pRenderer)
73       m_pRenderer->ReleaseImage(source, preserve);
74   }
75   inline unsigned int DrawSlice(unsigned char *src[], int stride[], int w, int h, int x, int y)
76   {
77     CSharedLock lock(m_sharedSection);
78     if (m_pRenderer)
79       return m_pRenderer->DrawSlice(src, stride, w, h, x, y);
80     return 0;
81   }
82
83 #ifdef _LINUX
84   // should be called from the GUI thread after playback has finished
85   void OnClose()
86   {
87     CSharedLock lock(m_sharedSection);
88     if (m_pRenderer)
89     {
90       m_pRenderer->OnClose();
91     }
92   }
93 #endif
94
95   void FlipPage(volatile bool& bStop, double timestamp = 0.0, int source = -1, EFIELDSYNC sync = FS_NONE);
96   unsigned int PreInit();
97   void UnInit();
98
99   inline void DrawAlpha(int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride)
100   {
101     CSharedLock lock(m_sharedSection);
102     if (m_pRenderer)
103       m_pRenderer->DrawAlpha(x0, y0, w, h, src, srca, stride);
104   }
105   inline void Reset()
106   {
107     CSharedLock lock(m_sharedSection);
108     if (m_pRenderer)
109       m_pRenderer->Reset();
110   }
111   RESOLUTION GetResolution()
112   {
113     CSharedLock lock(m_sharedSection);
114     if (m_pRenderer)
115       return m_pRenderer->GetResolution();
116     else
117       return INVALID;
118   }
119
120   float GetMaximumFPS();
121   inline bool Paused() { return m_bPauseDrawing; };
122   inline bool IsStarted() { return m_bIsStarted;}
123   bool SupportsBrightness();
124   bool SupportsContrast();
125   bool SupportsGamma();
126
127   double GetPresentTime();
128   void  WaitPresentTime(double presenttime);
129
130 #ifdef HAS_SDL_OPENGL
131   CLinuxRendererGL *m_pRenderer;
132 #elif defined(HAS_SDL)
133   CLinuxRenderer *m_pRenderer;
134 #else
135   CXBoxRenderer *m_pRenderer;
136 #endif
137
138   void Present();
139   void Recover(); // called after resolution switch if something special is needed
140
141   CSharedSection& GetSection() { return m_sharedSection; };
142
143 protected:
144
145   void PresentSingle();
146   void PresentWeave();
147   void PresentBob();
148   void PresentBlend();
149
150   bool m_bPauseDrawing;   // true if we should pause rendering
151
152   bool m_bIsStarted;
153   CSharedSection m_sharedSection;
154
155   int m_rendermethod;
156
157   double     m_presenttime;
158   EFIELDSYNC m_presentfield;
159
160 };
161
162 extern CXBoxRenderManager g_renderManager;
163
164