⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 amfilter.h

📁 mediastreamer2是开源的网络传输媒体流的库
💻 H
📖 第 1 页 / 共 4 页
字号:
        LPCWSTR pName,              // Pin name for us        PIN_DIRECTION dir);         // Either PINDIR_INPUT or PINDIR_OUTPUT#ifdef UNICODE    CBasePin(        CHAR *pObjectName,         // Object description        CBaseFilter *pFilter,       // Owning filter who knows about pins        CCritSec *pLock,            // Object who implements the lock        HRESULT *phr,               // General OLE return code        LPCWSTR pName,              // Pin name for us        PIN_DIRECTION dir);         // Either PINDIR_INPUT or PINDIR_OUTPUT#endif    virtual ~CBasePin();    DECLARE_IUNKNOWN    STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv);    STDMETHODIMP_(ULONG) NonDelegatingRelease();    STDMETHODIMP_(ULONG) NonDelegatingAddRef();    // --- IPin methods ---    // take lead role in establishing a connection. Media type pointer    // may be null, or may point to partially-specified mediatype    // (subtype or format type may be GUID_NULL).    STDMETHODIMP Connect(        IPin * pReceivePin,        const AM_MEDIA_TYPE *pmt   // optional media type    );    // (passive) accept a connection from another pin    STDMETHODIMP ReceiveConnection(        IPin * pConnector,      // this is the initiating connecting pin        const AM_MEDIA_TYPE *pmt   // this is the media type we will exchange    );    STDMETHODIMP Disconnect();    STDMETHODIMP ConnectedTo(IPin **pPin);    STDMETHODIMP ConnectionMediaType(AM_MEDIA_TYPE *pmt);    STDMETHODIMP QueryPinInfo(        PIN_INFO * pInfo    );    STDMETHODIMP QueryDirection(    	PIN_DIRECTION * pPinDir    );    STDMETHODIMP QueryId(        LPWSTR * Id    );    // does the pin support this media type    STDMETHODIMP QueryAccept(        const AM_MEDIA_TYPE *pmt    );    // return an enumerator for this pins preferred media types    STDMETHODIMP EnumMediaTypes(        IEnumMediaTypes **ppEnum    );    // return an array of IPin* - the pins that this pin internally connects to    // All pins put in the array must be AddReffed (but no others)    // Errors: "Can't say" - FAIL, not enough slots - return S_FALSE    // Default: return E_NOTIMPL    // The filter graph will interpret NOT_IMPL as any input pin connects to    // all visible output pins and vice versa.    // apPin can be NULL if nPin==0 (not otherwise).    STDMETHODIMP QueryInternalConnections(        IPin* *apPin,     // array of IPin*        ULONG *nPin       // on input, the number of slots                          // on output  the number of pins    ) { return E_NOTIMPL; }    // Called when no more data will be sent    STDMETHODIMP EndOfStream(void);    // Begin/EndFlush still PURE    // NewSegment notifies of the start/stop/rate applying to the data    // about to be received. Default implementation records data and    // returns S_OK.    // Override this to pass downstream.    STDMETHODIMP NewSegment(                    REFERENCE_TIME tStart,                    REFERENCE_TIME tStop,                    double dRate);    //================================================================================    // IQualityControl methods    //================================================================================    STDMETHODIMP Notify(IBaseFilter * pSender, Quality q);    STDMETHODIMP SetSink(IQualityControl * piqc);    // --- helper methods ---    // Returns true if the pin is connected. false otherwise.    BOOL IsConnected(void) {return (m_Connected != NULL); };    // Return the pin this is connected to (if any)    IPin * GetConnected() { return m_Connected; };    // Check if our filter is currently stopped    BOOL IsStopped() {        return (m_pFilter->m_State == State_Stopped);    };    // find out the current type version (used by enumerators)    virtual LONG GetMediaTypeVersion();    void IncrementTypeVersion();    // switch the pin to active (paused or running) mode    // not an error to call this if already active    virtual HRESULT Active(void);    // switch the pin to inactive state - may already be inactive    virtual HRESULT Inactive(void);    // Notify of Run() from filter    virtual HRESULT Run(REFERENCE_TIME tStart);    // check if the pin can support this specific proposed type and format    virtual HRESULT CheckMediaType(const CMediaType *) PURE;    // set the connection to use this format (previously agreed)    virtual HRESULT SetMediaType(const CMediaType *);    // check that the connection is ok before verifying it    // can be overridden eg to check what interfaces will be supported.    virtual HRESULT CheckConnect(IPin *);    // Set and release resources required for a connection    virtual HRESULT BreakConnect();    virtual HRESULT CompleteConnect(IPin *pReceivePin);    // returns the preferred formats for a pin    virtual HRESULT GetMediaType(int iPosition,CMediaType *pMediaType);    // access to NewSegment values    REFERENCE_TIME CurrentStopTime() {        return m_tStop;    }    REFERENCE_TIME CurrentStartTime() {        return m_tStart;    }    double CurrentRate() {        return m_dRate;    }    //  Access name    LPWSTR Name() { return m_pName; };    //  Can reconnectwhen active?    void SetReconnectWhenActive(bool bCanReconnect)    {        m_bCanReconnectWhenActive = bCanReconnect;    }    bool CanReconnectWhenActive()    {        return m_bCanReconnectWhenActive;    }protected:    STDMETHODIMP DisconnectInternal();};//=====================================================================//=====================================================================// Defines CEnumPins//// Pin enumerator class that works by calling CBaseFilter. This interface// is provided by CBaseFilter::EnumPins and calls GetPinCount() and// GetPin() to enumerate existing pins. Needs to be a separate object so// that it can be cloned (creating an existing object at the same// position in the enumeration)////=====================================================================//=====================================================================class CEnumPins : public IEnumPins      // The interface we support{    int m_Position;                 // Current ordinal position    int m_PinCount;                 // Number of pins available    CBaseFilter *m_pFilter;         // The filter who owns us    LONG m_Version;                 // Pin version information    LONG m_cRef;    typedef CGenericList<CBasePin> CPinList;    CPinList m_PinCache;	    // These pointers have not been AddRef'ed and				    // so they should not be dereferenced.  They are				    // merely kept to ID which pins have been enumerated.#ifdef DEBUG    DWORD m_dwCookie;#endif    /* If while we are retrieving a pin for example from the filter an error       occurs we assume that our internal state is stale with respect to the       filter (someone may have deleted all the pins). We can check before       starting whether or not the operation is likely to fail by asking the       filter what it's current version number is. If the filter has not       overriden the GetPinVersion method then this will always match */    BOOL AreWeOutOfSync() {        return (m_pFilter->GetPinVersion() == m_Version ? FALSE : TRUE);    };    /* This method performs the same operations as Reset, except is does not clear       the cache of pins already enumerated. */    STDMETHODIMP Refresh();public:    CEnumPins(        CBaseFilter *pFilter,        CEnumPins *pEnumPins);    virtual ~CEnumPins();    // IUnknown    STDMETHODIMP QueryInterface(REFIID riid, void **ppv);    STDMETHODIMP_(ULONG) AddRef();    STDMETHODIMP_(ULONG) Release();    // IEnumPins    STDMETHODIMP Next(        ULONG cPins,         // place this many pins...        IPin ** ppPins,      // ...in this array of IPin*        ULONG * pcFetched    // actual count passed returned here    );    STDMETHODIMP Skip(ULONG cPins);    STDMETHODIMP Reset();    STDMETHODIMP Clone(IEnumPins **ppEnum);};//=====================================================================//=====================================================================// Defines CEnumMediaTypes//// Enumerates the preferred formats for input and output pins//=====================================================================//=====================================================================class CEnumMediaTypes : public IEnumMediaTypes    // The interface we support{    int m_Position;           // Current ordinal position    CBasePin *m_pPin;         // The pin who owns us    LONG m_Version;           // Media type version value    LONG m_cRef;#ifdef DEBUG    DWORD m_dwCookie;#endif    /* The media types a filter supports can be quite dynamic so we add to       the general IEnumXXXX interface the ability to be signaled when they       change via an event handle the connected filter supplies. Until the       Reset method is called after the state changes all further calls to       the enumerator (except Reset) will return E_UNEXPECTED error code */    BOOL AreWeOutOfSync() {        return (m_pPin->GetMediaTypeVersion() == m_Version ? FALSE : TRUE);    };public:    CEnumMediaTypes(        CBasePin *pPin,        CEnumMediaTypes *pEnumMediaTypes);    virtual ~CEnumMediaTypes();    // IUnknown    STDMETHODIMP QueryInterface(REFIID riid, void **ppv);    STDMETHODIMP_(ULONG) AddRef();    STDMETHODIMP_(ULONG) Release();    // IEnumMediaTypes    STDMETHODIMP Next(        ULONG cMediaTypes,          // place this many pins...        AM_MEDIA_TYPE ** ppMediaTypes,  // ...in this array        ULONG * pcFetched           // actual count passed    );    STDMETHODIMP Skip(ULONG cMediaTypes);    STDMETHODIMP Reset();    STDMETHODIMP Clone(IEnumMediaTypes **ppEnum);};//=====================================================================//=====================================================================// Defines CBaseOutputPin//// class derived from CBasePin that can pass buffers to a connected pin// that supports IMemInputPin. Supports IPin.//// Derive your output pin from this.////=====================================================================//=====================================================================class  AM_NOVTABLE CBaseOutputPin : public CBasePin{protected:    IMemAllocator *m_pAllocator;    IMemInputPin *m_pInputPin;        // interface on the downstreaminput pin                                      // set up in CheckConnect when we connect.public:    CBaseOutputPin(        TCHAR *pObjectName,        CBaseFilter *pFilter,        CCritSec *pLock,        HRESULT *phr,        LPCWSTR pName);#ifdef UNICODE    CBaseOutputPin(        CHAR *pObjectName,        CBaseFilter *pFilter,        CCritSec *pLock,        HRESULT *phr,        LPCWSTR pName);#endif    // override CompleteConnect() so we can negotiate an allocator    virtual HRESULT CompleteConnect(IPin *pReceivePin);    // negotiate the allocator and its buffer size/count and other properties    // Calls DecideBufferSize to set properties    virtual HRESULT DecideAllocator(IMemInputPin * pPin, IMemAllocator ** pAlloc);    // override this to set the buffer size and count. Return an error    // if the size/count is not to your liking.    // The allocator properties passed in are those requested by the    // input pin - use eg the alignment and prefix members if you have    // no preference on these.    virtual HRESULT DecideBufferSize(        IMemAllocator * pAlloc,        ALLOCATOR_PROPERTIES * ppropInputRequest    ) PURE;    // returns an empty sample buffer from the allocator    virtual HRESULT GetDeliveryBuffer(IMediaSample ** ppSample,                                      REFERENCE_TIME * pStartTime,                                      REFERENCE_TIME * pEndTime,                                      DWORD dwFlags);    // deliver a filled-in sample to the connected input pin    // note - you need to release it after calling this. The receiving    // pin will addref the sample if it needs to hold it beyond the    // call.    virtual HRESULT Deliver(IMediaSample *);    // override this to control the connection    virtual HRESULT InitAllocator(IMemAllocator **ppAlloc);    HRESULT CheckConnect(IPin *pPin);    HRESULT BreakConnect();    // override to call Commit and Decommit    HRESULT Active(void);    HRESULT Inactive(void);    // we have a default handling of EndOfStream which is to return    // an error, since this should be called on input pins only    STDMETHODIMP EndOfStream(void);    // called from elsewhere in our filter to pass EOS downstream to    // our connected input pin    virtual HRESULT DeliverEndOfStream(void);    // same for Begin/EndFlush - we handle Begin/EndFlush since it    // is an error on an output pin, and we have Deliver methods to    // call the methods on the connected pin    STDMETHODIMP BeginFlush(void);    STDMETHODIMP EndFlush(void);    virtual HRESULT DeliverBeginFlush(void);    virtual HRESULT DeliverEndFlush(void);    // deliver NewSegment to connected pin - you will need to    // override this if you queue any data in your output pin.    virtual HRESULT DeliverNewSegment(                        REFERENCE_TIME tStart,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -