move to self contained device unit, prep for direct to texture.
[xbmc:xbmc-antiquated.git] / XBMC / xbmc / cores / dvdplayer / DVDCodecs / Video / CrystalHD.h
1 #pragma once
2 /*
3  *      Copyright (C) 2005-2009 Team XBMC
4  *      http://www.xbmc.org
5  *
6  *  This Program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2, or (at your option)
9  *  any later version.
10  *
11  *  This Program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with XBMC; see the file COPYING.  If not, write to
18  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
19  *  http://www.gnu.org/copyleft/gpl.html
20  *
21  */
22 #if defined(HAVE_LIBCRYSTALHD)
23
24 #include <deque>
25 #include <vector>
26
27 #include "DVDVideoCodec.h"
28 #include "utils/CriticalSection.h"
29 namespace Surface { class CSurface; }
30
31 ////////////////////////////////////////////////////////////////////////////////////////////
32 template <class T>
33 class CSyncPtrQueue
34 {
35 public:
36   CSyncPtrQueue()
37   {
38     InitializeCriticalSection(&m_Lock);
39   }
40   virtual ~CSyncPtrQueue()
41   {
42     DeleteCriticalSection(&m_Lock);
43   }
44   void Push(T* p)
45   {
46     EnterCriticalSection(&m_Lock);
47     m_Queue.push_back(p);
48     LeaveCriticalSection(&m_Lock);
49   }
50   T* Pop()
51   {
52     T* p = NULL;
53     EnterCriticalSection(&m_Lock);
54     if (m_Queue.size())
55     {
56       p = m_Queue.front();
57       m_Queue.pop_front();
58     }
59     LeaveCriticalSection(&m_Lock);
60     return p;
61   }
62   unsigned int Count(){return m_Queue.size();}
63 protected:
64   std::deque<T*> m_Queue;
65   CRITICAL_SECTION m_Lock;
66 };
67
68 ////////////////////////////////////////////////////////////////////////////////////////////
69 class CMPCDecodeBuffer
70 {
71 public:
72   CMPCDecodeBuffer(size_t size);
73   CMPCDecodeBuffer(unsigned char* pBuffer, size_t size);
74   virtual ~CMPCDecodeBuffer();
75   size_t GetSize();
76   unsigned char* GetPtr();
77   void SetPts(uint64_t pts);
78   uint64_t GetPts();
79 protected:
80   size_t m_Size;
81   unsigned char* m_pBuffer;
82   unsigned int m_Id;
83   uint64_t m_Pts;
84 };
85
86 /* We really don't want to include ffmpeg headers, so define these */
87 enum _BCM_CODEC_TYPES
88 {
89   BC_CODEC_ID_MPEG2 = 2,
90   BC_CODEC_ID_H264  = 28,
91   BC_CODEC_ID_VC1   = 73,
92 };
93 enum _BCM_STREAM_TYPE
94 {
95         BC_STREAM_TYPE_ES         = 0,
96         BC_STREAM_TYPE_PES        = 1,
97         BC_STREAM_TYPE_TS         = 2,
98         BC_STREAM_TYPE_ES_TSTAMP        = 6,
99 };
100
101 typedef uint32_t BCM_CODEC_TYPE;
102 typedef uint32_t BCM_STREAM_TYPE;
103 ////////////////////////////////////////////////////////////////////////////////////////////
104 class Display;
105 class CMPCInputThread;
106 class CMPCOutputThread;
107
108 class CCrystalHD
109 {
110 public:
111   CCrystalHD();
112   virtual ~CCrystalHD();
113
114   bool Open(BCM_STREAM_TYPE stream_type, BCM_CODEC_TYPE codec_type);
115   void Close(void);
116   void Flush(void);
117   bool AddInput(bool *got_picture_ptr, unsigned char *pData, size_t size, double pts);
118   bool GetPicture(DVDVideoPicture* pDvdVideoPicture);
119   bool ReleasePicture(DVDVideoPicture* pDvdVideoPicture);
120   void SetDropState(bool bDrop);
121   void Present(void);
122
123 protected:
124   void*     m_dl_handle;
125   void*     m_Device;
126
127   bool      InitHardware(void);
128
129   Display*  m_Display;
130   bool      m_IsConfigured;
131   bool      m_Inited;
132   bool      m_drop_state;
133   const char* m_pFormatName;
134   bool      m_interlace;
135   double    m_framerate;
136
137   CMPCOutputThread* m_pOutputThread;
138   CMPCInputThread* m_pInputThread;
139   CSyncPtrQueue<CMPCDecodeBuffer> m_BusyList;
140   
141   //std::vector<m_render_state*> m_videoSurfaces;
142 };
143
144 extern CCrystalHD*          g_CrystalHD;
145
146 #endif