DMO,DirectX媒体对象(DirectX Media Objects,简称DMOs)
2012-12-16 15:25
225 查看
DMO
求助编辑百科名片
DirectX媒体对象(DirectX Media Objects,简称DMOs),是微软提供的一种流数据处理COM组件。与DirectShow filter相比,DMO有很多相似之处。对filter原理的熟悉,将会大大帮助你对DMO的学习。另外,DMO也因其结构简单、易于创建和使用而倍受微软推崇。关于DMO的使用方式,目前大概有两种:一种是应用程序直接使用DMO,另一种就是在DirectShow filter中的应用。后者比较简单,只是使用了一个DMOwrapper filter。在DirectShow应用程序中,DMO是对用户透明的,所有使用DMO的工作均由DMO wrapper filter来完成。
目录
DMO与DirectShow filter的对比使用方式
编辑本段DMO与DirectShow filter的对比
1. DMO比filter实现的功能要少很多,这使得DMO“体积”很小;2. DMO使用起来比filter更有灵活性。DMO的使用不需要filter graph,应用程序可以直接与DMO交互。而DMO也可以通过一个DMO wrapper filter工作于DirectShow环境;
3. DMO总是同步处理数据,不像filter有独立的数据传送线程,需要考虑多线程编程问题;
4. 与传统的编解码管理器ACM、VCM相比,用DMO开发的编解码器是基于COM的,更易于扩展。并且DMO支持多个输入和多个输出;
5. DMO不需要像filter一样分配数据传送的内存,而有DMO的使用者负责;
6. DMO是一个独立功能模块,不需要像filter一样连接成一条链路;
7. DMO不需要像filter一样将数据“推”下去,数据的输入输出都是由DMO的使用者完成的;
所有这些优点,使得DMO成为微软对于Encoder和Decoder开发的重点推荐模式。DirectX 9.0 SDK中,微软更是把DMO从DirectShow中分离出来,而对于一些transform filter,微软也推荐用DMO的方式来替换。
编辑本段使用方式
关于DMO的使用方式,目前大概有两种:一种是应用程序直接使用DMO,另一种就是在DirectShow filter中的应用。后者比较简单,只是使用了一个DMO wrapper filter。在DirectShow应用程序中,DMO是对用户透明的,所有使用DMO的工作均由DMO wrapper filter来完成。参见下面的代码。// Create the DMO Wrapper filter. IBaseFilter *pFilter; HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&pFilter)); if (SUCCEEDED(hr)) { // Query for IDMOWrapperFilter. IDMOWrapperFilter *pDmoWrapper; hr = pFilter->QueryInterface(IID_IDMOWrapperFilter, reinterpret_cast<void**>(&pDmoWrapper)); if (SUCCEEDED(hr)) { // Initialize the filter. hr = pDmoWrapper->Init(CLSID_MyDMO, DMOCATEGORY_VIDEO_EFFECT); pDmoWrapper->Release(); if (SUCCEEDED(hr)) { // Add the filter to the graph. hr = pGraph->AddFilter(pFilter, L"My DMO"); } } pFilter->Release(); } |
1. 在处理数据之前,必须为每条输入输出stream设置media type(Optional stream除外);
2. 从DMO从获取的media type未必包含format块,但是在给DMO设置media type时,务必带上这部分信息(MIDI除外);
3. 应用程序必须自己负责分配数据缓存。缓存的大小可以通过调用DMO的IMediaObject::GetInputSizeInfo或IMediaObject::GetOutputSizeInfo得到。DMO使用的数据缓存也是一个COM对象,支持ImediaBuffer接口,与DirectShow filter的Media Sample类似。
4. 一般的DMO依次调用IMediaObject::ProcessInput和IMediaObject::ProcessOutput处理数据,In-Place的DMO调用IMediaObjectInPlace::Process处理数据。两套方法不能混用。
5. 在调用ProcessOutput时,如果返回的标记是DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE,说明数据的数据还没有完全取出,需要再次调用ProcessOutput。
6. 所有输入数据都已输入完成,应该调用DMO的IMediaObject::Discontinuity方法。
7. 如果你想中断数据处理流程,调用DMO的IMediaObject::Flush。
8. 区别两种不同的可丢弃stream,标记分别为DMO_OUTPUT_STREAMF_OPTIONAL和DMO_OUTPUT_STREAMF_DISCARDABLE。注意,后者是要设置media type的。
相关文章推荐
- DMO(DirectX Media Object)的工程创建过程及其调用方式
- DirectX Media Objects
- 深入理解BootStrap -- 媒体对象(media)15
- directx的媒体对象
- DMO(DirectX Media Object)的工程创建过程及其调用方式
- DMO(DirectX Media Object)的工程创建过程及其调用方式
- 关于微软的DMO(Directx Media Object)MSDN翻译文章(一)
- DMO(DirectX Media Object)的工程创建过程及其调用方式
- directx的媒体对象
- 媒体对象--media
- 深入理解BootStrap Item15 -- 媒体对象(media)
- bootstrap-媒体对象-对齐
- const Pointers and Pointer to const Objects 常量指针和指向常量对象的指针
- Pro Media Tools for Mac(专业媒体工具) V1.6.1 破解版
- css3 media媒体查询器用法总结
- Bootstrap基础13——媒体media
- 媒体查询media
- AxWindowsMediaPlayer媒体文件主要方法属性
- Classes and Objects :类和对象(2)
- (十)进度条媒体对象和 Well 组件