2012-02-09 73 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

相關問題