/* * File: vcmcaps.cpp * * Base VCM implementation of Microsoft Network Audio capability object. * * Revision History: * * 12/20/95 mikev created * 06/11/96 mikev separated protocol implementation specifics into * msiacaps.cpp (the original proprietary version) and * vcmh323.cpp (H.323/H.245 implementation) * 07/28/96 philf added support for video */ #include "precomp.h" //UINT uVidNumLocalFormats =0; // # of active entries in pLocalFormats //UINT uVidLocalFormatCapacity=0; // size of pLocalFormats (in multiples of VIDCAP_DETAILS) //UINT uVidStaticRef = 0; // global ref count //UINT uVidNumCustomDecodeFormats=0; // # of custom entries for decode //VIDEO_FORMAT_ID VIDsByRank[MAX_CAPS_PRESORT]; // the best 16 ranked formats, sorted (descending, best first) //AUDIO_FORMAT_ID IDsByBandwidth[MAX_CAPS_PRESORT]; // ascending, least BW reqirement first //AUDIO_FORMAT_ID IDsByLossTolerance[MAX_CAPS_PRESORT]; // descending, most tolerant first //AUDIO_FORMAT_ID IDsByCPULoad[MAX_CAPS_PRESORT]; // ascending, lightest load first //#pragma data_seg() PVCMFORMATDETAILS pvfd_g; static UINT uMaxFormatSize =0; PVIDEOFORMATEX lpScratchFormat = NULL; BOOL __stdcall VCMFormatEnumCallback(HVCMDRIVERID hvdid, PVCMDRIVERDETAILS pvdd, PVCMFORMATDETAILS pvfd, DWORD_PTR dwInstance); CVcmCapability::CVcmCapability() :m_dwDeviceID(VIDEO_MAPPER) { } CVcmCapability::~CVcmCapability() { } // FormatEnum() is the root level enumeration of VCM formats. Each permutation of // format tag, bits per sample, and sample rate is considered a unique format // and will have a unique registry entry if it is "enabled" for internet video // vcmFormatEnum() calls VCMFormatEnumCallback(). BOOL CVcmCapability::FormatEnum(CVcmCapability *pCapObject, DWORD dwFlags) { MMRESULT mResult; VCMDRIVERDETAILS vdd; VCMFORMATDETAILS vfd; if(!GetVideoFormatBuffer()) return FALSE; vdd.dwSize = sizeof(VCMDRIVERDETAILS); vfd.cbStruct = sizeof(VCMFORMATDETAILS); vfd.pvfx = lpScratchFormat; vfd.cbvfx = uMaxFormatSize; vfd.szFormat[0]=(WCHAR)0; mResult = vcmFormatEnum(m_dwDeviceID, VCMFormatEnumCallback, &vdd, &vfd, (DWORD_PTR)pCapObject, dwFlags | VCM_FORMATENUMF_BOTH); if(lpScratchFormat) { MemFree(lpScratchFormat); lpScratchFormat=NULL; } if(mResult != MMSYSERR_NOERROR) { return FALSE; } return TRUE; } // default implementation of FormatEnumHandler does nothing BOOL CVcmCapability::FormatEnumHandler(HVCMDRIVERID hvdid, PVCMFORMATDETAILS pvfd, VCMDRIVERDETAILS *pvdd, DWORD_PTR dwInstance) { return FALSE; } BOOL __stdcall VCMFormatEnumCallback(HVCMDRIVERID hvdid, PVCMDRIVERDETAILS pvdd, PVCMFORMATDETAILS pvfd, DWORD_PTR dwInstance) { CVcmCapability *pCapability = (CVcmCapability *)dwInstance; return pCapability->FormatEnumHandler(hvdid, pvfd, pvdd, dwInstance); } BOOL GetVideoFormatBuffer() { // Get size of largest VIDEOFORMATEX structure in the system MMRESULT mResult; if((mResult = vcmMetrics(NULL, VCM_METRIC_MAX_SIZE_FORMAT, (LPVOID) &uMaxFormatSize)) != MMSYSERR_NOERROR) { ERRORMESSAGE(("GetFormatBuffer: vcmMetrics failed:0x%08lX\r\n",mResult)); return FALSE; } if(!(lpScratchFormat = (PVIDEOFORMATEX) MemAlloc(uMaxFormatSize))) { ERRORMESSAGE(("GetFormatBuffer: allocation failed\r\n")); return FALSE; } ZeroMemory(lpScratchFormat, uMaxFormatSize); return TRUE; }