[vlc-devel] [V3 PATCH 1/3] vout: set a mouse event cb when creating a vout
Thomas Guillem
thomas at gllm.fr
Tue Jul 17 16:51:35 CEST 2018
On Tue, Jul 17, 2018, at 16:49, Thomas Guillem wrote:
>
> On Tue, Jul 17, 2018, at 16:22, Rémi Denis-Courmont wrote:
> > Le lundi 16 juillet 2018, 16:57:21 EEST Thomas Guillem a écrit :
> > > ---
> > > include/vlc_mouse.h | 3 +++
> > > src/input/decoder.c | 6 +++---
> > > src/input/resource.c | 15 +++++++++++----
> > > src/input/resource.h | 5 ++++-
> > > src/video_output/display.c | 2 ++
> > > src/video_output/video_output.c | 23 ++++++++++++++++-------
> > > src/video_output/vout_internal.h | 4 ++++
> > > 7 files changed, 43 insertions(+), 15 deletions(-)
> >
> > Almost LGTM.
> >
> > >
> > > diff --git a/include/vlc_mouse.h b/include/vlc_mouse.h
> > > index 481c3598e9..f7edbe1446 100644
> > > --- a/include/vlc_mouse.h
> > > +++ b/include/vlc_mouse.h
> > > @@ -53,6 +53,9 @@ typedef struct vlc_mouse_t
> > > bool b_double_click;
> > > } vlc_mouse_t;
> > >
> > > +typedef void (*vlc_mouse_event)(const vlc_mouse_t *oldmouse,
> > > + const vlc_mouse_t *newmouse, void
> >
> > As argued in the other thread, I would remove the "old" parameter here.
>
> Done in a local branch.
>
> >
> > > *user_data); +
> > > static inline void vlc_mouse_Init( vlc_mouse_t *p_mouse )
> > > {
> > > p_mouse->i_x = 0;
> > > diff --git a/src/input/decoder.c b/src/input/decoder.c
> > > index 1cba292d14..6af9ca8479 100644
> > > --- a/src/input/decoder.c
> > > +++ b/src/input/decoder.c
> > > @@ -291,7 +291,7 @@ static vout_thread_t *aout_request_vout( void
> > > *p_private, input_thread_t *p_input = p_owner->p_input;
> > >
> > > p_vout = input_resource_RequestVout( p_owner->p_resource, p_vout,
> > > p_fmt, 1, - b_recyle );
> > > + NULL, NULL, b_recyle );
> > > if( p_input != NULL )
> > > input_SendEventVout( p_input );
> > >
> > > @@ -521,7 +521,7 @@ static int vout_update_format( decoder_t *p_dec )
> > > p_vout, &fmt,
> > > dpb_size +
> > > p_dec->i_extra_picture_buffers
> > > + 1, - true );
> > > + NULL, NULL, true );
> > > vlc_mutex_lock( &p_owner->lock );
> > > p_owner->p_vout = p_vout;
> > >
> > > @@ -1869,7 +1869,7 @@ static void DeleteDecoder( decoder_t * p_dec )
> > > vout_Cancel( p_owner->p_vout, false );
> > >
> > > input_resource_RequestVout( p_owner->p_resource,
> > > p_owner->p_vout, NULL, - 0, true
> > > );
> > > + 0, NULL, NULL, true );
> > > if( p_owner->p_input != NULL )
> > > input_SendEventVout( p_owner->p_input );
> > > }
> > > diff --git a/src/input/resource.c b/src/input/resource.c
> > > index b1a8675dc3..daaafc8591 100644
> > > --- a/src/input/resource.c
> > > +++ b/src/input/resource.c
> > > @@ -196,7 +196,8 @@ static void DisplayVoutTitle( input_resource_t
> > > *p_resource, static vout_thread_t *RequestVout( input_resource_t
> > > *p_resource,
> > > vout_thread_t *p_vout,
> > > const video_format_t *p_fmt, unsigned
> > > dpb_size, - bool b_recycle )
> > > + vlc_mouse_event mouse_event,
> > > + void *mouse_data, bool b_recycle )
> > > {
> > > vlc_assert_locked( &p_resource->lock );
> > >
> > > @@ -237,6 +238,8 @@ static vout_thread_t *RequestVout( input_resource_t
> > > *p_resource, .change_fmt = true,
> > > .fmt = p_fmt,
> > > .dpb_size = dpb_size,
> > > + .mouse_event= mouse_event,
> > > + .mouse_data = mouse_data,
> > > };
> > > p_vout = vout_Request( p_resource->p_parent, &cfg );
> > > if( !p_vout )
> > > @@ -282,6 +285,8 @@ static vout_thread_t *RequestVout( input_resource_t
> > > *p_resource, .change_fmt = false,
> > > .fmt = NULL,
> > > .dpb_size = 0,
> > > + .mouse_event= NULL,
> > > + .mouse_data = NULL,
> > > };
> > > p_resource->p_vout_free = vout_Request( p_resource->p_parent,
> > > &cfg ); }
> > > @@ -466,10 +471,12 @@ void input_resource_SetInput( input_resource_t
> > > *p_resource, input_thread_t *p_in vout_thread_t
> > > *input_resource_RequestVout( input_resource_t *p_resource, vout_thread_t
> > > *p_vout, const video_format_t *p_fmt, unsigned dpb_size, -
> > > bool b_recycle )
> > > + vlc_mouse_event mouse_event,
> > > + void *mouse_data, bool
> > > b_recycle ) {
> > > vlc_mutex_lock( &p_resource->lock );
> > > - vout_thread_t *p_ret = RequestVout( p_resource, p_vout, p_fmt,
> > > dpb_size, b_recycle ); + vout_thread_t *p_ret = RequestVout( p_resource,
> > > p_vout, p_fmt, dpb_size, +
> > > mouse_event, mouse_data, b_recycle ); vlc_mutex_unlock( &p_resource->lock
> > > );
> > >
> > > return p_ret;
> > > @@ -487,7 +494,7 @@ void input_resource_HoldVouts( input_resource_t
> > > *p_resource, vout_thread_t ***pp
> > >
> > > void input_resource_TerminateVout( input_resource_t *p_resource )
> > > {
> > > - input_resource_RequestVout( p_resource, NULL, NULL, 0, false );
> > > + input_resource_RequestVout( p_resource, NULL, NULL, 0, NULL, NULL,
> > > false ); }
> > > bool input_resource_HasVout( input_resource_t *p_resource )
> > > {
> > > diff --git a/src/input/resource.h b/src/input/resource.h
> > > index 8f83eb3183..8011a59edb 100644
> > > --- a/src/input/resource.h
> > > +++ b/src/input/resource.h
> > > @@ -25,6 +25,7 @@
> > > #define LIBVLC_INPUT_RESOURCE_H 1
> > >
> > > #include <vlc_common.h>
> > > +#include <vlc_mouse.h>
> > >
> > > /**
> > > * This function set the associated input.
> > > @@ -40,7 +41,9 @@ sout_instance_t *input_resource_RequestSout(
> > > input_resource_t *, sout_instance_t * This function handles vout request.
> > > */
> > > vout_thread_t *input_resource_RequestVout( input_resource_t *,
> > > vout_thread_t *, - const
> > > video_format_t *, unsigned dpb_size, bool b_recycle ); +
> > > const video_format_t *, unsigned dpb_size, +
> > > vlc_mouse_event mouse_event, +
> > > void *mouse_event_data, bool b_recycle );
> > >
> > > /**
> > > * This function returns one of the current vout if any.
> > > diff --git a/src/video_output/display.c b/src/video_output/display.c
> > > index 7f0b16c937..091593195f 100644
> > > --- a/src/video_output/display.c
> > > +++ b/src/video_output/display.c
> > > @@ -1331,5 +1331,7 @@ void vout_SendDisplayEventMouse(vout_thread_t *vout,
> > > const vlc_mouse_t *m)
> > >
> > > if (m->b_double_click)
> > > var_ToggleBool(vout, "fullscreen");
> > > + if (vout->p->mouse_event)
> > > + vout->p->mouse_event(&vout->p->mouse, m, vout->p->mouse_data);
> > > vout->p->mouse = *m;
> > > }
> > > diff --git a/src/video_output/video_output.c
> > > b/src/video_output/video_output.c index 5db7acf509..e9b5de944f 100644
> > > --- a/src/video_output/video_output.c
> > > +++ b/src/video_output/video_output.c
> > > @@ -134,6 +134,8 @@ static vout_thread_t *VoutCreate(vlc_object_t *object,
> > >
> > > vout->p->original = original;
> > > vout->p->dpb_size = cfg->dpb_size;
> > > + vout->p->mouse_event = cfg->mouse_event;
> > > + vout->p->mouse_data = cfg->mouse_data;
> > >
> > > vout_control_Init(&vout->p->control);
> > > vout_control_PushVoid(&vout->p->control, VOUT_CONTROL_INIT);
> > > @@ -242,15 +244,14 @@ vout_thread_t *vout_Request(vlc_object_t *object,
> > > spu_Attach(vout->p->spu, vout->p->input, true);
> > > }
> > >
> > > - if (cfg->change_fmt) {
> > > - vout_control_cmd_t cmd;
> > > - vout_control_cmd_Init(&cmd, VOUT_CONTROL_REINIT);
> > > - cmd.cfg = cfg;
> > > + vout_control_cmd_t cmd;
> > > + vout_control_cmd_Init(&cmd, VOUT_CONTROL_REINIT);
> > > + cmd.cfg = cfg;
> > > + vout_control_Push(&vout->p->control, &cmd);
> > > + vout_control_WaitEmpty(&vout->p->control);
> > >
> > > - vout_control_Push(&vout->p->control, &cmd);
> > > - vout_control_WaitEmpty(&vout->p->control);
> > > + if (cfg->change_fmt)
> > > vout_IntfReinit(vout);
> > > - }
> > >
> > > if (!vout->p->dead) {
> > > msg_Dbg(object, "reusing provided vout");
> > > @@ -1594,6 +1595,12 @@ static int ThreadReinit(vout_thread_t *vout,
> > > {
> > > video_format_t original;
> > >
> > > + vout->p->mouse_event = NULL;
> > > + vout->p->mouse_data = NULL;
> > > +
> > > + if (!cfg->change_fmt)
> > > + return VLC_SUCCESS;
> > > +
> > > vout->p->pause.is_on = false;
> > > vout->p->pause.date = VLC_TICK_INVALID;
> > >
> > > @@ -1646,6 +1653,8 @@ static int ThreadReinit(vout_thread_t *vout,
> > >
> > > vout->p->original = original;
> > > vout->p->dpb_size = cfg->dpb_size;
> > > + vout->p->mouse_event = cfg->mouse_event;
> > > + vout->p->mouse_data = cfg->mouse_data;
> > > if (ThreadStart(vout, &state)) {
> > > ThreadClean(vout);
> > > return VLC_EGENERIC;
> > > diff --git a/src/video_output/vout_internal.h
> > > b/src/video_output/vout_internal.h index b6940ba070..ce02c850ed 100644
> > > --- a/src/video_output/vout_internal.h
> > > +++ b/src/video_output/vout_internal.h
> > > @@ -50,6 +50,8 @@ typedef struct {
> > > bool change_fmt;
> > > const video_format_t *fmt;
> > > unsigned dpb_size;
> > > + vlc_mouse_event mouse_event;
> > > + void *mouse_data;
> >
> > I'd keep the callback data pointer generic/common, e.g. 'opaque'. If other
> > callbacks are added, they should probably share the callback data - and use a
> > const callbacks structure.
>
> Ok for the name.
>
> >
> > Keyboard events callback make the logical next step in the future.
>
> Do demuxers need such events ?
Maybe, maybe not, but control/interface modules will need it. We should go through the input_controller->input->es_out->decoder->vout to get events, right ? (and stop using "mouse-*" variable for example).
>
> >
> > > } vout_configuration_t;
> > > #include "control.h"
> > >
> > > @@ -138,6 +140,8 @@ struct vout_thread_sys_t
> > >
> > > /* */
> > > vlc_mouse_t mouse;
> > > + vlc_mouse_event mouse_event;
> > > + void *mouse_data;
> > >
> > > /* */
> > > picture_pool_t *private_pool;
> >
> >
> > --
> > Rémi Denis-Courmont
> >
> >
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
> _______________________________________________
> 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