Browse Source

video: driver: fix enc drain and change frame rate set handling

- Move driver to MSM_VIDC_DRAIN state when drain command
  is receieved for an encoder session
- Static HFI_PROP_FRAME_RATE setting to video fw handling
  is moved to inst database set function via
  msm_vidc_set_v4l2_properties to avoid enc session failure
  due to setting HFI_PROP_FRAME_RATE before starting video fw

Change-Id: I207b4bce932c5959fe47b9cca32abd15660ce2a9
Signed-off-by: Akshata Sahukar <[email protected]>
Akshata Sahukar 4 years ago
parent
commit
60bf543cff

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

@@ -159,7 +159,16 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 	/* ((4096 * 2304) / 256) * 60 fps */
 	{POWER_SAVE_MBPS, ENC, CODECS_ALL, 0, 2211840, 1, 2211840},
 
-	{FRAME_RATE, ENC|DEC, CODECS_ALL,
+	{FRAME_RATE, ENC, CODECS_ALL,
+		(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
+		1, (DEFAULT_FPS << 16),
+		0,
+		HFI_PROP_FRAME_RATE,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
+		{0}, {0},
+		NULL, msm_vidc_set_q16},
+
+	{FRAME_RATE, DEC, CODECS_ALL,
 		(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
 		1, (DEFAULT_FPS << 16),
 		0,

+ 20 - 4
driver/vidc/src/msm_venc.c

@@ -821,9 +821,15 @@ int msm_venc_process_cmd(struct msm_vidc_inst *inst, u32 cmd)
 				0);
 		if (rc)
 			return rc;
+		rc = msm_vidc_state_change_stop(inst);
+		if (rc)
+			return rc;
 	} else if (cmd == V4L2_ENC_CMD_START) {
 		if (!msm_vidc_allow_start(inst))
 			return -EBUSY;
+		rc = msm_vidc_state_change_start(inst);
+		if (rc)
+			return rc;
 		rc = venus_hfi_session_command(inst,
 				HFI_CMD_RESUME,
 				INPUT_PORT,
@@ -1332,7 +1338,20 @@ set_default:
 	s_vpr_h(inst->sid, "%s: type %u value %#x\n",
 		__func__, s_parm->type, q16_rate);
 
-	if (is_frame_rate) {
+	if (!is_frame_rate) {
+		capability->cap[OPERATING_RATE].value = q16_rate;
+		goto exit;
+	} else {
+		capability->cap[FRAME_RATE].value = q16_rate;
+	}
+
+	/*
+	 * In static case, frame rate is set during via
+	 * inst database set function mentioned in
+	 * FRAME_RATE cap id.
+	 * In dynamic case, frame rate is set like below.
+	 */
+	if (inst->vb2q[OUTPUT_PORT].streaming) {
 		rc = venus_hfi_session_property(inst,
 			HFI_PROP_FRAME_RATE,
 			HFI_HOST_FLAGS_NONE,
@@ -1346,9 +1365,6 @@ set_default:
 				__func__);
 			goto exit;
 		}
-		capability->cap[FRAME_RATE].value = q16_rate;
-	} else {
-		capability->cap[OPERATING_RATE].value = q16_rate;
 	}
 
 exit:

+ 2 - 4
driver/vidc/src/venus_hfi.c

@@ -2858,8 +2858,7 @@ int venus_hfi_session_command(struct msm_vidc_inst *inst,
 
 	rc = hfi_create_packet(inst->packet, inst->packet_size,
 			cmd,
-			(HFI_HOST_FLAGS_RESPONSE_REQUIRED |
-			HFI_HOST_FLAGS_INTR_REQUIRED),
+			HFI_HOST_FLAGS_NONE,
 			payload_type,
 			get_hfi_port(inst, port),
 			core->packet_id++,
@@ -2905,8 +2904,7 @@ int venus_hfi_queue_buffer(struct msm_vidc_inst *inst,
 	rc = hfi_create_packet(inst->packet,
 			inst->packet_size,
 			HFI_CMD_BUFFER,
-			(HFI_HOST_FLAGS_RESPONSE_REQUIRED |
-			HFI_HOST_FLAGS_INTR_REQUIRED),
+			HFI_HOST_FLAGS_NONE,
 			HFI_PAYLOAD_STRUCTURE,
 			get_hfi_port_from_buffer_type(inst, buffer->type),
 			core->packet_id++,

+ 1 - 2
driver/vidc/src/venus_hfi_response.c

@@ -729,8 +729,7 @@ static int handle_session_buffer(struct msm_vidc_inst *inst,
 	buffer = (struct hfi_buffer *)((u8 *)pkt + sizeof(struct hfi_packet));
 	buf_type = buffer->type;
 	if (!is_valid_hfi_buffer_type(inst, buf_type, __func__)) {
-		/* TODO */
-		//msm_vidc_change_inst_state(inst, MSM_VIDC_ERROR, __func__);
+		msm_vidc_change_inst_state(inst, MSM_VIDC_ERROR, __func__);
 		return 0;
 	}