* [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).