Sfoglia il codice sorgente

video: driver: Add support dynamic low latency for decoder

Latency property is set to firmware during streamon output port,
if set as part of initial configuration by client.
During runtime, the property is set as and when configured by
client.

1. Make the latency property dynamic for decoder.
2. For encoder, the same gets set to firmware with regular
   v4l2 set properties.
3. For decoder, set the property explicitly during streamon
   output port.

Change-Id: I35990614b95e57f113ddacfc2272cad6ae0dde82
Signed-off-by: Vikash Garodia <[email protected]>
Vikash Garodia 4 anni fa
parent
commit
75ecec1bb5

+ 15 - 3
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -465,12 +465,19 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		HFI_PROP_CSC_MATRIX,
 		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, */
 
-	{LOWLATENCY_MODE, ENC|DEC, H264|HEVC|VP9,
+	{LOWLATENCY_MODE, ENC, H264 | HEVC,
+		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
+		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST},
+
+	{LOWLATENCY_MODE, DEC, H264|HEVC|VP9,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST,
 		HFI_PROP_STAGE,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_DYNAMIC_ALLOWED,
+		{0}, {0},
+		NULL, msm_vidc_set_stage},
 
 	{LTR_COUNT, ENC, H264|HEVC,
 		0, 2, 1, 0,
@@ -1142,7 +1149,12 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 	{STAGE, DEC|ENC, CODECS_ALL,
 		MSM_VIDC_STAGE_1,
 		MSM_VIDC_STAGE_2, 1,
-		MSM_VIDC_STAGE_2},
+		MSM_VIDC_STAGE_2,
+		0,
+		HFI_PROP_STAGE,
+		CAP_FLAG_ROOT,
+		{0}, {0},
+		NULL, msm_vidc_set_stage},
 	{PIPE, DEC|ENC, CODECS_ALL,
 		MSM_VIDC_PIPE_1,
 		MSM_VIDC_PIPE_4, 1,

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

@@ -86,6 +86,8 @@ int msm_vidc_set_blur_type(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_blur_resolution(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
+int msm_vidc_set_stage(void *instance,
+	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_s32(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_q16(void *instance,

+ 1 - 30
driver/vidc/src/msm_vdec.c

@@ -528,35 +528,6 @@ static int msm_vdec_set_colorformat(struct msm_vidc_inst *inst)
 	return rc;
 }
 
-static int msm_vdec_set_stage(struct msm_vidc_inst *inst)
-{
-	int rc = 0;
-	u32 stage = 0;
-	struct msm_vidc_core *core = inst->core;
-	struct msm_vidc_inst_capability *capability = inst->capabilities;
-
-	rc = call_session_op(core, decide_work_mode, inst);
-	if (rc) {
-		i_vpr_e(inst, "%s: decide_work_mode failed %d\n",
-			__func__);
-		return -EINVAL;
-	}
-
-	stage = capability->cap[STAGE].value;
-	i_vpr_h(inst, "%s: stage: %d", __func__, stage);
-	rc = venus_hfi_session_property(inst,
-			HFI_PROP_STAGE,
-			HFI_HOST_FLAGS_NONE,
-			HFI_PORT_NONE,
-			HFI_PAYLOAD_U32,
-			&stage,
-			sizeof(u32));
-	if (rc)
-		i_vpr_e(inst, "%s: set property failed\n", __func__);
-
-	return rc;
-}
-
 static int msm_vdec_set_pipe(struct msm_vidc_inst *inst)
 {
 	int rc = 0;
@@ -816,7 +787,7 @@ static int msm_vdec_set_output_properties(struct msm_vidc_inst *inst)
 	if (rc)
 		return rc;
 
-	rc = msm_vdec_set_stage(inst);
+	rc = msm_vidc_set_stage(inst, STAGE);
 	if (rc)
 		return rc;
 

+ 0 - 33
driver/vidc/src/msm_venc.c

@@ -399,34 +399,6 @@ static int msm_venc_set_csc(struct msm_vidc_inst* inst,
 	return 0;
 }
 
-static int msm_venc_set_stage(struct msm_vidc_inst *inst)
-{
-	int rc = 0;
-	struct msm_vidc_core *core = inst->core;
-	struct msm_vidc_inst_capability *capability = inst->capabilities;
-	u32 stage;
-
-	rc = call_session_op(core, decide_work_mode, inst);
-	if (rc) {
-		i_vpr_e(inst, "%s: decide_work_mode failed\n",
-			__func__);
-		return -EINVAL;
-	}
-
-	stage = capability->cap[STAGE].value;
-	i_vpr_h(inst, "%s: stage: %u\n", __func__, stage);
-	rc = venus_hfi_session_property(inst,
-			HFI_PROP_STAGE,
-			HFI_HOST_FLAGS_NONE,
-			HFI_PORT_NONE,
-			HFI_PAYLOAD_U32,
-			&stage,
-			sizeof(u32));
-	if (rc)
-		return rc;
-	return 0;
-}
-
 static int msm_venc_set_pipe(struct msm_vidc_inst *inst)
 {
 	int rc = 0;
@@ -568,11 +540,6 @@ static int msm_venc_set_internal_properties(struct msm_vidc_inst *inst)
 	}
 	i_vpr_h(inst, "%s()\n", __func__);
 
-	//TODO: set HFI_PORT_NONE properties at master port streamon.
-	rc = msm_venc_set_stage(inst);
-	if (rc)
-		return rc;
-
 	rc = msm_venc_set_pipe(inst);
 	if (rc)
 		return rc;

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

@@ -3113,3 +3113,33 @@ set_default:
 		capability->cap[cap_id].v4l2_id, *value);
 	return 0;
 }
+
+int msm_vidc_set_stage(void *instance,
+	enum msm_vidc_inst_capability_type cap_id)
+{
+	int rc = 0;
+	u32 stage = 0;
+	struct msm_vidc_core *core;
+	struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
+
+	if (!inst || !inst->capabilities || !inst->core) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+	core = inst->core;
+
+	rc = call_session_op(core, decide_work_mode, inst);
+	if (rc) {
+		i_vpr_e(inst, "%s: decide_work_mode failed\n", __func__);
+		return -EINVAL;
+	}
+
+	stage = inst->capabilities->cap[STAGE].value;
+
+	rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
+		&stage, sizeof(u32), __func__);
+	if (rc)
+		return rc;
+
+	return rc;
+}

+ 1 - 0
driver/vidc/src/msm_vidc_driver.c

@@ -1108,6 +1108,7 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id)
 			switch (id) {
 			case V4L2_CID_MPEG_VIDC_CODEC_CONFIG:
 			case V4L2_CID_MPEG_VIDC_PRIORITY:
+			case V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST:
 				allow = true;
 				break;
 			default: