소스 검색

video: driver: Set proper HFI during low latency for decoder

Decoder supports dynamic low latency. When client configures the
video session in low latency mode, driver would configure the
firmware such that HFI_CMD_SETTINGS_CHANGE is triggerred on
sync frame boundary.

Change-Id: Ie70eaaeb8ad420db926f0d99f77723476deee400
Signed-off-by: Vikash Garodia <[email protected]>
Vikash Garodia 4 년 전
부모
커밋
c1bf1d2bc9
4개의 변경된 파일30개의 추가작업 그리고 3개의 파일을 삭제
  1. 3 3
      driver/platform/waipio/src/msm_vidc_waipio.c
  2. 2 0
      driver/vidc/inc/msm_vidc_control.h
  3. 4 0
      driver/vidc/src/msm_vdec.c
  4. 21 0
      driver/vidc/src/msm_vidc_control.c

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

@@ -481,10 +481,10 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		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_DYNAMIC_ALLOWED,
+		HFI_PROP_SEQ_CHANGE_AT_SYNC_FRAME,
+		CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
 		{0}, {0},
-		NULL, msm_vidc_set_stage},
+		NULL, msm_vidc_set_seq_change_at_sync_frame},
 
 	{LTR_COUNT, ENC, H264|HEVC,
 		0, 2, 1, 0,

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

@@ -95,6 +95,8 @@ 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_s32(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_q16(void *instance,

+ 4 - 0
driver/vidc/src/msm_vdec.c

@@ -778,6 +778,10 @@ 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);
+	if (rc)
+		return rc;
+
 	return rc;
 }
 

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

@@ -3351,3 +3351,24 @@ 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 rc = 0;
+	u32 payload;
+	struct msm_vidc_inst* inst = (struct msm_vidc_inst*)instance;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	payload = inst->capabilities->cap[LOWLATENCY_MODE].value;
+	rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
+		&payload, sizeof(u32), __func__);
+	if (rc)
+		return rc;
+
+	return rc;
+}