无法比较将rgb转换为nv12的结果

问题描述 投票:0回答:1

我正在通过将rgb转换为NV12来实践OpenCL我收到如下比较失败消息:

“ [错误]无法比较x(0)y(1)output_cpu(18)output_cl(16)处的Y平面”

我正在使用带有R=1, G=2, B=3的简单16x16 RGB缓冲区,布局如下:

123 123 123 123 123 ....
123 123 123.............

有人可以帮助解释此比较错误的原因吗?

这是我的CPU转换测试代码

int rgb, r, g, b, y, u, v;
for (int i = 0; i < height; i++) {
    for (int j = 0; j < width; j++) {
        // src is int rgb buffer
        rgb = src[i * width + j];
        r = rgb & 0xFF;
        g = (rgb >> 8) & 0xFF;
        b = (rgb >> 16) & 0xFF;
        y = ((66 * r + 129 * g + 25 * b + 128) >> 8) + 16; y = y > 255 ? 255 : (y < 0 ? 0 : y);
        u = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128; u = u > 255 ? 255 : (u < 0 ? 0 : u);
        v = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128; v = v > 255 ? 255 : (v < 0 ? 0 : v);
        // dst is unsigned char YUV buffer
        dst[i * width + j] = (unsigned char)y;
    }
}

这里是CL版本的转换

__kernel void rgb_2_nv12(__global unsigned int* src, __global char* dst, uint w, uint h)
{
    int x = get_global_id(0);
     y = get_global_id(1);
    int RGB, R, G, B, Y, U, V;
    unsigned int pos;

    pos = y * w + x;
    half_w = w >> 1;
    // src is same int rgb buffer
    RGB = src[y * w + x];
    R = RGB & 0xff;
    G = (RGB >> 8) & 0xff;
    B = (RGB >> 16) & 0xff;

    Y = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
    Y = Y > 255 ? 255 : (Y < 0 ? 0 : Y);
    U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;
    U = U > 255 ? 255 : (U < 0 ? 0 : U);
    V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;
    V = V > 255 ? 255 : (V < 0 ? 0 : V);  
    // dst is unsigned char YUV buffer          
    dst[pos] = (unsigned char)Y;

这是我的CL设置:

cl_mem cl_buf_src = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, rgb_size, input_int, &err); // rgb_size = 16x16, unsigned it input_int[rgb_size] 
cl_mem cl_buf_dst = clCreateBuffer(context, CL_MEM_WRITE_ONLY | CL_MEM_COPY_HOST_PTR, yuv_size, output_cl, &err); // yuv_size = 1.5 * rgb_size, unsigned char output_cl[yuv_size]
clSetKernelArg(kernel_rgb_2_nv12, 0, sizeof(cl_mem), (void*)&cl_buf_src); // int 
clSetKernelArg(kernel_rgb_2_nv12, 1, sizeof(cl_mem), (void*)&cl_buf_dst);
clSetKernelArg(kernel_rgb_2_nv12, 2, sizeof(cl_uint), &w); // 16
clSetKernelArg(kernel_rgb_2_nv12, 3, sizeof(cl_uint), &h); // 16

size_t globalWorkSize[2] = { w, h };
clEnqueueNDRangeKernel(queue, kernel_rgb_2_nv12, 2, NULL, globalWorkSize, NULL, 0, NULL, NULL);
opencl
1个回答
0
投票

我发现clCreateBuffer()的参数大小以字节为单位的问题。因此,这里我应该使用rgb_size * 4,而不是rgb_size。

© www.soinside.com 2019 - 2024. All rights reserved.