强制第三方DirectShow过滤器使用自定义分配器

时间:2016-06-21 06:15:31

标签: c++ windows memory-management directshow

在第三方过滤器中使用自定义分配器的原因:

我有一个NUMA系统,并且在错误的NUMA节点上分配内存的过滤器会导致性能问题并丢弃从相机接收的图像。

我目前的做法:

我会编写一个函数来迭代所有过滤器并询问它们的输入引脚是否有分配器。然后我问这个分配器我的特殊分配器接口,最后如果找不到接口我创建新的自定义分配器并应用与前一个分配器相同的属性。然后我在输入引脚上调用$file = '/path/to/your/dir/'.$file; if(!$file){ // file does not exist die('file not found'); } else { header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename=$file"); header("Content-Type: application/zip"); header("Content-Transfer-Encoding: binary"); // read the file from disk readfile($file); } 以通知它有关新分配器的信息。

我试图在图形构建中的不同时间调用此函数;目前在NotifyAllocator之后和IMediaControl::Pause之前,但我的自定义分配器未被任何第三方过滤器使用。样本驻留在错误的NUMA节点上。

此外,我还跟踪在IMediaControl::Run调用期间创建的线程,并将其线程关联性更改为正确的CPU,因此通常这些DirectShow过滤器应具有正确的NUMA节点,因为它们应在其NUMA节点上分配运行CPU。

1 个答案:

答案 0 :(得分:0)

您无法使用NotifyAllocator覆盖分配器。输出引脚决定分配器使用,在内部存储指针并通知输入引脚。您不能在外部更换分配器,至少不能在引脚连接时更换。

某些过滤器依赖于自己的分配器,而无法与其他过滤器一起使用。对于分配器替换没有通用的解决方案,特定的过滤器可能会因为输出引脚可能对分配器没有特定要求并要求对等输入引脚提供合适的实例而受到欺骗。