From d88ef7d22cac032c4ddf7e4b8af5982d5a3019cb Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Thu, 13 Aug 2020 17:01:27 +0100 Subject: [PATCH] staging: vc04_service: codec: Allow start_streaming to update the buffernum start_streaming passes a count of how many buffers have been queued to videobuf2. Allow this value to update the number of buffers the VPU allocates on a port to avoid buffer recycling issues. Signed-off-by: Dave Stevenson --- .../bcm2835-codec/bcm2835-v4l2-codec.c | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) --- a/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c +++ b/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c @@ -2268,6 +2268,7 @@ static int bcm2835_codec_start_streaming struct bcm2835_codec_ctx *ctx = vb2_get_drv_priv(q); struct bcm2835_codec_dev *dev = ctx->dev; struct bcm2835_codec_q_data *q_data = get_q_data(ctx, q->type); + struct vchiq_mmal_port *port = get_port_data(ctx, q->type); int ret; v4l2_dbg(1, debug, &ctx->dev->v4l2_dev, "%s: type: %d count %d\n", @@ -2283,6 +2284,20 @@ static int bcm2835_codec_start_streaming ctx->component_enabled = true; } + if (count < port->minimum_buffer.num) + count = port->minimum_buffer.num; + + if (port->current_buffer.num != count + 1) { + v4l2_dbg(2, debug, &ctx->dev->v4l2_dev, "%s: ctx:%p, buffer count changed %u to %u\n", + __func__, ctx, port->current_buffer.num, count + 1); + + port->current_buffer.num = count + 1; + ret = vchiq_mmal_port_set_format(dev->instance, port); + if (ret) + v4l2_err(&ctx->dev->v4l2_dev, "%s: Error updating buffer count, ret %d\n", + __func__, ret); + } + if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { /* * Create the EOS buffer. @@ -2294,17 +2309,17 @@ static int bcm2835_codec_start_streaming &q_data->eos_buffer.mmal); q_data->eos_buffer_in_use = false; - ctx->component->input[0].cb_ctx = ctx; + port->cb_ctx = ctx; ret = vchiq_mmal_port_enable(dev->instance, - &ctx->component->input[0], + port, ip_buffer_cb); if (ret) v4l2_err(&ctx->dev->v4l2_dev, "%s: Failed enabling i/p port, ret %d\n", __func__, ret); } else { - ctx->component->output[0].cb_ctx = ctx; + port->cb_ctx = ctx; ret = vchiq_mmal_port_enable(dev->instance, - &ctx->component->output[0], + port, op_buffer_cb); if (ret) v4l2_err(&ctx->dev->v4l2_dev, "%s: Failed enabling o/p port, ret %d\n",