source: trunk/DirectShowSpy/FilterGraphHelper.h @ 207

Last change on this file since 207 was 207, checked in by roman, 9 years ago

Added crossbar information on textual filter graph representation

File size: 28.7 KB
Line 
1////////////////////////////////////////////////////////////
2// Copyright (C) Roman Ryltsov, 2008-2013
3// Created by Roman Ryltsov roman@alax.info
4
5#pragma once
6
7#include "rofiles.h"
8#include "rodshow.h"
9#include "DirectShowSpy_i.h"
10#include "Common.h"
11
12////////////////////////////////////////////////////////////
13// CFilterGraphHelper
14
15class ATL_NO_VTABLE CFilterGraphHelper :
16        public CComObjectRootEx<CComMultiThreadModelNoCS>,
17        public CComCoClass<CFilterGraphHelper, &__uuidof(FilterGraphHelper)>,
18        public IProvideClassInfo2Impl<&__uuidof(FilterGraphHelper), &IID_NULL>,
19        public IDispatchImpl<IFilterGraphHelper>
20{
21public:
22        enum { IDR = IDR_FILTERGRAPHHELPER };
23
24//DECLARE_REGISTRY_RESOURCEID(IDR)
25
26BEGIN_COM_MAP(CFilterGraphHelper)
27        COM_INTERFACE_ENTRY(IFilterGraphHelper)
28        COM_INTERFACE_ENTRY(IDispatch)
29        COM_INTERFACE_ENTRY(IProvideClassInfo2)
30        COM_INTERFACE_ENTRY(IProvideClassInfo)
31END_COM_MAP()
32
33public:
34
35        ////////////////////////////////////////////////////////
36        // CProcessData
37
38        class CProcessData
39        {
40        public:
41                CStringW m_sDisplayName;
42                DWORD m_nIdentifier;
43                CPath m_sImagePath;
44        };
45
46private:
47        mutable CRoCriticalSection m_DataCriticalSection;
48        CComPtr<IFilterGraph> m_pFilterGraph;
49
50public:
51// CFilterGraphHelper
52        static HRESULT WINAPI UpdateRegistry(BOOL bRegister) throw()
53        {
54                _Z2(atlTraceRegistrar, 2, _T("bRegister %d\n"), bRegister);
55                _ATLTRY
56                {
57                        UpdateRegistryFromResource<CFilterGraphHelper>(bRegister);
58                }
59                _ATLCATCH(Exception)
60                {
61                        _C(Exception);
62                }
63                return S_OK;
64        }
65        CFilterGraphHelper()
66        {
67                _Z4(atlTraceRefcount, 4, _T("this 0x%p\n"), this);
68        }
69        ~CFilterGraphHelper()
70        {
71                _Z4(atlTraceRefcount, 4, _T("this 0x%p\n"), this);
72        }
73        static CString FormatIdentifier(LPCSTR pszValue)
74        {
75                CString sText;
76                if(pszValue && *pszValue)
77                {
78                        sText = _T("``");
79                        sText.Insert(1, CString(pszValue));
80                }
81                return sText;
82        }
83        static CString FormatIdentifier(LPCWSTR pszValue)
84        {
85                CString sText;
86                if(pszValue && *pszValue)
87                {
88                        sText = _T("``");
89                        sText.Insert(1, CString(pszValue));
90                }
91                return sText;
92        }
93        static CString FormatIdentifier(LONG nValue)
94        {
95                CString sText;
96                sText = _T("``");
97                sText.Insert(1, _StringHelper::FormatNumber(nValue));
98                return sText;
99        }
100        static CString FormatIdentifier(ULONG nValue)
101        {
102                return FormatIdentifier((LONG) nValue);
103        }
104        static CString FormatIdentifier(BOOL nValue)
105        {
106                return FormatIdentifier((LONG) nValue);
107        }
108        static CString FormatIdentifier(LONGLONG nValue)
109        {
110                CString sText;
111                sText = _T("``");
112                sText.Insert(1, _StringHelper::FormatNumber(nValue));
113                return sText;
114        }
115        static CString FormatIdentifier(LONG nValue, LPCTSTR pszFormat)
116        {
117                CString sText;
118                sText = _T("``");
119                sText.Insert(1, AtlFormatString(pszFormat, nValue));
120                return sText;
121        }
122        #define I FormatIdentifier
123        static CString FormatPhysicalConnectorType(PhysicalConnectorType Value)
124        {
125                struct 
126                {
127                        PhysicalConnectorType Value;
128                        LPCSTR pszName;
129                } g_pMap[] = 
130                {
131                        #define A(x) { x, #x },
132                        A(PhysConn_Video_Tuner)
133                        A(PhysConn_Video_Composite)
134                        A(PhysConn_Video_SVideo)
135                        A(PhysConn_Video_RGB)
136                        A(PhysConn_Video_YRYBY)
137                        A(PhysConn_Video_SerialDigital)
138                        A(PhysConn_Video_ParallelDigital)
139                        A(PhysConn_Video_SCSI)
140                        A(PhysConn_Video_AUX)
141                        A(PhysConn_Video_1394)
142                        A(PhysConn_Video_USB)
143                        A(PhysConn_Video_VideoDecoder)
144                        A(PhysConn_Video_VideoEncoder)
145                        A(PhysConn_Video_SCART)
146                        A(PhysConn_Video_Black)
147                        A(PhysConn_Audio_Tuner)
148                        A(PhysConn_Audio_Line)
149                        A(PhysConn_Audio_Mic)
150                        A(PhysConn_Audio_AESDigital)
151                        A(PhysConn_Audio_SPDIFDigital)
152                        A(PhysConn_Audio_SCSI)
153                        A(PhysConn_Audio_AUX)
154                        A(PhysConn_Audio_1394)
155                        A(PhysConn_Audio_USB)
156                        A(PhysConn_Audio_AudioDecoder)
157                        #undef A
158                };
159                for(SIZE_T nIndex = 0; nIndex < DIM(g_pMap); nIndex++)
160                        if(g_pMap[nIndex].Value == Value)
161                                return CString(g_pMap[nIndex].pszName);
162                return AtlFormatString(_T("0x%04X"), Value);
163        }
164        static CString FormatPins(_FilterGraphHelper::CPinArray& PinArray)
165        {
166                CRoArrayT<CString> Array;
167                for(SIZE_T nIndex  = 0; nIndex < PinArray.GetCount(); nIndex++)
168                {
169                        const CComPtr<IPin>& pPin = PinArray[nIndex];
170                        CString sText = I(_FilterGraphHelper::GetPinName(pPin));
171                        const CComPtr<IPin> pPeerPin = _FilterGraphHelper::GetPeerPin(pPin);
172                        if(pPeerPin)
173                                sText += AtlFormatString(_T(" (%s)"), I(_FilterGraphHelper::GetPinFullName(pPeerPin)));
174                        Array.Add(sText);
175                }
176                return _StringHelper::Join(Array, _T(", "));
177        }
178        static CString GetText(IFilterGraph* pFilterGraph, const CProcessData* pProcessData = NULL)
179        {
180                if(!pFilterGraph)
181                        return (LPCTSTR) NULL;
182                CString sText;
183                sText += AtlFormatString(_T("# ") _T("Filter Graph") _T("\r\n") _T("\r\n"));
184                #pragma region Graph Parameters
185                if(pProcessData)
186                        sText += AtlFormatString(_T("* ") _T("Process: %s (%s) %s") _T("\r\n"), I(pProcessData->m_nIdentifier), I(pProcessData->m_nIdentifier, _T("0x%X")), I(FindFileName(pProcessData->m_sImagePath)));
187                #pragma region IMediaControl
188                const CComQIPtr<IMediaControl> pMediaControl = pFilterGraph;
189                if(pMediaControl)
190                        _ATLTRY
191                        {
192                                OAFilterState State;
193                                const HRESULT nGetStateResult = pMediaControl->GetState(0, &State);
194                                _Z45_DSHRESULT(nGetStateResult);
195                                static const LPCTSTR g_ppszStates[] = { _T("Stopped"), _T("Paused"), _T("Running"), };
196                                if(SUCCEEDED(nGetStateResult) && (SIZE_T) State < DIM(g_ppszStates))
197                                        sText += AtlFormatString(_T("* ") _T("State: %s") _T("\r\n"), I(g_ppszStates[(SIZE_T) State]));
198                        }
199                        _ATLCATCHALL()
200                        {
201                                _Z_EXCEPTION();
202                        }
203                #pragma endregion
204                #pragma region IMediaPosition
205                const CComQIPtr<IMediaPosition> pMediaPosition = pFilterGraph;
206                if(pMediaPosition)
207                        _ATLTRY
208                        {
209                                DOUBLE fDuration = 0, fPosition = 0;
210                                const HRESULT nGetDurationResult = pMediaPosition->get_Duration(&fDuration);
211                                _Z45_DSHRESULT(nGetDurationResult);
212                                if(fDuration > 0)
213                                {
214                                        sText += AtlFormatString(_T("* ") _T("Duration: %s (%s seconds)") _T("\r\n"), I(_FilterGraphHelper::FormatSecondTime(fDuration)), I(_StringHelper::FormatNumber(fDuration, 3)));
215                                        const HRESULT nCurrentPositionResult = pMediaPosition->get_CurrentPosition(&fPosition);
216                                        _Z45_DSHRESULT(nCurrentPositionResult);
217                                        if(SUCCEEDED(nCurrentPositionResult))
218                                                sText += AtlFormatString(_T("* ") _T("Position: %s (%s seconds)") _T("\r\n"), I(_FilterGraphHelper::FormatSecondTime(fPosition)), I(_StringHelper::FormatNumber(fPosition, 3)));
219                                }
220                        }
221                        _ATLCATCHALL()
222                        {
223                                _Z_EXCEPTION();
224                        }
225                #pragma endregion
226                if(pProcessData)
227                {
228                        if(!pProcessData->m_sDisplayName.IsEmpty())
229                                sText += AtlFormatString(_T("* ") _T("Display Name: %s") _T("\r\n"), I(pProcessData->m_sDisplayName));
230                        const CString sDirectory = (LPCTSTR) GetPathDirectory(pProcessData->m_sImagePath);
231                        if(!sDirectory.IsEmpty())
232                                sText += AtlFormatString(_T("* ") _T("Process Directory: %s") _T("\r\n"), I(sDirectory));
233                }
234                const CComQIPtr<IMediaFilter> pMediaFilter = pFilterGraph;
235                CComPtr<IReferenceClock> pFilterGraphReferenceClock;
236                const HRESULT nGetSyncSourceResult = pMediaFilter->GetSyncSource(&pFilterGraphReferenceClock);
237                _Z45_DSHRESULT(nGetSyncSourceResult);
238                sText += _T("\r\n");
239                #pragma endregion
240                #pragma region Filter
241                _FilterGraphHelper::CFilterArray FilterArray;
242                _FilterGraphHelper::GetGraphFilters(pFilterGraph, FilterArray);
243                if(!FilterArray.IsEmpty())
244                {
245                        sText += AtlFormatString(_T("## ") _T("Filters") _T("\r\n") _T("\r\n"));
246                        for(SIZE_T nIndex = 0; nIndex < FilterArray.GetCount(); nIndex++)
247                                _ATLTRY
248                                {
249                                        const CComPtr<IBaseFilter>& pBaseFilter = FilterArray[nIndex];
250                                        sText += AtlFormatString(_T("%d. ") _T("%ls") _T("\r\n"), nIndex + 1, _FilterGraphHelper::GetFilterName(pBaseFilter));
251                                        const CStringW sClassIdentifierString = _FilterGraphHelper::GetFilterClassIdentifierString(pBaseFilter);
252                                        if(!sClassIdentifierString.IsEmpty())
253                                                sText += AtlFormatString(_T(" * ") _T("Class: %s %s") _T("\r\n"), I(sClassIdentifierString), I(_FilterGraphHelper::GetFilterClassDescription(pBaseFilter)));
254                                        _FilterGraphHelper::CPinArray InputPinArray;
255                                        if(_FilterGraphHelper::GetFilterPins(pBaseFilter, PINDIR_INPUT, InputPinArray))
256                                                sText += AtlFormatString(_T(" * ") _T("Input Pins: %s") _T("\r\n"), FormatPins(InputPinArray));
257                                        _FilterGraphHelper::CPinArray OutputPinArray;
258                                        if(_FilterGraphHelper::GetFilterPins(pBaseFilter, PINDIR_OUTPUT, OutputPinArray))
259                                                sText += AtlFormatString(_T(" * ") _T("Output Pins: %s") _T("\r\n"), FormatPins(OutputPinArray));
260                                        #pragma region IReferenceClock
261                                        const CComQIPtr<IReferenceClock> pReferenceClock = pBaseFilter;
262                                        if(pReferenceClock)
263                                        {
264                                                CRoArrayT<CString> Array;
265                                                Array.Add(I(_T("Available")));
266                                                if(pReferenceClock == pFilterGraphReferenceClock)
267                                                        Array.Add(I(_T("Selected")));
268                                                sText += AtlFormatString(_T(" * ") _T("Reference Clock: %s") _T("\r\n"), _StringHelper::Join(Array, _T(", ")));
269                                        }
270                                        #pragma endregion
271                                        #pragma region IFileSourceFilter
272                                        const CComQIPtr<IFileSourceFilter> pFileSourceFilter = pBaseFilter;
273                                        if(pFileSourceFilter)
274                                                _ATLTRY
275                                                {
276                                                        CComHeapPtr<OLECHAR> pszFileName;
277                                                        CMediaType pMediaType;
278                                                        pMediaType.Allocate(MEDIATYPE_NULL, MEDIASUBTYPE_NULL);
279                                                        const HRESULT nGetCurFileResult = pFileSourceFilter->GetCurFile(&pszFileName, pMediaType);
280                                                        _Z45_DSHRESULT(nGetCurFileResult);
281                                                        if(SUCCEEDED(nGetCurFileResult))
282                                                                sText += AtlFormatString(_T(" * ") _T("File Source: %s") _T("\r\n"), I(pszFileName));
283                                                }
284                                                _ATLCATCHALL()
285                                                {
286                                                        _Z_EXCEPTION();
287                                                }
288                                        #pragma endregion
289                                        #pragma region IFileSinkFilter
290                                        const CComQIPtr<IFileSinkFilter> pFileSinkFilter = pBaseFilter;
291                                        if(pFileSinkFilter)
292                                                _ATLTRY
293                                                {
294                                                        CComHeapPtr<OLECHAR> pszFileName;
295                                                        CMediaType pMediaType;
296                                                        pMediaType.Allocate(MEDIATYPE_NULL, MEDIASUBTYPE_NULL);
297                                                        const HRESULT nGetCurFileResult = pFileSinkFilter->GetCurFile(&pszFileName, pMediaType);
298                                                        _Z45_DSHRESULT(nGetCurFileResult);
299                                                        if(SUCCEEDED(nGetCurFileResult))
300                                                                sText += AtlFormatString(_T(" * ") _T("File Sink: %s") _T("\r\n"), I(pszFileName));
301                                                }
302                                                _ATLCATCHALL()
303                                                {
304                                                        _Z_EXCEPTION();
305                                                }
306                                        #pragma endregion
307                                        #pragma region IAMCrossbar
308                                        const CComQIPtr<IAMCrossbar> pAmCrossbar = pBaseFilter;
309                                        if(pAmCrossbar)
310                                                _ATLTRY
311                                                {
312                                                        sText += AtlFormatString(_T(" * ") _T("Crossbar:") _T("\r\n"));
313                                                        LONG nOutputPinCount = 0, nInputPinCount = 0;
314                                                        __C(pAmCrossbar->get_PinCounts(&nOutputPinCount, &nInputPinCount));
315                                                        sText += AtlFormatString(_T("  * ") _T("Pins: %s Input, %s Output") _T("\r\n"), I(nInputPinCount), I(nOutputPinCount));
316                                                        #pragma region Input
317                                                        for(LONG nInputPinIndex = 0; nInputPinIndex < nInputPinCount; nInputPinIndex++)
318                                                                _ATLTRY
319                                                                {
320                                                                        CRoArrayT<CString> Array;
321                                                                        LONG nRelatedPinIndex = -1;
322                                                                        LONG nPhysicalType = 0; // PhysicalConnectorType
323                                                                        __C(pAmCrossbar->get_CrossbarPinInfo(TRUE, nInputPinIndex, &nRelatedPinIndex, &nPhysicalType));
324                                                                        if(nRelatedPinIndex >= 0)
325                                                                                Array.Add(AtlFormatString(_T("Related %s"), I(nRelatedPinIndex)));
326                                                                        Array.Add(AtlFormatString(_T("Physical Type %s"), I(FormatPhysicalConnectorType((PhysicalConnectorType) nPhysicalType))));
327                                                                        sText += AtlFormatString(_T("  * ") _T("Input Pin %s: %s") _T("\r\n"), I(nInputPinIndex), _StringHelper::Join(Array, _T("; ")));
328                                                                }
329                                                                _ATLCATCHALL()
330                                                                {
331                                                                        _Z_EXCEPTION();
332                                                                }
333                                                        #pragma endregion
334                                                        #pragma region Output
335                                                        for(LONG nOutputPinIndex = 0; nOutputPinIndex < nOutputPinCount; nOutputPinIndex++)
336                                                                _ATLTRY
337                                                                {
338                                                                        CRoArrayT<CString> Array;
339                                                                        LONG nRelatedPinIndex = -1;
340                                                                        LONG nPhysicalType = 0; // PhysicalConnectorType
341                                                                        __C(pAmCrossbar->get_CrossbarPinInfo(FALSE, nOutputPinIndex, &nRelatedPinIndex, &nPhysicalType));
342                                                                        if(nRelatedPinIndex >= 0)
343                                                                                Array.Add(AtlFormatString(_T("Related %s"), I(nRelatedPinIndex)));
344                                                                        if(nPhysicalType > 0)
345                                                                                Array.Add(AtlFormatString(_T("Physical Type %s"), I(FormatPhysicalConnectorType((PhysicalConnectorType) nPhysicalType))));
346                                                                        LONG nRoutedInputPinIndex = -1;
347                                                                        const HRESULT nGetIsRoutedToResult = pAmCrossbar->get_IsRoutedTo(nOutputPinIndex, &nRoutedInputPinIndex);
348                                                                        _A(nGetIsRoutedToResult == S_OK || nRoutedInputPinIndex == -1);
349                                                                        if(nRoutedInputPinIndex >= 0)
350                                                                                Array.Add(AtlFormatString(_T("Routed to Input Pin %s"), I(nRoutedInputPinIndex)));
351                                                                        CRoArrayT<CString> PinArray;
352                                                                        for(LONG nInputPinIndex = 0; nInputPinIndex < nInputPinCount; nInputPinIndex++)
353                                                                        {
354                                                                                const HRESULT nCanRouteResult = pAmCrossbar->CanRoute(nOutputPinIndex, nInputPinIndex);
355                                                                                if(nCanRouteResult == S_OK)
356                                                                                        PinArray.Add(I(nInputPinIndex));
357                                                                        }
358                                                                        if(!PinArray.IsEmpty())
359                                                                                Array.Add(AtlFormatString(_T("Routeable to Input Pins %s"), _StringHelper::Join(PinArray, _T(", "))));
360                                                                        sText += AtlFormatString(_T("  * ") _T("Output Pin %s: %s") _T("\r\n"), I(nOutputPinIndex), _StringHelper::Join(Array, _T("; ")));
361                                                                }
362                                                                _ATLCATCHALL()
363                                                                {
364                                                                        _Z_EXCEPTION();
365                                                                }
366                                                        #pragma endregion
367                                                }
368                                                _ATLCATCHALL()
369                                                {
370                                                        _Z_EXCEPTION();
371                                                }
372                                        #pragma endregion
373                                }
374                                _ATLCATCHALL()
375                                {
376                                        _Z_EXCEPTION();
377                                }
378                        sText += _T("\r\n");
379                        #pragma region Connection
380                        sText += AtlFormatString(_T("## ") _T("Connections") _T("\r\n") _T("\r\n"));
381                        INT nConnectionIndex = 0;
382                        for(SIZE_T nFilterIndex = 0; nFilterIndex < FilterArray.GetCount(); nFilterIndex++)
383                        {
384                                const CComPtr<IBaseFilter>& pBaseFilter = FilterArray[nFilterIndex];
385                                _FilterGraphHelper::CPinArray PinArray;
386                                _FilterGraphHelper::GetFilterPins(pBaseFilter, PINDIR_OUTPUT, PinArray);
387                                for(SIZE_T nPinIndex  = 0; nPinIndex < PinArray.GetCount(); nPinIndex++)
388                                {
389                                        const CComPtr<IPin>& pOutputPin = PinArray[nPinIndex];
390                                        const CComPtr<IPin> pInputPin = _FilterGraphHelper::GetPeerPin(pOutputPin);
391                                        if(!pInputPin)
392                                                continue;
393                                        CString sConnectionText = AtlFormatString(_T("%s - %s"), I(_FilterGraphHelper::GetPinFullName(pOutputPin)), I(_FilterGraphHelper::GetPinFullName(pInputPin)));
394                                        _ATLTRY
395                                        {
396                                                const CMediaType pMediaType = _FilterGraphHelper::GetPinMediaType(pOutputPin);
397                                                if(pMediaType)
398                                                {
399                                                        CStringW sMajorType = _FilterGraphHelper::FormatMajorType(pMediaType->majortype);
400                                                        CStringW sSubtype;
401                                                        if(pMediaType->subtype != MEDIASUBTYPE_NULL)
402                                                                sSubtype = _FilterGraphHelper::FormatSubtype(pMediaType->majortype, pMediaType->subtype);
403                                                        CRoArrayT<CString> Array;
404                                                        Array.Add(I(sMajorType));
405                                                        Array.Add(I(sSubtype));
406                                                        #pragma region MEDIATYPE_Video
407                                                        if(pMediaType->majortype == MEDIATYPE_Video)
408                                                        {
409                                                                const CVideoInfoHeader2 VideoInfoHeader2 = pMediaType.GetCompatibleVideoInfoHeader2();
410                                                                const CSize Extent = VideoInfoHeader2.GetExtent();
411                                                                if(Extent.cx || Extent.cy)
412                                                                        Array.Add(AtlFormatString(_T("%s x %s"), I(Extent.cx), I(Extent.cy)));
413                                                        } else
414                                                        #pragma endregion
415                                                        #pragma region MEDIATYPE_Audio
416                                                        if(pMediaType->majortype == MEDIATYPE_Audio)
417                                                        {
418                                                                const CWaveFormatEx* pWaveFormatEx = pMediaType.GetWaveFormatEx();
419                                                                if(pWaveFormatEx)
420                                                                {
421                                                                        if(pWaveFormatEx->nSamplesPerSec)
422                                                                                Array.Add(AtlFormatString(_T("%s Hz"), I(pWaveFormatEx->nSamplesPerSec)));
423                                                                        if(pWaveFormatEx->nChannels)
424                                                                                Array.Add(AtlFormatString(_T("%s channels"), I(pWaveFormatEx->nChannels)));
425                                                                        if(pWaveFormatEx->wBitsPerSample)
426                                                                                Array.Add(AtlFormatString(_T("%s bits"), I(pWaveFormatEx->wBitsPerSample)));
427                                                                }
428                                                        }
429                                                        #pragma endregion
430                                                        sConnectionText += AtlFormatString(_T(" (%s)"), _StringHelper::Join(Array, _T(", ")));
431                                                }
432                                        }
433                                        _ATLCATCHALL()
434                                        {
435                                                _Z_EXCEPTION();
436                                        }
437                                        sText += AtlFormatString(_T("%d. ") _T("%s") _T("\r\n"), ++nConnectionIndex, sConnectionText);
438                                }
439                        }
440                        sText += _T("\r\n");
441                        #pragma endregion
442                        #pragma region Media Type
443                        sText += AtlFormatString(_T("## ") _T("Media Types") _T("\r\n") _T("\r\n"));
444                        INT nGlobalPinIndex = 0;
445                        CRoListT<CComPtr<IPin>> PinList;
446                        for(SIZE_T nFilterIndex = 0; nFilterIndex < FilterArray.GetCount(); nFilterIndex++)
447                        {
448                                const CComPtr<IBaseFilter>& pBaseFilter = FilterArray[nFilterIndex];
449                                _FilterGraphHelper::CPinArray PinArray;
450                                _FilterGraphHelper::GetFilterPins(pBaseFilter, PinArray);
451                                for(SIZE_T nPinIndex  = 0; nPinIndex < PinArray.GetCount(); nPinIndex++)
452                                {
453                                        const CComPtr<IPin>& pPin = PinArray[nPinIndex];
454                                        if(PinList.FindFirst(pPin))
455                                                continue;
456                                        PinList.AddTail(pPin);
457                                        CString sPinText = AtlFormatString(_T("%s"), I(_FilterGraphHelper::GetPinFullName(pPin)));
458                                        const CComPtr<IPin> pPeerPin = _FilterGraphHelper::GetPeerPin(pPin);
459                                        if(pPeerPin)
460                                        {
461                                                PinList.AddTail(pPeerPin);
462                                                sPinText += AtlFormatString(_T(", %s"), I(_FilterGraphHelper::GetPinFullName(pPeerPin)));
463                                        }
464                                        sText += AtlFormatString(_T("%d. ") _T("%s") _T("\r\n"), ++nGlobalPinIndex, sPinText);
465                                        _ATLTRY
466                                        {
467                                                CMediaType pMediaType;
468                                                if(pPeerPin)
469                                                        pMediaType = _FilterGraphHelper::GetPinMediaType(pPin);
470                                                else
471                                                        pMediaType = _FilterGraphHelper::EnumerateFirstPinMediaType(pPin);
472                                                if(!pMediaType)
473                                                        continue;
474                                                #pragma region AM_MEDIA_TYPE
475                                                #define J(x) I(pMediaType->x)
476                                                #define K1(x) sText += AtlFormatString(_T(" * `") _T(#x) _T("`: %s") _T("\r\n"), J(x))
477                                                sText += AtlFormatString(_T(" * ") _T("Data: %s") _T("\r\n"), I(AtlFormatData((const BYTE*) (const AM_MEDIA_TYPE*) pMediaType, sizeof *pMediaType).TrimRight()));
478                                                sText += AtlFormatString(_T(" * ") _T("`majortype`: %s") _T("\r\n"), I(_FilterGraphHelper::FormatMajorType(pMediaType->majortype)));
479                                                if(pMediaType->subtype != MEDIASUBTYPE_NULL)
480                                                        sText += AtlFormatString(_T(" * ") _T("`subtype`: %s") _T("\r\n"), I(_FilterGraphHelper::FormatSubtype(pMediaType->majortype, pMediaType->subtype)));
481                                                K1(bFixedSizeSamples);
482                                                K1(bTemporalCompression);
483                                                K1(lSampleSize);
484                                                if(pMediaType->formattype != GUID_NULL)
485                                                        sText += AtlFormatString(_T(" * ") _T("`formattype`: %s") _T("\r\n"), I(_FilterGraphHelper::FormatFormatType(pMediaType->formattype)));
486                                                if(pMediaType->pUnk)
487                                                        sText += AtlFormatString(_T(" * ") _T("`pUnk`: %s") _T("\r\n"), I(AtlFormatString(_T("0x%p"), pMediaType->pUnk)));
488                                                if(pMediaType->cbFormat)
489                                                {
490                                                        K1(cbFormat);
491                                                        if(pMediaType->pbFormat)
492                                                                sText += AtlFormatString(_T(" * ") _T("Format Data, `pbFormat`: %s") _T("\r\n"), I(AtlFormatData(pMediaType->pbFormat, pMediaType->cbFormat).TrimRight()));
493                                                }
494                                                #undef J
495                                                #undef K1
496                                                #pragma endregion
497                                                const BYTE* pnExtraData = NULL;
498                                                SIZE_T nExtraDataSize = 0;
499                                                #pragma region FORMAT_VideoInfo
500                                                if(pMediaType->formattype == FORMAT_VideoInfo)
501                                                {
502                                                        sText += AtlFormatString(_T(" * ") _T("As `VIDEOINFOHEADER`:") _T("\r\n"));
503                                                        const VIDEOINFOHEADER* pVideoInfoHeader = (const VIDEOINFOHEADER*) pMediaType->pbFormat;
504                                                        #define J(x) I(pVideoInfoHeader->x)
505                                                        #define K1(x) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), J(x))
506                                                        sText += AtlFormatString(_T("  * ") _T("`rcSource`: (%s, %s) - (%s, %s)") _T("\r\n"), J(rcSource.left), J(rcSource.top), J(rcSource.right), J(rcSource.bottom));
507                                                        sText += AtlFormatString(_T("  * ") _T("`rcTarget`: (%s, %s) - (%s, %s)") _T("\r\n"), J(rcTarget.left), J(rcTarget.top), J(rcTarget.right), J(rcTarget.bottom));
508                                                        K1(dwBitRate);
509                                                        K1(dwBitErrorRate);
510                                                        sText += AtlFormatString(_T("  * ") _T("`AvgTimePerFrame`: %s units") _T("\r\n"), I(_FilterGraphHelper::FormatReferenceTime(pVideoInfoHeader->AvgTimePerFrame)));
511                                                        K1(bmiHeader.biSize);
512                                                        K1(bmiHeader.biWidth);
513                                                        K1(bmiHeader.biHeight);
514                                                        K1(bmiHeader.biPlanes);
515                                                        K1(bmiHeader.biBitCount);
516                                                        sText += AtlFormatString(_T("  * ") _T("`bmiHeader.biCompression`: %s") _T("\r\n"), I(_FilterGraphHelper::GetFourccCodeString(pVideoInfoHeader->bmiHeader.biCompression)));
517                                                        K1(bmiHeader.biSizeImage);
518                                                        K1(bmiHeader.biXPelsPerMeter);
519                                                        K1(bmiHeader.biYPelsPerMeter);
520                                                        K1(bmiHeader.biClrUsed);
521                                                        K1(bmiHeader.biClrImportant);
522                                                        #undef J
523                                                        #undef K1
524                                                        nExtraDataSize = pMediaType->cbFormat - sizeof *pVideoInfoHeader;
525                                                } else
526                                                #pragma endregion
527                                                #pragma region FORMAT_VideoInfo2
528                                                if(pMediaType->formattype == FORMAT_VideoInfo2)
529                                                {
530                                                        sText += AtlFormatString(_T(" * ") _T("As `VIDEOINFOHEADER2`:") _T("\r\n"));
531                                                        const VIDEOINFOHEADER2* pVideoInfoHeader2 = (const VIDEOINFOHEADER2*) pMediaType->pbFormat;
532                                                        #define J(x) I(pVideoInfoHeader2->x)
533                                                        #define K1(x) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), J(x))
534                                                        #define K2(x, y) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), I(pVideoInfoHeader2->x, y))
535                                                        sText += AtlFormatString(_T("  * ") _T("rcSource: (%s, %s) - (%s, %s)") _T("\r\n"), J(rcSource.left), J(rcSource.top), J(rcSource.right), J(rcSource.bottom));
536                                                        sText += AtlFormatString(_T("  * ") _T("rcTarget: (%s, %s) - (%s, %s)") _T("\r\n"), J(rcTarget.left), J(rcTarget.top), J(rcTarget.right), J(rcTarget.bottom));
537                                                        K1(dwBitRate);
538                                                        K1(dwBitErrorRate);
539                                                        sText += AtlFormatString(_T("  * ") _T("`AvgTimePerFrame`: %s units") _T("\r\n"), I(_FilterGraphHelper::FormatReferenceTime(pVideoInfoHeader2->AvgTimePerFrame)));
540                                                        K2(dwInterlaceFlags, _T("0x%X"));
541                                                        K2(dwCopyProtectFlags, _T("0x%X"));
542                                                        K1(dwPictAspectRatioX);
543                                                        K1(dwPictAspectRatioY);
544                                                        K2(dwControlFlags, _T("0x%X"));
545                                                        K1(bmiHeader.biSize);
546                                                        K1(bmiHeader.biWidth);
547                                                        K1(bmiHeader.biHeight);
548                                                        K1(bmiHeader.biPlanes);
549                                                        K1(bmiHeader.biBitCount);
550                                                        sText += AtlFormatString(_T("  * ") _T("`bmiHeader.biCompression`: %s") _T("\r\n"), I(_FilterGraphHelper::GetFourccCodeString(pVideoInfoHeader2->bmiHeader.biCompression)));
551                                                        K1(bmiHeader.biSizeImage);
552                                                        K1(bmiHeader.biXPelsPerMeter);
553                                                        K1(bmiHeader.biYPelsPerMeter);
554                                                        K1(bmiHeader.biClrUsed);
555                                                        K1(bmiHeader.biClrImportant);
556                                                        #undef J
557                                                        #undef K1
558                                                        #undef K2
559                                                        nExtraDataSize = pMediaType->cbFormat - sizeof *pVideoInfoHeader2;
560                                                        if(nExtraDataSize)
561                                                        {
562                                                                sText += AtlFormatString(_T("  * ") _T("Extra Data: (%d bytes)") _T("\r\n"), nExtraDataSize);
563                                                                nExtraDataSize = 0;
564                                                        }
565                                                } else
566                                                #pragma endregion
567                                                #pragma region FORMAT_MPEG2Video
568                                                if(pMediaType->formattype == FORMAT_MPEG2Video)
569                                                {
570                                                        sText += AtlFormatString(_T(" * ") _T("As `MPEG2VIDEOINFO`:") _T("\r\n"));
571                                                        const MPEG2VIDEOINFO* pMpeg2VideoInfo = (const MPEG2VIDEOINFO*) pMediaType->pbFormat;
572                                                        #define J(x) I(pMpeg2VideoInfo->x)
573                                                        #define K1(x) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), J(x))
574                                                        #define K2(x, y) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), I(pMpeg2VideoInfo->x, y))
575                                                        sText += AtlFormatString(_T("  * ") _T("`hdr.rcSource`: (%s, %s) - (%s, %s)") _T("\r\n"), J(hdr.rcSource.left), J(hdr.rcSource.top), J(hdr.rcSource.right), J(hdr.rcSource.bottom));
576                                                        sText += AtlFormatString(_T("  * ") _T("`hdr.rcTarget`: (%s, %s) - (%s, %s)") _T("\r\n"), J(hdr.rcTarget.left), J(hdr.rcTarget.top), J(hdr.rcTarget.right), J(hdr.rcTarget.bottom));
577                                                        K1(hdr.dwBitRate);
578                                                        K1(hdr.dwBitErrorRate);
579                                                        sText += AtlFormatString(_T("  * ") _T("`hdr.AvgTimePerFrame`: %s") _T("\r\n"), I(_FilterGraphHelper::FormatReferenceTime(pMpeg2VideoInfo->hdr.AvgTimePerFrame)));
580                                                        K2(hdr.dwInterlaceFlags, _T("0x%X"));
581                                                        K2(hdr.dwCopyProtectFlags, _T("0x%X"));
582                                                        K1(hdr.dwPictAspectRatioX);
583                                                        K1(hdr.dwPictAspectRatioY);
584                                                        K2(hdr.dwControlFlags, _T("0x%X"));
585                                                        K1(hdr.bmiHeader.biSize);
586                                                        K1(hdr.bmiHeader.biWidth);
587                                                        K1(hdr.bmiHeader.biHeight);
588                                                        K1(hdr.bmiHeader.biPlanes);
589                                                        K1(hdr.bmiHeader.biBitCount);
590                                                        sText += AtlFormatString(_T("  * ") _T("`hdr.bmiHeader.biCompression`: %s") _T("\r\n"), I(_FilterGraphHelper::GetFourccCodeString(pMpeg2VideoInfo->hdr.bmiHeader.biCompression)));
591                                                        K1(hdr.bmiHeader.biSizeImage);
592                                                        K1(hdr.bmiHeader.biXPelsPerMeter);
593                                                        K1(hdr.bmiHeader.biYPelsPerMeter);
594                                                        K1(hdr.bmiHeader.biClrUsed);
595                                                        K1(hdr.bmiHeader.biClrImportant);
596                                                        K2(dwStartTimeCode, _T("0x%08X"));
597                                                        K1(cbSequenceHeader);
598                                                        K1(dwProfile);
599                                                        K1(dwLevel);
600                                                        K2(dwFlags, _T("0x%08X"));
601                                                        #undef J
602                                                        #undef K1
603                                                        #undef K2
604                                                        #undef J
605                                                        nExtraDataSize = pMediaType->cbFormat - (sizeof *pMpeg2VideoInfo - sizeof pMpeg2VideoInfo->dwSequenceHeader);
606                                                } else
607                                                #pragma endregion
608                                                #pragma region FORMAT_WaveFormatEx
609                                                if(pMediaType->formattype == FORMAT_WaveFormatEx)
610                                                {
611                                                        const WAVEFORMATEX* pWaveFormatEx = (const WAVEFORMATEX*) pMediaType->pbFormat;
612                                                        if(pWaveFormatEx->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
613                                                        {
614                                                                const WAVEFORMATEXTENSIBLE* pWaveFormatExtensible = (const WAVEFORMATEXTENSIBLE*) pMediaType->pbFormat;
615                                                                #define J(x) I(pWaveFormatExtensible->x)
616                                                                #define K1(x) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), J(x))
617                                                                #define K2(x, y) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), I(pWaveFormatExtensible->x, y))
618                                                                sText += AtlFormatString(_T(" * ") _T("As `WAVEFORMATEXTENSIBLE`:") _T("\r\n"));
619                                                                K2(Format.wFormatTag, _T("0x%02X"));
620                                                                K1(Format.nChannels);
621                                                                K1(Format.nSamplesPerSec);
622                                                                K1(Format.nAvgBytesPerSec);
623                                                                K1(Format.nBlockAlign);
624                                                                K1(Format.wBitsPerSample);
625                                                                K1(Format.cbSize);
626                                                                K1(Samples.wValidBitsPerSample);
627                                                                K2(dwChannelMask, _T("0x%02X"));
628                                                                sText += AtlFormatString(_T("  * ") _T("`SubFormat`: %s") _T("\r\n"), I(_PersistHelper::StringFromIdentifier(pWaveFormatExtensible->SubFormat)));
629                                                                #undef J
630                                                                #undef K1
631                                                                #undef K2
632                                                                nExtraDataSize = pWaveFormatEx->cbSize - (sizeof *pWaveFormatExtensible - sizeof *pWaveFormatEx);
633                                                        } else
634                                                        {
635                                                                #define J(x) I(pWaveFormatEx->x)
636                                                                #define K1(x) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), J(x))
637                                                                #define K2(x, y) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), I(pWaveFormatEx->x, y))
638                                                                K2(wFormatTag, _T("0x%02X"));
639                                                                K1(nChannels);
640                                                                K1(nSamplesPerSec);
641                                                                K1(nAvgBytesPerSec);
642                                                                K1(nBlockAlign);
643                                                                K1(wBitsPerSample);
644                                                                K1(cbSize);
645                                                                #undef J
646                                                                #undef K1
647                                                                #undef K2
648                                                                nExtraDataSize = pWaveFormatEx->cbSize;
649                                                        }
650                                                }
651                                                #pragma endregion
652                                                #pragma region Extra Data
653                                                if(nExtraDataSize)
654                                                {
655                                                        if(!pnExtraData)
656                                                                pnExtraData = pMediaType->pbFormat + pMediaType->cbFormat - nExtraDataSize;
657                                                        sText += AtlFormatString(_T("  * ") _T("Extra Data: %s") _T("\r\n"), I(AtlFormatData(pnExtraData, nExtraDataSize).TrimRight()));
658                                                }
659                                                #pragma endregion
660                                        }
661                                        _ATLCATCHALL()
662                                        {
663                                                _Z_EXCEPTION();
664                                        }
665                                }
666                        }
667                        sText += _T("\r\n");
668                        #pragma endregion
669                }
670                #pragma endregion
671                return sText;
672        }
673        #undef I
674
675// IFilterGraphHelper
676        STDMETHOD(get_FilterGraph)(IUnknown** ppFilterGraphUnknown) throw()
677        {
678                _Z4(atlTraceCOM, 4, _T("...\n"));
679                _ATLTRY
680                {
681                        __D(ppFilterGraphUnknown, E_POINTER);
682                        CRoCriticalSectionLock DataLock(m_DataCriticalSection);
683                        *ppFilterGraphUnknown = CComPtr<IUnknown>(m_pFilterGraph).Detach();
684                }
685                _ATLCATCH(Exception)
686                {
687                        _C(Exception);
688                }
689                return S_OK;
690        }
691        STDMETHOD(put_FilterGraph)(IUnknown* pFilterGraphUnknown) throw()
692        {
693                _Z4(atlTraceCOM, 4, _T("pFilterGraphUnknown 0x%p\n"), pFilterGraphUnknown);
694                _ATLTRY
695                {
696                        const CComQIPtr<IFilterGraph> pFilterGraph = pFilterGraphUnknown;
697                        __D(!pFilterGraphUnknown || pFilterGraph, E_INVALIDARG);
698                        CRoCriticalSectionLock DataLock(m_DataCriticalSection);
699                        m_pFilterGraph = pFilterGraph;
700                }
701                _ATLCATCH(Exception)
702                {
703                        _C(Exception);
704                }
705                return S_OK;
706        }
707        STDMETHOD(get_Text)(BSTR* psText) throw()
708        {
709                _Z4(atlTraceCOM, 4, _T("...\n"));
710                _ATLTRY
711                {
712                        __D(psText, E_POINTER);
713                        CRoCriticalSectionLock DataLock(m_DataCriticalSection);
714                        *psText = CComBSTR(GetText(m_pFilterGraph)).Detach();
715                }
716                _ATLCATCH(Exception)
717                {
718                        _C(Exception);
719                }
720                return S_OK;
721        }
722};
723
724OBJECT_ENTRY_AUTO(__uuidof(FilterGraphHelper), CFilterGraphHelper)
Note: See TracBrowser for help on using the repository browser.