Re: [PATCH v2 1/2] v4l: Add resolution change event.

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

 



Hi Hans,

On Wed, Apr 30, 2014 at 8:03 PM, Hans Verkuil <hverkuil@xxxxxxxxx> wrote:
> On 04/30/2014 12:38 PM, Arun Kumar K wrote:
>> Hi Hans,
>>
>>
>> On 04/22/14 18:22, Hans Verkuil wrote:
>>> On 04/21/2014 11:26 AM, Arun Kumar K wrote:
>>>> From: Pawel Osciak <posciak@xxxxxxxxxxxx>
>>>>
>>>> This event indicates that the decoder has reached a point in the stream,
>>>> at which the resolution changes. The userspace is expected to provide a new
>>>> set of CAPTURE buffers for the new format before decoding can continue.
>>>> The event can also be used for more generic events involving resolution
>>>> or format changes at runtime for all kinds of video devices.
>>>>
>>>> Signed-off-by: Pawel Osciak <posciak@xxxxxxxxxxxx>
>>>> Signed-off-by: Arun Kumar K <arun.kk@xxxxxxxxxxx>
>>>> ---
>>>>  .../DocBook/media/v4l/vidioc-subscribe-event.xml   |   16 ++++++++++++++++
>>>>  include/uapi/linux/videodev2.h                     |    6 ++++++
>>>>  2 files changed, 22 insertions(+)
>>>>
>>>> diff --git a/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml b/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml
>>>> index 5c70b61..0aec831 100644
>>>> --- a/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml
>>>> +++ b/Documentation/DocBook/media/v4l/vidioc-subscribe-event.xml
>>>> @@ -155,6 +155,22 @@
>>>>         </entry>
>>>>       </row>
>>>>       <row>
>>>> +       <entry><constant>V4L2_EVENT_SOURCE_CHANGE</constant></entry>
>>>> +       <entry>5</entry>
>>>> +       <entry>
>>>> +         <para>This event is triggered when a resolution or format 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 HDMI connector. Application may
>>>> +          need to reinitialize buffers before proceeding further.</para>
>>>> +
>>>> +              <para>This event has a &v4l2-event-source-change; associated
>>>> +         with it. This has significance only for v4l2 subdevs where the
>>>> +         <structfield>pad_num</structfield> field will be updated with
>>>> +         the pad number on which the event is triggered.</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/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
>>>> index 6ae7bbe..12e0614 100644
>>>> --- a/include/uapi/linux/videodev2.h
>>>> +++ b/include/uapi/linux/videodev2.h
>>>> @@ -1733,6 +1733,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 */
>>>> @@ -1764,12 +1765,17 @@ struct v4l2_event_frame_sync {
>>>>     __u32 frame_sequence;
>>>>  };
>>>>
>>>> +struct v4l2_event_source_change {
>>>> +   __u32 pad_num;
>>>> +};
>>>> +
>>>>  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_source_change source_change;
>>>>             __u8                            data[64];
>>>>     } u;
>>>>     __u32                           pending;
>>>>
>>>
>>> This needs to be done differently. The problem is that you really have multiple
>>> events that you want to subscribe to: one for each pad (or input: see the way
>>> VIDIOC_G/S_EDID maps pad to an input or output index when used with a video node,
>>> we have to support that for this event as well).
>>>
>>> What you want to do is similar to what is done for control events: there you can
>>> subscribe for a specific control and get notified when that control changes.
>>>
>>> The way that works in the event code is that the 'id' field in the v4l2_event
>>> struct contains that control ID, or, in this case, the pad/input/output index.
>>>
>>
>> As I am new to v4l2-events itself, I might have some noob questions.
>> I understood filling pad index into id field. But for video nodes,
>> the application is supposed to put v4l2_buf_type in the id field?
>
> No, a capture video node can have multiple inputs (those are enumerated with
> VIDIOC_ENUMINPUTS), and each input can generate a SOURCE_CHANGE event, even if it
> is not the currently active input. Hence the need of setting id to the input
> index. v4l2_buf_type makes no sense here.
>

Ok. But in a simple m2m device like mfc, the userspace has to subscribe to
the event say on the CAPTURE plane where buffers has to be re-allocated on
resolution change. So in such a case, what should be put in id field?

>>
>>> In the application you will subscribe to the SOURCE_CHANGE event for a specific
>>> pad/input/output index.
>>>
>>> In other words, the pad_num field should be dropped and the id field used
>>> instead.
>>>
>>> Assuming we will also add a 'changes' field (see my reply to the other post
>>> on that topic), then you should also provide replace and merge ops (see
>>> v4l2-ctrls.c). That way it is sufficient to use just one element when calling
>>> v4l2_event_subscribe(): you will never loose information since if multiple
>>> events arrive before the application can dequeue them, the 'changes' information
>>> will be the ORed value of all those intermediate events.
>>>
>>
>> If I understand correctly, the implementation should go somewhat in the
>> following lines:
>>
>> +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;
>> +}
>> +
>> +void v4l2_event_src_merge(const struct v4l2_event *old, struct
>> v4l2_event *new)
>> +{
>> +       new->u.src_change.changes |= old->u.src_change.changes;
>> +}
>> +
>> +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;
>> +}
>>
>> And v4l2-event.c is the right place to put it?
>
> Correct. Note that the replace and merge functions and v4l2_event_src_ch_ops can
> all be static, only v4l2_src_change_event_subscribe should be exported.
>

Ok will do that.

>>
>>
>> And in the videodev2.h file:
>>
>> +#define V4L2_EVENT_SRC_CH_RESOLUTION           (1 << 0)
>> +#define V4L2_EVENT_SRC_CH_FORMAT               (1 << 1)
>> +
>> +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;
>>
>> Please correct me if my understanding is totally wrong here?
>
> No, this is correct.
>
> I do think that CH_FORMAT is too vague. 'format' is such a general concept and
> I would prefer something that is more specific as to what has changed. Do you
> actually need that at the moment?
>

No I dont need it. I will keep only the CH_RESOLUTION for now.

Regards
Arun
--
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