From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0ED48CD5BB0 for ; Fri, 22 May 2026 10:17:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=EX9zG7dohKxWu5YW3EIOka4aEcMezySqjGmmvNfMefE=; b=cpj3FZre0TzMXL7NDnJrWmSSHn oGj8WN/EUdacpwE+ip9D+fq9stfT7p/mgXZlDV26c6cedPMsA6aITiaV6dODgwTd12v5MTophrKyx 8Fo1Fmb7E5nUwwGWQJRbuQ45r1f9WvMV7nIHzjMwPoZFoYdWlk3neNb+E/sAJnTizBcLsNfzUAaCb VZ1SJPY6ADEss44mHrW5Nupvum5bwjWyTXxMIj/MEXZnpmT7Wo+b17wnv3GDC4HkehbhVEmxX+tYz Gjpr2qdbr1HHTdNoYtaLE8PebaerjKkILotfbocpt5cGlAFX9W0Zygqc8v0812INPCF5vkFZMBl39 k9BqymLw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wQMwT-0000000AT89-2SEc; Fri, 22 May 2026 10:17:21 +0000 Received: from leonov.paulk.fr ([185.233.101.22]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wQMwQ-0000000AT74-3E4r for linux-arm-kernel@lists.infradead.org; Fri, 22 May 2026 10:17:20 +0000 Received: from laika.paulk.fr (12.234.24.109.rev.sfr.net [109.24.234.12]) by leonov.paulk.fr (Postfix) with ESMTPS id 48F523700297 for ; Fri, 22 May 2026 10:17:08 +0000 (UTC) Received: by laika.paulk.fr (Postfix, from userid 65534) id 935A4B408CB; Fri, 22 May 2026 10:17:03 +0000 (UTC) Received: from shepard (unknown [192.168.1.65]) by laika.paulk.fr (Postfix) with ESMTP id C43FAB408C9; Fri, 22 May 2026 10:16:56 +0000 (UTC) From: Paul Kocialkowski To: devicetree@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org Cc: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Nicolas Dufresne , Benjamin Gaignard , Philipp Zabel , Mauro Carvalho Chehab , Hans Verkuil , Marco Felsch , Michael Tretter , Paul Kocialkowski Subject: [PATCH 01/14] media: h264: Add a more generic reflist builder init Date: Fri, 22 May 2026 12:16:40 +0200 Message-ID: <20260522101653.2565125-2-paulk@sys-base.io> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260522101653.2565125-1-paulk@sys-base.io> References: <20260522101653.2565125-1-paulk@sys-base.io> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260522_031719_137376_E81F1885 X-CRM114-Status: GOOD ( 15.34 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org This should become part of a larger reflist builder rework. Signed-off-by: Paul Kocialkowski --- drivers/media/v4l2-core/v4l2-h264.c | 69 +++++++++++++++++++++++++++++ include/media/v4l2-h264.h | 7 +++ 2 files changed, 76 insertions(+) diff --git a/drivers/media/v4l2-core/v4l2-h264.c b/drivers/media/v4l2-core/v4l2-h264.c index c00197d095e7..4e5a177ca2c7 100644 --- a/drivers/media/v4l2-core/v4l2-h264.c +++ b/drivers/media/v4l2-core/v4l2-h264.c @@ -105,6 +105,75 @@ v4l2_h264_init_reflist_builder(struct v4l2_h264_reflist_builder *b, } EXPORT_SYMBOL_GPL(v4l2_h264_init_reflist_builder); +void +v4l2_h264_init_reflist_builder_gen(struct v4l2_h264_reflist_builder *b, + const struct v4l2_ctrl_h264_sps *sps, + const struct v4l2_h264_dpb_entry dpb[V4L2_H264_NUM_DPB_ENTRIES], + unsigned int pic_order_count, unsigned int frame_num, unsigned int fields) +{ + int cur_frame_num, max_frame_num; + unsigned int i; + + max_frame_num = 1 << (sps->log2_max_frame_num_minus4 + 4); + cur_frame_num = frame_num; + + memset(b, 0, sizeof(*b)); + b->cur_pic_order_count = pic_order_count; + b->cur_pic_fields = fields; + + for (i = 0; i < V4L2_H264_NUM_DPB_ENTRIES; i++) { + if (!(dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)) + continue; + + if (dpb[i].flags & V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM) + b->refs[i].longterm = true; + + /* + * Handle frame_num wraparound as described in section + * '8.2.4.1 Decoding process for picture numbers' of the spec. + * For long term references, frame_num is set to + * long_term_frame_idx which requires no wrapping. + */ + if (!b->refs[i].longterm && dpb[i].frame_num > cur_frame_num) + b->refs[i].frame_num = (int)dpb[i].frame_num - + max_frame_num; + else + b->refs[i].frame_num = dpb[i].frame_num; + + b->refs[i].top_field_order_cnt = dpb[i].top_field_order_cnt; + b->refs[i].bottom_field_order_cnt = dpb[i].bottom_field_order_cnt; + + if (b->cur_pic_fields == V4L2_H264_FRAME_REF) { + u8 fields = V4L2_H264_FRAME_REF; + + b->unordered_reflist[b->num_valid].index = i; + b->unordered_reflist[b->num_valid].fields = fields; + b->num_valid++; + continue; + } + + if (dpb[i].fields & V4L2_H264_TOP_FIELD_REF) { + u8 fields = V4L2_H264_TOP_FIELD_REF; + + b->unordered_reflist[b->num_valid].index = i; + b->unordered_reflist[b->num_valid].fields = fields; + b->num_valid++; + } + + if (dpb[i].fields & V4L2_H264_BOTTOM_FIELD_REF) { + u8 fields = V4L2_H264_BOTTOM_FIELD_REF; + + b->unordered_reflist[b->num_valid].index = i; + b->unordered_reflist[b->num_valid].fields = fields; + b->num_valid++; + } + } + + for (i = b->num_valid; i < ARRAY_SIZE(b->unordered_reflist); i++) + b->unordered_reflist[i].index = i; +} +EXPORT_SYMBOL_GPL(v4l2_h264_init_reflist_builder_gen); + static s32 v4l2_h264_get_poc(const struct v4l2_h264_reflist_builder *b, const struct v4l2_h264_reference *ref) { diff --git a/include/media/v4l2-h264.h b/include/media/v4l2-h264.h index 0d9eaa956123..1833c0556963 100644 --- a/include/media/v4l2-h264.h +++ b/include/media/v4l2-h264.h @@ -42,6 +42,7 @@ struct v4l2_h264_reflist_builder { u8 cur_pic_fields; struct v4l2_h264_reference unordered_reflist[V4L2_H264_REF_LIST_LEN]; + /* FIXME: confusing with valid flag (active is checked). Proper terminology is "used" */ u8 num_valid; }; @@ -51,6 +52,12 @@ v4l2_h264_init_reflist_builder(struct v4l2_h264_reflist_builder *b, const struct v4l2_ctrl_h264_sps *sps, const struct v4l2_h264_dpb_entry dpb[V4L2_H264_NUM_DPB_ENTRIES]); +void +v4l2_h264_init_reflist_builder_gen(struct v4l2_h264_reflist_builder *b, + const struct v4l2_ctrl_h264_sps *sps, + const struct v4l2_h264_dpb_entry dpb[V4L2_H264_NUM_DPB_ENTRIES], + unsigned int pic_order_count, unsigned int frame_num, unsigned int fields); + /** * v4l2_h264_build_b_ref_lists() - Build the B0/B1 reference lists * -- 2.53.0