浏览代码

feat[mpp_soc]: support rk3576 soc

Change-Id: I49bd3ccbc643b3c95db5ba3ca692f365c9425440
Signed-off-by: Yanjun Liao <yanjun.liao@rock-chips.com>
Signed-off-by: Johnson Ding <johnson.ding@rock-chips.com>
Yanjun Liao 1 年之前
父节点
当前提交
3cbb906673
共有 7 个文件被更改,包括 85 次插入7 次删除
  1. 5 4
      mpp/mpp.cpp
  2. 17 0
      osal/driver/vcodec_service.c
  3. 3 0
      osal/inc/mpp_dev_defs.h
  4. 2 1
      osal/inc/mpp_soc.h
  5. 53 0
      osal/mpp_soc.cpp
  6. 2 2
      osal/osal_2str.c
  7. 3 0
      osal/test/mpp_platform_test.c

+ 5 - 4
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;
 }

+ 17 - 0
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();

+ 3 - 0
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 */

+ 2 - 1
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];

+ 53 - 0
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 = {

+ 2 - 2
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,

+ 3 - 0
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");