From nobody Fri Dec 19 17:56:17 2025 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2E04CC4332F for ; Sun, 5 Nov 2023 17:06:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230120AbjKERGo (ORCPT ); Sun, 5 Nov 2023 12:06:44 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49766 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229485AbjKERGe (ORCPT ); Sun, 5 Nov 2023 12:06:34 -0500 Received: from smtp.forwardemail.net (smtp.forwardemail.net [149.28.215.223]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8D673CF; Sun, 5 Nov 2023 09:06:31 -0800 (PST) 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=1699203989; bh=WmsBIZTUryXo8sAoKKwOi0tlNS64CkDxgo5K4gfiot4=; b=dWnV8LMI4yaUluAmzqSRc780oE8KkxYXJ766IuIV+C7KMLeTDayvTUoFGRLBjgwEWQO422y3R G3Agw4uO2OdiC2oHEvn7WzfUN3aqCE41gviOY4xU2Nsc69VNj9j6RtI4c850hkoL/UM++ACftrG O6FAClJ47jWIWHZyFCkyb1zIP3zcjf/BIrmw1+sQtHl3vQfBWkz3nN7t20p9G/yUu3gFVKA0wCe xkX75Fw61bnYYaHCYsDCH73qRfroG6ZEfcsO+8aumYL0Relj0XqGshXGFTxV1nO6YzXEo16K5as ezQuCyd80lFKj3mDBawIjB8Nd2RlMGQYFpxIdE26g5/g== From: Jonas Karlman To: Ezequiel Garcia , Mauro Carvalho Chehab , Hans Verkuil , "Greg Kroah-Hartman" Cc: Alex Bee , Nicolas Dufresne , Benjamin Gaignard , Sebastian Fricke , Christopher Obbard , linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Jonas Karlman Subject: [PATCH v4 11/11] media: rkvdec: h264: Support High 10 and 4:2:2 profiles Date: Sun, 5 Nov 2023 16:55:10 +0000 Message-ID: <20231105165521.3592037-12-jonas@kwiboo.se> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231105165521.3592037-1-jonas@kwiboo.se> References: <20231105165521.3592037-1-jonas@kwiboo.se> 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, 149.28.215.223 X-ForwardEmail-ID: 6547c92b42ad2f8d15246969 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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 | 33 +++++++++++++++---- drivers/staging/media/rkvdec/rkvdec.h | 3 ++ 3 files changed, 57 insertions(+), 16 deletions(-) diff --git a/drivers/staging/media/rkvdec/rkvdec-h264.c b/drivers/staging/m= edia/rkvdec/rkvdec-h264.c index 815d5359ddd5..baac6d012ddd 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; @@ -1175,4 +1193,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 225aa1f0ac48..eb59605ccf28 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -73,7 +73,7 @@ static void rkvdec_fill_decoded_pixfmt(struct rkvdec_ctx = *ctx, struct v4l2_pix_format_mplane *pix_mp) { v4l2_fill_pixfmt_mp(pix_mp, pix_mp->pixelformat, - pix_mp->width, pix_mp->height); + ALIGN(pix_mp->width, 64), pix_mp->height); pix_mp->plane_fmt[0].sizeimage +=3D 128 * DIV_ROUND_UP(pix_mp->width, 16) * DIV_ROUND_UP(pix_mp->height, 16); @@ -193,7 +193,7 @@ static const struct rkvdec_ctrl_desc rkvdec_h264_ctrl_d= escs[] =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.max =3D V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422, .cfg.menu_skip_mask =3D BIT(V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED), .cfg.def =3D V4L2_MPEG_VIDEO_H264_PROFILE_MAIN, @@ -210,11 +210,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 { @@ -237,6 +249,13 @@ 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, @@ -250,8 +269,8 @@ static const struct rkvdec_coded_fmt_desc rkvdec_coded_= fmts[] =3D { }, .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, }, { @@ -266,8 +285,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.42.0