diff --git a/mpp/codec/dec/jpeg/jpegd_parser.c b/mpp/codec/dec/jpeg/jpegd_parser.c index bb45ac00..a961c095 100644 --- a/mpp/codec/dec/jpeg/jpegd_parser.c +++ b/mpp/codec/dec/jpeg/jpegd_parser.c @@ -1179,8 +1179,11 @@ static MPP_RET jpegd_deinit(void *ctx) static MPP_RET jpegd_init(void *ctx, ParserCfg *parser_cfg) { - jpegd_dbg_func("enter\n"); JpegdCtx *JpegCtx = (JpegdCtx *)ctx; + const MppDecHwCap *hw_info = parser_cfg->hw_info; + + jpegd_dbg_func("enter\n"); + if (NULL == JpegCtx) { JpegCtx = (JpegdCtx *)mpp_calloc(JpegdCtx, 1); if (NULL == JpegCtx) { @@ -1188,13 +1191,12 @@ static MPP_RET jpegd_init(void *ctx, ParserCfg *parser_cfg) return MPP_ERR_NULL_PTR; } } + mpp_env_get_u32("jpegd_debug", &jpegd_debug, 0); // mpp only support baseline JpegCtx->scan_all_marker = 0; - const char* soc_name = NULL; - soc_name = mpp_get_soc_name(); - if (soc_name && (strstr(soc_name, "1108") || strstr(soc_name, "356"))) { + if (hw_info && hw_info->cap_hw_jpg_fix) { /* * no need to copy stream when decoding jpeg; * just scan parts of markers to reduce CPU's occupancy diff --git a/mpp/hal/vpu/jpegd/hal_jpegd_api.c b/mpp/hal/vpu/jpegd/hal_jpegd_api.c index 6e804110..04ded000 100644 --- a/mpp/hal/vpu/jpegd/hal_jpegd_api.c +++ b/mpp/hal/vpu/jpegd/hal_jpegd_api.c @@ -20,6 +20,7 @@ #include "mpp_env.h" #include "mpp_debug.h" +#include "mpp_common.h" #include "osal_2str.h" #include "mpp_hal.h" @@ -150,6 +151,19 @@ static MPP_RET hal_jpegd_init(void *hal, MppHalCfg *cfg) } break; } + { + // report hw_info to parser + const MppSocInfo *info = mpp_get_soc_info(); + RK_U32 i; + + for (i = 0; i < MPP_ARRAY_ELEMS(info->dec_caps); i++) { + if (info->dec_caps[i] && info->dec_caps[i]->type == client_type) { + cfg->hw_info = info->dec_caps[i]; + break; + } + } + } + return p_api->init(hal, cfg); } diff --git a/osal/inc/mpp_soc.h b/osal/inc/mpp_soc.h index 17a9f86b..05aa31e5 100644 --- a/osal/inc/mpp_soc.h +++ b/osal/inc/mpp_soc.h @@ -63,7 +63,8 @@ typedef struct MppDecHwCap_t { RK_U32 cap_down_scale : 1; RK_U32 cap_lmt_linebuf : 1; RK_U32 cap_core_num : 3; - RK_U32 reserved : 9; + RK_U32 cap_hw_jpg_fix : 1; + RK_U32 reserved : 8; } MppDecHwCap; typedef struct MppEncHwCap_t { diff --git a/osal/mpp_soc.cpp b/osal/mpp_soc.cpp index b6d55d06..5ce6e348 100644 --- a/osal/mpp_soc.cpp +++ b/osal/mpp_soc.cpp @@ -79,6 +79,7 @@ static const MppDecHwCap vdpu1 = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -96,6 +97,7 @@ static const MppDecHwCap vdpu1_2160p = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -113,6 +115,7 @@ static const MppDecHwCap vdpu1_jpeg_pp = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -130,6 +133,7 @@ static const MppDecHwCap vdpu2 = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -147,6 +151,7 @@ static const MppDecHwCap vdpu2_jpeg = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -164,6 +169,43 @@ static const MppDecHwCap vdpu2_jpeg_pp = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, + .reserved = 0, +}; + +static const MppDecHwCap vdpu2_jpeg_fix = { + .cap_coding = HAVE_MJPEG, + .type = VPU_CLIENT_VDPU2, + .cap_fbc = 0, + .cap_4k = 0, + .cap_8k = 0, + .cap_colmv_buf = 0, + .cap_hw_h265_rps = 0, + .cap_hw_vp9_prob = 0, + .cap_jpg_pp_out = 0, + .cap_10bit = 0, + .cap_down_scale = 0, + .cap_lmt_linebuf = 1, + .cap_core_num = 1, + .cap_hw_jpg_fix = 1, + .reserved = 0, +}; + +static const MppDecHwCap vdpu2_jpeg_pp_fix = { + .cap_coding = CAP_CODING_JPEGD_PP, + .type = VPU_CLIENT_VDPU2_PP, + .cap_fbc = 0, + .cap_4k = 0, + .cap_8k = 0, + .cap_colmv_buf = 0, + .cap_hw_h265_rps = 0, + .cap_hw_vp9_prob = 0, + .cap_jpg_pp_out = 1, + .cap_10bit = 0, + .cap_down_scale = 0, + .cap_lmt_linebuf = 1, + .cap_core_num = 1, + .cap_hw_jpg_fix = 1, .reserved = 0, }; @@ -181,6 +223,7 @@ static const MppDecHwCap rk_hevc = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -198,6 +241,7 @@ static const MppDecHwCap rk_hevc_1080p = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -215,6 +259,7 @@ static const MppDecHwCap vdpu341 = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -232,6 +277,7 @@ static const MppDecHwCap vdpu341_lite = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -249,6 +295,7 @@ static const MppDecHwCap vdpu341_lite_1080p = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -266,6 +313,7 @@ static const MppDecHwCap vdpu341_h264 = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -284,6 +332,7 @@ static const MppDecHwCap vdpu34x = { .cap_down_scale = 0, .cap_lmt_linebuf = 0, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -301,6 +350,7 @@ static const MppDecHwCap vdpu38x = { .cap_down_scale = 1, .cap_lmt_linebuf = 0, .cap_core_num = 2, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -318,6 +368,7 @@ static const MppDecHwCap avspd = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -335,6 +386,7 @@ static const MppDecHwCap rkjpegd = { .cap_down_scale = 0, .cap_lmt_linebuf = 0, .cap_core_num = 1, + .cap_hw_jpg_fix = 1, .reserved = 0, }; @@ -352,6 +404,7 @@ static const MppDecHwCap av1d = { .cap_down_scale = 0, .cap_lmt_linebuf = 1, .cap_core_num = 1, + .cap_hw_jpg_fix = 0, .reserved = 0, }; @@ -636,7 +689,7 @@ static const MppSocInfo mpp_soc_infos[] = { "rv1109", ROCKCHIP_SOC_RV1109, HAVE_VDPU2 | HAVE_VEPU2_JPEG | HAVE_RKVDEC | HAVE_RKVENC, - { &vdpu2_jpeg, &vdpu341_lite, NULL, NULL, NULL, NULL, }, + { &vdpu2_jpeg_fix, &vdpu341_lite, NULL, NULL, NULL, NULL, }, { &vepu2_jpeg, &vepu541, NULL, NULL, }, }, { /* @@ -648,7 +701,7 @@ static const MppSocInfo mpp_soc_infos[] = { "rv1126", ROCKCHIP_SOC_RV1126, HAVE_VDPU2 | HAVE_VEPU2_JPEG | HAVE_RKVDEC | HAVE_RKVENC, - { &vdpu2_jpeg, &vdpu341_lite, NULL, NULL, NULL, NULL, }, + { &vdpu2_jpeg_fix, &vdpu341_lite, NULL, NULL, NULL, NULL, }, { &vepu2_jpeg, &vepu541, NULL, NULL, }, }, { /* @@ -659,7 +712,7 @@ static const MppSocInfo mpp_soc_infos[] = { "rk3326", ROCKCHIP_SOC_RK3326, HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_HEVC_DEC, - { &rk_hevc_1080p, &vdpu2, &vdpu2_jpeg_pp, NULL, NULL, NULL, }, + { &rk_hevc_1080p, &vdpu2, &vdpu2_jpeg_pp_fix, NULL, NULL, NULL, }, { &vepu2, NULL, NULL, NULL, }, }, { /* @@ -670,7 +723,7 @@ static const MppSocInfo mpp_soc_infos[] = { "px30", ROCKCHIP_SOC_RK3326, HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_HEVC_DEC, - { &rk_hevc_1080p, &vdpu2, &vdpu2_jpeg_pp, NULL, NULL, NULL, }, + { &rk_hevc_1080p, &vdpu2, &vdpu2_jpeg_pp_fix, NULL, NULL, NULL, }, { &vepu2, NULL, NULL, NULL, }, }, { /* @@ -692,7 +745,7 @@ static const MppSocInfo mpp_soc_infos[] = { "rk3566", ROCKCHIP_SOC_RK3566, HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_RKVENC | HAVE_JPEG_DEC, - { &vdpu34x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp, NULL, NULL, }, + { &vdpu34x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp_fix, NULL, NULL, }, { &vepu540, &vepu2, NULL, NULL, }, }, { /* @@ -705,7 +758,7 @@ static const MppSocInfo mpp_soc_infos[] = { "rk3568", ROCKCHIP_SOC_RK3568, HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_RKVENC | HAVE_JPEG_DEC, - { &vdpu34x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp, NULL, NULL, }, + { &vdpu34x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp_fix, NULL, NULL, }, { &vepu540, &vepu2, NULL, NULL, }, }, { /* @@ -719,7 +772,7 @@ static const MppSocInfo mpp_soc_infos[] = { ROCKCHIP_SOC_RK3588, HAVE_VDPU2 | HAVE_VDPU2_PP | HAVE_VEPU2 | HAVE_RKVDEC | HAVE_RKVENC | HAVE_JPEG_DEC | HAVE_AV1DEC | HAVE_AVSDEC | HAVE_VEPU2_JPEG, - { &vdpu38x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp, &av1d, &avspd}, + { &vdpu38x, &rkjpegd, &vdpu2, &vdpu2_jpeg_pp_fix, &av1d, &avspd}, { &vepu58x, &vepu2, &vepu2_jpeg, NULL, }, }, { /*