move to self contained device unit, prep for direct to texture.
[xbmc:xbmc-antiquated.git] / XBMC / xbmc / cores / dvdplayer / DVDCodecs / Video / DVDVideoCodecCrystalHD.cpp
1 /*
2  *      Copyright (C) 2005-2009 Team XBMC
3  *      http://www.xbmc.org
4  *
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)
8  *  any later version.
9  *
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.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21
22 #if (defined HAVE_CONFIG_H) && (!defined WIN32)
23   #include "config.h"
24 #endif
25
26 #include "stdafx.h"
27 #if defined(HAVE_LIBCRYSTALHD)
28 #include "DVDClock.h"
29 #include "DVDStreamInfo.h"
30 #include "DVDVideoCodecCrystalHD.h"
31
32 #define __MODULE_NAME__ "DVDVideoCodecCrystalHD"
33
34 class CExecTimer
35 {
36 public:
37   CExecTimer() :
38     m_StartTime(0),
39     m_PunchInTime(0),
40     m_PunchOutTime(0),
41     m_LastCallInterval(0)
42   {
43     QueryPerformanceFrequency((LARGE_INTEGER*)&m_CounterFreq);
44     m_CounterFreq /= 1000; // Scale to ms
45   }
46   
47   void Start()
48   {
49     QueryPerformanceCounter((LARGE_INTEGER*)&m_StartTime);
50   }
51   
52   void PunchIn()
53   {
54     QueryPerformanceCounter((LARGE_INTEGER*)&m_PunchInTime);
55     if (m_PunchOutTime)
56       m_LastCallInterval = m_PunchInTime - m_PunchOutTime;
57     else
58       m_LastCallInterval = 0;
59     m_PunchOutTime = 0;
60   }
61   
62   void PunchOut()
63   {
64     if (m_PunchInTime)
65       QueryPerformanceCounter((LARGE_INTEGER*)&m_PunchOutTime);
66   }
67   
68   void Reset()
69   {
70     m_StartTime = 0;
71     m_PunchInTime = 0;
72     m_PunchOutTime = 0;
73     m_LastCallInterval = 0;
74   }
75
76   uint64_t GetTimeSincePunchIn()
77   {
78     if (m_PunchInTime)
79     {
80       uint64_t now;
81       QueryPerformanceCounter((LARGE_INTEGER*)&now);
82       return (now - m_PunchInTime)/m_CounterFreq;  
83     }
84     else
85       return 0;
86   }
87
88   uint64_t GetElapsedTime()
89   {
90     if (m_StartTime)
91     {
92       uint64_t now;
93       QueryPerformanceCounter((LARGE_INTEGER*)&now);
94       return (now - m_StartTime)/m_CounterFreq;  
95     }
96     else
97       return 0;
98   }
99   
100   uint64_t GetExecTime()
101   {
102     if (m_PunchOutTime && m_PunchInTime)
103       return (m_PunchOutTime - m_PunchInTime)/m_CounterFreq;  
104     else
105       return 0;
106   }
107   
108   uint64_t GetIntervalTime()
109   {
110     return m_LastCallInterval/m_CounterFreq;
111   }
112   
113 protected:
114   uint64_t m_StartTime;
115   uint64_t m_PunchInTime;
116   uint64_t m_PunchOutTime;
117   uint64_t m_LastCallInterval;
118   uint64_t m_CounterFreq;
119 };
120
121 CExecTimer g_InputTimer;
122 CExecTimer g_OutputTimer;
123 CExecTimer g_ClientTimer;
124
125 CDVDVideoCodecCrystalHD::CDVDVideoCodecCrystalHD() :
126   m_Device(NULL),
127   m_DropPictures(false),
128   m_pFormatName("")
129 {
130 }
131
132 CDVDVideoCodecCrystalHD::~CDVDVideoCodecCrystalHD()
133 {
134   Dispose();
135 }
136
137 bool CDVDVideoCodecCrystalHD::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options)
138 {
139   BCM_CODEC_TYPE codec_type;
140   BCM_STREAM_TYPE stream_type;
141   
142   codec_type = hints.codec;
143   stream_type = BC_STREAM_TYPE_ES;
144   
145   
146   m_Device = new CCrystalHD();
147   if (!m_Device)
148   {
149     CLog::Log(LOGERROR, "%s: Failed to open Broadcom Crystal HD", __MODULE_NAME__);
150     return false;
151   }
152   
153   if (!m_Device->Open(stream_type, codec_type))
154   {
155     CLog::Log(LOGERROR, "%s: Failed to open Broadcom Crystal HD", __MODULE_NAME__);
156     return false;
157   }
158
159   CLog::Log(LOGDEBUG, "%s: Opened Broadcom Crystal HD", __MODULE_NAME__);
160   return true;
161 }
162
163 void CDVDVideoCodecCrystalHD::Dispose()
164 {
165   if (m_Device)
166   {
167     m_Device->Close();
168     delete m_Device;
169     m_Device = NULL;
170   }
171 }
172
173 int CDVDVideoCodecCrystalHD::Decode(BYTE* pData, int iSize, double pts)
174 {
175   bool iGotPicture;
176   
177   int ret = VC_ERROR;
178
179   // Handle Input
180   if (pData)
181   {
182     // Push data to the decoder input thread. We cannot return the data to the caller. 
183     // It will be lost if we do not send it.
184     m_Device->AddInput(&iGotPicture, pData, iSize, pts);
185     ret = VC_BUFFER;
186   }
187
188   // Handle Output
189   if (iGotPicture)
190   {
191     ret |= VC_PICTURE;
192   }
193   
194   return ret;
195 }
196
197 void CDVDVideoCodecCrystalHD::Reset()
198 {
199   m_Device->Flush();
200 }
201
202 bool CDVDVideoCodecCrystalHD::GetPicture(DVDVideoPicture* pDvdVideoPicture)
203 {
204   m_Device->GetPicture(pDvdVideoPicture);
205   //CLog::Log(LOGDEBUG, "%s: Fetching next decoded picture", __MODULE_NAME__);   
206
207   return true;
208 }
209
210 bool CDVDVideoCodecCrystalHD::ReleasePicture(DVDVideoPicture* pDvdVideoPicture)
211 {
212   // Free the last provided picture reference
213   m_Device->ReleasePicture(pDvdVideoPicture);
214   //CLog::Log(LOGDEBUG, "%s: Release decoded picture", __MODULE_NAME__);   
215
216   return true;
217 }
218
219 void CDVDVideoCodecCrystalHD::SetDropState(bool bDrop)
220 {
221   m_Device->SetDropState(bDrop);
222 }
223
224
225 /////////////////////////////////////////////////////////////////////
226
227
228 #endif