Received: by 2002:a05:6a10:2726:0:0:0:0 with SMTP id ib38csp5629363pxb; Mon, 28 Mar 2022 15:11:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzJApgnqw4OMMR1a5i0DcaYYkJw5M9RKcAhkoMlECcfodEDNwL0J1l/M+QICMxhKASSRMvj X-Received: by 2002:a05:6102:20a:b0:325:2ca5:150 with SMTP id z10-20020a056102020a00b003252ca50150mr13609777vsp.82.1648505510597; Mon, 28 Mar 2022 15:11:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1648505510; cv=none; d=google.com; s=arc-20160816; b=rqt0sZY3fmTR7Ey/KvAif6irNL6PdGuH41IQmvMabMGQRwXmRyhGziA2ntMRlWcDxJ bFnRSYtc3G0J6qlef52JLBHI/a2xpBAF+QMlJBpVAVkphZz03dBt2w8db4UH+4ovmH5f dNl/Rtk5NwNwYAPjiuI+Sy5TEczeYkTOgVUozOnEmdpeFZ43bWcZ/6VMQMiE3w21M9uA 6Pe7G+VxwVxv4+i9N0CzQJn4b2rlOywPPIpKdJyuTL0iIH3hzMxgb8KakNIDWkwC0UrQ V3tjZOMmZnakrJ7/zI7gGYe10iTw+y0WwYG8kpHBqMeAX2GD+Pv5GeFJV0FkPm0ab7Ja MGyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=lEZE2sn7Zh/CgelxTq3hDPk2f5yuyMebFDB3TVaYqb0=; b=QyjC2JfmrcYX1EwtUtw95FXbF4IcACNJhmiC2DT2Jo3V6UuX8d6gW0vLf8TUuR9opY ZCHIuj8rs2KRVOwiNIZhvz6H1Tv2s5Ce9Q4BbWKkcZql4KT5N8AImUxi48DO6safMlQc A89qmLB6ifkOVFRAwut0pUwkYzjMmPGzcHdLF0QQppVi9xP3kPDVzT6CNIfE39s1v1h5 sfYNjk0ZaLIetjURTjjspzpJ1rMCSFOd28A1EpGRHXmVoFt1mkkTZJbYR9WccuYB89tu b9yM1rj5my9c7q3LIAc9XU0xlpn1Wkngc9uZH2emf1NN1TxWYtL7p69sCsCM3B3GHV8g NMVA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@collabora.com header.s=mail header.b=Hj+rYXI+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id c3-20020ab06943000000b0034c07a93aa9si3320641uas.68.2022.03.28.15.11.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Mar 2022 15:11:50 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@collabora.com header.s=mail header.b=Hj+rYXI+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 03EA8169B3E; Mon, 28 Mar 2022 14:31:52 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344182AbiC1UCs (ORCPT + 99 others); Mon, 28 Mar 2022 16:02:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55872 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344305AbiC1UCU (ORCPT ); Mon, 28 Mar 2022 16:02:20 -0400 Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 427385A0B9; Mon, 28 Mar 2022 13:00:19 -0700 (PDT) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: nicolas) with ESMTPSA id 161CD1F438A5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1648497618; bh=QCJPsQYSB9YDo1HOMH1IpCQstEyUl6W5GERVwRBYIVI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Hj+rYXI+luMx73+JuzZBTXXnWHQXQReI7Hmoowk6HECNyL91XfOpxSp+iPVs3sSEF kLwD9FS6EoNZlcjXcTpzmBkdWuZr2sdXe7IeIYTi3YvDwV11sSSjT9VkWmARn8vO6J OYqyP7LlEBmJ/Grnl15beX/50yUYKLVEt5/jnOxcrf+Gbp+arRScCBp7hv3DMfXkfL 5b3/veO2PCCjdbswsGMcqMMJU3db673BHkHw5HPfvZbX+WJYubzwRgXm2ZXUViDYSW RICc+J7t1abNgIbqCo8yc7L3/xXZpBGVrRfm3ASp78XcVdNjsiZftovttUY2V7oaiB BHsOhEdOI5oZA== From: Nicolas Dufresne To: Ezequiel Garcia , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: kernel@collabora.com, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH v1 19/24] media: rkvdec-h264: Add field decoding support Date: Mon, 28 Mar 2022 15:59:31 -0400 Message-Id: <20220328195936.82552-20-nicolas.dufresne@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220328195936.82552-1-nicolas.dufresne@collabora.com> References: <20220328195936.82552-1-nicolas.dufresne@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE, UNPARSEABLE_RELAY autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This makes use of the new feature in the reference builder to program up to 32 references when doing field decoding. It also signals the parity (top of bottom) of the field to the hardware. Signed-off-by: Nicolas Dufresne --- drivers/staging/media/rkvdec/rkvdec-h264.c | 48 ++++++++++------------ 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec-h264.c b/drivers/staging/media/rkvdec/rkvdec-h264.c index ec52b195bbd7..891c48bf6a51 100644 --- a/drivers/staging/media/rkvdec/rkvdec-h264.c +++ b/drivers/staging/media/rkvdec/rkvdec-h264.c @@ -97,13 +97,10 @@ struct rkvdec_h264_priv_tbl { u8 err_info[RKV_ERROR_INFO_SIZE]; }; -#define RKVDEC_H264_DPB_SIZE 16 - struct rkvdec_h264_reflists { struct v4l2_h264_reference p[V4L2_H264_REF_LIST_LEN]; struct v4l2_h264_reference b0[V4L2_H264_REF_LIST_LEN]; struct v4l2_h264_reference b1[V4L2_H264_REF_LIST_LEN]; - u8 num_valid; }; struct rkvdec_h264_run { @@ -738,23 +735,26 @@ static void lookup_ref_buf_idx(struct rkvdec_ctx *ctx, struct vb2_queue *cap_q = &m2m_ctx->cap_q_ctx.q; int buf_idx = -1; - if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE) + if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE) { buf_idx = vb2_find_timestamp(cap_q, dpb[i].reference_ts, 0); + if (buf_idx < 0) + pr_debug("No buffer for reference_ts %llu", + dpb[i].reference_ts); + } run->ref_buf_idx[i] = buf_idx; } } static void assemble_hw_rps(struct rkvdec_ctx *ctx, + struct v4l2_h264_reflist_builder *builder, struct rkvdec_h264_run *run) { const struct v4l2_ctrl_h264_decode_params *dec_params = run->decode_params; const struct v4l2_h264_dpb_entry *dpb = dec_params->dpb; struct rkvdec_h264_ctx *h264_ctx = ctx->priv; - const struct v4l2_ctrl_h264_sps *sps = run->sps; struct rkvdec_h264_priv_tbl *priv_tbl = h264_ctx->priv_tbl.cpu; - u32 max_frame_num = 1 << (sps->log2_max_frame_num_minus4 + 4); u32 *hw_rps = priv_tbl->rps; u32 i, j; @@ -772,37 +772,36 @@ static void assemble_hw_rps(struct rkvdec_ctx *ctx, if (!(dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)) continue; - if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM || - dpb[i].frame_num <= dec_params->frame_num) { - p[i] = dpb[i].frame_num; - continue; - } - - p[i] = dpb[i].frame_num - max_frame_num; + p[i] = builder->refs[i].frame_num; } for (j = 0; j < RKVDEC_NUM_REFLIST; j++) { - for (i = 0; i < h264_ctx->reflists.num_valid; i++) { - u8 dpb_valid = run->ref_buf_idx[i] >= 0; - u8 idx = 0; + for (i = 0; i < builder->num_valid; i++) { + struct v4l2_h264_reference *ref; + u8 dpb_valid; + u8 bottom; switch (j) { case 0: - idx = h264_ctx->reflists.p[i].index; + ref = &h264_ctx->reflists.p[i]; break; case 1: - idx = h264_ctx->reflists.b0[i].index; + ref = &h264_ctx->reflists.b0[i]; break; case 2: - idx = h264_ctx->reflists.b1[i].index; + ref = &h264_ctx->reflists.b1[i]; break; } - if (idx >= ARRAY_SIZE(dec_params->dpb)) + if (WARN_ON(ref->index >= ARRAY_SIZE(dec_params->dpb))) continue; + dpb_valid = run->ref_buf_idx[ref->index] >= 0; + bottom = ref->fields == V4L2_H264_BOTTOM_FIELD_REF; + set_ps_field(hw_rps, DPB_INFO(i, j), - idx | dpb_valid << 4); + ref->index | dpb_valid << 4); + set_ps_field(hw_rps, BOTTOM_FLAG(i, j), bottom); } } } @@ -990,10 +989,6 @@ static void config_registers(struct rkvdec_ctx *ctx, rkvdec->regs + RKVDEC_REG_H264_BASE_REFER15); } - /* - * Since support frame mode only - * top_field_order_cnt is the same as bottom_field_order_cnt - */ reg = RKVDEC_CUR_POC(dec_params->top_field_order_cnt); writel_relaxed(reg, rkvdec->regs + RKVDEC_REG_CUR_POC0); @@ -1109,7 +1104,6 @@ static int rkvdec_h264_run(struct rkvdec_ctx *ctx) /* Build the P/B{0,1} ref lists. */ v4l2_h264_init_reflist_builder(&reflist_builder, run.decode_params, run.sps, run.decode_params->dpb); - h264_ctx->reflists.num_valid = reflist_builder.num_valid; v4l2_h264_build_p_ref_list(&reflist_builder, h264_ctx->reflists.p); v4l2_h264_build_b_ref_lists(&reflist_builder, h264_ctx->reflists.b0, h264_ctx->reflists.b1); @@ -1117,7 +1111,7 @@ static int rkvdec_h264_run(struct rkvdec_ctx *ctx) assemble_hw_scaling_list(ctx, &run); assemble_hw_pps(ctx, &run); lookup_ref_buf_idx(ctx, &run); - assemble_hw_rps(ctx, &run); + assemble_hw_rps(ctx, &reflist_builder, &run); config_registers(ctx, &run); rkvdec_run_postamble(ctx, &run.base); -- 2.34.1