msm: vidc: Fix split mode buffer issues
When split mode is enabled, HW is erroring out due to mismatch
in buffer size and count. Fix the same issue in driver.
CRs-Fixed: 2037218
Change-Id: Iad9c545c8809861c8e1688efc17229d605f6b27d
Signed-off-by: Praneeth Paladugu <ppaladug@codeaurora.org>
diff --git a/drivers/media/platform/msm/vidc/msm_vdec.c b/drivers/media/platform/msm/vidc/msm_vdec.c
index b211175..85e721f 100644
--- a/drivers/media/platform/msm/vidc/msm_vdec.c
+++ b/drivers/media/platform/msm/vidc/msm_vdec.c
@@ -564,6 +564,8 @@
inst->bufq[CAPTURE_PORT].plane_sizes[i] =
f->fmt.pix_mp.plane_fmt[i].sizeimage;
}
+
+ rc = msm_comm_try_get_bufreqs(inst);
} else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
fmt = msm_comm_get_pixel_fmt_fourcc(vdec_formats,
@@ -890,6 +892,7 @@
"Failed setting OUTPUT2 size : %d\n",
rc);
+ rc = msm_comm_try_get_bufreqs(inst);
break;
default:
dprintk(VIDC_ERR,
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c
index 8f77ebb..b0f67be 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_common.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c
@@ -3996,7 +3996,7 @@
static int msm_vidc_update_host_buff_counts(struct msm_vidc_inst *inst)
{
- int extra_buffers, buffer_type;
+ int extra_buffers;
struct hal_buffer_requirements *bufreq;
bufreq = get_buff_req_buffer(inst,
@@ -4004,7 +4004,7 @@
if (!bufreq) {
dprintk(VIDC_ERR,
"Failed : No buffer requirements : %x\n",
- HAL_BUFFER_INPUT);
+ HAL_BUFFER_INPUT);
return -EINVAL;
}
extra_buffers = msm_vidc_get_extra_buff_count(inst, HAL_BUFFER_INPUT);
@@ -4012,21 +4012,55 @@
bufreq->buffer_count_min_host = bufreq->buffer_count_min +
extra_buffers;
- buffer_type = msm_comm_get_hal_output_buffer(inst);
- bufreq = get_buff_req_buffer(inst,
- buffer_type);
- if (!bufreq) {
- dprintk(VIDC_ERR,
- "Failed : No buffer requirements : %x\n",
- buffer_type);
- return -EINVAL;
+ if (msm_comm_get_stream_output_mode(inst) ==
+ HAL_VIDEO_DECODER_SECONDARY) {
+
+ bufreq = get_buff_req_buffer(inst,
+ HAL_BUFFER_OUTPUT);
+ if (!bufreq) {
+ dprintk(VIDC_ERR,
+ "Failed : No buffer requirements : %x\n",
+ HAL_BUFFER_OUTPUT);
+ return -EINVAL;
+ }
+
+ /* For DPB buffers, no need to add Extra buffers */
+
+ bufreq->buffer_count_actual = bufreq->buffer_count_min_host =
+ bufreq->buffer_count_min;
+
+ bufreq = get_buff_req_buffer(inst,
+ HAL_BUFFER_OUTPUT2);
+ if (!bufreq) {
+ dprintk(VIDC_ERR,
+ "Failed : No buffer requirements : %x\n",
+ HAL_BUFFER_OUTPUT2);
+ return -EINVAL;
+ }
+
+ extra_buffers = msm_vidc_get_extra_buff_count(inst,
+ HAL_BUFFER_OUTPUT);
+
+ bufreq->buffer_count_min_host =
+ bufreq->buffer_count_min + extra_buffers;
+ } else {
+
+ bufreq = get_buff_req_buffer(inst,
+ HAL_BUFFER_OUTPUT);
+ if (!bufreq) {
+ dprintk(VIDC_ERR,
+ "Failed : No buffer requirements : %x\n",
+ HAL_BUFFER_OUTPUT);
+ return -EINVAL;
+ }
+
+ extra_buffers = msm_vidc_get_extra_buff_count(inst,
+ HAL_BUFFER_OUTPUT);
+
+ bufreq->buffer_count_actual = bufreq->buffer_count_min_host =
+ bufreq->buffer_count_min + extra_buffers;
}
- extra_buffers = msm_vidc_get_extra_buff_count(inst, buffer_type);
-
- bufreq->buffer_count_min_host = bufreq->buffer_count_min +
- extra_buffers;
-
return 0;
}