summaryrefslogtreecommitdiff
path: root/AVStream/sampledevicemft/multipinmftutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'AVStream/sampledevicemft/multipinmftutils.cpp')
-rw-r--r--AVStream/sampledevicemft/multipinmftutils.cpp877
1 files changed, 0 insertions, 877 deletions
diff --git a/AVStream/sampledevicemft/multipinmftutils.cpp b/AVStream/sampledevicemft/multipinmftutils.cpp
deleted file mode 100644
index 6f5735b5..00000000
--- a/AVStream/sampledevicemft/multipinmftutils.cpp
+++ /dev/null
@@ -1,877 +0,0 @@
-//*@@@+++@@@@******************************************************************
-//
-// Microsoft Windows Media Foundation
-// Copyright (C) Microsoft Corporation. All rights reserved.
-//
-//*@@@---@@@@******************************************************************
-//
-
-#include "stdafx.h"
-#include "common.h"
-#include "multipinmft.h"
-#include "basepin.h"
-
-#pragma comment(lib, "d2d1")
-#ifdef MF_WPP
-#include "multipinmftutils.tmh" //--REF_ANALYZER_DONT_REMOVE--
-#endif
-
-// Critical sections
-
-CCritSec::CCritSec()
-{
- InitializeCriticalSection(&m_criticalSection);
-}
-
-CCritSec::~CCritSec()
-{
- DeleteCriticalSection(&m_criticalSection);
-}
-
-_Requires_lock_not_held_(m_criticalSection) _Acquires_lock_(m_criticalSection)
-void CCritSec::Lock()
-{
- EnterCriticalSection(&m_criticalSection);
-}
-
-_Requires_lock_held_(m_criticalSection) _Releases_lock_(m_criticalSection)
-void CCritSec::Unlock()
-{
- LeaveCriticalSection(&m_criticalSection);
-}
-
-
-_Acquires_lock_(this->m_pCriticalSection->m_criticalSection)
-CAutoLock::CAutoLock(CCritSec& crit)
-{
- m_pCriticalSection = &crit;
- m_pCriticalSection->Lock();
-}
-_Acquires_lock_(this->m_pCriticalSection->m_criticalSection)
-CAutoLock::CAutoLock(CCritSec* crit)
-{
- m_pCriticalSection = crit;
- m_pCriticalSection->Lock();
-}
-_Releases_lock_(this->m_pCriticalSection->m_criticalSection)
-CAutoLock::~CAutoLock()
-{
- m_pCriticalSection->Unlock();
-}
-
-//
-//Some utility functions..
-//
-
-/*++
- Description:
- Used to check if the input and the output Image types are optinmized or not
---*/
-
-STDMETHODIMP IsOptimizedPlanarVideoInputImageOutputPair(
- _In_ IMFMediaType *inMediaType,
- _In_ IMFMediaType *outMediaType,
- _Out_ bool *optimized,
- _Out_ bool *optimizedxvpneeded )
-{
- HRESULT hr = S_OK;
- GUID guidInputSubType = GUID_NULL;
- GUID guidOutputSubType = GUID_NULL;
- UINT32 uWidthIn = 0, uHeightIn = 0, uWidthOut = 0, uHeightOut = 0;
-
-
- DMFTCHECKHR_GOTO(inMediaType->GetGUID(MF_MT_SUBTYPE, &guidInputSubType), done);
-
- DMFTCHECKHR_GOTO(outMediaType->GetGUID(MF_MT_SUBTYPE, &guidOutputSubType), done);
-
- *optimized = false; //Assume we aren't optimized . Optimized = (ip = YU12|NV12 and op = JPEG)
- *optimizedxvpneeded = true; //Assume we need xvps
-
- if (IsEqualGUID(guidInputSubType, MFVideoFormat_YV12) || IsEqualGUID(guidInputSubType, MFVideoFormat_NV12))
- {
- if (IsEqualGUID(guidOutputSubType, GUID_ContainerFormatJpeg))
- {
- *optimized = true;
- }
- }
-
- if (!*optimized)
- {
- goto done;
- }
-
- DMFTCHECKHR_GOTO(MFGetAttributeSize(inMediaType, MF_MT_FRAME_SIZE, &uWidthIn, &uHeightIn), done);
- DMFTCHECKHR_GOTO(MFGetAttributeSize(outMediaType, MF_MT_FRAME_SIZE, &uWidthOut, &uHeightOut), done);
-
- if ((uWidthIn == uWidthOut) && (uHeightIn == uHeightOut))
- {
- *optimizedxvpneeded = false;
- }
- if (!*optimizedxvpneeded)
- {
- UINT32 nominalRange;
- hr = inMediaType->GetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, &nominalRange);
-
- if (FAILED(hr) || nominalRange != MFNominalRange_0_255)
- {
- //XVP needed since nominal range is not 0-255 for YV12 or NV12 fed into WIC
- *optimizedxvpneeded = true;
- }
- hr = S_OK;
- }
-
-done:
- return hr;
-}
-
-
-/*
-Description:
-
- This is used whenever there is a media type change on an output pin and the
- Output queue is being reconfigured.
- The possible return values for the function are as follows
-
- DeviceMftTransformXVPIllegal -> If either of the mediatypes or both are NULL
- DeviceMftTransformXVPDisruptiveIn -> If the mediatype at the output pin is greater than the input pin. This will result in change of the media type on the input
- DeviceMftTransformXVPDisruptiveOut -> This is a reconfiguration or addition of the XVP in the Output pin queue
- DeviceMftTransformXVPCurrent -> No XVP needed at all
- Note: This iteration doesn't support decoder. The next one will and this function will accordingly change
-*/
-STDMETHODIMP CompareMediaTypesForXVP(
- _In_opt_ IMFMediaType *inMediaType,
- _In_ IMFMediaType *newMediaType,
- _Inout_ MF_TRANSFORM_XVP_OPERATION *operation
- )
-{
- UINT32 unWidthin, unHeightin, unWidthNew, unHeightNew = 0;
- HRESULT hr = S_OK;
- GUID guidTypeA = GUID_NULL;
- GUID guidTypeB = GUID_NULL;
-
- *operation = DeviceMftTransformXVPIllegal;
- if ((!inMediaType) || (!newMediaType))
- {
- goto done;
- }
-
- DMFTCHECKHR_GOTO( MFGetAttributeSize( inMediaType, MF_MT_FRAME_SIZE, &unWidthin, &unHeightin ), done );
- DMFTCHECKHR_GOTO( MFGetAttributeSize( newMediaType, MF_MT_FRAME_SIZE, &unWidthNew, &unHeightNew ), done );
-
-
- if ( SUCCEEDED( inMediaType->GetGUID( MF_MT_MAJOR_TYPE, &guidTypeA ) ) &&
- SUCCEEDED( newMediaType->GetGUID( MF_MT_MAJOR_TYPE, &guidTypeB ) ) &&
- IsEqualGUID( guidTypeA, guidTypeB ) )
- {
- if ( SUCCEEDED( inMediaType->GetGUID ( MF_MT_SUBTYPE, &guidTypeA ) ) &&
- SUCCEEDED( newMediaType->GetGUID( MF_MT_SUBTYPE, &guidTypeB ) ) &&
- IsEqualGUID( guidTypeA, guidTypeB ) )
- {
- //Comparing the MF_MT_AM_FORMAT_TYPE for the directshow format guid
-#if 0
- if (SUCCEEDED(inMediaType->GetGUID(MF_MT_AM_FORMAT_TYPE, &guidTypeA)) &&
- SUCCEEDED(newMediaType->GetGUID(MF_MT_AM_FORMAT_TYPE, &guidTypeB)) &&
- IsEqualGUID(guidTypeA, guidTypeB))
-#endif
- {
-
- if (!(( unWidthin == unWidthNew ) &&
- ( unHeightin == unHeightNew ) ) )
- {
- if ( ( unWidthNew > unWidthin ) || ( unHeightNew > unHeightin ) )
- {
- *operation = DeviceMftTransformXVPDisruptiveIn; //Media type needs to change at input
- }
- else
- {
- *operation = DeviceMftTransformXVPDisruptiveOut; //Media type needs to change at output
- }
- goto done;
- }
-
- if ( MFGetAttributeUINT32( inMediaType, MF_MT_SAMPLE_SIZE, 0 ) !=
- MFGetAttributeUINT32( newMediaType, MF_MT_SAMPLE_SIZE, 0 ) )
- {
- hr = S_FALSE; //Sample sizes differ.
- goto done;
- }
- else
- {
- //Same media type.. No XVP needed or the current XVP is fine!
- *operation = DeviceMftTransformXVPCurrent;
- }
- }
- }
- else
- {
- //This is a disruptive operation. Actually a decoder operation!
- *operation = DeviceMftTransformXVPDisruptiveIn;
- }
- }
- done:
- return hr;
-}
-
-/*++
-Description:
- A Simple function to randomnize the media types supplied in an array
---*/
-STDMETHODIMP RandomnizeMediaTypes(_In_ IMFMediaTypeArray &pMediaTypeArray)
-{
- HRESULT hr = S_OK;
- IMFMediaType *pTempMediaType = nullptr;
- UNREFERENCED_PARAMETER(pTempMediaType);
- if (pMediaTypeArray.empty())
- {
- goto done;
- }
-
- srand(static_cast<unsigned long>(GetTickCount64()));
-
- for (DWORD dwIndex = (DWORD)pMediaTypeArray.size() - 1; dwIndex > 0; dwIndex--)
- {
- DWORD fromIndex = rand() % ( dwIndex + 1 );
- pTempMediaType = pMediaTypeArray[dwIndex];
- pMediaTypeArray [ dwIndex ] = pMediaTypeArray[fromIndex] ;
- pMediaTypeArray [ fromIndex ] = pTempMediaType;
- }
- //
- //Just reverse the array
- //
- for (DWORD dwIndex = (DWORD)pMediaTypeArray.size() - 1, fromIndex = 0; dwIndex > 0; dwIndex--, fromIndex++)
- {
-
- pTempMediaType = pMediaTypeArray[dwIndex];
- pMediaTypeArray [ dwIndex ] = pMediaTypeArray[fromIndex];
- pMediaTypeArray [ fromIndex ] = pTempMediaType;
- }
- done:
- return hr;
-
-}
-
-/*++
-Description: Used to test if the sample passed is a DX sample or not?
---*/
-STDMETHODIMP IsInputDxSample(
- _In_ IMFSample* pSample,
- _Inout_ BOOL *isDxSample
- )
-{
- HRESULT hr = S_OK;
- ComPtr<IMFMediaBuffer> spBuffer = nullptr;
- DMFTCHECKNULL_GOTO( pSample, done, E_INVALIDARG );
-
- *isDxSample = false;
- if ( SUCCEEDED( pSample->GetBufferByIndex( 0, &spBuffer ) ) )
- {
- ComPtr<IMFDXGIBuffer> spDXGIBuffer;
- ComPtr<ID3D11Texture2D> spResourceTexture;
- if ( SUCCEEDED( spBuffer.As(&spDXGIBuffer ) ) &&
- SUCCEEDED( spDXGIBuffer-> GetResource( IID_PPV_ARGS( &spResourceTexture ) ) ) )
- {
- *isDxSample = true;
- }
- }
-done:
- return hr;
-}
-
-
-/*++
- Description:
- Helper function to return back if the Pin is in stopped stateo or not
---*/
-STDMETHODIMP_(BOOL) IsPinStateInActive( _In_ DeviceStreamState state)
-{
- if ((state == DeviceStreamState_Disabled) ||
- (state == DeviceStreamState_Stop))
- {
- return TRUE;
- }
- return FALSE;
-}
-
-/*
-Description:
- A Helper function to return if the Mediatype is a compressed video type or not!
-*/
-STDMETHODIMP_(BOOL) IsKnownUncompressedVideoType(_In_ GUID guidSubType)
-{
- if (guidSubType == MFVideoFormat_ARGB32 ||
- guidSubType == MFVideoFormat_RGB24 ||
- guidSubType == MFVideoFormat_RGB555 ||
- guidSubType == MFVideoFormat_RGB565 ||
- guidSubType == MFVideoFormat_RGB32 ||
- guidSubType == MFVideoFormat_RGB8 ||
- guidSubType == MFVideoFormat_AI44 ||
- guidSubType == MFVideoFormat_AYUV ||
- guidSubType == MFVideoFormat_YUY2 ||
- guidSubType == MFVideoFormat_YVYU ||
- guidSubType == MFVideoFormat_YVU9 ||
- guidSubType == MFVideoFormat_UYVY ||
- guidSubType == MFVideoFormat_NV11 ||
- guidSubType == MFVideoFormat_NV12 ||
- guidSubType == MFVideoFormat_YV12 ||
- guidSubType == MFVideoFormat_I420 ||
- guidSubType == MFVideoFormat_IYUV ||
- guidSubType == MFVideoFormat_Y210 ||
- guidSubType == MFVideoFormat_Y216 ||
- guidSubType == MFVideoFormat_Y410 ||
- guidSubType == MFVideoFormat_Y416 ||
- guidSubType == MFVideoFormat_Y41P ||
- guidSubType == MFVideoFormat_Y41T ||
- guidSubType == MFVideoFormat_Y42T ||
- guidSubType == MFVideoFormat_P210 ||
- guidSubType == MFVideoFormat_P216 ||
- guidSubType == MFVideoFormat_P010 ||
- guidSubType == MFVideoFormat_P016 ||
- guidSubType == MFVideoFormat_v210 ||
- guidSubType == MFVideoFormat_v216 ||
- guidSubType == MFVideoFormat_v410 ||
- guidSubType == MFVideoFormat_L8 ||
- guidSubType == MFVideoFormat_L16 ||
- guidSubType == MFVideoFormat_D16)
- {
- return( TRUE );
- }
-
- return( FALSE );
-}
-
-/*++
-Description:
- Function used to lock the MFT.
---*/
-
-STDMETHODIMP UnLockAsynMFT(IMFTransform* pTransform)
-{
- HRESULT hr = S_OK;
- IMFAttributes *pAttributes;
- UINT32 unValue;
-
- DMFTCHECKNULL_GOTO(pTransform,done, E_INVALIDARG);
- DMFTCHECKHR_GOTO(pTransform->GetAttributes(&pAttributes),done);
- DMFTCHECKHR_GOTO(pAttributes->GetUINT32(MF_TRANSFORM_ASYNC, &unValue), done);
-
- if (unValue)
- {
- DMFTCHECKHR_GOTO(pAttributes->SetUINT32(MF_TRANSFORM_ASYNC, true), done);
- }
-
-done:
- return hr;
-}
-
-
-#ifndef IF_EQUAL_RETURN
-#define IF_EQUAL_RETURN(param, val) if(val == param) return #val
-#endif
-
-#define checkAdjustBufferCap(a,len){\
- char* tStore = NULL; \
-if (a && strlen(a) > ((len * 7) / 10)){\
- tStore = a; \
- len *= 2; \
- a = new char[len]; \
-if (!a){\
-goto done;}\
- a[0] = 0; \
- strcat_s(a, len, tStore); \
- delete(tStore); }\
-}
-
-
-/*++
-Description:
- returns an ascii buffer for the GUID passed. The Caller should release the memory allocated
---*/
-LPSTR DumpGUIDA(_In_ REFGUID guid)
-{
- LPOLESTR lpszGuidString = NULL;
- char *ansiguidStr = NULL;
- if (SUCCEEDED(StringFromCLSID(guid, &lpszGuidString)))
- {
- int mbGuidLen = 0;
- mbGuidLen = WideCharToMultiByte( CP_ACP, WC_NO_BEST_FIT_CHARS, lpszGuidString, -1, NULL, 0, NULL, NULL);
- if (mbGuidLen > 0)
- {
- mf_assert(mbGuidLen == (int)wcslen(lpszGuidString));
- ansiguidStr = new char[mbGuidLen];
- WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, lpszGuidString, -1, ansiguidStr, mbGuidLen, NULL, NULL);
- CoTaskMemFree(lpszGuidString);
- ansiguidStr[mbGuidLen - 1] = 0;
- }
- }
- return ansiguidStr;
-}
-
-//
-//Borrrowed from MDSN sample
-//
-LPCSTR GetGUIDNameConst(const GUID& guid)
-{
- IF_EQUAL_RETURN(guid, MF_MT_MAJOR_TYPE);
- IF_EQUAL_RETURN(guid, MF_MT_MAJOR_TYPE);
- IF_EQUAL_RETURN(guid, MF_MT_SUBTYPE);
- IF_EQUAL_RETURN(guid, MF_MT_ALL_SAMPLES_INDEPENDENT);
- IF_EQUAL_RETURN(guid, MF_MT_FIXED_SIZE_SAMPLES);
- IF_EQUAL_RETURN(guid, MF_MT_COMPRESSED);
- IF_EQUAL_RETURN(guid, MF_MT_SAMPLE_SIZE);
- IF_EQUAL_RETURN(guid, MF_MT_WRAPPED_TYPE);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_NUM_CHANNELS);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_SAMPLES_PER_SECOND);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_FLOAT_SAMPLES_PER_SECOND);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_AVG_BYTES_PER_SECOND);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_BLOCK_ALIGNMENT);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_BITS_PER_SAMPLE);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_VALID_BITS_PER_SAMPLE);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_SAMPLES_PER_BLOCK);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_CHANNEL_MASK);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_FOLDDOWN_MATRIX);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_PEAKREF);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_PEAKTARGET);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_AVGREF);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_WMADRC_AVGTARGET);
- IF_EQUAL_RETURN(guid, MF_MT_AUDIO_PREFER_WAVEFORMATEX);
- IF_EQUAL_RETURN(guid, MF_MT_AAC_PAYLOAD_TYPE);
- IF_EQUAL_RETURN(guid, MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION);
- IF_EQUAL_RETURN(guid, MF_MT_FRAME_SIZE);
- IF_EQUAL_RETURN(guid, MF_MT_FRAME_RATE);
- IF_EQUAL_RETURN(guid, MF_MT_FRAME_RATE_RANGE_MAX);
- IF_EQUAL_RETURN(guid, MF_MT_FRAME_RATE_RANGE_MIN);
- IF_EQUAL_RETURN(guid, MF_MT_PIXEL_ASPECT_RATIO);
- IF_EQUAL_RETURN(guid, MF_MT_DRM_FLAGS);
- IF_EQUAL_RETURN(guid, MF_MT_PAD_CONTROL_FLAGS);
- IF_EQUAL_RETURN(guid, MF_MT_SOURCE_CONTENT_HINT);
- IF_EQUAL_RETURN(guid, MF_MT_VIDEO_CHROMA_SITING);
- IF_EQUAL_RETURN(guid, MF_MT_INTERLACE_MODE);
- IF_EQUAL_RETURN(guid, MF_MT_TRANSFER_FUNCTION);
- IF_EQUAL_RETURN(guid, MF_MT_VIDEO_PRIMARIES);
- IF_EQUAL_RETURN(guid, MF_MT_CUSTOM_VIDEO_PRIMARIES);
- IF_EQUAL_RETURN(guid, MF_MT_YUV_MATRIX);
- IF_EQUAL_RETURN(guid, MF_MT_VIDEO_LIGHTING);
- IF_EQUAL_RETURN(guid, MF_MT_VIDEO_NOMINAL_RANGE);
- IF_EQUAL_RETURN(guid, MF_MT_GEOMETRIC_APERTURE);
- IF_EQUAL_RETURN(guid, MF_MT_MINIMUM_DISPLAY_APERTURE);
- IF_EQUAL_RETURN(guid, MF_MT_PAN_SCAN_APERTURE);
- IF_EQUAL_RETURN(guid, MF_MT_PAN_SCAN_ENABLED);
- IF_EQUAL_RETURN(guid, MF_MT_AVG_BITRATE);
- IF_EQUAL_RETURN(guid, MF_MT_AVG_BIT_ERROR_RATE);
- IF_EQUAL_RETURN(guid, MF_MT_MAX_KEYFRAME_SPACING);
- IF_EQUAL_RETURN(guid, MF_MT_DEFAULT_STRIDE);
- IF_EQUAL_RETURN(guid, MF_MT_PALETTE);
- IF_EQUAL_RETURN(guid, MF_MT_USER_DATA);
- IF_EQUAL_RETURN(guid, MF_MT_AM_FORMAT_TYPE);
- IF_EQUAL_RETURN(guid, MF_MT_MPEG_START_TIME_CODE);
- IF_EQUAL_RETURN(guid, MF_MT_MPEG2_PROFILE);
- IF_EQUAL_RETURN(guid, MF_MT_MPEG2_LEVEL);
- IF_EQUAL_RETURN(guid, MF_MT_MPEG2_FLAGS);
- IF_EQUAL_RETURN(guid, MF_MT_MPEG_SEQUENCE_HEADER);
- IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_SRC_PACK_0);
- IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_CTRL_PACK_0);
- IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_SRC_PACK_1);
- IF_EQUAL_RETURN(guid, MF_MT_DV_AAUX_CTRL_PACK_1);
- IF_EQUAL_RETURN(guid, MF_MT_DV_VAUX_SRC_PACK);
- IF_EQUAL_RETURN(guid, MF_MT_DV_VAUX_CTRL_PACK);
- IF_EQUAL_RETURN(guid, MF_MT_ARBITRARY_HEADER);
- IF_EQUAL_RETURN(guid, MF_MT_ARBITRARY_FORMAT);
- IF_EQUAL_RETURN(guid, MF_MT_IMAGE_LOSS_TOLERANT);
- IF_EQUAL_RETURN(guid, MF_MT_MPEG4_SAMPLE_DESCRIPTION);
- IF_EQUAL_RETURN(guid, MF_MT_MPEG4_CURRENT_SAMPLE_ENTRY);
- IF_EQUAL_RETURN(guid, MF_MT_ORIGINAL_4CC);
- IF_EQUAL_RETURN(guid, MF_MT_ORIGINAL_WAVE_FORMAT_TAG);
-
- // Media types
-
- IF_EQUAL_RETURN(guid, MFMediaType_Audio);
- IF_EQUAL_RETURN(guid, MFMediaType_Video);
- IF_EQUAL_RETURN(guid, MFMediaType_Protected);
- IF_EQUAL_RETURN(guid, MFMediaType_SAMI);
- IF_EQUAL_RETURN(guid, MFMediaType_Script);
- IF_EQUAL_RETURN(guid, MFMediaType_Image);
- IF_EQUAL_RETURN(guid, MFMediaType_HTML);
- IF_EQUAL_RETURN(guid, MFMediaType_Binary);
- IF_EQUAL_RETURN(guid, MFMediaType_FileTransfer);
-
- IF_EQUAL_RETURN(guid, MFVideoFormat_AI44); // FCC('AI44')
- IF_EQUAL_RETURN(guid, MFVideoFormat_ARGB32); // D3DFMT_A8R8G8B8
- IF_EQUAL_RETURN(guid, MFVideoFormat_AYUV); // FCC('AYUV')
- IF_EQUAL_RETURN(guid, MFVideoFormat_DV25); // FCC('dv25')
- IF_EQUAL_RETURN(guid, MFVideoFormat_DV50); // FCC('dv50')
- IF_EQUAL_RETURN(guid, MFVideoFormat_DVH1); // FCC('dvh1')
- IF_EQUAL_RETURN(guid, MFVideoFormat_DVSD); // FCC('dvsd')
- IF_EQUAL_RETURN(guid, MFVideoFormat_DVSL); // FCC('dvsl')
- IF_EQUAL_RETURN(guid, MFVideoFormat_H264); // FCC('H264')
- IF_EQUAL_RETURN(guid, MFVideoFormat_I420); // FCC('I420')
- IF_EQUAL_RETURN(guid, MFVideoFormat_IYUV); // FCC('IYUV')
- IF_EQUAL_RETURN(guid, MFVideoFormat_M4S2); // FCC('M4S2')
- IF_EQUAL_RETURN(guid, MFVideoFormat_MJPG);
- IF_EQUAL_RETURN(guid, MFVideoFormat_MP43); // FCC('MP43')
- IF_EQUAL_RETURN(guid, MFVideoFormat_MP4S); // FCC('MP4S')
- IF_EQUAL_RETURN(guid, MFVideoFormat_MP4V); // FCC('MP4V')
- IF_EQUAL_RETURN(guid, MFVideoFormat_MPG1); // FCC('MPG1')
- IF_EQUAL_RETURN(guid, MFVideoFormat_MSS1); // FCC('MSS1')
- IF_EQUAL_RETURN(guid, MFVideoFormat_MSS2); // FCC('MSS2')
- IF_EQUAL_RETURN(guid, MFVideoFormat_NV11); // FCC('NV11')
- IF_EQUAL_RETURN(guid, MFVideoFormat_NV12); // FCC('NV12')
- IF_EQUAL_RETURN(guid, MFVideoFormat_P010); // FCC('P010')
- IF_EQUAL_RETURN(guid, MFVideoFormat_P016); // FCC('P016')
- IF_EQUAL_RETURN(guid, MFVideoFormat_P210); // FCC('P210')
- IF_EQUAL_RETURN(guid, MFVideoFormat_P216); // FCC('P216')
- IF_EQUAL_RETURN(guid, MFVideoFormat_RGB24); // D3DFMT_R8G8B8
- IF_EQUAL_RETURN(guid, MFVideoFormat_RGB32); // D3DFMT_X8R8G8B8
- IF_EQUAL_RETURN(guid, MFVideoFormat_RGB555); // D3DFMT_X1R5G5B5
- IF_EQUAL_RETURN(guid, MFVideoFormat_RGB565); // D3DFMT_R5G6B5
- IF_EQUAL_RETURN(guid, MFVideoFormat_RGB8);
- IF_EQUAL_RETURN(guid, MFVideoFormat_UYVY); // FCC('UYVY')
- IF_EQUAL_RETURN(guid, MFVideoFormat_v210); // FCC('v210')
- IF_EQUAL_RETURN(guid, MFVideoFormat_v410); // FCC('v410')
- IF_EQUAL_RETURN(guid, MFVideoFormat_WMV1); // FCC('WMV1')
- IF_EQUAL_RETURN(guid, MFVideoFormat_WMV2); // FCC('WMV2')
- IF_EQUAL_RETURN(guid, MFVideoFormat_WMV3); // FCC('WMV3')
- IF_EQUAL_RETURN(guid, MFVideoFormat_WVC1); // FCC('WVC1')
- IF_EQUAL_RETURN(guid, MFVideoFormat_Y210); // FCC('Y210')
- IF_EQUAL_RETURN(guid, MFVideoFormat_Y216); // FCC('Y216')
- IF_EQUAL_RETURN(guid, MFVideoFormat_Y410); // FCC('Y410')
- IF_EQUAL_RETURN(guid, MFVideoFormat_Y416); // FCC('Y416')
- IF_EQUAL_RETURN(guid, MFVideoFormat_Y41P);
- IF_EQUAL_RETURN(guid, MFVideoFormat_Y41T);
- IF_EQUAL_RETURN(guid, MFVideoFormat_YUY2); // FCC('YUY2')
- IF_EQUAL_RETURN(guid, MFVideoFormat_YV12); // FCC('YV12')
- IF_EQUAL_RETURN(guid, MFVideoFormat_YVYU);
-
- IF_EQUAL_RETURN(guid, MFAudioFormat_PCM); // WAVE_FORMAT_PCM
- IF_EQUAL_RETURN(guid, MFAudioFormat_Float); // WAVE_FORMAT_IEEE_FLOAT
- IF_EQUAL_RETURN(guid, MFAudioFormat_DTS); // WAVE_FORMAT_DTS
- IF_EQUAL_RETURN(guid, MFAudioFormat_Dolby_AC3_SPDIF); // WAVE_FORMAT_DOLBY_AC3_SPDIF
- IF_EQUAL_RETURN(guid, MFAudioFormat_DRM); // WAVE_FORMAT_DRM
- IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudioV8); // WAVE_FORMAT_WMAUDIO2
- IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudioV9); // WAVE_FORMAT_WMAUDIO3
- IF_EQUAL_RETURN(guid, MFAudioFormat_WMAudio_Lossless); // WAVE_FORMAT_WMAUDIO_LOSSLESS
- IF_EQUAL_RETURN(guid, MFAudioFormat_WMASPDIF); // WAVE_FORMAT_WMASPDIF
- IF_EQUAL_RETURN(guid, MFAudioFormat_MSP1); // WAVE_FORMAT_WMAVOICE9
- IF_EQUAL_RETURN(guid, MFAudioFormat_MP3); // WAVE_FORMAT_MPEGLAYER3
- IF_EQUAL_RETURN(guid, MFAudioFormat_MPEG); // WAVE_FORMAT_MPEG
- IF_EQUAL_RETURN(guid, MFAudioFormat_AAC); // WAVE_FORMAT_MPEG_HEAAC
- IF_EQUAL_RETURN(guid, MFAudioFormat_ADTS); // WAVE_FORMAT_MPEG_ADTS_AAC
-
- return NULL;
-}
-
-
-LPSTR DumpAttribute( _In_ const MF_ATTRIBUTE_TYPE& type,
- _In_ REFPROPVARIANT var)
-{
- CHAR *tempStr = NULL;
- tempStr = new CHAR[256];
- switch (type)
- {
- case MF_ATTRIBUTE_UINT32:
- if (var.vt == VT_UI4)
- {
- sprintf_s(tempStr, 256, "%u", var.ulVal);
- }
- break;
- case MF_ATTRIBUTE_UINT64:
- if (var.vt == VT_UI8)
- {
- sprintf_s(tempStr, 256, "%I64d (high: %d low: %d)", var.uhVal.QuadPart, var.uhVal.HighPart, var.uhVal.LowPart);
- }
- break;
- case MF_ATTRIBUTE_DOUBLE:
- if (var.vt == VT_R8)
- {
- sprintf_s(tempStr, 256, "%.4f", var.dblVal);
- }
- break;
- case MF_ATTRIBUTE_GUID:
- if (var.vt == VT_CLSID)
- {
- return DumpGUIDA(*var.puuid);
- }
- break;
- case MF_ATTRIBUTE_STRING:
- if (var.vt == VT_LPWSTR)
- {
- sprintf_s(tempStr, 256, "%S", var.pwszVal);
- }
- break;
- case MF_ATTRIBUTE_IUNKNOWN:
- break;
- default:
- printf("(Unknown Attribute Type = %d) ", type);
- break;
- }
- return tempStr;
-}
-
-CMediaTypePrinter::CMediaTypePrinter(
- _In_ IMFMediaType *_pMediaType )
- : pMediaType(_pMediaType),
- m_pBuffer(NULL)
-{
-}
-
-CMediaTypePrinter::~CMediaTypePrinter()
-{
- if (m_pBuffer)
- {
- delete(m_pBuffer);
- }
-}
-
-/*++
-Description:
-Rudimentary function to print the complete Media type
---*/
-PCHAR CMediaTypePrinter::ToCompleteString( )
-{
- HRESULT hr = S_OK;
- UINT32 attrCount = 0;
- GUID attrGuid = { 0 };
- char *tempStore = nullptr;
- PROPVARIANT var;
- LPSTR pTempBaseStr;
- MF_ATTRIBUTE_TYPE pType;
-
- if ( pMediaType && !m_pBuffer )
- {
- DMFTCHECKHR_GOTO(pMediaType->GetCount(&attrCount), done);
- buffLen = MEDIAPRINTER_STARTLEN;
- m_pBuffer = new char[buffLen];
- m_pBuffer[0] = 0;
- for ( UINT32 ulIndex = 0; ulIndex < attrCount; ulIndex++ )
- {
- PropVariantInit( &var );
- checkAdjustBufferCap( m_pBuffer, buffLen );
- DMFTCHECKHR_GOTO( pMediaType->GetItemByIndex( ulIndex, &attrGuid, &var ), done );
- DMFTCHECKHR_GOTO( pMediaType->GetItemType( attrGuid, &pType ), done );
- if ( ulIndex > 0 )
- strcat_s(m_pBuffer, MEDIAPRINTER_STARTLEN, " : ");
- strcat_s( m_pBuffer, buffLen, GetGUIDNameConst( attrGuid ) );
- strcat_s( m_pBuffer, buffLen, "=" );
- pTempBaseStr = DumpAttribute( pType, var );
- strcat_s( m_pBuffer, buffLen, pTempBaseStr );
- delete( pTempBaseStr );
- PropVariantClear( &var );
- }
- done:
- if ( tempStore )
- {
- delete( tempStore );
- }
- }
- return m_pBuffer;
-}
-
-/*++
-Description:
-Rudimentary function to print the Media type
---*/
-
-PCHAR CMediaTypePrinter::ToString()
-{
- //
- //Following are the important ones of Mediatype attributes
- //
-
- HRESULT hr = S_OK;
- PROPVARIANT var;
- LPSTR pTempBaseStr;
- MF_ATTRIBUTE_TYPE pType;
- GUID attrGuid;
- GUID impGuids[] = {
- MF_MT_SUBTYPE,
- MF_MT_FRAME_SIZE,
- MF_MT_SAMPLE_SIZE,
- MF_MT_FRAME_RATE,
- MF_MT_DEFAULT_STRIDE,
- MF_XVP_DISABLE_FRC
- };
-
- if (pMediaType && !m_pBuffer)
- {
- buffLen = MEDIAPRINTER_STARTLEN;
- m_pBuffer = new char[buffLen];
- m_pBuffer[0] = 0;
- for (UINT32 ulIndex = 0; ulIndex < ARRAYSIZE(impGuids); ulIndex++)
- {
- PropVariantInit(&var);
- checkAdjustBufferCap(m_pBuffer, buffLen);
- attrGuid = impGuids[ulIndex];
- DMFTCHECKHR_GOTO(pMediaType->GetItemType(attrGuid, &pType), done);
- DMFTCHECKHR_GOTO(pMediaType->GetItem(attrGuid, &var), done);
- if (ulIndex > 0)
- strcat_s(m_pBuffer, MEDIAPRINTER_STARTLEN, " : ");
- strcat_s(m_pBuffer, buffLen, GetGUIDNameConst(attrGuid));
- strcat_s(m_pBuffer, buffLen, "=");
- pTempBaseStr = DumpAttribute(pType, var);
- strcat_s(m_pBuffer, buffLen, pTempBaseStr);
- delete(pTempBaseStr);
- PropVariantClear(&var);
- }
- }
-done:
- return m_pBuffer;
-}
-/*++
-Description:
- Debug message printer to print the message passed through WPP
---*/
-void printMessageEvent(MFT_MESSAGE_TYPE msg)
-{
- switch (msg)
- {
- case MFT_MESSAGE_COMMAND_FLUSH:
- DMFTRACE(DMFT_GENERAL, TRACE_LEVEL_INFORMATION, "%!FUNC! :PROCESSMESSAGE: MFT_MESSAGE_COMMAND_FLUSH");
- break;
- case MFT_MESSAGE_COMMAND_DRAIN:
- DMFTRACE(DMFT_GENERAL, TRACE_LEVEL_INFORMATION, "%!FUNC! :PROCESSMESSAGE: MFT_MESSAGE_COMMAND_DRAIN");
- break;
- case MFT_MESSAGE_COMMAND_MARKER:
- DMFTRACE(DMFT_GENERAL, TRACE_LEVEL_INFORMATION, "%!FUNC! :PROCESSMESSAGE: MFT_MESSAGE_COMMAND_MARKER");
- break;
- case MFT_MESSAGE_COMMAND_TICK:
- DMFTRACE(DMFT_GENERAL, TRACE_LEVEL_INFORMATION, "%!FUNC! :PROCESSMESSAGE: MFT_MESSAGE_COMMAND_TICK");
- break;
- case MFT_MESSAGE_NOTIFY_END_OF_STREAM:
- DMFTRACE(DMFT_GENERAL, TRACE_LEVEL_INFORMATION, "%!FUNC! :PROCESSMESSAGE: MFT_MESSAGE_NOTIFY_END_OF_STREAM");
- break;
- case MFT_MESSAGE_NOTIFY_BEGIN_STREAMING:
- DMFTRACE(DMFT_GENERAL, TRACE_LEVEL_INFORMATION, "%!FUNC! :PROCESSMESSAGE: MFT_MESSAGE_NOTIFY_BEGIN_STREAMING");
- break;
- case MFT_MESSAGE_NOTIFY_START_OF_STREAM:
- DMFTRACE(DMFT_GENERAL, TRACE_LEVEL_INFORMATION, "%!FUNC! :PROCESSMESSAGE: MFT_MESSAGE_NOTIFY_START_OF_STREAM");
- break;
- case MFT_MESSAGE_DROP_SAMPLES:
- DMFTRACE(DMFT_GENERAL, TRACE_LEVEL_INFORMATION, "%!FUNC! :PROCESSMESSAGE: MFT_MESSAGE_DROP_SAMPLES");
- break;
- case MFT_MESSAGE_SET_D3D_MANAGER:
- DMFTRACE(DMFT_GENERAL, TRACE_LEVEL_INFORMATION, "%!FUNC! :PROCESSMESSAGE: MFT_MESSAGE_SET_D3D_MANAGER");
- break;
-
- }
-}
-
-/*++
-Below functions not used in the current iteration..
---*/
-HRESULT CreateCodec(
- _In_opt_ IMFMediaType* inMediaType,
- _In_opt_ IMFMediaType *outMediaType,
- _In_ BOOL operation /*True = Encode, False = Decode*/,
- _Out_ IMFTransform **pTransform)
-{
- UNREFERENCED_PARAMETER(inMediaType);
- UNREFERENCED_PARAMETER(outMediaType);
- UNREFERENCED_PARAMETER(operation);
- UNREFERENCED_PARAMETER(pTransform);
- HRESULT hr = S_OK;
- *pTransform = nullptr;
- return hr;
-}
-
-
-HRESULT CheckDX9RotationSupport(_In_ ID3D11VideoDevice* pVideoDevice)
-{
- HRESULT hr = S_OK;
- //
- // check if the DX9 device is ok
- // New drivers should have an DXVA-HD rotation cap set
- //
- D3D11_VIDEO_PROCESSOR_CONTENT_DESC desc = {};
- D3D11_VIDEO_PROCESSOR_CAPS caps;
- ComPtr<ID3D11VideoProcessorEnumerator> spVideoProcEnum = nullptr;
-
- DMFTCHECKNULL_GOTO(pVideoDevice, done, E_NOTIMPL);
- desc.InputWidth = 640;
- desc.InputHeight = 480;
- desc.OutputWidth = 640;
- desc.OutputHeight = 480;
-
- DMFTCHECKHR_GOTO(pVideoDevice->CreateVideoProcessorEnumerator(&desc, &spVideoProcEnum), done);
- DMFTCHECKHR_GOTO(spVideoProcEnum->GetVideoProcessorCaps(&caps), done);
-
- if (!(caps.FeatureCaps & D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_ROTATION))
- {
- hr = E_NOTIMPL;
- }
-done:
- return hr;
-}
-
-
-
-HRESULT IsDXOptimal(_In_ IUnknown *pDeviceManager, _Out_ BOOL *pIsOptimal)
-{
- HRESULT hr = S_OK;
- ComPtr<IMFDXGIDeviceManager> spDXGIDeviceManager = nullptr;
- ComPtr<ID3D11Device> spD3D11 = nullptr;
- ComPtr<ID3D11VideoDevice> spVideoDevice = nullptr;
- HANDLE hDevice = NULL;
- BOOL locked = FALSE;
-
- *pIsOptimal = false;
- DMFTCHECKNULL_GOTO( pDeviceManager, done, E_INVALIDARG );
- DMFTCHECKHR_GOTO( pDeviceManager->QueryInterface(IID_PPV_ARGS( &spDXGIDeviceManager )), done );
- DMFTCHECKHR_GOTO( spDXGIDeviceManager->OpenDeviceHandle( &hDevice ), done );
- DMFTCHECKHR_GOTO( spDXGIDeviceManager->LockDevice( hDevice, IID_PPV_ARGS( &spD3D11 ), TRUE), done );
- locked = TRUE;
- DMFTCHECKHR_GOTO( spD3D11.As(&spVideoDevice), done );
-
- if (spD3D11->GetFeatureLevel() <= D3D_FEATURE_LEVEL_9_3)
- {
- if (FAILED(CheckDX9RotationSupport(spVideoDevice.Get())))
- {
- goto done;
- }
- }
- *pIsOptimal = TRUE;
-done:
- if (hDevice)
- {
- if (locked)
- {
- spDXGIDeviceManager->UnlockDevice(hDevice, false);
- }
- spDXGIDeviceManager->CloseDeviceHandle(hDevice);
- }
- return hr;
-}
-
-
-//
-// Used to check if the pin is a custom pin or not!!
-//
-
-STDMETHODIMP CheckCustomPin(
- _In_ CInPin * pPin,
- _Inout_ PBOOL pIsCustom
- )
-{
- HRESULT hr = S_OK;
- DMFTCHECKNULL_GOTO( pPin, done, E_INVALIDARG);
- DMFTCHECKNULL_GOTO( pIsCustom, done, E_INVALIDARG);
-
- *pIsCustom = false;
-
-#if defined _CPPRTTI
- if (dynamic_cast<CCustomPin*>(pPin) != nullptr)
- {
- *pIsCustom = true;
- }
- else
-#endif
- {
- GUID categoryGUID = GUID_NULL;
- if (SUCCEEDED(pPin->GetGUID(MF_DEVICESTREAM_STREAM_CATEGORY, &categoryGUID))
- && IsEqualCLSID(categoryGUID, AVSTREAM_CUSTOM_PIN_IMAGE))
- {
- *pIsCustom = true;
- }
- }
-done:
- return hr;
-}
-