From 31012cd79ed98eec94e37856cf3e3d23e3f661fc Mon Sep 17 00:00:00 2001 From: Govindaraj Rajagopal Date: Tue, 1 Jun 2021 13:20:24 +0530 Subject: [PATCH] video: driver: queue pending buffers at streamon qbuf will be deferred on all ports before streamon, So explicitly queue pending buffers at the time of streamon. Change-Id: I673a14f0d43563184aac887f5f23b63ed13d59df Signed-off-by: Govindaraj Rajagopal --- driver/vidc/inc/msm_vdec.h | 1 - driver/vidc/inc/msm_vidc_driver.h | 7 ++++++- driver/vidc/src/msm_vdec.c | 2 +- driver/vidc/src/msm_vidc_driver.c | 8 ++++---- driver/vidc/src/msm_vidc_vb2.c | 10 ++++++++++ 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/driver/vidc/inc/msm_vdec.h b/driver/vidc/inc/msm_vdec.h index 7b2c724907..90e795ca3e 100644 --- a/driver/vidc/inc/msm_vdec.h +++ b/driver/vidc/inc/msm_vdec.h @@ -29,7 +29,6 @@ int msm_vdec_init_input_subcr_params(struct msm_vidc_inst *inst); int msm_vdec_input_port_settings_change(struct msm_vidc_inst *inst); int msm_vdec_output_port_settings_change(struct msm_vidc_inst *inst); int msm_vdec_process_cmd(struct msm_vidc_inst *inst, u32 cmd); -int msm_vidc_queue_buffer_batch(struct msm_vidc_inst *inst); int msm_vdec_handle_release_buffer(struct msm_vidc_inst *inst, struct msm_vidc_buffer *buf); diff --git a/driver/vidc/inc/msm_vidc_driver.h b/driver/vidc/inc/msm_vidc_driver.h index 5e44a77fc1..419e1d9abe 100644 --- a/driver/vidc/inc/msm_vidc_driver.h +++ b/driver/vidc/inc/msm_vidc_driver.h @@ -348,7 +348,12 @@ int msm_vidc_get_delayed_unmap(struct msm_vidc_inst *inst, struct msm_vidc_map *map); int msm_vidc_put_delayed_unmap(struct msm_vidc_inst *inst, struct msm_vidc_map *map); -int msm_vidc_queue_buffer_single(struct msm_vidc_inst *inst, struct vb2_buffer *vb2); +enum msm_vidc_buffer_type v4l2_type_to_driver(u32 type, + const char *func); +int msm_vidc_queue_buffer_single(struct msm_vidc_inst *inst, + struct vb2_buffer *vb2); +int msm_vidc_queue_deferred_buffers(struct msm_vidc_inst *inst, + enum msm_vidc_buffer_type buf_type); int msm_vidc_destroy_internal_buffer(struct msm_vidc_inst *inst, struct msm_vidc_buffer *buffer); void msm_vidc_destroy_buffers(struct msm_vidc_inst *inst); diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index 17e42b1e66..43105a2a38 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -1783,7 +1783,7 @@ static int msm_vdec_qbuf_batch(struct msm_vidc_inst *inst, cancel_batch_work(inst); } - rc = msm_vidc_queue_buffer_batch(inst); + rc = msm_vidc_queue_deferred_buffers(inst, MSM_VIDC_BUF_OUTPUT); if (rc) return rc; diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 8e0dcc83c2..425f42ffe7 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -2938,18 +2938,18 @@ static int msm_vidc_queue_buffer(struct msm_vidc_inst *inst, struct msm_vidc_buf return 0; } -int msm_vidc_queue_buffer_batch(struct msm_vidc_inst *inst) +int msm_vidc_queue_deferred_buffers(struct msm_vidc_inst *inst, enum msm_vidc_buffer_type buf_type) { struct msm_vidc_buffers *buffers; struct msm_vidc_buffer *buf; int rc = 0; - if (!inst) { + if (!inst || !buf_type) { d_vpr_e("%s: invalid params\n", __func__); return -EINVAL; } - buffers = msm_vidc_get_buffers(inst, MSM_VIDC_BUF_OUTPUT, __func__); + buffers = msm_vidc_get_buffers(inst, buf_type, __func__); if (!buffers) return -EINVAL; @@ -4488,7 +4488,7 @@ void msm_vidc_batch_handler(struct work_struct *work) } i_vpr_h(inst, "%s: queue pending batch buffers\n", __func__); - rc = msm_vidc_queue_buffer_batch(inst); + rc = msm_vidc_queue_deferred_buffers(inst, MSM_VIDC_BUF_OUTPUT); if (rc) { i_vpr_e(inst, "%s: batch qbufs failed\n", __func__); msm_vidc_change_inst_state(inst, MSM_VIDC_ERROR, __func__); diff --git a/driver/vidc/src/msm_vidc_vb2.c b/driver/vidc/src/msm_vidc_vb2.c index 7b35ceaf01..3a509bf295 100644 --- a/driver/vidc/src/msm_vidc_vb2.c +++ b/driver/vidc/src/msm_vidc_vb2.c @@ -151,6 +151,7 @@ int msm_vidc_start_streaming(struct vb2_queue *q, unsigned int count) { int rc = 0; struct msm_vidc_inst *inst; + enum msm_vidc_buffer_type buf_type; if (!q || !q->drv_priv) { d_vpr_e("%s: invalid input, q = %pK\n", q); @@ -226,6 +227,15 @@ int msm_vidc_start_streaming(struct vb2_queue *q, unsigned int count) /* print final buffer counts & size details */ msm_vidc_print_buffer_info(inst); + buf_type = v4l2_type_to_driver(q->type, __func__); + if (!buf_type) + goto error; + + /* queue pending buffers */ + rc = msm_vidc_queue_deferred_buffers(inst, buf_type); + if (rc) + goto error; + i_vpr_h(inst, "Streamon: %d successful\n", q->type); return rc;