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