| From 6d9e1f163433a6c57b3820c6115d95837e9c8ad4 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 2 Mar 2023 06:34:10 +0100 |
| Subject: media: amphion: decoder implement display delay enable |
| |
| From: Ming Qian <ming.qian@nxp.com> |
| |
| [ Upstream commit ffa331d9bf9407655fc4c4d57dcc92ed2868e326 ] |
| |
| amphion vpu support a low latency mode, |
| when V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE is enabled, |
| decoder can display frame immediately after it's decoded. |
| Only h264 is support yet. |
| |
| Fixes: 6de8d628df6e ("media: amphion: add v4l2 m2m vpu decoder stateful driver") |
| Signed-off-by: Ming Qian <ming.qian@nxp.com> |
| Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/platform/amphion/vdec.c | 32 +++++++++++++++++++++ |
| drivers/media/platform/amphion/vpu_codec.h | 3 +- |
| drivers/media/platform/amphion/vpu_malone.c | 4 ++- |
| 3 files changed, 37 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/media/platform/amphion/vdec.c b/drivers/media/platform/amphion/vdec.c |
| index 87f9f8e90ab13..70633530d23a1 100644 |
| --- a/drivers/media/platform/amphion/vdec.c |
| +++ b/drivers/media/platform/amphion/vdec.c |
| @@ -168,7 +168,31 @@ static const struct vpu_format vdec_formats[] = { |
| {0, 0, 0, 0}, |
| }; |
| |
| +static int vdec_op_s_ctrl(struct v4l2_ctrl *ctrl) |
| +{ |
| + struct vpu_inst *inst = ctrl_to_inst(ctrl); |
| + struct vdec_t *vdec = inst->priv; |
| + int ret = 0; |
| + |
| + vpu_inst_lock(inst); |
| + switch (ctrl->id) { |
| + case V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE: |
| + vdec->params.display_delay_enable = ctrl->val; |
| + break; |
| + case V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY: |
| + vdec->params.display_delay = ctrl->val; |
| + break; |
| + default: |
| + ret = -EINVAL; |
| + break; |
| + } |
| + vpu_inst_unlock(inst); |
| + |
| + return ret; |
| +} |
| + |
| static const struct v4l2_ctrl_ops vdec_ctrl_ops = { |
| + .s_ctrl = vdec_op_s_ctrl, |
| .g_volatile_ctrl = vpu_helper_g_volatile_ctrl, |
| }; |
| |
| @@ -181,6 +205,14 @@ static int vdec_ctrl_init(struct vpu_inst *inst) |
| if (ret) |
| return ret; |
| |
| + v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops, |
| + V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY, |
| + 0, 0, 1, 0); |
| + |
| + v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops, |
| + V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE, |
| + 0, 1, 1, 0); |
| + |
| ctrl = v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops, |
| V4L2_CID_MIN_BUFFERS_FOR_CAPTURE, 1, 32, 1, 2); |
| if (ctrl) |
| diff --git a/drivers/media/platform/amphion/vpu_codec.h b/drivers/media/platform/amphion/vpu_codec.h |
| index 528a93f08ecd4..bac6d0d94f8a5 100644 |
| --- a/drivers/media/platform/amphion/vpu_codec.h |
| +++ b/drivers/media/platform/amphion/vpu_codec.h |
| @@ -55,7 +55,8 @@ struct vpu_encode_params { |
| struct vpu_decode_params { |
| u32 codec_format; |
| u32 output_format; |
| - u32 b_dis_reorder; |
| + u32 display_delay_enable; |
| + u32 display_delay; |
| u32 b_non_frame; |
| u32 frame_count; |
| u32 end_flag; |
| diff --git a/drivers/media/platform/amphion/vpu_malone.c b/drivers/media/platform/amphion/vpu_malone.c |
| index 2c9bfc6a5a72e..feb5c25e31044 100644 |
| --- a/drivers/media/platform/amphion/vpu_malone.c |
| +++ b/drivers/media/platform/amphion/vpu_malone.c |
| @@ -641,7 +641,9 @@ static int vpu_malone_set_params(struct vpu_shared_addr *shared, |
| hc->jpg[instance].jpg_mjpeg_interlaced = 0; |
| } |
| |
| - hc->codec_param[instance].disp_imm = params->b_dis_reorder ? 1 : 0; |
| + hc->codec_param[instance].disp_imm = params->display_delay_enable ? 1 : 0; |
| + if (malone_format != MALONE_FMT_AVC) |
| + hc->codec_param[instance].disp_imm = 0; |
| hc->codec_param[instance].dbglog_enable = 0; |
| iface->dbglog_desc.level = 0; |
| |
| -- |
| 2.39.2 |
| |