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

Last change on this file since 548 was 548, checked in by roman, 6 years ago
File size: 8.6 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 "rodshow.h"
10#include "romf.h"
11
12////////////////////////////////////////////////////////////
13// CModule
14
15class CModule :
16        public CAtlExeModuleT<CModule>
17{
18public:
19        static CString FormatTransformFlags(ULONG nTransformFlags)
20        {
21                CRoArrayT<CString> Array;
22                static const struct { ULONG nValue; LPCSTR pszName; } g_pMap[] = 
23                {
24                        #define A(x) { x, #x },
25                        A(MFT_ENUM_FLAG_SYNCMFT)
26                        A(MFT_ENUM_FLAG_ASYNCMFT)
27                        A(MFT_ENUM_FLAG_HARDWARE)
28                        A(MFT_ENUM_FLAG_FIELDOFUSE)
29                        A(MFT_ENUM_FLAG_LOCALMFT)
30                        A(MFT_ENUM_FLAG_TRANSCODE_ONLY)
31                        //A(MFT_ENUM_FLAG_SORTANDFILTER)
32                        //A(MFT_ENUM_FLAG_ALL)
33                        #undef A
34                };
35                for(SIZE_T nIndex = 0; nIndex < DIM(g_pMap); nIndex++)
36                        if(nTransformFlags & g_pMap[nIndex].nValue)
37                        {
38                                _W(Array.Add(CA2CT(g_pMap[nIndex].pszName)) >= 0);
39                                nTransformFlags &= ~g_pMap[nIndex].nValue;
40                        }
41                if(!Array.IsEmpty())
42                {
43                        if(nTransformFlags)
44                                _W(Array.Add(AtlFormatString(_T("0x%x"), nTransformFlags)) >= 0);
45                        return _StringHelper::Join(Array, _T(" | "));
46                }
47                if(!nTransformFlags)
48                        return _T("0");
49                return AtlFormatString(_T("0x%x"), nTransformFlags);
50        }
51
52public:
53// CModule
54        CModule()
55        {
56                AtlTraceSetDefaultSettings();
57                _Z4_THIS();
58                _W(CExceptionFilter::Initialize());
59        }
60        ~CModule()
61        {
62                _Z4_THIS();
63                CExceptionFilter::Terminate();
64        }
65        HRESULT PreMessageLoop(INT nShowCommand)
66        {
67                const HRESULT nResult = __super::PreMessageLoop(nShowCommand);
68                return SUCCEEDED(nResult) ? S_OK : nResult;
69        }
70        VOID RunMessageLoop()
71        {
72                static const CEnumerationNameT<GUID> g_pCategoryMap[] = 
73                {
74                        #define A(x) { x, #x },
75                        A(MFT_CATEGORY_VIDEO_DECODER)
76                        A(MFT_CATEGORY_VIDEO_ENCODER)
77                        A(MFT_CATEGORY_VIDEO_EFFECT)
78                        A(MFT_CATEGORY_MULTIPLEXER)
79                        A(MFT_CATEGORY_DEMULTIPLEXER)
80                        A(MFT_CATEGORY_AUDIO_DECODER)
81                        A(MFT_CATEGORY_AUDIO_ENCODER)
82                        A(MFT_CATEGORY_AUDIO_EFFECT)
83                        A(MFT_CATEGORY_VIDEO_PROCESSOR)
84                        A(MFT_CATEGORY_OTHER)
85                        A(CLSID_VideoInputDeviceCategory) // Kernel streaming (KS) minidriver backed hardware transforms https://msdn.microsoft.com/en-us/library/windows/desktop/ms700134#live_sources
86                        A(KSCATEGORY_BRIDGE)
87                        A(KSCATEGORY_CAPTURE) // Video and Audio capture stuff
88                        A(KSCATEGORY_VIDEO_CAMERA)
89                        A(KSCATEGORY_RENDER)
90                        A(KSCATEGORY_MIXER)
91                        A(KSCATEGORY_SPLITTER)
92                        A(KSCATEGORY_DATACOMPRESSOR)
93                        A(KSCATEGORY_DATADECOMPRESSOR)
94                        A(KSCATEGORY_DATATRANSFORM)
95                        A(KSCATEGORY_COMMUNICATIONSTRANSFORM)
96                        A(KSCATEGORY_INTERFACETRANSFORM)
97                        A(KSCATEGORY_MEDIUMTRANSFORM)
98                        A(KSCATEGORY_FILESYSTEM)
99                        A(KSCATEGORY_CLOCK)
100                        A(KSCATEGORY_PROXY)
101                        A(KSCATEGORY_QUALITY)
102                        #undef A
103                };
104                for(auto&& CategoryItem: g_pCategoryMap)
105                {
106                        _tprintf(_T("Category: %hs %ls\n"), CategoryItem.pszName, _PersistHelper::StringFromIdentifier(CategoryItem.Value));
107                        _tprintf(_T("\n"));
108                        _ATLTRY
109                        {
110                                MF::CActivateArray ActivateArray;
111                                ActivateArray.Enumerate(CategoryItem.Value);
112                                UINT nActivateIndex = 0;
113                                for(auto&& pActivate: ActivateArray)
114                                {
115                                        CString sItem = AtlFormatString(_T("#%d"), nActivateIndex++);
116                                        CString sFriendlyName;
117                                        if(pActivate.TryGetString(MFT_FRIENDLY_NAME_Attribute, sFriendlyName))
118                                                sItem.Insert(0, AtlFormatString(_T("%s "), sFriendlyName));
119                                        _tprintf(_T("\t") _T("%s\n"), sItem);
120                                        _ATLTRY
121                                        {
122                                                UINT32 nItemCount = 0;
123                                                __C(pActivate->GetCount(&nItemCount));
124                                                for(UINT32 nItemIndex = 0; nItemIndex < nItemCount; nItemIndex++)
125                                                {
126                                                        GUID Key;
127                                                        MF::CPropVariant vValue;
128                                                        __C(pActivate->GetItemByIndex(nItemIndex, &Key, &vValue));
129                                                        // NOTE: See PROPVARIANT Type Constants http://msdn.microsoft.com/en-us/library/cc235506
130                                                        if(Key == MF_TRANSFORM_CATEGORY_Attribute && vValue.vt == VT_CLSID && *vValue.puuid == CategoryItem.Value)
131                                                                continue; // Matches Category
132                                                        if(Key == MFT_FRIENDLY_NAME_Attribute)
133                                                                continue; // Already Printed
134                                                        CString sStringValue;
135                                                        BOOL bStringValueAvailable = FALSE;
136                                                        BOOL bDefault = TRUE;
137                                                        #pragma region Format as Attribute
138                                                        if(Key == MF_TRANSFORM_FLAGS_Attribute && vValue.vt == VT_UI4)
139                                                        {
140                                                                sStringValue = FormatTransformFlags(vValue.ulVal);
141                                                                bStringValueAvailable = TRUE;
142                                                                bDefault = FALSE;
143                                                        } else
144                                                        if((Key == MFT_INPUT_TYPES_Attributes || Key == MFT_OUTPUT_TYPES_Attributes) && vValue.vt == (VT_VECTOR | VT_UI1))
145                                                        {
146                                                                _A(!(vValue.caub.cElems % sizeof (MFT_REGISTER_TYPE_INFO)));
147                                                                const MFT_REGISTER_TYPE_INFO* pData = (MFT_REGISTER_TYPE_INFO*) vValue.caub.pElems;
148                                                                const SIZE_T nDataCount = vValue.caub.cElems / sizeof *pData;
149                                                                CRoArrayT<CString> Array;
150                                                                for(SIZE_T nIndex = 0; nIndex < nDataCount; nIndex++)
151                                                                        _W(Array.Add(AtlFormatString(_T("\t\t\t") _T("%s %s"), MF::FormatKey(pData[nIndex].guidMajorType), MF::FormatKey(pData[nIndex].guidSubtype))) >= 0);
152                                                                sStringValue += _StringHelper::Join(Array, _T("\n"));
153                                                                if(!sStringValue.IsEmpty())
154                                                                {
155                                                                        sStringValue.Insert(0, _T("\n"));
156                                                                        sStringValue.Append(_T("\n") _T("\t\t\t"));
157                                                                }
158                                                                bStringValueAvailable = TRUE;
159                                                                bDefault = FALSE;
160                                                        } else
161                                                                ;
162                                                        #pragma endregion
163                                                        #pragma region Format as Type
164                                                        if(bDefault)
165                                                        {
166                                                                sStringValue = vValue.Format();
167                                                                bStringValueAvailable = !sStringValue.IsEmpty();
168                                                        }
169                                                        #pragma endregion
170                                                        if(bStringValueAvailable)
171                                                                _tprintf(_T("\t") _T("\t") _T("%s: %s\n"), MF::FormatKey(Key), sStringValue);
172                                                        else
173                                                                _tprintf(_T("\t") _T("\t") _T("%s: ??? (0x%X)\n"), MF::FormatKey(Key), MF::CPropVariant::FormatType(vValue.vt));
174                                                }
175                                        }
176                                        _ATLCATCHALL()
177                                        {
178                                                _Z_EXCEPTION();
179                                        }
180                                        _tprintf(_T("\n"));
181                                }
182                        }
183                        _ATLCATCHALL()
184                        {
185                                _Z_EXCEPTION();
186                        }
187                }
188        }
189};
190
191////////////////////////////////////////////////////////////
192// CArgumentException
193
194class CArgumentException :
195        public CAtlException
196{
197public:
198        CString m_sMessage;
199
200public:
201// CArgumentException
202        CArgumentException(const CString& sMessage, HRESULT nCode = E_FAIL) throw() :
203                CAtlException(nCode),
204                m_sMessage(sMessage)
205        {
206        }
207};
208
209////////////////////////////////////////////////////////////
210// Main
211
212int _tmain(int argc, _TCHAR* argv[])
213{
214        CModule Module;
215        _ATLTRY
216        {
217                #pragma region Syntax
218                //if(argc <= 1)
219                //{
220                //      CPath sName = FindFileName(argv[0]);
221                //      sName.RemoveExtension();
222                //      _tprintf(_T("Syntax:  %s [options] <media-file-path>\n"), sName);
223                //      _tprintf(_T("\n"));
224                //      _tprintf(_T("Options: ") _T("/x") _T(" - ") _T("show message box before running the graph\n"));
225                //      _tprintf(_T("\n"));
226                //      return 2;
227                //}
228                #pragma endregion
229                //for(INT nArgumentIndex = 1; nArgumentIndex < argc; nArgumentIndex++)
230                //{
231                //      CString sArgument = argv[nArgumentIndex];
232                //      _A(!sArgument.IsEmpty());
233                //      if(_tcschr(_T("-/"), sArgument[0]))
234                //      {
235                //              sArgument.Delete(0, 1);
236                //              if(sArgument.IsEmpty())
237                //                      throw CArgumentException(_T("Unexpected argument"));
238                //              switch(sArgument[0])
239                //              {
240                //              case 'X':
241                //              case 'x':
242                //                      Module.m_bShowMessageBox = TRUE;
243                //                      break;
244                //              default:
245                //                      throw CArgumentException(AtlFormatString(_T("Unexpected argument (%s)"), sArgument));
246                //              }
247                //              continue;
248                //      }
249                //      if(_tcslen(Module.m_sPath))
250                //              throw CArgumentException(_T("Unexpected argument: Input file name already specified"));
251                //      Module.m_sPath = (LPCTSTR) sArgument;
252                //      //throw CArgumentException(AtlFormatString(_T("Unexpected argument (%s)"), sArgument));
253                //}
254                //if(!_tcslen(Module.m_sPath))
255                //      throw CArgumentException(_T("Missing argument: No input file name specified"));
256                Module.WinMain(SW_SHOWNORMAL);
257        }
258        catch(CArgumentException Exception)
259        {
260                _tprintf(_T("Fatal Error: %s\n"), Exception.m_sMessage);
261                return 1;
262        }
263        _ATLCATCH(Exception)
264        {
265                _tprintf(_T("Fatal Error: 0x%08x %s\n"), (HRESULT) Exception, AtlFormatSystemMessage(Exception).TrimRight(_T("\t\n\r .")));
266                return 1;
267        }
268        _ATLCATCHALL()
269        {
270                _tprintf(_T("Fatal Error\n"));
271                return 1;
272        }
273        return 0;
274}
275
276// NOTE: See also Matthew van Eerde's "How to enumerate Media Foundation transforms on your system"
277//       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.