Эх сурвалжийг харах

video: driver: Add support for CQ bitrate mode

Add CQ bitrate mode support. Also add related
constant quality control support.

Change-Id: I415423e76dc855a7a72e1b68062b9d49433f3ed3
Signed-off-by: Akshata Sahukar <[email protected]>
Akshata Sahukar 4 жил өмнө
parent
commit
691eb8dfa5

+ 29 - 8
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -27,6 +27,7 @@
 #define MIN_QP_8BIT             0
 #define MAX_QP                  51
 #define DEFAULT_QP              20
+#define MAX_CONSTANT_QUALITY    100
 
 #define UBWC_CONFIG(mc, ml, hbb, bs1, bs2, bs3, bsp) \
 {	\
@@ -299,17 +300,32 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		{0}, {0},
 		NULL, msm_vidc_set_u32},
 
-	{BITRATE_MODE, ENC, CODECS_ALL,
+	{BITRATE_MODE, ENC, H264,
 		V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
 		V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
-		/* TODO: CQ. For more info: go/videogki */
 		BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) |
 		BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_CBR),
 		V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
 		V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
 		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},
+		{0},
+		{LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP},
+		msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum},
+
+	{BITRATE_MODE, ENC, HEVC,
+		V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
+		V4L2_MPEG_VIDEO_BITRATE_MODE_CQ,
+		BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) |
+		BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) |
+		BIT(V4L2_MPEG_VIDEO_BITRATE_MODE_CQ),
+		V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
+		V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
+		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},
 		msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum},
 
 	{LOSSLESS, ENC, HEVC,
@@ -319,17 +335,22 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 
 	{FRAME_SKIP_MODE, ENC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE},
-		/* TODO(AS): uncomment once below v4l2 id is
-		 * available (post 5.4 kernel)
-		 */
-		//V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE},
+		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE},
 
 	{FRAME_RC_ENABLE, ENC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE},
 
+	{CONSTANT_QUALITY, ENC, HEVC,
+		1, MAX_CONSTANT_QUALITY, 1, 90,
+		V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY,
+		HFI_PROP_CONSTANT_QUALITY,
+		CAP_FLAG_OUTPUT_PORT,
+		{BITRATE_MODE}, {0},
+		NULL, msm_vidc_set_constant_quality},
+
 	// TODO: GOP dependencies
 	{GOP_SIZE, ENC, CODECS_ALL,
 		0, INT_MAX, 1, 2 * DEFAULT_FPS - 1,

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

@@ -47,6 +47,8 @@ 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_use_and_mark_ltr(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_s32(void *instance,

+ 1 - 0
driver/vidc/inc/msm_vidc_internal.h

@@ -276,6 +276,7 @@ enum msm_vidc_inst_capability_type {
 	LOSSLESS,
 	FRAME_SKIP_MODE,
 	FRAME_RC_ENABLE,
+	CONSTANT_QUALITY,
 	GOP_SIZE,
 	GOP_CLOSURE,
 	BLUR_TYPES,

+ 29 - 3
driver/vidc/src/msm_vidc_control.c

@@ -818,11 +818,9 @@ int msm_vidc_adjust_bitrate_mode(void *instance, struct v4l2_ctrl *ctrl)
 			hfi_value = HFI_RC_CBR_VFR;
 		else
 			hfi_value = HFI_RC_CBR_CFR;
-	}/* TODO: CQ mode
-	else if (bitrate_mode == CQ) {
+	} else if (bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ) {
 		hfi_value = HFI_RC_CQ;
 	}
-	*/
 
 update:
 	inst->hfi_rc_type = hfi_value;
@@ -1241,6 +1239,34 @@ int msm_vidc_set_deblock_mode(void *instance,
 	return rc;
 }
 
+int msm_vidc_set_constant_quality(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_CQ)
+		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)
 {