source: trunk/Utilities/MediaFoundation/EnumerateTransforms/Application.cpp @ 445

Last change on this file since 445 was 445, checked in by roman, 7 years ago

Updated VS 2013 project, more named GUIDs, binaries and updated output with Intel MFTs

File size: 17.8 KB
Line 
1////////////////////////////////////////////////////////////
2// Copyright (C) Roman Ryltsov, 2008-2015
3// Created by Roman Ryltsov roman@alax.info
4//
5// A permission to use the source code is granted as long as reference to
6// source website http://alax.info is retained.
7
8#include "stdafx.h"
9#include <mfapi.h>
10#include <mftransform.h>
11#include "rodshow.h"
12
13#pragma comment(lib, "mfplat.lib")
14#pragma comment(lib, "mfuuid.lib")
15
16////////////////////////////////////////////////////////////
17// CModule
18
19class CModule :
20        public CAtlExeModuleT<CModule>
21{
22public:
23        static CString FormatKey(const GUID& Key)
24        {
25                static const struct { const GUID* pIdentifier; LPCSTR pszName; } g_pMap[] = 
26                {
27                        #define A(x) { &x, #x },
28                        // NOTE: 1. Find all "DECLSPEC_SELECTANY GUID" or "DEFINE_GUID"
29                        //       2. Replace ^.+DECLSPEC_SELECTANY GUID ([A-z0-9_]+).+\r?$ -> A($1)
30                        // Windows SDK 8.1; mfapi.h
31                        A(MF_EVENT_SESSIONCAPS)
32                        A(MF_EVENT_SESSIONCAPS_DELTA)
33                        A(MF_EVENT_TOPOLOGY_STATUS)
34                        A(MF_EVENT_START_PRESENTATION_TIME)
35                        A(MF_EVENT_PRESENTATION_TIME_OFFSET)
36                        A(MF_EVENT_START_PRESENTATION_TIME_AT_OUTPUT)
37                        A(MF_EVENT_SOURCE_FAKE_START)
38                        A(MF_EVENT_SOURCE_PROJECTSTART)
39                        A(MF_EVENT_SOURCE_ACTUAL_START)
40                        A(MF_EVENT_SOURCE_TOPOLOGY_CANCELED)
41                        A(MF_EVENT_SOURCE_CHARACTERISTICS)
42                        A(MF_EVENT_SOURCE_CHARACTERISTICS_OLD)
43                        A(MF_EVENT_DO_THINNING)
44                        A(MF_EVENT_SCRUBSAMPLE_TIME)
45                        A(MF_EVENT_OUTPUT_NODE)
46                        A(MF_EVENT_MFT_INPUT_STREAM_ID)
47                        A(MF_EVENT_MFT_CONTEXT)
48                        A(MF_EVENT_STREAM_METADATA_KEYDATA)
49                        A(MF_EVENT_STREAM_METADATA_CONTENT_KEYIDS)
50                        A(MF_EVENT_STREAM_METADATA_SYSTEMID)
51                        A(MFSampleExtension_CleanPoint)
52                        A(MFSampleExtension_Discontinuity)
53                        A(MFSampleExtension_Token)
54                        A(MFSampleExtension_DecodeTimestamp)
55                        A(MFSampleExtension_VideoEncodeQP)
56                        A(MFSampleExtension_VideoEncodePictureType)
57                        A(MFSampleExtension_FrameCorruption)
58                        A(MFSampleExtension_DescrambleData)
59                        A(MFSampleExtension_SampleKeyID)
60                        A(MFSampleExtension_GenKeyFunc)
61                        A(MFSampleExtension_GenKeyCtx)
62                        A(MFSampleExtension_PacketCrossOffsets)
63                        A(MFSampleExtension_Encryption_SampleID)
64                        A(MFSampleExtension_Encryption_KeyID)
65                        A(MFSampleExtension_Content_KeyID)
66                        A(MFSampleExtension_Encryption_SubSampleMappingSplit)
67                        A(MFSampleExtension_Interlaced)
68                        A(MFSampleExtension_BottomFieldFirst)
69                        A(MFSampleExtension_RepeatFirstField)
70                        A(MFSampleExtension_SingleField)
71                        A(MFSampleExtension_DerivedFromTopField)
72                        A(MFSampleExtension_MeanAbsoluteDifference)
73                        A(MFSampleExtension_LongTermReferenceFrameInfo)
74                        A(MFSampleExtension_ROIRectangle)
75                        A(MFSampleExtension_PhotoThumbnail)
76                        A(MFSampleExtension_PhotoThumbnailMediaType)
77                        A(MFSampleExtension_CaptureMetadata)
78                        A(MF_CAPTURE_METADATA_PHOTO_FRAME_FLASH)
79                        A(MFT_CATEGORY_VIDEO_DECODER)
80                        A(MFT_CATEGORY_VIDEO_ENCODER)
81                        A(MFT_CATEGORY_VIDEO_EFFECT)
82                        A(MFT_CATEGORY_MULTIPLEXER)
83                        A(MFT_CATEGORY_DEMULTIPLEXER)
84                        A(MFT_CATEGORY_AUDIO_DECODER)
85                        A(MFT_CATEGORY_AUDIO_ENCODER)
86                        A(MFT_CATEGORY_AUDIO_EFFECT)
87                        A(MFT_CATEGORY_VIDEO_PROCESSOR)
88                        A(MFT_CATEGORY_OTHER)
89                        A(MFT_SUPPORT_DYNAMIC_FORMAT_CHANGE)
90                        A(MFVideoFormat_H264_ES)
91                        A(MFVideoFormat_MPEG2)
92                        A(MFAudioFormat_Dolby_AC3)
93                        A(MFAudioFormat_Dolby_DDPlus)
94                        A(MFMPEG4Format_Base)
95                        A(MF_MT_MAJOR_TYPE)
96                        A(MF_MT_SUBTYPE)
97                        A(MF_MT_ALL_SAMPLES_INDEPENDENT)
98                        A(MF_MT_FIXED_SIZE_SAMPLES)
99                        A(MF_MT_COMPRESSED)
100                        A(MF_MT_SAMPLE_SIZE)
101                        A(MF_MT_WRAPPED_TYPE)
102                        A(MF_MT_VIDEO_3D)
103                        A(MF_MT_VIDEO_3D_FORMAT)
104                        A(MF_MT_VIDEO_3D_NUM_VIEWS)
105                        A(MF_MT_VIDEO_3D_LEFT_IS_BASE)
106                        A(MF_MT_VIDEO_3D_FIRST_IS_LEFT)
107                        A(MFSampleExtension_3DVideo)
108                        A(MFSampleExtension_3DVideo_SampleFormat)
109                        A(MF_MT_VIDEO_ROTATION)
110                        A(MF_MT_AUDIO_NUM_CHANNELS)
111                        A(MF_MT_AUDIO_SAMPLES_PER_SECOND)
112                        A(MF_MT_AUDIO_FLOAT_SAMPLES_PER_SECOND)
113                        A(MF_MT_AUDIO_AVG_BYTES_PER_SECOND)
114                        A(MF_MT_AUDIO_BLOCK_ALIGNMENT)
115                        A(MF_MT_AUDIO_BITS_PER_SAMPLE)
116                        A(MF_MT_AUDIO_VALID_BITS_PER_SAMPLE)
117                        A(MF_MT_AUDIO_SAMPLES_PER_BLOCK)
118                        A(MF_MT_AUDIO_CHANNEL_MASK)
119                        A(MF_MT_AUDIO_FOLDDOWN_MATRIX)
120                        A(MF_MT_AUDIO_WMADRC_PEAKREF)
121                        A(MF_MT_AUDIO_WMADRC_PEAKTARGET)
122                        A(MF_MT_AUDIO_WMADRC_AVGREF)
123                        A(MF_MT_AUDIO_WMADRC_AVGTARGET)
124                        A(MF_MT_AUDIO_PREFER_WAVEFORMATEX)
125                        A(MF_MT_AAC_PAYLOAD_TYPE)
126                        A(MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION)
127                        A(MF_MT_FRAME_SIZE)
128                        A(MF_MT_FRAME_RATE)
129                        A(MF_MT_PIXEL_ASPECT_RATIO)
130                        A(MF_MT_DRM_FLAGS)
131                        A(MF_MT_TIMESTAMP_CAN_BE_DTS)
132                        A(MF_MT_PAD_CONTROL_FLAGS)
133                        A(MF_MT_SOURCE_CONTENT_HINT)
134                        A(MF_MT_VIDEO_CHROMA_SITING)
135                        A(MF_MT_INTERLACE_MODE)
136                        A(MF_MT_TRANSFER_FUNCTION)
137                        A(MF_MT_VIDEO_PRIMARIES)
138                        A(MF_MT_CUSTOM_VIDEO_PRIMARIES)
139                        A(MF_MT_YUV_MATRIX)
140                        A(MF_MT_VIDEO_LIGHTING)
141                        A(MF_MT_VIDEO_NOMINAL_RANGE)
142                        A(MF_MT_GEOMETRIC_APERTURE)
143                        A(MF_MT_MINIMUM_DISPLAY_APERTURE)
144                        A(MF_MT_PAN_SCAN_APERTURE)
145                        A(MF_MT_PAN_SCAN_ENABLED)
146                        A(MF_MT_AVG_BITRATE)
147                        A(MF_MT_AVG_BIT_ERROR_RATE)
148                        A(MF_MT_MAX_KEYFRAME_SPACING)
149                        A(MF_MT_USER_DATA)
150                        A(MF_MT_DEFAULT_STRIDE)
151                        A(MF_MT_PALETTE)
152                        A(MF_MT_AM_FORMAT_TYPE)
153                        A(MF_MT_VIDEO_PROFILE)
154                        A(MF_MT_VIDEO_LEVEL)
155                        A(MF_MT_MPEG_START_TIME_CODE)
156                        A(MF_MT_MPEG2_PROFILE)
157                        A(MF_MT_MPEG2_LEVEL)
158                        A(MF_MT_MPEG2_FLAGS)
159                        A(MF_MT_MPEG_SEQUENCE_HEADER)
160                        A(MF_MT_MPEG2_STANDARD)
161                        A(MF_MT_MPEG2_TIMECODE)
162                        A(MF_MT_MPEG2_CONTENT_PACKET)
163                        A(MF_MT_H264_MAX_CODEC_CONFIG_DELAY)
164                        A(MF_MT_H264_SUPPORTED_SLICE_MODES)
165                        A(MF_MT_H264_SUPPORTED_SYNC_FRAME_TYPES)
166                        A(MF_MT_H264_RESOLUTION_SCALING)
167                        A(MF_MT_H264_SIMULCAST_SUPPORT)
168                        A(MF_MT_H264_SUPPORTED_RATE_CONTROL_MODES)
169                        A(MF_MT_H264_MAX_MB_PER_SEC)
170                        A(MF_MT_H264_SUPPORTED_USAGES)
171                        A(MF_MT_H264_CAPABILITIES)
172                        A(MF_MT_H264_SVC_CAPABILITIES)
173                        A(MF_MT_H264_USAGE)
174                        A(MF_MT_H264_RATE_CONTROL_MODES)
175                        A(MF_MT_H264_LAYOUT_PER_STREAM)
176                        A(MF_MT_DV_AAUX_SRC_PACK_0)
177                        A(MF_MT_DV_AAUX_CTRL_PACK_0)
178                        A(MF_MT_DV_AAUX_SRC_PACK_1)
179                        A(MF_MT_DV_AAUX_CTRL_PACK_1)
180                        A(MF_MT_DV_VAUX_SRC_PACK)
181                        A(MF_MT_DV_VAUX_CTRL_PACK)
182                        A(MF_MT_ARBITRARY_HEADER)
183                        A(MF_MT_ARBITRARY_FORMAT)
184                        A(MF_MT_IMAGE_LOSS_TOLERANT)
185                        A(MF_MT_MPEG4_SAMPLE_DESCRIPTION)
186                        A(MF_MT_MPEG4_CURRENT_SAMPLE_ENTRY)
187                        A(MF_MT_ORIGINAL_4CC)
188                        A(MF_MT_ORIGINAL_WAVE_FORMAT_TAG)
189                        A(MF_MT_FRAME_RATE_RANGE_MIN)
190                        A(MF_MT_FRAME_RATE_RANGE_MAX)
191                        A(MF_LOW_LATENCY)
192                        A(MF_VIDEO_MAX_MB_PER_SEC)
193                        A(MFMediaType_Default)
194                        A(MFMediaType_Audio)
195                        A(MFMediaType_Video)
196                        A(MFMediaType_Protected)
197                        A(MFMediaType_SAMI)
198                        A(MFMediaType_Script)
199                        A(MFMediaType_Image)
200                        A(MFMediaType_HTML)
201                        A(MFMediaType_Binary)
202                        A(MFMediaType_FileTransfer)
203                        A(MFMediaType_Stream)
204                        A(MFImageFormat_JPEG)
205                        A(MFImageFormat_RGB32)
206                        A(MFStreamFormat_MPEG2Transport)
207                        A(MFStreamFormat_MPEG2Program)
208                        A(AM_MEDIA_TYPE_REPRESENTATION)
209                        A(FORMAT_MFVideoFormat)
210                        A(CLSID_MFSourceResolver)
211                        // Windows SDK 8.1; mftransform.h
212                        A(MF_SA_D3D_AWARE)
213                        A(MF_SA_REQUIRED_SAMPLE_COUNT)
214                        A(MF_SA_REQUIRED_SAMPLE_COUNT_PROGRESSIVE)
215                        A(MF_SA_MINIMUM_OUTPUT_SAMPLE_COUNT)
216                        A(MF_SA_MINIMUM_OUTPUT_SAMPLE_COUNT_PROGRESSIVE)
217                        A(MFT_SUPPORT_3DVIDEO)
218                        A(MF_ENABLE_3DVIDEO_OUTPUT)
219                        A(MF_SA_D3D11_BINDFLAGS)
220                        A(MF_SA_D3D11_USAGE)
221                        A(MF_SA_D3D11_AWARE)
222                        A(MF_SA_D3D11_SHARED)
223                        A(MF_SA_D3D11_SHARED_WITHOUT_MUTEX)
224                        A(MF_SA_BUFFERS_PER_SAMPLE)
225                        A(MFT_DECODER_EXPOSE_OUTPUT_TYPES_IN_NATIVE_ORDER)
226                        A(MFT_REMUX_MARK_I_PICTURE_AS_CLEAN_POINT)
227                        A(MFT_DECODER_FINAL_VIDEO_RESOLUTION_HINT)
228                        A(MFT_ENCODER_SUPPORTS_CONFIG_EVENT)
229                        A(MFT_ENUM_HARDWARE_VENDOR_ID_Attribute)
230                        A(MF_TRANSFORM_ASYNC)
231                        A(MF_TRANSFORM_ASYNC_UNLOCK)
232                        A(MF_TRANSFORM_FLAGS_Attribute)
233                        A(MF_TRANSFORM_CATEGORY_Attribute)
234                        A(MFT_TRANSFORM_CLSID_Attribute)
235                        A(MFT_INPUT_TYPES_Attributes)
236                        A(MFT_OUTPUT_TYPES_Attributes)
237                        A(MFT_ENUM_HARDWARE_URL_Attribute)
238                        A(MFT_FRIENDLY_NAME_Attribute)
239                        A(MFT_CONNECTED_STREAM_ATTRIBUTE)
240                        A(MFT_CONNECTED_TO_HW_STREAM)
241                        A(MFT_PREFERRED_OUTPUTTYPE_Attribute)
242                        A(MFT_PROCESS_LOCAL_Attribute)
243                        A(MFT_PREFERRED_ENCODER_PROFILE)
244                        A(MFT_HW_TIMESTAMP_WITH_QPC_Attribute)
245                        A(MFT_FIELDOFUSE_UNLOCK_Attribute)
246                        A(MFT_CODEC_MERIT_Attribute)
247                        A(MFT_ENUM_TRANSCODE_ONLY_ATTRIBUTE)
248                        #undef A
249                };
250                for(SIZE_T nIndex = 0; nIndex < DIM(g_pMap); nIndex++)
251                        if(*g_pMap[nIndex].pIdentifier == Key)
252                                return CString(g_pMap[nIndex].pszName);
253                return CString(_PersistHelper::StringFromIdentifier(Key));
254        }
255        static CString FormatTransformFlags(ULONG nTransformFlags)
256        {
257                CRoArrayT<CString> Array;
258                static const struct { ULONG nValue; LPCSTR pszName; } g_pMap[] = 
259                {
260                        #define A(x) { x, #x },
261                        A(MFT_ENUM_FLAG_SYNCMFT)
262                        A(MFT_ENUM_FLAG_ASYNCMFT)
263                        A(MFT_ENUM_FLAG_HARDWARE)
264                        A(MFT_ENUM_FLAG_FIELDOFUSE)
265                        A(MFT_ENUM_FLAG_LOCALMFT)
266                        A(MFT_ENUM_FLAG_TRANSCODE_ONLY)
267                        //A(MFT_ENUM_FLAG_SORTANDFILTER)
268                        //A(MFT_ENUM_FLAG_ALL)
269                        #undef A
270                };
271                for(SIZE_T nIndex = 0; nIndex < DIM(g_pMap); nIndex++)
272                        if(nTransformFlags & g_pMap[nIndex].nValue)
273                        {
274                                _W(Array.Add(CA2CT(g_pMap[nIndex].pszName)) >= 0);
275                                nTransformFlags &= ~g_pMap[nIndex].nValue;
276                        }
277                if(!Array.IsEmpty())
278                {
279                        if(nTransformFlags)
280                                _W(Array.Add(AtlFormatString(_T("0x%x"), nTransformFlags)) >= 0);
281                        return _StringHelper::Join(Array, _T(" | "));
282                }
283                if(!nTransformFlags)
284                        return _T("0");
285                return AtlFormatString(_T("0x%x"), nTransformFlags);
286        }
287
288public:
289// CModule
290        CModule() throw()
291        {
292                _Z4(atlTraceRefcount, 4, _T("this 0x%p"), this);
293                _W(CExceptionFilter::Initialize());
294                #if defined(_DEBUG)
295                AtlTraceLoadSettings(NULL);
296                #endif // defined(_DEBUG)
297        }
298        ~CModule() throw()
299        {
300                _Z4(atlTraceRefcount, 4, _T("this 0x%p"), this);
301                CExceptionFilter::Terminate();
302        }
303        HRESULT PreMessageLoop(INT nShowCommand)
304        {
305                const HRESULT nResult = __super::PreMessageLoop(nShowCommand);
306                return SUCCEEDED(nResult) ? S_OK : nResult;
307        }
308        VOID RunMessageLoop()
309        {
310                static const struct { const GUID* pCategory; LPCSTR pszName; } g_pMap[] = 
311                {
312                        #define A(x) { &x, #x },
313                        A(MFT_CATEGORY_VIDEO_DECODER)
314                        A(MFT_CATEGORY_VIDEO_ENCODER)
315                        A(MFT_CATEGORY_VIDEO_EFFECT)
316                        A(MFT_CATEGORY_MULTIPLEXER)
317                        A(MFT_CATEGORY_DEMULTIPLEXER)
318                        A(MFT_CATEGORY_AUDIO_DECODER)
319                        A(MFT_CATEGORY_AUDIO_ENCODER)
320                        A(MFT_CATEGORY_AUDIO_EFFECT)
321                        A(MFT_CATEGORY_VIDEO_PROCESSOR)
322                        A(MFT_CATEGORY_OTHER)
323                        #undef A
324                };
325                for(SIZE_T nCategoryIndex = 0; nCategoryIndex < DIM(g_pMap); nCategoryIndex++)
326                {
327                        _tprintf(_T("Category: %hs %ls\n"), g_pMap[nCategoryIndex].pszName, _PersistHelper::StringFromIdentifier(*g_pMap[nCategoryIndex].pCategory));
328                        _tprintf(_T("\n"));
329                        _ATLTRY
330                        {
331                                CComHeapPtr<IMFActivate*> ppMfActivates;
332                                UINT32 nMfActivateCount = 0;
333                                __C(MFTEnumEx(*g_pMap[nCategoryIndex].pCategory, MFT_ENUM_FLAG_ALL, NULL, NULL, &ppMfActivates, &nMfActivateCount));
334                                CRoArrayT<CComPtr<IMFActivate>> ActivateArray;
335                                for(UINT32 nMfActivateIndex = 0; nMfActivateIndex < nMfActivateCount; nMfActivateIndex++)
336                                {
337                                        CComPtr<IMFActivate>& pMfActivate = reinterpret_cast<CComPtr<IMFActivate>&>(ppMfActivates[nMfActivateIndex]);
338                                        _W(ActivateArray.Add(pMfActivate) >= 0);
339                                        pMfActivate = NULL;
340                                }
341                                for(SIZE_T nActivateIndex = 0; nActivateIndex < ActivateArray.GetCount(); nActivateIndex++)
342                                {
343                                        const CComPtr<IMFActivate>& pMfActivate = ActivateArray[nActivateIndex];
344                                        CString sItem = AtlFormatString(_T("#%d"), nActivateIndex);
345                                        CComHeapPtr<WCHAR> pszFriendlyName;
346                                        UINT32 nFriendlyNameLength;
347                                        if(SUCCEEDED(pMfActivate->GetAllocatedString(MFT_FRIENDLY_NAME_Attribute, &pszFriendlyName, &nFriendlyNameLength)))
348                                                sItem.Insert(0, AtlFormatString(_T("%ls "), pszFriendlyName));
349                                        _tprintf(_T("\t") _T("%s\n"), sItem);
350                                        _ATLTRY
351                                        {
352                                                UINT32 nItemCount = 0;
353                                                __C(pMfActivate->GetCount(&nItemCount));
354                                                for(UINT32 nItemIndex = 0; nItemIndex < nItemCount; nItemIndex++)
355                                                {
356                                                        GUID Key;
357                                                        PROPVARIANT vValue;
358                                                        PropVariantInit(&vValue);
359                                                        __C(pMfActivate->GetItemByIndex(nItemIndex, &Key, &vValue));
360                                                        // NOTE: See PROPVARIANT Type Constants http://msdn.microsoft.com/en-us/library/cc235506%28v=prot.10%29.aspx
361                                                        if(Key == MF_TRANSFORM_CATEGORY_Attribute && vValue.vt == VT_CLSID && *vValue.puuid == *g_pMap[nCategoryIndex].pCategory)
362                                                                continue; // Matches Category
363                                                        if(Key == MFT_FRIENDLY_NAME_Attribute)
364                                                                continue; // Already Printed
365                                                        CString sStringValue;
366                                                        BOOL bStringValueAvailable = FALSE;
367                                                        BOOL bDefault = TRUE;
368                                                        #pragma region Format as Attribute
369                                                        if(Key == MF_TRANSFORM_FLAGS_Attribute && vValue.vt == VT_UI4)
370                                                        {
371                                                                sStringValue = FormatTransformFlags(vValue.ulVal);
372                                                                bStringValueAvailable = TRUE;
373                                                                bDefault = FALSE;
374                                                        } else
375                                                        if((Key == MFT_INPUT_TYPES_Attributes || Key == MFT_OUTPUT_TYPES_Attributes) && (VT_VECTOR | VT_UI1))
376                                                        {
377                                                                _A(!(vValue.caub.cElems % sizeof (MFT_REGISTER_TYPE_INFO)));
378                                                                const MFT_REGISTER_TYPE_INFO* pData = (MFT_REGISTER_TYPE_INFO*) vValue.caub.pElems;
379                                                                const SIZE_T nDataCount = vValue.caub.cElems / sizeof *pData;
380                                                                CRoArrayT<CString> Array;
381                                                                for(SIZE_T nIndex = 0; nIndex < nDataCount; nIndex++)
382                                                                        _W(Array.Add(AtlFormatString(_T("\t\t\t") _T("%ls %ls"), _FilterGraphHelper::FormatMajorType(pData[nIndex].guidMajorType), _FilterGraphHelper::FormatSubtype(pData[nIndex].guidSubtype))) >= 0);
383                                                                sStringValue += _StringHelper::Join(Array, _T("\n"));
384                                                                if(!sStringValue.IsEmpty())
385                                                                {
386                                                                        sStringValue.Insert(0, _T("\n"));
387                                                                        sStringValue.Append(_T("\n") _T("\t\t\t"));
388                                                                }
389                                                                bStringValueAvailable = TRUE;
390                                                                bDefault = FALSE;
391                                                        } else
392                                                                ;
393                                                        #pragma endregion
394                                                        #pragma region Format as Type
395                                                        if(bDefault)
396                                                        {
397                                                                if(vValue.vt == VT_LPSTR)
398                                                                {
399                                                                        sStringValue = CA2CT(vValue.pszVal);
400                                                                        bStringValueAvailable = TRUE;
401                                                                } else
402                                                                if(vValue.vt == VT_LPWSTR)
403                                                                {
404                                                                        sStringValue = CW2CT(vValue.pwszVal);
405                                                                        bStringValueAvailable = TRUE;
406                                                                } else
407                                                                if(vValue.vt == VT_CLSID)
408                                                                {
409                                                                        sStringValue = _PersistHelper::StringFromIdentifier(*vValue.puuid);
410                                                                        bStringValueAvailable = TRUE;
411                                                                } else
412                                                                if(vValue.vt == (VT_VECTOR | VT_UI1))
413                                                                {
414                                                                        sStringValue = AtlFormatString(_T("%d bytes"), vValue.caub.cElems);
415                                                                        if(vValue.caub.cElems > 0)
416                                                                        {
417                                                                                sStringValue += _T(", ");
418                                                                                ULONG nIndex;
419                                                                                for(nIndex = 0; nIndex < vValue.caub.cElems && nIndex < 24; nIndex++)
420                                                                                        sStringValue += AtlFormatString(_T("%02X "), vValue.caub.pElems[nIndex]);
421                                                                                if(nIndex < vValue.caub.cElems)
422                                                                                        sStringValue += _T("...");
423                                                                        }
424                                                                        bStringValueAvailable = TRUE;
425                                                                } else
426                                                                {
427                                                                        CComVariant vVariantValue;
428                                                                        bStringValueAvailable = SUCCEEDED(vVariantValue.ChangeType(VT_BSTR, &reinterpret_cast<VARIANT&>(vValue)));
429                                                                        if(bStringValueAvailable)
430                                                                                sStringValue = CString(vVariantValue.bstrVal);
431                                                                }
432                                                        }
433                                                        #pragma endregion
434                                                        if(bStringValueAvailable)
435                                                                _tprintf(_T("\t") _T("\t") _T("%s: %s (0x%x)\n"), FormatKey(Key), sStringValue, vValue.vt);
436                                                        else
437                                                                _tprintf(_T("\t") _T("\t") _T("%s: ??? (0x%x)\n"), FormatKey(Key), vValue.vt);
438                                                }
439                                        }
440                                        _ATLCATCHALL()
441                                        {
442                                                _Z_EXCEPTION();
443                                        }
444                                        _tprintf(_T("\n"));
445                                }
446                        }
447                        _ATLCATCHALL()
448                        {
449                                _Z_EXCEPTION();
450                        }
451                }
452        }
453};
454
455////////////////////////////////////////////////////////////
456// CArgumentException
457
458class CArgumentException :
459        public CAtlException
460{
461public:
462        CString m_sMessage;
463
464public:
465// CArgumentException
466        CArgumentException(const CString& sMessage, HRESULT nCode = E_FAIL) throw() :
467                CAtlException(nCode),
468                m_sMessage(sMessage)
469        {
470        }
471};
472
473////////////////////////////////////////////////////////////
474// Main
475
476int _tmain(int argc, _TCHAR* argv[])
477{
478        CModule Module;
479        _ATLTRY
480        {
481                #pragma region Syntax
482                //if(argc <= 1)
483                //{
484                //      CPath sName = FindFileName(argv[0]);
485                //      sName.RemoveExtension();
486                //      _tprintf(_T("Syntax:  %s [options] <media-file-path>\n"), sName);
487                //      _tprintf(_T("\n"));
488                //      _tprintf(_T("Options: ") _T("/x") _T(" - ") _T("show message box before running the graph\n"));
489                //      _tprintf(_T("\n"));
490                //      return 2;
491                //}
492                #pragma endregion
493                //for(INT nArgumentIndex = 1; nArgumentIndex < argc; nArgumentIndex++)
494                //{
495                //      CString sArgument = argv[nArgumentIndex];
496                //      _A(!sArgument.IsEmpty());
497                //      if(_tcschr(_T("-/"), sArgument[0]))
498                //      {
499                //              sArgument.Delete(0, 1);
500                //              if(sArgument.IsEmpty())
501                //                      throw CArgumentException(_T("Unexpected argument"));
502                //              switch(sArgument[0])
503                //              {
504                //              case 'X':
505                //              case 'x':
506                //                      Module.m_bShowMessageBox = TRUE;
507                //                      break;
508                //              default:
509                //                      throw CArgumentException(AtlFormatString(_T("Unexpected argument (%s)"), sArgument));
510                //              }
511                //              continue;
512                //      }
513                //      if(_tcslen(Module.m_sPath))
514                //              throw CArgumentException(_T("Unexpected argument: Input file name already specified"));
515                //      Module.m_sPath = (LPCTSTR) sArgument;
516                //      //throw CArgumentException(AtlFormatString(_T("Unexpected argument (%s)"), sArgument));
517                //}
518                //if(!_tcslen(Module.m_sPath))
519                //      throw CArgumentException(_T("Missing argument: No input file name specified"));
520                Module.WinMain(SW_SHOWNORMAL);
521        }
522        catch(CArgumentException Exception)
523        {
524                _tprintf(_T("Fatal Error: %s\n"), Exception.m_sMessage);
525                return 1;
526        }
527        _ATLCATCH(Exception)
528        {
529                _tprintf(_T("Fatal Error: 0x%08x %s\n"), (HRESULT) Exception, AtlFormatSystemMessage(Exception).TrimRight(_T("\t\n\r .")));
530                return 1;
531        }
532        _ATLCATCHALL()
533        {
534                _tprintf(_T("Fatal Error\n"));
535                return 1;
536        }
537        return 0;
538}
539
540// NOTE: See also Matthew van Eerde's "How to enumerate Media Foundation transforms on your system"
541//       http://blogs.msdn.com/b/matthew_van_eerde/archive/2010/05/03/how-to-enumerate-media-foundation-transforms-on-your-system.aspx
Note: See TracBrowser for help on using the repository browser.