airockchip / librga

Apache License 2.0
281 stars 52 forks source link

Misalignment in 4:2:0 YUV -> BGR conversion #89

Open Qengineering opened 2 weeks ago

Qengineering commented 2 weeks ago

When converting 1920x1080 4:2:0 YUV (NV12) to BGR (8-bits) you get a misalignment in the green channel. Tested on the Rock5C Screenshot from 2024-09-24 10-16-16

Code:

    // Create RGA input buffer (NV12)
    rga_buffer_t src;
    memset(&src, 0, sizeof(rga_buffer_t));
    src.width = tmp_frame->width;
    src.height = tmp_frame->height;
    src.wstride = tmp_frame->linesize[0];
    src.hstride = tmp_frame->height;
    src.format = RK_FORMAT_YCbCr_420_SP; 
    src.vir_addr = tmp_frame->data[0];
    src.phy_addr = 0; 

    // Create RGA output buffer (BGR)
    rga_buffer_t dst;
    memset(&dst, 0, sizeof(rga_buffer_t));
    dst.width = TmpMat.cols;
    dst.height = TmpMat.rows;
    dst.wstride = TmpMat.cols;
    dst.hstride = TmpMat.rows;
    dst.format = RK_FORMAT_BGR_888;
    dst.vir_addr = TmpMat.data;
    dst.phy_addr = 0;

    // Perform color space conversion
    int ret = imcvtcolor(src, dst, src.format, dst.format);//, &opt);
    if (ret != IM_STATUS_SUCCESS) {
        std::cerr << "RGA color conversion failed: " << imStrError(ret) << std::endl;
    }
nyanmisaka commented 2 weeks ago

https://github.com/rockchip-linux/mpp/blob/develop/doc/Rockchip_Developer_Guide_MPP_EN.md#361-widthand-height-of-input-image-and-stride

Qengineering commented 2 weeks ago

Thanks!