Browse Source

video: driver: Add support to advanced bitrate ctrls

Add support to below properties:
- HFI_PROP_BITRATE_BOOST
- HFI_PROP_CONTENT_ADAPTIVE_CODING
- HFI_PROP_MAINTAIN_MIN_QUALITY
- HFI_PROP_VBV_DELAY
- HFI_PROP_TOTAL_PEAK_BITRATE
- HFI_PROP_BITRATE_LAYERx.

Change-Id: I1072f97c7c202c7f4fc38c26e0ab9274ae06fce0
Signed-off-by: Akshata Sahukar <[email protected]>
Akshata Sahukar 4 years ago
parent
commit
14efc2a0bc

+ 127 - 62
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -19,6 +19,7 @@
 #define MIN_CHROMA_QP_OFFSET    -12
 #define MAX_CHROMA_QP_OFFSET    0
 #define MAX_BITRATE             220000000
+#define DEFAULT_BITRATE         20000000
 #define MIN_QP_10BIT            -12
 #define MIN_QP_8BIT             0
 #define MAX_QP                  51
@@ -308,12 +309,12 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 	 * Dec: there's no use of Bitrate cap
 	 */
 	{BIT_RATE, ENC, H264|HEVC,
-		1, 220000000, 1, 20000000,
+		1, MAX_BITRATE, 1, DEFAULT_BITRATE,
 		V4L2_CID_MPEG_VIDEO_BITRATE,
 		HFI_PROP_TOTAL_BITRATE,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
-		{0}, {0},
-		NULL, msm_vidc_set_u32},
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{ENH_LAYER_COUNT, BITRATE_MODE}, {PEAK_BITRATE},
+		msm_vidc_adjust_bitrate, msm_vidc_set_bitrate},
 
 	{BITRATE_MODE, ENC, H264,
 		V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
@@ -326,7 +327,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
 		{0},
 		{LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP,
-			ENH_LAYER_COUNT},
+			ENH_LAYER_COUNT, BIT_RATE, CONTENT_ADAPTIVE_CODING,
+			BITRATE_BOOST, MIN_QUALITY, VBV_DELAY, PEAK_BITRATE},
 		msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum},
 
 	{BITRATE_MODE, ENC, HEVC,
@@ -340,8 +342,11 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		HFI_PROP_RATE_CONTROL,
 		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
 		{0},
-		{LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC,
-			I_FRAME_QP, CONSTANT_QUALITY, ENH_LAYER_COUNT},
+		{LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP,
+			CONSTANT_QUALITY, ENH_LAYER_COUNT,
+			CONTENT_ADAPTIVE_CODING, BIT_RATE,
+			BITRATE_BOOST, MIN_QUALITY, VBV_DELAY,
+			PEAK_BITRATE},
 		msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum},
 
 	{LOSSLESS, ENC, HEVC|HEIC,
@@ -496,17 +501,49 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_CID_MPEG_VIDC_CONTENT_ADAPTIVE_CODING,
 		HFI_PROP_CONTENT_ADAPTIVE_CODING,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
+		CAP_FLAG_OUTPUT_PORT,
+		{BITRATE_MODE}, {0},
+		NULL, msm_vidc_set_vbr_related_properties},
 
 	{BITRATE_BOOST, ENC, H264|HEVC,
-		0, 100, 25, 25,
+		0, 50, 25, 25,
 		V4L2_CID_MPEG_VIDC_QUALITY_BITRATE_BOOST,
 		HFI_PROP_BITRATE_BOOST,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
+		CAP_FLAG_OUTPUT_PORT,
+		{BITRATE_MODE},
+		{0},
+		NULL, msm_vidc_set_vbr_related_properties},
+
+	{MIN_QUALITY, ENC, H264|HEVC,
+		0, 80, 80, 80,
+		V4L2_CID_MPEG_VIDC_MIN_QUALITY,
+		HFI_PROP_MAINTAIN_MIN_QUALITY,
+		CAP_FLAG_OUTPUT_PORT,
+		{BITRATE_MODE},
+		{0},
+		NULL, msm_vidc_set_vbr_related_properties},
 
 	{VBV_DELAY, ENC, H264|HEVC,
-		0, 1000, 500, 0,
-		V4L2_CID_MPEG_VIDEO_VBV_DELAY},
+		500, 2000, 500, 500,
+		V4L2_CID_MPEG_VIDEO_VBV_DELAY,
+		HFI_PROP_VBV_DELAY,
+		CAP_FLAG_OUTPUT_PORT,
+		{BITRATE_MODE},
+		{0},
+		NULL, msm_vidc_set_cbr_related_properties},
+
+	{PEAK_BITRATE, ENC, H264|HEVC,
+		/* default peak bitrate is 10% larger than avrg bitrate */
+		1, MAX_BITRATE, 1,
+		(DEFAULT_BITRATE +
+			(DEFAULT_BITRATE / PERCENT_PEAK_BITRATE_INCREASED)),
+		V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
+		HFI_PROP_TOTAL_PEAK_BITRATE,
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{BITRATE_MODE, BIT_RATE},
+		{0},
+		msm_vidc_adjust_peak_bitrate,
+		msm_vidc_set_cbr_related_properties},
 
 	{MIN_FRAME_QP, ENC, H264,
 		MIN_QP_8BIT, MAX_QP, 1, MIN_QP_8BIT,
@@ -627,42 +664,6 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP,
 		V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP},
 
-	{L0_QP, ENC, HEVC,
-		0, 51, 1, 20,
-		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_QP,
-		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
-
-	{L1_QP, ENC, HEVC,
-		0, 51, 1, 20,
-		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_QP,
-		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
-
-	{L2_QP, ENC, HEVC,
-		0, 51, 1, 20,
-		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_QP,
-		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
-
-	{L3_QP, ENC, HEVC,
-		0, 51, 1, 20,
-		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_QP,
-		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
-
-	{L4_QP, ENC, HEVC,
-		0, 51, 1, 20,
-		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_QP,
-		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
-
-	{L5_QP, ENC, HEVC,
-		0, 51, 1, 20,
-		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_QP,
-		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
-
 	{HIER_LAYER_QP, ENC, H264,
 		0, 0x0060033, 1, 20,
 		V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP,
@@ -701,7 +702,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		HFI_PROP_LAYER_COUNT,
 		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
 		{BITRATE_MODE},
-		{GOP_SIZE, B_FRAME},
+		{GOP_SIZE, B_FRAME, BIT_RATE},
 		msm_vidc_adjust_layer_count, msm_vidc_set_layer_count_and_type},
 
 	{ENH_LAYER_COUNT, ENC, H264,
@@ -710,44 +711,108 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		HFI_PROP_LAYER_COUNT,
 		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
 		{BITRATE_MODE},
-		{GOP_SIZE, B_FRAME},
+		{GOP_SIZE, B_FRAME, BIT_RATE},
 		msm_vidc_adjust_layer_count, msm_vidc_set_layer_count_and_type},
 
+	/*
+	 * layer bitrate is treated as BIT_RATE cap sibling and
+	 * is handled in bitrate adjust and set functions
+	 */
 	{L0_BR, ENC, HEVC,
-		1, 220000000, 1, 20000000,
+		1, MAX_BITRATE, 1, DEFAULT_BITRATE,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR,
 		HFI_PROP_BITRATE_LAYER1,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		msm_vidc_adjust_bitrate, msm_vidc_set_bitrate},
 
 	{L1_BR, ENC, HEVC,
-		1, 220000000, 1, 20000000,
+		1, MAX_BITRATE, 1, DEFAULT_BITRATE,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR,
 		HFI_PROP_BITRATE_LAYER2,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		msm_vidc_adjust_bitrate, msm_vidc_set_bitrate},
 
 	{L2_BR, ENC, HEVC,
-		1, 220000000, 1, 20000000,
+		1, MAX_BITRATE, 1, DEFAULT_BITRATE,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR,
 		HFI_PROP_BITRATE_LAYER3,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		msm_vidc_adjust_bitrate, msm_vidc_set_bitrate},
 
 	{L3_BR, ENC, HEVC,
-		1, 220000000, 1, 20000000,
+		1, MAX_BITRATE, 1, DEFAULT_BITRATE,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR,
 		HFI_PROP_BITRATE_LAYER4,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		msm_vidc_adjust_bitrate, msm_vidc_set_bitrate},
 
 	{L4_BR, ENC, HEVC,
-		1, 220000000, 1, 20000000,
+		1, MAX_BITRATE, 1, DEFAULT_BITRATE,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR,
 		HFI_PROP_BITRATE_LAYER5,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		msm_vidc_adjust_bitrate, msm_vidc_set_bitrate},
 
 	{L5_BR, ENC, HEVC,
-		1, 220000000, 1, 20000000,
+		1, MAX_BITRATE, 1, DEFAULT_BITRATE,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR,
 		HFI_PROP_BITRATE_LAYER6,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		msm_vidc_adjust_bitrate, msm_vidc_set_bitrate},
+
+	{L0_BR, ENC, H264,
+		1, MAX_BITRATE, 1, DEFAULT_BITRATE,
+		V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L0_BR,
+		HFI_PROP_BITRATE_LAYER1,
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		msm_vidc_adjust_bitrate, msm_vidc_set_bitrate},
+
+	{L1_BR, ENC, H264,
+		1, MAX_BITRATE, 1, DEFAULT_BITRATE,
+		V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L1_BR,
+		HFI_PROP_BITRATE_LAYER2,
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		msm_vidc_adjust_bitrate, msm_vidc_set_bitrate},
+
+	{L2_BR, ENC, H264,
+		1, MAX_BITRATE, 1, DEFAULT_BITRATE,
+		V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L2_BR,
+		HFI_PROP_BITRATE_LAYER3,
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		msm_vidc_adjust_bitrate, msm_vidc_set_bitrate},
+
+	{L3_BR, ENC, H264,
+		1, MAX_BITRATE, 1, DEFAULT_BITRATE,
+		V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L3_BR,
+		HFI_PROP_BITRATE_LAYER4,
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		msm_vidc_adjust_bitrate, msm_vidc_set_bitrate},
+
+	{L4_BR, ENC, H264,
+		1, MAX_BITRATE, 1, DEFAULT_BITRATE,
+		V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L4_BR,
+		HFI_PROP_BITRATE_LAYER5,
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		msm_vidc_adjust_bitrate, msm_vidc_set_bitrate},
+
+	{L5_BR, ENC, H264,
+		1, MAX_BITRATE, 1, DEFAULT_BITRATE,
+		V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L5_BR,
+		HFI_PROP_BITRATE_LAYER6,
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		msm_vidc_adjust_bitrate, msm_vidc_set_bitrate},
 
 	{ENTROPY_MODE, ENC, H264,
 		V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC,

+ 8 - 0
driver/vidc/inc/msm_vidc_control.h

@@ -31,6 +31,8 @@ int msm_vidc_adjust_transform_8x8(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_layer_count(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_gop_size(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_b_frame(void *instance, struct v4l2_ctrl *ctrl);
+int msm_vidc_adjust_bitrate(void *instance, struct v4l2_ctrl *ctrl);
+int msm_vidc_adjust_peak_bitrate(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_hevc_min_qp(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_hevc_max_qp(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl);
@@ -56,12 +58,18 @@ int msm_vidc_set_layer_count_and_type(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_gop_size(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
+int msm_vidc_set_bitrate(void *instance,
+	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_u32(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_u32_enum(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_constant_quality(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
+int msm_vidc_set_vbr_related_properties(
+	void *instance, enum msm_vidc_inst_capability_type cap_id);
+int msm_vidc_set_cbr_related_properties(void *instance,
+	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_use_and_mark_ltr(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_nal_length(void* instance,

+ 3 - 6
driver/vidc/inc/msm_vidc_internal.h

@@ -55,6 +55,7 @@
 #define MAX_HEVC_ENH_LAYER_SLIDING_WINDOW     5
 #define MAX_AVC_ENH_LAYER_SLIDING_WINDOW      3
 #define MAX_AVC_ENH_LAYER_HYBRID_HP           5
+#define PERCENT_PEAK_BITRATE_INCREASED       10
 
 /* TODO
  * #define MAX_SUPERFRAME_COUNT     32
@@ -360,7 +361,9 @@ enum msm_vidc_inst_capability_type {
 	TIME_DELTA_BASED_RC,
 	CONTENT_ADAPTIVE_CODING,
 	BITRATE_BOOST,
+	MIN_QUALITY,
 	VBV_DELAY,
+	PEAK_BITRATE,
 	MIN_FRAME_QP,
 	I_FRAME_MIN_QP,
 	P_FRAME_MIN_QP,
@@ -373,12 +376,6 @@ enum msm_vidc_inst_capability_type {
 	I_FRAME_QP,
 	P_FRAME_QP,
 	B_FRAME_QP,
-	L0_QP,
-	L1_QP,
-	L2_QP,
-	L3_QP,
-	L4_QP,
-	L5_QP,
 	HIER_LAYER_QP,
 	LAYER_TYPE,
 	LAYER_ENABLE,

+ 253 - 0
driver/vidc/src/msm_vidc_control.c

@@ -1241,6 +1241,135 @@ exit:
 	return 0;
 }
 
+int msm_vidc_adjust_bitrate(void *instance, struct v4l2_ctrl *ctrl)
+{
+	int i;
+	struct msm_vidc_inst_capability *capability;
+	s32 adjusted_value;
+	struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
+	s32 rc_type = -1, enh_layer_count = -1;
+	u32 cap_id = 0, cumulative_bitrate = 0;
+	bool layer_bitrate_set = false;
+	u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR};
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+	capability = inst->capabilities;
+
+	adjusted_value = ctrl ? ctrl->val :
+		capability->cap[BIT_RATE].value;
+
+	/* ignore layer bitrate when total bitrate is set */
+	if (capability->cap[BIT_RATE].flags & CAP_FLAG_CLIENT_SET)
+		goto exit;
+
+	if (msm_vidc_get_parent_value(inst, BIT_RATE,
+		ENH_LAYER_COUNT, &enh_layer_count, __func__))
+		return -EINVAL;
+
+	if (msm_vidc_get_parent_value(inst, BIT_RATE,
+		BITRATE_MODE, &rc_type, __func__))
+		return -EINVAL;
+
+	/*
+	 * ENH_LAYER_COUNT cap max is positive only if
+	 * layer encoding is enabled for static setting
+	 */
+	if (capability->cap[ENH_LAYER_COUNT].max) {
+		layer_bitrate_set = true;
+		for (i = 0; i <= enh_layer_count; i++) {
+			if (i >= ARRAY_SIZE(layer_br_caps))
+				break;
+			cap_id = layer_br_caps[i];
+			if (!(capability->cap[cap_id].flags & CAP_FLAG_CLIENT_SET)) {
+				layer_bitrate_set = false;
+				break;
+			}
+			cumulative_bitrate += capability->cap[cap_id].value;
+		}
+
+		/* layer bitrate supported only for CBR rc */
+		if (layer_bitrate_set &&
+			(rc_type == HFI_RC_CBR_CFR || rc_type == HFI_RC_CBR_VFR)) {
+			if (cumulative_bitrate > capability->cap[BIT_RATE].max)
+				cumulative_bitrate =
+					capability->cap[BIT_RATE].max;
+			adjusted_value = cumulative_bitrate;
+			i_vpr_h(inst,
+				"%s: update BIT_RATE with cumulative bitrate\n",
+				__func__);
+		}
+	} else {
+		for (i = 0; i < sizeof(layer_br_caps) / sizeof(u32); i++) {
+			if (i >= ARRAY_SIZE(layer_br_caps))
+				break;
+			cap_id = layer_br_caps[i];
+			/*
+			 * layer bitrate cannot be set
+			 * when layer encoding is disabled
+			 */
+			if (capability->cap[cap_id].flags &
+					CAP_FLAG_CLIENT_SET) {
+				i_vpr_e(inst,
+					"%s: invalid layer bitrate set\n",
+					__func__);
+				return -EINVAL;
+			}
+		}
+	}
+
+exit:
+	msm_vidc_update_cap_value(inst, BIT_RATE,
+		adjusted_value, __func__);
+	return 0;
+}
+
+int msm_vidc_adjust_peak_bitrate(void *instance, struct v4l2_ctrl *ctrl)
+{
+	struct msm_vidc_inst_capability *capability;
+	s32 adjusted_value;
+	struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
+	s32 rc_type = -1, bitrate = -1;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+	capability = inst->capabilities;
+
+	adjusted_value = ctrl ? ctrl->val :
+		capability->cap[PEAK_BITRATE].value;
+
+	if (msm_vidc_get_parent_value(inst, PEAK_BITRATE,
+		BITRATE_MODE, &rc_type, __func__))
+		return -EINVAL;
+
+	if (rc_type != HFI_RC_CBR_CFR &&
+		rc_type != HFI_RC_CBR_VFR)
+		return 0;
+
+	if (msm_vidc_get_parent_value(inst, PEAK_BITRATE,
+		BIT_RATE, &bitrate, __func__))
+		return -EINVAL;
+
+	/* Peak Bitrate should be larger than or equal to avg bitrate */
+	if (capability->cap[PEAK_BITRATE].flags & CAP_FLAG_CLIENT_SET) {
+		if (adjusted_value < bitrate)
+			adjusted_value = bitrate;
+	} else {
+		adjusted_value = capability->cap[BIT_RATE].value +
+			(capability->cap[BIT_RATE].value /
+			PERCENT_PEAK_BITRATE_INCREASED);
+	}
+
+	msm_vidc_update_cap_value(inst, PEAK_BITRATE,
+		adjusted_value, __func__);
+
+	return 0;
+}
+
 int msm_vidc_adjust_hevc_min_qp(void *instance, struct v4l2_ctrl *ctrl)
 {
 	int rc = 0;
@@ -1449,6 +1578,63 @@ int msm_vidc_set_constant_quality(void *instance,
 	return rc;
 }
 
+int msm_vidc_set_vbr_related_properties(void *instance,
+	enum msm_vidc_inst_capability_type cap_id)
+{
+	int rc = 0;
+	struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
+	u32 hfi_value = 0;
+	s32 rc_type = -1;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	if (msm_vidc_get_parent_value(inst, cap_id,
+		BITRATE_MODE, &rc_type, __func__))
+		return -EINVAL;
+
+	if (rc_type != HFI_RC_VBR_CFR)
+		return 0;
+
+	hfi_value = inst->capabilities->cap[cap_id].value;
+
+	rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
+		&hfi_value, sizeof(u32), __func__);
+
+	return rc;
+}
+
+int msm_vidc_set_cbr_related_properties(void *instance,
+	enum msm_vidc_inst_capability_type cap_id)
+{
+	int rc = 0;
+	struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
+	u32 hfi_value = 0;
+	s32 rc_type = -1;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	if (msm_vidc_get_parent_value(inst, cap_id,
+		BITRATE_MODE, &rc_type, __func__))
+		return -EINVAL;
+
+	if (rc_type != HFI_RC_CBR_VFR &&
+		rc_type != HFI_RC_CBR_CFR)
+		return 0;
+
+	hfi_value = inst->capabilities->cap[cap_id].value;
+
+	rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
+		&hfi_value, sizeof(u32), __func__);
+
+	return rc;
+}
+
 int msm_vidc_set_use_and_mark_ltr(void *instance,
 	enum msm_vidc_inst_capability_type cap_id)
 {
@@ -1845,6 +2031,73 @@ int msm_vidc_set_gop_size(void *instance,
 	return rc;
 }
 
+int msm_vidc_set_bitrate(void *instance,
+	enum msm_vidc_inst_capability_type cap_id)
+{
+	int rc = 0, i;
+	struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
+	u32 hfi_value = 0;
+	s32 rc_type = -1, enh_layer_count = -1;
+	u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR};
+	bool layer_bitrate_set = false;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	/* set Total Bitrate */
+	if (inst->capabilities->cap[BIT_RATE].flags & CAP_FLAG_CLIENT_SET)
+		goto set_total_bitrate;
+
+	if (msm_vidc_get_parent_value(inst, BIT_RATE,
+		ENH_LAYER_COUNT, &enh_layer_count, __func__))
+		return -EINVAL;
+
+	if (msm_vidc_get_parent_value(inst, BIT_RATE,
+		BITRATE_MODE, &rc_type, __func__))
+		return -EINVAL;
+
+	if (inst->capabilities->cap[ENH_LAYER_COUNT].max &&
+		(rc_type == HFI_RC_CBR_CFR ||
+		rc_type == HFI_RC_CBR_VFR)) {
+		layer_bitrate_set = true;
+		for (i = 0; i <= enh_layer_count; i++) {
+			if (i >= ARRAY_SIZE(layer_br_caps))
+				break;
+			cap_id = layer_br_caps[i];
+			if (!(inst->capabilities->cap[cap_id].flags &
+					CAP_FLAG_CLIENT_SET)) {
+				layer_bitrate_set = false;
+				break;
+			}
+		}
+
+		if (layer_bitrate_set) {
+			/* set Layer Bitrate */
+			for (i = 0; i <= enh_layer_count; i++) {
+				if (i >= ARRAY_SIZE(layer_br_caps))
+					break;
+				cap_id = layer_br_caps[i];
+				hfi_value = inst->capabilities->cap[cap_id].value;
+				rc = msm_vidc_packetize_control(inst, cap_id,
+					HFI_PAYLOAD_U32, &hfi_value,
+					sizeof(u32), __func__);
+				if (rc)
+					return rc;
+			}
+			goto exit;
+		}
+	}
+
+set_total_bitrate:
+	hfi_value = inst->capabilities->cap[BIT_RATE].value;
+	rc = msm_vidc_packetize_control(inst, BIT_RATE, HFI_PAYLOAD_U32,
+			&hfi_value, sizeof(u32), __func__);
+exit:
+	return rc;
+}
+
 /* TODO
 int msm_vidc_set_flip(void *instance,
 	enum msm_vidc_inst_capability_type cap_id)

+ 2 - 6
driver/vidc/src/msm_vidc_driver.c

@@ -103,7 +103,9 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
 	{TIME_DELTA_BASED_RC,            "TIME_DELTA_BASED_RC"        },
 	{CONTENT_ADAPTIVE_CODING,        "CONTENT_ADAPTIVE_CODING"    },
 	{BITRATE_BOOST,                  "BITRATE_BOOST"              },
+	{MIN_QUALITY,                    "MIN_QUALITY"                },
 	{VBV_DELAY,                      "VBV_DELAY"                  },
+	{PEAK_BITRATE,                   "PEAK_BITRATE"               },
 	{MIN_FRAME_QP,                   "MIN_FRAME_QP"               },
 	{I_FRAME_MIN_QP,                 "I_FRAME_MIN_QP"             },
 	{P_FRAME_MIN_QP,                 "P_FRAME_MIN_QP"             },
@@ -116,12 +118,6 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
 	{I_FRAME_QP,                     "I_FRAME_QP"                 },
 	{P_FRAME_QP,                     "P_FRAME_QP"                 },
 	{B_FRAME_QP,                     "B_FRAME_QP"                 },
-	{L0_QP,                          "L0_QP"                      },
-	{L1_QP,                          "L1_QP"                      },
-	{L2_QP,                          "L2_QP"                      },
-	{L3_QP,                          "L3_QP"                      },
-	{L4_QP,                          "L4_QP"                      },
-	{L5_QP,                          "L5_QP"                      },
 	{HIER_LAYER_QP,                  "HIER_LAYER_QP"              },
 	{LAYER_TYPE,                     "LAYER_TYPE"                 },
 	{LAYER_ENABLE,                   "LAYER_ENABLE"               },

+ 2 - 0
include/uapi/vidc/media/v4l2_vidc_extensions.h

@@ -147,6 +147,8 @@ enum v4l2_mpeg_vidc_blur_types {
 /* Encoder Input Compression Ratio control */
 #define V4L2_CID_MPEG_VIDC_ENC_INPUT_COMPRESSION_RATIO                       \
 	(V4L2_CID_MPEG_VIDC_BASE + 0x2C)
+#define V4L2_CID_MPEG_VIDC_MIN_QUALITY                                       \
+	(V4L2_CID_MPEG_VIDC_BASE + 0x2D)
 
 enum v4l2_mpeg_vidc_metapayload_header_flags {
 	METADATA_FLAGS_NONE             = 0,