From nobody Sat Nov 30 16:42:17 2024 Received: from smtp.forwardemail.net (smtp.forwardemail.net [207.246.76.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 55956189B81 for ; Mon, 9 Sep 2024 19:26:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=207.246.76.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725910002; cv=none; b=p0xdCLDQq5/RL4wjC03oBsyuZXb1L7uqmSJkDQ/kjXH8ZOnMETAXtu1F1vOKjmEAkHSRdqUMQpM18XvTUiYCSslV84R07i+GM/NACMjo1Ri/CycCKQU49BGx1bam9BvzbtQe7GvkQcGkojp4Floimrlgr0k/4750XunNb3HuU70= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1725910002; c=relaxed/simple; bh=pjWIFhyAE3ewzFzzTeYYj8lbDtlEmI5oBgeAQG9j1dw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CGcq0nyxrgkt4cy1o4q1rjVOb5UTq0A+1C4bArPTRnPM+L7e6kiI6og1rv3kG6xpmWgQrfTXrdU3hubK3yuv5HyrkIi1sBS/4DI2qhoSI89ZIwFKsFo1i5yPQLEuqG1lq9lmAkqtfkKWL+KQ0nvYc/7t1MKvDUr5kM2uSQ7zYDo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=kwiboo.se; spf=pass smtp.mailfrom=fe-bounces.kwiboo.se; dkim=pass (2048-bit key) header.d=kwiboo.se header.i=@kwiboo.se header.b=hSo4OZm2; arc=none smtp.client-ip=207.246.76.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=kwiboo.se Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=fe-bounces.kwiboo.se Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kwiboo.se header.i=@kwiboo.se header.b="hSo4OZm2" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kwiboo.se; h=Content-Transfer-Encoding: MIME-Version: References: In-Reply-To: Message-ID: Date: Subject: Cc: To: From; q=dns/txt; s=fe-e1b5cab7be; t=1725909991; bh=921UzTo5dLtuuWBHkufZ7GvzzRgheu3OYLHs3KKVOo4=; b=hSo4OZm28TGjlonCU5pYgTEM4cK0/TTMnp1kp4htSMFBVUJhUhyPaGu4q9vbGSvLIKTBuxXnj M85mhq4C/iR9qV1F5m5DOvKpL7lGGDIuRJd4ih+6DKbmjr9+6DRZiZzlgogaQhl/NkwmKHu/+13 9XXHeyvmjMgDRZNOAPUwRRap2TYrFCYUj3J4JtNVZcpusQ7UgeiKMeqT8tf5OsXNfXpiim9OPTa 0tdCqylKknv2TDk/WTfK58RMk0L6k8c+7DfeOXYQJ4kjAjS6KSRShix9dZVHEhjWQfgegn8Dttx tSXwB6cyDB8v6sDf1M99DG/RySd0J4WpMa0Hg1Is4Yug== From: Jonas Karlman To: Sebastian Fricke , Ezequiel Garcia , Mauro Carvalho Chehab , Greg Kroah-Hartman Cc: Alex Bee , Nicolas Dufresne , Benjamin Gaignard , Detlev Casanova , Dan Carpenter , linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Jonas Karlman , Christopher Obbard Subject: [PATCH v6 10/11] media: rkvdec: h264: Support High 10 and 4:2:2 profiles Date: Mon, 9 Sep 2024 19:25:08 +0000 Message-ID: <20240909192522.1076704-11-jonas@kwiboo.se> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240909192522.1076704-1-jonas@kwiboo.se> References: <20240909192522.1076704-1-jonas@kwiboo.se> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Report-Abuse-To: abuse@forwardemail.net X-Report-Abuse: abuse@forwardemail.net X-Complaints-To: abuse@forwardemail.net X-ForwardEmail-Version: 0.4.40 X-ForwardEmail-Sender: rfc822; jonas@kwiboo.se, smtp.forwardemail.net, 207.246.76.47 X-ForwardEmail-ID: 66df4be4c680cb8b7d2dc25e Content-Type: text/plain; charset="utf-8" Add support and enable decoding of H264 High 10 and 4:2:2 profiles. Decoded CAPTURE buffer width is aligned to 64 pixels to accommodate HW requirement of 10-bit format buffers, fixes decoding of: - Hi422FR13_SONY_A - Hi422FR14_SONY_A - Hi422FR15_SONY_A - Hi422FR6_SONY_A - Hi422FR7_SONY_A - Hi422FR8_SONY_A - Hi422FR9_SONY_A - Hi422FREXT18_SONY_A The get_image_fmt() ops is implemented to select an image format required for the provided SPS control. Signed-off-by: Jonas Karlman Tested-by: Nicolas Dufresne Tested-by: Christopher Obbard Reviewed-by: Nicolas Dufresne --- v6: - No change v5: - Move buffer align from rkvdec_fill_decoded_pixfmt to min/step_width - Use correct profiles for V4L2_CID_MPEG_VIDEO_H264_PROFILE - Collect t-b tags v4: - Change to use get_image_fmt() ops v3: - Add get_fmt_opaque ops, the expected pixelformat is used as opaque - Add new valid_fmt ops that validate pixelformat matches opaque - Update H264_PROFILE control max value --- drivers/staging/media/rkvdec/rkvdec-h264.c | 37 +++++++++++++++----- drivers/staging/media/rkvdec/rkvdec.c | 40 ++++++++++++++++------ drivers/staging/media/rkvdec/rkvdec.h | 3 ++ 3 files changed, 61 insertions(+), 19 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec-h264.c b/drivers/staging/m= edia/rkvdec/rkvdec-h264.c index 8bce8902b8dd..d14b4d173448 100644 --- a/drivers/staging/media/rkvdec/rkvdec-h264.c +++ b/drivers/staging/media/rkvdec/rkvdec-h264.c @@ -1027,24 +1027,42 @@ static int rkvdec_h264_adjust_fmt(struct rkvdec_ctx= *ctx, return 0; } =20 +static enum rkvdec_image_fmt rkvdec_h264_get_image_fmt(struct rkvdec_ctx *= ctx, + struct v4l2_ctrl *ctrl) +{ + const struct v4l2_ctrl_h264_sps *sps =3D ctrl->p_new.p_h264_sps; + + if (ctrl->id !=3D V4L2_CID_STATELESS_H264_SPS) + return RKVDEC_IMG_FMT_ANY; + + if (sps->bit_depth_luma_minus8 =3D=3D 0) { + if (sps->chroma_format_idc =3D=3D 2) + return RKVDEC_IMG_FMT_422_8BIT; + else + return RKVDEC_IMG_FMT_420_8BIT; + } else if (sps->bit_depth_luma_minus8 =3D=3D 2) { + if (sps->chroma_format_idc =3D=3D 2) + return RKVDEC_IMG_FMT_422_10BIT; + else + return RKVDEC_IMG_FMT_420_10BIT; + } + + return RKVDEC_IMG_FMT_ANY; +} + static int rkvdec_h264_validate_sps(struct rkvdec_ctx *ctx, const struct v4l2_ctrl_h264_sps *sps) { unsigned int width, height; =20 - /* - * TODO: The hardware supports 10-bit and 4:2:2 profiles, - * but it's currently broken in the driver. - * Reject them for now, until it's fixed. - */ - if (sps->chroma_format_idc > 1) - /* Only 4:0:0 and 4:2:0 are supported */ + if (sps->chroma_format_idc > 2) + /* Only 4:0:0, 4:2:0 and 4:2:2 are supported */ return -EINVAL; if (sps->bit_depth_luma_minus8 !=3D sps->bit_depth_chroma_minus8) /* Luma and chroma bit depth mismatch */ return -EINVAL; - if (sps->bit_depth_luma_minus8 !=3D 0) - /* Only 8-bit is supported */ + if (sps->bit_depth_luma_minus8 !=3D 0 && sps->bit_depth_luma_minus8 !=3D = 2) + /* Only 8-bit and 10-bit is supported */ return -EINVAL; =20 width =3D (sps->pic_width_in_mbs_minus1 + 1) * 16; @@ -1190,4 +1208,5 @@ const struct rkvdec_coded_fmt_ops rkvdec_h264_fmt_ops= =3D { .stop =3D rkvdec_h264_stop, .run =3D rkvdec_h264_run, .try_ctrl =3D rkvdec_h264_try_ctrl, + .get_image_fmt =3D rkvdec_h264_get_image_fmt, }; diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/= rkvdec/rkvdec.c index 8df49ee12820..c8c14f35ac44 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -195,10 +195,11 @@ static const struct rkvdec_ctrl_desc rkvdec_h264_ctrl= _descs[] =3D { }, { .cfg.id =3D V4L2_CID_MPEG_VIDEO_H264_PROFILE, - .cfg.min =3D V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE, - .cfg.max =3D V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, + .cfg.min =3D V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE, + .cfg.max =3D V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA, .cfg.menu_skip_mask =3D - BIT(V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED), + BIT(V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED) | + BIT(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE), .cfg.def =3D V4L2_MPEG_VIDEO_H264_PROFILE_MAIN, }, { @@ -213,11 +214,23 @@ static const struct rkvdec_ctrls rkvdec_h264_ctrls = =3D { .num_ctrls =3D ARRAY_SIZE(rkvdec_h264_ctrl_descs), }; =20 -static const struct rkvdec_decoded_fmt_desc rkvdec_h264_vp9_decoded_fmts[]= =3D { +static const struct rkvdec_decoded_fmt_desc rkvdec_h264_decoded_fmts[] =3D= { { .fourcc =3D V4L2_PIX_FMT_NV12, .image_fmt =3D RKVDEC_IMG_FMT_420_8BIT, }, + { + .fourcc =3D V4L2_PIX_FMT_NV15, + .image_fmt =3D RKVDEC_IMG_FMT_420_10BIT, + }, + { + .fourcc =3D V4L2_PIX_FMT_NV16, + .image_fmt =3D RKVDEC_IMG_FMT_422_8BIT, + }, + { + .fourcc =3D V4L2_PIX_FMT_NV20, + .image_fmt =3D RKVDEC_IMG_FMT_422_10BIT, + }, }; =20 static const struct rkvdec_ctrl_desc rkvdec_vp9_ctrl_descs[] =3D { @@ -240,21 +253,28 @@ static const struct rkvdec_ctrls rkvdec_vp9_ctrls =3D= { .num_ctrls =3D ARRAY_SIZE(rkvdec_vp9_ctrl_descs), }; =20 +static const struct rkvdec_decoded_fmt_desc rkvdec_vp9_decoded_fmts[] =3D { + { + .fourcc =3D V4L2_PIX_FMT_NV12, + .image_fmt =3D RKVDEC_IMG_FMT_420_8BIT, + }, +}; + static const struct rkvdec_coded_fmt_desc rkvdec_coded_fmts[] =3D { { .fourcc =3D V4L2_PIX_FMT_H264_SLICE, .frmsize =3D { - .min_width =3D 48, + .min_width =3D 64, .max_width =3D 4096, - .step_width =3D 16, + .step_width =3D 64, .min_height =3D 48, .max_height =3D 2560, .step_height =3D 16, }, .ctrls =3D &rkvdec_h264_ctrls, .ops =3D &rkvdec_h264_fmt_ops, - .num_decoded_fmts =3D ARRAY_SIZE(rkvdec_h264_vp9_decoded_fmts), - .decoded_fmts =3D rkvdec_h264_vp9_decoded_fmts, + .num_decoded_fmts =3D ARRAY_SIZE(rkvdec_h264_decoded_fmts), + .decoded_fmts =3D rkvdec_h264_decoded_fmts, .subsystem_flags =3D VB2_V4L2_FL_SUPPORTS_M2M_HOLD_CAPTURE_BUF, }, { @@ -269,8 +289,8 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_= fmts[] =3D { }, .ctrls =3D &rkvdec_vp9_ctrls, .ops =3D &rkvdec_vp9_fmt_ops, - .num_decoded_fmts =3D ARRAY_SIZE(rkvdec_h264_vp9_decoded_fmts), - .decoded_fmts =3D rkvdec_h264_vp9_decoded_fmts, + .num_decoded_fmts =3D ARRAY_SIZE(rkvdec_vp9_decoded_fmts), + .decoded_fmts =3D rkvdec_vp9_decoded_fmts, } }; =20 diff --git a/drivers/staging/media/rkvdec/rkvdec.h b/drivers/staging/media/= rkvdec/rkvdec.h index e466a2753ccf..9a9f4fced7a1 100644 --- a/drivers/staging/media/rkvdec/rkvdec.h +++ b/drivers/staging/media/rkvdec/rkvdec.h @@ -80,6 +80,9 @@ struct rkvdec_coded_fmt_ops { enum rkvdec_image_fmt { RKVDEC_IMG_FMT_ANY =3D 0, RKVDEC_IMG_FMT_420_8BIT, + RKVDEC_IMG_FMT_420_10BIT, + RKVDEC_IMG_FMT_422_8BIT, + RKVDEC_IMG_FMT_422_10BIT, }; =20 struct rkvdec_decoded_fmt_desc { --=20 2.46.0