From nobody Wed Dec 17 05:52:12 2025 Received: from smtp.forwardemail.net (smtp.forwardemail.net [167.172.40.54]) (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 B903C16D4F2 for ; Tue, 18 Jun 2024 19:48:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=167.172.40.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718740099; cv=none; b=lo79sxin7A9awxIi6IG4c1E1e21QnXEhZJ0xoeLRhAN3XhakwBSt1Bp8Q7WASf46BirPw3BcndUXF+h/O1uZuKPnt1elF23Z7VRcIJKhG1RTP1InSdqKhCyqVBJ3VW90t3OWhipywCfAwbqJuXDyuKVyjtfvFxOqvtbCQzREW4I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718740099; c=relaxed/simple; bh=OaadSuDg3Zt5H3nbHytRHPm2vMT7VaQsyqyPaUwTe5Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mYxlReNzmjleTQx763Rca24xdBs05pZj6fMRJIJQb6su7cIOP3UAMw0P0ao9i/CDqu9At8T4mfYKnFDl14KtsLoJoC3OWx0UVLGfHnTJxjsO+nd0Nox/9zOPKqcO09zUnS4Gl/cbzzFH+ejNmHroA1/l3bvd088unwEbFoOeEs4= 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=BIuLLz8k; arc=none smtp.client-ip=167.172.40.54 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="BIuLLz8k" 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=1718740060; bh=vLg1vrLKWrSir1pSxtMB4wEHVQbTsj3SVKKsHL322Sc=; b=BIuLLz8kcmo0o6tNrR3Nm+pHYmj7fR34PKkcYECkXZzOHPU+v/zX4NVdWDiI9jWoIHkMqmchB XnnqsgPM8sgs3TRv+CaCvjCf76nEEpFRR8zmrslqDvTAeDiuGhKprOlFMJv0prSWmfKN3JAwcON 0kYJJ72CZ/kYGY3/J267OrXPBIY1osUvmukA1xiyfcz4RQxERqMj4h5JETC2iHDGJBDi4ywMWlt 1ALPuyDMqjmKYe5hpDuXTuePkV9rGqAo7mstp7BlBRvOidpijsNrJI42HFeIqIy0gjjcSUsRIkA qMl7iiGW8GC8tlRyNfj8Kjz3ARggGEHkck5ygZhroslA== 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 , Detlev Casanova , linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, Jonas Karlman Subject: [PATCH v5 10/10] media: rkvdec: h264: Support High 10 and 4:2:2 profiles Date: Tue, 18 Jun 2024 19:46:34 +0000 Message-ID: <20240618194647.742037-11-jonas@kwiboo.se> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20240618194647.742037-1-jonas@kwiboo.se> References: <20240618194647.742037-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, 167.172.40.54 X-ForwardEmail-ID: 6671e45a64ade33c9005a025 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 --- 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 455b9cd34b6a..f5e393d4377c 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -192,10 +192,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, }, { @@ -210,11 +211,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,21 +250,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, }, { @@ -266,8 +286,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.45.2