Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmediasample.cpp
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy 00004 * FILE: dll/directx/ksproxy/mediasample.cpp 00005 * PURPOSE: IMediaSample interface 00006 * 00007 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) 00008 */ 00009 #include "precomp.h" 00010 00011 class CMediaSample : public IMediaSample 00012 { 00013 public: 00014 STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); 00015 00016 STDMETHODIMP_(ULONG) AddRef() 00017 { 00018 InterlockedIncrement(&m_Ref); 00019 return m_Ref; 00020 } 00021 STDMETHODIMP_(ULONG) Release() 00022 { 00023 InterlockedDecrement(&m_Ref); 00024 if (!m_Ref) 00025 { 00026 if (m_Allocator) 00027 { 00028 m_Allocator->ReleaseBuffer((IMediaSample*)this); 00029 return 0; 00030 } 00031 delete this; 00032 return 0; 00033 } 00034 return m_Ref; 00035 } 00036 00037 HRESULT STDMETHODCALLTYPE GetPointer(BYTE **ppBuffer); 00038 long STDMETHODCALLTYPE GetSize(void); 00039 HRESULT STDMETHODCALLTYPE GetTime(REFERENCE_TIME *pTimeStart, REFERENCE_TIME *pTimeEnd); 00040 HRESULT STDMETHODCALLTYPE SetTime(REFERENCE_TIME *pTimeStart, REFERENCE_TIME *pTimeEnd); 00041 HRESULT STDMETHODCALLTYPE IsSyncPoint(); 00042 HRESULT STDMETHODCALLTYPE SetSyncPoint(BOOL bIsSyncPoint); 00043 HRESULT STDMETHODCALLTYPE IsPreroll(); 00044 HRESULT STDMETHODCALLTYPE SetPreroll(BOOL bIsPreroll); 00045 long STDMETHODCALLTYPE GetActualDataLength(); 00046 HRESULT STDMETHODCALLTYPE SetActualDataLength(long Length); 00047 HRESULT STDMETHODCALLTYPE GetMediaType(AM_MEDIA_TYPE **ppMediaType); 00048 HRESULT STDMETHODCALLTYPE SetMediaType(AM_MEDIA_TYPE *pMediaType); 00049 HRESULT STDMETHODCALLTYPE IsDiscontinuity(); 00050 HRESULT STDMETHODCALLTYPE SetDiscontinuity(BOOL bDiscontinuity); 00051 HRESULT STDMETHODCALLTYPE GetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd); 00052 HRESULT STDMETHODCALLTYPE SetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd); 00053 00054 CMediaSample(IMemAllocator * Allocator, BYTE * Buffer, LONG BufferSize); 00055 virtual ~CMediaSample(){} 00056 00057 protected: 00058 ULONG m_Flags; 00059 ULONG m_TypeFlags; 00060 BYTE * m_Buffer; 00061 LONG m_ActualLength; 00062 LONG m_BufferSize; 00063 IMemAllocator * m_Allocator; 00064 CMediaSample * m_Next; 00065 REFERENCE_TIME m_StartTime; 00066 REFERENCE_TIME m_StopTime; 00067 LONGLONG m_MediaStart; 00068 LONGLONG m_MediaStop; 00069 AM_MEDIA_TYPE * m_MediaType; 00070 ULONG m_StreamId; 00071 00072 public: 00073 LONG m_Ref; 00074 00075 BOOL m_bMediaTimeValid; 00076 00077 00078 }; 00079 00080 CMediaSample::CMediaSample( 00081 IMemAllocator * Allocator, 00082 BYTE * Buffer, 00083 LONG BufferSize) : 00084 m_Flags(0), 00085 m_TypeFlags(0), 00086 m_Buffer(Buffer), 00087 m_ActualLength(BufferSize), 00088 m_BufferSize(BufferSize), 00089 m_Allocator(Allocator), 00090 m_Next(0), 00091 m_StartTime(0), 00092 m_StopTime(0), 00093 m_MediaStart(0), 00094 m_MediaStop(0), 00095 m_MediaType(0), 00096 m_StreamId(0), 00097 m_Ref(0), 00098 m_bMediaTimeValid(0) 00099 { 00100 } 00101 00102 00103 HRESULT 00104 STDMETHODCALLTYPE 00105 CMediaSample::QueryInterface( 00106 IN REFIID refiid, 00107 OUT PVOID* Output) 00108 { 00109 if (IsEqualGUID(refiid, IID_IUnknown) || 00110 IsEqualGUID(refiid, IID_IMediaSample)) 00111 { 00112 *Output = PVOID(this); 00113 reinterpret_cast<IMediaSample*>(*Output)->AddRef(); 00114 return NOERROR; 00115 } 00116 if (IsEqualGUID(refiid, IID_IMediaSample2)) 00117 { 00118 #if 0 00119 *Output = (IMediaSample2*)(this); 00120 reinterpret_cast<IMediaSample2*>(*Output)->AddRef(); 00121 return NOERROR; 00122 #endif 00123 } 00124 00125 return E_NOINTERFACE; 00126 } 00127 00128 //------------------------------------------------------------------- 00129 // IMediaSample interface 00130 // 00131 HRESULT 00132 STDMETHODCALLTYPE 00133 CMediaSample::GetPointer( 00134 BYTE **ppBuffer) 00135 { 00136 if (!ppBuffer) 00137 return E_POINTER; 00138 00139 *ppBuffer = m_Buffer; 00140 return S_OK; 00141 } 00142 00143 long 00144 STDMETHODCALLTYPE 00145 CMediaSample::GetSize() 00146 { 00147 return m_BufferSize; 00148 } 00149 00150 HRESULT 00151 STDMETHODCALLTYPE 00152 CMediaSample::GetTime( 00153 REFERENCE_TIME *pTimeStart, 00154 REFERENCE_TIME *pTimeEnd) 00155 { 00156 HRESULT hr; 00157 00158 if (!pTimeStart || !pTimeEnd) 00159 return E_POINTER; 00160 00161 if (!(m_Flags & (AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID))) 00162 { 00163 // no time is set 00164 return VFW_E_SAMPLE_TIME_NOT_SET; 00165 } 00166 00167 *pTimeStart = m_StartTime; 00168 00169 if (m_Flags & AM_SAMPLE_STOPVALID) 00170 { 00171 *pTimeEnd = m_StopTime; 00172 hr = NOERROR; 00173 } 00174 else 00175 { 00176 *pTimeEnd = m_StartTime + 1; 00177 hr = VFW_S_NO_STOP_TIME; 00178 } 00179 return hr; 00180 } 00181 00182 HRESULT 00183 STDMETHODCALLTYPE 00184 CMediaSample::SetTime(REFERENCE_TIME *pTimeStart, REFERENCE_TIME *pTimeEnd) 00185 { 00186 if (!pTimeStart) 00187 { 00188 m_Flags &= ~(AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID); 00189 return NOERROR; 00190 } 00191 00192 if (!pTimeEnd) 00193 { 00194 m_Flags &= ~(AM_SAMPLE_STOPVALID); 00195 m_Flags |= AM_SAMPLE_TIMEVALID; 00196 m_StartTime = *pTimeStart; 00197 return NOERROR; 00198 } 00199 00200 00201 m_Flags |= (AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID); 00202 m_StartTime = *pTimeStart; 00203 m_StopTime = *pTimeEnd; 00204 00205 return NOERROR; 00206 } 00207 00208 HRESULT 00209 STDMETHODCALLTYPE 00210 CMediaSample::IsSyncPoint() 00211 { 00212 return (m_Flags & AM_SAMPLE_SPLICEPOINT) ? S_OK : S_FALSE; 00213 } 00214 HRESULT 00215 STDMETHODCALLTYPE 00216 CMediaSample::SetSyncPoint(BOOL bIsSyncPoint) 00217 { 00218 if (bIsSyncPoint) 00219 m_Flags |= AM_SAMPLE_SPLICEPOINT; 00220 else 00221 m_Flags &= ~AM_SAMPLE_SPLICEPOINT; 00222 00223 return NOERROR; 00224 } 00225 00226 HRESULT 00227 STDMETHODCALLTYPE 00228 CMediaSample::IsPreroll() 00229 { 00230 return (m_Flags & AM_SAMPLE_PREROLL) ? S_OK : S_FALSE; 00231 } 00232 00233 HRESULT 00234 STDMETHODCALLTYPE 00235 CMediaSample::SetPreroll(BOOL bIsPreroll) 00236 { 00237 if (bIsPreroll) 00238 m_Flags |= AM_SAMPLE_PREROLL; 00239 else 00240 m_Flags &= ~AM_SAMPLE_PREROLL; 00241 00242 return NOERROR; 00243 } 00244 00245 long 00246 STDMETHODCALLTYPE 00247 CMediaSample::GetActualDataLength() 00248 { 00249 return m_ActualLength; 00250 } 00251 00252 HRESULT 00253 STDMETHODCALLTYPE 00254 CMediaSample::SetActualDataLength(long Length) 00255 { 00256 if (Length > m_BufferSize) 00257 return VFW_E_BUFFER_OVERFLOW; 00258 00259 m_ActualLength = Length; 00260 return NOERROR; 00261 } 00262 00263 HRESULT 00264 STDMETHODCALLTYPE 00265 CMediaSample::GetMediaType(AM_MEDIA_TYPE **ppMediaType) 00266 { 00267 if (!m_MediaType) 00268 { 00269 *ppMediaType = NULL; 00270 return S_FALSE; 00271 } 00272 00273 assert(0); 00274 return E_NOTIMPL; 00275 } 00276 00277 HRESULT 00278 STDMETHODCALLTYPE 00279 CMediaSample::SetMediaType(AM_MEDIA_TYPE *pMediaType) 00280 { 00281 OutputDebugStringW(L"CMediaSample::SetMediaType NotImplemented\n"); 00282 return E_NOTIMPL; 00283 } 00284 00285 00286 HRESULT 00287 STDMETHODCALLTYPE 00288 CMediaSample::IsDiscontinuity() 00289 { 00290 return (m_Flags & AM_SAMPLE_DATADISCONTINUITY) ? S_OK : S_FALSE; 00291 } 00292 00293 HRESULT 00294 STDMETHODCALLTYPE 00295 CMediaSample::SetDiscontinuity(BOOL bDiscontinuity) 00296 { 00297 if (bDiscontinuity) 00298 m_Flags |= AM_SAMPLE_DATADISCONTINUITY; 00299 else 00300 m_Flags &= ~AM_SAMPLE_DATADISCONTINUITY; 00301 00302 return NOERROR; 00303 } 00304 00305 HRESULT 00306 STDMETHODCALLTYPE 00307 CMediaSample::GetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd) 00308 { 00309 if (!pTimeStart || !pTimeEnd) 00310 return E_POINTER; 00311 00312 if (!m_bMediaTimeValid) 00313 return VFW_E_MEDIA_TIME_NOT_SET; 00314 00315 m_MediaStart = *pTimeStart; 00316 m_MediaStop = *pTimeEnd; 00317 00318 return NOERROR; 00319 } 00320 00321 HRESULT 00322 STDMETHODCALLTYPE 00323 CMediaSample::SetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd) 00324 { 00325 if (!pTimeStart || !pTimeEnd) 00326 { 00327 m_bMediaTimeValid = false; 00328 return NOERROR; 00329 } 00330 00331 m_MediaStart = *pTimeStart; 00332 m_MediaStop = *pTimeEnd; 00333 00334 return NOERROR; 00335 } 00336 00337 00338 00339 00340 HRESULT 00341 WINAPI 00342 CMediaSample_Constructor( 00343 IMemAllocator* Allocator, 00344 BYTE* pBuffer, 00345 ULONG BufferSize, 00346 REFIID riid, 00347 LPVOID * ppv) 00348 { 00349 #ifdef KSPROXY_TRACE 00350 OutputDebugStringW(L"CMediaSample_Constructor\n"); 00351 #endif 00352 00353 CMediaSample * handler = new CMediaSample(Allocator, pBuffer, BufferSize); 00354 00355 if (!handler) 00356 return E_OUTOFMEMORY; 00357 00358 if (FAILED(handler->QueryInterface(riid, ppv))) 00359 { 00360 /* not supported */ 00361 delete handler; 00362 return E_NOINTERFACE; 00363 } 00364 00365 return NOERROR; 00366 } Generated on Mon May 28 2012 04:21:21 for ReactOS by
1.7.6.1
|