Hi Arun, On 14/05/14 08:59, Arun Kumar K wrote: > This event indicates that the video device has encountered > a source parameter change during runtime. This can typically be a > resolution change detected by a video decoder OR a format change > detected by an input connector. > > This needs to be nofified to the userspace and the application may > be expected to reallocate buffers before proceeding. The application > can subscribe to events on a specific pad or input port which > it is interested in. > > Signed-off-by: Arun Kumar K <arun.kk@xxxxxxxxxxx> This looks like a nice API enhancement. Acked-by: Sylwester Nawrocki <s.nawrocki@xxxxxxxxxxx> > --- > Documentation/DocBook/media/v4l/vidioc-dqevent.xml | 33 ++++++++++++++++++ > .../DocBook/media/v4l/vidioc-subscribe-event.xml | 20 +++++++++++ > drivers/media/v4l2-core/v4l2-event.c | 36 ++++++++++++++++++++ > include/media/v4l2-event.h | 4 +++ > include/uapi/linux/videodev2.h | 8 +++++ > 5 files changed, 101 insertions(+) > > diff --git a/Documentation/DocBook/media/v4l/vidioc-dqevent.xml b/Documentation/DocBook/media/v4l/vidioc-dqevent.xml > index 89891ad..820f86e 100644 > --- a/Documentation/DocBook/media/v4l/vidioc-dqevent.xml > +++ b/Documentation/DocBook/media/v4l/vidioc-dqevent.xml > @@ -242,6 +242,22 @@ > </tgroup> > </table> > > + <table frame="none" pgwide="1" id="v4l2-event-src-change"> > + <title>struct <structname>v4l2_event_src_change</structname></title> > + <tgroup cols="3"> > + &cs-str; > + <tbody valign="top"> > + <row> > + <entry>__u32</entry> > + <entry><structfield>changes</structfield></entry> > + <entry> > + A bitmask that tells what has changed. See <xref linkend="src-changes-flags" />. > + </entry> > + </row> > + </tbody> > + </tgroup> > + </table> > + > <table pgwide="1" frame="none" id="changes-flags"> > <title>Changes</title> > <tgroup cols="3"> > @@ -270,6 +286,23 @@ > </tbody> > </tgroup> > </table> > + > + <table pgwide="1" frame="none" id="src-changes-flags"> > + <title>Source Changes</title> > + <tgroup cols="3"> > + &cs-def; > + <tbody valign="top"> > + <row> > + <entry><constant>V4L2_EVENT_SRC_CH_RESOLUTION</constant></entry> > + <entry>0x0001</entry> > + <entry>This event gets triggered when a resolution change is > + detected at an input. This can come from an input connector or > + from a video decoder. > + </entry> > + </row> > + </tbody> > + </tgroup> > + </table> > </refsect1> > <refsect1> > &return-value; > diff --git a/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml b/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml > index 5c70b61..f016254 100644 > --- a/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml > +++ b/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml > @@ -155,6 +155,26 @@ > </entry> > </row> > <row> > + <entry><constant>V4L2_EVENT_SOURCE_CHANGE</constant></entry> > + <entry>5</entry> > + <entry> > + <para>This event is triggered when a source parameter change is > + detected during runtime by the video device. It can be a > + runtime resolution change triggered by a video decoder or the > + format change happening on an input connector. > + This event requires that the <structfield>id</structfield> > + matches the input index (when used with a video device node) > + or the pad index (when used with a subdevice node) from which > + you want to receive events.</para> > + > + <para>This event has a &v4l2-event-source-change; associated > + with it. The <structfield>changes</structfield> bitfield denotes > + what has changed for the subscribed pad. If multiple events > + occurred before application could dequeue them, then the changes > + will have the ORed value of all the events generated.</para> > + </entry> > + </row> > + <row> > <entry><constant>V4L2_EVENT_PRIVATE_START</constant></entry> > <entry>0x08000000</entry> > <entry>Base event number for driver-private events.</entry> > diff --git a/drivers/media/v4l2-core/v4l2-event.c b/drivers/media/v4l2-core/v4l2-event.c > index 86dcb54..8761aab 100644 > --- a/drivers/media/v4l2-core/v4l2-event.c > +++ b/drivers/media/v4l2-core/v4l2-event.c > @@ -318,3 +318,39 @@ int v4l2_event_subdev_unsubscribe(struct v4l2_subdev *sd, struct v4l2_fh *fh, > return v4l2_event_unsubscribe(fh, sub); > } > EXPORT_SYMBOL_GPL(v4l2_event_subdev_unsubscribe); > + > +static void v4l2_event_src_replace(struct v4l2_event *old, > + const struct v4l2_event *new) > +{ > + u32 old_changes = old->u.src_change.changes; > + > + old->u.src_change = new->u.src_change; > + old->u.src_change.changes |= old_changes; > +} > + > +static void v4l2_event_src_merge(const struct v4l2_event *old, > + struct v4l2_event *new) > +{ > + new->u.src_change.changes |= old->u.src_change.changes; > +} > + > +static const struct v4l2_subscribed_event_ops v4l2_event_src_ch_ops = { > + .replace = v4l2_event_src_replace, > + .merge = v4l2_event_src_merge, > +}; > + > +int v4l2_src_change_event_subscribe(struct v4l2_fh *fh, > + const struct v4l2_event_subscription *sub) > +{ > + if (sub->type == V4L2_EVENT_SOURCE_CHANGE) > + return v4l2_event_subscribe(fh, sub, 0, &v4l2_event_src_ch_ops); > + return -EINVAL; > +} > +EXPORT_SYMBOL_GPL(v4l2_src_change_event_subscribe); > + > +int v4l2_src_change_event_subdev_subscribe(struct v4l2_subdev *sd, > + struct v4l2_fh *fh, struct v4l2_event_subscription *sub) > +{ > + return v4l2_src_change_event_subscribe(fh, sub); > +} > +EXPORT_SYMBOL_GPL(v4l2_src_change_event_subdev_subscribe); > diff --git a/include/media/v4l2-event.h b/include/media/v4l2-event.h > index be05d01..1ab9045 100644 > --- a/include/media/v4l2-event.h > +++ b/include/media/v4l2-event.h > @@ -132,4 +132,8 @@ int v4l2_event_unsubscribe(struct v4l2_fh *fh, > void v4l2_event_unsubscribe_all(struct v4l2_fh *fh); > int v4l2_event_subdev_unsubscribe(struct v4l2_subdev *sd, struct v4l2_fh *fh, > struct v4l2_event_subscription *sub); > +int v4l2_src_change_event_subscribe(struct v4l2_fh *fh, > + const struct v4l2_event_subscription *sub); > +int v4l2_src_change_event_subdev_subscribe(struct v4l2_subdev *sd, > + struct v4l2_fh *fh, struct v4l2_event_subscription *sub); > #endif /* V4L2_EVENT_H */ > diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h > index ea468ee..b923d91 100644 > --- a/include/uapi/linux/videodev2.h > +++ b/include/uapi/linux/videodev2.h > @@ -1765,6 +1765,7 @@ struct v4l2_streamparm { > #define V4L2_EVENT_EOS 2 > #define V4L2_EVENT_CTRL 3 > #define V4L2_EVENT_FRAME_SYNC 4 > +#define V4L2_EVENT_SOURCE_CHANGE 5 > #define V4L2_EVENT_PRIVATE_START 0x08000000 > > /* Payload for V4L2_EVENT_VSYNC */ > @@ -1796,12 +1797,19 @@ struct v4l2_event_frame_sync { > __u32 frame_sequence; > }; > > +#define V4L2_EVENT_SRC_CH_RESOLUTION (1 << 0) > + > +struct v4l2_event_src_change { > + __u32 changes; > +}; > + > struct v4l2_event { > __u32 type; > union { > struct v4l2_event_vsync vsync; > struct v4l2_event_ctrl ctrl; > struct v4l2_event_frame_sync frame_sync; > + struct v4l2_event_src_change src_change; > __u8 data[64]; > } u; > __u32 pending; > -- Sylwester Nawrocki Samsung R&D Institute Poland -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html