ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

mediasample.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.