[vlc-commits] demux: mkv: move event functionality to separate files

Filip Roséen git at videolan.org
Fri Jul 20 09:37:33 CEST 2018


vlc | branch: master | Filip Roséen <filip at atch.se> | Wed Jul 18 03:02:37 2018 +0200| [b9392d36361fad27bdf34bd55829bd364c510792] | committer: Thomas Guillem

demux: mkv: move event functionality to separate files

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b9392d36361fad27bdf34bd55829bd364c510792
---

 modules/demux/Makefile.am    |   1 +
 modules/demux/mkv/demux.cpp  | 400 ---------------------------------------
 modules/demux/mkv/demux.hpp  |  34 +---
 modules/demux/mkv/events.cpp | 434 +++++++++++++++++++++++++++++++++++++++++++
 modules/demux/mkv/events.hpp |  70 +++++++
 5 files changed, 506 insertions(+), 433 deletions(-)

diff --git a/modules/demux/Makefile.am b/modules/demux/Makefile.am
index 581c56c0eb..102c059f4e 100644
--- a/modules/demux/Makefile.am
+++ b/modules/demux/Makefile.am
@@ -178,6 +178,7 @@ libmkv_plugin_la_SOURCES = \
 	demux/mkv/matroska_segment_parse.cpp \
 	demux/mkv/matroska_segment_seeker.hpp demux/mkv/matroska_segment_seeker.cpp \
 	demux/mkv/demux.hpp demux/mkv/demux.cpp \
+	demux/mkv/events.hpp demux/mkv/events.cpp \
 	demux/mkv/dispatcher.hpp \
 	demux/mkv/string_dispatcher.hpp \
 	demux/mkv/Ebml_parser.hpp demux/mkv/Ebml_parser.cpp \
diff --git a/modules/demux/mkv/demux.cpp b/modules/demux/mkv/demux.cpp
index 4e39af0078..ab7a4c044f 100644
--- a/modules/demux/mkv/demux.cpp
+++ b/modules/demux/mkv/demux.cpp
@@ -31,406 +31,6 @@
 
 namespace mkv {
 
-event_thread_t::event_thread_t(demux_t *p_demux) : p_demux(p_demux)
-{
-    vlc_mutex_init( &lock );
-    vlc_cond_init( &wait );
-    is_running = false;
-    memset(&pci_packet, 0, sizeof(pci_packet));
-}
-event_thread_t::~event_thread_t()
-{
-    ResetPci();
-    vlc_cond_destroy( &wait );
-    vlc_mutex_destroy( &lock );
-}
-
-void event_thread_t::SetPci(const pci_t *data)
-{
-    vlc_mutex_locker l(&lock);
-
-    pci_packet = *data;
-
-#ifndef WORDS_BIGENDIAN
-    for( uint8_t button = 1; button <= pci_packet.hli.hl_gi.btn_ns; button++) {
-        btni_t *button_ptr = &(pci_packet.hli.btnit[button-1]);
-        binary *p_data = (binary*) button_ptr;
-
-        uint16 i_x_start = ((p_data[0] & 0x3F) << 4 ) + ( p_data[1] >> 4 );
-        uint16 i_x_end   = ((p_data[1] & 0x03) << 8 ) + p_data[2];
-        uint16 i_y_start = ((p_data[3] & 0x3F) << 4 ) + ( p_data[4] >> 4 );
-        uint16 i_y_end   = ((p_data[4] & 0x03) << 8 ) + p_data[5];
-        button_ptr->x_start = i_x_start;
-        button_ptr->x_end   = i_x_end;
-        button_ptr->y_start = i_y_start;
-        button_ptr->y_end   = i_y_end;
-
-    }
-    for ( uint8_t i = 0; i<3; i++ )
-        for ( uint8_t j = 0; j<2; j++ )
-            pci_packet.hli.btn_colit.btn_coli[i][j] = U32_AT( &pci_packet.hli.btn_colit.btn_coli[i][j] );
-#endif
-    if( !is_running )
-    {
-        b_abort = false;
-        is_running = !vlc_clone( &thread, EventThread, this, VLC_THREAD_PRIORITY_LOW );
-    }
-}
-void event_thread_t::ResetPci()
-{
-    if( !is_running )
-        return;
-
-    vlc_mutex_lock( &lock );
-    b_abort = true;
-    vlc_cond_signal( &wait );
-    vlc_mutex_unlock( &lock );
-
-    vlc_join( thread, NULL );
-    is_running = false;
-}
-int event_thread_t::EventMouse( vlc_object_t *p_this, char const *psz_var,
-                                vlc_value_t, vlc_value_t, void *p_data )
-{
-    event_thread_t *p_ev = (event_thread_t *) p_data;
-    vlc_mutex_lock( &p_ev->lock );
-    if( psz_var[6] == 'c' )
-    {
-        p_ev->b_clicked = true;
-        msg_Dbg( p_this, "Event Mouse: clicked");
-    }
-    else if( psz_var[6] == 'm' )
-        p_ev->b_moved = true;
-    vlc_cond_signal( &p_ev->wait );
-    vlc_mutex_unlock( &p_ev->lock );
-
-    return VLC_SUCCESS;
-}
-
-int event_thread_t::EventKey( vlc_object_t *p_this, char const *,
-                              vlc_value_t, vlc_value_t newval, void *p_data )
-{
-    event_thread_t *p_ev = (event_thread_t *) p_data;
-    vlc_mutex_lock( &p_ev->lock );
-    p_ev->i_key_action = newval.i_int;
-    vlc_cond_signal( &p_ev->wait );
-    vlc_mutex_unlock( &p_ev->lock );
-    msg_Dbg( p_this, "Event Key");
-
-    return VLC_SUCCESS;
-}
-
-int event_thread_t::EventInput( vlc_object_t *p_this, char const *,
-                                vlc_value_t, vlc_value_t newval, void *p_data )
-{
-    VLC_UNUSED( p_this );
-    event_thread_t *p_ev = (event_thread_t *) p_data;
-    vlc_mutex_lock( &p_ev->lock );
-    if( newval.i_int == INPUT_EVENT_VOUT )
-    {
-        p_ev->b_vout |= true;
-        vlc_cond_signal( &p_ev->wait );
-    }
-    vlc_mutex_unlock( &p_ev->lock );
-
-    return VLC_SUCCESS;
-}
-
-void event_thread_t::EventThread()
-{
-    demux_sys_t *p_sys = (demux_sys_t *)p_demux->p_sys;
-    vlc_object_t   *p_vout = NULL;
-    int canc = vlc_savecancel ();
-
-    b_moved      = false;
-    b_clicked    = false;
-    i_key_action = 0;
-    b_vout       = true;
-
-    /* catch all key event */
-    var_AddCallback( p_demux->obj.libvlc, "key-action", EventKey, this );
-    /* catch input event */
-    var_AddCallback( p_demux->p_input, "intf-event", EventInput, this );
-
-    /* main loop */
-    for( ;; )
-    {
-        vlc_mutex_lock( &lock );
-        while( !b_abort && !i_key_action && !b_moved && !b_clicked && !b_vout)
-            vlc_cond_wait( &wait, &lock );
-
-        if( b_abort )
-        {
-            vlc_mutex_unlock( &lock );
-            break;
-        }
-
-        /* KEY part */
-        if( i_key_action )
-        {
-            msg_Dbg( p_demux, "Handle Key Event");
-
-            pci_t *pci = &pci_packet;
-
-            uint16 i_curr_button = p_sys->dvd_interpretor.GetSPRM( 0x88 );
-
-            switch( i_key_action )
-            {
-            case ACTIONID_NAV_LEFT:
-                if ( i_curr_button > 0 && i_curr_button <= pci->hli.hl_gi.btn_ns )
-                {
-                    btni_t *p_button_ptr = &(pci->hli.btnit[i_curr_button-1]);
-                    if ( p_button_ptr->left > 0 && p_button_ptr->left <= pci->hli.hl_gi.btn_ns )
-                    {
-                        i_curr_button = p_button_ptr->left;
-                        p_sys->dvd_interpretor.SetSPRM( 0x88, i_curr_button );
-                        btni_t button_ptr = pci->hli.btnit[i_curr_button-1];
-                        if ( button_ptr.auto_action_mode )
-                        {
-                            vlc_mutex_unlock( &lock );
-                            vlc_mutex_lock( &p_sys->lock_demuxer );
-
-                            // process the button action
-                            p_sys->dvd_interpretor.Interpret( button_ptr.cmd.bytes, 8 );
-
-                            vlc_mutex_unlock( &p_sys->lock_demuxer );
-                            vlc_mutex_lock( &lock );
-                        }
-                    }
-                }
-                break;
-            case ACTIONID_NAV_RIGHT:
-                if ( i_curr_button > 0 && i_curr_button <= pci->hli.hl_gi.btn_ns )
-                {
-                    btni_t *p_button_ptr = &(pci->hli.btnit[i_curr_button-1]);
-                    if ( p_button_ptr->right > 0 && p_button_ptr->right <= pci->hli.hl_gi.btn_ns )
-                    {
-                        i_curr_button = p_button_ptr->right;
-                        p_sys->dvd_interpretor.SetSPRM( 0x88, i_curr_button );
-                        btni_t button_ptr = pci->hli.btnit[i_curr_button-1];
-                        if ( button_ptr.auto_action_mode )
-                        {
-                            vlc_mutex_unlock( &lock );
-                            vlc_mutex_lock( &p_sys->lock_demuxer );
-
-                            // process the button action
-                            p_sys->dvd_interpretor.Interpret( button_ptr.cmd.bytes, 8 );
-
-                            vlc_mutex_unlock( &p_sys->lock_demuxer );
-                            vlc_mutex_lock( &lock );
-                        }
-                    }
-                }
-                break;
-            case ACTIONID_NAV_UP:
-                if ( i_curr_button > 0 && i_curr_button <= pci->hli.hl_gi.btn_ns )
-                {
-                    btni_t *p_button_ptr = &(pci->hli.btnit[i_curr_button-1]);
-                    if ( p_button_ptr->up > 0 && p_button_ptr->up <= pci->hli.hl_gi.btn_ns )
-                    {
-                        i_curr_button = p_button_ptr->up;
-                        p_sys->dvd_interpretor.SetSPRM( 0x88, i_curr_button );
-                        btni_t button_ptr = pci->hli.btnit[i_curr_button-1];
-                        if ( button_ptr.auto_action_mode )
-                        {
-                            vlc_mutex_unlock( &lock );
-                            vlc_mutex_lock( &p_sys->lock_demuxer );
-
-                            // process the button action
-                            p_sys->dvd_interpretor.Interpret( button_ptr.cmd.bytes, 8 );
-
-                            vlc_mutex_unlock( &p_sys->lock_demuxer );
-                            vlc_mutex_lock( &lock );
-                        }
-                    }
-                }
-                break;
-            case ACTIONID_NAV_DOWN:
-                if ( i_curr_button > 0 && i_curr_button <= pci->hli.hl_gi.btn_ns )
-                {
-                    btni_t *p_button_ptr = &(pci->hli.btnit[i_curr_button-1]);
-                    if ( p_button_ptr->down > 0 && p_button_ptr->down <= pci->hli.hl_gi.btn_ns )
-                    {
-                        i_curr_button = p_button_ptr->down;
-                        p_sys->dvd_interpretor.SetSPRM( 0x88, i_curr_button );
-                        btni_t button_ptr = pci->hli.btnit[i_curr_button-1];
-                        if ( button_ptr.auto_action_mode )
-                        {
-                            vlc_mutex_unlock( &lock );
-                            vlc_mutex_lock( &p_sys->lock_demuxer );
-
-                            // process the button action
-                            p_sys->dvd_interpretor.Interpret( button_ptr.cmd.bytes, 8 );
-
-                            vlc_mutex_unlock( &p_sys->lock_demuxer );
-                            vlc_mutex_lock( &lock );
-                        }
-                    }
-                }
-                break;
-            case ACTIONID_NAV_ACTIVATE:
-                if ( i_curr_button > 0 && i_curr_button <= pci->hli.hl_gi.btn_ns )
-                {
-                    btni_t button_ptr = pci->hli.btnit[i_curr_button-1];
-
-                    vlc_mutex_unlock( &lock );
-                    vlc_mutex_lock( &p_sys->lock_demuxer );
-
-                    // process the button action
-                    p_sys->dvd_interpretor.Interpret( button_ptr.cmd.bytes, 8 );
-
-                    vlc_mutex_unlock( &p_sys->lock_demuxer );
-                    vlc_mutex_lock( &lock );
-                }
-                break;
-            default:
-                break;
-            }
-            i_key_action = 0;
-        }
-
-        /* MOUSE part */
-        if( p_vout && ( b_moved || b_clicked ) )
-        {
-            int x, y;
-
-            var_GetCoords( p_vout, "mouse-moved", &x, &y );
-            pci_t *pci = &pci_packet;
-
-            if( b_clicked )
-            {
-                int32_t button;
-                int32_t best,dist,d;
-                int32_t mx,my,dx,dy;
-
-                msg_Dbg( p_demux, "Handle Mouse Event: Mouse clicked x(%d)*y(%d)", x, y);
-
-                // get current button
-                best = 0;
-                dist = 0x08000000; /* >> than  (720*720)+(567*567); */
-                for(button = 1; button <= pci->hli.hl_gi.btn_ns; button++)
-                {
-                    btni_t *button_ptr = &(pci->hli.btnit[button-1]);
-
-                    if(((unsigned)x >= button_ptr->x_start)
-                     && ((unsigned)x <= button_ptr->x_end)
-                     && ((unsigned)y >= button_ptr->y_start)
-                     && ((unsigned)y <= button_ptr->y_end))
-                    {
-                        mx = (button_ptr->x_start + button_ptr->x_end)/2;
-                        my = (button_ptr->y_start + button_ptr->y_end)/2;
-                        dx = mx - x;
-                        dy = my - y;
-                        d = (dx*dx) + (dy*dy);
-                        /* If the mouse is within the button and the mouse is closer
-                        * to the center of this button then it is the best choice. */
-                        if(d < dist) {
-                            dist = d;
-                            best = button;
-                        }
-                    }
-                }
-
-                if ( best != 0)
-                {
-                    btni_t button_ptr = pci->hli.btnit[best-1];
-                    uint16 i_curr_button = p_sys->dvd_interpretor.GetSPRM( 0x88 );
-
-                    msg_Dbg( &p_sys->demuxer, "Clicked button %d", best );
-                    vlc_mutex_unlock( &lock );
-                    vlc_mutex_lock( &p_sys->lock_demuxer );
-
-                    // process the button action
-                    p_sys->dvd_interpretor.SetSPRM( 0x88, best );
-                    p_sys->dvd_interpretor.Interpret( button_ptr.cmd.bytes, 8 );
-
-                    msg_Dbg( &p_sys->demuxer, "Processed button %d", best );
-
-                    // select new button
-                    if ( best != i_curr_button )
-                    {
-                        uint32_t i_palette;
-
-                        if(button_ptr.btn_coln != 0) {
-                            i_palette = pci->hli.btn_colit.btn_coli[button_ptr.btn_coln-1][1];
-                        } else {
-                            i_palette = 0;
-                        }
-
-                        for( int i = 0; i < 4; i++ )
-                        {
-                            uint32_t i_yuv = 0xFF;//p_sys->clut[(hl.palette>>(16+i*4))&0x0f];
-                            uint8_t i_alpha = (i_palette>>(i*4))&0x0f;
-                            i_alpha = i_alpha == 0xf ? 0xff : i_alpha << 4;
-
-                            p_sys->palette[i][0] = (i_yuv >> 16) & 0xff;
-                            p_sys->palette[i][1] = (i_yuv >> 0) & 0xff;
-                            p_sys->palette[i][2] = (i_yuv >> 8) & 0xff;
-                            p_sys->palette[i][3] = i_alpha;
-                        }
-
-                        vlc_global_lock( VLC_HIGHLIGHT_MUTEX );
-                        var_SetInteger( p_demux->p_input, "x-start",
-                                        button_ptr.x_start );
-                        var_SetInteger( p_demux->p_input, "x-end",
-                                        button_ptr.x_end );
-                        var_SetInteger( p_demux->p_input, "y-start",
-                                        button_ptr.y_start );
-                        var_SetInteger( p_demux->p_input, "y-end",
-                                        button_ptr.y_end );
-                        var_SetAddress( p_demux->p_input, "menu-palette",
-                                        p_sys->palette );
-                        var_SetBool( p_demux->p_input, "highlight", true );
-                        vlc_global_unlock( VLC_HIGHLIGHT_MUTEX );
-                    }
-                    vlc_mutex_unlock( &p_sys->lock_demuxer );
-                    vlc_mutex_lock( &lock );
-                }
-            }
-            else if( b_moved )
-            {
-//                dvdnav_mouse_select( NULL, pci, x, y );
-            }
-
-            b_moved = false;
-            b_clicked = false;
-        }
-
-        b_vout = false;
-        vlc_mutex_unlock( &lock );
-
-        /* Always check vout */
-        if( p_vout == NULL )
-        {
-            p_vout = (vlc_object_t*) input_GetVout(p_demux->p_input);
-            if( p_vout)
-            {
-                var_AddCallback( p_vout, "mouse-moved", EventMouse, this );
-                var_AddCallback( p_vout, "mouse-clicked", EventMouse, this );
-            }
-        }
-    }
-
-    /* Release callback */
-    if( p_vout )
-    {
-        var_DelCallback( p_vout, "mouse-moved", EventMouse, this );
-        var_DelCallback( p_vout, "mouse-clicked", EventMouse, this );
-        vlc_object_release( p_vout );
-    }
-    var_DelCallback( p_demux->p_input, "intf-event", EventInput, this );
-    var_DelCallback( p_demux->obj.libvlc, "key-action", EventKey, this );
-
-    vlc_restorecancel (canc);
-}
-
-void *event_thread_t::EventThread(void *data)
-{
-    static_cast<event_thread_t*>(data)->EventThread();
-    return NULL;
-}
-
-
 demux_sys_t::~demux_sys_t()
 {
     CleanUi();
diff --git a/modules/demux/mkv/demux.hpp b/modules/demux/mkv/demux.hpp
index d817f81c22..343f3124d7 100644
--- a/modules/demux/mkv/demux.hpp
+++ b/modules/demux/mkv/demux.hpp
@@ -30,45 +30,13 @@
 #include "chapter_command.hpp"
 #include "virtual_segment.hpp"
 #include "dvd_types.hpp"
+#include "events.hpp"
 
 namespace mkv {
 
 class virtual_segment_c;
 class chapter_item_c;
 
-class event_thread_t
-{
-public:
-    event_thread_t(demux_t *);
-    virtual ~event_thread_t();
-
-    void SetPci(const pci_t *data);
-    void ResetPci();
-
-private:
-    void EventThread();
-    static void *EventThread(void *);
-
-    static int EventMouse( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );
-    static int EventKey( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );
-    static int EventInput( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );
-
-    demux_t      *p_demux;
-
-    bool         is_running;
-    vlc_thread_t thread;
-
-    vlc_mutex_t  lock;
-    vlc_cond_t   wait;
-    bool         b_abort;
-    bool         b_moved;
-    bool         b_clicked;
-    int          i_key_action;
-    bool         b_vout;
-    pci_t        pci_packet;
-};
-
-
 struct demux_sys_t
 {
 public:
diff --git a/modules/demux/mkv/events.cpp b/modules/demux/mkv/events.cpp
new file mode 100644
index 0000000000..128fdda62a
--- /dev/null
+++ b/modules/demux/mkv/events.cpp
@@ -0,0 +1,434 @@
+/*****************************************************************************
+ * events.cpp : matroska demuxer
+ *****************************************************************************
+ * Copyright (C) 2003-2004 VLC authors and VideoLAN
+ * $Id$
+ *
+ * Authors: Laurent Aimar <fenrir at via.ecp.fr>
+ *          Steve Lhomme <steve.lhomme at free.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#include "mkv.hpp"
+#include "demux.hpp"
+#include "events.hpp"
+
+#include <vlc_actions.h>
+#include <vlc_threads.h>
+
+namespace mkv {
+
+event_thread_t::event_thread_t(demux_t *p_demux) : p_demux(p_demux)
+{
+    vlc_mutex_init( &lock );
+    vlc_cond_init( &wait );
+    is_running = false;
+    memset(&pci_packet, 0, sizeof(pci_packet));
+}
+event_thread_t::~event_thread_t()
+{
+    ResetPci();
+    vlc_cond_destroy( &wait );
+    vlc_mutex_destroy( &lock );
+}
+
+void event_thread_t::SetPci(const pci_t *data)
+{
+    vlc_mutex_locker l(&lock);
+
+    pci_packet = *data;
+
+#ifndef WORDS_BIGENDIAN
+    for( uint8_t button = 1; button <= pci_packet.hli.hl_gi.btn_ns; button++) {
+        btni_t *button_ptr = &(pci_packet.hli.btnit[button-1]);
+        binary *p_data = (binary*) button_ptr;
+
+        uint16 i_x_start = ((p_data[0] & 0x3F) << 4 ) + ( p_data[1] >> 4 );
+        uint16 i_x_end   = ((p_data[1] & 0x03) << 8 ) + p_data[2];
+        uint16 i_y_start = ((p_data[3] & 0x3F) << 4 ) + ( p_data[4] >> 4 );
+        uint16 i_y_end   = ((p_data[4] & 0x03) << 8 ) + p_data[5];
+        button_ptr->x_start = i_x_start;
+        button_ptr->x_end   = i_x_end;
+        button_ptr->y_start = i_y_start;
+        button_ptr->y_end   = i_y_end;
+
+    }
+    for ( uint8_t i = 0; i<3; i++ )
+        for ( uint8_t j = 0; j<2; j++ )
+            pci_packet.hli.btn_colit.btn_coli[i][j] = U32_AT( &pci_packet.hli.btn_colit.btn_coli[i][j] );
+#endif
+    if( !is_running )
+    {
+        b_abort = false;
+        is_running = !vlc_clone( &thread, EventThread, this, VLC_THREAD_PRIORITY_LOW );
+    }
+}
+void event_thread_t::ResetPci()
+{
+    if( !is_running )
+        return;
+
+    vlc_mutex_lock( &lock );
+    b_abort = true;
+    vlc_cond_signal( &wait );
+    vlc_mutex_unlock( &lock );
+
+    vlc_join( thread, NULL );
+    is_running = false;
+}
+int event_thread_t::EventMouse( vlc_object_t *p_this, char const *psz_var,
+                                vlc_value_t, vlc_value_t, void *p_data )
+{
+    event_thread_t *p_ev = (event_thread_t *) p_data;
+    vlc_mutex_lock( &p_ev->lock );
+    if( psz_var[6] == 'c' )
+    {
+        p_ev->b_clicked = true;
+        msg_Dbg( p_this, "Event Mouse: clicked");
+    }
+    else if( psz_var[6] == 'm' )
+        p_ev->b_moved = true;
+    vlc_cond_signal( &p_ev->wait );
+    vlc_mutex_unlock( &p_ev->lock );
+
+    return VLC_SUCCESS;
+}
+
+int event_thread_t::EventKey( vlc_object_t *p_this, char const *,
+                              vlc_value_t, vlc_value_t newval, void *p_data )
+{
+    event_thread_t *p_ev = (event_thread_t *) p_data;
+    vlc_mutex_lock( &p_ev->lock );
+    p_ev->i_key_action = newval.i_int;
+    vlc_cond_signal( &p_ev->wait );
+    vlc_mutex_unlock( &p_ev->lock );
+    msg_Dbg( p_this, "Event Key");
+
+    return VLC_SUCCESS;
+}
+
+int event_thread_t::EventInput( vlc_object_t *p_this, char const *,
+                                vlc_value_t, vlc_value_t newval, void *p_data )
+{
+    VLC_UNUSED( p_this );
+    event_thread_t *p_ev = (event_thread_t *) p_data;
+    vlc_mutex_lock( &p_ev->lock );
+    if( newval.i_int == INPUT_EVENT_VOUT )
+    {
+        p_ev->b_vout |= true;
+        vlc_cond_signal( &p_ev->wait );
+    }
+    vlc_mutex_unlock( &p_ev->lock );
+
+    return VLC_SUCCESS;
+}
+
+void event_thread_t::EventThread()
+{
+    demux_sys_t *p_sys = (demux_sys_t *)p_demux->p_sys;
+    vlc_object_t   *p_vout = NULL;
+    int canc = vlc_savecancel ();
+
+    b_moved      = false;
+    b_clicked    = false;
+    i_key_action = 0;
+    b_vout       = true;
+
+    /* catch all key event */
+    var_AddCallback( p_demux->obj.libvlc, "key-action", EventKey, this );
+    /* catch input event */
+    var_AddCallback( p_demux->p_input, "intf-event", EventInput, this );
+
+    /* main loop */
+    for( ;; )
+    {
+        vlc_mutex_lock( &lock );
+        while( !b_abort && !i_key_action && !b_moved && !b_clicked && !b_vout)
+            vlc_cond_wait( &wait, &lock );
+
+        if( b_abort )
+        {
+            vlc_mutex_unlock( &lock );
+            break;
+        }
+
+        /* KEY part */
+        if( i_key_action )
+        {
+            msg_Dbg( p_demux, "Handle Key Event");
+
+            pci_t *pci = &pci_packet;
+
+            uint16 i_curr_button = p_sys->dvd_interpretor.GetSPRM( 0x88 );
+
+            switch( i_key_action )
+            {
+            case ACTIONID_NAV_LEFT:
+                if ( i_curr_button > 0 && i_curr_button <= pci->hli.hl_gi.btn_ns )
+                {
+                    btni_t *p_button_ptr = &(pci->hli.btnit[i_curr_button-1]);
+                    if ( p_button_ptr->left > 0 && p_button_ptr->left <= pci->hli.hl_gi.btn_ns )
+                    {
+                        i_curr_button = p_button_ptr->left;
+                        p_sys->dvd_interpretor.SetSPRM( 0x88, i_curr_button );
+                        btni_t button_ptr = pci->hli.btnit[i_curr_button-1];
+                        if ( button_ptr.auto_action_mode )
+                        {
+                            vlc_mutex_unlock( &lock );
+                            vlc_mutex_lock( &p_sys->lock_demuxer );
+
+                            // process the button action
+                            p_sys->dvd_interpretor.Interpret( button_ptr.cmd.bytes, 8 );
+
+                            vlc_mutex_unlock( &p_sys->lock_demuxer );
+                            vlc_mutex_lock( &lock );
+                        }
+                    }
+                }
+                break;
+            case ACTIONID_NAV_RIGHT:
+                if ( i_curr_button > 0 && i_curr_button <= pci->hli.hl_gi.btn_ns )
+                {
+                    btni_t *p_button_ptr = &(pci->hli.btnit[i_curr_button-1]);
+                    if ( p_button_ptr->right > 0 && p_button_ptr->right <= pci->hli.hl_gi.btn_ns )
+                    {
+                        i_curr_button = p_button_ptr->right;
+                        p_sys->dvd_interpretor.SetSPRM( 0x88, i_curr_button );
+                        btni_t button_ptr = pci->hli.btnit[i_curr_button-1];
+                        if ( button_ptr.auto_action_mode )
+                        {
+                            vlc_mutex_unlock( &lock );
+                            vlc_mutex_lock( &p_sys->lock_demuxer );
+
+                            // process the button action
+                            p_sys->dvd_interpretor.Interpret( button_ptr.cmd.bytes, 8 );
+
+                            vlc_mutex_unlock( &p_sys->lock_demuxer );
+                            vlc_mutex_lock( &lock );
+                        }
+                    }
+                }
+                break;
+            case ACTIONID_NAV_UP:
+                if ( i_curr_button > 0 && i_curr_button <= pci->hli.hl_gi.btn_ns )
+                {
+                    btni_t *p_button_ptr = &(pci->hli.btnit[i_curr_button-1]);
+                    if ( p_button_ptr->up > 0 && p_button_ptr->up <= pci->hli.hl_gi.btn_ns )
+                    {
+                        i_curr_button = p_button_ptr->up;
+                        p_sys->dvd_interpretor.SetSPRM( 0x88, i_curr_button );
+                        btni_t button_ptr = pci->hli.btnit[i_curr_button-1];
+                        if ( button_ptr.auto_action_mode )
+                        {
+                            vlc_mutex_unlock( &lock );
+                            vlc_mutex_lock( &p_sys->lock_demuxer );
+
+                            // process the button action
+                            p_sys->dvd_interpretor.Interpret( button_ptr.cmd.bytes, 8 );
+
+                            vlc_mutex_unlock( &p_sys->lock_demuxer );
+                            vlc_mutex_lock( &lock );
+                        }
+                    }
+                }
+                break;
+            case ACTIONID_NAV_DOWN:
+                if ( i_curr_button > 0 && i_curr_button <= pci->hli.hl_gi.btn_ns )
+                {
+                    btni_t *p_button_ptr = &(pci->hli.btnit[i_curr_button-1]);
+                    if ( p_button_ptr->down > 0 && p_button_ptr->down <= pci->hli.hl_gi.btn_ns )
+                    {
+                        i_curr_button = p_button_ptr->down;
+                        p_sys->dvd_interpretor.SetSPRM( 0x88, i_curr_button );
+                        btni_t button_ptr = pci->hli.btnit[i_curr_button-1];
+                        if ( button_ptr.auto_action_mode )
+                        {
+                            vlc_mutex_unlock( &lock );
+                            vlc_mutex_lock( &p_sys->lock_demuxer );
+
+                            // process the button action
+                            p_sys->dvd_interpretor.Interpret( button_ptr.cmd.bytes, 8 );
+
+                            vlc_mutex_unlock( &p_sys->lock_demuxer );
+                            vlc_mutex_lock( &lock );
+                        }
+                    }
+                }
+                break;
+            case ACTIONID_NAV_ACTIVATE:
+                if ( i_curr_button > 0 && i_curr_button <= pci->hli.hl_gi.btn_ns )
+                {
+                    btni_t button_ptr = pci->hli.btnit[i_curr_button-1];
+
+                    vlc_mutex_unlock( &lock );
+                    vlc_mutex_lock( &p_sys->lock_demuxer );
+
+                    // process the button action
+                    p_sys->dvd_interpretor.Interpret( button_ptr.cmd.bytes, 8 );
+
+                    vlc_mutex_unlock( &p_sys->lock_demuxer );
+                    vlc_mutex_lock( &lock );
+                }
+                break;
+            default:
+                break;
+            }
+            i_key_action = 0;
+        }
+
+        /* MOUSE part */
+        if( p_vout && ( b_moved || b_clicked ) )
+        {
+            int x, y;
+
+            var_GetCoords( p_vout, "mouse-moved", &x, &y );
+            pci_t *pci = &pci_packet;
+
+            if( b_clicked )
+            {
+                int32_t button;
+                int32_t best,dist,d;
+                int32_t mx,my,dx,dy;
+
+                msg_Dbg( p_demux, "Handle Mouse Event: Mouse clicked x(%d)*y(%d)", x, y);
+
+                // get current button
+                best = 0;
+                dist = 0x08000000; /* >> than  (720*720)+(567*567); */
+                for(button = 1; button <= pci->hli.hl_gi.btn_ns; button++)
+                {
+                    btni_t *button_ptr = &(pci->hli.btnit[button-1]);
+
+                    if(((unsigned)x >= button_ptr->x_start)
+                     && ((unsigned)x <= button_ptr->x_end)
+                     && ((unsigned)y >= button_ptr->y_start)
+                     && ((unsigned)y <= button_ptr->y_end))
+                    {
+                        mx = (button_ptr->x_start + button_ptr->x_end)/2;
+                        my = (button_ptr->y_start + button_ptr->y_end)/2;
+                        dx = mx - x;
+                        dy = my - y;
+                        d = (dx*dx) + (dy*dy);
+                        /* If the mouse is within the button and the mouse is closer
+                        * to the center of this button then it is the best choice. */
+                        if(d < dist) {
+                            dist = d;
+                            best = button;
+                        }
+                    }
+                }
+
+                if ( best != 0)
+                {
+                    btni_t button_ptr = pci->hli.btnit[best-1];
+                    uint16 i_curr_button = p_sys->dvd_interpretor.GetSPRM( 0x88 );
+
+                    msg_Dbg( &p_sys->demuxer, "Clicked button %d", best );
+                    vlc_mutex_unlock( &lock );
+                    vlc_mutex_lock( &p_sys->lock_demuxer );
+
+                    // process the button action
+                    p_sys->dvd_interpretor.SetSPRM( 0x88, best );
+                    p_sys->dvd_interpretor.Interpret( button_ptr.cmd.bytes, 8 );
+
+                    msg_Dbg( &p_sys->demuxer, "Processed button %d", best );
+
+                    // select new button
+                    if ( best != i_curr_button )
+                    {
+                        uint32_t i_palette;
+
+                        if(button_ptr.btn_coln != 0) {
+                            i_palette = pci->hli.btn_colit.btn_coli[button_ptr.btn_coln-1][1];
+                        } else {
+                            i_palette = 0;
+                        }
+
+                        for( int i = 0; i < 4; i++ )
+                        {
+                            uint32_t i_yuv = 0xFF;//p_sys->clut[(hl.palette>>(16+i*4))&0x0f];
+                            uint8_t i_alpha = (i_palette>>(i*4))&0x0f;
+                            i_alpha = i_alpha == 0xf ? 0xff : i_alpha << 4;
+
+                            p_sys->palette[i][0] = (i_yuv >> 16) & 0xff;
+                            p_sys->palette[i][1] = (i_yuv >> 0) & 0xff;
+                            p_sys->palette[i][2] = (i_yuv >> 8) & 0xff;
+                            p_sys->palette[i][3] = i_alpha;
+                        }
+
+                        vlc_global_lock( VLC_HIGHLIGHT_MUTEX );
+                        var_SetInteger( p_demux->p_input, "x-start",
+                                        button_ptr.x_start );
+                        var_SetInteger( p_demux->p_input, "x-end",
+                                        button_ptr.x_end );
+                        var_SetInteger( p_demux->p_input, "y-start",
+                                        button_ptr.y_start );
+                        var_SetInteger( p_demux->p_input, "y-end",
+                                        button_ptr.y_end );
+                        var_SetAddress( p_demux->p_input, "menu-palette",
+                                        p_sys->palette );
+                        var_SetBool( p_demux->p_input, "highlight", true );
+                        vlc_global_unlock( VLC_HIGHLIGHT_MUTEX );
+                    }
+                    vlc_mutex_unlock( &p_sys->lock_demuxer );
+                    vlc_mutex_lock( &lock );
+                }
+            }
+            else if( b_moved )
+            {
+//                dvdnav_mouse_select( NULL, pci, x, y );
+            }
+
+            b_moved = false;
+            b_clicked = false;
+        }
+
+        b_vout = false;
+        vlc_mutex_unlock( &lock );
+
+        /* Always check vout */
+        if( p_vout == NULL )
+        {
+            p_vout = (vlc_object_t*) input_GetVout(p_demux->p_input);
+            if( p_vout)
+            {
+                var_AddCallback( p_vout, "mouse-moved", EventMouse, this );
+                var_AddCallback( p_vout, "mouse-clicked", EventMouse, this );
+            }
+        }
+    }
+
+    /* Release callback */
+    if( p_vout )
+    {
+        var_DelCallback( p_vout, "mouse-moved", EventMouse, this );
+        var_DelCallback( p_vout, "mouse-clicked", EventMouse, this );
+        vlc_object_release( p_vout );
+    }
+    var_DelCallback( p_demux->p_input, "intf-event", EventInput, this );
+    var_DelCallback( p_demux->obj.libvlc, "key-action", EventKey, this );
+
+    vlc_restorecancel (canc);
+}
+
+void *event_thread_t::EventThread(void *data)
+{
+    static_cast<event_thread_t*>(data)->EventThread();
+    return NULL;
+}
+
+} // namespace
+
diff --git a/modules/demux/mkv/events.hpp b/modules/demux/mkv/events.hpp
new file mode 100644
index 0000000000..98c8113af3
--- /dev/null
+++ b/modules/demux/mkv/events.hpp
@@ -0,0 +1,70 @@
+/*****************************************************************************
+ * events.hpp : matroska demuxer
+ *****************************************************************************
+ * Copyright (C) 2003-2004 VLC authors and VideoLAN
+ * $Id$
+ *
+ * Authors: Laurent Aimar <fenrir at via.ecp.fr>
+ *          Steve Lhomme <steve.lhomme at free.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef VLC_MKV_DEMUX_EVENTS_HPP
+#define VLC_MKV_DEMUX_EVENTS_HPP
+
+#include <vlc_common.h>
+#include <vlc_threads.h>
+
+#include "dvd_types.hpp"
+
+namespace mkv {
+
+struct demux_sys_t;
+
+class event_thread_t
+{
+public:
+    event_thread_t(demux_t *);
+    virtual ~event_thread_t();
+
+    void SetPci(const pci_t *data);
+    void ResetPci();
+
+private:
+    void EventThread();
+    static void *EventThread(void *);
+
+    static int EventMouse( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );
+    static int EventKey( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );
+    static int EventInput( vlc_object_t *, char const *, vlc_value_t, vlc_value_t, void * );
+
+    demux_t      *p_demux;
+
+    bool         is_running;
+    vlc_thread_t thread;
+
+    vlc_mutex_t  lock;
+    vlc_cond_t   wait;
+    bool         b_abort;
+    bool         b_moved;
+    bool         b_clicked;
+    int          i_key_action;
+    bool         b_vout;
+    pci_t        pci_packet;
+};
+} // namespace
+
+#endif



More information about the vlc-commits mailing list