airockchip / librga

Apache License 2.0
276 stars 52 forks source link

使用improcess, 从源buf的指定sx,sy,sw,sh复制一个区域到目标buf指定dx,dy,dw,dh,其中sw=dw,sh=dh,图像显示错位问题? #46

Closed nickyang2008 closed 10 months ago

nickyang2008 commented 1 year ago

基于Linux Kernel version 5.10.110 libRga版本:v1.9.3
Rga驱动版本:v1.2.22

问题:使用improcess, 从源buf的指定sx,sy,sw,sh复制一个区域到目标buf指定dx,dy,dw,dh,其中sw=dw,sh=dh,图像显示错位,不知是对improcess的理解不正确,还是这是一个BUG,向各位讨教。

librga源码中没有这样使用的例子,是我参考imtranslate源码实现,imtranslate与我代码不同点仅是imtranslate中sx,sy为0。

代码如下:

void drm_2da_cp_rect(uint8_t * dst, uint8_t * src, int bw, int bh, int sx,int sy, int sw, int sh, int dx,int dy) {
    int usage = 0;
    int ret = 0;
        rga_buffer_t    pat;

        im_rect srect;
        im_rect drect;
        im_rect prect;

    rga_buffer_t     rga_src;
    rga_buffer_t     rga_dst;

    static im_handle_param_t param;

    param.width = bw;
    param.height = bh;
    param.format = RK_FORMAT_RGBA_8888;

        rga_buffer_handle_t src_handle = importbuffer_virtualaddr(src, &param);
    if (src_handle <= 0) {
        printf("Failed to import virtualaddr for src channel!\n");
        return;
    }

    rga_buffer_handle_t dst_handle = importbuffer_virtualaddr(dst, &param);
    if (dst_handle <= 0) {
            printf("Failed to import virtualaddr for dst channel!\n");
        return;
    }

    rga_src = wrapbuffer_handle(src_handle, bw, bh, RK_FORMAT_RGBA_8888,bw,bh);
    rga_dst = wrapbuffer_handle(dst_handle, bw, bh, RK_FORMAT_RGBA_8888,bw,bh);

    empty_structure(NULL, NULL, &pat, &srect, &drect, &prect);

        if ((rga_src.width != rga_dst.width) || (rga_src.height != rga_dst.height))
           return;

    srect.x = sx;
    srect.y = sy;
    srect.width = sw;
    srect.height = sh;

    drect.x = dx;
    drect.y = dy;
    drect.width = sw;
    drect.height = sh;

    ret = imcheck(rga_src, rga_dst, srect, drect);
    if (ret != IM_STATUS_NOERROR) {
        printf("%d, check error! %s \n", __LINE__, imStrError((IM_STATUS)ret));
    } else {
        usage |= IM_SYNC;
        printf("src buff: %d-%d    dst Buff: %d-%d \n", rga_src.wstride,rga_src.hstride,rga_dst.wstride,rga_dst.hstride);
        printf("sx:%d  sy:%d  sw:%d  sh:%d  dx:%d  dy:%d  dw:%d  dh:%d \n",srect.x,srect.y,srect.width,srect.height,drect.x,drect.y,drect.width,drect.height);
        ret = improcess(rga_src, rga_dst, pat, srect, drect, prect, usage);
        if (ret != IM_STATUS_SUCCESS) 
            printf("%d, rga copy error! %s \n", __LINE__, imStrError((IM_STATUS)ret));
    }
    releasebuffer_handle(src_handle);
        releasebuffer_handle(dst_handle);
}
Cerf-Yu commented 12 months ago

可以看一下这个示例代码: https://github.com/airockchip/librga/blob/main/samples/copy_demo/src/rga_copy_splice_demo.cpp