bmcv_image_vpp_basic

bm1684 上有专门的视频后处理模块VPP,在满足一定条件下可以一次实现 crop、color-space-convert、resize 以及 padding 功能,速度比 TPU 更快。 该 API 可以实现对多张图片的 crop、color-space-convert、resize、padding 及其任意若干个功能的组合。

bm_status_t bmcv_image_vpp_basic(
    bm_handle_t           handle,
    int                   in_img_num,
    bm_image*             input,
    bm_image*             output,
    int*                  crop_num_vec = NULL,
    bmcv_rect_t*          crop_rect = NULL,
    bmcv_padding_atrr_t*  padding_attr = NULL,
    bmcv_resize_algorithm algorithm = BMCV_INTER_LINEAR,
    csc_type_t            csc_type = CSC_MAX_ENUM,
    csc_matrix_t*         matrix = NULL);

传入参数说明:

  • bm_handle_t handle

输入参数。设备环境句柄,通过调用 bm_dev_request 获取。

  • int in_img_num

输入参数。输入 bm_image 数量。

  • bm_image* input

输入参数。输入 bm_image 对象指针,其指向空间的长度由 in_img_num 决定。

  • bm_image* output

输出参数。输出 bm_image 对象指针,其指向空间的长度由 in_img_num 和 crop_num_vec 共同决定,即所有输入图片 crop 数量之和。

  • int* crop_num_vec = NULL

输入参数。该指针指向对每张输入图片进行 crop 的数量,其指向空间的长度由 in_img_num 决定,如果不使用 crop 功能可填 NULL。

  • bmcv_rect_t * crop_rect = NULL

输入参数。具体格式定义如下:

typedef struct bmcv_rect {
    int start_x;
    int start_y;
    int crop_w;
    int crop_h;
} bmcv_rect_t;

每个输出 bm_image 对象所对应的在输入图像上 crop 的参数,包括起始点x坐标、起始点y坐标、crop图像的宽度以及crop图像的高度。图像左上顶点作为坐标原点。如果不使用 crop 功能可填 NULL。

  • bmcv_padding_atrr_t* padding_attr = NULL

输入参数。所有 crop 的目标小图在 dst image 中的位置信息以及要 pdding 的各通道像素值,若不使用 padding 功能则设置为 NULL。

typedef struct bmcv_padding_atrr_s {
    unsigned int  dst_crop_stx;
    unsigned int  dst_crop_sty;
    unsigned int  dst_crop_w;
    unsigned int  dst_crop_h;
    unsigned char padding_r;
    unsigned char padding_g;
    unsigned char padding_b;
    int           if_memset;
} bmcv_padding_atrr_t;
  1. 目标小图的左上角顶点相对于 dst image 原点(左上角)的offset信息:dst_crop_stx 和 dst_crop_sty;

  2. 目标小图经resize后的宽高:dst_crop_w 和 dst_crop_h;

  3. dst image 如果是RGB格式,各通道需要padding的像素值信息:padding_r、padding_g、padding_b,当if_memset=1时有效,如果是GRAY图像可以将三个值均设置为同一个值;

  4. if_memset表示要不要在该api内部对dst image 按照各个通道的padding值做memset,仅支持RGB和GRAY格式的图像。如果设置为0则用户需要在调用该api前,根据需要 padding 的像素值信息,调用 bmlib 中的 api 直接对 device memory 进行 memset 操作,如果用户对padding的值不关心,可以设置为0忽略该步骤。

  • bmcv_resize_algorithm algorithm = BMCV_INTER_LINEAR

输入参数。resize 算法选择,包括 BMCV_INTER_NEAREST、BMCV_INTER_LINEAR 和 BMCV_INTER_BICUBIC三种,默认情况下是双线性差值。

  • csc_type_t csc_type = CSC_MAX_ENUM

输入参数。color space convert 参数类型选择,填 CSC_MAX_ENUM 则使用默认值,默认为 CSC_YCbCr2RGB_BT601 或者 CSC_RGB2YCbCr_BT601,支持的类型包括:

CSC_YCbCr2RGB_BT601

CSC_YPbPr2RGB_BT601

CSC_RGB2YCbCr_BT601

CSC_YCbCr2RGB_BT709

CSC_RGB2YCbCr_BT709

CSC_RGB2YPbPr_BT601

CSC_YPbPr2RGB_BT709

CSC_RGB2YPbPr_BT709

CSC_USER_DEFINED_MATRIX

CSC_MAX_ENUM

  • csc_matrix_t* matrix = NULL

输入参数。如果 csc_type 选择 CSC_USER_DEFINED_MATRIX,则需要传入系数矩阵,格式如下:

typedef struct {
    int csc_coe00;
    int csc_coe01;
    int csc_coe02;
    int csc_add0;
    int csc_coe10;
    int csc_coe11;
    int csc_coe12;
    int csc_add1;
    int csc_coe20;
    int csc_coe21;
    int csc_coe22;
    int csc_add2;
} __attribute__((packed)) csc_matrix_t;

返回值说明:

  • BM_SUCCESS: 成功

  • 其他:失败

注意事项:

  1. 该 API 所需要满足的格式以及部分要求,如下表格所示:

src format

dst format

其他限制

RGB_PACKED

RGB_PACKED

条件1

RGB_PLANAR

条件1

BGR_PLANAR

条件1

BGR_PACKED

条件1

RGBP_SEPARATE

条件1

BGRP_SEPARATE

条件1

BGR_PACKED

RGB_PACKED

条件1

RGB_PLANAR

条件1

BGR_PACKED

条件1

BGR_PLANAR

条件1

RGBP_SEPARATE

条件1

BGRP_SEPARATE

条件1

RGB_PLANAR

RGB_PACKED

条件1

RGB_PLANAR

条件1

BGR_PACKED

条件1

BGR_PLANAR

条件1

RGBP_SEPARATE

条件1

BGRP_SEPARATE

条件1

BGR_PLANAR

RGB_PACKED

条件1

RGB_PLANAR

条件1

BGR_PACKED

条件1

BGR_PLANAR

条件1

RGBP_SEPARATE

条件1

BGRP_SEPARATE

条件1

RGBP_SEPARATE

RGB_PACKED

条件1

RGB_PLANAR

条件1

BGR_PACKED

条件1

BGR_PLANAR

条件1

RGBP_SEPARATE

条件1

BGRP_SEPARATE

条件1

BGRP_SEPARATE

RGB_PACKED

条件1

RGB_PLANAR

条件1

BGR_PACKED

条件1

BGR_PLANAR

条件1

RGBP_SEPARATE

条件1

BGRP_SEPARATE

条件1

GRAY

GRAY

条件1

YUV420P

YUV420P

条件2

COMPRESSED

YUV420P

条件2

RGB_PACKED

YUV420P

条件3

RGB_PLANAR

条件3

BGR_PACKED

条件3

BGR_PLANAR

条件3

RGBP_SEPARATE

条件3

BGRP_SEPARATE

条件3

YUV420P

RGB_PACKED

条件4

RGB_PLANAR

条件4

BGR_PACKED

条件4

BGR_PLANAR

条件4

RGBP_SEPARATE

条件4

BGRP_SEPARATE

条件4

NV12

RGB_PACKED

条件4

RGB_PLANAR

条件4

BGR_PACKED

条件4

BGR_PLANAR

条件4

RGBP_SEPARATE

条件4

BGRP_SEPARATE

条件4

COMPRESSED

RGB_PACKED

条件4

RGB_PLANAR

条件4

BGR_PACKED

条件4

BGR_PLANAR

条件4

RGBP_SEPARATE

条件4

BGRP_SEPARATE

条件4

其中:

  • 条件1: src.width >= crop.x + crop.width,src.height >= crop.y + crop.height

  • 条件2: src.width, src.height, dst.widht,dst.height 必须是2的整数倍,src.width >= crop.x + crop.width,src.height >= crop.y + crop.height

  • 条件3: dst.widht,dst.height 必须是2的整数倍,src.width == dst.width,src.height == dst.height,crop.x == 0,crop.y == 0,src.width >= crop.x + crop.width,src.height >= crop.y + crop.height

  • 条件4: src.width,src.height 必须是2的整数倍,src.width >= crop.x + crop.width,src.height >= crop.y + crop.height

  1. 输入 bm_image 的 device mem 不能在 heap0 上。

  2. 所有输入输出 image 的 stride 必须 64 对齐。

  3. 所有输入输出 image 的地址必须 32 byte 对齐。

  4. 图片缩放倍数((crop.width / output.width) 以及 (crop.height / output.height))限制在 1/32 ~ 32 之间。

  5. 输入输出的寬高(src.width, src.height, dst.widht, dst.height)限制在 16 ~ 4096 之间。

  6. 输入必须关联 device memory,否则返回失败。

  7. FORMAT_COMPRESSED 是 VPU 解码后内置的一种压缩格式,它包括4个部分:Y compressed table、Y compressed data、CbCr compressed table 以及 CbCr compressed data。请注意 bm_image 中这四部分存储的顺序与 FFMPEG 中 AVFrame 稍有不同,如果需要 attach AVFrame 中 device memory 数据到 bm_image 中时,对应关系如下,关于 AVFrame 详细内容请参考 VPU 的用户手册。

    bm_device_mem_t src_plane_device[4];
    src_plane_device[0] = bm_mem_from_device((u64)avframe->data[6],
            avframe->linesize[6]);
    src_plane_device[1] = bm_mem_from_device((u64)avframe->data[4],
            avframe->linesize[4] * avframe->h);
    src_plane_device[2] = bm_mem_from_device((u64)avframe->data[7],
            avframe->linesize[7]);
    src_plane_device[3] = bm_mem_from_device((u64)avframe->data[5],
            avframe->linesize[4] * avframe->h / 2);
    
    bm_image_attach(*compressed_image, src_plane_device);