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 <asahukar@codeaurora.org>
This commit is contained in:
Akshata Sahukar
2021-01-12 12:48:32 -08:00
parent 0208a2b471
commit 60bf543cff
4 changed files with 33 additions and 11 deletions

View File

@@ -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:

View File

@@ -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++,

View File

@@ -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;
}