2013-07-15 25 views
1

我想用cuda轉換(嘗試將紅色通道設置爲0)gstreamer緩衝區。有一段代碼:Gstreamer緩衝區與cuda轉換

__global__ void transform(guint8 *data, int width){ 
    uint x = (blockIdx.x * blockDim.x) + threadIdx.x; 
    uint y = (blockIdx.y * blockDim.y) + threadIdx.y; 
    uint pixPos = (y * width + x) * 4; 
    data[pixPos + 2] = 0; // BGRA format 
} 

void simple_transform(guint8 *data, int width, int height){ 
    guint8 *d_data; 
    guint8 size = width * height * 4; 

    checkCudaErrors(cudaMalloc((void**)&d_data, size)); 
    // copy original buffer into device 
    checkCudaErrors(cudaMemcpy(d_data, data, size, cudaMemcpyHostToDevice)); 

    dim3 threads = dim3(8, 8); 
    dim3 blocks = dim3(width/threads.x, height/threads.y); 

    // execute kernel 
    transform<<< blocks, threads >>>(d_data, width); 

    // move back converted data to original buffer 
    checkCudaErrors(cudaMemcpy(data, d_data, size, cudaMemcpyDeviceToHost)); 

    cudaFree(d_data); 
} 

問題是視頻顯示沒有任何變化。我想看到藍綠色的圖片,但不能。我的錯誤在哪裏?

+1

我認爲這應該是錯誤的。 'guint8 size = width * height * 4;'。不應該是'size_t size = width * height * 4;' – sgarizvi

+0

謝謝!現在轉換器可以工作。 – greg

+0

我已經發布解決方案作爲答案,您可以接受它,以便問題可以標記爲已解決。 – sgarizvi

回答

3

要指定的圖像的總大小類型guint8

guint8 size = width * height * 4; 

這是能夠容納值高達僅255的變量。大小必須分配給更大數據類型的變量(如size_t)。

size_t size = width * height * 4;