123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478 |
- #ifndef __RENBASE__
- #define __RENBASE__
- class CBaseRenderer;
- class CBaseVideoRenderer;
- class CRendererInputPin;
- class CRendererInputPin : public CBaseInputPin
- {
- protected:
- CBaseRenderer *m_pRenderer;
- public:
- CRendererInputPin(__inout CBaseRenderer *pRenderer,
- __inout HRESULT *phr,
- __in_opt LPCWSTR Name);
-
- HRESULT BreakConnect();
- HRESULT CompleteConnect(IPin *pReceivePin);
- HRESULT SetMediaType(const CMediaType *pmt);
- HRESULT CheckMediaType(const CMediaType *pmt);
- HRESULT Active();
- HRESULT Inactive();
-
- STDMETHODIMP QueryId(__deref_out LPWSTR *Id);
- STDMETHODIMP EndOfStream();
- STDMETHODIMP BeginFlush();
- STDMETHODIMP EndFlush();
- STDMETHODIMP Receive(IMediaSample *pMediaSample);
-
- IMemAllocator inline *Allocator() const
- {
- return m_pAllocator;
- }
- };
- class CBaseRenderer : public CBaseFilter
- {
- protected:
- friend class CRendererInputPin;
- friend void CALLBACK EndOfStreamTimer(UINT uID,
- UINT uMsg,
- DWORD_PTR dwUser,
- DWORD_PTR dw1,
- DWORD_PTR dw2);
- CRendererPosPassThru *m_pPosition;
- CAMEvent m_RenderEvent;
- CAMEvent m_ThreadSignal;
- CAMEvent m_evComplete;
- BOOL m_bAbort;
- BOOL m_bStreaming;
- DWORD_PTR m_dwAdvise;
- IMediaSample *m_pMediaSample;
- BOOL m_bEOS;
- BOOL m_bEOSDelivered;
- CRendererInputPin *m_pInputPin;
- CCritSec m_InterfaceLock;
- CCritSec m_RendererLock;
- IQualityControl * m_pQSink;
- BOOL m_bRepaintStatus;
-
- volatile BOOL m_bInReceive;
-
- REFERENCE_TIME m_SignalTime;
- UINT m_EndOfStreamTimer;
- CCritSec m_ObjectCreationLock;
-
-
-
- public:
- CBaseRenderer(REFCLSID RenderClass,
- __in_opt LPCTSTR pName,
- __inout_opt LPUNKNOWN pUnk,
- __inout HRESULT *phr);
- ~CBaseRenderer();
-
- virtual HRESULT GetMediaPositionInterface(REFIID riid, __deref_out void **ppv);
- STDMETHODIMP NonDelegatingQueryInterface(REFIID, __deref_out void **);
- virtual HRESULT SourceThreadCanWait(BOOL bCanWait);
- #ifdef DEBUG
-
- void DisplayRendererState();
- #endif
- virtual HRESULT WaitForRenderTime();
- virtual HRESULT CompleteStateChange(FILTER_STATE OldState);
-
- BOOL IsEndOfStream() { return m_bEOS; };
- BOOL IsEndOfStreamDelivered() { return m_bEOSDelivered; };
- BOOL IsStreaming() { return m_bStreaming; };
- void SetAbortSignal(BOOL bAbort) { m_bAbort = bAbort; };
- virtual void OnReceiveFirstSample(IMediaSample *pMediaSample) { };
- CAMEvent *GetRenderEvent() { return &m_RenderEvent; };
-
- void Ready() { m_evComplete.Set(); };
- void NotReady() { m_evComplete.Reset(); };
- BOOL CheckReady() { return m_evComplete.Check(); };
- virtual int GetPinCount();
- virtual CBasePin *GetPin(int n);
- FILTER_STATE GetRealState();
- void SendRepaint();
- void SendNotifyWindow(IPin *pPin,HWND hwnd);
- BOOL OnDisplayChange();
- void SetRepaintStatus(BOOL bRepaint);
-
- STDMETHODIMP Stop();
- STDMETHODIMP Pause();
- STDMETHODIMP Run(REFERENCE_TIME StartTime);
- STDMETHODIMP GetState(DWORD dwMSecs, __out FILTER_STATE *State);
- STDMETHODIMP FindPin(LPCWSTR Id, __deref_out IPin **ppPin);
-
- virtual void OnRenderStart(IMediaSample *pMediaSample);
- virtual void OnRenderEnd(IMediaSample *pMediaSample);
- virtual HRESULT OnStartStreaming() { return NOERROR; };
- virtual HRESULT OnStopStreaming() { return NOERROR; };
- virtual void OnWaitStart() { };
- virtual void OnWaitEnd() { };
- virtual void PrepareRender() { };
- #ifdef PERF
- REFERENCE_TIME m_trRenderStart;
-
- int m_idBaseStamp;
- int m_idBaseRenderTime;
- int m_idBaseAccuracy;
- #endif
-
- virtual BOOL ScheduleSample(IMediaSample *pMediaSample);
- virtual HRESULT GetSampleTimes(IMediaSample *pMediaSample,
- __out REFERENCE_TIME *pStartTime,
- __out REFERENCE_TIME *pEndTime);
- virtual HRESULT ShouldDrawSampleNow(IMediaSample *pMediaSample,
- __out REFERENCE_TIME *ptrStart,
- __out REFERENCE_TIME *ptrEnd);
-
- void TimerCallback();
- void ResetEndOfStreamTimer();
- HRESULT NotifyEndOfStream();
- virtual HRESULT SendEndOfStream();
- virtual HRESULT ResetEndOfStream();
- virtual HRESULT EndOfStream();
-
- void SignalTimerFired();
- virtual HRESULT CancelNotification();
- virtual HRESULT ClearPendingSample();
-
- virtual HRESULT Active();
- virtual HRESULT Inactive();
- virtual HRESULT StartStreaming();
- virtual HRESULT StopStreaming();
- virtual HRESULT BeginFlush();
- virtual HRESULT EndFlush();
-
- virtual HRESULT BreakConnect();
- virtual HRESULT SetMediaType(const CMediaType *pmt);
- virtual HRESULT CompleteConnect(IPin *pReceivePin);
-
- virtual HRESULT PrepareReceive(IMediaSample *pMediaSample);
- virtual HRESULT Receive(IMediaSample *pMediaSample);
- virtual BOOL HaveCurrentSample();
- virtual IMediaSample *GetCurrentSample();
- virtual HRESULT Render(IMediaSample *pMediaSample);
-
- virtual HRESULT DoRenderSample(IMediaSample *pMediaSample) PURE;
- virtual HRESULT CheckMediaType(const CMediaType *) PURE;
-
- void WaitForReceiveToComplete();
- };
- #define AVGPERIOD 4
- #define DO_MOVING_AVG(avg,obs) (avg = (1024*obs + (AVGPERIOD-1)*avg)/AVGPERIOD)
- class CBaseVideoRenderer : public CBaseRenderer,
- public IQualProp,
- public IQualityControl
- {
- protected:
-
-
-
-
-
-
-
-
-
-
-
-
-
- int m_nNormal;
-
-
- #ifdef PERF
- BOOL m_bDrawLateFrames;
-
- #endif
- BOOL m_bSupplierHandlingQuality;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- int m_trThrottle;
-
-
-
- int m_trRenderAvg;
- int m_trRenderLast;
- int m_tRenderStart;
-
-
-
-
-
- int m_trEarliness;
-
-
-
-
-
-
-
-
- int m_trTarget;
-
-
-
- int m_trWaitAvg;
-
-
-
-
-
- int m_trFrameAvg;
- int m_trDuration;
- #ifdef PERF
-
- int m_idTimeStamp;
- int m_idEarliness;
- int m_idTarget;
- int m_idWaitReal;
- int m_idWait;
- int m_idFrameAccuracy;
- int m_idRenderAvg;
- int m_idSchLateTime;
- int m_idQualityRate;
- int m_idQualityTime;
- int m_idDecision;
- int m_idDuration;
- int m_idThrottle;
-
-
- #endif
- REFERENCE_TIME m_trRememberStampForPerf;
-
- #ifdef PERF
- REFERENCE_TIME m_trRememberFrameForPerf;
-
- int m_idFrameAvg;
- int m_idWaitAvg;
- #endif
-
-
-
- int m_cFramesDropped;
- int m_cFramesDrawn;
-
-
- LONGLONG m_iTotAcc;
- LONGLONG m_iSumSqAcc;
-
- REFERENCE_TIME m_trLastDraw;
- LONGLONG m_iSumSqFrameTime;
- LONGLONG m_iSumFrameTime;
-
-
-
-
-
- int m_trLate;
- int m_trFrame;
- int m_tStreamingStart;
-
-
- #ifdef PERF
- LONGLONG m_llTimeOffset;
- #endif
- public:
- CBaseVideoRenderer(REFCLSID RenderClass,
- __in_opt LPCTSTR pName,
- __inout_opt LPUNKNOWN pUnk,
- __inout HRESULT *phr);
- ~CBaseVideoRenderer();
-
- STDMETHODIMP SetSink( IQualityControl * piqc);
- STDMETHODIMP Notify( IBaseFilter * pSelf, Quality q);
-
- void OnRenderStart(IMediaSample *pMediaSample);
- void OnRenderEnd(IMediaSample *pMediaSample);
- void OnWaitStart();
- void OnWaitEnd();
- HRESULT OnStartStreaming();
- HRESULT OnStopStreaming();
- void ThrottleWait();
-
- void PreparePerformanceData(int trLate, int trFrame);
- virtual void RecordFrameLateness(int trLate, int trFrame);
- virtual void OnDirectRender(IMediaSample *pMediaSample);
- virtual HRESULT ResetStreamingTimes();
- BOOL ScheduleSample(IMediaSample *pMediaSample);
- HRESULT ShouldDrawSampleNow(IMediaSample *pMediaSample,
- __inout REFERENCE_TIME *ptrStart,
- __inout REFERENCE_TIME *ptrEnd);
- virtual HRESULT SendQuality(REFERENCE_TIME trLate, REFERENCE_TIME trRealStream);
- STDMETHODIMP JoinFilterGraph(__inout_opt IFilterGraph * pGraph, __in_opt LPCWSTR pName);
-
-
-
-
-
-
-
-
- HRESULT GetStdDev(
- int nSamples,
- __out int *piResult,
- LONGLONG llSumSq,
- LONGLONG iTot
- );
- public:
-
- STDMETHODIMP get_FramesDroppedInRenderer(__out int *cFramesDropped);
- STDMETHODIMP get_FramesDrawn(__out int *pcFramesDrawn);
- STDMETHODIMP get_AvgFrameRate(__out int *piAvgFrameRate);
- STDMETHODIMP get_Jitter(__out int *piJitter);
- STDMETHODIMP get_AvgSyncOffset(__out int *piAvg);
- STDMETHODIMP get_DevSyncOffset(__out int *piDev);
-
- DECLARE_IUNKNOWN
- STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,__deref_out VOID **ppv);
- };
- #endif
|