/
filter_analyzer_writer.h
116 lines (88 loc) · 3.88 KB
/
filter_analyzer_writer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
//-----------------------------------------------------------------------------
//
// GraphStudioNext
//
// Author : CPlusSharp
//
//-----------------------------------------------------------------------------
#pragma once
class CAnalyzerPosPassThru;
//-----------------------------------------------------------------------------
//
// CAnalyzerWriterInput class
//
//-----------------------------------------------------------------------------
class CAnalyzerWriterInput : public CRendererInputPin, public IStream
{
public:
CAnalyzerWriterInput(CBaseRenderer *pRenderer, HRESULT *phr, LPCWSTR pPinName, HANDLE* pFile, WCHAR* szFileName, CAnalyzer* pAnalyzer);
~CAnalyzerWriterInput(void);
DECLARE_IUNKNOWN
STDMETHODIMP NonDelegatingQueryInterface(REFIID iid, void** ppv);
STDMETHODIMP GetAllocatorRequirements(__out ALLOCATOR_PROPERTIES* pProps);
STDMETHODIMP QueryInternalConnections(IPin** apPin, ULONG* nPin);
// IStream Methods
STDMETHOD(Read) (void* pv, ULONG cb, ULONG* pcbRead);
STDMETHOD(Write) (void const* pv, ULONG cb, ULONG* pcbWritten);
STDMETHOD(SetSize) (ULARGE_INTEGER libNewSize);
STDMETHOD(CopyTo) (IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*);
STDMETHOD(Commit) (DWORD grfCommitFlags);
STDMETHOD(Revert) (void);
STDMETHOD(LockRegion) (ULARGE_INTEGER, ULARGE_INTEGER, DWORD);
STDMETHOD(UnlockRegion) (ULARGE_INTEGER, ULARGE_INTEGER, DWORD);
STDMETHOD(Clone) (IStream **);
STDMETHOD(Seek) (LARGE_INTEGER liDistanceToMove, DWORD dwOrigin, ULARGE_INTEGER* lpNewFilePointer);
STDMETHOD(Stat) (STATSTG* pStatstg, DWORD grfStatFlag);
protected:
CCritSec m_lock;
HANDLE* m_pFile;
WCHAR* m_szFileName;
CAnalyzer* m_analyzer;
};
//-----------------------------------------------------------------------------
//
// CAnalyzerWriterFilter class
//
//-----------------------------------------------------------------------------
class CAnalyzerWriterFilter : public CBaseRenderer, public IFileSinkFilter2, public IAMFilterMiscFlags, public ISpecifyPropertyPages
{
private:
CAnalyzer* m_analyzer;
public:
CAnalyzerWriterFilter(LPUNKNOWN pUnk, HRESULT *phr);
virtual ~CAnalyzerWriterFilter();
static const CFactoryTemplate g_Template;
static CUnknown * WINAPI CreateInstance(LPUNKNOWN punk, HRESULT *phr);
// expose some interfaces
DECLARE_IUNKNOWN
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv);
// CBaseFilter methods
CBasePin *GetPin(int n);
// overriden
virtual HRESULT CheckMediaType(const CMediaType *pmt);
virtual HRESULT CompleteStateChange(FILTER_STATE OldState);
virtual HRESULT DoRenderSample(IMediaSample* pSample);
// ignore time stamps...
virtual HRESULT ShouldDrawSampleNow(IMediaSample *sample, REFERENCE_TIME *pStartTime, REFERENCE_TIME *pEndTime);
HRESULT GetMediaPositionInterface(REFIID riid, __deref_out void **ppv);
STDMETHODIMP GetClassID(CLSID *pClsID); // Fake ClassID; show as FileWriter because some filters only work correct with the default FileWriter (like the MainConcept Mpeg2Demux! => shame on you!)
// IFileSinkFilter
STDMETHODIMP SetFileName(LPCOLESTR pszFileName, const AM_MEDIA_TYPE *pmt);
STDMETHODIMP GetCurFile( LPOLESTR *ppszFileName, AM_MEDIA_TYPE *pmt);
// Implements the IFileSinkFilter2 interface
STDMETHODIMP SetMode(DWORD dwFlags);
STDMETHODIMP GetMode(DWORD *dwFlags);
// Implements the IAMFilterMiscFlags interface
STDMETHODIMP_(ULONG) GetMiscFlags(void) { return AM_FILTER_MISC_FLAGS_IS_RENDERER; }
// ISpecifyPropertyPages interface
STDMETHODIMP GetPages(CAUUID *pPages);
protected:
WCHAR m_szFileName[MAX_PATH];
// for IFileSinkFilter2
DWORD m_dwFlags;
// File
HANDLE m_file;
// IMediaSeeking and IMediaPosition logging
//CAnalyzerPosPassThru* m_PassThru;
void CloseFile();
};