Explorar o código

driver: video: Reset sequence change request property only during psc handling

Sequence change property would configure firmware to generate psc at every
key frame. This property is configured based on low latency settings from
the client.
For cases, when client sets low latency from 1 to 0, the hardware would
continue to run in direct mode (low latency mode). Since the sequence
change property gets disabled, there would not be psc from firmware to
change the mode to 2 stage. Hence the sequence change property to be reset
only during psc handling.

Change-Id: Ie8e17e44c921f036763f6f390397d4d812120e23
Signed-off-by: Vikash Garodia <[email protected]>
Vikash Garodia %!s(int64=4) %!d(string=hai) anos
pai
achega
3b67d6b2f9

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

@@ -504,9 +504,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST,
 		HFI_PROP_SEQ_CHANGE_AT_SYNC_FRAME,
-		CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
-		{0}, {0},
-		NULL, msm_vidc_set_seq_change_at_sync_frame},
+		CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED},
 
 	{LTR_COUNT, ENC, H264|HEVC,
 		0, 2, 1, 0,

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

@@ -98,8 +98,7 @@ int msm_vidc_set_csc_custom_matrix(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_session_priority(void* instance,
 	enum msm_vidc_inst_capability_type cap_id);
-int msm_vidc_set_seq_change_at_sync_frame(void* instance,
-	enum msm_vidc_inst_capability_type cap_id);
+int msm_vidc_set_seq_change_at_sync_frame(void *instance);
 int msm_vidc_set_level(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_s32(void *instance,

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

@@ -762,7 +762,7 @@ static int msm_vdec_set_output_properties(struct msm_vidc_inst *inst)
 	if (rc)
 		return rc;
 
-	rc = msm_vidc_set_seq_change_at_sync_frame(inst, LOWLATENCY_MODE);
+	rc = msm_vidc_set_seq_change_at_sync_frame(inst);
 	if (rc)
 		return rc;
 
@@ -2044,6 +2044,10 @@ int msm_vdec_process_cmd(struct msm_vidc_inst *inst, u32 cmd)
 		if (rc)
 			return rc;
 
+		rc = msm_vidc_set_seq_change_at_sync_frame(inst);
+		if (rc)
+			return rc;
+
 		rc = venus_hfi_session_command(inst,
 				HFI_CMD_RESUME,
 				port,

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

@@ -808,6 +808,14 @@ int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl)
 		goto exit;
 	}
 
+	if (ctrl->id == V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST) {
+		if (ctrl->val == V4L2_MPEG_MSM_VIDC_ENABLE) {
+			rc = msm_vidc_set_seq_change_at_sync_frame(inst);
+			if (rc)
+				return rc;
+		}
+	}
+
 exit:
 	if (rc)
 		msm_vidc_free_capabililty_list(inst, CHILD_LIST | FW_LIST);
@@ -3619,8 +3627,7 @@ int msm_vidc_set_pipe(void *instance,
 	return rc;
 }
 
-int msm_vidc_set_seq_change_at_sync_frame(void* instance,
-	enum msm_vidc_inst_capability_type cap_id)
+int msm_vidc_set_seq_change_at_sync_frame(void *instance)
 {
 	int rc = 0;
 	u32 payload;
@@ -3632,7 +3639,7 @@ int msm_vidc_set_seq_change_at_sync_frame(void* instance,
 	}
 
 	payload = inst->capabilities->cap[LOWLATENCY_MODE].value;
-	rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
+	rc = msm_vidc_packetize_control(inst, LOWLATENCY_MODE, HFI_PAYLOAD_U32,
 		&payload, sizeof(u32), __func__);
 	if (rc)
 		return rc;