[vlc-devel] [PATCH v3 00/18] Get rid of the control command API
Steve Lhomme
robux4 at ycbcr.xyz
Fri Aug 21 09:34:10 CEST 2020
What we're talking about here is opening a can of worms. This is a whole
new behavior the code wasn't designed for. The whole mouse filtering
could do with some love, but this is not the scope of this patchset.
Example of worm we're talking about: the software deinterlace filters
mouse for when the picture is half height. None of the hardware filters
do that.
There is no consistency between filters. (BTW rotate doesn't handle
mouse events, and transform does)
I think, when it comes to UI, the responsiveness should matter the most.
That means do as little "heavy" processing in the UI thread. Locking
"sys->filter.loc"k in the UI thread would be quite heavy. That lock is
used to process the pixels. It can take quite a while.
In the end the mouse events are transformed according to the filter
dimension changes. But it's not to reflect something in the UI. It's to
reflect something in the video rendering. Either modifying the rendering
based on the mouse position or by sending "mouse-xxx" events. In the
former case, there is no use having that in the UI thread. In the latter
case, there are things like gestures/hotkeys which might benefit from
being in the UI thread. There is also the callback set by some
access/demuxer modules via ES_OUT_VOUT_SET_MOUSE_EVENT. It sounds like
it could benefit from being in the UI thread. In practice when the user
clicks it doesn't necessarily match the position the module think it's
at, because of the buffering in between. Doing it one frame later is
probably not a big deal.
So the real benefit would be for gestures/hotkeys.
The gestures only check for a movement in (all) directions, based on a
threshold. But if a deinterlace shows the video at double/half size,
that means the user actually has to moved twice more/less to reach that
threshold, when in fact the threshold is based on the visible area, not
the original picture location. So this is in fact wrong to handle
filtered mouse values here. (it would be worse in puzzle if you happen
to cross a square and the next virtual position is totally different
from where the mouse is actually on the screen)
The hotkeys module has 2 things. Some "intf-xxx" toggles, which can
popup a menu over the video. This should definitely not be filtered
according to the coordinates in the unfiltered picture but should match
the screen coordinates. It also calls vlc_player_UpdateViewpoint() with
the new mouse (filtered) coordinates, to change the viewpoint. Here I
don't think it makes sense to translate to filtered coordinates. For
example it the video is zoomed 2x a mouse movement of 10 pixels should
result in a movement of 10 pixels in the rendered video, not 5 pixels in
the source video. In the end the viewpoint value is only applied to
video and audio outputs, not the source material.
So it seems the "mouse-xxx" calls should not be filtered. They should be
called before the filtering is applied. That means they could be called
when the mouse event in received, in the UI thread. That would make the
gesture/hotkey more responsive. (the double click fullscreen toggle
should fall in that category too)
The filtered coordinates end up being used only for the few modules that
actually need to know exactly where in the source video the user
clicked/moved (using ES_OUT_VOUT_SET_MOUSE_EVENT). As explained above, I
think it should remain in the rendering thread for now.
> On 20 Aug 2020, at 21:46, Rémi Denis-Courmont <remi at remlab.net> wrote:
>
> Le jeudi 20 août 2020, 21:29:48 EEST Steve Lhomme a écrit :
>>> On 2020-08-20 18:11, Rémi Denis-Courmont wrote:
>>> Hi,
>>>
>>> Badly designed or implemented plugins are what they are. Just as big
>>> loops in the UI thread are bad for interactivity, big loops in the
>>> render thread are bad for timeliness. And besides those egregiously
>>> broken plugins you have, e.g., rotate and transform who actually
>>> translate the mouse event, and should obviously run synchronously - not
>>> at the next render.
>>
>> Synchronously ? I have seen nothing in the UI thread, the one that will
>> display the rendered result, that says a frame is allowed to be
>> displayed ASAP. It will wait until the next loop, in that thread.
>> Putting that in the UI thread is just pretending the rendering will be
>> more responsive.
>
> Pretending? How do you need the rendering to translate mouse coordinates
> through the transform filter? and eventually to pass mouse events to the input?
>
> Even plotting the cursor does not need the VLC rendering. Only thing that does
> is updating the Puzzle and such, not exactly everyday use cases.
>
> --
> Rémi Denis-Courmont
>
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list