如何在CUDA中调整YUV图像的大小

时间:2017-07-27 03:25:06

标签: c++ cuda

如何在CUDA中调整YUV图像的大小?我尝试将libyuv的缩放代码转换为CUDA,但性能非常差。

void ScalePlaneSimple(int src_width, int src_height,
int dst_width, int dst_height,
int src_stride, int dst_stride,
const Npp8u* src_ptr, Npp8u* dst_ptr) {
    int i;
    // Initial source x/y coordinate and step values as 16.16 fixed point.
    int x = 0;
    int y = 0;
    int dx = 0;
    int dy = 0;

ScaleSlope(src_width, src_height, dst_width, dst_height, kFilterNone,
    &x, &y, &dx, &dy);
src_width = Abs(src_width);
    if (src_width * 2 == dst_width && x < 0x8000) {
        for (i = 0; i < dst_height; ++i) {
            ScaleColsUp2_C(dst_ptr, src_ptr + (y >> 16) * src_stride, dst_width, x, dx);
            dst_ptr += dst_stride;
            y += dy;
        }
    }
    else
    {
        for (i = 0; i < dst_height; ++i) {
        ScaleCols_C<<<1,1>>>(dst_ptr, src_ptr + (y >> 16) * src_stride, dst_width, x, dx);
            dst_ptr += dst_stride;
            y += dy;
        }
    }
}
__global__ void ScaleCols_C(Npp8u* dst_ptr, const Npp8u* src_ptr,
    int dst_width, int x, int dx) {
    int j;
    for (j = 0; j < dst_width - 1; j += 2) {
        dst_ptr[0] = src_ptr[x >> 16];
        x += dx;
        dst_ptr[1] = src_ptr[x >> 16];
        x += dx;
        dst_ptr += 2;
}
    if (dst_width & 1) {
        dst_ptr[0] = src_ptr[x >> 16];
    }
}

也许我应该使用并行计算?欢迎任何建议。

1 个答案:

答案 0 :(得分:1)

如果您想使用cuda,请查看NVidia性能原语。有图像大小调整功能。 (如果您不想使用gpu,它是英特尔性能原语接口的副本)