windows-nt/Source/XPSP1/NT/multimedia/dshow/streams/ddstream/ddsample.h
2020-09-26 16:20:57 +08:00

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();
};