From 0c43069763cd3cd9f58d8841e1c29115b07d7f61 Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Fri, 16 Jul 2021 10:06:20 +0800 Subject: [PATCH] [hal_jpegd]: Fix hal jpeg RGB output byte stride NOTE: RGB format horizontal stride is byte stride. The pixel_stride in MppFrame is the stride by pixel. Change-Id: I09e87c5f7fb871ee2b285451ed2f0abfb1351f19 Signed-off-by: Jeffy Chen Signed-off-by: Herman Chen --- mpp/hal/vpu/jpegd/hal_jpegd_common.c | 31 +++++++++++++++++++++------- mpp/hal/vpu/jpegd/hal_jpegd_rkv.c | 5 +++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/mpp/hal/vpu/jpegd/hal_jpegd_common.c b/mpp/hal/vpu/jpegd/hal_jpegd_common.c index 2262533b..5bb19724 100644 --- a/mpp/hal/vpu/jpegd/hal_jpegd_common.c +++ b/mpp/hal/vpu/jpegd/hal_jpegd_common.c @@ -233,6 +233,7 @@ void jpegd_setup_output_fmt(JpegdHalCtx *ctx, JpegdSyntax *s, RK_S32 output) { jpegd_dbg_func("enter\n"); RK_U32 pp_in_fmt = 0; + RK_U32 stride = 0; PPInfo *pp_info = &(ctx->pp_info); MppFrame frm = NULL; @@ -266,15 +267,25 @@ void jpegd_setup_output_fmt(JpegdHalCtx *ctx, JpegdSyntax *s, RK_S32 output) pp_info->pp_in_fmt = pp_in_fmt; switch (ctx->output_fmt) { - case MPP_FMT_ARGB8888: - case MPP_FMT_ABGR8888: - case MPP_FMT_RGBA8888: - case MPP_FMT_BGRA8888: + case MPP_FMT_RGB565 : + case MPP_FMT_BGR565 : + case MPP_FMT_RGB555 : + case MPP_FMT_BGR555 : + case MPP_FMT_RGB444 : + case MPP_FMT_BGR444 : { + pp_info->pp_out_fmt = PP_OUT_FORMAT_RGB565; + stride = s->hor_stride * 2; + } break; + case MPP_FMT_ARGB8888 : + case MPP_FMT_ABGR8888 : + case MPP_FMT_RGBA8888 : + case MPP_FMT_BGRA8888 : { pp_info->pp_out_fmt = PP_OUT_FORMAT_ARGB; - break; - default: + stride = s->hor_stride * 4; + } break; + default : { pp_info->pp_out_fmt = PP_OUT_FORMAT_YUV420INTERLAVE; - break; + } break; } jpegd_dbg_hal("Post Process! pp_in_fmt:%d, pp_out_fmt:%d", @@ -288,6 +299,10 @@ void jpegd_setup_output_fmt(JpegdHalCtx *ctx, JpegdSyntax *s, RK_S32 output) mpp_buf_slot_get_prop(ctx->frame_slots, output, SLOT_FRAME_PTR, &frm); mpp_frame_set_fmt(frm, ctx->output_fmt); + mpp_frame_set_hor_stride_pixel(frm, s->hor_stride); + /* update RGBX format byte stride and pixel stride */ + if (stride) + mpp_frame_set_hor_stride(frm, stride); jpegd_dbg_func("exit\n"); return; @@ -305,4 +320,4 @@ MPP_RET jpeg_image_check_size(RK_U32 hor_stride, RK_U32 ver_stride) } return ret; -} \ No newline at end of file +} diff --git a/mpp/hal/vpu/jpegd/hal_jpegd_rkv.c b/mpp/hal/vpu/jpegd/hal_jpegd_rkv.c index b6cd6a8b..af7f6f51 100644 --- a/mpp/hal/vpu/jpegd/hal_jpegd_rkv.c +++ b/mpp/hal/vpu/jpegd/hal_jpegd_rkv.c @@ -301,6 +301,7 @@ static MPP_RET setup_output_fmt(JpegdHalCtx *ctx, JpegdSyntax *syntax, RK_S32 ou MPP_RET ret = MPP_OK; JpegdSyntax *s = syntax; JpegRegSet *regs = (JpegRegSet *)ctx->regs; + RK_U32 stride = syntax->hor_stride; MppFrame frm = NULL; mpp_buf_slot_get_prop(ctx->frame_slots, out_idx, SLOT_FRAME_PTR, &frm); @@ -316,6 +317,8 @@ static MPP_RET setup_output_fmt(JpegdHalCtx *ctx, JpegdSyntax *syntax, RK_S32 ou regs->reg2_sys.scaledown_mode = SCALEDOWN_DISABLE; } + mpp_frame_set_hor_stride_pixel(frm, stride); + if (ctx->set_output_fmt_flag && (ctx->output_fmt != s->output_fmt)) { // PP enable if (MPP_FRAME_FMT_IS_YUV(ctx->output_fmt) && s->output_fmt != MPP_FMT_YUV400) { if (ctx->output_fmt == MPP_FMT_YUV420SP) @@ -336,8 +339,10 @@ static MPP_RET setup_output_fmt(JpegdHalCtx *ctx, JpegdSyntax *syntax, RK_S32 ou } else if (MPP_FRAME_FMT_IS_RGB(ctx->output_fmt)) { if (ctx->output_fmt == MPP_FMT_RGB888) { regs->reg2_sys.yuv_out_format = YUV_OUT_FMT_2_RGB888; + mpp_frame_set_hor_stride(frm, stride * 3); } else if (ctx->output_fmt == MPP_FMT_BGR565) { //bgr565le regs->reg2_sys.yuv_out_format = YUV_OUT_FMT_2_RGB565; + mpp_frame_set_hor_stride(frm, stride * 2); } else { mpp_err_f("unsupported output format %d\n", ctx->output_fmt); ret = MPP_NOK;