187 lines
6.5 KiB
C
187 lines
6.5 KiB
C
|
// Copyright (c) 1997 - 1998 Microsoft Corporation. All Rights Reserved.
|
||
|
// ddstrm.h : Declaration of the CDDStream
|
||
|
|
||
|
#ifndef __DDSTRM_H_
|
||
|
#define __DDSTRM_H_
|
||
|
|
||
|
#include "resource.h" // main symbols
|
||
|
|
||
|
class CDDSample;
|
||
|
class CDDInternalSample;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CDDStream
|
||
|
class ATL_NO_VTABLE CDDStream :
|
||
|
public CComCoClass<CDDStream, &CLSID_AMDirectDrawStream>,
|
||
|
public CStream,
|
||
|
public IDirectDrawMediaStream,
|
||
|
public IDirectDrawMediaSampleAllocator // This interface indicates that our mem
|
||
|
// allocator supports direct draw surfaces
|
||
|
// from the media samples.
|
||
|
{
|
||
|
friend CDDSample;
|
||
|
public:
|
||
|
|
||
|
//
|
||
|
// METHODS
|
||
|
//
|
||
|
CDDStream();
|
||
|
|
||
|
//
|
||
|
// IMediaStream
|
||
|
//
|
||
|
// HACK HACK - the first 2 are duplicates but it won't link
|
||
|
// without
|
||
|
STDMETHODIMP GetMultiMediaStream(
|
||
|
/* [out] */ IMultiMediaStream **ppMultiMediaStream)
|
||
|
{
|
||
|
return CStream::GetMultiMediaStream(ppMultiMediaStream);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP GetInformation(
|
||
|
/* [optional][out] */ MSPID *pPurposeId,
|
||
|
/* [optional][out] */ STREAM_TYPE *pType)
|
||
|
{
|
||
|
return CStream::GetInformation(pPurposeId, pType);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP SetSameFormat(IMediaStream *pStream, DWORD dwFlags);
|
||
|
|
||
|
STDMETHODIMP AllocateSample(
|
||
|
/* [in] */ DWORD dwFlags,
|
||
|
/* [out] */ IStreamSample **ppSample);
|
||
|
|
||
|
STDMETHODIMP CreateSharedSample(
|
||
|
/* [in] */ IStreamSample *pExistingSample,
|
||
|
/* [in] */ DWORD dwFlags,
|
||
|
/* [out] */ IStreamSample **ppNewSample);
|
||
|
|
||
|
STDMETHODIMP SendEndOfStream(DWORD dwFlags)
|
||
|
{
|
||
|
return CStream::SendEndOfStream(dwFlags);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// IAMMediaStream
|
||
|
//
|
||
|
STDMETHODIMP Initialize(IUnknown *pSourceObject, DWORD dwFlags, REFMSPID PurposeId, const STREAM_TYPE StreamType);
|
||
|
|
||
|
//
|
||
|
// IDirectDrawMediaStream
|
||
|
//
|
||
|
STDMETHODIMP GetFormat(
|
||
|
/* [optional][out] */ DDSURFACEDESC *pDDSDCurrent,
|
||
|
/* [optional][out] */ IDirectDrawPalette **ppDirectDrawPalette,
|
||
|
/* [optional][out] */ DDSURFACEDESC *pDDSDDesired,
|
||
|
/* [optional][out] */ DWORD *pdwFlags);
|
||
|
|
||
|
STDMETHODIMP SetFormat(
|
||
|
/* [in] */ const DDSURFACEDESC *lpDDSurfaceDesc,
|
||
|
/* [optional][in] */ IDirectDrawPalette *pDirectDrawPalette);
|
||
|
|
||
|
STDMETHODIMP GetDirectDraw( // NOTE == Function also used by IDirectDrawMediaSampleAllocator
|
||
|
/* [out] */ IDirectDraw **ppDirectDraw);
|
||
|
|
||
|
STDMETHODIMP SetDirectDraw(
|
||
|
/* [in] */ IDirectDraw *pDirectDraw);
|
||
|
|
||
|
STDMETHODIMP CreateSample(
|
||
|
/* [in] */ IDirectDrawSurface *pSurface,
|
||
|
/* [optional][in] */ const RECT *pRect,
|
||
|
/* [in] */ DWORD dwFlags,
|
||
|
/* [out] */ IDirectDrawStreamSample **ppSample);
|
||
|
|
||
|
|
||
|
STDMETHODIMP GetTimePerFrame(
|
||
|
/* [out] */ STREAM_TIME *pFrameTime);
|
||
|
|
||
|
//
|
||
|
// IPin
|
||
|
//
|
||
|
STDMETHODIMP ReceiveConnection(IPin * pConnector, const AM_MEDIA_TYPE *pmt);
|
||
|
STDMETHODIMP QueryAccept(const AM_MEDIA_TYPE *pmt);
|
||
|
|
||
|
|
||
|
//
|
||
|
// IMemInputPin
|
||
|
//
|
||
|
STDMETHODIMP Receive(IMediaSample *pSample);
|
||
|
STDMETHODIMP NotifyAllocator(IMemAllocator * pAllocator, BOOL bReadOnly);
|
||
|
//
|
||
|
// IMemAllocator
|
||
|
//
|
||
|
STDMETHODIMP SetProperties(ALLOCATOR_PROPERTIES* pRequest, ALLOCATOR_PROPERTIES* pActual);
|
||
|
STDMETHODIMP GetProperties(ALLOCATOR_PROPERTIES* pProps);
|
||
|
STDMETHODIMP GetBuffer(IMediaSample **ppBuffer, REFERENCE_TIME * pStartTime,
|
||
|
REFERENCE_TIME * pEndTime, DWORD dwFlags);
|
||
|
STDMETHODIMP Decommit();
|
||
|
|
||
|
//
|
||
|
// Special CStream methods
|
||
|
//
|
||
|
HRESULT GetMediaType(ULONG Index, AM_MEDIA_TYPE **ppMediaType);
|
||
|
HRESULT CreateTempSample(CSample **ppSample);
|
||
|
|
||
|
protected:
|
||
|
STDMETHODIMP GetFormatInternal(
|
||
|
DDSURFACEDESC *pDDSDCurrent,
|
||
|
IDirectDrawPalette **ppDirectDrawPalette,
|
||
|
DDSURFACEDESC *pDDSDDesired,
|
||
|
DWORD *pdwFlags);
|
||
|
|
||
|
HRESULT InitDirectDraw(void);
|
||
|
void InitSurfaceDesc(LPDDSURFACEDESC);
|
||
|
HRESULT InternalSetFormat(const DDSURFACEDESC *lpDDSurfaceDesc, IDirectDrawPalette *pPalette, bool bFromPin, bool bQuery = false);
|
||
|
HRESULT InternalAllocateSample(DWORD dwFlags,
|
||
|
bool bIsInternalSample,
|
||
|
IDirectDrawStreamSample **ppDDSample,
|
||
|
bool bTemp = false);
|
||
|
HRESULT InternalCreateSample(IDirectDrawSurface *pSurface, const RECT *pRect,
|
||
|
DWORD dwFlags, bool bIsInternalSample,
|
||
|
IDirectDrawStreamSample **ppSample,
|
||
|
bool bTemp = false);
|
||
|
HRESULT GetMyReadOnlySample(CDDSample *pBuddy, CDDSample **ppSample);
|
||
|
HRESULT RenegotiateMediaType(const DDSURFACEDESC *lpDDSurfaceDesc, IDirectDrawPalette *pPalette, const AM_MEDIA_TYPE *pmt);
|
||
|
HRESULT inline CDDStream::AllocDDSampleFromPool(
|
||
|
const REFERENCE_TIME *rtStart,
|
||
|
CDDSample **ppDDSample)
|
||
|
{
|
||
|
CSample *pSample;
|
||
|
HRESULT hr = AllocSampleFromPool(rtStart, &pSample);
|
||
|
*ppDDSample = (CDDSample *)pSample;
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
bool CreateInternalSample() const
|
||
|
{
|
||
|
return m_bSamplesAreReadOnly &&
|
||
|
m_StreamType==STREAMTYPE_READ;
|
||
|
}
|
||
|
|
||
|
public:
|
||
|
DECLARE_REGISTRY_RESOURCEID(IDR_STREAM)
|
||
|
|
||
|
BEGIN_COM_MAP(CDDStream)
|
||
|
COM_INTERFACE_ENTRY(IDirectDrawMediaStream)
|
||
|
COM_INTERFACE_ENTRY(IDirectDrawMediaSampleAllocator)
|
||
|
COM_INTERFACE_ENTRY_CHAIN(CStream)
|
||
|
END_COM_MAP()
|
||
|
|
||
|
protected:
|
||
|
//
|
||
|
// Member variables
|
||
|
//
|
||
|
CComPtr<IDirectDraw> m_pDirectDraw;
|
||
|
CComPtr<IDirectDrawPalette> m_pDirectDrawPalette;
|
||
|
DWORD m_dwForcedFormatFlags;
|
||
|
long m_Height;
|
||
|
long m_Width;
|
||
|
DDPIXELFORMAT m_PixelFormat;
|
||
|
const DDPIXELFORMAT *m_pDefPixelFormat;
|
||
|
long m_lLastPitch;
|
||
|
|
||
|
CDDInternalSample *m_pMyReadOnlySample;
|
||
|
};
|
||
|
|
||
|
#endif // __DDSTRM_H_
|