95 lines
3.5 KiB
Diff
95 lines
3.5 KiB
Diff
From def9aa1e5f2e29d29b493c22fd98e1c0af018d99 Mon Sep 17 00:00:00 2001
|
|
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
|
Date: Wed, 15 Sep 2021 17:44:19 +0100
|
|
Subject: [PATCH] staging/bcm2835-codec: Do not send buffers to the VPU
|
|
unless streaming
|
|
|
|
With video decode we now enable both input and output ports on
|
|
the component. This means that buffers will get passed to the VPU
|
|
earlier than desired if they are queued befoer STREAMON.
|
|
|
|
Check that the queue is streaming before sending buffers to the VPU.
|
|
|
|
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
|
---
|
|
.../bcm2835-codec/bcm2835-v4l2-codec.c | 64 +++++++++++--------
|
|
1 file changed, 38 insertions(+), 26 deletions(-)
|
|
|
|
--- a/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c
|
|
+++ b/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c
|
|
@@ -1244,35 +1244,47 @@ static void device_run(void *priv)
|
|
|
|
v4l2_dbg(3, debug, &ctx->dev->v4l2_dev, "%s: off we go\n", __func__);
|
|
|
|
- src_buf = v4l2_m2m_buf_remove(&ctx->fh.m2m_ctx->out_q_ctx);
|
|
- if (src_buf) {
|
|
- m2m = container_of(src_buf, struct v4l2_m2m_buffer, vb);
|
|
- src_m2m_buf = container_of(m2m, struct m2m_mmal_buffer, m2m);
|
|
- vb2_to_mmal_buffer(src_m2m_buf, src_buf);
|
|
-
|
|
- ret = vchiq_mmal_submit_buffer(dev->instance,
|
|
- &ctx->component->input[0],
|
|
- &src_m2m_buf->mmal);
|
|
- v4l2_dbg(3, debug, &ctx->dev->v4l2_dev, "%s: Submitted ip buffer len %lu, pts %llu, flags %04x\n",
|
|
- __func__, src_m2m_buf->mmal.length,
|
|
- src_m2m_buf->mmal.pts, src_m2m_buf->mmal.mmal_flags);
|
|
- if (ret)
|
|
- v4l2_err(&ctx->dev->v4l2_dev, "%s: Failed submitting ip buffer\n",
|
|
- __func__);
|
|
+ if (ctx->fh.m2m_ctx->out_q_ctx.q.streaming) {
|
|
+ src_buf = v4l2_m2m_buf_remove(&ctx->fh.m2m_ctx->out_q_ctx);
|
|
+ if (src_buf) {
|
|
+ m2m = container_of(src_buf, struct v4l2_m2m_buffer, vb);
|
|
+ src_m2m_buf = container_of(m2m, struct m2m_mmal_buffer,
|
|
+ m2m);
|
|
+ vb2_to_mmal_buffer(src_m2m_buf, src_buf);
|
|
+
|
|
+ ret = vchiq_mmal_submit_buffer(dev->instance,
|
|
+ &ctx->component->input[0],
|
|
+ &src_m2m_buf->mmal);
|
|
+ v4l2_dbg(3, debug, &ctx->dev->v4l2_dev,
|
|
+ "%s: Submitted ip buffer len %lu, pts %llu, flags %04x\n",
|
|
+ __func__, src_m2m_buf->mmal.length,
|
|
+ src_m2m_buf->mmal.pts,
|
|
+ src_m2m_buf->mmal.mmal_flags);
|
|
+ if (ret)
|
|
+ v4l2_err(&ctx->dev->v4l2_dev,
|
|
+ "%s: Failed submitting ip buffer\n",
|
|
+ __func__);
|
|
+ }
|
|
}
|
|
|
|
- dst_buf = v4l2_m2m_buf_remove(&ctx->fh.m2m_ctx->cap_q_ctx);
|
|
- if (dst_buf) {
|
|
- m2m = container_of(dst_buf, struct v4l2_m2m_buffer, vb);
|
|
- dst_m2m_buf = container_of(m2m, struct m2m_mmal_buffer, m2m);
|
|
- vb2_to_mmal_buffer(dst_m2m_buf, dst_buf);
|
|
-
|
|
- ret = vchiq_mmal_submit_buffer(dev->instance,
|
|
- &ctx->component->output[0],
|
|
- &dst_m2m_buf->mmal);
|
|
- if (ret)
|
|
- v4l2_err(&ctx->dev->v4l2_dev, "%s: Failed submitting op buffer\n",
|
|
- __func__);
|
|
+ if (ctx->fh.m2m_ctx->cap_q_ctx.q.streaming) {
|
|
+ dst_buf = v4l2_m2m_buf_remove(&ctx->fh.m2m_ctx->cap_q_ctx);
|
|
+ if (dst_buf) {
|
|
+ m2m = container_of(dst_buf, struct v4l2_m2m_buffer, vb);
|
|
+ dst_m2m_buf = container_of(m2m, struct m2m_mmal_buffer,
|
|
+ m2m);
|
|
+ vb2_to_mmal_buffer(dst_m2m_buf, dst_buf);
|
|
+
|
|
+ v4l2_dbg(3, debug, &ctx->dev->v4l2_dev,
|
|
+ "%s: Submitted op buffer\n", __func__);
|
|
+ ret = vchiq_mmal_submit_buffer(dev->instance,
|
|
+ &ctx->component->output[0],
|
|
+ &dst_m2m_buf->mmal);
|
|
+ if (ret)
|
|
+ v4l2_err(&ctx->dev->v4l2_dev,
|
|
+ "%s: Failed submitting op buffer\n",
|
|
+ __func__);
|
|
+ }
|
|
}
|
|
|
|
v4l2_dbg(3, debug, &ctx->dev->v4l2_dev, "%s: Submitted src %p, dst %p\n",
|