linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/3] Add new controls for QP and layer bitrate
@ 2020-11-18  6:54 Dikshita Agarwal
  2020-11-18  6:54 ` [PATCH v3 1/3] media: v4l2-ctrl: Add frame-specific min/max qp controls for hevc Dikshita Agarwal
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Dikshita Agarwal @ 2020-11-18  6:54 UTC (permalink / raw)
  To: linux-media, hverkuil-cisco, nicolas, stanimir.varbanov
  Cc: linux-kernel, linux-arm-msm, vgarodia, Dikshita Agarwal

This series adds frame specific min/max qp controls for hevc and layer
wise bitrate control for h264.

Chnages since v2:
 - addressed comments.
 - added driver side implementation for new controls.

Dikshita Agarwal (3):
  media: v4l2-ctrl: Add frame-specific min/max qp controls for hevc
  media: v4l2-ctrl: Add layer wise bitrate controls for h264
  venus: venc: Add support for frame-specific min/max qp controls

 .../userspace-api/media/v4l/ext-ctrls-codec.rst    | 72 +++++++++++++++++++++-
 drivers/media/platform/qcom/venus/core.h           | 18 ++++++
 drivers/media/platform/qcom/venus/venc.c           | 21 +++++--
 drivers/media/platform/qcom/venus/venc_ctrls.c     | 51 +++++++++++++++
 drivers/media/v4l2-core/v4l2-ctrls.c               | 15 +++++
 include/uapi/linux/v4l2-controls.h                 | 17 +++++
 6 files changed, 187 insertions(+), 7 deletions(-)

-- 
2.7.4


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

* [PATCH v3 1/3] media: v4l2-ctrl: Add frame-specific min/max qp controls for hevc
  2020-11-18  6:54 [PATCH v3 0/3] Add new controls for QP and layer bitrate Dikshita Agarwal
@ 2020-11-18  6:54 ` Dikshita Agarwal
  2020-12-02 13:51   ` Hans Verkuil
  2020-11-18  6:54 ` [PATCH v3 2/3] media: v4l2-ctrl: Add layer wise bitrate controls for h264 Dikshita Agarwal
  2020-11-18  6:54 ` [PATCH v3 3/3] venus: venc: Add support for frame-specific min/max qp controls Dikshita Agarwal
  2 siblings, 1 reply; 7+ messages in thread
From: Dikshita Agarwal @ 2020-11-18  6:54 UTC (permalink / raw)
  To: linux-media, hverkuil-cisco, nicolas, stanimir.varbanov
  Cc: linux-kernel, linux-arm-msm, vgarodia, Dikshita Agarwal

- Adds min/max qp controls for B frame for h264.
- Adds min/max qp controls for I/P/B frames for hevc similar to h264.
- Update valid range of  mim/max qp for hevc to accommodate 10 bit.

Signed-off-by: Dikshita Agarwal <dikshita@codeaurora.org>
---
 .../userspace-api/media/v4l/ext-ctrls-codec.rst    | 52 +++++++++++++++++++++-
 drivers/media/v4l2-core/v4l2-ctrls.c               |  8 ++++
 include/uapi/linux/v4l2-controls.h                 |  9 ++++
 3 files changed, 67 insertions(+), 2 deletions(-)

diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
index aac1ea3..a9c7011 100644
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
@@ -1182,6 +1182,18 @@ enum v4l2_mpeg_video_h264_entropy_mode -
     V4L2_CID_MPEG_VIDEO_H264_MAX_QP is also set, the quantization parameter
     should be chosen to meet both requirements.
 
+``V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP (integer)``
+    Minimum quantization parameter for the H264 B frame to limit B frame
+    quality to a range. Valid range: from 0 to 51. If
+    V4L2_CID_MPEG_VIDEO_H264_MIN_QP is also set, the quantization parameter
+    should be chosen to meet both requirements.
+
+``V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP (integer)``
+    Maximum quantization parameter for the H264 B frame to limit B frame
+    quality to a range. Valid range: from 0 to 51. If
+    V4L2_CID_MPEG_VIDEO_H264_MAX_QP is also set, the quantization parameter
+    should be chosen to meet both requirements.
+
 ``V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP (integer)``
     Quantization parameter for an I frame for MPEG4. Valid range: from 1
     to 31.
@@ -3441,11 +3453,11 @@ HEVC/H.265 Control IDs
 
 ``V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP (integer)``
     Minimum quantization parameter for HEVC.
-    Valid range: from 0 to 51.
+    Valid range: from 0 - 51 for 8 bit and  0 - 63 for 10 bit.
 
 ``V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP (integer)``
     Maximum quantization parameter for HEVC.
-    Valid range: from 0 to 51.
+    Valid range: from 0 - 51 for 8 bit and 0 - 63 for 10 bit.
 
 ``V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP (integer)``
     Quantization parameter for an I frame for HEVC.
@@ -3462,6 +3474,42 @@ HEVC/H.265 Control IDs
     Valid range: [V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP,
     V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP].
 
+``V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP (integer)``
+    Minimum quantization parameter for the HEVC I frame to limit I frame
+    quality to a range. Valid range: from 0 to 51 for 8 bit, 0 - 63 for 10 bit.
+    If V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP is also set, the quantization parameter
+    should be chosen to meet both requirements.
+
+``V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP (integer)``
+    Maximum quantization parameter for the HEVC I frame to limit I frame
+    quality to a range. Valid range: from 0 to 51 for 8 bit, 0 - 63 for 10 bit.
+    If V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP is also set, the quantization parameter
+    should be chosen to meet both requirements.
+
+``V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP (integer)``
+    Minimum quantization parameter for the HEVC P frame to limit P frame
+    quality to a range. Valid range: from 0 to 51 for 8 bit, 0 - 63 for 10 bit.
+    If V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP is also set, the quantization parameter
+    should be chosen to meet both requirements.
+
+``V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP (integer)``
+    Maximum quantization parameter for the HEVC P frame to limit P frame
+    quality to a range. Valid range: from 0 to 51 for 8 bit, 0 - 63 for 10 bit.
+    If V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP is also set, the quantization parameter
+    should be chosen to meet both requirements.
+
+``V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP (integer)``
+    Minimum quantization parameter for the HEVC B frame to limit B frame
+    quality to a range. Valid range: from 0 to 51 for 8 bit, 0 - 63 for 10 bit.
+    If V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP is also set, the quantization parameter
+    should be chosen to meet both requirements.
+
+``V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP (integer)``
+    Maximum quantization parameter for the HEVC B frame to limit B frame
+    quality to a range. Valid range: from 0 to 51 for 8 bit, 0 - 63 for 10 bit.
+    If V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP is also set, the quantization parameter
+    should be chosen to meet both requirements.
+
 ``V4L2_CID_MPEG_VIDEO_HEVC_HIER_QP (boolean)``
     HIERARCHICAL_QP allows the host to specify the quantization parameter
     values for each temporal layer through HIERARCHICAL_QP_LAYER. This is
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index e8ee29e..6e74500 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -920,6 +920,8 @@ const char *v4l2_ctrl_get_name(u32 id)
 	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP:		return "H264 I-Frame Maximum QP Value";
 	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP:		return "H264 P-Frame Minimum QP Value";
 	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP:		return "H264 P-Frame Maximum QP Value";
+	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP:		return "H264 B-Frame Minimum QP Value";
+	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP:		return "H264 B-Frame Maximum QP Value";
 	case V4L2_CID_MPEG_VIDEO_H264_SPS:			return "H264 Sequence Parameter Set";
 	case V4L2_CID_MPEG_VIDEO_H264_PPS:			return "H264 Picture Parameter Set";
 	case V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX:		return "H264 Scaling Matrix";
@@ -982,6 +984,12 @@ const char *v4l2_ctrl_get_name(u32 id)
 	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:		return "HEVC B-Frame QP Value";
 	case V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP:			return "HEVC Minimum QP Value";
 	case V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP:			return "HEVC Maximum QP Value";
+	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP:		return "HEVC I-Frame Minimum QP Value";
+	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP:		return "HEVC I-Frame Maximum QP Value";
+	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP:		return "HEVC P-Frame Minimum QP Value";
+	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP:		return "HEVC P-Frame Maximum QP Value";
+	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP:		return "HEVC B-Frame Minimum QP Value";
+	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP:		return "HEVC B-Frame Maximum QP Value";
 	case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:			return "HEVC Profile";
 	case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:			return "HEVC Level";
 	case V4L2_CID_MPEG_VIDEO_HEVC_TIER:			return "HEVC Tier";
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index 14ce833..fea0f18 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -588,6 +588,8 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type {
 #define V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+386)
 #define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP	(V4L2_CID_MPEG_BASE+387)
 #define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+388)
+#define V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP	(V4L2_CID_MPEG_BASE+389)
+#define V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+390)
 #define V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP	(V4L2_CID_MPEG_BASE+400)
 #define V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP	(V4L2_CID_MPEG_BASE+401)
 #define V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP	(V4L2_CID_MPEG_BASE+402)
@@ -772,6 +774,13 @@ enum v4l2_cid_mpeg_video_hevc_size_of_length_field {
 #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)
 #define V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE		(V4L2_CID_MPEG_BASE + 646)
+#define V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP	(V4L2_CID_MPEG_BASE+647)
+#define V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+648)
+#define V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP	(V4L2_CID_MPEG_BASE+649)
+#define V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+650)
+#define V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP	(V4L2_CID_MPEG_BASE+651)
+#define V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+652)
+
 enum v4l2_mpeg_video_frame_skip_mode {
 	V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED	= 0,
 	V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_LEVEL_LIMIT	= 1,
-- 
2.7.4


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

* [PATCH v3 2/3] media: v4l2-ctrl: Add layer wise bitrate controls for h264
  2020-11-18  6:54 [PATCH v3 0/3] Add new controls for QP and layer bitrate Dikshita Agarwal
  2020-11-18  6:54 ` [PATCH v3 1/3] media: v4l2-ctrl: Add frame-specific min/max qp controls for hevc Dikshita Agarwal
@ 2020-11-18  6:54 ` Dikshita Agarwal
  2020-11-18  6:54 ` [PATCH v3 3/3] venus: venc: Add support for frame-specific min/max qp controls Dikshita Agarwal
  2 siblings, 0 replies; 7+ messages in thread
From: Dikshita Agarwal @ 2020-11-18  6:54 UTC (permalink / raw)
  To: linux-media, hverkuil-cisco, nicolas, stanimir.varbanov
  Cc: linux-kernel, linux-arm-msm, vgarodia, Dikshita Agarwal

Adds bitrate control for all coding layers for h264
same as hevc.

Signed-off-by: Dikshita Agarwal <dikshita@codeaurora.org>
---
 .../userspace-api/media/v4l/ext-ctrls-codec.rst      | 20 ++++++++++++++++++++
 drivers/media/v4l2-core/v4l2-ctrls.c                 |  7 +++++++
 include/uapi/linux/v4l2-controls.h                   |  8 ++++++++
 3 files changed, 35 insertions(+)

diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
index a9c7011..a334eef 100644
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
@@ -1513,6 +1513,26 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type -
     * - Bit 16:32
       - Layer number
 
+``V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L0_BR (integer)``
+    Indicates bit rate (bps) for hierarchical coding layer 0 for H264 encoder.
+
+``V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L1_BR (integer)``
+    Indicates bit rate (bps) for hierarchical coding layer 1 for H264 encoder.
+
+``V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L2_BR (integer)``
+    Indicates bit rate (bps) for hierarchical coding layer 2 for H264 encoder.
+
+``V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L3_BR (integer)``
+    Indicates bit rate (bps) for hierarchical coding layer 3 for H264 encoder.
+
+``V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L4_BR (integer)``
+    Indicates bit rate (bps) for hierarchical coding layer 4 for H264 encoder.
+
+``V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L5_BR (integer)``
+    Indicates bit rate (bps) for hierarchical coding layer 5 for H264 encoder.
+
+``V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L6_BR (integer)``
+    Indicates bit rate (bps) for hierarchical coding layer 6 for H264 encoder.
 
 .. _v4l2-mpeg-h264:
 
diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
index 6e74500..31ae39c 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -922,6 +922,13 @@ const char *v4l2_ctrl_get_name(u32 id)
 	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP:		return "H264 P-Frame Maximum QP Value";
 	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP:		return "H264 B-Frame Minimum QP Value";
 	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP:		return "H264 B-Frame Maximum QP Value";
+	case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L0_BR:	return "H264 Hierarchical Lay 0 Bitrate";
+	case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L1_BR:	return "H264 Hierarchical Lay 1 Bitrate";
+	case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L2_BR:	return "H264 Hierarchical Lay 2 Bitrate";
+	case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L3_BR:	return "H264 Hierarchical Lay 3 Bitrate";
+	case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L4_BR:	return "H264 Hierarchical Lay 4 Bitrate";
+	case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L5_BR:	return "H264 Hierarchical Lay 5 Bitrate";
+	case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L6_BR:	return "H264 Hierarchical Lay 6 Bitrate";
 	case V4L2_CID_MPEG_VIDEO_H264_SPS:			return "H264 Sequence Parameter Set";
 	case V4L2_CID_MPEG_VIDEO_H264_PPS:			return "H264 Picture Parameter Set";
 	case V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX:		return "H264 Scaling Matrix";
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index fea0f18..0d8c080 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -590,12 +590,20 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type {
 #define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+388)
 #define V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP	(V4L2_CID_MPEG_BASE+389)
 #define V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+390)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L0_BR	(V4L2_CID_MPEG_BASE + 391)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L1_BR	(V4L2_CID_MPEG_BASE + 392)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L2_BR	(V4L2_CID_MPEG_BASE + 393)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L3_BR	(V4L2_CID_MPEG_BASE + 394)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L4_BR	(V4L2_CID_MPEG_BASE + 395)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L5_BR	(V4L2_CID_MPEG_BASE + 396)
+#define V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L6_BR	(V4L2_CID_MPEG_BASE + 397)
 #define V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP	(V4L2_CID_MPEG_BASE+400)
 #define V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP	(V4L2_CID_MPEG_BASE+401)
 #define V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP	(V4L2_CID_MPEG_BASE+402)
 #define V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP	(V4L2_CID_MPEG_BASE+403)
 #define V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP	(V4L2_CID_MPEG_BASE+404)
 #define V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL		(V4L2_CID_MPEG_BASE+405)
+
 enum v4l2_mpeg_video_mpeg4_level {
 	V4L2_MPEG_VIDEO_MPEG4_LEVEL_0	= 0,
 	V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B	= 1,
-- 
2.7.4


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

* [PATCH v3 3/3] venus: venc: Add support for frame-specific min/max qp controls
  2020-11-18  6:54 [PATCH v3 0/3] Add new controls for QP and layer bitrate Dikshita Agarwal
  2020-11-18  6:54 ` [PATCH v3 1/3] media: v4l2-ctrl: Add frame-specific min/max qp controls for hevc Dikshita Agarwal
  2020-11-18  6:54 ` [PATCH v3 2/3] media: v4l2-ctrl: Add layer wise bitrate controls for h264 Dikshita Agarwal
@ 2020-11-18  6:54 ` Dikshita Agarwal
  2020-12-02 13:36   ` Hans Verkuil
  2 siblings, 1 reply; 7+ messages in thread
From: Dikshita Agarwal @ 2020-11-18  6:54 UTC (permalink / raw)
  To: linux-media, hverkuil-cisco, nicolas, stanimir.varbanov
  Cc: linux-kernel, linux-arm-msm, vgarodia, Dikshita Agarwal

Add support for frame type specific min and max qp controls
for encoder.

Signed-off-by: Dikshita Agarwal <dikshita@codeaurora.org>
---
 drivers/media/platform/qcom/venus/core.h       | 18 +++++++++
 drivers/media/platform/qcom/venus/venc.c       | 21 ++++++++---
 drivers/media/platform/qcom/venus/venc_ctrls.c | 51 ++++++++++++++++++++++++++
 3 files changed, 85 insertions(+), 5 deletions(-)

diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
index 3bc129a..6a764c9 100644
--- a/drivers/media/platform/qcom/venus/core.h
+++ b/drivers/media/platform/qcom/venus/core.h
@@ -230,10 +230,28 @@ struct venc_controls {
 	u32 h264_b_qp;
 	u32 h264_min_qp;
 	u32 h264_max_qp;
+	u32 h264_i_min_qp;
+	u32 h264_i_max_qp;
+	u32 h264_p_min_qp;
+	u32 h264_p_max_qp;
+	u32 h264_b_min_qp;
+	u32 h264_b_max_qp;
 	u32 h264_loop_filter_mode;
 	s32 h264_loop_filter_alpha;
 	s32 h264_loop_filter_beta;
 
+	u32 hevc_i_qp;
+	u32 hevc_p_qp;
+	u32 hevc_b_qp;
+	u32 hevc_min_qp;
+	u32 hevc_max_qp;
+	u32 hevc_i_min_qp;
+	u32 hevc_i_max_qp;
+	u32 hevc_p_min_qp;
+	u32 hevc_p_max_qp;
+	u32 hevc_b_min_qp;
+	u32 hevc_b_max_qp;
+
 	u32 vp8_min_qp;
 	u32 vp8_max_qp;
 
diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c
index 0bf92cc..f2f5a85 100644
--- a/drivers/media/platform/qcom/venus/venc.c
+++ b/drivers/media/platform/qcom/venus/venc.c
@@ -668,17 +668,28 @@ static int venc_set_properties(struct venus_inst *inst)
 		return ret;
 
 	ptype = HFI_PROPERTY_PARAM_VENC_SESSION_QP;
-	quant.qp_i = ctr->h264_i_qp;
-	quant.qp_p = ctr->h264_p_qp;
-	quant.qp_b = ctr->h264_b_qp;
+	if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) {
+		quant.qp_i = ctr->hevc_i_qp;
+		quant.qp_p = ctr->hevc_p_qp;
+		quant.qp_b = ctr->hevc_b_qp;
+	} else {
+		quant.qp_i = ctr->h264_i_qp;
+		quant.qp_p = ctr->h264_p_qp;
+		quant.qp_b = ctr->h264_b_qp;
+	}
 	quant.layer_id = 0;
 	ret = hfi_session_set_property(inst, ptype, &quant);
 	if (ret)
 		return ret;
 
 	ptype = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE;
-	quant_range.min_qp = ctr->h264_min_qp;
-	quant_range.max_qp = ctr->h264_max_qp;
+	if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) {
+		quant_range.min_qp = ctr->hevc_min_qp;
+		quant_range.max_qp = ctr->hevc_max_qp;
+	} else {
+		quant_range.min_qp = ctr->h264_min_qp;
+		quant_range.max_qp = ctr->h264_max_qp;
+	}
 	quant_range.layer_id = 0;
 	ret = hfi_session_set_property(inst, ptype, &quant_range);
 	if (ret)
diff --git a/drivers/media/platform/qcom/venus/venc_ctrls.c b/drivers/media/platform/qcom/venus/venc_ctrls.c
index 0708b3b..cd131e3 100644
--- a/drivers/media/platform/qcom/venus/venc_ctrls.c
+++ b/drivers/media/platform/qcom/venus/venc_ctrls.c
@@ -125,9 +125,60 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
 	case V4L2_CID_MPEG_VIDEO_H264_MIN_QP:
 		ctr->h264_min_qp = ctrl->val;
 		break;
+	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP:
+		ctr->h264_i_min_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP:
+		ctr->h264_p_min_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP:
+		ctr->h264_b_min_qp = ctrl->val;
+		break;
 	case V4L2_CID_MPEG_VIDEO_H264_MAX_QP:
 		ctr->h264_max_qp = ctrl->val;
 		break;
+	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP:
+		ctr->h264_i_max_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP:
+		ctr->h264_p_max_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP:
+		ctr->h264_b_max_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP:
+		ctr->hevc_i_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP:
+		ctr->hevc_p_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:
+		ctr->hevc_b_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP:
+		ctr->hevc_min_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP:
+		ctr->hevc_i_min_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP:
+		ctr->hevc_p_min_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP:
+		ctr->hevc_b_min_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP:
+		ctr->hevc_max_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP:
+		ctr->hevc_i_max_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP:
+		ctr->hevc_p_max_qp = ctrl->val;
+		break;
+	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP:
+		ctr->hevc_b_max_qp = ctrl->val;
+		break;
 	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
 		ctr->multi_slice_mode = ctrl->val;
 		break;
-- 
2.7.4


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

* Re: [PATCH v3 3/3] venus: venc: Add support for frame-specific min/max qp controls
  2020-11-18  6:54 ` [PATCH v3 3/3] venus: venc: Add support for frame-specific min/max qp controls Dikshita Agarwal
@ 2020-12-02 13:36   ` Hans Verkuil
  2020-12-08 16:37     ` dikshita
  0 siblings, 1 reply; 7+ messages in thread
From: Hans Verkuil @ 2020-12-02 13:36 UTC (permalink / raw)
  To: Dikshita Agarwal, linux-media, nicolas, stanimir.varbanov
  Cc: linux-kernel, linux-arm-msm, vgarodia

On 18/11/2020 07:54, Dikshita Agarwal wrote:
> Add support for frame type specific min and max qp controls
> for encoder.
> 
> Signed-off-by: Dikshita Agarwal <dikshita@codeaurora.org>
> ---
>  drivers/media/platform/qcom/venus/core.h       | 18 +++++++++
>  drivers/media/platform/qcom/venus/venc.c       | 21 ++++++++---
>  drivers/media/platform/qcom/venus/venc_ctrls.c | 51 ++++++++++++++++++++++++++
>  3 files changed, 85 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
> index 3bc129a..6a764c9 100644
> --- a/drivers/media/platform/qcom/venus/core.h
> +++ b/drivers/media/platform/qcom/venus/core.h
> @@ -230,10 +230,28 @@ struct venc_controls {
>  	u32 h264_b_qp;
>  	u32 h264_min_qp;
>  	u32 h264_max_qp;
> +	u32 h264_i_min_qp;
> +	u32 h264_i_max_qp;
> +	u32 h264_p_min_qp;
> +	u32 h264_p_max_qp;
> +	u32 h264_b_min_qp;
> +	u32 h264_b_max_qp;
>  	u32 h264_loop_filter_mode;
>  	s32 h264_loop_filter_alpha;
>  	s32 h264_loop_filter_beta;
>  
> +	u32 hevc_i_qp;
> +	u32 hevc_p_qp;
> +	u32 hevc_b_qp;
> +	u32 hevc_min_qp;
> +	u32 hevc_max_qp;
> +	u32 hevc_i_min_qp;
> +	u32 hevc_i_max_qp;
> +	u32 hevc_p_min_qp;
> +	u32 hevc_p_max_qp;
> +	u32 hevc_b_min_qp;
> +	u32 hevc_b_max_qp;
> +
>  	u32 vp8_min_qp;
>  	u32 vp8_max_qp;
>  
> diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c
> index 0bf92cc..f2f5a85 100644
> --- a/drivers/media/platform/qcom/venus/venc.c
> +++ b/drivers/media/platform/qcom/venus/venc.c
> @@ -668,17 +668,28 @@ static int venc_set_properties(struct venus_inst *inst)
>  		return ret;
>  
>  	ptype = HFI_PROPERTY_PARAM_VENC_SESSION_QP;
> -	quant.qp_i = ctr->h264_i_qp;
> -	quant.qp_p = ctr->h264_p_qp;
> -	quant.qp_b = ctr->h264_b_qp;
> +	if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) {
> +		quant.qp_i = ctr->hevc_i_qp;
> +		quant.qp_p = ctr->hevc_p_qp;
> +		quant.qp_b = ctr->hevc_b_qp;
> +	} else {
> +		quant.qp_i = ctr->h264_i_qp;
> +		quant.qp_p = ctr->h264_p_qp;
> +		quant.qp_b = ctr->h264_b_qp;
> +	}
>  	quant.layer_id = 0;
>  	ret = hfi_session_set_property(inst, ptype, &quant);
>  	if (ret)
>  		return ret;
>  
>  	ptype = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE;
> -	quant_range.min_qp = ctr->h264_min_qp;
> -	quant_range.max_qp = ctr->h264_max_qp;
> +	if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) {
> +		quant_range.min_qp = ctr->hevc_min_qp;
> +		quant_range.max_qp = ctr->hevc_max_qp;
> +	} else {
> +		quant_range.min_qp = ctr->h264_min_qp;
> +		quant_range.max_qp = ctr->h264_max_qp;
> +	}
>  	quant_range.layer_id = 0;
>  	ret = hfi_session_set_property(inst, ptype, &quant_range);
>  	if (ret)
> diff --git a/drivers/media/platform/qcom/venus/venc_ctrls.c b/drivers/media/platform/qcom/venus/venc_ctrls.c
> index 0708b3b..cd131e3 100644
> --- a/drivers/media/platform/qcom/venus/venc_ctrls.c
> +++ b/drivers/media/platform/qcom/venus/venc_ctrls.c
> @@ -125,9 +125,60 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
>  	case V4L2_CID_MPEG_VIDEO_H264_MIN_QP:
>  		ctr->h264_min_qp = ctrl->val;
>  		break;
> +	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP:
> +		ctr->h264_i_min_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP:
> +		ctr->h264_p_min_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP:
> +		ctr->h264_b_min_qp = ctrl->val;
> +		break;
>  	case V4L2_CID_MPEG_VIDEO_H264_MAX_QP:
>  		ctr->h264_max_qp = ctrl->val;
>  		break;
> +	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP:
> +		ctr->h264_i_max_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP:
> +		ctr->h264_p_max_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP:
> +		ctr->h264_b_max_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP:
> +		ctr->hevc_i_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP:
> +		ctr->hevc_p_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:
> +		ctr->hevc_b_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP:
> +		ctr->hevc_min_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP:
> +		ctr->hevc_i_min_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP:
> +		ctr->hevc_p_min_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP:
> +		ctr->hevc_b_min_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP:
> +		ctr->hevc_max_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP:
> +		ctr->hevc_i_max_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP:
> +		ctr->hevc_p_max_qp = ctrl->val;
> +		break;
> +	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP:
> +		ctr->hevc_b_max_qp = ctrl->val;
> +		break;
>  	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
>  		ctr->multi_slice_mode = ctrl->val;
>  		break;
> 

This looks incomplete: the new controls aren't actually added to the
driver with v4l2_ctrl_new_std(). Did you test this?

Regards,

	Hans

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

* Re: [PATCH v3 1/3] media: v4l2-ctrl: Add frame-specific min/max qp controls for hevc
  2020-11-18  6:54 ` [PATCH v3 1/3] media: v4l2-ctrl: Add frame-specific min/max qp controls for hevc Dikshita Agarwal
@ 2020-12-02 13:51   ` Hans Verkuil
  0 siblings, 0 replies; 7+ messages in thread
From: Hans Verkuil @ 2020-12-02 13:51 UTC (permalink / raw)
  To: Dikshita Agarwal, linux-media, nicolas, stanimir.varbanov
  Cc: linux-kernel, linux-arm-msm, vgarodia

Hi Dikshita,

Just a few nitpicks, I'd have changed it myself, but since a new version is
needed anyway you might as well change it for next time :-)

On 18/11/2020 07:54, Dikshita Agarwal wrote:
> - Adds min/max qp controls for B frame for h264.
> - Adds min/max qp controls for I/P/B frames for hevc similar to h264.
> - Update valid range of  mim/max qp for hevc to accommodate 10 bit.

double space after 'of'. Typo: mim -> min

> 
> Signed-off-by: Dikshita Agarwal <dikshita@codeaurora.org>
> ---
>  .../userspace-api/media/v4l/ext-ctrls-codec.rst    | 52 +++++++++++++++++++++-
>  drivers/media/v4l2-core/v4l2-ctrls.c               |  8 ++++
>  include/uapi/linux/v4l2-controls.h                 |  9 ++++
>  3 files changed, 67 insertions(+), 2 deletions(-)
> 
> diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
> index aac1ea3..a9c7011 100644
> --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
> +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst
> @@ -1182,6 +1182,18 @@ enum v4l2_mpeg_video_h264_entropy_mode -
>      V4L2_CID_MPEG_VIDEO_H264_MAX_QP is also set, the quantization parameter
>      should be chosen to meet both requirements.
>  
> +``V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP (integer)``
> +    Minimum quantization parameter for the H264 B frame to limit B frame
> +    quality to a range. Valid range: from 0 to 51. If
> +    V4L2_CID_MPEG_VIDEO_H264_MIN_QP is also set, the quantization parameter
> +    should be chosen to meet both requirements.
> +
> +``V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP (integer)``
> +    Maximum quantization parameter for the H264 B frame to limit B frame
> +    quality to a range. Valid range: from 0 to 51. If
> +    V4L2_CID_MPEG_VIDEO_H264_MAX_QP is also set, the quantization parameter
> +    should be chosen to meet both requirements.
> +
>  ``V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP (integer)``
>      Quantization parameter for an I frame for MPEG4. Valid range: from 1
>      to 31.
> @@ -3441,11 +3453,11 @@ HEVC/H.265 Control IDs
>  
>  ``V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP (integer)``
>      Minimum quantization parameter for HEVC.
> -    Valid range: from 0 to 51.
> +    Valid range: from 0 - 51 for 8 bit and  0 - 63 for 10 bit.

Write in full:

Valid range: from 0 to 51 for 8 bit and from 0 to 63 for 10 bit.

Ditto elsewhere.

>  
>  ``V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP (integer)``
>      Maximum quantization parameter for HEVC.
> -    Valid range: from 0 to 51.
> +    Valid range: from 0 - 51 for 8 bit and 0 - 63 for 10 bit.
>  
>  ``V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP (integer)``
>      Quantization parameter for an I frame for HEVC.
> @@ -3462,6 +3474,42 @@ HEVC/H.265 Control IDs
>      Valid range: [V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP,
>      V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP].
>  
> +``V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP (integer)``
> +    Minimum quantization parameter for the HEVC I frame to limit I frame
> +    quality to a range. Valid range: from 0 to 51 for 8 bit, 0 - 63 for 10 bit.
> +    If V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP is also set, the quantization parameter
> +    should be chosen to meet both requirements.
> +
> +``V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP (integer)``
> +    Maximum quantization parameter for the HEVC I frame to limit I frame
> +    quality to a range. Valid range: from 0 to 51 for 8 bit, 0 - 63 for 10 bit.
> +    If V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP is also set, the quantization parameter
> +    should be chosen to meet both requirements.
> +
> +``V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP (integer)``
> +    Minimum quantization parameter for the HEVC P frame to limit P frame
> +    quality to a range. Valid range: from 0 to 51 for 8 bit, 0 - 63 for 10 bit.
> +    If V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP is also set, the quantization parameter
> +    should be chosen to meet both requirements.
> +
> +``V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP (integer)``
> +    Maximum quantization parameter for the HEVC P frame to limit P frame
> +    quality to a range. Valid range: from 0 to 51 for 8 bit, 0 - 63 for 10 bit.
> +    If V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP is also set, the quantization parameter
> +    should be chosen to meet both requirements.
> +
> +``V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP (integer)``
> +    Minimum quantization parameter for the HEVC B frame to limit B frame
> +    quality to a range. Valid range: from 0 to 51 for 8 bit, 0 - 63 for 10 bit.
> +    If V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP is also set, the quantization parameter
> +    should be chosen to meet both requirements.
> +
> +``V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP (integer)``
> +    Maximum quantization parameter for the HEVC B frame to limit B frame
> +    quality to a range. Valid range: from 0 to 51 for 8 bit, 0 - 63 for 10 bit.
> +    If V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP is also set, the quantization parameter
> +    should be chosen to meet both requirements.
> +
>  ``V4L2_CID_MPEG_VIDEO_HEVC_HIER_QP (boolean)``
>      HIERARCHICAL_QP allows the host to specify the quantization parameter
>      values for each temporal layer through HIERARCHICAL_QP_LAYER. This is
> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
> index e8ee29e..6e74500 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
> @@ -920,6 +920,8 @@ const char *v4l2_ctrl_get_name(u32 id)
>  	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP:		return "H264 I-Frame Maximum QP Value";
>  	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP:		return "H264 P-Frame Minimum QP Value";
>  	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP:		return "H264 P-Frame Maximum QP Value";
> +	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP:		return "H264 B-Frame Minimum QP Value";
> +	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP:		return "H264 B-Frame Maximum QP Value";
>  	case V4L2_CID_MPEG_VIDEO_H264_SPS:			return "H264 Sequence Parameter Set";
>  	case V4L2_CID_MPEG_VIDEO_H264_PPS:			return "H264 Picture Parameter Set";
>  	case V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX:		return "H264 Scaling Matrix";
> @@ -982,6 +984,12 @@ const char *v4l2_ctrl_get_name(u32 id)
>  	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:		return "HEVC B-Frame QP Value";
>  	case V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP:			return "HEVC Minimum QP Value";
>  	case V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP:			return "HEVC Maximum QP Value";
> +	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP:		return "HEVC I-Frame Minimum QP Value";
> +	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP:		return "HEVC I-Frame Maximum QP Value";
> +	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP:		return "HEVC P-Frame Minimum QP Value";
> +	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP:		return "HEVC P-Frame Maximum QP Value";
> +	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP:		return "HEVC B-Frame Minimum QP Value";
> +	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP:		return "HEVC B-Frame Maximum QP Value";
>  	case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:			return "HEVC Profile";
>  	case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:			return "HEVC Level";
>  	case V4L2_CID_MPEG_VIDEO_HEVC_TIER:			return "HEVC Tier";
> diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
> index 14ce833..fea0f18 100644
> --- a/include/uapi/linux/v4l2-controls.h
> +++ b/include/uapi/linux/v4l2-controls.h
> @@ -588,6 +588,8 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type {
>  #define V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+386)
>  #define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP	(V4L2_CID_MPEG_BASE+387)
>  #define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+388)
> +#define V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP	(V4L2_CID_MPEG_BASE+389)
> +#define V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+390)
>  #define V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP	(V4L2_CID_MPEG_BASE+400)
>  #define V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP	(V4L2_CID_MPEG_BASE+401)
>  #define V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP	(V4L2_CID_MPEG_BASE+402)
> @@ -772,6 +774,13 @@ enum v4l2_cid_mpeg_video_hevc_size_of_length_field {
>  #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)
>  #define V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE		(V4L2_CID_MPEG_BASE + 646)
> +#define V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP	(V4L2_CID_MPEG_BASE+647)
> +#define V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+648)
> +#define V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP	(V4L2_CID_MPEG_BASE+649)
> +#define V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+650)
> +#define V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP	(V4L2_CID_MPEG_BASE+651)
> +#define V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP	(V4L2_CID_MPEG_BASE+652)
> +
>  enum v4l2_mpeg_video_frame_skip_mode {
>  	V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED	= 0,
>  	V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_LEVEL_LIMIT	= 1,
> 

Regards,

	Hans

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

* Re: [PATCH v3 3/3] venus: venc: Add support for frame-specific min/max qp controls
  2020-12-02 13:36   ` Hans Verkuil
@ 2020-12-08 16:37     ` dikshita
  0 siblings, 0 replies; 7+ messages in thread
From: dikshita @ 2020-12-08 16:37 UTC (permalink / raw)
  To: Hans Verkuil
  Cc: linux-media, nicolas, stanimir.varbanov, linux-kernel,
	linux-arm-msm, vgarodia

On 2020-12-02 19:06, Hans Verkuil wrote:
> On 18/11/2020 07:54, Dikshita Agarwal wrote:
>> Add support for frame type specific min and max qp controls
>> for encoder.
>> 
>> Signed-off-by: Dikshita Agarwal <dikshita@codeaurora.org>
>> ---
>>  drivers/media/platform/qcom/venus/core.h       | 18 +++++++++
>>  drivers/media/platform/qcom/venus/venc.c       | 21 ++++++++---
>>  drivers/media/platform/qcom/venus/venc_ctrls.c | 51 
>> ++++++++++++++++++++++++++
>>  3 files changed, 85 insertions(+), 5 deletions(-)
>> 
>> diff --git a/drivers/media/platform/qcom/venus/core.h 
>> b/drivers/media/platform/qcom/venus/core.h
>> index 3bc129a..6a764c9 100644
>> --- a/drivers/media/platform/qcom/venus/core.h
>> +++ b/drivers/media/platform/qcom/venus/core.h
>> @@ -230,10 +230,28 @@ struct venc_controls {
>>  	u32 h264_b_qp;
>>  	u32 h264_min_qp;
>>  	u32 h264_max_qp;
>> +	u32 h264_i_min_qp;
>> +	u32 h264_i_max_qp;
>> +	u32 h264_p_min_qp;
>> +	u32 h264_p_max_qp;
>> +	u32 h264_b_min_qp;
>> +	u32 h264_b_max_qp;
>>  	u32 h264_loop_filter_mode;
>>  	s32 h264_loop_filter_alpha;
>>  	s32 h264_loop_filter_beta;
>> 
>> +	u32 hevc_i_qp;
>> +	u32 hevc_p_qp;
>> +	u32 hevc_b_qp;
>> +	u32 hevc_min_qp;
>> +	u32 hevc_max_qp;
>> +	u32 hevc_i_min_qp;
>> +	u32 hevc_i_max_qp;
>> +	u32 hevc_p_min_qp;
>> +	u32 hevc_p_max_qp;
>> +	u32 hevc_b_min_qp;
>> +	u32 hevc_b_max_qp;
>> +
>>  	u32 vp8_min_qp;
>>  	u32 vp8_max_qp;
>> 
>> diff --git a/drivers/media/platform/qcom/venus/venc.c 
>> b/drivers/media/platform/qcom/venus/venc.c
>> index 0bf92cc..f2f5a85 100644
>> --- a/drivers/media/platform/qcom/venus/venc.c
>> +++ b/drivers/media/platform/qcom/venus/venc.c
>> @@ -668,17 +668,28 @@ static int venc_set_properties(struct venus_inst 
>> *inst)
>>  		return ret;
>> 
>>  	ptype = HFI_PROPERTY_PARAM_VENC_SESSION_QP;
>> -	quant.qp_i = ctr->h264_i_qp;
>> -	quant.qp_p = ctr->h264_p_qp;
>> -	quant.qp_b = ctr->h264_b_qp;
>> +	if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) {
>> +		quant.qp_i = ctr->hevc_i_qp;
>> +		quant.qp_p = ctr->hevc_p_qp;
>> +		quant.qp_b = ctr->hevc_b_qp;
>> +	} else {
>> +		quant.qp_i = ctr->h264_i_qp;
>> +		quant.qp_p = ctr->h264_p_qp;
>> +		quant.qp_b = ctr->h264_b_qp;
>> +	}
>>  	quant.layer_id = 0;
>>  	ret = hfi_session_set_property(inst, ptype, &quant);
>>  	if (ret)
>>  		return ret;
>> 
>>  	ptype = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE;
>> -	quant_range.min_qp = ctr->h264_min_qp;
>> -	quant_range.max_qp = ctr->h264_max_qp;
>> +	if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) {
>> +		quant_range.min_qp = ctr->hevc_min_qp;
>> +		quant_range.max_qp = ctr->hevc_max_qp;
>> +	} else {
>> +		quant_range.min_qp = ctr->h264_min_qp;
>> +		quant_range.max_qp = ctr->h264_max_qp;
>> +	}
>>  	quant_range.layer_id = 0;
>>  	ret = hfi_session_set_property(inst, ptype, &quant_range);
>>  	if (ret)
>> diff --git a/drivers/media/platform/qcom/venus/venc_ctrls.c 
>> b/drivers/media/platform/qcom/venus/venc_ctrls.c
>> index 0708b3b..cd131e3 100644
>> --- a/drivers/media/platform/qcom/venus/venc_ctrls.c
>> +++ b/drivers/media/platform/qcom/venus/venc_ctrls.c
>> @@ -125,9 +125,60 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
>>  	case V4L2_CID_MPEG_VIDEO_H264_MIN_QP:
>>  		ctr->h264_min_qp = ctrl->val;
>>  		break;
>> +	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP:
>> +		ctr->h264_i_min_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP:
>> +		ctr->h264_p_min_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP:
>> +		ctr->h264_b_min_qp = ctrl->val;
>> +		break;
>>  	case V4L2_CID_MPEG_VIDEO_H264_MAX_QP:
>>  		ctr->h264_max_qp = ctrl->val;
>>  		break;
>> +	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP:
>> +		ctr->h264_i_max_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP:
>> +		ctr->h264_p_max_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP:
>> +		ctr->h264_b_max_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP:
>> +		ctr->hevc_i_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP:
>> +		ctr->hevc_p_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:
>> +		ctr->hevc_b_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP:
>> +		ctr->hevc_min_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP:
>> +		ctr->hevc_i_min_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP:
>> +		ctr->hevc_p_min_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP:
>> +		ctr->hevc_b_min_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP:
>> +		ctr->hevc_max_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP:
>> +		ctr->hevc_i_max_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP:
>> +		ctr->hevc_p_max_qp = ctrl->val;
>> +		break;
>> +	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP:
>> +		ctr->hevc_b_max_qp = ctrl->val;
>> +		break;
>>  	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
>>  		ctr->multi_slice_mode = ctrl->val;
>>  		break;
>> 
> 
> This looks incomplete: the new controls aren't actually added to the
> driver with v4l2_ctrl_new_std(). Did you test this?
Oh, Sorry. Looks like I forgot to add some changes.
will send a new patch.

Thanks,
Dikshita
> 
> Regards,
> 
> 	Hans

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

end of thread, other threads:[~2020-12-08 16:38 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-18  6:54 [PATCH v3 0/3] Add new controls for QP and layer bitrate Dikshita Agarwal
2020-11-18  6:54 ` [PATCH v3 1/3] media: v4l2-ctrl: Add frame-specific min/max qp controls for hevc Dikshita Agarwal
2020-12-02 13:51   ` Hans Verkuil
2020-11-18  6:54 ` [PATCH v3 2/3] media: v4l2-ctrl: Add layer wise bitrate controls for h264 Dikshita Agarwal
2020-11-18  6:54 ` [PATCH v3 3/3] venus: venc: Add support for frame-specific min/max qp controls Dikshita Agarwal
2020-12-02 13:36   ` Hans Verkuil
2020-12-08 16:37     ` dikshita

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).