[PATCH v2 2/4] media: rockchip: Introduce the rkvdec2 driver
Detlev Casanova
detlev.casanova at collabora.com
Thu Jun 20 07:07:41 PDT 2024
Hi Jianfeng,
On Wednesday, June 19, 2024 1:46:23 P.M. EDT Jianfeng Liu wrote:
> Hi Detlev,
>
> On Wed, 19 Jun 2024 10:57:19 -0400, Detlev Casanova wrote:
> >+ if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY))
> >+ height *= 2;
> >+
> >+ if (width > ctx->coded_fmt.fmt.pix_mp.width ||
> >+ height > ctx->coded_fmt.fmt.pix_mp.height)
> >+ return -EINVAL;
>
> I did further invesatigation on chromium. I find that before real video
> is decoded, chromium will call VIDIOC_STREAMON twice with value of
> sps->flags 0:
>
> At the first time width and height are 16; ctx->coded_fmt.fmt.pix_mp.width
> and coded_fmt.fmt.pix_mp.height are 16, which are the min size of decoder;
> At the second time width and height are still 16; while
> coded_fmt.fmt.pix_mp.width is 1920 and coded_fmt.fmt.pix_mp.height is
> 1088, which are the real size of video.
>
> So VIDIOC_STREAMON will fall at the first time call because sps->flags is
> 0 so V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY is not set, and then height is
> doubled to 32 which is larger than 16.
>
> What do you think if we skip doubling height if sps->flags is 0 and at the
> same time V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY is not set? The following hack
> did fix my chromium:
>
> --- a/drivers/staging/media/rkvdec2/rkvdec2-h264.c
> +++ b/drivers/staging/media/rkvdec2/rkvdec2-h264.c
> @@ -767,7 +767,7 @@ static int rkvdec2_h264_validate_sps(struct rkvdec2_ctx
> *ctx, * which is half the final height (see (7-18) in the
> * specification)
> */
> - if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY))
> + if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY) && sps->flags)
> height *= 2;
>
> if (width > ctx->coded_fmt.fmt.pix_mp.width ||
I'm not sure what Chromium is trying to do here. But the spec is clear that
height should be multiplied by 2 (That's actually 7-8, not 7-18):
FrameHeightInMbs = ( 2 – frame_mbs_only_flag ) * PicHeightInMapUnits
This feels like hacking the driver to please a specific userspace application,
so I'd like to understand better what chromium is doing.
Regards,
Detlev.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.infradead.org/pipermail/linux-rockchip/attachments/20240620/c4ce54b6/attachment-0001.sig>
More information about the Linux-rockchip
mailing list