Browse Source

video: driver: add support to few properties

Add support to below properties
- HFI_PROP_MULTI_SLICE_BYTES_COUNT
- HFI_PROP_MULTI_SLICE_MB_COUNT
- HFI_PROP_CHROMA_QP_OFFSET
- HFI_PROP_REQUEST_SYNC_FRAME

Change-Id: I4cc62870756d058e7a7b15290f5d6797b3be243c
Signed-off-by: Akshata Sahukar <[email protected]>
Akshata Sahukar 4 years ago
parent
commit
17addfbc6d

+ 21 - 17
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -280,7 +280,9 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		0, 0, 0, 0,
 		V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME,
 		HFI_PROP_REQUEST_SYNC_FRAME,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED},
+		CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		NULL, msm_vidc_set_req_sync_frame},
 
 	/* Enc: Keeping CABAC and CAVLC as same bitrate.
 	 * Dec: there's no use of Bitrate cap
@@ -920,20 +922,6 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		-6, 6, 1, 0,
 		V4L2_CID_MPEG_VIDEO_HEVC_LF_BETA_OFFSET_DIV2},
 
-	{SLICE_MAX_BYTES, ENC, H264|HEVC,
-		1, MAX_BITRATE / DEFAULT_FPS / 8 / 10,
-		1, MAX_BITRATE / DEFAULT_FPS / 8 / 10,
-		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES,
-		HFI_PROP_MULTI_SLICE_BYTES_COUNT,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
-
-	{SLICE_MAX_MB, ENC, H264|HEVC,
-		1, (MAX_WIDTH * MAX_HEIGHT) / 256 / DEFAULT_FPS / 10,
-		1, (MAX_WIDTH * MAX_HEIGHT) / 256 / DEFAULT_FPS / 10,
-		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB,
-		HFI_PROP_MULTI_SLICE_MB_COUNT,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
-
 	{SLICE_MODE, ENC, H264|HEVC,
 		V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
 		V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES,
@@ -943,7 +931,21 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
 		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE,
 		0,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+		{0}, {0},
+		NULL, msm_vidc_set_slice_count},
+
+	{SLICE_MAX_BYTES, ENC, H264|HEVC,
+		1, INT_MAX, 1, INT_MAX,
+		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES,
+		HFI_PROP_MULTI_SLICE_BYTES_COUNT,
+		CAP_FLAG_OUTPUT_PORT},
+
+	{SLICE_MAX_MB, ENC, H264|HEVC,
+		1, INT_MAX, 1, INT_MAX,
+		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB,
+		HFI_PROP_MULTI_SLICE_MB_COUNT,
+		CAP_FLAG_OUTPUT_PORT},
 
 	// TODO: MB level RC - mapping
 	{MB_RC, ENC, CODECS_ALL,
@@ -967,7 +969,9 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, MAX_CHROMA_QP_OFFSET,
 		V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET,
 		HFI_PROP_CHROMA_QP_OFFSET,
-		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
+		{0}, {0},
+		NULL, msm_vidc_set_chroma_qp_index_offset},
 
 	{DISPLAY_DELAY_ENABLE, DEC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,

+ 4 - 0
driver/vidc/inc/hfi_property.h

@@ -283,6 +283,10 @@ enum hfi_layer_encoding_type {
 
 #define HFI_PROP_LAYER_COUNT                                    0x03000139
 
+enum hfi_chromaqp_offset_mode {
+    HFI_ADAPTIVE_CHROMAQP_OFFSET = 0x0,
+    HFI_FIXED_CHROMAQP_OFFSET = 0x1,
+};
 #define HFI_BITMASK_CHROMA_CB_OFFSET     0x0000ffff
 #define HFI_BITMASK_CHROMA_CR_OFFSET     0xffff0000
 #define HFI_PROP_CHROMA_QP_OFFSET                               0x0300013a

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

@@ -43,6 +43,12 @@ int msm_vidc_set_max_qp(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_frame_qp(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
+int msm_vidc_set_req_sync_frame(void *instance,
+	enum msm_vidc_inst_capability_type cap_id);
+int msm_vidc_set_chroma_qp_index_offset(void *instance,
+	enum msm_vidc_inst_capability_type cap_id);
+int msm_vidc_set_slice_count(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,

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

@@ -332,9 +332,9 @@ enum msm_vidc_inst_capability_type {
 	LF_MODE,
 	LF_ALPHA,
 	LF_BETA,
+	SLICE_MODE,
 	SLICE_MAX_BYTES,
 	SLICE_MAX_MB,
-	SLICE_MODE,
 	MB_RC,
 	TRANSFORM_8X8,
 	CHROMA_QP_INDEX_OFFSET,

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

@@ -1464,6 +1464,92 @@ int msm_vidc_set_frame_qp(void *instance,
 	return rc;
 }
 
+int msm_vidc_set_req_sync_frame(void *instance,
+	enum msm_vidc_inst_capability_type cap_id)
+{
+	int rc = 0;
+	struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
+	s32 prepend_spspps;
+	u32 hfi_value = 0;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	prepend_spspps = inst->capabilities->cap[PREPEND_SPSPPS_TO_IDR].value;
+	if (prepend_spspps)
+		hfi_value = HFI_SYNC_FRAME_REQUEST_WITH_PREFIX_SEQ_HDR;
+	else
+		hfi_value = HFI_SYNC_FRAME_REQUEST_WITHOUT_SEQ_HDR;
+
+	rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
+		&hfi_value, sizeof(u32), __func__);
+
+	return rc;
+}
+
+int msm_vidc_set_chroma_qp_index_offset(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, chroma_qp_offset_mode = 0, chroma_qp = 0;
+	u32 offset = 12;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	if (inst->capabilities->cap[cap_id].flags & CAP_FLAG_CLIENT_SET)
+		chroma_qp_offset_mode = HFI_FIXED_CHROMAQP_OFFSET;
+	else
+		chroma_qp_offset_mode = HFI_ADAPTIVE_CHROMAQP_OFFSET;
+
+	chroma_qp = inst->capabilities->cap[cap_id].value + offset;
+	hfi_value = chroma_qp_offset_mode | chroma_qp << 8 | chroma_qp << 16 ;
+
+	rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
+		&hfi_value, sizeof(u32), __func__);
+
+	return rc;
+}
+
+int msm_vidc_set_slice_count(void* instance,
+	enum msm_vidc_inst_capability_type cap_id)
+{
+	int rc = 0;
+	struct msm_vidc_inst* inst = (struct msm_vidc_inst*)instance;
+	s32 slice_mode = -1;
+	u32 hfi_value = 0, set_cap_id = 0;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	slice_mode = inst->capabilities->cap[SLICE_MODE].value;
+
+	if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) {
+		i_vpr_l(inst, "%s: slice mode is: %u, ignore setting to fw\n",
+			__func__, slice_mode);
+		return 0;
+	}
+	if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB) {
+		hfi_value = inst->capabilities->cap[SLICE_MAX_MB].value;
+		set_cap_id = SLICE_MAX_MB;
+	} else if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES) {
+		hfi_value = inst->capabilities->cap[SLICE_MAX_BYTES].value;
+		set_cap_id = SLICE_MAX_BYTES;
+	}
+
+	rc = msm_vidc_packetize_control(inst, set_cap_id, HFI_PAYLOAD_U32,
+		&hfi_value, sizeof(u32), __func__);
+
+	return rc;
+}
+
 /* TODO
 int msm_vidc_set_flip(void *instance,
 	enum msm_vidc_inst_capability_type cap_id)