diff mbox

vb2: Allow STREAMOFF for io emulator

Message ID 1380894598-11242-1-git-send-email-ricardo.ribalda@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ricardo Ribalda Delgado Oct. 4, 2013, 1:49 p.m. UTC
A video device opened and streaming in io emulator mode can only stop
streamming if its file descriptor is closed.

There are some parameters that can only be changed if the device is not
streaming. Also, the power consumption of a device streaming could be
different than one not streaming.

With this patch a video device opened in io emulator can be stopped on
demand.

Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
---
 drivers/media/v4l2-core/videobuf2-core.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

Comments

Hans Verkuil Oct. 4, 2013, 2:09 p.m. UTC | #1
Hi Ricardo,

On 10/04/2013 03:49 PM, Ricardo Ribalda Delgado wrote:
> A video device opened and streaming in io emulator mode can only stop
> streamming if its file descriptor is closed.
> 
> There are some parameters that can only be changed if the device is not
> streaming. Also, the power consumption of a device streaming could be
> different than one not streaming.
> 
> With this patch a video device opened in io emulator can be stopped on
> demand.

Why would you want this? If you can call STREAMOFF, why not use stream I/O
all the way? That's much more efficient than read() anyway.

Unless there is a very good use-case, I don't see a good reason for mixing
file I/O with streaming I/O ioctls.

Regards,

	Hans

> 
> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
> ---
>  drivers/media/v4l2-core/videobuf2-core.c | 11 ++++++-----
>  1 file changed, 6 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
> index 9fc4bab..097fba8 100644
> --- a/drivers/media/v4l2-core/videobuf2-core.c
> +++ b/drivers/media/v4l2-core/videobuf2-core.c
> @@ -1686,6 +1686,7 @@ int vb2_streamon(struct vb2_queue *q, enum v4l2_buf_type type)
>  }
>  EXPORT_SYMBOL_GPL(vb2_streamon);
>  
> +static int __vb2_cleanup_fileio(struct vb2_queue *q);
>  
>  /**
>   * vb2_streamoff - stop streaming
> @@ -1704,11 +1705,6 @@ EXPORT_SYMBOL_GPL(vb2_streamon);
>   */
>  int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type)
>  {
> -	if (q->fileio) {
> -		dprintk(1, "streamoff: file io in progress\n");
> -		return -EBUSY;
> -	}
> -
>  	if (type != q->type) {
>  		dprintk(1, "streamoff: invalid stream type\n");
>  		return -EINVAL;
> @@ -1719,6 +1715,11 @@ int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type)
>  		return -EINVAL;
>  	}
>  
> +	if (q->fileio) {
> +		__vb2_cleanup_fileio(q);
> +		return 0;
> +	}
> +
>  	/*
>  	 * Cancel will pause streaming and remove all buffers from the driver
>  	 * and videobuf, effectively returning control over them to userspace.
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ricardo Ribalda Delgado Oct. 4, 2013, 2:16 p.m. UTC | #2
Hello Hans

I am implementing a test application for our camera, think of
v4l2-compliance but for testing the hardware (average of pixels,
rotation...) . I am implementing it using python (because of numpy and
matplotlib).

I dont really care about perferomance, I only care about the data
correctness, so the fileio fits perfectly my needs.

On the fileio api we dont have a way to tell the camera to stop, this
was an attempt to solve this "issue". But if it is only an issue for
me we can forget about it :).

BTW, do you know about a complete v4l2 library for python? I am using
https://pypi.python.org/pypi/v4l2 , but it is quite old.

Thanks!


On Fri, Oct 4, 2013 at 4:09 PM, Hans Verkuil <hverkuil@xs4all.nl> wrote:
> Hi Ricardo,
>
> On 10/04/2013 03:49 PM, Ricardo Ribalda Delgado wrote:
>> A video device opened and streaming in io emulator mode can only stop
>> streamming if its file descriptor is closed.
>>
>> There are some parameters that can only be changed if the device is not
>> streaming. Also, the power consumption of a device streaming could be
>> different than one not streaming.
>>
>> With this patch a video device opened in io emulator can be stopped on
>> demand.
>
> Why would you want this? If you can call STREAMOFF, why not use stream I/O
> all the way? That's much more efficient than read() anyway.
>
> Unless there is a very good use-case, I don't see a good reason for mixing
> file I/O with streaming I/O ioctls.
>
> Regards,
>
>         Hans
>
>>
>> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
>> ---
>>  drivers/media/v4l2-core/videobuf2-core.c | 11 ++++++-----
>>  1 file changed, 6 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
>> index 9fc4bab..097fba8 100644
>> --- a/drivers/media/v4l2-core/videobuf2-core.c
>> +++ b/drivers/media/v4l2-core/videobuf2-core.c
>> @@ -1686,6 +1686,7 @@ int vb2_streamon(struct vb2_queue *q, enum v4l2_buf_type type)
>>  }
>>  EXPORT_SYMBOL_GPL(vb2_streamon);
>>
>> +static int __vb2_cleanup_fileio(struct vb2_queue *q);
>>
>>  /**
>>   * vb2_streamoff - stop streaming
>> @@ -1704,11 +1705,6 @@ EXPORT_SYMBOL_GPL(vb2_streamon);
>>   */
>>  int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type)
>>  {
>> -     if (q->fileio) {
>> -             dprintk(1, "streamoff: file io in progress\n");
>> -             return -EBUSY;
>> -     }
>> -
>>       if (type != q->type) {
>>               dprintk(1, "streamoff: invalid stream type\n");
>>               return -EINVAL;
>> @@ -1719,6 +1715,11 @@ int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type)
>>               return -EINVAL;
>>       }
>>
>> +     if (q->fileio) {
>> +             __vb2_cleanup_fileio(q);
>> +             return 0;
>> +     }
>> +
>>       /*
>>        * Cancel will pause streaming and remove all buffers from the driver
>>        * and videobuf, effectively returning control over them to userspace.
>>
>
Marek Szyprowski Oct. 8, 2013, 7:22 a.m. UTC | #3
Hello,

On 2013-10-04 15:49, Ricardo Ribalda Delgado wrote:
> A video device opened and streaming in io emulator mode can only stop
> streamming if its file descriptor is closed.
>
> There are some parameters that can only be changed if the device is not
> streaming. Also, the power consumption of a device streaming could be
> different than one not streaming.
>
> With this patch a video device opened in io emulator can be stopped on
> demand.
>
> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>

Read/write-based io mode must not be mixed with ioctrl-based IO, so I 
really cannot accept this patch. Check V4L2 documentation for more details.

> ---
>   drivers/media/v4l2-core/videobuf2-core.c | 11 ++++++-----
>   1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
> index 9fc4bab..097fba8 100644
> --- a/drivers/media/v4l2-core/videobuf2-core.c
> +++ b/drivers/media/v4l2-core/videobuf2-core.c
> @@ -1686,6 +1686,7 @@ int vb2_streamon(struct vb2_queue *q, enum v4l2_buf_type type)
>   }
>   EXPORT_SYMBOL_GPL(vb2_streamon);
>   
> +static int __vb2_cleanup_fileio(struct vb2_queue *q);
>   
>   /**
>    * vb2_streamoff - stop streaming
> @@ -1704,11 +1705,6 @@ EXPORT_SYMBOL_GPL(vb2_streamon);
>    */
>   int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type)
>   {
> -	if (q->fileio) {
> -		dprintk(1, "streamoff: file io in progress\n");
> -		return -EBUSY;
> -	}
> -
>   	if (type != q->type) {
>   		dprintk(1, "streamoff: invalid stream type\n");
>   		return -EINVAL;
> @@ -1719,6 +1715,11 @@ int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type)
>   		return -EINVAL;
>   	}
>   
> +	if (q->fileio) {
> +		__vb2_cleanup_fileio(q);
> +		return 0;
> +	}
> +
>   	/*
>   	 * Cancel will pause streaming and remove all buffers from the driver
>   	 * and videobuf, effectively returning control over them to userspace.

Best regards
Ricardo Ribalda Delgado Oct. 8, 2013, 7:58 a.m. UTC | #4
Hi Marek

Thanks for your comments. I was just trying to find a way to stop
streaming while in read/write mode without having to close the
descriptor. I thought reusing streamoff was more clever than creating
a new ioctl.

Thanks!

On Tue, Oct 8, 2013 at 9:22 AM, Marek Szyprowski
<m.szyprowski@samsung.com> wrote:
> Hello,
>
>
> On 2013-10-04 15:49, Ricardo Ribalda Delgado wrote:
>>
>> A video device opened and streaming in io emulator mode can only stop
>> streamming if its file descriptor is closed.
>>
>> There are some parameters that can only be changed if the device is not
>> streaming. Also, the power consumption of a device streaming could be
>> different than one not streaming.
>>
>> With this patch a video device opened in io emulator can be stopped on
>> demand.
>>
>> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>
>
>
> Read/write-based io mode must not be mixed with ioctrl-based IO, so I really
> cannot accept this patch. Check V4L2 documentation for more details.
>
>
>> ---
>>   drivers/media/v4l2-core/videobuf2-core.c | 11 ++++++-----
>>   1 file changed, 6 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/media/v4l2-core/videobuf2-core.c
>> b/drivers/media/v4l2-core/videobuf2-core.c
>> index 9fc4bab..097fba8 100644
>> --- a/drivers/media/v4l2-core/videobuf2-core.c
>> +++ b/drivers/media/v4l2-core/videobuf2-core.c
>> @@ -1686,6 +1686,7 @@ int vb2_streamon(struct vb2_queue *q, enum
>> v4l2_buf_type type)
>>   }
>>   EXPORT_SYMBOL_GPL(vb2_streamon);
>>   +static int __vb2_cleanup_fileio(struct vb2_queue *q);
>>     /**
>>    * vb2_streamoff - stop streaming
>> @@ -1704,11 +1705,6 @@ EXPORT_SYMBOL_GPL(vb2_streamon);
>>    */
>>   int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type)
>>   {
>> -       if (q->fileio) {
>> -               dprintk(1, "streamoff: file io in progress\n");
>> -               return -EBUSY;
>> -       }
>> -
>>         if (type != q->type) {
>>                 dprintk(1, "streamoff: invalid stream type\n");
>>                 return -EINVAL;
>> @@ -1719,6 +1715,11 @@ int vb2_streamoff(struct vb2_queue *q, enum
>> v4l2_buf_type type)
>>                 return -EINVAL;
>>         }
>>   +     if (q->fileio) {
>> +               __vb2_cleanup_fileio(q);
>> +               return 0;
>> +       }
>> +
>>         /*
>>          * Cancel will pause streaming and remove all buffers from the
>> driver
>>          * and videobuf, effectively returning control over them to
>> userspace.
>
>
> Best regards
> --
> Marek Szyprowski
> Samsung R&D Institute Poland
>
Marek Szyprowski Oct. 8, 2013, 10 a.m. UTC | #5
Hi Racardo,

On 2013-10-08 09:58, Ricardo Ribalda Delgado wrote:
> Hi Marek
>
> Thanks for your comments. I was just trying to find a way to stop
> streaming while in read/write mode without having to close the
> descriptor. I thought reusing streamoff was more clever than creating
> a new ioctl.

Read()/write() mode is mainly designed for old and legacy applications. 
Those applications assume that the only reliable way to stop streaming 
is to close the fd. New tools should use libv4l and ioctl-based api.

Best regards
diff mbox

Patch

diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
index 9fc4bab..097fba8 100644
--- a/drivers/media/v4l2-core/videobuf2-core.c
+++ b/drivers/media/v4l2-core/videobuf2-core.c
@@ -1686,6 +1686,7 @@  int vb2_streamon(struct vb2_queue *q, enum v4l2_buf_type type)
 }
 EXPORT_SYMBOL_GPL(vb2_streamon);
 
+static int __vb2_cleanup_fileio(struct vb2_queue *q);
 
 /**
  * vb2_streamoff - stop streaming
@@ -1704,11 +1705,6 @@  EXPORT_SYMBOL_GPL(vb2_streamon);
  */
 int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type)
 {
-	if (q->fileio) {
-		dprintk(1, "streamoff: file io in progress\n");
-		return -EBUSY;
-	}
-
 	if (type != q->type) {
 		dprintk(1, "streamoff: invalid stream type\n");
 		return -EINVAL;
@@ -1719,6 +1715,11 @@  int vb2_streamoff(struct vb2_queue *q, enum v4l2_buf_type type)
 		return -EINVAL;
 	}
 
+	if (q->fileio) {
+		__vb2_cleanup_fileio(q);
+		return 0;
+	}
+
 	/*
 	 * Cancel will pause streaming and remove all buffers from the driver
 	 * and videobuf, effectively returning control over them to userspace.