DMO(DirectX Media Object)的工程创建过程及其调用方式

阅读: 评论:0

DMO(DirectX Media Object)的工程创建过程及其调用方式

DMO(DirectX Media Object)的工程创建过程及其调用方式

DMO(DirectX Media Object)的工程创建过程及其调用方式 1.1               DMO的工程创建过程 DMO其实就是一个COM组件,是一个加了微软一种媒体处理解决方案的特殊的COM。因此你可以使用Visual C++的ATL来实现,此次创建的工程是以Visual C++2003+WinxpSp2为开发平台。 下面说明如何使用ATL创建一个工程: 1)        启动Visual C++2003 2)        点击“文件”->“新建”->“工程”->“项目” 3)        选择“Visual C++项目”->“ATL”->选择“ATL项目”->“名称”里输入工程名,如“TestDMO” 4)        去掉“属性化”选项->点击“完成” 5)        鼠标右键选中“TestDMO”工程名->“添加”->“添加类”,选择“ATL简单对象”->点击下面的“打开”->在“简称”里输入如“TestEncoder”->点击左边的“选项”->“线程模型”为“两者”->勾上右边的“自由线程封送拆收器”,其它选项默认。 6)        去掉“CTestEncoder”继承模板“IDispatchImpl”及COM_INTERFACE_ENTRY(IDispatch) 7)        如果你不需要外部输入参数至DMO,你可以将idl文件去掉,并且注释掉“rc资源文件”中的tlb信息 8)        “CTestEncoder”继承于IMediaObjectImpl<CTestEncoder, 1, 2>模板类,其中1代表DMO有一个输入,2代表有两个输出 9)        在BEGIN_COM_MAP下加接口映射:COM_INTERFACE_ENTRY(IMediaObject) 10)     在“DLL注册”CPP文件最上面加入如下语句:#define FIX_LOCK_NAME #include <dmo.h> #include <dmoimpl.h> #include <initguid.h> #include <limits.h> 11)     在“DllRegisterServer”中注册DMO,代码:DMORegister(L"TestEncoderDMO",CLSID_TestEncoder,DMOCATEGORY_VIDEO_ENCODER,0,0,NULL,0,NULL); 12)     在“DllUnregisterServer”注销DMO,代码:DMOUnregister(CLSID_TestEncoder,DMOCATEGORY_VIDEO_ENCODER); 13)     实现“IMediaObjectImpl模板类”的17个必须实现的方法。 1.2               使用DMO的方法 1.2.1           应用程序使用DMO的方法 IMediaObject *m_pDMO; ITestEncoder *m_pEncoder;//如果自定义了接口,可以使用QueryInterface方法查询 HRESULT hr = CoCreateInstance(CLSID_TestEncoder, NULL, CLSCTX_INPROC, IID_IMediaObject, (void **)&m_pDMO); if(FAILED(hr)) { _tprintf(_T("/nERROR - Could not create the DMO./n")); return E_INVALIDARG; } //如果没有自定义的接口,下面代码可以省略 hr = m_pDMO->QueryInterface(IID_ITestEncoder, (void**)&m_pEncoder); if (FAILED(hr)) { _tprintf(_T("/nERROR - Could not QueryInterface the TestFace./n")); return E_INVALIDARG; } 1.2.2           DirectShow Filter Graph中加入DMO的方法 IBaseFilter *pFilter; HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void **>(&pFilter)); if(SUCCEEDED(hr)) { IDMOWrapperFilter *pDmoWrapper; hr = pFilter->QueryInterface(IID_IDMOWrapperFilter, (void**)&pDmoWrapper); if(SUCCEEDED(hr)) { hr = pDMOWrapper->Init(CLSID_TestEncoder, DMOCATEGORY_VIDEO_ENCODER); pDmoWrapper->Release(); if(SUCCEEDED(hr)) { hr = pGraph->AddFilter(pFilter, L"TestEncoder"); } } pFilter->Release(); } 1.2.3           设置媒体类型 对于DMO处理数据之前,必须先设置输入与输出的媒体类型,可选流(Optional Stream)除外,使用DMO_MEDIA_TYPE结构设置媒体类型,使用DMO的SetInputType与SetOutputType设置输入输出媒体类型。 设置媒体类型的原则: 1)        对于解码DMO,一般先设置输入流媒体类型,然后再设置输出流的媒体类型 2)        对于编码DMO,一般先设置输出流媒体类型,然后再设置输入流的媒体类型 3)        对于音效DMO,一般使用可选流(Optinal Stream),可以不设媒体类型 1.2.4           DMO处理数据 DMO一般有两种数据处理方式,普通方式和“Inplace”方式。每个对象都要实现IMediaObject接口(可以继承于IMediaObjectImpl类作简化操作),普通方式是通过这个接口的IMediaObject::ProcessInput处理输入流数据,IMediaObject::ProcessOutput处理输出流数据。“Inplace”方式处理数据,必须依赖于“IMediaObjectInPlace”这个接口,因此除了继承“IMediaObject”接口外还要继承“IMediaObjectInPlace”,通过调用IMediaObject::Process来处理数据。 对于编码DMO来说,就是将所要编码的数据使用ProcessInput方法给DMO编码,编码完成后使用ProcessOutput方法取出编码数据。解码DMO类似。  

本文发布于:2024-02-02 18:37:14,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170687029845684.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:过程   方式   工程   DirectX   DMO
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23