Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

362 lines
9.7 KiB

#pragma warning(disable: 4097 4511 4512 4514 4705)
// Copyright (c) 1994 - 1999 Microsoft Corporation. All Rights Reserved.
#ifndef _avimsr_h
#define _avimsr_h
#include "basemsr.h"
#include <aviriff.h>
#include "aviindex.h"
#include "qnetwork.h"
extern const AMOVIESETUP_FILTER sudAvimsrDll;
class CAviMSRFilter :
public CBaseMSRFilter,
public IAMMediaContent,
public IPersistMediaPropertyBag
{
DECLARE_IUNKNOWN;
public:
// create a new instance of this class
static CUnknown *CreateInstance(LPUNKNOWN, HRESULT *);
// want to find pins named "Stream 00" as well as usual names
STDMETHODIMP FindPin(
LPCWSTR Id,
IPin ** ppPin
);
// helpers, accessed by pins
HRESULT GetIdx1(AVIOLDINDEX **ppIdx1);
HRESULT GetMoviOffset(DWORDLONG *pqw);
REFERENCE_TIME GetInitialFrames();
HRESULT GetCacheParams(
StreamBufParam *rgSbp,
ULONG *pcbRead,
ULONG *pcBuffers,
int *piLeadingStream);
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv);
// IPersistMediaPropertyBag methods
STDMETHODIMP InitNew();
STDMETHODIMP Load(IMediaPropertyBag *pPropBag, LPERRORLOG pErrorLog);
STDMETHODIMP Save(IMediaPropertyBag *pPropBag, BOOL fClearDirty,
BOOL fSaveAllProperties);
STDMETHODIMP GetClassID(CLSID *pClsid);
private:
friend class CAviMSROutPin;
// constructors, etc.
CAviMSRFilter(TCHAR *pszFilter, LPUNKNOWN pUnk, HRESULT *phr);
~CAviMSRFilter();
ULONG CountConsecutiveVideoFrames();
// pure CBaseMSRFilter overrides
HRESULT CreateOutputPins();
HRESULT NotifyInputDisconnected();
// pure base override
HRESULT CheckMediaType(const CMediaType* mtOut);
// helpers, internal
HRESULT Search(
DWORDLONG *qwPosOut,
FOURCC fccSearchKey,
DWORDLONG qwPosStart,
ULONG *cb);
HRESULT CacheInfoChunk();
HRESULT GetInfoString(DWORD dwFcc, BSTR *pbstr);
inline bool IsTightInterleaved() { return m_fIsTightInterleaved; }
HRESULT CreatePins();
HRESULT ParseHeaderCreatePins();
HRESULT LoadHeaderParseHeaderCreatePins();
// IAMMediaContent
STDMETHODIMP GetTypeInfoCount(THIS_ UINT FAR* pctinfo) { return E_NOTIMPL; }
STDMETHODIMP GetTypeInfo(
THIS_
UINT itinfo,
LCID lcid,
ITypeInfo FAR* FAR* pptinfo) { return E_NOTIMPL; }
STDMETHODIMP GetIDsOfNames(
THIS_
REFIID riid,
OLECHAR FAR* FAR* rgszNames,
UINT cNames,
LCID lcid,
DISPID FAR* rgdispid) { return E_NOTIMPL; }
STDMETHODIMP Invoke(
THIS_
DISPID dispidMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS FAR* pdispparams,
VARIANT FAR* pvarResult,
EXCEPINFO FAR* pexcepinfo,
UINT FAR* puArgErr) { return E_NOTIMPL; }
STDMETHODIMP get_AuthorName(BSTR FAR* pbstrAuthorName);
STDMETHODIMP get_Title(BSTR FAR* pbstrTitle);
STDMETHODIMP get_Rating(BSTR FAR* pbstrRating) { return E_NOTIMPL; }
STDMETHODIMP get_Description(BSTR FAR* pbstrDescription) { return E_NOTIMPL; }
STDMETHODIMP get_Copyright(BSTR FAR* pbstrCopyright);
STDMETHODIMP get_BaseURL(BSTR FAR* pbstrBaseURL) { return E_NOTIMPL; }
STDMETHODIMP get_LogoURL(BSTR FAR* pbstrLogoURL) { return E_NOTIMPL; }
STDMETHODIMP get_LogoIconURL(BSTR FAR* pbstrLogoIconURL) { return E_NOTIMPL; }
STDMETHODIMP get_WatermarkURL(BSTR FAR* pbstrWatermarkURL) { return E_NOTIMPL; }
STDMETHODIMP get_MoreInfoURL(BSTR FAR* pbstrMoreInfoURL) { return E_NOTIMPL; }
STDMETHODIMP get_MoreInfoBannerURL(BSTR FAR* pbstrMoreInfoBannerURL) { return E_NOTIMPL; }
STDMETHODIMP get_MoreInfoBannerImage(BSTR FAR* pbstrMoreInfoBannerImage) { return E_NOTIMPL; }
STDMETHODIMP get_MoreInfoText(BSTR FAR* pbstrMoreInfoText) { return E_NOTIMPL; }
// pointer to buffer containing all of AVI 'hdrl' chunk. (allocated)
BYTE * m_pAviHeader;
// size of avi header data (does not include size of riff header or
// 'hdrl' bytes)
UINT m_cbAviHeader;
// pointer to main avi header within m_pAviHeader (not allocated)
AVIMAINHEADER * m_pAviMainHeader;
// pointer to odml list within m_pAviHeader or 0. (not allocated)
RIFFLIST * m_pOdmlList;
DWORDLONG m_cbMoviOffset;
// allocated
AVIOLDINDEX *m_pIdx1;
bool m_fIsDV;
bool m_fIsTightInterleaved;
RIFFLIST *m_pInfoList;
bool m_fNoInfoList; // search failed; don't keep searching
};
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
class CAviMSRWorker : public CBaseMSRWorker
{
public:
// constructor
CAviMSRWorker(
UINT stream,
IMultiStreamReader *pReader,
IAviIndex *pImplIndex);
// pure base overrides
HRESULT PushLoopInit(LONGLONG *pllCurrentOut, ImsValues *pImsValues);
HRESULT TryQueueSample(
LONGLONG &rllCurrent, // [in, out]
BOOL &rfQueuedSample, // [out]
ImsValues *pImsValues
);
// build media type with palette change info
HRESULT HandleData(IMediaSample *pSample, DWORD dwUser);
// set new palette
HRESULT AboutToDeliver(IMediaSample *pSample);
private:
HRESULT QueueIndexRead(IxReadReq *pReq);
IxReadReq m_Irr;
enum IrrState { IRR_NONE, IRR_REQUESTED, IRR_QUEUED };
IrrState m_IrrState;
IAviIndex *m_pImplIndex;
ULONG m_cbAudioChunkOffset;
// new media type for next sample delivered
bool m_fDeliverPaletteChange;
bool m_fDeliverDiscontinuity; // !!! use dwflags for these flags
// Fix MPEG audio timestamps
bool m_fFixMPEGAudioTimeStamps;
CMediaType m_mtNextSample;
HRESULT HandlePaletteChange(BYTE *pb, ULONG cb);
HRESULT HandleNewIndex(BYTE *pb, ULONG cb);
// valid after PushLoopInit
AVISTREAMHEADER *m_pStrh;
WAVEFORMATEX m_wfx;
#ifdef PERF
int m_perfidIndex;
#endif
};
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
class CAviMSROutPin :
public CBaseMSROutPin,
public IPropertyBag
{
public:
CAviMSROutPin( CBaseFilter *pOwningFilter,
CBaseMSRFilter *pFilter,
UINT iStream,
IMultiStreamReader *&rpImplBuffer,
HRESULT *phr,
LPCWSTR pName);
~CAviMSROutPin();
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv);
// base class overrides
ULONG GetMaxSampleSize();
HRESULT OnActive();
// internal helper, called from the filter
BOOL ParseHeader (RIFFLIST * pRiffList, UINT id);
BYTE *GetStrf();
AVISTREAMHEADER *GetStrh();
// base class wants these for IMediaSelection
HRESULT IsFormatSupported(const GUID *const pFormat);
HRESULT GetDuration(LONGLONG *pDuration);
HRESULT GetAvailable(LONGLONG *pEarliest, LONGLONG *pLatest);
HRESULT RecordStartAndStop(
LONGLONG *pCurrent,
LONGLONG *pStop,
REFTIME *pTime,
const GUID *const pGuidFormat
);
// helpers
LONGLONG ConvertToTick(const LONGLONG ll, const TimeFormat Format);
LONGLONG ConvertFromTick(const LONGLONG ll, const TimeFormat Format);
LONGLONG ConvertToTick(const LONGLONG ll, const GUID *const pFormat);
LONGLONG ConvertFromTick(const LONGLONG ll, const GUID *const pFormat);
REFERENCE_TIME ConvertInternalToRT(const LONGLONG llVal);
LONGLONG ConvertRTToInternal(const REFERENCE_TIME llVal);
// IPropertyBag
STDMETHODIMP Read(
/* [in] */ LPCOLESTR pszPropName,
/* [out][in] */ VARIANT *pVar,
/* [in] */ IErrorLog *pErrorLog);
STDMETHODIMP Write(
/* [in] */ LPCOLESTR pszPropName,
/* [in] */ VARIANT *pVar) { return E_FAIL; }
private:
// base class overrides
HRESULT GetMediaType(int iPosition, CMediaType* pt);
LONGLONG GetStreamStart();
LONGLONG GetStreamLength();
REFERENCE_TIME GetRefTime(ULONG tick);
// internal helpers
HRESULT InitializeIndex();
IAviIndex *m_pImplIndex;
HRESULT BuildMT();
// pointers to data allocated elsewhere. set in ParseHeader
AVISTREAMHEADER *m_pStrh;
RIFFCHUNK *m_pStrf;
char *m_pStrn;
AVIMETAINDEX *m_pIndx;
CMediaType m_mtFirstSample;
friend class CAviMSRWorker;
friend class CAviMSRFilter;
// never deliver more than this many bytes of audio. computed when
// the file is parsed from nAvgBytesPerSecond. unset for video
ULONG m_cbMaxAudio;
};
class CMediaPropertyBag :
public IMediaPropertyBag,
public CUnknown
{
DECLARE_IUNKNOWN;
public:
CMediaPropertyBag(LPUNKNOWN pUnk);
~CMediaPropertyBag();
static CUnknown *CreateInstance(LPUNKNOWN, HRESULT *);
// IMediaPropertyBag
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv);
STDMETHODIMP Read(
LPCOLESTR pszPropName, LPVARIANT pVar,
LPERRORLOG pErrorLog);
STDMETHODIMP Write(LPCOLESTR pszPropName, LPVARIANT pVar);
STDMETHODIMP EnumProperty(
ULONG iProperty, VARIANT *pvarName,
VARIANT *pVarVal);
struct PropPair
{
WCHAR *wszProp;
VARIANT var;
};
private:
// same as read, but returns the internal list pointer
HRESULT Read(
LPCOLESTR pszPropName, LPVARIANT pVar,
LPERRORLOG pErrorLog, POSITION *pPos);
CGenericList<PropPair> m_lstProp;
};
// functions shared between avi parser and wav parser
HRESULT SearchList(
IAsyncReader *pAsyncReader,
DWORDLONG *qwPosOut, FOURCC fccSearchKey,
DWORDLONG qwPosStart, ULONG *cb);
HRESULT SaveInfoChunk(
RIFFLIST UNALIGNED *pRiffInfo, IPropertyBag *pbag);
HRESULT GetInfoStringHelper(RIFFLIST *pInfoList, DWORD dwFcc, BSTR *pbstr);
#endif // _avimsr_h