Message ID | 20220331193726.289559-16-nicolas.dufresne@collabora.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Hans Verkuil |
Headers |
Received: from vger.kernel.org ([23.128.96.18]) by www.linuxtv.org with esmtp (Exim 4.92) (envelope-from <linux-media-owner@vger.kernel.org>) id 1na0cp-00EjnF-TP; Thu, 31 Mar 2022 19:38:32 +0000 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241049AbiCaTkP (ORCPT <rfc822;mkrufky@linuxtv.org> + 1 other); Thu, 31 Mar 2022 15:40:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46954 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240887AbiCaTjy (ORCPT <rfc822;linux-media@vger.kernel.org>); Thu, 31 Mar 2022 15:39:54 -0400 Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A7BC623F3ED; Thu, 31 Mar 2022 12:37:59 -0700 (PDT) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: nicolas) with ESMTPSA id 422C41F4725B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1648755478; bh=n6MPrL7fQ9yMzjnP11oTkFqivourvSLa0aWHcN/kENg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jkEylmlesJkAj/v1WszIOWWnTqVvM5yv/nbStUOKJ7IsZuMzohiE12OqgETjnrjws 0sO7cTfSLluqql9ZvlMIAG+O+mLQsHVOh+A30WQ6sz0JXqICdTNXwM1SIQSV8pnVeU hZCtn5pSTa6++6wSEcsyyFGzt9xjp+qEtTo9syicqb4eBoI+9gSIKIb4ubcGmTqWWe SOhW1vW9cWFx90iSef9jrGTYd6+yV826nWnRkxVRcd6sxXBb/Z/14wSZUAe/32v6bz p6PTyc9uUEbB9bpyK+Gth3D10QNCf5b2LXC56dsKWaBQ1IiMpzmpXj642yOyrynz3V XbUiJSobUUpZg== From: Nicolas Dufresne <nicolas.dufresne@collabora.com> To: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>, Mauro Carvalho Chehab <mchehab@kernel.org>, Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: kernel@collabora.com, Jonas Karlman <jonas@kwiboo.se>, Sebastian Fricke <sebastian.fricke@collabora.com>, linux-media@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH v2 15/23] media: rkvdec: h264: Validate and use pic width and height in mbs Date: Thu, 31 Mar 2022 15:37:17 -0400 Message-Id: <20220331193726.289559-16-nicolas.dufresne@collabora.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220331193726.289559-1-nicolas.dufresne@collabora.com> References: <20220331193726.289559-1-nicolas.dufresne@collabora.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-media.vger.kernel.org> X-Mailing-List: linux-media@vger.kernel.org X-LSpam-Score: -2.5 (--) X-LSpam-Report: No, score=-2.5 required=5.0 tests=BAYES_00=-1.9,DKIM_SIGNED=0.1,DKIM_VALID=-0.1,DKIM_VALID_AU=-0.1,HEADER_FROM_DIFFERENT_DOMAINS=0.5,MAILING_LIST_MULTI=-1,UNPARSEABLE_RELAY=0.001 autolearn=ham autolearn_force=no |
Series |
[v2,01/23] media: doc: Document dual use of H.264 pic_num/frame_num
|
|
Commit Message
Nicolas Dufresne
March 31, 2022, 7:37 p.m. UTC
From: Jonas Karlman <jonas@kwiboo.se> The width and height in macroblocks is currently configured based on OUTPUT buffer resolution, this works for frame pictures but can cause issues for field pictures. When frame_mbs_only_flag is 0 the height in mbs should be height of the field instead of height of frame. Validate pic_width_in_mbs_minus1 and pic_height_in_map_units_minus1 against OUTPUT buffer resolution and use these values to configure HW. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Sebastian Fricke <sebastian.fricke@collabora.com> --- drivers/staging/media/rkvdec/rkvdec-h264.c | 4 ++-- drivers/staging/media/rkvdec/rkvdec.c | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-)
Comments
Hi Nicolas, On Thu, Mar 31, 2022 at 03:37:17PM -0400, Nicolas Dufresne wrote: > From: Jonas Karlman <jonas@kwiboo.se> > > The width and height in macroblocks is currently configured based on OUTPUT > buffer resolution, this works for frame pictures but can cause issues for > field pictures. > > When frame_mbs_only_flag is 0 the height in mbs should be height of > the field instead of height of frame. > > Validate pic_width_in_mbs_minus1 and pic_height_in_map_units_minus1 > against OUTPUT buffer resolution and use these values to configure HW. > > Signed-off-by: Jonas Karlman <jonas@kwiboo.se> > Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> > Reviewed-by: Sebastian Fricke <sebastian.fricke@collabora.com> > --- > drivers/staging/media/rkvdec/rkvdec-h264.c | 4 ++-- > drivers/staging/media/rkvdec/rkvdec.c | 10 ++++++++++ > 2 files changed, 12 insertions(+), 2 deletions(-) > > diff --git a/drivers/staging/media/rkvdec/rkvdec-h264.c b/drivers/staging/media/rkvdec/rkvdec-h264.c > index 8d44a884a52e..a42cf19bcc6d 100644 > --- a/drivers/staging/media/rkvdec/rkvdec-h264.c > +++ b/drivers/staging/media/rkvdec/rkvdec-h264.c > @@ -672,8 +672,8 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, > LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4); > WRITE_PPS(!!(sps->flags & V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO), > DELTA_PIC_ORDER_ALWAYS_ZERO_FLAG); > - WRITE_PPS(DIV_ROUND_UP(ctx->coded_fmt.fmt.pix_mp.width, 16), PIC_WIDTH_IN_MBS); > - WRITE_PPS(DIV_ROUND_UP(ctx->coded_fmt.fmt.pix_mp.height, 16), PIC_HEIGHT_IN_MBS); Please add a comment so we don't forget why we use the bitstream fields here. > + WRITE_PPS(sps->pic_width_in_mbs_minus1 + 1, PIC_WIDTH_IN_MBS); > + WRITE_PPS(sps->pic_height_in_map_units_minus1 + 1, PIC_HEIGHT_IN_MBS); > WRITE_PPS(!!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY), > FRAME_MBS_ONLY_FLAG); > WRITE_PPS(!!(sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD), > diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c > index 2df8cf4883e2..1b805710e195 100644 > --- a/drivers/staging/media/rkvdec/rkvdec.c > +++ b/drivers/staging/media/rkvdec/rkvdec.c > @@ -29,8 +29,11 @@ > > static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl) > { > + struct rkvdec_ctx *ctx = container_of(ctrl->handler, struct rkvdec_ctx, ctrl_hdl); > + > if (ctrl->id == V4L2_CID_STATELESS_H264_SPS) { > const struct v4l2_ctrl_h264_sps *sps = ctrl->p_new.p_h264_sps; > + unsigned int width, height; > /* > * TODO: The hardware supports 10-bit and 4:2:2 profiles, > * but it's currently broken in the driver. > @@ -45,6 +48,13 @@ static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl) > if (sps->bit_depth_luma_minus8 != 0) > /* Only 8-bit is supported */ > return -EINVAL; > + > + width = (sps->pic_width_in_mbs_minus1 + 1) * 16; > + height = (sps->pic_height_in_map_units_minus1 + 1) * 16; > + Let's please add a comment here, clarifying it's legal to check the coded format (OUTPUT queue format) at .try_ctrl time, because the stateless decoder specification [1] mandates S_FMT on the OUTPUT queue, before passing the SPS/PPS controls. [1] https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/dev-stateless-decoder.html > + if (width > ctx->coded_fmt.fmt.pix_mp.width || > + height > ctx->coded_fmt.fmt.pix_mp.height) Can you add a debug message or error message? These silent errors tend to get super hard to track. With these changes: Reviewed-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> Thanks, Ezequiel
Le samedi 02 avril 2022 à 08:32 -0300, Ezequiel Garcia a écrit : > Hi Nicolas, > > On Thu, Mar 31, 2022 at 03:37:17PM -0400, Nicolas Dufresne wrote: > > From: Jonas Karlman <jonas@kwiboo.se> > > > > The width and height in macroblocks is currently configured based on OUTPUT > > buffer resolution, this works for frame pictures but can cause issues for > > field pictures. > > > > When frame_mbs_only_flag is 0 the height in mbs should be height of > > the field instead of height of frame. > > > > Validate pic_width_in_mbs_minus1 and pic_height_in_map_units_minus1 > > against OUTPUT buffer resolution and use these values to configure HW. > > > > Signed-off-by: Jonas Karlman <jonas@kwiboo.se> > > Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> > > Reviewed-by: Sebastian Fricke <sebastian.fricke@collabora.com> > > --- > > drivers/staging/media/rkvdec/rkvdec-h264.c | 4 ++-- > > drivers/staging/media/rkvdec/rkvdec.c | 10 ++++++++++ > > 2 files changed, 12 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/staging/media/rkvdec/rkvdec-h264.c b/drivers/staging/media/rkvdec/rkvdec-h264.c > > index 8d44a884a52e..a42cf19bcc6d 100644 > > --- a/drivers/staging/media/rkvdec/rkvdec-h264.c > > +++ b/drivers/staging/media/rkvdec/rkvdec-h264.c > > @@ -672,8 +672,8 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, > > LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4); > > WRITE_PPS(!!(sps->flags & V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO), > > DELTA_PIC_ORDER_ALWAYS_ZERO_FLAG); > > - WRITE_PPS(DIV_ROUND_UP(ctx->coded_fmt.fmt.pix_mp.width, 16), PIC_WIDTH_IN_MBS); > > - WRITE_PPS(DIV_ROUND_UP(ctx->coded_fmt.fmt.pix_mp.height, 16), PIC_HEIGHT_IN_MBS); > > Please add a comment so we don't forget why we use the bitstream > fields here. And perhaps I should clarify that only the height will vary. It remains nice if we can decode smaller images into larger image/format, that will be needed to handle the sub-layers in SVC (these are not to be displayed, so we don't care much about the output stride and all). So that is also an improvement. > > > + WRITE_PPS(sps->pic_width_in_mbs_minus1 + 1, PIC_WIDTH_IN_MBS); > > + WRITE_PPS(sps->pic_height_in_map_units_minus1 + 1, PIC_HEIGHT_IN_MBS); > > WRITE_PPS(!!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY), > > FRAME_MBS_ONLY_FLAG); > > WRITE_PPS(!!(sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD), > > diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c > > index 2df8cf4883e2..1b805710e195 100644 > > --- a/drivers/staging/media/rkvdec/rkvdec.c > > +++ b/drivers/staging/media/rkvdec/rkvdec.c > > @@ -29,8 +29,11 @@ > > > > static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl) > > { > > + struct rkvdec_ctx *ctx = container_of(ctrl->handler, struct rkvdec_ctx, ctrl_hdl); > > + > > if (ctrl->id == V4L2_CID_STATELESS_H264_SPS) { > > const struct v4l2_ctrl_h264_sps *sps = ctrl->p_new.p_h264_sps; > > + unsigned int width, height; > > /* > > * TODO: The hardware supports 10-bit and 4:2:2 profiles, > > * but it's currently broken in the driver. > > @@ -45,6 +48,13 @@ static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl) > > if (sps->bit_depth_luma_minus8 != 0) > > /* Only 8-bit is supported */ > > return -EINVAL; > > + > > + width = (sps->pic_width_in_mbs_minus1 + 1) * 16; > > + height = (sps->pic_height_in_map_units_minus1 + 1) * 16; > > + > > Let's please add a comment here, clarifying it's legal to check > the coded format (OUTPUT queue format) at .try_ctrl time, > because the stateless decoder specification [1] mandates > S_FMT on the OUTPUT queue, before passing the SPS/PPS controls. Indeed, though I come to see some flaw in the validation. First, the height formula shall be base on formula 7-18 from the spec: FrameHeightInMbs = ( 2 − frame_mbs_only_flag ) * PicHeightInMapUnits So would be + height = (sps->pic_height_in_map_units_minus1 + 1) * 16; + if (sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY) + height *= 2; As this driver do interleaved interlaced buffer, not alternate. Finally, we should validate this again at STREAMON, since userland may have simply omitted to set the SPS at all. I'll try to improve this and drop the review tag to ensure this get fully reviewed again. > > [1] https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/dev-stateless-decoder.html > > > + if (width > ctx->coded_fmt.fmt.pix_mp.width || > > + height > ctx->coded_fmt.fmt.pix_mp.height) > > Can you add a debug message or error message? > These silent errors tend to get super hard to track. > > With these changes: > > Reviewed-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> > > Thanks, > Ezequiel
Le mardi 05 avril 2022 à 11:44 -0400, Nicolas Dufresne a écrit : > Le samedi 02 avril 2022 à 08:32 -0300, Ezequiel Garcia a écrit : > > Hi Nicolas, > > > > On Thu, Mar 31, 2022 at 03:37:17PM -0400, Nicolas Dufresne wrote: > > > From: Jonas Karlman <jonas@kwiboo.se> > > > > > > The width and height in macroblocks is currently configured based on OUTPUT > > > buffer resolution, this works for frame pictures but can cause issues for > > > field pictures. > > > > > > When frame_mbs_only_flag is 0 the height in mbs should be height of > > > the field instead of height of frame. > > > > > > Validate pic_width_in_mbs_minus1 and pic_height_in_map_units_minus1 > > > against OUTPUT buffer resolution and use these values to configure HW. > > > > > > Signed-off-by: Jonas Karlman <jonas@kwiboo.se> > > > Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> > > > Reviewed-by: Sebastian Fricke <sebastian.fricke@collabora.com> > > > --- > > > drivers/staging/media/rkvdec/rkvdec-h264.c | 4 ++-- > > > drivers/staging/media/rkvdec/rkvdec.c | 10 ++++++++++ > > > 2 files changed, 12 insertions(+), 2 deletions(-) > > > > > > diff --git a/drivers/staging/media/rkvdec/rkvdec-h264.c b/drivers/staging/media/rkvdec/rkvdec-h264.c > > > index 8d44a884a52e..a42cf19bcc6d 100644 > > > --- a/drivers/staging/media/rkvdec/rkvdec-h264.c > > > +++ b/drivers/staging/media/rkvdec/rkvdec-h264.c > > > @@ -672,8 +672,8 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, > > > LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4); > > > WRITE_PPS(!!(sps->flags & V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO), > > > DELTA_PIC_ORDER_ALWAYS_ZERO_FLAG); > > > - WRITE_PPS(DIV_ROUND_UP(ctx->coded_fmt.fmt.pix_mp.width, 16), PIC_WIDTH_IN_MBS); > > > - WRITE_PPS(DIV_ROUND_UP(ctx->coded_fmt.fmt.pix_mp.height, 16), PIC_HEIGHT_IN_MBS); > > > > Please add a comment so we don't forget why we use the bitstream > > fields here. > > And perhaps I should clarify that only the height will vary. It remains nice if > we can decode smaller images into larger image/format, that will be needed to > handle the sub-layers in SVC (these are not to be displayed, so we don't care > much about the output stride and all). So that is also an improvement. > > > > > > + WRITE_PPS(sps->pic_width_in_mbs_minus1 + 1, PIC_WIDTH_IN_MBS); > > > + WRITE_PPS(sps->pic_height_in_map_units_minus1 + 1, PIC_HEIGHT_IN_MBS); > > > WRITE_PPS(!!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY), > > > FRAME_MBS_ONLY_FLAG); > > > WRITE_PPS(!!(sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD), > > > diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c > > > index 2df8cf4883e2..1b805710e195 100644 > > > --- a/drivers/staging/media/rkvdec/rkvdec.c > > > +++ b/drivers/staging/media/rkvdec/rkvdec.c > > > @@ -29,8 +29,11 @@ > > > > > > static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl) > > > { > > > + struct rkvdec_ctx *ctx = container_of(ctrl->handler, struct rkvdec_ctx, ctrl_hdl); > > > + > > > if (ctrl->id == V4L2_CID_STATELESS_H264_SPS) { > > > const struct v4l2_ctrl_h264_sps *sps = ctrl->p_new.p_h264_sps; > > > + unsigned int width, height; > > > /* > > > * TODO: The hardware supports 10-bit and 4:2:2 profiles, > > > * but it's currently broken in the driver. > > > @@ -45,6 +48,13 @@ static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl) > > > if (sps->bit_depth_luma_minus8 != 0) > > > /* Only 8-bit is supported */ > > > return -EINVAL; > > > + > > > + width = (sps->pic_width_in_mbs_minus1 + 1) * 16; > > > + height = (sps->pic_height_in_map_units_minus1 + 1) * 16; > > > + > > > > Let's please add a comment here, clarifying it's legal to check > > the coded format (OUTPUT queue format) at .try_ctrl time, > > because the stateless decoder specification [1] mandates > > S_FMT on the OUTPUT queue, before passing the SPS/PPS controls. > > Indeed, though I come to see some flaw in the validation. First, the height > formula shall be base on formula 7-18 from the spec: > > FrameHeightInMbs = ( 2 − frame_mbs_only_flag ) * PicHeightInMapUnits > > So would be > > + height = (sps->pic_height_in_map_units_minus1 + 1) * 16; > + if (sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY) > + height *= 2; Oops, I meant: + if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY)) + height *= 2; > > As this driver do interleaved interlaced buffer, not alternate. Finally, we > should validate this again at STREAMON, since userland may have simply omitted > to set the SPS at all. I'll try to improve this and drop the review tag to > ensure this get fully reviewed again. > > > > > [1] https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/dev-stateless-decoder.html > > > > > + if (width > ctx->coded_fmt.fmt.pix_mp.width || > > > + height > ctx->coded_fmt.fmt.pix_mp.height) > > > > Can you add a debug message or error message? > > These silent errors tend to get super hard to track. > > > > With these changes: > > > > Reviewed-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> > > > > Thanks, > > Ezequiel >
diff --git a/drivers/staging/media/rkvdec/rkvdec-h264.c b/drivers/staging/media/rkvdec/rkvdec-h264.c index 8d44a884a52e..a42cf19bcc6d 100644 --- a/drivers/staging/media/rkvdec/rkvdec-h264.c +++ b/drivers/staging/media/rkvdec/rkvdec-h264.c @@ -672,8 +672,8 @@ static void assemble_hw_pps(struct rkvdec_ctx *ctx, LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4); WRITE_PPS(!!(sps->flags & V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO), DELTA_PIC_ORDER_ALWAYS_ZERO_FLAG); - WRITE_PPS(DIV_ROUND_UP(ctx->coded_fmt.fmt.pix_mp.width, 16), PIC_WIDTH_IN_MBS); - WRITE_PPS(DIV_ROUND_UP(ctx->coded_fmt.fmt.pix_mp.height, 16), PIC_HEIGHT_IN_MBS); + WRITE_PPS(sps->pic_width_in_mbs_minus1 + 1, PIC_WIDTH_IN_MBS); + WRITE_PPS(sps->pic_height_in_map_units_minus1 + 1, PIC_HEIGHT_IN_MBS); WRITE_PPS(!!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY), FRAME_MBS_ONLY_FLAG); WRITE_PPS(!!(sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD), diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c index 2df8cf4883e2..1b805710e195 100644 --- a/drivers/staging/media/rkvdec/rkvdec.c +++ b/drivers/staging/media/rkvdec/rkvdec.c @@ -29,8 +29,11 @@ static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl) { + struct rkvdec_ctx *ctx = container_of(ctrl->handler, struct rkvdec_ctx, ctrl_hdl); + if (ctrl->id == V4L2_CID_STATELESS_H264_SPS) { const struct v4l2_ctrl_h264_sps *sps = ctrl->p_new.p_h264_sps; + unsigned int width, height; /* * TODO: The hardware supports 10-bit and 4:2:2 profiles, * but it's currently broken in the driver. @@ -45,6 +48,13 @@ static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl) if (sps->bit_depth_luma_minus8 != 0) /* Only 8-bit is supported */ return -EINVAL; + + width = (sps->pic_width_in_mbs_minus1 + 1) * 16; + height = (sps->pic_height_in_map_units_minus1 + 1) * 16; + + if (width > ctx->coded_fmt.fmt.pix_mp.width || + height > ctx->coded_fmt.fmt.pix_mp.height) + return -EINVAL; } return 0; }