source: trunk/DirectShowSpy/FilterGraphHelper.h @ 202

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

Put available and selected clocks onto text

File size: 24.3 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 FormatPins(_FilterGraphHelper::CPinArray& PinArray)
124        {
125                CRoArrayT<CString> Array;
126                for(SIZE_T nIndex  = 0; nIndex < PinArray.GetCount(); nIndex++)
127                {
128                        const CComPtr<IPin>& pPin = PinArray[nIndex];
129                        CString sText = I(_FilterGraphHelper::GetPinName(pPin));
130                        const CComPtr<IPin> pPeerPin = _FilterGraphHelper::GetPeerPin(pPin);
131                        if(pPeerPin)
132                                sText += AtlFormatString(_T(" (%s)"), I(_FilterGraphHelper::GetPinFullName(pPeerPin)));
133                        Array.Add(sText);
134                }
135                return _StringHelper::Join(Array, _T(", "));
136        }
137        static CString GetText(IFilterGraph* pFilterGraph, const CProcessData* pProcessData = NULL)
138        {
139                if(!pFilterGraph)
140                        return (LPCTSTR) NULL;
141                CString sText;
142                sText += AtlFormatString(_T("# ") _T("Filter Graph") _T("\r\n") _T("\r\n"));
143                #pragma region Graph Parameters
144                if(pProcessData)
145                        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)));
146                #pragma region IMediaControl
147                const CComQIPtr<IMediaControl> pMediaControl = pFilterGraph;
148                if(pMediaControl)
149                        _ATLTRY
150                        {
151                                OAFilterState State;
152                                const HRESULT nGetStateResult = pMediaControl->GetState(0, &State);
153                                _Z45_DSHRESULT(nGetStateResult);
154                                static const LPCTSTR g_ppszStates[] = { _T("Stopped"), _T("Paused"), _T("Running"), };
155                                if(SUCCEEDED(nGetStateResult) && (SIZE_T) State < DIM(g_ppszStates))
156                                        sText += AtlFormatString(_T("* ") _T("State: %s") _T("\r\n"), I(g_ppszStates[(SIZE_T) State]));
157                        }
158                        _ATLCATCHALL()
159                        {
160                                _Z_EXCEPTION();
161                        }
162                #pragma endregion
163                #pragma region IMediaPosition
164                const CComQIPtr<IMediaPosition> pMediaPosition = pFilterGraph;
165                if(pMediaPosition)
166                        _ATLTRY
167                        {
168                                DOUBLE fDuration = 0, fPosition = 0;
169                                const HRESULT nGetDurationResult = pMediaPosition->get_Duration(&fDuration);
170                                _Z45_DSHRESULT(nGetDurationResult);
171                                if(fDuration > 0)
172                                {
173                                        sText += AtlFormatString(_T("* ") _T("Duration: %s (%s seconds)") _T("\r\n"), I(_FilterGraphHelper::FormatSecondTime(fDuration)), I(_StringHelper::FormatNumber(fDuration, 3)));
174                                        const HRESULT nCurrentPositionResult = pMediaPosition->get_CurrentPosition(&fPosition);
175                                        _Z45_DSHRESULT(nCurrentPositionResult);
176                                        if(SUCCEEDED(nCurrentPositionResult))
177                                                sText += AtlFormatString(_T("* ") _T("Position: %s (%s seconds)") _T("\r\n"), I(_FilterGraphHelper::FormatSecondTime(fPosition)), I(_StringHelper::FormatNumber(fPosition, 3)));
178                                }
179                        }
180                        _ATLCATCHALL()
181                        {
182                                _Z_EXCEPTION();
183                        }
184                #pragma endregion
185                if(pProcessData)
186                {
187                        if(!pProcessData->m_sDisplayName.IsEmpty())
188                                sText += AtlFormatString(_T("* ") _T("Display Name: %s") _T("\r\n"), I(pProcessData->m_sDisplayName));
189                        const CString sDirectory = (LPCTSTR) GetPathDirectory(pProcessData->m_sImagePath);
190                        if(!sDirectory.IsEmpty())
191                                sText += AtlFormatString(_T("* ") _T("Process Directory: %s") _T("\r\n"), I(sDirectory));
192                }
193                const CComQIPtr<IMediaFilter> pMediaFilter = pFilterGraph;
194                CComPtr<IReferenceClock> pFilterGraphReferenceClock;
195                const HRESULT nGetSyncSourceResult = pMediaFilter->GetSyncSource(&pFilterGraphReferenceClock);
196                _Z45_DSHRESULT(nGetSyncSourceResult);
197                sText += _T("\r\n");
198                #pragma endregion
199                #pragma region Filter
200                _FilterGraphHelper::CFilterArray FilterArray;
201                _FilterGraphHelper::GetGraphFilters(pFilterGraph, FilterArray);
202                if(!FilterArray.IsEmpty())
203                {
204                        sText += AtlFormatString(_T("## ") _T("Filters") _T("\r\n") _T("\r\n"));
205                        for(SIZE_T nIndex = 0; nIndex < FilterArray.GetCount(); nIndex++)
206                                _ATLTRY
207                                {
208                                        const CComPtr<IBaseFilter>& pBaseFilter = FilterArray[nIndex];
209                                        sText += AtlFormatString(_T("%d. ") _T("%ls") _T("\r\n"), nIndex + 1, _FilterGraphHelper::GetFilterName(pBaseFilter));
210                                        const CStringW sClassIdentifierString = _FilterGraphHelper::GetFilterClassIdentifierString(pBaseFilter);
211                                        if(!sClassIdentifierString.IsEmpty())
212                                                sText += AtlFormatString(_T(" * ") _T("Class: %s %s") _T("\r\n"), I(sClassIdentifierString), I(_FilterGraphHelper::GetFilterClassDescription(pBaseFilter)));
213                                        _FilterGraphHelper::CPinArray InputPinArray;
214                                        if(_FilterGraphHelper::GetFilterPins(pBaseFilter, PINDIR_INPUT, InputPinArray))
215                                                sText += AtlFormatString(_T(" * ") _T("Input Pins: %s") _T("\r\n"), FormatPins(InputPinArray));
216                                        _FilterGraphHelper::CPinArray OutputPinArray;
217                                        if(_FilterGraphHelper::GetFilterPins(pBaseFilter, PINDIR_OUTPUT, OutputPinArray))
218                                                sText += AtlFormatString(_T(" * ") _T("Output Pins: %s") _T("\r\n"), FormatPins(OutputPinArray));
219                                        #pragma region IReferenceClock
220                                        const CComQIPtr<IReferenceClock> pReferenceClock = pBaseFilter;
221                                        if(pReferenceClock)
222                                        {
223                                                CRoArrayT<CString> Array;
224                                                Array.Add(I(_T("Available")));
225                                                if(pReferenceClock == pFilterGraphReferenceClock)
226                                                        Array.Add(I(_T("Selected")));
227                                                sText += AtlFormatString(_T(" * ") _T("Reference Clock: %s") _T("\r\n"), _StringHelper::Join(Array, _T(", ")));
228                                        }
229                                        #pragma endregion
230                                        #pragma region IFileSourceFilter
231                                        const CComQIPtr<IFileSourceFilter> pFileSourceFilter = pBaseFilter;
232                                        if(pFileSourceFilter)
233                                        {
234                                                CComHeapPtr<OLECHAR> pszFileName;
235                                                CMediaType pMediaType;
236                                                pMediaType.Allocate(MEDIATYPE_NULL, MEDIASUBTYPE_NULL);
237                                                const HRESULT nGetCurFileResult = pFileSourceFilter->GetCurFile(&pszFileName, pMediaType);
238                                                _Z45_DSHRESULT(nGetCurFileResult);
239                                                if(SUCCEEDED(nGetCurFileResult))
240                                                        sText += AtlFormatString(_T(" * ") _T("File Source: %s") _T("\r\n"), I(pszFileName));
241                                        }
242                                        #pragma endregion
243                                        #pragma region IFileSinkFilter
244                                        const CComQIPtr<IFileSinkFilter> pFileSinkFilter = pBaseFilter;
245                                        if(pFileSinkFilter)
246                                        {
247                                                CComHeapPtr<OLECHAR> pszFileName;
248                                                CMediaType pMediaType;
249                                                pMediaType.Allocate(MEDIATYPE_NULL, MEDIASUBTYPE_NULL);
250                                                const HRESULT nGetCurFileResult = pFileSinkFilter->GetCurFile(&pszFileName, pMediaType);
251                                                _Z45_DSHRESULT(nGetCurFileResult);
252                                                if(SUCCEEDED(nGetCurFileResult))
253                                                        sText += AtlFormatString(_T(" * ") _T("File Sink: %s") _T("\r\n"), I(pszFileName));
254                                        }
255                                        #pragma endregion
256                                }
257                                _ATLCATCHALL()
258                                {
259                                        _Z_EXCEPTION();
260                                }
261                        sText += _T("\r\n");
262                        #pragma region Connection
263                        sText += AtlFormatString(_T("## ") _T("Connections") _T("\r\n") _T("\r\n"));
264                        INT nConnectionIndex = 0;
265                        for(SIZE_T nFilterIndex = 0; nFilterIndex < FilterArray.GetCount(); nFilterIndex++)
266                        {
267                                const CComPtr<IBaseFilter>& pBaseFilter = FilterArray[nFilterIndex];
268                                _FilterGraphHelper::CPinArray PinArray;
269                                _FilterGraphHelper::GetFilterPins(pBaseFilter, PINDIR_OUTPUT, PinArray);
270                                for(SIZE_T nPinIndex  = 0; nPinIndex < PinArray.GetCount(); nPinIndex++)
271                                {
272                                        const CComPtr<IPin>& pOutputPin = PinArray[nPinIndex];
273                                        const CComPtr<IPin> pInputPin = _FilterGraphHelper::GetPeerPin(pOutputPin);
274                                        if(!pInputPin)
275                                                continue;
276                                        CString sConnectionText = AtlFormatString(_T("%s - %s"), I(_FilterGraphHelper::GetPinFullName(pOutputPin)), I(_FilterGraphHelper::GetPinFullName(pInputPin)));
277                                        _ATLTRY
278                                        {
279                                                const CMediaType pMediaType = _FilterGraphHelper::GetPinMediaType(pOutputPin);
280                                                if(pMediaType)
281                                                {
282                                                        CStringW sMajorType = _FilterGraphHelper::FormatMajorType(pMediaType->majortype);
283                                                        CStringW sSubtype;
284                                                        if(pMediaType->subtype != MEDIASUBTYPE_NULL)
285                                                                sSubtype = _FilterGraphHelper::FormatSubtype(pMediaType->majortype, pMediaType->subtype);
286                                                        CRoArrayT<CString> Array;
287                                                        Array.Add(I(sMajorType));
288                                                        Array.Add(I(sSubtype));
289                                                        #pragma region MEDIATYPE_Video
290                                                        if(pMediaType->majortype == MEDIATYPE_Video)
291                                                        {
292                                                                const CVideoInfoHeader2 VideoInfoHeader2 = pMediaType.GetCompatibleVideoInfoHeader2();
293                                                                const CSize Extent = VideoInfoHeader2.GetExtent();
294                                                                if(Extent.cx || Extent.cy)
295                                                                        Array.Add(AtlFormatString(_T("%s x %s"), I(Extent.cx), I(Extent.cy)));
296                                                        } else
297                                                        #pragma endregion
298                                                        #pragma region MEDIATYPE_Audio
299                                                        if(pMediaType->majortype == MEDIATYPE_Audio)
300                                                        {
301                                                                const CWaveFormatEx* pWaveFormatEx = pMediaType.GetWaveFormatEx();
302                                                                if(pWaveFormatEx)
303                                                                {
304                                                                        if(pWaveFormatEx->nSamplesPerSec)
305                                                                                Array.Add(AtlFormatString(_T("%s Hz"), I(pWaveFormatEx->nSamplesPerSec)));
306                                                                        if(pWaveFormatEx->nChannels)
307                                                                                Array.Add(AtlFormatString(_T("%s channels"), I(pWaveFormatEx->nChannels)));
308                                                                        if(pWaveFormatEx->wBitsPerSample)
309                                                                                Array.Add(AtlFormatString(_T("%s bits"), I(pWaveFormatEx->wBitsPerSample)));
310                                                                }
311                                                        }
312                                                        #pragma endregion
313                                                        sConnectionText += AtlFormatString(_T(" (%s)"), _StringHelper::Join(Array, _T(", ")));
314                                                }
315                                        }
316                                        _ATLCATCHALL()
317                                        {
318                                                _Z_EXCEPTION();
319                                        }
320                                        sText += AtlFormatString(_T("%d. ") _T("%s") _T("\r\n"), ++nConnectionIndex, sConnectionText);
321                                }
322                        }
323                        sText += _T("\r\n");
324                        #pragma endregion
325                        #pragma region Media Type
326                        sText += AtlFormatString(_T("## ") _T("Media Types") _T("\r\n") _T("\r\n"));
327                        INT nGlobalPinIndex = 0;
328                        CRoListT<CComPtr<IPin>> PinList;
329                        for(SIZE_T nFilterIndex = 0; nFilterIndex < FilterArray.GetCount(); nFilterIndex++)
330                        {
331                                const CComPtr<IBaseFilter>& pBaseFilter = FilterArray[nFilterIndex];
332                                _FilterGraphHelper::CPinArray PinArray;
333                                _FilterGraphHelper::GetFilterPins(pBaseFilter, PinArray);
334                                for(SIZE_T nPinIndex  = 0; nPinIndex < PinArray.GetCount(); nPinIndex++)
335                                {
336                                        const CComPtr<IPin>& pPin = PinArray[nPinIndex];
337                                        if(PinList.FindFirst(pPin))
338                                                continue;
339                                        PinList.AddTail(pPin);
340                                        CString sPinText = AtlFormatString(_T("%s"), I(_FilterGraphHelper::GetPinFullName(pPin)));
341                                        const CComPtr<IPin> pPeerPin = _FilterGraphHelper::GetPeerPin(pPin);
342                                        if(pPeerPin)
343                                        {
344                                                PinList.AddTail(pPeerPin);
345                                                sPinText += AtlFormatString(_T(", %s"), I(_FilterGraphHelper::GetPinFullName(pPeerPin)));
346                                        }
347                                        sText += AtlFormatString(_T("%d. ") _T("%s") _T("\r\n"), ++nGlobalPinIndex, sPinText);
348                                        _ATLTRY
349                                        {
350                                                CMediaType pMediaType;
351                                                if(pPeerPin)
352                                                        pMediaType = _FilterGraphHelper::GetPinMediaType(pPin);
353                                                else
354                                                        pMediaType = _FilterGraphHelper::EnumerateFirstPinMediaType(pPin);
355                                                if(!pMediaType)
356                                                        continue;
357                                                #pragma region AM_MEDIA_TYPE
358                                                #define J(x) I(pMediaType->x)
359                                                #define K1(x) sText += AtlFormatString(_T(" * `") _T(#x) _T("`: %s") _T("\r\n"), J(x))
360                                                sText += AtlFormatString(_T(" * ") _T("Data: %s") _T("\r\n"), I(AtlFormatData((const BYTE*) (const AM_MEDIA_TYPE*) pMediaType, sizeof *pMediaType).TrimRight()));
361                                                sText += AtlFormatString(_T(" * ") _T("`majortype`: %s") _T("\r\n"), I(_FilterGraphHelper::FormatMajorType(pMediaType->majortype)));
362                                                if(pMediaType->subtype != MEDIASUBTYPE_NULL)
363                                                        sText += AtlFormatString(_T(" * ") _T("`subtype`: %s") _T("\r\n"), I(_FilterGraphHelper::FormatSubtype(pMediaType->majortype, pMediaType->subtype)));
364                                                K1(bFixedSizeSamples);
365                                                K1(bTemporalCompression);
366                                                K1(lSampleSize);
367                                                if(pMediaType->formattype != GUID_NULL)
368                                                        sText += AtlFormatString(_T(" * ") _T("`formattype`: %s") _T("\r\n"), I(_FilterGraphHelper::FormatFormatType(pMediaType->formattype)));
369                                                if(pMediaType->pUnk)
370                                                        sText += AtlFormatString(_T(" * ") _T("`pUnk`: %s") _T("\r\n"), I(AtlFormatString(_T("0x%p"), pMediaType->pUnk)));
371                                                if(pMediaType->cbFormat)
372                                                {
373                                                        K1(cbFormat);
374                                                        if(pMediaType->pbFormat)
375                                                                sText += AtlFormatString(_T(" * ") _T("Format Data, `pbFormat`: %s") _T("\r\n"), I(AtlFormatData(pMediaType->pbFormat, pMediaType->cbFormat).TrimRight()));
376                                                }
377                                                #undef J
378                                                #undef K1
379                                                #pragma endregion
380                                                const BYTE* pnExtraData = NULL;
381                                                SIZE_T nExtraDataSize = 0;
382                                                #pragma region FORMAT_VideoInfo
383                                                if(pMediaType->formattype == FORMAT_VideoInfo)
384                                                {
385                                                        sText += AtlFormatString(_T(" * ") _T("As `VIDEOINFOHEADER`:") _T("\r\n"));
386                                                        const VIDEOINFOHEADER* pVideoInfoHeader = (const VIDEOINFOHEADER*) pMediaType->pbFormat;
387                                                        #define J(x) I(pVideoInfoHeader->x)
388                                                        #define K1(x) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), J(x))
389                                                        sText += AtlFormatString(_T("  * ") _T("`rcSource`: (%s, %s) - (%s, %s)") _T("\r\n"), J(rcSource.left), J(rcSource.top), J(rcSource.right), J(rcSource.bottom));
390                                                        sText += AtlFormatString(_T("  * ") _T("`rcTarget`: (%s, %s) - (%s, %s)") _T("\r\n"), J(rcTarget.left), J(rcTarget.top), J(rcTarget.right), J(rcTarget.bottom));
391                                                        K1(dwBitRate);
392                                                        K1(dwBitErrorRate);
393                                                        sText += AtlFormatString(_T("  * ") _T("`AvgTimePerFrame`: %s units") _T("\r\n"), I(_FilterGraphHelper::FormatReferenceTime(pVideoInfoHeader->AvgTimePerFrame)));
394                                                        K1(bmiHeader.biSize);
395                                                        K1(bmiHeader.biWidth);
396                                                        K1(bmiHeader.biHeight);
397                                                        K1(bmiHeader.biPlanes);
398                                                        K1(bmiHeader.biBitCount);
399                                                        sText += AtlFormatString(_T("  * ") _T("`bmiHeader.biCompression`: %s") _T("\r\n"), I(_FilterGraphHelper::GetFourccCodeString(pVideoInfoHeader->bmiHeader.biCompression)));
400                                                        K1(bmiHeader.biSizeImage);
401                                                        K1(bmiHeader.biXPelsPerMeter);
402                                                        K1(bmiHeader.biYPelsPerMeter);
403                                                        K1(bmiHeader.biClrUsed);
404                                                        K1(bmiHeader.biClrImportant);
405                                                        #undef J
406                                                        #undef K1
407                                                        nExtraDataSize = pMediaType->cbFormat - sizeof *pVideoInfoHeader;
408                                                } else
409                                                #pragma endregion
410                                                #pragma region FORMAT_VideoInfo2
411                                                if(pMediaType->formattype == FORMAT_VideoInfo2)
412                                                {
413                                                        sText += AtlFormatString(_T(" * ") _T("As `VIDEOINFOHEADER2`:") _T("\r\n"));
414                                                        const VIDEOINFOHEADER2* pVideoInfoHeader2 = (const VIDEOINFOHEADER2*) pMediaType->pbFormat;
415                                                        #define J(x) I(pVideoInfoHeader2->x)
416                                                        #define K1(x) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), J(x))
417                                                        #define K2(x, y) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), I(pVideoInfoHeader2->x, y))
418                                                        sText += AtlFormatString(_T("  * ") _T("rcSource: (%s, %s) - (%s, %s)") _T("\r\n"), J(rcSource.left), J(rcSource.top), J(rcSource.right), J(rcSource.bottom));
419                                                        sText += AtlFormatString(_T("  * ") _T("rcTarget: (%s, %s) - (%s, %s)") _T("\r\n"), J(rcTarget.left), J(rcTarget.top), J(rcTarget.right), J(rcTarget.bottom));
420                                                        K1(dwBitRate);
421                                                        K1(dwBitErrorRate);
422                                                        sText += AtlFormatString(_T("  * ") _T("`AvgTimePerFrame`: %s units") _T("\r\n"), I(_FilterGraphHelper::FormatReferenceTime(pVideoInfoHeader2->AvgTimePerFrame)));
423                                                        K2(dwInterlaceFlags, _T("0x%X"));
424                                                        K2(dwCopyProtectFlags, _T("0x%X"));
425                                                        K1(dwPictAspectRatioX);
426                                                        K1(dwPictAspectRatioY);
427                                                        K2(dwControlFlags, _T("0x%X"));
428                                                        K1(bmiHeader.biSize);
429                                                        K1(bmiHeader.biWidth);
430                                                        K1(bmiHeader.biHeight);
431                                                        K1(bmiHeader.biPlanes);
432                                                        K1(bmiHeader.biBitCount);
433                                                        sText += AtlFormatString(_T("  * ") _T("`bmiHeader.biCompression`: %s") _T("\r\n"), I(_FilterGraphHelper::GetFourccCodeString(pVideoInfoHeader2->bmiHeader.biCompression)));
434                                                        K1(bmiHeader.biSizeImage);
435                                                        K1(bmiHeader.biXPelsPerMeter);
436                                                        K1(bmiHeader.biYPelsPerMeter);
437                                                        K1(bmiHeader.biClrUsed);
438                                                        K1(bmiHeader.biClrImportant);
439                                                        #undef J
440                                                        #undef K1
441                                                        #undef K2
442                                                        nExtraDataSize = pMediaType->cbFormat - sizeof *pVideoInfoHeader2;
443                                                        if(nExtraDataSize)
444                                                        {
445                                                                sText += AtlFormatString(_T("  * ") _T("Extra Data: (%d bytes)") _T("\r\n"), nExtraDataSize);
446                                                                nExtraDataSize = 0;
447                                                        }
448                                                } else
449                                                #pragma endregion
450                                                #pragma region FORMAT_MPEG2Video
451                                                if(pMediaType->formattype == FORMAT_MPEG2Video)
452                                                {
453                                                        sText += AtlFormatString(_T(" * ") _T("As `MPEG2VIDEOINFO`:") _T("\r\n"));
454                                                        const MPEG2VIDEOINFO* pMpeg2VideoInfo = (const MPEG2VIDEOINFO*) pMediaType->pbFormat;
455                                                        #define J(x) I(pMpeg2VideoInfo->x)
456                                                        #define K1(x) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), J(x))
457                                                        #define K2(x, y) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), I(pMpeg2VideoInfo->x, y))
458                                                        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));
459                                                        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));
460                                                        K1(hdr.dwBitRate);
461                                                        K1(hdr.dwBitErrorRate);
462                                                        sText += AtlFormatString(_T("  * ") _T("`hdr.AvgTimePerFrame`: %s") _T("\r\n"), I(_FilterGraphHelper::FormatReferenceTime(pMpeg2VideoInfo->hdr.AvgTimePerFrame)));
463                                                        K2(hdr.dwInterlaceFlags, _T("0x%X"));
464                                                        K2(hdr.dwCopyProtectFlags, _T("0x%X"));
465                                                        K1(hdr.dwPictAspectRatioX);
466                                                        K1(hdr.dwPictAspectRatioY);
467                                                        K2(hdr.dwControlFlags, _T("0x%X"));
468                                                        K1(hdr.bmiHeader.biSize);
469                                                        K1(hdr.bmiHeader.biWidth);
470                                                        K1(hdr.bmiHeader.biHeight);
471                                                        K1(hdr.bmiHeader.biPlanes);
472                                                        K1(hdr.bmiHeader.biBitCount);
473                                                        sText += AtlFormatString(_T("  * ") _T("`hdr.bmiHeader.biCompression`: %s") _T("\r\n"), I(_FilterGraphHelper::GetFourccCodeString(pMpeg2VideoInfo->hdr.bmiHeader.biCompression)));
474                                                        K1(hdr.bmiHeader.biSizeImage);
475                                                        K1(hdr.bmiHeader.biXPelsPerMeter);
476                                                        K1(hdr.bmiHeader.biYPelsPerMeter);
477                                                        K1(hdr.bmiHeader.biClrUsed);
478                                                        K1(hdr.bmiHeader.biClrImportant);
479                                                        K2(dwStartTimeCode, _T("0x%08X"));
480                                                        K1(cbSequenceHeader);
481                                                        K1(dwProfile);
482                                                        K1(dwLevel);
483                                                        K2(dwFlags, _T("0x%08X"));
484                                                        #undef J
485                                                        #undef K1
486                                                        #undef K2
487                                                        #undef J
488                                                        nExtraDataSize = pMediaType->cbFormat - (sizeof *pMpeg2VideoInfo - sizeof pMpeg2VideoInfo->dwSequenceHeader);
489                                                } else
490                                                #pragma endregion
491                                                #pragma region FORMAT_WaveFormatEx
492                                                if(pMediaType->formattype == FORMAT_WaveFormatEx)
493                                                {
494                                                        const WAVEFORMATEX* pWaveFormatEx = (const WAVEFORMATEX*) pMediaType->pbFormat;
495                                                        if(pWaveFormatEx->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
496                                                        {
497                                                                const WAVEFORMATEXTENSIBLE* pWaveFormatExtensible = (const WAVEFORMATEXTENSIBLE*) pMediaType->pbFormat;
498                                                                #define J(x) I(pWaveFormatExtensible->x)
499                                                                #define K1(x) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), J(x))
500                                                                #define K2(x, y) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), I(pWaveFormatExtensible->x, y))
501                                                                sText += AtlFormatString(_T(" * ") _T("As `WAVEFORMATEXTENSIBLE`:") _T("\r\n"));
502                                                                K2(Format.wFormatTag, _T("0x%02X"));
503                                                                K1(Format.nChannels);
504                                                                K1(Format.nSamplesPerSec);
505                                                                K1(Format.nAvgBytesPerSec);
506                                                                K1(Format.nBlockAlign);
507                                                                K1(Format.wBitsPerSample);
508                                                                K1(Format.cbSize);
509                                                                K1(Samples.wValidBitsPerSample);
510                                                                K2(dwChannelMask, _T("0x%02X"));
511                                                                sText += AtlFormatString(_T("  * ") _T("`SubFormat`: %s") _T("\r\n"), I(_PersistHelper::StringFromIdentifier(pWaveFormatExtensible->SubFormat)));
512                                                                #undef J
513                                                                #undef K1
514                                                                #undef K2
515                                                                nExtraDataSize = pWaveFormatEx->cbSize - (sizeof *pWaveFormatExtensible - sizeof *pWaveFormatEx);
516                                                        } else
517                                                        {
518                                                                #define J(x) I(pWaveFormatEx->x)
519                                                                #define K1(x) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), J(x))
520                                                                #define K2(x, y) sText += AtlFormatString(_T("  * `") _T(#x) _T("`: %s") _T("\r\n"), I(pWaveFormatEx->x, y))
521                                                                K2(wFormatTag, _T("0x%02X"));
522                                                                K1(nChannels);
523                                                                K1(nSamplesPerSec);
524                                                                K1(nAvgBytesPerSec);
525                                                                K1(nBlockAlign);
526                                                                K1(wBitsPerSample);
527                                                                K1(cbSize);
528                                                                #undef J
529                                                                #undef K1
530                                                                #undef K2
531                                                                nExtraDataSize = pWaveFormatEx->cbSize;
532                                                        }
533                                                }
534                                                #pragma endregion
535                                                #pragma region Extra Data
536                                                if(nExtraDataSize)
537                                                {
538                                                        if(!pnExtraData)
539                                                                pnExtraData = pMediaType->pbFormat + pMediaType->cbFormat - nExtraDataSize;
540                                                        sText += AtlFormatString(_T("  * ") _T("Extra Data: %s") _T("\r\n"), I(AtlFormatData(pnExtraData, nExtraDataSize).TrimRight()));
541                                                }
542                                                #pragma endregion
543                                        }
544                                        _ATLCATCHALL()
545                                        {
546                                                _Z_EXCEPTION();
547                                        }
548                                }
549                        }
550                        sText += _T("\r\n");
551                        #pragma endregion
552                }
553                #pragma endregion
554                return sText;
555        }
556        #undef I
557
558// IFilterGraphHelper
559        STDMETHOD(get_FilterGraph)(IUnknown** ppFilterGraphUnknown) throw()
560        {
561                _Z4(atlTraceCOM, 4, _T("...\n"));
562                _ATLTRY
563                {
564                        __D(ppFilterGraphUnknown, E_POINTER);
565                        CRoCriticalSectionLock DataLock(m_DataCriticalSection);
566                        *ppFilterGraphUnknown = CComPtr<IUnknown>(m_pFilterGraph).Detach();
567                }
568                _ATLCATCH(Exception)
569                {
570                        _C(Exception);
571                }
572                return S_OK;
573        }
574        STDMETHOD(put_FilterGraph)(IUnknown* pFilterGraphUnknown) throw()
575        {
576                _Z4(atlTraceCOM, 4, _T("pFilterGraphUnknown 0x%p\n"), pFilterGraphUnknown);
577                _ATLTRY
578                {
579                        const CComQIPtr<IFilterGraph> pFilterGraph = pFilterGraphUnknown;
580                        __D(!pFilterGraphUnknown || pFilterGraph, E_INVALIDARG);
581                        CRoCriticalSectionLock DataLock(m_DataCriticalSection);
582                        m_pFilterGraph = pFilterGraph;
583                }
584                _ATLCATCH(Exception)
585                {
586                        _C(Exception);
587                }
588                return S_OK;
589        }
590        STDMETHOD(get_Text)(BSTR* psText) throw()
591        {
592                _Z4(atlTraceCOM, 4, _T("...\n"));
593                _ATLTRY
594                {
595                        __D(psText, E_POINTER);
596                        CRoCriticalSectionLock DataLock(m_DataCriticalSection);
597                        *psText = CComBSTR(GetText(m_pFilterGraph)).Detach();
598                }
599                _ATLCATCH(Exception)
600                {
601                        _C(Exception);
602                }
603                return S_OK;
604        }
605};
606
607OBJECT_ENTRY_AUTO(__uuidof(FilterGraphHelper), CFilterGraphHelper)
Note: See TracBrowser for help on using the repository browser.