// ASCExternalVideoFormat.h : Declaration of the CASCExternalVideoFormat #pragma once #include "resource.h" // main symbols #include "vfw.h" #include "ATLDefine.h" //#include "ASCVideoFormat.h" class CAVSExternalVideoFormat; // IAVSExternalVideoFormat [object,uuid("F955F716-8FC4-4026-9B74-4C377C4E3C70"),dual,pointer_default(unique)] __interface IAVSExternalVideoFormat : IAVSVideoFormat { [id(114000 + 1), propget] HRESULT ExtraData([out, retval, satype("byte")] SAFEARRAY **pExtraData); [id(114000 + 1), propput] HRESULT ExtraData([in, satype("byte")] SAFEARRAY **pExtraData); [id(114000 + 2), propget] HRESULT KeyFrameInterval([out, retval] long* pVal); [id(114000 + 2), propput] HRESULT KeyFrameInterval([in] long newVal); [id(114000 + 3), propget] HRESULT Quality([out, retval] long* pVal); [id(114000 + 3), propput] HRESULT Quality([in] long newVal); [id(114000 + 5)] HRESULT Configure([in,defaultvalue(NULL)]long* hWND,[in,out,defaultvalue(NULL)] RECT* RectWindow); }; // CAVSExternalVideoFormat template class CAVSExternalVideoFormatImpl : public CAVSVideoFormatImpl { public: CAVSExternalVideoFormatImpl() { m_Quality=0; m_KeyFrameInterval=0; m_pExtraData=NULL; m_lMediaType = MEDIAFORMAT_EXTERNAL; m_lColorSpace = CSP_BGR; SetDefaultProperties(); } virtual ~CAVSExternalVideoFormatImpl() { RELEASEARRAY(m_pExtraData); } STDMETHOD(Configure)(long *hWnd,RECT* RectWindow) { HIC hic=ICOpen(ICTYPE_VIDEO, m_ulfccHandler, ICMODE_QUERY); if (hic==NULL) return S_OK; if (hWnd==NULL) hWnd=(long*)GetDesktopWindow(); if (ICConfigure(hic,(HWND) hWnd)!=ICERR_OK) { ICClose(hic); return S_OK; } ///////////////////////////// ////Дополнительные параметры - могут использоваться в пресетах и... RELEASEARRAY(m_pExtraData); long DataSize = ICGetStateSize(hic); m_pExtraData = SafeArrayCreateVector(VT_UI1,0,DataSize); ICGetState(hic, m_pExtraData->pvData, DataSize); ICClose(hic); return S_OK; } LINK_PROPERTY_LONG(Quality,m_Quality); LINK_PROPERTY_LONG(KeyFrameInterval,m_KeyFrameInterval); STDMETHOD(get_ExtraData)(SAFEARRAY **pExtraData) { if (NULL==pExtraData) return S_OK; SafeArrayCopy(m_pExtraData, pExtraData); return S_OK; } STDMETHOD(put_ExtraData)(SAFEARRAY **pExtraData) { if (NULL==pExtraData) return S_OK; RELEASEARRAY(m_pExtraData); if (NULL!=(*pExtraData)) SafeArrayCopy(*pExtraData, &m_pExtraData); return S_OK; } STDMETHOD(CreateDuplicate)(IAVSMediaFormat** pMediaFormat) { CAVSVideoFormatImpl::CreateDuplicate(pMediaFormat); if ((*pMediaFormat)!=NULL) { IAVSExternalVideoFormat * pExternalFormat=NULL; (*pMediaFormat)->QueryInterface(__uuidof(IAVSExternalVideoFormat), (void**)&pExternalFormat); if (NULL==pExternalFormat) { RELEASEINTERFACE((*pMediaFormat)); return S_OK; } if (NULL==m_pExtraData) pExternalFormat->put_ExtraData(NULL); else pExternalFormat->put_ExtraData(&m_pExtraData); pExternalFormat->put_Quality(m_Quality); pExternalFormat->put_KeyFrameInterval(m_KeyFrameInterval); pExternalFormat->Release(); } return S_OK; } STDMETHOD(put_fccHandler)(ULONG newVal) { CAVSVideoFormatImpl::put_fccHandler(newVal); RELEASEARRAY(m_pExtraData); if (m_lInternalCodecType!=0)return S_OK; /// fill ExtraData HIC hic=ICOpen(ICTYPE_VIDEO, m_ulfccHandler, ICMODE_QUERY); if (hic==NULL) return S_OK; long DataSize = ICGetStateSize(hic); m_pExtraData = SafeArrayCreateVector(VT_UI1,0,DataSize); ICGetState(hic, m_pExtraData->pvData, DataSize); ICClose(hic); return S_OK; } STDMETHOD(SetDefaultProperties)(void) { m_Quality=0; m_KeyFrameInterval=0; RELEASEARRAY(m_pExtraData); CAVSVideoFormatImpl::SetDefaultProperties(); return S_OK; } STDMETHOD(SetPropertiesByFormat)(IAVSMediaFormat* pMediaFormat) { RELEASEARRAY(m_pExtraData); CAVSVideoFormatImpl::SetPropertiesByFormat(pMediaFormat); if (pMediaFormat!=NULL) { IAVSExternalVideoFormat* pAVSExternalFormat=NULL; pMediaFormat->QueryInterface(__uuidof(IAVSH263VideoFormat), (void**)&pAVSExternalFormat); if (pAVSExternalFormat!=NULL) { RELEASEARRAY(m_pExtraData); pAVSExternalFormat->get_ExtraData(&m_pExtraData); pAVSExternalFormat->get_KeyFrameInterval(&m_KeyFrameInterval); pAVSExternalFormat->get_Quality(&m_Quality); RELEASEINTERFACE(pAVSExternalFormat); } } return S_OK; } STDMETHOD(SetAdditionalParam)(BSTR ParamName, VARIANT ParamValue) { //Здесь проверяем параметры относящиеся к AVSH263VideoFormat return CAVSVideoFormatImpl::SetAdditionalParam(ParamName, ParamValue); } STDMETHOD(GetAdditionalParam)(BSTR ParamName, VARIANT* ParamValue) { //Здесь проверяем параметры относящиеся к AVSH263VideoFormat return CAVSVideoFormatImpl::GetAdditionalParam(ParamName, ParamValue); } public: protected: LPSAFEARRAY m_pExtraData; long m_KeyFrameInterval; long m_Quality; }; [ coclass, threading(apartment), vi_progid("AVSMediaFormatSettings3.AVSExternalVide"), progid("AVSMediaFormatSettings3.AVSExternalVi.1"), version(1.0), uuid("9AFD5DEF-68D0-4864-9E8C-61764F487B8E") ] class ATL_NO_VTABLE CAVSExternalVideoFormat : public CAVSExternalVideoFormatImpl { };