diff mbox series

[v3,13/14] media: vimc: cap: Add support for multiplanar formats

Message ID 20190424135642.31973-14-andrealmeid@collabora.com (mailing list archive)
State New, archived
Headers show
Series media: vimc: Add support for multiplanar formats | expand

Commit Message

André Almeida April 24, 2019, 1:56 p.m. UTC
Adapt vimc-capture to support multiplanar formats, copying
each plane to the correct buffer.

Signed-off-by: André Almeida <andrealmeid@collabora.com>
---
Change in v3:
- Adapt to new vimc_frame

Change in v2: none

 drivers/media/platform/vimc/vimc-capture.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

Comments

Helen Mae Koike Fornazier April 24, 2019, 9:31 p.m. UTC | #1
Hi André,

On 4/24/19 10:56 AM, André Almeida wrote:
> Adapt vimc-capture to support multiplanar formats, copying
> each plane to the correct buffer.
> 
> Signed-off-by: André Almeida <andrealmeid@collabora.com>
> ---
> Change in v3:
> - Adapt to new vimc_frame
> 
> Change in v2: none
> 
>  drivers/media/platform/vimc/vimc-capture.c | 16 +++++++++++-----
>  1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/media/platform/vimc/vimc-capture.c b/drivers/media/platform/vimc/vimc-capture.c
> index d5b72c858af7..2592ea982ff8 100644
> --- a/drivers/media/platform/vimc/vimc-capture.c
> +++ b/drivers/media/platform/vimc/vimc-capture.c
> @@ -485,6 +485,8 @@ static struct vimc_frame *vimc_cap_process_frame(struct vimc_ent_device *ved,
>  	struct vimc_cap_device *vcap = container_of(ved, struct vimc_cap_device,
>  						    ved);
>  	struct vimc_cap_buffer *vimc_buf;
> +	unsigned long plane_size;
> +	unsigned int i;
>  	void *vbuf;
>  
>  	spin_lock(&vcap->qlock);
> @@ -507,13 +509,17 @@ static struct vimc_frame *vimc_cap_process_frame(struct vimc_ent_device *ved,
>  	vimc_buf->vb2.sequence = vcap->sequence++;
>  	vimc_buf->vb2.field = vcap->format.fmt.pix.field;
>  
> -	vbuf = vb2_plane_vaddr(&vimc_buf->vb2.vb2_buf, 0);
> +	/* For each plane, copy the pixels */
> +	for (i = 0; i < vimc_buf->vb2.vb2_buf.num_planes; i++) {
> +		vbuf = vb2_plane_vaddr(&vimc_buf->vb2.vb2_buf, i);
> +		plane_size = frame->fmt.plane_fmt[i].sizeimage;

I think you should keep the same type, frame->fmt.plane_fmt[i].sizeimage
is __u32.

Helen

> +
> +		memcpy(vbuf, frame->plane_addr[i], plane_size);>
> -	memcpy(vbuf, frame->plane_addr[0], vcap->format.fmt.pix.sizeimage);
> +		/* Set it as ready */
> +		vb2_set_plane_payload(&vimc_buf->vb2.vb2_buf, i, plane_size);
> +	}
>  
> -	/* Set it as ready */
> -	vb2_set_plane_payload(&vimc_buf->vb2.vb2_buf, 0,
> -			      vcap->format.fmt.pix.sizeimage);
>  	vb2_buffer_done(&vimc_buf->vb2.vb2_buf, VB2_BUF_STATE_DONE);
>  	return NULL;
>  }
>
diff mbox series

Patch

diff --git a/drivers/media/platform/vimc/vimc-capture.c b/drivers/media/platform/vimc/vimc-capture.c
index d5b72c858af7..2592ea982ff8 100644
--- a/drivers/media/platform/vimc/vimc-capture.c
+++ b/drivers/media/platform/vimc/vimc-capture.c
@@ -485,6 +485,8 @@  static struct vimc_frame *vimc_cap_process_frame(struct vimc_ent_device *ved,
 	struct vimc_cap_device *vcap = container_of(ved, struct vimc_cap_device,
 						    ved);
 	struct vimc_cap_buffer *vimc_buf;
+	unsigned long plane_size;
+	unsigned int i;
 	void *vbuf;
 
 	spin_lock(&vcap->qlock);
@@ -507,13 +509,17 @@  static struct vimc_frame *vimc_cap_process_frame(struct vimc_ent_device *ved,
 	vimc_buf->vb2.sequence = vcap->sequence++;
 	vimc_buf->vb2.field = vcap->format.fmt.pix.field;
 
-	vbuf = vb2_plane_vaddr(&vimc_buf->vb2.vb2_buf, 0);
+	/* For each plane, copy the pixels */
+	for (i = 0; i < vimc_buf->vb2.vb2_buf.num_planes; i++) {
+		vbuf = vb2_plane_vaddr(&vimc_buf->vb2.vb2_buf, i);
+		plane_size = frame->fmt.plane_fmt[i].sizeimage;
+
+		memcpy(vbuf, frame->plane_addr[i], plane_size);
 
-	memcpy(vbuf, frame->plane_addr[0], vcap->format.fmt.pix.sizeimage);
+		/* Set it as ready */
+		vb2_set_plane_payload(&vimc_buf->vb2.vb2_buf, i, plane_size);
+	}
 
-	/* Set it as ready */
-	vb2_set_plane_payload(&vimc_buf->vb2.vb2_buf, 0,
-			      vcap->format.fmt.pix.sizeimage);
 	vb2_buffer_done(&vimc_buf->vb2.vb2_buf, VB2_BUF_STATE_DONE);
 	return NULL;
 }