Re: [RFCv2 PATCH] Add support for V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jun 29, 2011 at 02:00:37PM +0200, Hans Verkuil wrote:
> Hi all,

Hi Hans,

Thanks for the patch.

Just one comment. I guess it's not strict in DocBook but many of the lines
are well over 80 characters. The paragraphs especially would be easier read
when wrapped around that column. I could also be I'm the only one whose
$COLUMNS == 80. :-)

> Second attempt: inverted the meaning of the flag as per Laurent's suggestion.
> 
> Regards,
> 
> 	Hans
> 
> 
> 
> Normally no control events will go to the filehandle that called the
> VIDIOC_S_CTRL/VIDIOC_S_EXT_CTRLS ioctls. This is to prevent a feedback
> loop.
> 
> This can now be overridden by setting the new V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK
> flag.
> 
> Based on suggestions from Mauro Carvalho Chehab <mchehab@xxxxxxxxxx> and
> Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>.
> 
> Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx>
> ---
>  .../DocBook/media/v4l/vidioc-subscribe-event.xml   |   36 ++++++++++++++++----
>  drivers/media/video/v4l2-ctrls.c                   |    3 +-
>  include/linux/videodev2.h                          |    3 +-
>  3 files changed, 33 insertions(+), 9 deletions(-)
> 
> diff --git a/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml b/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml
> index 039a969..25471e8 100644
> --- a/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml
> +++ b/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml
> @@ -114,25 +114,28 @@
>  	  <row>
>  	    <entry><constant>V4L2_EVENT_CTRL</constant></entry>
>  	    <entry>3</entry>
> -	    <entry>This event requires that the <structfield>id</structfield>
> +	    <entry><para>This event requires that the <structfield>id</structfield>
>  		matches the control ID from which you want to receive events.
>  		This event is triggered if the control's value changes, if a
>  		button control is pressed or if the control's flags change.
>  	    	This event has a &v4l2-event-ctrl; associated with it. This struct
>  		contains much of the same information as &v4l2-queryctrl; and
> -		&v4l2-control;.
> +		&v4l2-control;.</para>
>  
> -		If the event is generated due to a call to &VIDIOC-S-CTRL; or
> -		&VIDIOC-S-EXT-CTRLS;, then the event will not be sent to
> +		<para>If the event is generated due to a call to &VIDIOC-S-CTRL; or
> +		&VIDIOC-S-EXT-CTRLS;, then the event will <emphasis>not</emphasis> be sent to
>  		the file handle that called the ioctl function. This prevents
> -		nasty feedback loops.
> +		nasty feedback loops. If you <emphasis>do</emphasis> want to get the
> +		event, then set the <constant>V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK</constant>
> +		flag.
> +		</para>
>  
> -		This event type will ensure that no information is lost when
> +		<para>This event type will ensure that no information is lost when
>  		more events are raised than there is room internally. In that
>  		case the &v4l2-event-ctrl; of the second-oldest event is kept,
>  		but the <structfield>changes</structfield> field of the
>  		second-oldest event is ORed with the <structfield>changes</structfield>
> -		field of the oldest event.
> +		field of the oldest event.</para>
>  	    </entry>
>  	  </row>
>  	  <row>
> @@ -157,6 +160,25 @@
>  		that are triggered by a status change such as <constant>V4L2_EVENT_CTRL</constant>.
>  		Other events will ignore this flag.</entry>
>  	  </row>
> +	  <row>
> +	    <entry><constant>V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK</constant></entry>
> +	    <entry>0x0002</entry>
> +	    <entry><para>If set, then events directly caused by an ioctl will also be sent to
> +		the filehandle that called that ioctl. For example, changing a control using
> +		&VIDIOC-S-CTRL; will cause a V4L2_EVENT_CTRL to be sent back to that same
> +		filehandle. Normally such events are suppressed to prevent feedback loops
> +		where an application changes a control to a one value and then another, and
> +		then receives an event telling it that that control has changed to the first
> +		value.</para>
> +
> +		<para>Since it can't tell whether that event was caused by another application
> +		or by the &VIDIOC-S-CTRL; call it is hard to decide whether to set the
> +		control to the value in the event, or ignore it.</para>
> +
> +		<para>Think carefully when you set this flag so you won't get into situations
> +		like that.</para>
> +	    </entry>
> +	  </row>
>  	</tbody>
>        </tgroup>
>      </table>
> diff --git a/drivers/media/video/v4l2-ctrls.c b/drivers/media/video/v4l2-ctrls.c
> index bc08f86..bd2456d 100644
> --- a/drivers/media/video/v4l2-ctrls.c
> +++ b/drivers/media/video/v4l2-ctrls.c
> @@ -590,7 +590,8 @@ static void send_event(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl, u32 changes)
>  	fill_event(&ev, ctrl, changes);
>  
>  	list_for_each_entry(sev, &ctrl->ev_subs, node)
> -		if (sev->fh && sev->fh != fh)
> +		if (sev->fh && (sev->fh != fh ||
> +				(sev->flags & V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK)))
>  			v4l2_event_queue_fh(sev->fh, &ev);
>  }
>  
> diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
> index baafe2f..2c4e837 100644
> --- a/include/linux/videodev2.h
> +++ b/include/linux/videodev2.h
> @@ -1832,7 +1832,8 @@ struct v4l2_event {
>  	__u32				reserved[8];
>  };
>  
> -#define V4L2_EVENT_SUB_FL_SEND_INITIAL (1 << 0)
> +#define V4L2_EVENT_SUB_FL_SEND_INITIAL		(1 << 0)
> +#define V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK	(1 << 1)
>  
>  struct v4l2_event_subscription {
>  	__u32				type;
> -- 
> 1.7.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Sakari Ailus
sakari.ailus@xxxxxx
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux