Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp369817pxa; Fri, 14 Aug 2020 06:39:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyoHH0rq22AzPQgMT5DbfyakX0BkAB8ujPC7j0OTA2prcH2GLLQG9ikWbMruWOH5R/jVzE/ X-Received: by 2002:a17:906:5ad8:: with SMTP id x24mr2313199ejs.329.1597412367767; Fri, 14 Aug 2020 06:39:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597412367; cv=none; d=google.com; s=arc-20160816; b=X7fM5Htq6RJNqnCdT2YI/rbN7nAGRbzp49EBcq61yxYXVn0pHjFlHDS3DKdLAJkBug UggmxolQ7HC/z1gIZpZI0nZVh87DmkfBpJnDLF94ON+pCiaLNqVVApwX0PlC3i6+bplk ezJ2iAkHAUVXLcml0H1PBrJNZocO11B+rI9mRWbRBgm7DJjIdkt/PYrnlRU+djZg/lzj 4HwIRq4NfAUBxJcCMc0rzNEnXyRxijfX17YHulhWS+mChNtyhYhNBwr7W9EpAXL7/m0U dZSqKWmG0ta6XwrPLUihe35i2nOX2CQrexHkwQEBvJnFrEZtACzMP6QafRAnXd4oDNjU KTQQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=Vrn9bAEXkMerKNo/RZgLm3eIq5yU5P0Hbgqprktd8Jw=; b=iXPu/GUZe2b846UjGoTYR6rd366JS7ZovTMWMYNRTptQ5FhsGQcmcx37/+sbZyowi6 ducT29URVN3wGOHlJY2E+yezTVZz6ncC+tsRyPZCJUk8m1yWM0x7bMa8ASXaLuBWSwWN u5qlz5oTxl2QQnTVVSZfOnU+7ns63j1jCioraQtgfGTW/KknimrareEDDogPe33YrNNg xLb5pD/sbslma/XC3et5MnsniGZbRisH/4rEsy+Kf/rbtkU2CL5X/IfpomqP25YygDkf FoQ6yGoIzrm3cWlhO7hrHSrmJiDY+ommorwOdACGQ0mz1ta7cb9xATp4z1Qc0vVUiC+t VHkA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q18si5597044ejz.135.2020.08.14.06.39.05; Fri, 14 Aug 2020 06:39:27 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728694AbgHNNg4 (ORCPT + 99 others); Fri, 14 Aug 2020 09:36:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57810 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728687AbgHNNgw (ORCPT ); Fri, 14 Aug 2020 09:36:52 -0400 Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e3e3]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3054DC061384; Fri, 14 Aug 2020 06:36:50 -0700 (PDT) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: ezequiel) with ESMTPSA id 0631E29A823 From: Ezequiel Garcia To: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Tomasz Figa , kernel@collabora.com, Jonas Karlman , Hans Verkuil , Alexandre Courbot , Jeffrey Kardatzke , Nicolas Dufresne , Philipp Zabel , Maxime Ripard , Paul Kocialkowski , Jernej Skrabec , Ezequiel Garcia Subject: [PATCH v3 01/19] media: uapi: h264: Update reference lists Date: Fri, 14 Aug 2020 10:36:16 -0300 Message-Id: <20200814133634.95665-2-ezequiel@collabora.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20200814133634.95665-1-ezequiel@collabora.com> References: <20200814133634.95665-1-ezequiel@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jernej Skrabec When dealing with with interlaced frames, reference lists must tell if each particular reference is meant for top or bottom field. This info is currently not provided at all in the H264 related controls. Make reference lists hold a structure which will also hold an enumerator type along index into DPB array. The enumerator must be used to specify if reference is for top or bottom field. Currently the only user of these lists is Cedrus which is just compile fixed here. Actual usage of will come in a following commit. Signed-off-by: Jernej Skrabec Signed-off-by: Ezequiel Garcia --- v3: * Rename to avoid mentioning the DPB. v2: * As pointed out by Jonas, enum v4l2_h264_dpb_reference here. --- .../media/v4l/ext-ctrls-codec.rst | 44 ++++++++++++++++++- .../staging/media/sunxi/cedrus/cedrus_h264.c | 6 +-- include/media/h264-ctrls.h | 23 +++++++--- 3 files changed, 62 insertions(+), 11 deletions(-) diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst index d0d506a444b1..b9b2617c3bda 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst @@ -1843,10 +1843,10 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type - * - __u32 - ``slice_group_change_cycle`` - - * - __u8 + * - struct :c:type:`v4l2_h264_reference` - ``ref_pic_list0[32]`` - Reference picture list after applying the per-slice modifications - * - __u8 + * - struct :c:type:`v4l2_h264_reference` - ``ref_pic_list1[32]`` - Reference picture list after applying the per-slice modifications * - __u32 @@ -1926,6 +1926,46 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type - - ``chroma_offset[32][2]`` - +``Picture Reference`` + +.. c:type:: v4l2_h264_reference + +.. cssclass:: longtable + +.. flat-table:: struct v4l2_h264_reference + :header-rows: 0 + :stub-columns: 0 + :widths: 1 1 2 + + * - enum :c:type:`v4l2_h264_field_reference` + - ``reference`` + - Specifies how the picture is referenced. + * - __u8 + - ``index`` + - Index into the :c:type:`v4l2_ctrl_h264_decode_params`.dpb array. + +.. c:type:: v4l2_h264_field_reference + +.. cssclass:: longtable + +.. flat-table:: + :header-rows: 0 + :stub-columns: 0 + :widths: 1 1 2 + + * - ``V4L2_H264_TOP_FIELD_REF`` + - 0x1 + - The top field in field pair is used for + short-term reference. + * - ``V4L2_H264_BOTTOM_FIELD_REF`` + - 0x2 + - The bottom field in field pair is used for + short-term reference. + * - ``V4L2_H264_FRAME_REF`` + - 0x3 + - The frame (or the top/bottom fields, if it's a field pair) + is used for short-term reference. + ``V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS (struct)`` Specifies the decode parameters (as extracted from the bitstream) for the associated H264 slice data. This includes the necessary diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c index 54ee2aa423e2..cce527bbdf86 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c @@ -166,8 +166,8 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx, static void _cedrus_write_ref_list(struct cedrus_ctx *ctx, struct cedrus_run *run, - const u8 *ref_list, u8 num_ref, - enum cedrus_h264_sram_off sram) + const struct v4l2_h264_reference *ref_list, + u8 num_ref, enum cedrus_h264_sram_off sram) { const struct v4l2_ctrl_h264_decode_params *decode = run->h264.decode_params; struct vb2_queue *cap_q; @@ -188,7 +188,7 @@ static void _cedrus_write_ref_list(struct cedrus_ctx *ctx, int buf_idx; u8 dpb_idx; - dpb_idx = ref_list[i]; + dpb_idx = ref_list[i].index; dpb = &decode->dpb[dpb_idx]; if (!(dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)) diff --git a/include/media/h264-ctrls.h b/include/media/h264-ctrls.h index 080fd1293c42..5f635e8d25e2 100644 --- a/include/media/h264-ctrls.h +++ b/include/media/h264-ctrls.h @@ -19,6 +19,8 @@ */ #define V4L2_H264_NUM_DPB_ENTRIES 16 +#define V4L2_H264_REF_LIST_LEN (2 * V4L2_H264_NUM_DPB_ENTRIES) + /* Our pixel format isn't stable at the moment */ #define V4L2_PIX_FMT_H264_SLICE v4l2_fourcc('S', '2', '6', '4') /* H264 parsed slices */ @@ -140,6 +142,19 @@ struct v4l2_h264_pred_weight_table { #define V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED 0x04 #define V4L2_H264_SLICE_FLAG_SP_FOR_SWITCH 0x08 +enum v4l2_h264_field_reference { + V4L2_H264_TOP_FIELD_REF = 0x1, + V4L2_H264_BOTTOM_FIELD_REF = 0x2, + V4L2_H264_FRAME_REF = 0x3, +}; + +struct v4l2_h264_reference { + enum v4l2_h264_field_reference fields; + + /* Index into v4l2_ctrl_h264_decode_params.dpb[] */ + __u8 index; +}; + struct v4l2_ctrl_h264_slice_params { /* Size in bytes, including header */ __u32 size; @@ -178,12 +193,8 @@ struct v4l2_ctrl_h264_slice_params { __u8 num_ref_idx_l1_active_minus1; __u32 slice_group_change_cycle; - /* - * Entries on each list are indices into - * v4l2_ctrl_h264_decode_params.dpb[]. - */ - __u8 ref_pic_list0[32]; - __u8 ref_pic_list1[32]; + struct v4l2_h264_reference ref_pic_list0[V4L2_H264_REF_LIST_LEN]; + struct v4l2_h264_reference ref_pic_list1[V4L2_H264_REF_LIST_LEN]; __u32 flags; }; -- 2.27.0