airockchip / librga

Apache License 2.0
276 stars 52 forks source link

RGA色域转换问题 #48

Open momo621 opened 11 months ago

momo621 commented 11 months ago
  1. im2d_impl.cpp中,进行色域转换时,大概可以概括为两种方式,一种是指定dst的color_space_mode, 另一种是下述写法,指定src和dst的格式,但是下述写法中,①如果src->dst是同种格式时(例如IM_RGB_FULL->IM_RGB_FULL),会提示不支持;②是否支持rgb2yuv_601_full?

    if (src.color_space_mode == IM_RGB_FULL && dst.color_space_mode == IM_YUV_BT709_FULL_RANGE) { dstinfo.color_space_mode = rgb2yuv_709_full; } else if (src.color_space_mode == IM_YUV_BT601_FULL_RANGE && dst.color_space_mode == IM_YUV_BT709_LIMIT_RANGE) { dstinfo.color_space_mode = yuv2yuv_601_full_2_709_limit; } else if (src.color_space_mode == IM_YUV_BT709_LIMIT_RANGE && dst.color_space_mode == IM_YUV_BT601_LIMIT_RANGE) { dstinfo.color_space_mode = yuv2yuv_709_limit_2_601_limit; } else if (src.color_space_mode == IM_YUV_BT709_FULL_RANGE && dst.color_space_mode == IM_YUV_BT601_LIMIT_RANGE) { dstinfo.color_space_mode = yuv2yuv_709_full_2_601_limit; } else if (src.color_space_mode == IM_YUV_BT709_FULL_RANGE && dst.color_space_mode == IM_YUV_BT601_FULL_RANGE) { dstinfo.color_space_mode = yuv2yuv_709_full_2_601_full; } else { IM_LOGW("Unsupported full csc mode! src_csm = 0x%x, dst_csm = 0x%x", src.color_space_mode, dst.color_space_mode); return IM_STATUS_NOT_SUPPORTED; }

2.如何区别使用色域设置方式?在初始设置时,是直接设置dst的color_space_moe,还是分别设置src和dst的color_space_mode?从前者来看,是设置了yuvToRgbMode,后者则是设置了色彩空间转换矩阵。所以,该如何区分使用这两种设置方式

typedef enum { IM_YUV_TO_RGB_BT601_LIMIT = 1 << 0, IM_YUV_TO_RGB_BT601_FULL = 2 << 0, IM_YUV_TO_RGB_BT709_LIMIT = 3 << 0, IM_YUV_TO_RGB_MASK = 3 << 0, IM_RGB_TO_YUV_BT601_FULL = 1 << 2, IM_RGB_TO_YUV_BT601_LIMIT = 2 << 2, IM_RGB_TO_YUV_BT709_LIMIT = 3 << 2, IM_RGB_TO_YUV_MASK = 3 << 2, IM_RGB_TO_Y4 = 1 << 4, IM_RGB_TO_Y4_DITHER = 2 << 4, IM_RGB_TO_Y1_DITHER = 3 << 4, IM_Y4_MASK = 3 << 4, IM_RGB_FULL = 1 << 8, IM_RGB_CLIP = 2 << 8, IM_YUV_BT601_LIMIT_RANGE = 3 << 8, IM_YUV_BT601_FULL_RANGE = 4 << 8, IM_YUV_BT709_LIMIT_RANGE = 5 << 8, IM_YUV_BT709_FULL_RANGE = 6 << 8, IM_FULL_CSC_MASK = 0xf << 8, IM_COLOR_SPACE_DEFAULT = 0, } IM_COLOR_SPACE_MODE;

3.blend使用A+B->C时,如果使用full color space(问题1中的方式)的转换方式,会忽略中间buffer的色域,色域转换结果会出错 4.yuvToRgbMode的值应该怎么设置?文档[Rockchip_FAQ_RGA_CN.md]中的描述与源码不符,是否新增了IM_RGB_TO_Y4等设置

Cerf-Yu commented 10 months ago

关于色域转换部分最近有更新API的用法,此前是通过配置具体流向进行配置,1.10.0以上版本新增支持配置单独color_space_mode,相关示例代码可见: https://github.com/airockchip/librga/blob/main/samples/cvtcolor_demo/src/rga_cvtcolor_csc_demo.cpp