lkml.org 
[lkml]   [2019]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH 11/16] media: vimc: cap: Allocate and verify mplanar buffers
Date
If the driver is in multiplanar mode, fill the vb2 structures
with the planes sizes and verify it the sizes allocated to the
planes are enough.

Signed-off-by: André Almeida <andrealmeid@collabora.com>
---
drivers/media/platform/vimc/vimc-capture.c | 42 ++++++++++++++++++----
1 file changed, 36 insertions(+), 6 deletions(-)

diff --git a/drivers/media/platform/vimc/vimc-capture.c b/drivers/media/platform/vimc/vimc-capture.c
index 24052f15c4cf..83196b8c31b5 100644
--- a/drivers/media/platform/vimc/vimc-capture.c
+++ b/drivers/media/platform/vimc/vimc-capture.c
@@ -486,12 +486,28 @@ static int vimc_cap_queue_setup(struct vb2_queue *vq, unsigned int *nbuffers,
struct device *alloc_devs[])
{
struct vimc_cap_device *vcap = vb2_get_drv_priv(vq);
+ const struct v4l2_plane_pix_format *plane_fmt =
+ vcap->format.fmt.pix_mp.plane_fmt;
+ unsigned int i;
+
+ if (multiplanar) {
+ for (i = 0; i < *nplanes; i++)
+ if (sizes[i] < plane_fmt[i].sizeimage)
+ return -EINVAL;
+ } else if (*nplanes && sizes[0] < vcap->format.fmt.pix.sizeimage)
+ return -EINVAL;

if (*nplanes)
- return sizes[0] < vcap->format.fmt.pix.sizeimage ? -EINVAL : 0;
- /* We don't support multiplanes for now */
- *nplanes = 1;
- sizes[0] = vcap->format.fmt.pix.sizeimage;
+ return 0;
+
+ if (multiplanar) {
+ *nplanes = vcap->format.fmt.pix_mp.num_planes;
+ for (i = 0; i < *nplanes; i++)
+ sizes[i] = plane_fmt[i].sizeimage;
+ } else {
+ *nplanes = 1;
+ sizes[0] = vcap->format.fmt.pix.sizeimage;
+ }

return 0;
}
@@ -499,9 +515,23 @@ static int vimc_cap_queue_setup(struct vb2_queue *vq, unsigned int *nbuffers,
static int vimc_cap_buffer_prepare(struct vb2_buffer *vb)
{
struct vimc_cap_device *vcap = vb2_get_drv_priv(vb->vb2_queue);
- unsigned long size = vcap->format.fmt.pix.sizeimage;
+ unsigned long size;
+ unsigned int i;

- if (vb2_plane_size(vb, 0) < size) {
+ if (multiplanar) {
+ for (i = 0; i < vb->num_planes; i++) {
+ size = vcap->format.fmt.pix_mp.plane_fmt[i].sizeimage;
+ if (vb2_plane_size(vb, i) < size) {
+ dev_err(vcap->dev,
+ "%s: buffer too small (%lu < %lu)\n",
+ vcap->vdev.name, vb2_plane_size(vb, i),
+ size);
+
+ return -EINVAL;
+ }
+ }
+ } else if (vb2_plane_size(vb, 0) < vcap->format.fmt.pix.sizeimage) {
+ size = vcap->format.fmt.pix.sizeimage;
dev_err(vcap->dev, "%s: buffer too small (%lu < %lu)\n",
vcap->vdev.name, vb2_plane_size(vb, 0), size);
return -EINVAL;
--
2.21.0
\
 
 \ /
  Last update: 2019-03-15 17:46    [W:0.084 / U:14.912 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site