#ifndef __OUTPIN_H__ #define __OUTPIN_H__ #include "filter.h" // Almost nothing to override class CWrapperOutputPin : public CBaseOutputPin, public IAMStreamConfig, public IAMVideoCompression { friend class CMediaWrapperFilter; // stuff at the bottom is owned by the filter public: DECLARE_IUNKNOWN CWrapperOutputPin(CMediaWrapperFilter *pFilter, ULONG Id, BOOL bOptional, HRESULT *phr); ~CWrapperOutputPin(); STDMETHODIMP NonDelegatingQueryInterface(REFGUID riid, void **ppv); HRESULT DecideBufferSize( IMemAllocator * pAlloc, ALLOCATOR_PROPERTIES * ppropInputRequest ); HRESULT CheckMediaType(const CMediaType *pmt); HRESULT SetMediaType(const CMediaType *pmt); HRESULT GetMediaType(int iPosition,CMediaType *pMediaType); // Override to unset media type HRESULT BreakConnect(); // override to work around broken wm encoders which need a bitrate to connect, for // use when connecting directly to the ASF writer filter STDMETHODIMP Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt); STDMETHODIMP Notify(IBaseFilter * pSender, Quality q); // IAMStreamConfig methods STDMETHODIMP SetFormat(AM_MEDIA_TYPE *pmt); STDMETHODIMP GetFormat(AM_MEDIA_TYPE **ppmt); STDMETHODIMP GetNumberOfCapabilities(int *piCount, int *piSize); STDMETHODIMP GetStreamCaps(int i, AM_MEDIA_TYPE **ppmt, LPBYTE pSCC); // IAMVideoCompression methods STDMETHODIMP put_KeyFrameRate(long KeyFrameRate); STDMETHODIMP get_KeyFrameRate(long FAR* pKeyFrameRate); STDMETHODIMP put_PFramesPerKeyFrame(long PFramesPerKeyFrame) {return E_NOTIMPL;}; STDMETHODIMP get_PFramesPerKeyFrame(long FAR* pPFramesPerKeyFrame) {return E_NOTIMPL;}; STDMETHODIMP put_Quality(double Quality); STDMETHODIMP get_Quality(double FAR* pQuality); STDMETHODIMP put_WindowSize(DWORDLONG WindowSize); STDMETHODIMP get_WindowSize(DWORDLONG FAR* pWindowSize); STDMETHODIMP OverrideKeyFrame(long FrameNumber); STDMETHODIMP OverrideFrameSize(long FrameNumber, long Size); STDMETHODIMP GetInfo(LPWSTR pstrVersion, int *pcbVersion, LPWSTR pstrDescription, int *pcbDescription, long FAR* pDefaultKeyFrameRate, long FAR* pDefaultPFramesPerKey, double FAR* pDefaultQuality, long FAR* pCapabilities); protected: CMediaWrapperFilter *Filter() const { return static_cast(m_pFilter); } ULONG m_Id; CCritSec m_csStream; BOOL m_fNoPosPassThru; CPosPassThru* m_pPosPassThru; CCritSec m_csPassThru; // This stuff is owned by the filter and is declared here for allocation convenience IMediaSample* m_pMediaSample; CStaticMediaBuffer m_MediaBuffer; bool m_fStreamNeedsBuffer; // per-output-stream flag local to SuckOutOutput() bool m_fEOS; // indicates we have already delivered an EOS on this stream bool m_fNeedsPreviousSample; bool m_fAllocatorHasOneBuffer; // Only valid between GetDeliveryBuffer and Deliver for video bool m_fNeedToRelockSurface; // Set when OutputSetType is called bool m_fVideo; // IAMStreamConfig helpers bool IsAudioEncoder(); bool IsVideoEncoder(); bool IsInputConnected(); // used for dmo encoders that natively support these interfaces bool m_bUseIAMStreamConfigOnDMO; bool m_bUseIAMVideoCompressionOnDMO; HRESULT SetCompressionParamUsingIPropBag(const WCHAR * wszParam, const LONG lValue); // compression params for IAMVideoCompression, move to struct eventually long m_lKeyFrameRate; long m_lQuality; AM_MEDIA_TYPE *m_pmtFromSetFormat; }; #endif //__OUTPIN_H__