2

我写了一个解码器变换过滤器,但它播放视频很慢。

有两个 memcpy 操作。从源媒体样本复制,然后复制到输出引脚的目标传递缓冲区。我不能完全避免 mem 副本,但可以避免复制到输出 pin 的传递缓冲区。

如果我获得输出引脚传递缓冲区的物理地址并将该物理地址直接分配给我的硬件解码器寄存器,它将帮助我避免第二次内存复制。通过探索“m_pOutput”的方法,没有任何函数返回IMediaSample::GetPointer方法返回的指针的物理地址。

请指导我如何获得这个物理地址?还有其他方法可以实现相同的目标吗?

4

1 回答 1

1
  1. 你打电话问你有的地址IMediaSample::GetPointer,所以看起来你已经有了你要的东西
  2. 输出引脚负责引脚上的内存分配器,因此您的解码器可以使用自己的内存分配器,IMediaSample::GetPointer特别是方法。您可以使用您分配的缓冲区,并与硬件解码器实现共享(此外,您可以在那里进行特定的对齐等,反之亦然,从解码器获取缓冲区以在 DirectShow 管道中进一步使用)。
  3. 我看到它是 Win CE,但无论如何它似乎不太可能过度memcpy视觉上很慢,也许你还有其他瓶颈。
于 2013-10-21T13:39:54.130 回答