Changeset 440 for trunk/DirectShowSpy/Helper.cpp
- Timestamp:
- May 18, 2015, 2:09:09 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/DirectShowSpy/Helper.cpp
r376 r440 17 17 #include "resource.h" 18 18 #include "FilterGraphHelper.h" 19 #include "MediaSampleTrace.h" 19 20 20 21 //////////////////////////////////////////////////////////// 21 22 // Test 22 23 23 #if _DEVELOPMENT 24 #if _DEVELOPMENT && FALSE 24 25 25 26 COMPILER_MESSAGE("Development: CFilterGraphHelper::DoPropertyFrameModal as Test") … … 32 33 #endif // defined(_WIN64) 33 34 34 HRESULT STDMETHODCALLTYPE Test() throw()35 HRESULT STDMETHODCALLTYPE Test() 35 36 { 36 37 _ATLTRY … … 62 63 63 64 #endif // _DEVELOPMENT 65 66 #if _DEVELOPMENT //&& FALSE 67 68 COMPILER_MESSAGE("Development: MediaSampleTrace test as Test") 69 70 //////////////////////////////////////////////////////////// 71 // CRendererFilter 72 73 class ATL_NO_VTABLE CRendererFilter : 74 public CComObjectRootEx<CComMultiThreadModelNoCS>, 75 //public CComCoClass<CRendererFilter>, 76 public CBaseFilterT<CRendererFilter>, 77 public CBasePersistT<CRendererFilter>, 78 public CAmFilterMiscFlagsT<CRendererFilter, AM_FILTER_MISC_FLAGS_IS_RENDERER>, 79 public CUpstreamMediaPositionAwareRendererFilterT<CRendererFilter> 80 { 81 public: 82 //enum { IDR = }; 83 84 DECLARE_NO_REGISTRY() //DECLARE_REGISTRY_RESOURCEID(IDR) 85 86 DECLARE_PROTECT_FINAL_CONSTRUCT() 87 88 //DECLARE_QI_TRACE(CRendererFilter) 89 90 BEGIN_COM_MAP(CRendererFilter) 91 COM_INTERFACE_ENTRY(IBaseFilter) 92 COM_INTERFACE_ENTRY(IMediaFilter) 93 COM_INTERFACE_ENTRY_IID(__uuidof(IPersist), IBaseFilter) 94 COM_INTERFACE_ENTRY(IAMFilterMiscFlags) 95 COM_INTERFACE_ENTRY_FUNC(__uuidof(IMediaSeeking), 0, QueryUpstreamMediaPositionInterface) 96 COM_INTERFACE_ENTRY_FUNC(__uuidof(IDispatch), 0, QueryUpstreamMediaPositionInterface) 97 COM_INTERFACE_ENTRY_FUNC(__uuidof(IMediaPosition), 0, QueryUpstreamMediaPositionInterface) 98 END_COM_MAP() 99 100 public: 101 102 //////////////////////////////////////////////////////// 103 // CInputPin 104 105 class ATL_NO_VTABLE CInputPin : 106 public CComObjectRootEx<CComMultiThreadModelNoCS>, 107 public CInputPinT<CInputPin, CRendererFilter> 108 { 109 public: 110 111 //DECLARE_QI_TRACE(CRendererFilter::CInputPin) 112 113 BEGIN_COM_MAP(CInputPin) 114 COM_INTERFACE_ENTRY(IPin) 115 COM_INTERFACE_ENTRY(IMemInputPin) 116 END_COM_MAP() 117 118 public: 119 // CInputPin 120 CInputPin() 121 { 122 _Z5_THIS(); 123 } 124 ~CInputPin() 125 { 126 _Z5_THIS(); 127 } 128 BOOL CheckMediaType(const CMediaType& pMediaType) const 129 { 130 _A(pMediaType); 131 return TRUE; 132 } 133 }; 134 135 private: 136 CObjectPtr<CInputPin> m_pInputPin; 137 mutable CRoCriticalSection m_ReceiveCriticalSection; 138 CComPtr<IMediaSampleTrace> m_pMediaSampleTrace; 139 140 public: 141 // CRendererFilter 142 CRendererFilter() : 143 CBasePersistT<CRendererFilter>(GetDataCriticalSection()) 144 { 145 _Z4_THIS(); 146 } 147 ~CRendererFilter() 148 { 149 _Z4_THIS(); 150 } 151 HRESULT FinalConstruct() 152 { 153 _ATLTRY 154 { 155 m_pInputPin.Construct()->Initialize(this, L"Input"); 156 AddPin(m_pInputPin); 157 CreateUpstreamMediaPosition(); 158 } 159 _ATLCATCH(Exception) 160 { 161 _C(Exception); 162 } 163 return S_OK; 164 } 165 VOID FinalRelease() 166 { 167 DestroyUpstreamMediaPosition(); 168 m_pInputPin.Release(); 169 } 170 VOID DeliverNewSegment(IPin*, REFERENCE_TIME nStartTime, REFERENCE_TIME nStopTime, DOUBLE fRate) 171 { 172 CRoCriticalSectionLock ReceiveLock(m_ReceiveCriticalSection); 173 if(m_pMediaSampleTrace) 174 _V(m_pMediaSampleTrace->RegisterNewSegment((IBaseFilter*) this, L"Main", nStartTime, nStopTime, fRate, NULL)); 175 } 176 VOID DeliverEndOfStream(CInputPin*) 177 { 178 CRoCriticalSectionLock ReceiveLock(m_ReceiveCriticalSection); 179 if(m_pMediaSampleTrace) 180 _V(m_pMediaSampleTrace->RegisterEndOfStream((IBaseFilter*) this, L"Main", L"That's All!")); 181 NotifyComplete(S_OK); 182 } 183 VOID CueFilter() 184 { 185 CRoCriticalSectionLock ReceiveLock(m_ReceiveCriticalSection); 186 CRoCriticalSectionLock DataLock(GetDataCriticalSection()); 187 if(!m_pInputPin->IsPeerPinAvailable()) 188 { 189 NotifyComplete(S_FALSE); 190 return; 191 } 192 const CComQIPtr<ISpy> pSpy = GetFilterGraph(); 193 _A(pSpy); 194 CComPtr<IMediaSampleTrace> pMediaSampleTrace; 195 __C(pSpy->CreateMediaSampleTrace(&pMediaSampleTrace)); 196 m_pMediaSampleTrace = pMediaSampleTrace; 197 } 198 VOID StopFilter() 199 { 200 CRoCriticalSectionLock ReceiveLock(m_ReceiveCriticalSection); 201 CRoCriticalSectionLock DataLock(GetDataCriticalSection()); 202 m_pMediaSampleTrace.Release(); 203 } 204 VOID ReceiveMediaSample(CInputPin* pInputPin, IMediaSample2* pMediaSample, HRESULT& nReceiveResult) 205 { 206 CRoCriticalSectionLock ReceiveLock(m_ReceiveCriticalSection); 207 CMediaSampleProperties Properties(pMediaSample); 208 CRoCriticalSectionLock DataLock(GetDataCriticalSection()); 209 if(m_pMediaSampleTrace) 210 _V(m_pMediaSampleTrace->RegisterMediaSample((IBaseFilter*) this, L"Main", (BYTE*) (AM_SAMPLE2_PROPERTIES*) &Properties, NULL)); 211 nReceiveResult = S_OK; 212 } 213 const CObjectPtr<CInputPin>& GetInputPin() const 214 { 215 return m_pInputPin; 216 } 217 }; 218 219 #if defined(_WIN64) 220 extern "C" __declspec(dllexport) 221 #else 222 #pragma comment(linker, "/EXPORT:Test=_Test@0,PRIVATE") 223 extern "C" // __declspec(dllexport) 224 #endif // defined(_WIN64) 225 226 HRESULT STDMETHODCALLTYPE Test() 227 { 228 _ATLTRY 229 { 230 CSingleThreadedApartment SingleThreadedApartment; 231 CGenericFilterGraph FilterGraph; 232 FilterGraph.CoCreateInstance(); 233 const CComPtr<IBaseFilter> pSourceBaseFilter = FilterGraph.AddSourceFilter( 234 //_T("E:\\Media\\Robotica_1080.wmv") 235 _T("E:\\Media\\Windows Phone - Design for Developers.mp4") 236 ); 237 CComPtr<IPin> pOutputPin = _FilterGraphHelper::GetFilterPin(pSourceBaseFilter, PINDIR_OUTPUT); 238 if(TRUE) 239 { 240 class __declspec(uuid("{025BE2E4-1787-4DA4-A585-C5B2B9EEB57C}")) Demultiplexer; 241 CComPtr<IBaseFilter> pBaseFilter; 242 __C(pBaseFilter.CoCreateInstance(__uuidof(Demultiplexer))); 243 __C(FilterGraph.AddFilter(pBaseFilter, _T("Demultiplexer"))); 244 __C(FilterGraph.Connect(pOutputPin, _FilterGraphHelper::GetFilterPin(pBaseFilter, PINDIR_INPUT))); 245 pOutputPin = _FilterGraphHelper::GetFilterPin(pBaseFilter, PINDIR_OUTPUT); 246 } 247 CObjectPtr<CRendererFilter> pRendererFilter; 248 pRendererFilter.Construct(); 249 __C(FilterGraph.AddFilter(pRendererFilter, _T("Renderer"))); 250 __C(FilterGraph.Connect(pOutputPin, pRendererFilter->GetInputPin())); 251 __C(FilterGraph.m_pMediaFilter->SetSyncSource(NULL)); 252 const CComQIPtr<ISpy> pSpy = FilterGraph.m_pFilterGraph; 253 _A(pSpy); 254 __C(pSpy->put_FriendlyName(CComBSTR(_T("Test")))); 255 __C(FilterGraph.m_pMediaControl->Run()); 256 __C(FilterGraph.WaitForCompletionDispatchingMessages()); 257 CMediaSampleTracePropertySheet PropertySheet; 258 PropertySheet.DoModal(GetActiveWindow()); 259 } 260 _ATLCATCH(Exception) 261 { 262 _C(Exception); 263 } 264 return S_OK; 265 } 266 267 #endif // _DEVELOPMENT
Note: See TracChangeset
for help on using the changeset viewer.