2012-02-09 112 views
1

我将Directshow过滤器中的字节缓冲区复制到C#程序提供的缓冲区中,该缓冲区包含当前帧的位图,因此大小会有所不同视频宽度和高度。复制C++中的中小型内存块的最快方法

我发现较小的视频超快速检索视频帧,但较大的视频需要一些时间。我正在做我认为最简单的方式(这并不意味着我是对的,这就是为什么我要问)。

请你能告诉我这是否是复制内存的最快方法?由于

C++代码:

STDMETHODIMP CSampleGrabber::GetBuffer(byte* pVideoBuffer) 
{  
    int p=0; 

    while (p< nBufSize) { 
     pVideoBuffer[p]=pBufferData[p]; 
     p++; 
    } 
} 
+1

使用memcpy或std ::复制。 – ronag 2012-02-09 18:03:37

+0

@ronag这应该是一个答案:) – Matten 2012-02-09 18:04:35

+3

你不会去那么多时间,我认为你必须弄清楚如何删除_副本。 – 2012-02-09 18:09:36

回答

2

由于您使用C++为什么不使用std::copy

std::copy(pBufferData, pBufferData + nBufSize, pVideoBuffer); 

复印件应使用memcopymemmove这反过来将使用快速机器代码指令。

4

使用std::copy从标准库,或者您可以使用memcpy,但std::copy将快如memcpy

std::copy(pVideoBuffer, pVideoBuffer+nBufSize, pBufferData); 
1

使用std::copymemcpy将是一个快速的,因为他们可以。

用于处理您希望尽可能避免复制和内存分配的视频帧。为此,我会采取以下方法。

  1. 分配一个等于视频处理管道深度的视频帧池。
  2. 复制ONCE超出您的SampleGrabber回调,并避免任何进一步的副本。
  3. 将您的视频帧处理放在单独的一个或多个线程上以提高性能。

如果你正在做的任何类型的影片进行解码的内存带宽,除非你是在一个非常高的帧速率运行或处理内存受限的系统上非常大的视频(2K或4K)不应该是一个主要问题。

如果您确实需要一个并行内存副本,您还可以调查使用英特尔的Thread Building Blocks来创建一个并行任务来复制块的视频帧。但是,除非你的视频是巨大的,否则你可能看不到超越直接memcpy的巨大性能提升。

0

Ç推荐的memcpy /的memmove

“的memcpy比的memmove更有效。”一般来说,只有在必须时才使用memmove。当源地区和目的地区域重叠时有一个非常合理的机会使用它。

使用参考:https://www.youtube.com/watch?v=Yr1YnOVG-4g杰里该隐博士(斯坦福大学简介系统讲座 - 7)时间:从标准库36:00

相关问题