// Copyright (c) 1997 - 1998 Microsoft Corporation. All Rights Reserved. ///////////////////////////////////////////////////////////////////////////// // CDDSample class ATL_NO_VTABLE CDDSample : public CSample, public IDirectDrawStreamSample { public: CDDSample(); HRESULT InitSample(CStream *pStream, IDirectDrawSurface *pSurface, const RECT *pRect, bool bIsProgressiveRender, bool bIsInternalSample, bool bTemp); // // IStreamSample // STDMETHODIMP GetMediaStream( /* [in] */ IMediaStream **ppMediaStream) { return CSample::GetMediaStream(ppMediaStream); } STDMETHODIMP GetSampleTimes( /* [optional][out] */ STREAM_TIME *pStartTime, /* [optional][out] */ STREAM_TIME *pEndTime, /* [optional][out] */ STREAM_TIME *pCurrentTime) { return CSample::GetSampleTimes( pStartTime, pEndTime, pCurrentTime ); } STDMETHODIMP SetSampleTimes( /* [optional][in] */ const STREAM_TIME *pStartTime, /* [optional][in] */ const STREAM_TIME *pEndTime) { return CSample::SetSampleTimes(pStartTime, pEndTime); } STDMETHODIMP Update( /* [in] */ DWORD dwFlags, /* [optional][in] */ HANDLE hEvent, /* [optional][in] */ PAPCFUNC pfnAPC, /* [optional][in] */ DWORD_PTR dwAPCData) { return CSample::Update(dwFlags, hEvent, pfnAPC, dwAPCData); } STDMETHODIMP CompletionStatus( /* [in] */ DWORD dwFlags, /* [optional][in] */ DWORD dwMilliseconds) { return CSample::CompletionStatus(dwFlags, dwMilliseconds); } // // IDirectDrawStreamSample // STDMETHODIMP GetSurface(IDirectDrawSurface **ppDirectDrawSurface, RECT * pRect); STDMETHODIMP SetRect(const RECT * pRect); // // Overridden virtual function for CSample // void FinalMediaSampleRelease(void); // // Methods forwarded from MediaSample object. // HRESULT MSCallback_GetPointer(BYTE ** ppBuffer); LONG MSCallback_GetSize(void); LONG MSCallback_GetActualDataLength(void); HRESULT MSCallback_SetActualDataLength(LONG lActual); // // Internal methods // long LockAndPrepareMediaSample(long lLastPinPitch); void ReleaseMediaSampleLock(void); HRESULT CopyFrom(CDDSample *pSrcSample); HRESULT CopyFrom(IMediaSample *pSrcMediaSample, const AM_MEDIA_TYPE *pmt); HRESULT LockMediaSamplePointer(); BEGIN_COM_MAP(CDDSample) COM_INTERFACE_ENTRY(IDirectDrawStreamSample) COM_INTERFACE_ENTRY_CHAIN(CSample) END_COM_MAP() public: CComPtr m_pSurface; RECT m_Rect; long m_lLastSurfacePitch; bool m_bProgressiveRender; bool m_bFormatChanged; LONG m_lImageSize; void * m_pvLockedSurfacePtr; }; class CDDInternalSample : public CDDSample { public: CDDInternalSample(); ~CDDInternalSample(); HRESULT InternalInit(void); HRESULT SetCompletionStatus(HRESULT hrStatus); HRESULT Die(void); HRESULT JoinToBuddy(CDDSample *pBuddy); BOOL HasBuddy() const { return m_pBuddySample != NULL; } private: CDDSample *m_pBuddySample; long m_lWaiting; HANDLE m_hWaitFreeSem; bool m_bDead; }; class CDDMediaSample : public CMediaSample, public IDirectDrawMediaSample { public: CDDMediaSample(CSample *pSample) : CMediaSample(pSample) {}; STDMETHODIMP QueryInterface(REFIID riid, void ** ppv); STDMETHODIMP_(ULONG) AddRef() {return CMediaSample::AddRef();} STDMETHODIMP_(ULONG) Release() {return CMediaSample::Release();} STDMETHODIMP GetSurfaceAndReleaseLock(IDirectDrawSurface **ppDirectDrawSurface, RECT * pRect); STDMETHODIMP LockMediaSamplePointer(); };