diff --git a/projects/Rockchip/patches/linux/default/linux-2001-v4l-wip-rkvdec-hevc.patch b/projects/Rockchip/patches/linux/default/linux-2001-v4l-wip-rkvdec-hevc.patch index 7a555e6b27..1bcff19479 100644 --- a/projects/Rockchip/patches/linux/default/linux-2001-v4l-wip-rkvdec-hevc.patch +++ b/projects/Rockchip/patches/linux/default/linux-2001-v4l-wip-rkvdec-hevc.patch @@ -3163,11 +3163,11 @@ Subject: [PATCH] WIP: media: rkvdec: hevc: implement lowdelay Signed-off-by: Alex Bee --- - drivers/staging/media/rkvdec/rkvdec-hevc.c | 16 ++++++++++++++-- - 1 file changed, 14 insertions(+), 2 deletions(-) + drivers/staging/media/rkvdec/rkvdec-hevc.c | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec-hevc.c b/drivers/staging/media/rkvdec/rkvdec-hevc.c -index e5283c598798..5986b3d2b5b0 100644 +index e5283c598798..d8e9a9c75e78 100644 --- a/drivers/staging/media/rkvdec/rkvdec-hevc.c +++ b/drivers/staging/media/rkvdec/rkvdec-hevc.c @@ -2185,6 +2185,7 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, @@ -3182,27 +3182,32 @@ index e5283c598798..5986b3d2b5b0 100644 for (j = 0; j < run->num_slices; j++) { sl_params = &run->slices_params[j]; dpb = sl_params->dpb; -+ lowdelay = 0; ++ lowdelay = (sl_params->slice_type == V4L2_HEVC_SLICE_TYPE_I) ? 0 : 1; hw_ps = &priv_tbl->rps[j]; memset(hw_ps, 0, sizeof(*hw_ps)); -@@ -2219,8 +2221,18 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, +@@ -2209,18 +2211,23 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, + WRITE_RPS(!!(dpb[sl_params->ref_idx_l0[i]].rps == V4L2_HEVC_DPB_ENTRY_RPS_LT_CURR), + REF_PIC_LONG_TERM_L0(i)); + WRITE_RPS(sl_params->ref_idx_l0[i], REF_PIC_IDX_L0(i)); ++ ++ if (dpb[sl_params->ref_idx_l0[i]].pic_order_cnt[0] > sl_params->slice_pic_order_cnt) ++ lowdelay = 0; + } + + for (i = 0; i <= sl_params->num_ref_idx_l1_active_minus1; i++) { + WRITE_RPS(!!(dpb[sl_params->ref_idx_l1[i]].rps == V4L2_HEVC_DPB_ENTRY_RPS_LT_CURR), + REF_PIC_LONG_TERM_L1(i)); + WRITE_RPS(sl_params->ref_idx_l1[i], REF_PIC_IDX_L1(i)); ++ ++ if (dpb[sl_params->ref_idx_l1[i]].pic_order_cnt[0] > sl_params->slice_pic_order_cnt) ++ lowdelay = 0; + } //WRITE_RPS(0xffffffff, PS_FIELD(96, 32)); - // TODO: lowdelay - WRITE_RPS(0, LOWDELAY); -+ if (sl_params->slice_type != V4L2_HEVC_SLICE_TYPE_I && -+ !(!!(sl_params->flags & V4L2_HEVC_SLICE_PARAMS_FLAG_DEPENDENT_SLICE_SEGMENT))) { -+ lowdelay = 1; -+ for (i = 0; i < sl_params->num_active_dpb_entries; i++) { -+ if (dpb[i].pic_order_cnt[0] > sl_params->slice_pic_order_cnt) { -+ lowdelay = 0; -+ break; -+ } -+ } -+ } -+ + WRITE_RPS(lowdelay, LOWDELAY); WRITE_RPS(sl_params->long_term_ref_pic_set_size +