diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp index 11727bec..b6b7cb99 100644 --- a/mpp/mpp.cpp +++ b/mpp/mpp.cpp @@ -62,15 +62,16 @@ static void *list_wraper_frame(void *arg) static RK_S32 check_frm_task_cnt_cap(MppCodingType coding) { - if (strstr(mpp_get_soc_name(), "rk3588")) { + RockchipSocType soc_type = mpp_get_soc_type(); + + if (soc_type == ROCKCHIP_SOC_RK3588 || soc_type == ROCKCHIP_SOC_RK3576) { if (coding == MPP_VIDEO_CodingAVC || coding == MPP_VIDEO_CodingHEVC) return 2; - - if (coding == MPP_VIDEO_CodingMJPEG) + if (coding == MPP_VIDEO_CodingMJPEG && soc_type == ROCKCHIP_SOC_RK3588) return 4; } - mpp_log("Only rk3588 h264/jpeg encoder can use frame parallel\n"); + mpp_log("Only rk3588's h264/265/jpeg and rk3576's h264/265 encoder can use frame parallel\n"); return 1; } diff --git a/osal/driver/vcodec_service.c b/osal/driver/vcodec_service.c index 5c7561e3..6c7f54af 100644 --- a/osal/driver/vcodec_service.c +++ b/osal/driver/vcodec_service.c @@ -129,6 +129,10 @@ static const char *mpp_jpegd_dev[] = { "/dev/mpp_service", }; +static const char *mpp_jpege_dev[] = { + "/dev/mpp_service", +}; + #define mpp_find_device(dev) _mpp_find_device(dev, MPP_ARRAY_ELEMS(dev)) static const char *_mpp_find_device(const char **dev, RK_U32 size) @@ -393,6 +397,19 @@ const char *mpp_get_vcodec_dev_name(MppCtxType type, MppCodingType coding) dev = NULL; } } break; + case ROCKCHIP_SOC_RK3576 : { + if (type == MPP_CTX_DEC) { + if (coding == MPP_VIDEO_CodingMJPEG) + dev = mpp_find_device(mpp_jpegd_dev); + else + dev = mpp_find_device(mpp_rkvdec_dev); + } else if (type == MPP_CTX_ENC) { + if (coding == MPP_VIDEO_CodingMJPEG) + dev = mpp_find_device(mpp_jpege_dev); + else + dev = mpp_find_device(mpp_rkvenc_dev); + } + } break; default : { /* default case for unknown compatible */ RK_U32 vcodec_type = mpp_get_vcodec_type(); diff --git a/osal/inc/mpp_dev_defs.h b/osal/inc/mpp_dev_defs.h index 3a486218..5bc43420 100644 --- a/osal/inc/mpp_dev_defs.h +++ b/osal/inc/mpp_dev_defs.h @@ -38,6 +38,8 @@ typedef enum MppClientType_e { VPU_CLIENT_VEPU1 = 17, /* 0x00020000 */ VPU_CLIENT_VEPU2 = 18, /* 0x00040000 */ VPU_CLIENT_VEPU2_JPEG = 19, /* 0x00080000 */ + VPU_CLIENT_JPEG_ENC = 20, /* 0x00100000 */ + VPU_CLIENT_VEPU22 = 24, /* 0x01000000 */ IEP_CLIENT_TYPE = 28, /* 0x10000000 */ @@ -61,6 +63,7 @@ typedef enum MppClientType_e { #define HAVE_VEPU1 (1 << VPU_CLIENT_VEPU1) /* 0x00020000 */ #define HAVE_VEPU2 (1 << VPU_CLIENT_VEPU2) /* 0x00040000 */ #define HAVE_VEPU2_JPEG (1 << VPU_CLIENT_VEPU2_JPEG) /* 0x00080000 */ +#define HAVE_JPEG_ENC (1 << VPU_CLIENT_JPEG_ENC) /* 0x00100000 */ /* External encoder */ #define HAVE_VEPU22 (1 << VPU_CLIENT_VEPU22) /* 0x01000000 */ /* RK Image Enhance Processor for deinterlacing */ diff --git a/osal/inc/mpp_soc.h b/osal/inc/mpp_soc.h index 9ae9f143..d666ff7c 100644 --- a/osal/inc/mpp_soc.h +++ b/osal/inc/mpp_soc.h @@ -46,6 +46,7 @@ typedef enum RockchipSocType_e { ROCKCHIP_SOC_RK3588, ROCKCHIP_SOC_RK3528, ROCKCHIP_SOC_RK3562, + ROCKCHIP_SOC_RK3576, ROCKCHIP_SOC_BUTT, } RockchipSocType; @@ -87,7 +88,7 @@ typedef struct { const RockchipSocType soc_type; const RK_U32 vcodec_type; - /* Max 4 decoder cap */ + /* Max 6 decoder cap */ const MppDecHwCap *dec_caps[6]; /* Max 4 encoder cap */ const MppEncHwCap *enc_caps[4]; diff --git a/osal/mpp_soc.cpp b/osal/mpp_soc.cpp index 5bda863e..051004ef 100644 --- a/osal/mpp_soc.cpp +++ b/osal/mpp_soc.cpp @@ -59,6 +59,7 @@ #define CAP_CODING_VDPU341_LITE (HAVE_AVC|HAVE_HEVC) #define CAP_CODING_VDPU381 (HAVE_AVC|HAVE_HEVC|HAVE_VP9|HAVE_AVS2) #define CAP_CODING_VDPU382 (HAVE_AVC|HAVE_HEVC|HAVE_AVS2) +#define CAP_CODING_VDPU383 (HAVE_AVC|HAVE_HEVC|HAVE_VP9|HAVE_AVS2|HAVE_AV1) #define CAP_CODING_VEPU1 (HAVE_AVC|HAVE_MJPEG|HAVE_VP8) #define CAP_CODING_VEPU_LITE (HAVE_AVC|HAVE_MJPEG) @@ -409,6 +410,24 @@ static const MppDecHwCap vdpu382_lite = { .reserved = 0, }; +static const MppDecHwCap vdpu383 = { + .cap_coding = CAP_CODING_VDPU383, + .type = VPU_CLIENT_RKVDEC, + .cap_fbc = 2, + .cap_4k = 1, + .cap_8k = 1, + .cap_colmv_compress = 1, + .cap_hw_h265_rps = 1, + .cap_hw_vp9_prob = 1, + .cap_jpg_pp_out = 0, + .cap_10bit = 1, + .cap_down_scale = 1, + .cap_lmt_linebuf = 0, + .cap_core_num = 1, + .cap_hw_jpg_fix = 0, + .reserved = 0, +}; + static const MppDecHwCap avspd = { .cap_coding = CAP_CODING_AVSPD, .type = VPU_CLIENT_AVSPLUS_DEC, @@ -597,6 +616,28 @@ static const MppEncHwCap vepu540c_no_hevc = { .reserved = 0, }; +static const MppEncHwCap vepu510 = { + .cap_coding = CAP_CODING_VEPU54X, + .type = VPU_CLIENT_RKVENC, + .cap_fbc = 0, + .cap_4k = 1, + .cap_8k = 1, + .cap_hw_osd = 0, + .cap_hw_roi = 1, + .reserved = 0, +}; + +static const MppEncHwCap rkjpege_vpu720 = { + .cap_coding = HAVE_MJPEG, + .type = VPU_CLIENT_JPEG_ENC, + .cap_fbc = 0, + .cap_4k = 1, + .cap_8k = 1, + .cap_hw_osd = 0, + .cap_hw_roi = 0, + .reserved = 0, +}; + /* * NOTE: * vpu1 = vdpu1 + vepu1 @@ -903,6 +944,18 @@ static const MppSocInfo mpp_soc_infos[] = { { &vdpu382_lite, &rkjpegd, NULL, NULL, NULL, NULL, }, { &vepu540c_no_hevc, NULL, NULL, NULL, }, }, + { /* + * rk3576 has codec: + * 1 - RK H.264/H.265/VP9/AVS2/AV1 8K decoder + * 2 - RK H.264/H.265 8K encoder + * 3 - RK jpeg decoder/encoder + */ + "rk3576", + ROCKCHIP_SOC_RK3576, + HAVE_RKVDEC | HAVE_RKVENC | HAVE_JPEG_DEC | HAVE_JPEG_ENC, + { &vdpu383, &rkjpegd, NULL, NULL, NULL, NULL}, + { &vepu510, &rkjpege_vpu720, NULL, NULL}, + }, }; static const MppSocInfo mpp_soc_default = { diff --git a/osal/osal_2str.c b/osal/osal_2str.c index ff7406b9..4de11e47 100644 --- a/osal/osal_2str.c +++ b/osal/osal_2str.c @@ -44,8 +44,8 @@ const char *strof_client_type(MppClientType type) /* VPU_CLIENT_VEPU1 */ "vepu1", /* VPU_CLIENT_VEPU2 */ "vepu2", /* VPU_CLIENT_VEPU2_JPEG */ "vepu2_jpeg", - /* 20 ~ 23 */ - /* VPU_CLIENT_BUTT */ NULL, + /* VPU_CLIENT_JPEG_ENC */ "rkjpege", + /* 21 ~ 23 */ /* VPU_CLIENT_BUTT */ NULL, /* VPU_CLIENT_BUTT */ NULL, /* VPU_CLIENT_BUTT */ NULL, diff --git a/osal/test/mpp_platform_test.c b/osal/test/mpp_platform_test.c index f27a7eaa..e3c9f19d 100644 --- a/osal/test/mpp_platform_test.c +++ b/osal/test/mpp_platform_test.c @@ -62,6 +62,9 @@ int main() if (vcodec_type & HAVE_JPEG_DEC) mpp_log("found rk jpeg decoder\n"); + if (vcodec_type & HAVE_JPEG_ENC) + mpp_log("found rk jpeg encoder\n"); + if (vcodec_type & HAVE_RKVENC) mpp_log("found rkvenc encoder\n");