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:
@@ -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:
|
||||
|
@@ -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++,
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user