如何将数据从 CRenderedInputPin::Receive 传递到另一个线程

Junjie Zhu - MSFT 16,071 信誉分 Microsoft 供应商
2024-03-12T07:11:45.79+00:00

我有一个DirectShow筛选器(派生自 CRenderedInputPin),必须从其上游接收数据(MyInputPin::Receive(IMediaSample *pSample)) 并将其写入文件或网络。写入(到文件/网络)过程可能不是很快,所以我将它放在一个单独的写入线程中。我想立即将数据从 *pSample 缓冲区传递到写入过程,以避免不必要的数据复制。

问题 1:如何保证 MyInputPin::Receive()退出后,*pSample 缓冲区不会被释放?调用 pSample->AddRef() 来阻止释放并在写入线程中调用 pSample->Release() 来强制释放缓冲区就足够了吗?

问题 2:如果我不将写入过程放在单独的线程中,DS 是否会为下一个数据部分调用 Receive(我将返回 ReceiveCanBlock== S_OK)?

此问题由:How can I pass data from CRenderedInputPin::Receive to another thread - Microsoft Q&A总结而来

Windows API - Win32
Windows API - Win32
一组适用于桌面和服务器应用程序的核心 Windows 应用程序编程接口 (API)。 以前称为 Win32 API。
57 个问题
C++
C++
一种通用的高级编程语言,作为 C 编程语言的扩展而创建,除了用于低级别内存操作的功能外,还具有面向对象、泛型和功能性等特点。
103 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Tong Xu - MSFT 2,116 信誉分 Microsoft 供应商
    2024-03-12T07:59:08.09+00:00

    你好

    欢迎来到 Microsoft Q&A!

    根据 CBaseInputPin.Receive 方法,
    问题 1:是,如果引脚使用工作线程处理样本,请在此方法内向样本添加引用计数。方法返回后,上游引脚释放样品。当样本的参考计数达到零时,样本将返回到分配器进行重复使用。
    问题 2:DirectShow 不应在上一次接收阻止时再次调用 Rece。但是,如果 Receive 方法可能会阻塞,则上游筛选器可能会决定使用缓冲数据的工作线程。有关此策略的实现,请参阅 COutputQueue 类。

    谢谢。


    如果答案是正确的解决方案,请单击“接受答案”并请投赞成票。如果您对此答案有其他疑问,请点击“评论”。

    注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知。

    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助