From 7dae4c54df7e735b76b5487b270126651ee23c7b Mon Sep 17 00:00:00 2001 From: Surajit Podder Date: Wed, 22 Feb 2017 19:33:05 +0530 Subject: [PATCH] msm: vidc: Fix sequence change event properly Ensure that session continue is not sent to firmware in cases where resources sufficient event is converted to insufficient. Change-Id: I3500a63d49dcd799ad76491a207c68bfef854dd3 Signed-off-by: Surajit Podder --- .../media/platform/msm/vidc/msm_vidc_common.c | 59 +++++++++---------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c index 4cb8f92c4e38..f92687f0a2fa 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_common.c +++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c @@ -1133,38 +1133,13 @@ static void handle_event_change(enum hal_command_response cmd, void *data) switch (event_notify->hal_event_type) { case HAL_EVENT_SEQ_CHANGED_SUFFICIENT_RESOURCES: - event = V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT; - rc = msm_comm_g_ctrl_for_id(inst, V4L2_CID_MPEG_VIDC_VIDEO_CONTINUE_DATA_TRANSFER); - - if (!IS_ERR_VALUE(rc) && rc == true) { + if (!is_thumbnail_session(inst) && + (IS_ERR_VALUE(rc) || rc == false)) + event = V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT; + else event = V4L2_EVENT_SEQ_CHANGED_SUFFICIENT; - - if (msm_comm_get_stream_output_mode(inst) == - HAL_VIDEO_DECODER_SECONDARY) { - struct hal_frame_size frame_sz; - - frame_sz.buffer_type = HAL_BUFFER_OUTPUT2; - frame_sz.width = event_notify->width; - frame_sz.height = event_notify->height; - dprintk(VIDC_DBG, - "Update OPB dimensions to firmware if buffer requirements are sufficient\n"); - rc = msm_comm_try_set_prop(inst, - HAL_PARAM_FRAME_SIZE, &frame_sz); - } - - dprintk(VIDC_DBG, - "send session_continue after sufficient event\n"); - rc = call_hfi_op(hdev, session_continue, - (void *) inst->session); - if (rc) { - dprintk(VIDC_ERR, - "%s - failed to send session_continue\n", - __func__); - goto err_bad_event; - } - } break; case HAL_EVENT_SEQ_CHANGED_INSUFFICIENT_RESOURCES: event = V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT; @@ -1267,7 +1242,7 @@ static void handle_event_change(enum hal_command_response cmd, void *data) "V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT due to bit-depth change\n"); } - if (inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_NV12 && + if ((inst->fmts[CAPTURE_PORT].fourcc == V4L2_PIX_FMT_NV12) && inst->pic_struct != event_notify->pic_struct) { inst->pic_struct = event_notify->pic_struct; event = V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT; @@ -1317,6 +1292,30 @@ static void handle_event_change(enum hal_command_response cmd, void *data) ptr = (u32 *)seq_changed_event.u.data; ptr[0] = event_notify->height; ptr[1] = event_notify->width; + } else { + if (msm_comm_get_stream_output_mode(inst) == + HAL_VIDEO_DECODER_SECONDARY) { + struct hal_frame_size frame_sz; + + frame_sz.buffer_type = HAL_BUFFER_OUTPUT2; + frame_sz.width = event_notify->width; + frame_sz.height = event_notify->height; + dprintk(VIDC_DBG, + "Update OPB dimensions to firmware if buffer requirements are sufficient\n"); + rc = msm_comm_try_set_prop(inst, + HAL_PARAM_FRAME_SIZE, &frame_sz); + } + + dprintk(VIDC_DBG, + "send session_continue after sufficient event\n"); + rc = call_hfi_op(hdev, session_continue, + (void *) inst->session); + if (rc) { + dprintk(VIDC_ERR, + "%s - failed to send session_continue\n", + __func__); + goto err_bad_event; + } } v4l2_event_queue_fh(&inst->event_handler, &seq_changed_event); } else if (rc == -ENOTSUPP) {