All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] media: v4l2-ctrls: Add encoded frame quality controls
@ 2020-05-18 21:07 Maheshwar Ajja
  2020-05-18 21:09 ` majja
  2020-05-23  1:05 ` [PATCH] media: v4l2-ctrls: Add encoder constant quality control Maheshwar Ajja
  0 siblings, 2 replies; 6+ messages in thread
From: Maheshwar Ajja @ 2020-05-18 21:07 UTC (permalink / raw)
  To: mchehab, hverkuil-cisco, paul.kocialkowski, p.zabel, ezequiel,
	jonas, boris.brezillon, posciak, ribalda, linux-media,
	linux-kernel
  Cc: Maheshwar Ajja, tglx, sumitg

When frame quality control is enabled encoder will choose
the appropriate quantization parameter and bitrate to
produce the client requested frame quality level.
When frame quality control is disabled then frame quality
is decided based on appropriate controls (i.e.
V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE and/or
V4L2_CID_MPEG_VIDEO_BITRATE_MODE)

Signed-off-by: Maheshwar Ajja <majja@codeaurora.org>
---
 .../userspace-api/media/v4l/ext-ctrls-codec.rst          | 16 ++++++++++++++++
 drivers/media/v4l2-core/v4l2-ctrls.c                     |  3 +++
 include/uapi/linux/v4l2-controls.h                       |  2 ++
 3 files changed, 21 insertions(+)

diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
index d0d506a..495b39b 100644
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
@@ -1081,6 +1081,22 @@ enum v4l2_mpeg_video_h264_entropy_mode -
     Macroblock level rate control enable. Applicable to the MPEG4 and
     H264 encoders.
 
+``V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE (boolean)``
+    Encoded frame quality control enable. If this control is enabled then
+    the quality level of the encoded frame is set with control
+    ``V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY``. If this control is disabled
+    then the quality level of encoded frame is adjusted with appropriate
+    controls (e.g. ``V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE`` or
+    ``V4L2_CID_MPEG_VIDEO_BITRATE_MODE``). Applicable to encoders.
+
+``V4L2_CID_MPEG_VIDEO_FRAME_QUALITY (integer)``
+    Encoded frame quality control. If the control
+    ``V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE`` is enabled then the
+    quality of encoded frame is set with this control. Valid range is 1 to
+    100 where 1 indicates lowest quality and 100 indicates highest quality.
+    Encoder will decide the appropriate quantization parameter and bitrate
+    to produce requested frame quality. Applicable to encoders.
+
 ``V4L2_CID_MPEG_VIDEO_MPEG4_QPEL (boolean)``
     Quarter pixel motion estimation for MPEG4. Applicable to the MPEG4
     encoder.
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index 1c617b4..1477198 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -982,6 +982,8 @@ const char *v4l2_ctrl_get_name(u32 id)
 	case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS:		return "HEVC Slice Parameters";
 	case V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE:		return "HEVC Decode Mode";
 	case V4L2_CID_MPEG_VIDEO_HEVC_START_CODE:		return "HEVC Start Code";
+	case V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE:		return "Frame Quality Enable";
+	case V4L2_CID_MPEG_VIDEO_FRAME_QUALITY:			return "Frame Quality";
 
 	/* CAMERA controls */
 	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
@@ -1178,6 +1180,7 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
 	case V4L2_CID_FLASH_READY:
 	case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
 	case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE:
+	case V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE:
 	case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
 	case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
 	case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index 0ba1005..d97a934 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -742,6 +742,8 @@ enum v4l2_cid_mpeg_video_hevc_size_of_length_field {
 #define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_BR	(V4L2_CID_MPEG_BASE + 642)
 #define V4L2_CID_MPEG_VIDEO_REF_NUMBER_FOR_PFRAMES	(V4L2_CID_MPEG_BASE + 643)
 #define V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR	(V4L2_CID_MPEG_BASE + 644)
+#define V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE	(V4L2_CID_MPEG_BASE + 645)
+#define V4L2_CID_MPEG_VIDEO_FRAME_QUALITY		(V4L2_CID_MPEG_BASE + 646)
 
 /*  MPEG-class control IDs specific to the CX2341x driver as defined by V4L2 */
 #define V4L2_CID_MPEG_CX2341X_BASE				(V4L2_CTRL_CLASS_MPEG | 0x1000)
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] media: v4l2-ctrls: Add encoded frame quality controls
  2020-05-18 21:07 [PATCH] media: v4l2-ctrls: Add encoded frame quality controls Maheshwar Ajja
@ 2020-05-18 21:09 ` majja
  2020-05-19  6:45   ` Hans Verkuil
  2020-05-23  1:05 ` [PATCH] media: v4l2-ctrls: Add encoder constant quality control Maheshwar Ajja
  1 sibling, 1 reply; 6+ messages in thread
From: majja @ 2020-05-18 21:09 UTC (permalink / raw)
  To: mchehab, hverkuil-cisco, paul.kocialkowski, p.zabel, ezequiel,
	jonas, boris.brezillon, posciak, ribalda, linux-media,
	linux-kernel
  Cc: tglx, sumitg

Hi,

Regarding below patch -

HEIF/HEIC image encoding uses HEVC/AVC encoders and client can set image 
quality level using
V4L2_CID_MPEG_VIDEO_FRAME_QUALITY control.

Reference BITRATE_MODE_CQ at
https://developer.android.com/reference/android/media/MediaCodecInfo.EncoderCapabilities#BITRATE_MODE_CQ

Regards,
     Maheshwar.


On 2020-05-18 14:07, Maheshwar Ajja wrote:
> When frame quality control is enabled encoder will choose
> the appropriate quantization parameter and bitrate to
> produce the client requested frame quality level.
> When frame quality control is disabled then frame quality
> is decided based on appropriate controls (i.e.
> V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE and/or
> V4L2_CID_MPEG_VIDEO_BITRATE_MODE)
> 
> Signed-off-by: Maheshwar Ajja <majja@codeaurora.org>
> ---
>  .../userspace-api/media/v4l/ext-ctrls-codec.rst          | 16 
> ++++++++++++++++
>  drivers/media/v4l2-core/v4l2-ctrls.c                     |  3 +++
>  include/uapi/linux/v4l2-controls.h                       |  2 ++
>  3 files changed, 21 insertions(+)
> 
> diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
> b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
> index d0d506a..495b39b 100644
> --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
> +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
> @@ -1081,6 +1081,22 @@ enum v4l2_mpeg_video_h264_entropy_mode -
>      Macroblock level rate control enable. Applicable to the MPEG4 and
>      H264 encoders.
> 
> +``V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE (boolean)``
> +    Encoded frame quality control enable. If this control is enabled 
> then
> +    the quality level of the encoded frame is set with control
> +    ``V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY``. If this control is 
> disabled
> +    then the quality level of encoded frame is adjusted with 
> appropriate
> +    controls (e.g. ``V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE`` or
> +    ``V4L2_CID_MPEG_VIDEO_BITRATE_MODE``). Applicable to encoders.
> +
> +``V4L2_CID_MPEG_VIDEO_FRAME_QUALITY (integer)``
> +    Encoded frame quality control. If the control
> +    ``V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE`` is enabled then the
> +    quality of encoded frame is set with this control. Valid range is 
> 1 to
> +    100 where 1 indicates lowest quality and 100 indicates highest 
> quality.
> +    Encoder will decide the appropriate quantization parameter and 
> bitrate
> +    to produce requested frame quality. Applicable to encoders.
> +
>  ``V4L2_CID_MPEG_VIDEO_MPEG4_QPEL (boolean)``
>      Quarter pixel motion estimation for MPEG4. Applicable to the MPEG4
>      encoder.
> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c
> b/drivers/media/v4l2-core/v4l2-ctrls.c
> index 1c617b4..1477198 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
> @@ -982,6 +982,8 @@ const char *v4l2_ctrl_get_name(u32 id)
>  	case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS:		return "HEVC Slice 
> Parameters";
>  	case V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE:		return "HEVC Decode 
> Mode";
>  	case V4L2_CID_MPEG_VIDEO_HEVC_START_CODE:		return "HEVC Start Code";
> +	case V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE:		return "Frame Quality 
> Enable";
> +	case V4L2_CID_MPEG_VIDEO_FRAME_QUALITY:			return "Frame Quality";
> 
>  	/* CAMERA controls */
>  	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
> @@ -1178,6 +1180,7 @@ void v4l2_ctrl_fill(u32 id, const char **name,
> enum v4l2_ctrl_type *type,
>  	case V4L2_CID_FLASH_READY:
>  	case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
>  	case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE:
> +	case V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE:
>  	case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
>  	case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
>  	case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:
> diff --git a/include/uapi/linux/v4l2-controls.h
> b/include/uapi/linux/v4l2-controls.h
> index 0ba1005..d97a934 100644
> --- a/include/uapi/linux/v4l2-controls.h
> +++ b/include/uapi/linux/v4l2-controls.h
> @@ -742,6 +742,8 @@ enum v4l2_cid_mpeg_video_hevc_size_of_length_field 
> {
>  #define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_BR	(V4L2_CID_MPEG_BASE 
> + 642)
>  #define V4L2_CID_MPEG_VIDEO_REF_NUMBER_FOR_PFRAMES	(V4L2_CID_MPEG_BASE 
> + 643)
>  #define V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR	(V4L2_CID_MPEG_BASE 
> + 644)
> +#define V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE	(V4L2_CID_MPEG_BASE + 
> 645)
> +#define V4L2_CID_MPEG_VIDEO_FRAME_QUALITY		(V4L2_CID_MPEG_BASE + 646)
> 
>  /*  MPEG-class control IDs specific to the CX2341x driver as defined 
> by V4L2 */
>  #define V4L2_CID_MPEG_CX2341X_BASE				(V4L2_CTRL_CLASS_MPEG | 0x1000)

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] media: v4l2-ctrls: Add encoded frame quality controls
  2020-05-18 21:09 ` majja
@ 2020-05-19  6:45   ` Hans Verkuil
  2020-05-23  0:57     ` majja
  0 siblings, 1 reply; 6+ messages in thread
From: Hans Verkuil @ 2020-05-19  6:45 UTC (permalink / raw)
  To: majja, mchehab, paul.kocialkowski, p.zabel, ezequiel, jonas,
	boris.brezillon, posciak, ribalda, linux-media, linux-kernel
  Cc: tglx, sumitg

Hi Maheshwar,

On 18/05/2020 23:09, majja@codeaurora.org wrote:
> Hi,
> 
> Regarding below patch -
> 
> HEIF/HEIC image encoding uses HEVC/AVC encoders and client can set image 
> quality level using
> V4L2_CID_MPEG_VIDEO_FRAME_QUALITY control.
> 
> Reference BITRATE_MODE_CQ at
> https://developer.android.com/reference/android/media/MediaCodecInfo.EncoderCapabilities#BITRATE_MODE_CQ

So what you are really introducing here is a new enum v4l2_mpeg_video_bitrate_mode
mode: V4L2_MPEG_VIDEO_BITRATE_MODE_CQ.

Why not just add that new mode, then add V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY
which is only used if the bitrate mode is MODE_CQ.

That builds nicely on top of the already existing V4L2_CID_MPEG_VIDEO_BITRATE_MODE
control.

Regards,

	Hans

> 
> Regards,
>      Maheshwar.
> 
> 
> On 2020-05-18 14:07, Maheshwar Ajja wrote:
>> When frame quality control is enabled encoder will choose
>> the appropriate quantization parameter and bitrate to
>> produce the client requested frame quality level.
>> When frame quality control is disabled then frame quality
>> is decided based on appropriate controls (i.e.
>> V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE and/or
>> V4L2_CID_MPEG_VIDEO_BITRATE_MODE)
>>
>> Signed-off-by: Maheshwar Ajja <majja@codeaurora.org>
>> ---
>>  .../userspace-api/media/v4l/ext-ctrls-codec.rst          | 16 
>> ++++++++++++++++
>>  drivers/media/v4l2-core/v4l2-ctrls.c                     |  3 +++
>>  include/uapi/linux/v4l2-controls.h                       |  2 ++
>>  3 files changed, 21 insertions(+)
>>
>> diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
>> b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
>> index d0d506a..495b39b 100644
>> --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
>> +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
>> @@ -1081,6 +1081,22 @@ enum v4l2_mpeg_video_h264_entropy_mode -
>>      Macroblock level rate control enable. Applicable to the MPEG4 and
>>      H264 encoders.
>>
>> +``V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE (boolean)``
>> +    Encoded frame quality control enable. If this control is enabled 
>> then
>> +    the quality level of the encoded frame is set with control
>> +    ``V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY``. If this control is 
>> disabled
>> +    then the quality level of encoded frame is adjusted with 
>> appropriate
>> +    controls (e.g. ``V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE`` or
>> +    ``V4L2_CID_MPEG_VIDEO_BITRATE_MODE``). Applicable to encoders.
>> +
>> +``V4L2_CID_MPEG_VIDEO_FRAME_QUALITY (integer)``
>> +    Encoded frame quality control. If the control
>> +    ``V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE`` is enabled then the
>> +    quality of encoded frame is set with this control. Valid range is 
>> 1 to
>> +    100 where 1 indicates lowest quality and 100 indicates highest 
>> quality.
>> +    Encoder will decide the appropriate quantization parameter and 
>> bitrate
>> +    to produce requested frame quality. Applicable to encoders.
>> +
>>  ``V4L2_CID_MPEG_VIDEO_MPEG4_QPEL (boolean)``
>>      Quarter pixel motion estimation for MPEG4. Applicable to the MPEG4
>>      encoder.
>> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c
>> b/drivers/media/v4l2-core/v4l2-ctrls.c
>> index 1c617b4..1477198 100644
>> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
>> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
>> @@ -982,6 +982,8 @@ const char *v4l2_ctrl_get_name(u32 id)
>>  	case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS:		return "HEVC Slice 
>> Parameters";
>>  	case V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE:		return "HEVC Decode 
>> Mode";
>>  	case V4L2_CID_MPEG_VIDEO_HEVC_START_CODE:		return "HEVC Start Code";
>> +	case V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE:		return "Frame Quality 
>> Enable";
>> +	case V4L2_CID_MPEG_VIDEO_FRAME_QUALITY:			return "Frame Quality";
>>
>>  	/* CAMERA controls */
>>  	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
>> @@ -1178,6 +1180,7 @@ void v4l2_ctrl_fill(u32 id, const char **name,
>> enum v4l2_ctrl_type *type,
>>  	case V4L2_CID_FLASH_READY:
>>  	case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
>>  	case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE:
>> +	case V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE:
>>  	case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
>>  	case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
>>  	case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:
>> diff --git a/include/uapi/linux/v4l2-controls.h
>> b/include/uapi/linux/v4l2-controls.h
>> index 0ba1005..d97a934 100644
>> --- a/include/uapi/linux/v4l2-controls.h
>> +++ b/include/uapi/linux/v4l2-controls.h
>> @@ -742,6 +742,8 @@ enum v4l2_cid_mpeg_video_hevc_size_of_length_field 
>> {
>>  #define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_BR	(V4L2_CID_MPEG_BASE 
>> + 642)
>>  #define V4L2_CID_MPEG_VIDEO_REF_NUMBER_FOR_PFRAMES	(V4L2_CID_MPEG_BASE 
>> + 643)
>>  #define V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR	(V4L2_CID_MPEG_BASE 
>> + 644)
>> +#define V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE	(V4L2_CID_MPEG_BASE + 
>> 645)
>> +#define V4L2_CID_MPEG_VIDEO_FRAME_QUALITY		(V4L2_CID_MPEG_BASE + 646)
>>
>>  /*  MPEG-class control IDs specific to the CX2341x driver as defined 
>> by V4L2 */
>>  #define V4L2_CID_MPEG_CX2341X_BASE				(V4L2_CTRL_CLASS_MPEG | 0x1000)


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] media: v4l2-ctrls: Add encoded frame quality controls
  2020-05-19  6:45   ` Hans Verkuil
@ 2020-05-23  0:57     ` majja
  0 siblings, 0 replies; 6+ messages in thread
From: majja @ 2020-05-23  0:57 UTC (permalink / raw)
  To: Hans Verkuil
  Cc: mchehab, paul.kocialkowski, p.zabel, ezequiel, jonas,
	boris.brezillon, posciak, ribalda, linux-media, linux-kernel,
	tglx, sumitg

Hi Hans,

Thank you for the suggestion. I will update the patch accordingly.

Regards,
     Maheshwar.


On 2020-05-18 23:45, Hans Verkuil wrote:
> Hi Maheshwar,
> 
> On 18/05/2020 23:09, majja@codeaurora.org wrote:
>> Hi,
>> 
>> Regarding below patch -
>> 
>> HEIF/HEIC image encoding uses HEVC/AVC encoders and client can set 
>> image
>> quality level using
>> V4L2_CID_MPEG_VIDEO_FRAME_QUALITY control.
>> 
>> Reference BITRATE_MODE_CQ at
>> https://developer.android.com/reference/android/media/MediaCodecInfo.EncoderCapabilities#BITRATE_MODE_CQ
> 
> So what you are really introducing here is a new enum
> v4l2_mpeg_video_bitrate_mode
> mode: V4L2_MPEG_VIDEO_BITRATE_MODE_CQ.
> 
> Why not just add that new mode, then add 
> V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY
> which is only used if the bitrate mode is MODE_CQ.
> 
> That builds nicely on top of the already existing
> V4L2_CID_MPEG_VIDEO_BITRATE_MODE
> control.
> 
> Regards,
> 
> 	Hans
> 
>> 
>> Regards,
>>      Maheshwar.
>> 
>> 
>> On 2020-05-18 14:07, Maheshwar Ajja wrote:
>>> When frame quality control is enabled encoder will choose
>>> the appropriate quantization parameter and bitrate to
>>> produce the client requested frame quality level.
>>> When frame quality control is disabled then frame quality
>>> is decided based on appropriate controls (i.e.
>>> V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE and/or
>>> V4L2_CID_MPEG_VIDEO_BITRATE_MODE)
>>> 
>>> Signed-off-by: Maheshwar Ajja <majja@codeaurora.org>
>>> ---
>>>  .../userspace-api/media/v4l/ext-ctrls-codec.rst          | 16
>>> ++++++++++++++++
>>>  drivers/media/v4l2-core/v4l2-ctrls.c                     |  3 +++
>>>  include/uapi/linux/v4l2-controls.h                       |  2 ++
>>>  3 files changed, 21 insertions(+)
>>> 
>>> diff --git 
>>> a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
>>> b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
>>> index d0d506a..495b39b 100644
>>> --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
>>> +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
>>> @@ -1081,6 +1081,22 @@ enum v4l2_mpeg_video_h264_entropy_mode -
>>>      Macroblock level rate control enable. Applicable to the MPEG4 
>>> and
>>>      H264 encoders.
>>> 
>>> +``V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE (boolean)``
>>> +    Encoded frame quality control enable. If this control is enabled
>>> then
>>> +    the quality level of the encoded frame is set with control
>>> +    ``V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY``. If this control is
>>> disabled
>>> +    then the quality level of encoded frame is adjusted with
>>> appropriate
>>> +    controls (e.g. ``V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE`` or
>>> +    ``V4L2_CID_MPEG_VIDEO_BITRATE_MODE``). Applicable to encoders.
>>> +
>>> +``V4L2_CID_MPEG_VIDEO_FRAME_QUALITY (integer)``
>>> +    Encoded frame quality control. If the control
>>> +    ``V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE`` is enabled then the
>>> +    quality of encoded frame is set with this control. Valid range 
>>> is
>>> 1 to
>>> +    100 where 1 indicates lowest quality and 100 indicates highest
>>> quality.
>>> +    Encoder will decide the appropriate quantization parameter and
>>> bitrate
>>> +    to produce requested frame quality. Applicable to encoders.
>>> +
>>>  ``V4L2_CID_MPEG_VIDEO_MPEG4_QPEL (boolean)``
>>>      Quarter pixel motion estimation for MPEG4. Applicable to the 
>>> MPEG4
>>>      encoder.
>>> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c
>>> b/drivers/media/v4l2-core/v4l2-ctrls.c
>>> index 1c617b4..1477198 100644
>>> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
>>> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
>>> @@ -982,6 +982,8 @@ const char *v4l2_ctrl_get_name(u32 id)
>>>  	case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS:		return "HEVC Slice
>>> Parameters";
>>>  	case V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE:		return "HEVC Decode
>>> Mode";
>>>  	case V4L2_CID_MPEG_VIDEO_HEVC_START_CODE:		return "HEVC Start 
>>> Code";
>>> +	case V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE:		return "Frame 
>>> Quality
>>> Enable";
>>> +	case V4L2_CID_MPEG_VIDEO_FRAME_QUALITY:			return "Frame Quality";
>>> 
>>>  	/* CAMERA controls */
>>>  	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
>>> @@ -1178,6 +1180,7 @@ void v4l2_ctrl_fill(u32 id, const char **name,
>>> enum v4l2_ctrl_type *type,
>>>  	case V4L2_CID_FLASH_READY:
>>>  	case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
>>>  	case V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE:
>>> +	case V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE:
>>>  	case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
>>>  	case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
>>>  	case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:
>>> diff --git a/include/uapi/linux/v4l2-controls.h
>>> b/include/uapi/linux/v4l2-controls.h
>>> index 0ba1005..d97a934 100644
>>> --- a/include/uapi/linux/v4l2-controls.h
>>> +++ b/include/uapi/linux/v4l2-controls.h
>>> @@ -742,6 +742,8 @@ enum 
>>> v4l2_cid_mpeg_video_hevc_size_of_length_field
>>> {
>>>  #define 
>>> V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_BR	(V4L2_CID_MPEG_BASE
>>> + 642)
>>>  #define 
>>> V4L2_CID_MPEG_VIDEO_REF_NUMBER_FOR_PFRAMES	(V4L2_CID_MPEG_BASE
>>> + 643)
>>>  #define 
>>> V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR	(V4L2_CID_MPEG_BASE
>>> + 644)
>>> +#define V4L2_CID_MPEG_VIDEO_FRAME_QUALITY_ENABLE	(V4L2_CID_MPEG_BASE 
>>> +
>>> 645)
>>> +#define V4L2_CID_MPEG_VIDEO_FRAME_QUALITY		(V4L2_CID_MPEG_BASE + 
>>> 646)
>>> 
>>>  /*  MPEG-class control IDs specific to the CX2341x driver as defined
>>> by V4L2 */
>>>  #define V4L2_CID_MPEG_CX2341X_BASE				(V4L2_CTRL_CLASS_MPEG | 
>>> 0x1000)

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH] media: v4l2-ctrls: Add encoder constant quality control
  2020-05-18 21:07 [PATCH] media: v4l2-ctrls: Add encoded frame quality controls Maheshwar Ajja
  2020-05-18 21:09 ` majja
@ 2020-05-23  1:05 ` Maheshwar Ajja
  2020-05-26 12:09   ` Hans Verkuil
  1 sibling, 1 reply; 6+ messages in thread
From: Maheshwar Ajja @ 2020-05-23  1:05 UTC (permalink / raw)
  To: mchehab, hverkuil-cisco, ezequiel, paul.kocialkowski, p.zabel,
	posciak, jonas, boris.brezillon, ribalda, tglx, sumitg,
	linux-media, linux-kernel
  Cc: Maheshwar Ajja

When V4L2_CID_MPEG_VIDEO_BITRATE_MODE value is
V4L2_MPEG_VIDEO_BITRATE_MODE_CQ, encoder will produce
constant quality output indicated by
V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY control value.
Encoder will choose appropriate quantization parameter
and bitrate to produce requested frame quality level.

Signed-off-by: Maheshwar Ajja <majja@codeaurora.org>
---
 Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst | 10 ++++++++++
 drivers/media/v4l2-core/v4l2-ctrls.c                      |  2 ++
 include/uapi/linux/v4l2-controls.h                        |  2 ++
 3 files changed, 14 insertions(+)

diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
index d0d506a..b9d3f7a 100644
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
@@ -581,6 +581,8 @@ enum v4l2_mpeg_video_bitrate_mode -
       - Variable bitrate
     * - ``V4L2_MPEG_VIDEO_BITRATE_MODE_CBR``
       - Constant bitrate
+    * - ``V4L2_MPEG_VIDEO_BITRATE_MODE_CQ``
+      - Constant quality
 
 
 
@@ -592,6 +594,14 @@ enum v4l2_mpeg_video_bitrate_mode -
     the average video bitrate. It is ignored if the video bitrate mode
     is set to constant bitrate.
 
+``V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY (integer)``
+    Constant quality level control. This control is applicable when
+    ``V4L2_CID_MPEG_VIDEO_BITRATE_MODE`` value is
+    ``V4L2_MPEG_VIDEO_BITRATE_MODE_CQ``. Valid range is 1 to 100
+    where 1 indicates lowest quality and 100 indicates highest quality.
+    Encoder will decide the appropriate quantization parameter and
+    bitrate to produce requested frame quality.
+
 ``V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION (integer)``
     For every captured frame, skip this many subsequent frames (default
     0).
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index 1c617b4..f94cc9d 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -199,6 +199,7 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
 	static const char * const mpeg_video_bitrate_mode[] = {
 		"Variable Bitrate",
 		"Constant Bitrate",
+		"Constant Quality",
 		NULL
 	};
 	static const char * const mpeg_stream_type[] = {
@@ -982,6 +983,7 @@ const char *v4l2_ctrl_get_name(u32 id)
 	case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS:		return "HEVC Slice Parameters";
 	case V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE:		return "HEVC Decode Mode";
 	case V4L2_CID_MPEG_VIDEO_HEVC_START_CODE:		return "HEVC Start Code";
+	case V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY:		return "Constant Quality";
 
 	/* CAMERA controls */
 	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index 0ba1005..ca916da 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -375,6 +375,7 @@ enum v4l2_mpeg_video_aspect {
 enum v4l2_mpeg_video_bitrate_mode {
 	V4L2_MPEG_VIDEO_BITRATE_MODE_VBR = 0,
 	V4L2_MPEG_VIDEO_BITRATE_MODE_CBR = 1,
+	V4L2_MPEG_VIDEO_BITRATE_MODE_CQ  = 2,
 };
 #define V4L2_CID_MPEG_VIDEO_BITRATE		(V4L2_CID_MPEG_BASE+207)
 #define V4L2_CID_MPEG_VIDEO_BITRATE_PEAK	(V4L2_CID_MPEG_BASE+208)
@@ -742,6 +743,7 @@ enum v4l2_cid_mpeg_video_hevc_size_of_length_field {
 #define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_BR	(V4L2_CID_MPEG_BASE + 642)
 #define V4L2_CID_MPEG_VIDEO_REF_NUMBER_FOR_PFRAMES	(V4L2_CID_MPEG_BASE + 643)
 #define V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR	(V4L2_CID_MPEG_BASE + 644)
+#define V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY		(V4L2_CID_MPEG_BASE + 645)
 
 /*  MPEG-class control IDs specific to the CX2341x driver as defined by V4L2 */
 #define V4L2_CID_MPEG_CX2341X_BASE				(V4L2_CTRL_CLASS_MPEG | 0x1000)
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] media: v4l2-ctrls: Add encoder constant quality control
  2020-05-23  1:05 ` [PATCH] media: v4l2-ctrls: Add encoder constant quality control Maheshwar Ajja
@ 2020-05-26 12:09   ` Hans Verkuil
  0 siblings, 0 replies; 6+ messages in thread
From: Hans Verkuil @ 2020-05-26 12:09 UTC (permalink / raw)
  To: Maheshwar Ajja, mchehab, ezequiel, paul.kocialkowski, p.zabel,
	posciak, jonas, boris.brezillon, ribalda, tglx, sumitg,
	linux-media, linux-kernel

On 23/05/2020 03:05, Maheshwar Ajja wrote:
> When V4L2_CID_MPEG_VIDEO_BITRATE_MODE value is
> V4L2_MPEG_VIDEO_BITRATE_MODE_CQ, encoder will produce
> constant quality output indicated by
> V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY control value.
> Encoder will choose appropriate quantization parameter
> and bitrate to produce requested frame quality level.
> 
> Signed-off-by: Maheshwar Ajja <majja@codeaurora.org>
> ---
>  Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst | 10 ++++++++++
>  drivers/media/v4l2-core/v4l2-ctrls.c                      |  2 ++
>  include/uapi/linux/v4l2-controls.h                        |  2 ++
>  3 files changed, 14 insertions(+)
> 
> diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
> index d0d506a..b9d3f7a 100644
> --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
> +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
> @@ -581,6 +581,8 @@ enum v4l2_mpeg_video_bitrate_mode -
>        - Variable bitrate
>      * - ``V4L2_MPEG_VIDEO_BITRATE_MODE_CBR``
>        - Constant bitrate
> +    * - ``V4L2_MPEG_VIDEO_BITRATE_MODE_CQ``
> +      - Constant quality
>  
>  
>  
> @@ -592,6 +594,14 @@ enum v4l2_mpeg_video_bitrate_mode -
>      the average video bitrate. It is ignored if the video bitrate mode
>      is set to constant bitrate.
>  
> +``V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY (integer)``
> +    Constant quality level control. This control is applicable when
> +    ``V4L2_CID_MPEG_VIDEO_BITRATE_MODE`` value is
> +    ``V4L2_MPEG_VIDEO_BITRATE_MODE_CQ``. Valid range is 1 to 100
> +    where 1 indicates lowest quality and 100 indicates highest quality.
> +    Encoder will decide the appropriate quantization parameter and
> +    bitrate to produce requested frame quality.
> +
>  ``V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION (integer)``
>      For every captured frame, skip this many subsequent frames (default
>      0).
> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
> index 1c617b4..f94cc9d 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
> @@ -199,6 +199,7 @@ const char * const *v4l2_ctrl_get_menu(u32 id)
>  	static const char * const mpeg_video_bitrate_mode[] = {
>  		"Variable Bitrate",
>  		"Constant Bitrate",
> +		"Constant Quality",
>  		NULL
>  	};
>  	static const char * const mpeg_stream_type[] = {
> @@ -982,6 +983,7 @@ const char *v4l2_ctrl_get_name(u32 id)
>  	case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS:		return "HEVC Slice Parameters";
>  	case V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE:		return "HEVC Decode Mode";
>  	case V4L2_CID_MPEG_VIDEO_HEVC_START_CODE:		return "HEVC Start Code";
> +	case V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY:		return "Constant Quality";

Add this to the codec controls that are earlier in this function (around line 925).

It's not HEVC specific, it can be used by any codec with constant quality support,
so it looks odd making this part of the HEVC controls.

Other than that, this looks good. Before it can be accepted we do need a driver
that supports this feature, so a second patch is needed that adds this to a driver
(I'm guessing that that will be the venus driver).

Regards,

	Hans

>  
>  	/* CAMERA controls */
>  	/* Keep the order of the 'case's the same as in v4l2-controls.h! */
> diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
> index 0ba1005..ca916da 100644
> --- a/include/uapi/linux/v4l2-controls.h
> +++ b/include/uapi/linux/v4l2-controls.h
> @@ -375,6 +375,7 @@ enum v4l2_mpeg_video_aspect {
>  enum v4l2_mpeg_video_bitrate_mode {
>  	V4L2_MPEG_VIDEO_BITRATE_MODE_VBR = 0,
>  	V4L2_MPEG_VIDEO_BITRATE_MODE_CBR = 1,
> +	V4L2_MPEG_VIDEO_BITRATE_MODE_CQ  = 2,
>  };
>  #define V4L2_CID_MPEG_VIDEO_BITRATE		(V4L2_CID_MPEG_BASE+207)
>  #define V4L2_CID_MPEG_VIDEO_BITRATE_PEAK	(V4L2_CID_MPEG_BASE+208)
> @@ -742,6 +743,7 @@ enum v4l2_cid_mpeg_video_hevc_size_of_length_field {
>  #define V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L6_BR	(V4L2_CID_MPEG_BASE + 642)
>  #define V4L2_CID_MPEG_VIDEO_REF_NUMBER_FOR_PFRAMES	(V4L2_CID_MPEG_BASE + 643)
>  #define V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR	(V4L2_CID_MPEG_BASE + 644)
> +#define V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY		(V4L2_CID_MPEG_BASE + 645)
>  
>  /*  MPEG-class control IDs specific to the CX2341x driver as defined by V4L2 */
>  #define V4L2_CID_MPEG_CX2341X_BASE				(V4L2_CTRL_CLASS_MPEG | 0x1000)
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-05-26 12:10 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-18 21:07 [PATCH] media: v4l2-ctrls: Add encoded frame quality controls Maheshwar Ajja
2020-05-18 21:09 ` majja
2020-05-19  6:45   ` Hans Verkuil
2020-05-23  0:57     ` majja
2020-05-23  1:05 ` [PATCH] media: v4l2-ctrls: Add encoder constant quality control Maheshwar Ajja
2020-05-26 12:09   ` Hans Verkuil

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.