141 lines
4.2 KiB
C++
141 lines
4.2 KiB
C++
// 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<IDirectDrawSurface> 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();
|
|
};
|