All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nicolas Dufresne <nicolas.dufresne@collabora.com>
To: Andrzej Pietrasiewicz <andrzej.p@collabora.com>,
	Hans Verkuil <hverkuil@xs4all.nl>,
	linux-media@vger.kernel.org
Cc: linux-rockchip@lists.infradead.org,
	linux-arm-kernel@lists.infradead.org,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>,
	Philipp Zabel <p.zabel@pengutronix.de>,
	Heiko Stuebner <heiko@sntech.de>,
	kernel@collabora.com
Subject: Re: [RFC 1/2] media: uapi: Add VP8 stateless encoder controls
Date: Fri, 31 Mar 2023 10:59:41 -0400	[thread overview]
Message-ID: <e9ed845111cf791650156c85e1c7c0765749f256.camel@collabora.com> (raw)
In-Reply-To: <0224abd9-df5b-0c79-6366-a52176a2e45b@collabora.com>

Hi,

Le lundi 27 mars 2023 à 14:53 +0200, Andrzej Pietrasiewicz a écrit :
> Hi,
> 
> W dniu 24.03.2023 o 19:49, Nicolas Dufresne pisze:
> > Le mercredi 22 mars 2023 à 11:06 +0100, Andrzej Pietrasiewicz a écrit :
> > > Hi Hans,
> > > 
> > > W dniu 21.03.2023 o 14:39, Hans Verkuil pisze:
> > > > Hi Andrzej,
> > > > 
> > > > On 09/03/2023 13:56, Andrzej Pietrasiewicz wrote:
> > > > > Add uAPI for stateless VP8 encoders.
> > > > > 
> > > > > Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
> > > > > ---
> > > > >    drivers/media/v4l2-core/v4l2-ctrls-core.c | 16 ++++
> > > > >    drivers/media/v4l2-core/v4l2-ctrls-defs.c |  5 ++
> > > > >    include/media/v4l2-ctrls.h                |  1 +
> > > > >    include/uapi/linux/v4l2-controls.h        | 91 +++++++++++++++++++++++
> > > > >    include/uapi/linux/videodev2.h            |  3 +
> > > > >    5 files changed, 116 insertions(+)
> > > > > 
> > > > > diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2-core/v4l2-ctrls-core.c
> > > > > index 29169170880a..5055e75d37bb 100644
> > > > > --- a/drivers/media/v4l2-core/v4l2-ctrls-core.c
> > > > > +++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c
> > > > > @@ -335,6 +335,9 @@ void v4l2_ctrl_type_op_log(const struct v4l2_ctrl *ctrl)
> > > > >    	case V4L2_CTRL_TYPE_VP9_FRAME:
> > > > >    		pr_cont("VP9_FRAME");
> > > > >    		break;
> > > > > +	case V4L2_CTRL_TYPE_VP8_ENCODE_PARAMS:
> > > > > +		pr_cont("VP8_ENCODE_PARAMS");
> > > > > +		break;
> > > > >    	case V4L2_CTRL_TYPE_HEVC_SPS:
> > > > >    		pr_cont("HEVC_SPS");
> > > > >    		break;
> > > > > @@ -568,6 +571,7 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
> > > > >    	struct v4l2_ctrl_hevc_pps *p_hevc_pps;
> > > > >    	struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering;
> > > > >    	struct v4l2_ctrl_hevc_decode_params *p_hevc_decode_params;
> > > > > +	struct v4l2_ctrl_vp8_encode_params *p_vp8_encode_params;
> > > > >    	struct v4l2_area *area;
> > > > >    	void *p = ptr.p + idx * ctrl->elem_size;
> > > > >    	unsigned int i;
> > > > > @@ -918,6 +922,15 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
> > > > >    			return -EINVAL;
> > > > >    		break;
> > > > >    
> > > > > +	case V4L2_CTRL_TYPE_VP8_ENCODE_PARAMS:
> > > > > +		p_vp8_encode_params = p;
> > > > > +		if (p_vp8_encode_params->loop_filter_level > 63)
> > > > > +			return -EINVAL;
> > > > > +
> > > > > +		if (p_vp8_encode_params->sharpness_level > 7)
> > > > > +			return -EINVAL;
> > > > > +		break;
> > > > > +
> > > > >    	default:
> > > > >    		return -EINVAL;
> > > > >    	}
> > > > > @@ -1602,6 +1615,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
> > > > >    	case V4L2_CTRL_TYPE_VP9_FRAME:
> > > > >    		elem_size = sizeof(struct v4l2_ctrl_vp9_frame);
> > > > >    		break;
> > > > > +	case V4L2_CTRL_TYPE_VP8_ENCODE_PARAMS:
> > > > > +		elem_size = sizeof(struct v4l2_ctrl_vp8_encode_params);
> > > > > +		break;
> > > > >    	case V4L2_CTRL_TYPE_AREA:
> > > > >    		elem_size = sizeof(struct v4l2_area);
> > > > >    		break;
> > > > > diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> > > > > index 564fedee2c88..935bd9a07bad 100644
> > > > > --- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> > > > > +++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> > > > > @@ -1182,6 +1182,8 @@ const char *v4l2_ctrl_get_name(u32 id)
> > > > >    	case V4L2_CID_STATELESS_MPEG2_QUANTISATION:		return "MPEG-2 Quantisation Matrices";
> > > > >    	case V4L2_CID_STATELESS_VP9_COMPRESSED_HDR:	return "VP9 Probabilities Updates";
> > > > >    	case V4L2_CID_STATELESS_VP9_FRAME:			return "VP9 Frame Decode Parameters";
> > > > > +	case V4L2_CID_STATELESS_VP8_ENCODE_PARAMS:		return "VP8 Encode Parameters";
> > > > > +	case V4L2_CID_STATELESS_VP8_ENCODE_QP:			return "VP8 Encode QP";
> > > > >    	case V4L2_CID_STATELESS_HEVC_SPS:			return "HEVC Sequence Parameter Set";
> > > > >    	case V4L2_CID_STATELESS_HEVC_PPS:			return "HEVC Picture Parameter Set";
> > > > >    	case V4L2_CID_STATELESS_HEVC_SLICE_PARAMS:		return "HEVC Slice Parameters";
> > > > > @@ -1531,6 +1533,9 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
> > > > >    	case V4L2_CID_STATELESS_VP9_FRAME:
> > > > >    		*type = V4L2_CTRL_TYPE_VP9_FRAME;
> > > > >    		break;
> > > > > +	case V4L2_CID_STATELESS_VP8_ENCODE_PARAMS:
> > > > > +		*type = V4L2_CTRL_TYPE_VP8_ENCODE_PARAMS;
> > > > > +		break;
> > > > 
> > > > Why isn't V4L2_CID_STATELESS_VP8_ENCODE_QP added here as well? I assume it is of
> > > > type INTEGER?
> > > > 
> > > 
> > > Thanks for pointing that.
> > > 
> > > And it is a simple integer, indeed.
> > > 
> > > > I also wonder if VP9 would have the same control, so that this could be called
> > > > V4L2_CID_STATELESS_VPX_ENCODE_QP. On the other hand, that might be overkill.
> > > > 
> > > 
> > > It seems to me that having a single kind of control for passing the
> > > requested QP value for both VP8 and VP9 makes sense. In fact, perhaps not
> > > restricting ourselves to VPX would make even more sense?
> > > 
> > > This touches the question of how we do rate control in general in stateless
> > > encoders. If the uAPI is to be independent of underlying hardware, then the only
> > > parameter userspace passes to the kernel is the required QP (which is determined
> > > entirely by userspace using whatever means it considers appropriate, for example
> > > judging by the last encoded frame(s) size(s)). Any other kinds of data would
> > > probably be somehow hardware-specific. So, I'm wondering if maybe even a
> > > 
> > > V4L2_CID_STATELESS_ENCODE_QP
> > > 
> > > is what we want?
> > 
> > We already have V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY which is bound to
> > V4L2_MPEG_VIDEO_BITRATE_MODE_CQ,
> 
> Nice catch. Both are used only by Venus. We could reuse it. But then there's
> the allowed range - which you do discuss below.
> 
> 
> which seems what we should expect form a
> > stateless encoder. In fact, adding the entire BITRATE_MODE would enable later
> > encoder that has firmware driven rate control to be able to add it easily
> > (similar to what we have in GPUs).
> > 
> > We don't need per frame type QP, as stateless encoder have requests, so we can
> > set the QP for each frame separately anyway.
> > 
> > > 
> > > This, in turn, brings another question of the range and interpretation of values
> > > that should be passed through this control. 0-255? 0-100? 0 = no quantization at
> > > all (i.e. highest quality) or maybe 0 = lowest possible quality?
> > 
> > It seems V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY has decided to go 0-100 regardless
> > of the CODEC. The API is not very inconsistent, like VPX_IN_QP does not even
> > document a range, and says its for VP8 only. Perhaps we could open it up, and
> > allow per codec range so we can match 1:1 with the CODEC specs ? We could only
> > allow that for stateless if we beleive abstracting it to 0-100 make is better in
> > general. Just that in stateless, we expect that number to be written in the
> > bitstream verbatim.
> > 
> 
> Do you mean to relax the 0-100 range of V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY
> and then use this control instead of adding a new one for stateless codecs,
> or to specifically add a new one, modeled after
> V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY?


Yes, I'd relax the range overall. And then, specifically for stateless, I'd
require it to match the codec spec specified range.

> 
> Regards,
> 
> Andrzej


WARNING: multiple messages have this Message-ID (diff)
From: Nicolas Dufresne <nicolas.dufresne@collabora.com>
To: Andrzej Pietrasiewicz <andrzej.p@collabora.com>,
	Hans Verkuil <hverkuil@xs4all.nl>,
	linux-media@vger.kernel.org
Cc: linux-rockchip@lists.infradead.org,
	linux-arm-kernel@lists.infradead.org,
	 Mauro Carvalho Chehab <mchehab@kernel.org>,
	Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>,
	 Philipp Zabel <p.zabel@pengutronix.de>,
	Heiko Stuebner <heiko@sntech.de>,
	kernel@collabora.com
Subject: Re: [RFC 1/2] media: uapi: Add VP8 stateless encoder controls
Date: Fri, 31 Mar 2023 10:59:41 -0400	[thread overview]
Message-ID: <e9ed845111cf791650156c85e1c7c0765749f256.camel@collabora.com> (raw)
In-Reply-To: <0224abd9-df5b-0c79-6366-a52176a2e45b@collabora.com>

Hi,

Le lundi 27 mars 2023 à 14:53 +0200, Andrzej Pietrasiewicz a écrit :
> Hi,
> 
> W dniu 24.03.2023 o 19:49, Nicolas Dufresne pisze:
> > Le mercredi 22 mars 2023 à 11:06 +0100, Andrzej Pietrasiewicz a écrit :
> > > Hi Hans,
> > > 
> > > W dniu 21.03.2023 o 14:39, Hans Verkuil pisze:
> > > > Hi Andrzej,
> > > > 
> > > > On 09/03/2023 13:56, Andrzej Pietrasiewicz wrote:
> > > > > Add uAPI for stateless VP8 encoders.
> > > > > 
> > > > > Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
> > > > > ---
> > > > >    drivers/media/v4l2-core/v4l2-ctrls-core.c | 16 ++++
> > > > >    drivers/media/v4l2-core/v4l2-ctrls-defs.c |  5 ++
> > > > >    include/media/v4l2-ctrls.h                |  1 +
> > > > >    include/uapi/linux/v4l2-controls.h        | 91 +++++++++++++++++++++++
> > > > >    include/uapi/linux/videodev2.h            |  3 +
> > > > >    5 files changed, 116 insertions(+)
> > > > > 
> > > > > diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2-core/v4l2-ctrls-core.c
> > > > > index 29169170880a..5055e75d37bb 100644
> > > > > --- a/drivers/media/v4l2-core/v4l2-ctrls-core.c
> > > > > +++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c
> > > > > @@ -335,6 +335,9 @@ void v4l2_ctrl_type_op_log(const struct v4l2_ctrl *ctrl)
> > > > >    	case V4L2_CTRL_TYPE_VP9_FRAME:
> > > > >    		pr_cont("VP9_FRAME");
> > > > >    		break;
> > > > > +	case V4L2_CTRL_TYPE_VP8_ENCODE_PARAMS:
> > > > > +		pr_cont("VP8_ENCODE_PARAMS");
> > > > > +		break;
> > > > >    	case V4L2_CTRL_TYPE_HEVC_SPS:
> > > > >    		pr_cont("HEVC_SPS");
> > > > >    		break;
> > > > > @@ -568,6 +571,7 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
> > > > >    	struct v4l2_ctrl_hevc_pps *p_hevc_pps;
> > > > >    	struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering;
> > > > >    	struct v4l2_ctrl_hevc_decode_params *p_hevc_decode_params;
> > > > > +	struct v4l2_ctrl_vp8_encode_params *p_vp8_encode_params;
> > > > >    	struct v4l2_area *area;
> > > > >    	void *p = ptr.p + idx * ctrl->elem_size;
> > > > >    	unsigned int i;
> > > > > @@ -918,6 +922,15 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
> > > > >    			return -EINVAL;
> > > > >    		break;
> > > > >    
> > > > > +	case V4L2_CTRL_TYPE_VP8_ENCODE_PARAMS:
> > > > > +		p_vp8_encode_params = p;
> > > > > +		if (p_vp8_encode_params->loop_filter_level > 63)
> > > > > +			return -EINVAL;
> > > > > +
> > > > > +		if (p_vp8_encode_params->sharpness_level > 7)
> > > > > +			return -EINVAL;
> > > > > +		break;
> > > > > +
> > > > >    	default:
> > > > >    		return -EINVAL;
> > > > >    	}
> > > > > @@ -1602,6 +1615,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
> > > > >    	case V4L2_CTRL_TYPE_VP9_FRAME:
> > > > >    		elem_size = sizeof(struct v4l2_ctrl_vp9_frame);
> > > > >    		break;
> > > > > +	case V4L2_CTRL_TYPE_VP8_ENCODE_PARAMS:
> > > > > +		elem_size = sizeof(struct v4l2_ctrl_vp8_encode_params);
> > > > > +		break;
> > > > >    	case V4L2_CTRL_TYPE_AREA:
> > > > >    		elem_size = sizeof(struct v4l2_area);
> > > > >    		break;
> > > > > diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> > > > > index 564fedee2c88..935bd9a07bad 100644
> > > > > --- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> > > > > +++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> > > > > @@ -1182,6 +1182,8 @@ const char *v4l2_ctrl_get_name(u32 id)
> > > > >    	case V4L2_CID_STATELESS_MPEG2_QUANTISATION:		return "MPEG-2 Quantisation Matrices";
> > > > >    	case V4L2_CID_STATELESS_VP9_COMPRESSED_HDR:	return "VP9 Probabilities Updates";
> > > > >    	case V4L2_CID_STATELESS_VP9_FRAME:			return "VP9 Frame Decode Parameters";
> > > > > +	case V4L2_CID_STATELESS_VP8_ENCODE_PARAMS:		return "VP8 Encode Parameters";
> > > > > +	case V4L2_CID_STATELESS_VP8_ENCODE_QP:			return "VP8 Encode QP";
> > > > >    	case V4L2_CID_STATELESS_HEVC_SPS:			return "HEVC Sequence Parameter Set";
> > > > >    	case V4L2_CID_STATELESS_HEVC_PPS:			return "HEVC Picture Parameter Set";
> > > > >    	case V4L2_CID_STATELESS_HEVC_SLICE_PARAMS:		return "HEVC Slice Parameters";
> > > > > @@ -1531,6 +1533,9 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
> > > > >    	case V4L2_CID_STATELESS_VP9_FRAME:
> > > > >    		*type = V4L2_CTRL_TYPE_VP9_FRAME;
> > > > >    		break;
> > > > > +	case V4L2_CID_STATELESS_VP8_ENCODE_PARAMS:
> > > > > +		*type = V4L2_CTRL_TYPE_VP8_ENCODE_PARAMS;
> > > > > +		break;
> > > > 
> > > > Why isn't V4L2_CID_STATELESS_VP8_ENCODE_QP added here as well? I assume it is of
> > > > type INTEGER?
> > > > 
> > > 
> > > Thanks for pointing that.
> > > 
> > > And it is a simple integer, indeed.
> > > 
> > > > I also wonder if VP9 would have the same control, so that this could be called
> > > > V4L2_CID_STATELESS_VPX_ENCODE_QP. On the other hand, that might be overkill.
> > > > 
> > > 
> > > It seems to me that having a single kind of control for passing the
> > > requested QP value for both VP8 and VP9 makes sense. In fact, perhaps not
> > > restricting ourselves to VPX would make even more sense?
> > > 
> > > This touches the question of how we do rate control in general in stateless
> > > encoders. If the uAPI is to be independent of underlying hardware, then the only
> > > parameter userspace passes to the kernel is the required QP (which is determined
> > > entirely by userspace using whatever means it considers appropriate, for example
> > > judging by the last encoded frame(s) size(s)). Any other kinds of data would
> > > probably be somehow hardware-specific. So, I'm wondering if maybe even a
> > > 
> > > V4L2_CID_STATELESS_ENCODE_QP
> > > 
> > > is what we want?
> > 
> > We already have V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY which is bound to
> > V4L2_MPEG_VIDEO_BITRATE_MODE_CQ,
> 
> Nice catch. Both are used only by Venus. We could reuse it. But then there's
> the allowed range - which you do discuss below.
> 
> 
> which seems what we should expect form a
> > stateless encoder. In fact, adding the entire BITRATE_MODE would enable later
> > encoder that has firmware driven rate control to be able to add it easily
> > (similar to what we have in GPUs).
> > 
> > We don't need per frame type QP, as stateless encoder have requests, so we can
> > set the QP for each frame separately anyway.
> > 
> > > 
> > > This, in turn, brings another question of the range and interpretation of values
> > > that should be passed through this control. 0-255? 0-100? 0 = no quantization at
> > > all (i.e. highest quality) or maybe 0 = lowest possible quality?
> > 
> > It seems V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY has decided to go 0-100 regardless
> > of the CODEC. The API is not very inconsistent, like VPX_IN_QP does not even
> > document a range, and says its for VP8 only. Perhaps we could open it up, and
> > allow per codec range so we can match 1:1 with the CODEC specs ? We could only
> > allow that for stateless if we beleive abstracting it to 0-100 make is better in
> > general. Just that in stateless, we expect that number to be written in the
> > bitstream verbatim.
> > 
> 
> Do you mean to relax the 0-100 range of V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY
> and then use this control instead of adding a new one for stateless codecs,
> or to specifically add a new one, modeled after
> V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY?


Yes, I'd relax the range overall. And then, specifically for stateless, I'd
require it to match the codec spec specified range.

> 
> Regards,
> 
> Andrzej


_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip

WARNING: multiple messages have this Message-ID (diff)
From: Nicolas Dufresne <nicolas.dufresne@collabora.com>
To: Andrzej Pietrasiewicz <andrzej.p@collabora.com>,
	Hans Verkuil <hverkuil@xs4all.nl>,
	linux-media@vger.kernel.org
Cc: linux-rockchip@lists.infradead.org,
	linux-arm-kernel@lists.infradead.org,
	 Mauro Carvalho Chehab <mchehab@kernel.org>,
	Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>,
	 Philipp Zabel <p.zabel@pengutronix.de>,
	Heiko Stuebner <heiko@sntech.de>,
	kernel@collabora.com
Subject: Re: [RFC 1/2] media: uapi: Add VP8 stateless encoder controls
Date: Fri, 31 Mar 2023 10:59:41 -0400	[thread overview]
Message-ID: <e9ed845111cf791650156c85e1c7c0765749f256.camel@collabora.com> (raw)
In-Reply-To: <0224abd9-df5b-0c79-6366-a52176a2e45b@collabora.com>

Hi,

Le lundi 27 mars 2023 à 14:53 +0200, Andrzej Pietrasiewicz a écrit :
> Hi,
> 
> W dniu 24.03.2023 o 19:49, Nicolas Dufresne pisze:
> > Le mercredi 22 mars 2023 à 11:06 +0100, Andrzej Pietrasiewicz a écrit :
> > > Hi Hans,
> > > 
> > > W dniu 21.03.2023 o 14:39, Hans Verkuil pisze:
> > > > Hi Andrzej,
> > > > 
> > > > On 09/03/2023 13:56, Andrzej Pietrasiewicz wrote:
> > > > > Add uAPI for stateless VP8 encoders.
> > > > > 
> > > > > Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com>
> > > > > ---
> > > > >    drivers/media/v4l2-core/v4l2-ctrls-core.c | 16 ++++
> > > > >    drivers/media/v4l2-core/v4l2-ctrls-defs.c |  5 ++
> > > > >    include/media/v4l2-ctrls.h                |  1 +
> > > > >    include/uapi/linux/v4l2-controls.h        | 91 +++++++++++++++++++++++
> > > > >    include/uapi/linux/videodev2.h            |  3 +
> > > > >    5 files changed, 116 insertions(+)
> > > > > 
> > > > > diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2-core/v4l2-ctrls-core.c
> > > > > index 29169170880a..5055e75d37bb 100644
> > > > > --- a/drivers/media/v4l2-core/v4l2-ctrls-core.c
> > > > > +++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c
> > > > > @@ -335,6 +335,9 @@ void v4l2_ctrl_type_op_log(const struct v4l2_ctrl *ctrl)
> > > > >    	case V4L2_CTRL_TYPE_VP9_FRAME:
> > > > >    		pr_cont("VP9_FRAME");
> > > > >    		break;
> > > > > +	case V4L2_CTRL_TYPE_VP8_ENCODE_PARAMS:
> > > > > +		pr_cont("VP8_ENCODE_PARAMS");
> > > > > +		break;
> > > > >    	case V4L2_CTRL_TYPE_HEVC_SPS:
> > > > >    		pr_cont("HEVC_SPS");
> > > > >    		break;
> > > > > @@ -568,6 +571,7 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
> > > > >    	struct v4l2_ctrl_hevc_pps *p_hevc_pps;
> > > > >    	struct v4l2_ctrl_hdr10_mastering_display *p_hdr10_mastering;
> > > > >    	struct v4l2_ctrl_hevc_decode_params *p_hevc_decode_params;
> > > > > +	struct v4l2_ctrl_vp8_encode_params *p_vp8_encode_params;
> > > > >    	struct v4l2_area *area;
> > > > >    	void *p = ptr.p + idx * ctrl->elem_size;
> > > > >    	unsigned int i;
> > > > > @@ -918,6 +922,15 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
> > > > >    			return -EINVAL;
> > > > >    		break;
> > > > >    
> > > > > +	case V4L2_CTRL_TYPE_VP8_ENCODE_PARAMS:
> > > > > +		p_vp8_encode_params = p;
> > > > > +		if (p_vp8_encode_params->loop_filter_level > 63)
> > > > > +			return -EINVAL;
> > > > > +
> > > > > +		if (p_vp8_encode_params->sharpness_level > 7)
> > > > > +			return -EINVAL;
> > > > > +		break;
> > > > > +
> > > > >    	default:
> > > > >    		return -EINVAL;
> > > > >    	}
> > > > > @@ -1602,6 +1615,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
> > > > >    	case V4L2_CTRL_TYPE_VP9_FRAME:
> > > > >    		elem_size = sizeof(struct v4l2_ctrl_vp9_frame);
> > > > >    		break;
> > > > > +	case V4L2_CTRL_TYPE_VP8_ENCODE_PARAMS:
> > > > > +		elem_size = sizeof(struct v4l2_ctrl_vp8_encode_params);
> > > > > +		break;
> > > > >    	case V4L2_CTRL_TYPE_AREA:
> > > > >    		elem_size = sizeof(struct v4l2_area);
> > > > >    		break;
> > > > > diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> > > > > index 564fedee2c88..935bd9a07bad 100644
> > > > > --- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> > > > > +++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
> > > > > @@ -1182,6 +1182,8 @@ const char *v4l2_ctrl_get_name(u32 id)
> > > > >    	case V4L2_CID_STATELESS_MPEG2_QUANTISATION:		return "MPEG-2 Quantisation Matrices";
> > > > >    	case V4L2_CID_STATELESS_VP9_COMPRESSED_HDR:	return "VP9 Probabilities Updates";
> > > > >    	case V4L2_CID_STATELESS_VP9_FRAME:			return "VP9 Frame Decode Parameters";
> > > > > +	case V4L2_CID_STATELESS_VP8_ENCODE_PARAMS:		return "VP8 Encode Parameters";
> > > > > +	case V4L2_CID_STATELESS_VP8_ENCODE_QP:			return "VP8 Encode QP";
> > > > >    	case V4L2_CID_STATELESS_HEVC_SPS:			return "HEVC Sequence Parameter Set";
> > > > >    	case V4L2_CID_STATELESS_HEVC_PPS:			return "HEVC Picture Parameter Set";
> > > > >    	case V4L2_CID_STATELESS_HEVC_SLICE_PARAMS:		return "HEVC Slice Parameters";
> > > > > @@ -1531,6 +1533,9 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
> > > > >    	case V4L2_CID_STATELESS_VP9_FRAME:
> > > > >    		*type = V4L2_CTRL_TYPE_VP9_FRAME;
> > > > >    		break;
> > > > > +	case V4L2_CID_STATELESS_VP8_ENCODE_PARAMS:
> > > > > +		*type = V4L2_CTRL_TYPE_VP8_ENCODE_PARAMS;
> > > > > +		break;
> > > > 
> > > > Why isn't V4L2_CID_STATELESS_VP8_ENCODE_QP added here as well? I assume it is of
> > > > type INTEGER?
> > > > 
> > > 
> > > Thanks for pointing that.
> > > 
> > > And it is a simple integer, indeed.
> > > 
> > > > I also wonder if VP9 would have the same control, so that this could be called
> > > > V4L2_CID_STATELESS_VPX_ENCODE_QP. On the other hand, that might be overkill.
> > > > 
> > > 
> > > It seems to me that having a single kind of control for passing the
> > > requested QP value for both VP8 and VP9 makes sense. In fact, perhaps not
> > > restricting ourselves to VPX would make even more sense?
> > > 
> > > This touches the question of how we do rate control in general in stateless
> > > encoders. If the uAPI is to be independent of underlying hardware, then the only
> > > parameter userspace passes to the kernel is the required QP (which is determined
> > > entirely by userspace using whatever means it considers appropriate, for example
> > > judging by the last encoded frame(s) size(s)). Any other kinds of data would
> > > probably be somehow hardware-specific. So, I'm wondering if maybe even a
> > > 
> > > V4L2_CID_STATELESS_ENCODE_QP
> > > 
> > > is what we want?
> > 
> > We already have V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY which is bound to
> > V4L2_MPEG_VIDEO_BITRATE_MODE_CQ,
> 
> Nice catch. Both are used only by Venus. We could reuse it. But then there's
> the allowed range - which you do discuss below.
> 
> 
> which seems what we should expect form a
> > stateless encoder. In fact, adding the entire BITRATE_MODE would enable later
> > encoder that has firmware driven rate control to be able to add it easily
> > (similar to what we have in GPUs).
> > 
> > We don't need per frame type QP, as stateless encoder have requests, so we can
> > set the QP for each frame separately anyway.
> > 
> > > 
> > > This, in turn, brings another question of the range and interpretation of values
> > > that should be passed through this control. 0-255? 0-100? 0 = no quantization at
> > > all (i.e. highest quality) or maybe 0 = lowest possible quality?
> > 
> > It seems V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY has decided to go 0-100 regardless
> > of the CODEC. The API is not very inconsistent, like VPX_IN_QP does not even
> > document a range, and says its for VP8 only. Perhaps we could open it up, and
> > allow per codec range so we can match 1:1 with the CODEC specs ? We could only
> > allow that for stateless if we beleive abstracting it to 0-100 make is better in
> > general. Just that in stateless, we expect that number to be written in the
> > bitstream verbatim.
> > 
> 
> Do you mean to relax the 0-100 range of V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY
> and then use this control instead of adding a new one for stateless codecs,
> or to specifically add a new one, modeled after
> V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY?


Yes, I'd relax the range overall. And then, specifically for stateless, I'd
require it to match the codec spec specified range.

> 
> Regards,
> 
> Andrzej


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2023-03-31 15:00 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-09 12:56 [RFC 0/2] VP8 stateless V4L2 encoding uAPI + driver Andrzej Pietrasiewicz
2023-03-09 12:56 ` Andrzej Pietrasiewicz
2023-03-09 12:56 ` Andrzej Pietrasiewicz
2023-03-09 12:56 ` [RFC 1/2] media: uapi: Add VP8 stateless encoder controls Andrzej Pietrasiewicz
2023-03-09 12:56   ` Andrzej Pietrasiewicz
2023-03-09 12:56   ` Andrzej Pietrasiewicz
2023-03-21 13:39   ` Hans Verkuil
2023-03-21 13:39     ` Hans Verkuil
2023-03-21 13:39     ` Hans Verkuil
2023-03-22 10:06     ` Andrzej Pietrasiewicz
2023-03-22 10:06       ` Andrzej Pietrasiewicz
2023-03-22 10:06       ` Andrzej Pietrasiewicz
2023-03-24 18:49       ` Nicolas Dufresne
2023-03-24 18:49         ` Nicolas Dufresne
2023-03-24 18:49         ` Nicolas Dufresne
2023-03-27 12:53         ` Andrzej Pietrasiewicz
2023-03-27 12:53           ` Andrzej Pietrasiewicz
2023-03-27 12:53           ` Andrzej Pietrasiewicz
2023-03-31 14:59           ` Nicolas Dufresne [this message]
2023-03-31 14:59             ` Nicolas Dufresne
2023-03-31 14:59             ` Nicolas Dufresne
2023-03-09 12:56 ` [RFC 2/2] media: rkvdec: Add VP8 encoder Andrzej Pietrasiewicz
2023-03-09 12:56   ` Andrzej Pietrasiewicz
2023-03-09 12:56   ` Andrzej Pietrasiewicz
2023-03-18 23:23   ` Daniel Almeida
2023-03-18 23:23     ` Daniel Almeida
2023-03-18 23:23     ` Daniel Almeida
2023-03-18 23:27     ` Dmitry Osipenko
2023-03-18 23:27       ` Dmitry Osipenko
2023-03-18 23:27       ` Dmitry Osipenko
2023-03-20 10:34       ` Andrzej Pietrasiewicz
2023-03-20 10:34         ` Andrzej Pietrasiewicz
2023-03-20 10:34         ` Andrzej Pietrasiewicz
2023-03-20 10:33     ` Andrzej Pietrasiewicz
2023-03-20 10:33       ` Andrzej Pietrasiewicz
2023-03-20 10:33       ` Andrzej Pietrasiewicz
2023-05-05 16:33   ` guan wentao
2023-05-05 16:33     ` guan wentao
2023-05-05 16:33     ` guan wentao
2023-05-20 18:57   ` Adam Ford
2023-05-20 18:57     ` Adam Ford
2023-05-20 18:57     ` Adam Ford
2023-05-23  6:42     ` Marco Felsch
2023-05-23  6:42       ` Marco Felsch
2023-05-23  6:42       ` Marco Felsch
2023-05-25 14:20       ` Nicolas Dufresne
2023-05-25 14:20         ` Nicolas Dufresne
2023-05-25 14:20         ` Nicolas Dufresne
2023-03-18  9:20 ` [RFC 0/2] VP8 stateless V4L2 encoding uAPI + driver Nicolas Frattaroli
2023-03-18  9:20   ` Nicolas Frattaroli
2023-03-18  9:20   ` Nicolas Frattaroli
2023-03-20 10:07   ` Andrzej Pietrasiewicz
2023-03-20 10:07     ` Andrzej Pietrasiewicz
2023-03-20 10:07     ` Andrzej Pietrasiewicz
2023-03-20 14:37     ` Nicolas Frattaroli
2023-03-20 14:37       ` Nicolas Frattaroli
2023-03-20 14:37       ` Nicolas Frattaroli

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e9ed845111cf791650156c85e1c7c0765749f256.camel@collabora.com \
    --to=nicolas.dufresne@collabora.com \
    --cc=andrzej.p@collabora.com \
    --cc=ezequiel@vanguardiasur.com.ar \
    --cc=heiko@sntech.de \
    --cc=hverkuil@xs4all.nl \
    --cc=kernel@collabora.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=mchehab@kernel.org \
    --cc=p.zabel@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.