/* * Implements ACM Wrapper(CLSID_ACMWrapper). * * FIXME - stub * * Copyright (C) 2002 Hidenori TAKESHIMA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "config.h" #include "windef.h" #include "winbase.h" #include "wingdi.h" #include "winuser.h" #include "winerror.h" #include "msacm.h" #include "strmif.h" #include "control.h" #include "amvideo.h" #include "vfwmsgs.h" #include "uuids.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(quartz); #include "quartz_private.h" #include "xform.h" static const WCHAR ACMWrapper_FilterName[] = {'A','C','M',' ','W','r','a','p','p','e','r',0}; typedef struct CACMWrapperImpl { HACMSTREAM has; } CACMWrapperImpl; /*************************************************************************** * * CACMWrapperImpl methods * */ static void ACMWrapper_Close( CACMWrapperImpl* This ) { if ( This->has != (HACMSTREAM)NULL ) { acmStreamReset( This->has, 0 ); acmStreamClose( This->has, 0 ); This->has = (HACMSTREAM)NULL; } } static HRESULT ACMWrapper_Init( CTransformBaseImpl* pImpl ) { CACMWrapperImpl* This = pImpl->m_pUserData; TRACE("(%p)\n",This); if ( This != NULL ) return NOERROR; This = (CACMWrapperImpl*)QUARTZ_AllocMem( sizeof(CACMWrapperImpl) ); if ( This == NULL ) return E_OUTOFMEMORY; ZeroMemory( This, sizeof(CACMWrapperImpl) ); pImpl->m_pUserData = This; /* construct */ This->has = (HACMSTREAM)NULL; return E_NOTIMPL; } static HRESULT ACMWrapper_Cleanup( CTransformBaseImpl* pImpl ) { CACMWrapperImpl* This = pImpl->m_pUserData; TRACE("(%p)\n",This); if ( This == NULL ) return NOERROR; /* destruct */ ACMWrapper_Close( This ); QUARTZ_FreeMem( This ); pImpl->m_pUserData = NULL; return S_OK; } static HRESULT ACMWrapper_CheckMediaType( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut ) { CACMWrapperImpl* This = pImpl->m_pUserData; FIXME("(%p)\n",This); if ( This == NULL ) return E_UNEXPECTED; return E_NOTIMPL; } static HRESULT ACMWrapper_GetOutputTypes( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE** ppmtAcceptTypes, ULONG* pcAcceptTypes ) { CACMWrapperImpl* This = pImpl->m_pUserData; HRESULT hr; FIXME("(%p)\n",This); hr = ACMWrapper_CheckMediaType( pImpl, pmtIn, NULL ); if ( FAILED(hr) ) return hr; return E_NOTIMPL; } static HRESULT ACMWrapper_GetAllocProp( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut, ALLOCATOR_PROPERTIES* pProp, BOOL* pbTransInPlace, BOOL* pbTryToReuseSample ) { CACMWrapperImpl* This = pImpl->m_pUserData; HRESULT hr; FIXME("(%p)\n",This); if ( This == NULL ) return E_UNEXPECTED; hr = ACMWrapper_CheckMediaType( pImpl, pmtIn, pmtOut ); if ( FAILED(hr) ) return hr; *pbTransInPlace = FALSE; *pbTryToReuseSample = FALSE; return E_NOTIMPL; } static HRESULT ACMWrapper_BeginTransform( CTransformBaseImpl* pImpl, const AM_MEDIA_TYPE* pmtIn, const AM_MEDIA_TYPE* pmtOut, BOOL bReuseSample ) { CACMWrapperImpl* This = pImpl->m_pUserData; FIXME("(%p,%p,%p,%d)\n",This,pmtIn,pmtOut,bReuseSample); if ( This == NULL ) return E_UNEXPECTED; return E_NOTIMPL; } static HRESULT ACMWrapper_ProcessReceive( CTransformBaseImpl* pImpl, IMediaSample* pSampIn ) { CACMWrapperImpl* This = pImpl->m_pUserData; BYTE* pDataIn = NULL; LONG lDataInLen; HRESULT hr; FIXME("(%p)\n",This); if ( This == NULL ) return E_UNEXPECTED; hr = IMediaSample_GetPointer( pSampIn, &pDataIn ); if ( FAILED(hr) ) return hr; lDataInLen = IMediaSample_GetActualDataLength( pSampIn ); return E_NOTIMPL; } static HRESULT ACMWrapper_EndTransform( CTransformBaseImpl* pImpl ) { CACMWrapperImpl* This = pImpl->m_pUserData; TRACE("(%p)\n",This); if ( This == NULL ) return E_UNEXPECTED; ACMWrapper_Close( This ); return S_OK; } static const TransformBaseHandlers transhandlers = { ACMWrapper_Init, ACMWrapper_Cleanup, ACMWrapper_CheckMediaType, ACMWrapper_GetOutputTypes, ACMWrapper_GetAllocProp, ACMWrapper_BeginTransform, ACMWrapper_ProcessReceive, NULL, ACMWrapper_EndTransform, }; HRESULT QUARTZ_CreateACMWrapper(IUnknown* punkOuter,void** ppobj) { return QUARTZ_CreateTransformBase( punkOuter,ppobj, &CLSID_ACMWrapper, ACMWrapper_FilterName, NULL, NULL, &transhandlers ); }