aduadu

aduadu

0个粉丝

98

问答

0

专栏

45

资料

aduadu  发布于  2008-06-04 21:24:15
采纳率 0%
98个问答
4158

DirectShow的应用2

DMO与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();
}

  而对于DMO的直接使用,以下几点是要特别注意的。

  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的。
我来回答
回答0个
时间排序
认可量排序
易百纳技术社区暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区