Ignore:
Timestamp:
Dec 4, 2015, 8:49:11 AM (6 years ago)
Author:
roman
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Utilities/MediaFoundation/EnumerateTransforms/Application.cpp

    r445 r548  
    77
    88#include "stdafx.h"
    9 #include <mfapi.h>
    10 #include <mftransform.h>
    119#include "rodshow.h"
    12 
    13 #pragma comment(lib, "mfplat.lib")
    14 #pragma comment(lib, "mfuuid.lib")
     10#include "romf.h"
    1511
    1612////////////////////////////////////////////////////////////
     
    2117{
    2218public:
    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         }
    25519        static CString FormatTransformFlags(ULONG nTransformFlags)
    25620        {
     
    28852public:
    28953// CModule
    290         CModule() throw()
    291         {
    292                 _Z4(atlTraceRefcount, 4, _T("this 0x%p"), this);
     54        CModule()
     55        {
     56                AtlTraceSetDefaultSettings();
     57                _Z4_THIS();
    29358                _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);
     59        }
     60        ~CModule()
     61        {
     62                _Z4_THIS();
    30163                CExceptionFilter::Terminate();
    30264        }
     
    30870        VOID RunMessageLoop()
    30971        {
    310                 static const struct { const GUID* pCategory; LPCSTR pszName; } g_pMap[] =
    311                 {
    312                         #define A(x) { &x, #x },
     72                static const CEnumerationNameT<GUID> g_pCategoryMap[] =
     73                {
     74                        #define A(x) { x, #x },
    31375                        A(MFT_CATEGORY_VIDEO_DECODER)
    31476                        A(MFT_CATEGORY_VIDEO_ENCODER)
     
    32183                        A(MFT_CATEGORY_VIDEO_PROCESSOR)
    32284                        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)
    323102                        #undef A
    324103                };
    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));
     104                for(auto&& CategoryItem: g_pCategoryMap)
     105                {
     106                        _tprintf(_T("Category: %hs %ls\n"), CategoryItem.pszName, _PersistHelper::StringFromIdentifier(CategoryItem.Value));
    328107                        _tprintf(_T("\n"));
    329108                        _ATLTRY
    330109                        {
    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++)
     110                                MF::CActivateArray ActivateArray;
     111                                ActivateArray.Enumerate(CategoryItem.Value);
     112                                UINT nActivateIndex = 0;
     113                                for(auto&& pActivate: ActivateArray)
    336114                                {
    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));
     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));
    349119                                        _tprintf(_T("\t") _T("%s\n"), sItem);
    350120                                        _ATLTRY
    351121                                        {
    352122                                                UINT32 nItemCount = 0;
    353                                                 __C(pMfActivate->GetCount(&nItemCount));
     123                                                __C(pActivate->GetCount(&nItemCount));
    354124                                                for(UINT32 nItemIndex = 0; nItemIndex < nItemCount; nItemIndex++)
    355125                                                {
    356126                                                        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)
     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)
    362131                                                                continue; // Matches Category
    363132                                                        if(Key == MFT_FRIENDLY_NAME_Attribute)
     
    373142                                                                bDefault = FALSE;
    374143                                                        } else
    375                                                         if((Key == MFT_INPUT_TYPES_Attributes || Key == MFT_OUTPUT_TYPES_Attributes) && (VT_VECTOR | VT_UI1))
     144                                                        if((Key == MFT_INPUT_TYPES_Attributes || Key == MFT_OUTPUT_TYPES_Attributes) && vValue.vt == (VT_VECTOR | VT_UI1))
    376145                                                        {
    377146                                                                _A(!(vValue.caub.cElems % sizeof (MFT_REGISTER_TYPE_INFO)));
     
    380149                                                                CRoArrayT<CString> Array;
    381150                                                                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);
     151                                                                        _W(Array.Add(AtlFormatString(_T("\t\t\t") _T("%s %s"), MF::FormatKey(pData[nIndex].guidMajorType), MF::FormatKey(pData[nIndex].guidSubtype))) >= 0);
    383152                                                                sStringValue += _StringHelper::Join(Array, _T("\n"));
    384153                                                                if(!sStringValue.IsEmpty())
     
    395164                                                        if(bDefault)
    396165                                                        {
    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                                                                 }
     166                                                                sStringValue = vValue.Format();
     167                                                                bStringValueAvailable = !sStringValue.IsEmpty();
    432168                                                        }
    433169                                                        #pragma endregion
    434170                                                        if(bStringValueAvailable)
    435                                                                 _tprintf(_T("\t") _T("\t") _T("%s: %s (0x%x)\n"), FormatKey(Key), sStringValue, vValue.vt);
     171                                                                _tprintf(_T("\t") _T("\t") _T("%s: %s\n"), MF::FormatKey(Key), sStringValue);
    436172                                                        else
    437                                                                 _tprintf(_T("\t") _T("\t") _T("%s: ??? (0x%x)\n"), FormatKey(Key), vValue.vt);
     173                                                                _tprintf(_T("\t") _T("\t") _T("%s: ??? (0x%X)\n"), MF::FormatKey(Key), MF::CPropVariant::FormatType(vValue.vt));
    438174                                                }
    439175                                        }
Note: See TracChangeset for help on using the changeset viewer.