[vlc-commits] [Git][videolan/vlc][master] 8 commits: demux: mkv: move the saved pci_t data in the DVD interpretor

Steve Lhomme (@robUx4) gitlab at videolan.org
Thu Jul 11 08:17:29 UTC 2024



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
c1858e48 by Steve Lhomme at 2024-07-11T07:47:46+00:00
demux: mkv: move the saved pci_t data in the DVD interpretor

It doesn't make sense for any other chapter codec.

- - - - -
2024a2c8 by Steve Lhomme at 2024-07-11T07:47:46+00:00
demux: mkv: move the ES_OUT_SPU_SET_HIGHLIGHT in a method

Called under lock.

- - - - -
21067d90 by Steve Lhomme at 2024-07-11T07:47:46+00:00
demux: mkv: use an enum for the known navigation keys for chapter codecs

- - - - -
8245e9bd by Steve Lhomme at 2024-07-11T07:47:46+00:00
demux: mkv: move the MousePressed in a method

- - - - -
f41518e1 by Steve Lhomme at 2024-07-11T07:47:46+00:00
demux: mkv: handle the mouse pressed event in the DVD interpretor

The caller doesn't need to know about DVD buttons.
We still need the highlight to be sent back to the player by the demuxer.

- - - - -
0a97c36a by Steve Lhomme at 2024-07-11T07:47:46+00:00
demux: mkv: handle the keyboard nagivation actions in the DVD interpretor

- - - - -
7081e788 by Steve Lhomme at 2024-07-11T07:47:46+00:00
demux: mkv: handle the navigation keyboard events in the DVD interpretor

- - - - -
4e1259f3 by Steve Lhomme at 2024-07-11T07:47:46+00:00
demux: mkv: cleanup after previous patches

- - - - -


6 changed files:

- modules/demux/mkv/chapter_command.cpp
- modules/demux/mkv/chapter_command.hpp
- modules/demux/mkv/demux.cpp
- modules/demux/mkv/demux.hpp
- modules/demux/mkv/events.cpp
- modules/demux/mkv/events.hpp


Changes:

=====================================
modules/demux/mkv/chapter_command.cpp
=====================================
@@ -23,6 +23,7 @@
 
 #include "chapter_command.hpp"
 #include "demux.hpp"
+#include <vlc_subpicture.h> // vlc_spu_highlight_t
 #include <algorithm>
 
 namespace mkv {
@@ -612,7 +613,130 @@ bool dvd_command_interpretor_c::Interpret( const binary * p_command, size_t i_si
     return f_result;
 }
 
+void dvd_command_interpretor_c::ProcessNavAction( uint16_t button )
+{
+    const pci_t & pci = pci_packet;
+
+    if( button <= 0 || button > pci.hli.hl_gi.btn_ns )
+        return;
+
+    SetSPRM( 0x88, button );
+    const btni_t & button_ptr = pci.hli.btnit[button-1];
+    if ( button_ptr.auto_action_mode )
+    {
+        // process the button action
+        Interpret( button_ptr.cmd.bytes, 8 );
+    }
+}
+
+void dvd_command_interpretor_c::HandleKeyEvent( NavivationKey key )
+{
+    const pci_t & pci = pci_packet;
+    uint16_t i_curr_button = GetSPRM( 0x88 );
+
+    if( i_curr_button <= 0 || i_curr_button > pci.hli.hl_gi.btn_ns )
+        return;
+
+    const btni_t & button_ptr = pci.hli.btnit[i_curr_button-1];
+
+    switch( key )
+    {
+    case LEFT:  return ProcessNavAction( button_ptr.left );
+    case RIGHT: return ProcessNavAction( button_ptr.right );
+    case UP:    return ProcessNavAction( button_ptr.up );
+    case DOWN:  return ProcessNavAction( button_ptr.down );
+    case OK:
+        // process the button action
+        Interpret( button_ptr.cmd.bytes, 8 );
+        break;
+    default:
+        break;
+    }
+}
+
+void dvd_command_interpretor_c::HandleMousePressed( unsigned x, unsigned y )
+{
+    const pci_t & pci = pci_packet;
+
+    int32_t button;
+    int32_t best,dist,d;
+    int32_t mx,my,dx,dy;
 
+    // get current button
+    best = 0;
+    dist = 0x08000000; /* >> than  (720*720)+(567*567); */
+    for(button = 1; button <= pci.hli.hl_gi.btn_ns; button++)
+    {
+        const btni_t & button_ptr = pci.hli.btnit[button-1];
+
+        if((x >= button_ptr.x_start)
+            && (x <= button_ptr.x_end)
+            && (y >= button_ptr.y_start)
+            && (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)
+        return;
+
+    const btni_t & button_ptr = pci.hli.btnit[best-1];
+    uint16_t i_curr_button = GetSPRM( 0x88 );
+
+    vlc_debug( l, "Clicked button %d", best );
+
+    // process the button action
+    SetSPRM( 0x88, best );
+    Interpret( button_ptr.cmd.bytes, 8 );
+
+    vlc_debug( l, "Processed button %d", best );
+
+    // select new button
+    if ( best != i_curr_button )
+    {
+        // TODO: make sure we do not overflow in the conversion
+        vlc_spu_highlight_t spu_hl = vlc_spu_highlight_t();
+
+        spu_hl.x_start = (int)button_ptr.x_start;
+        spu_hl.y_start = (int)button_ptr.y_start;
+
+        spu_hl.x_end = (int)button_ptr.x_end;
+        spu_hl.y_end = (int)button_ptr.y_end;
+
+        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;
+
+            spu_hl.palette.palette[i][0] = (i_yuv >> 16) & 0xff;
+            spu_hl.palette.palette[i][1] = (i_yuv >> 0) & 0xff;
+            spu_hl.palette.palette[i][2] = (i_yuv >> 8) & 0xff;
+            spu_hl.palette.palette[i][3] = i_alpha;
+        }
+
+        vm.SetHighlight( spu_hl );
+    }
+}
 
 bool dvd_command_interpretor_c::MatchIsDomain( const chapter_codec_cmds_c &data )
 {
@@ -718,6 +842,32 @@ bool dvd_command_interpretor_c::MatchCellNumber( const chapter_codec_cmds_c &dat
     return (i_cell_num == i_cell_n);
 }
 
+void dvd_command_interpretor_c::SetPci(const pci_t *data)
+{
+    memcpy(&pci_packet, data, sizeof(pci_packet));
+
+#ifndef WORDS_BIGENDIAN
+    for( uint8_t button = 1; button <= pci_packet.hli.hl_gi.btn_ns &&
+            button < ARRAY_SIZE(pci_packet.hli.btnit); button++) {
+        btni_t & button_ptr = pci_packet.hli.btnit[button-1];
+        binary *p_data = (binary*) &button_ptr;
+
+        uint16_t i_x_start = ((p_data[0] & 0x3F) << 4 ) + ( p_data[1] >> 4 );
+        uint16_t i_x_end   = ((p_data[1] & 0x03) << 8 ) + p_data[2];
+        uint16_t i_y_start = ((p_data[3] & 0x3F) << 4 ) + ( p_data[4] >> 4 );
+        uint16_t 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
+}
+
 const std::string matroska_script_interpretor_c::CMD_MS_GOTO_AND_PLAY = "GotoAndPlay";
 
 // see http://www.matroska.org/technical/specs/chapters/index.html#mscript


=====================================
modules/demux/mkv/chapter_command.hpp
=====================================
@@ -26,6 +26,9 @@
 
 #include <vlc_arrays.h>
 #include "mkv.hpp"
+#include "dvd_types.hpp"
+
+struct vlc_spu_highlight_t;
 
 namespace mkv {
 
@@ -42,6 +45,11 @@ public:
     virtual virtual_chapter_c *BrowseCodecPrivate( enum chapter_codec_id,
                                                    chapter_cmd_match match,
                                                    virtual_segment_c * & p_vsegment_found ) = 0;
+    virtual void SetHighlight( vlc_spu_highlight_t & ) = 0;
+};
+
+enum NavivationKey {
+    LEFT, RIGHT, UP, DOWN, OK
 };
 
 class chapter_codec_cmds_c
@@ -109,6 +117,11 @@ public:
 
     bool Interpret( const binary * p_command, size_t i_size = 8 );
 
+    void HandleKeyEvent( NavivationKey );
+    void HandleMousePressed( unsigned x, unsigned y );
+
+    void SetPci(const pci_t *data);
+protected:
     uint16_t GetPRM( size_t index ) const
     {
         if ( index < 256 )
@@ -161,7 +174,8 @@ public:
         return false;
     }
 
-protected:
+    void ProcessNavAction( uint16_t button );
+
     std::string GetRegTypeName( bool b_value, uint16_t value ) const
     {
         std::string result;
@@ -198,6 +212,7 @@ protected:
     uint16_t       p_PRMs[256];
     struct vlc_logger *l;
     chapter_codec_vm & vm;
+    pci_t          pci_packet = {};
 
     // DVD command IDs
 


=====================================
modules/demux/mkv/demux.cpp
=====================================
@@ -351,4 +351,9 @@ virtual_chapter_c *demux_sys_t::FindVChapter( chapter_uid i_find_uid, virtual_se
     return p_result;
 }
 
+void demux_sys_t::SetHighlight( vlc_spu_highlight_t & spu_hl )
+{
+    ev.SetHighlight( spu_hl );
+}
+
 } // namespace


=====================================
modules/demux/mkv/demux.hpp
=====================================
@@ -104,6 +104,7 @@ public:
         return p_current_vsegment;
     }
     virtual_chapter_c *FindVChapter( chapter_uid i_find_uid, virtual_segment_c * & p_vsegment_found ) override;
+    void SetHighlight( vlc_spu_highlight_t & ) override;
 
     void PreloadFamily( const matroska_segment_c & of_segment );
     bool PreloadLinked();


=====================================
modules/demux/mkv/events.cpp
=====================================
@@ -27,7 +27,6 @@
 
 #include <vlc_actions.h>
 #include <vlc_threads.h>
-#include <vlc_subpicture.h> // vlc_spu_highlight_t
 
 #include <algorithm>
 
@@ -38,7 +37,6 @@ 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()
 {
@@ -47,33 +45,17 @@ event_thread_t::~event_thread_t()
 
 void event_thread_t::SetPci(const pci_t *data)
 {
+    demux_sys_t* p_sys = (demux_sys_t*)p_demux->p_sys;
     vlc_mutex_locker l(&lock);
 
     if(es_list.empty())
         return;
 
-    memcpy(&pci_packet, data, sizeof(pci_packet));
-
-#ifndef WORDS_BIGENDIAN
-    for( uint8_t button = 1; button <= pci_packet.hli.hl_gi.btn_ns &&
-            button < ARRAY_SIZE(pci_packet.hli.btnit); button++) {
-        btni_t & button_ptr = pci_packet.hli.btnit[button-1];
-        binary *p_data = (binary*) &button_ptr;
-
-        uint16_t i_x_start = ((p_data[0] & 0x3F) << 4 ) + ( p_data[1] >> 4 );
-        uint16_t i_x_end   = ((p_data[1] & 0x03) << 8 ) + p_data[2];
-        uint16_t i_y_start = ((p_data[3] & 0x3F) << 4 ) + ( p_data[4] >> 4 );
-        uint16_t 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;
+    auto interpretor = p_sys->GetDVDInterpretor();
+    if (!interpretor)
+        return;
 
-    }
-    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
+    interpretor->SetPci( data );
     if( !is_running )
     {
         b_abort = false;
@@ -165,183 +147,84 @@ void *event_thread_t::EventThread(void *data)
     return NULL;
 }
 
-void event_thread_t::ProcessNavAction( uint16_t button, const pci_t & pci )
+void event_thread_t::HandleKeyEvent( EventInfo const& ev )
 {
-    demux_sys_t* p_sys = (demux_sys_t*)p_demux->p_sys;
-
-    if( button <= 0 || button > pci.hli.hl_gi.btn_ns )
-        return;
-
-    auto interpretor = p_sys->GetDVDInterpretor();
-    if (!interpretor)
-        return;
+    msg_Dbg( p_demux, "Handle Key Event");
 
-    interpretor->SetSPRM( 0x88, button );
-    const btni_t & button_ptr = pci.hli.btnit[button-1];
-    if ( button_ptr.auto_action_mode )
+    NavivationKey key;
+    switch( ev.nav.query )
     {
-        vlc_mutex_unlock( &lock );
-        vlc_mutex_lock( &p_sys->lock_demuxer );
-
-        // process the button action
-        interpretor->Interpret( button_ptr.cmd.bytes, 8 );
-
-        vlc_mutex_unlock( &p_sys->lock_demuxer );
-        vlc_mutex_lock( &lock );
+    case DEMUX_NAV_LEFT:     key = NavivationKey::LEFT;
+    case DEMUX_NAV_RIGHT:    key = NavivationKey::RIGHT;
+    case DEMUX_NAV_UP:       key = NavivationKey::UP;
+    case DEMUX_NAV_DOWN:     key = NavivationKey::DOWN;
+    case DEMUX_NAV_ACTIVATE: key = NavivationKey::OK;
+    default:                 return;
     }
+
+    HandleKeyEvent( key );
 }
 
-void event_thread_t::HandleKeyEvent( EventInfo const& ev )
+void event_thread_t::HandleKeyEvent( NavivationKey key )
 {
-    msg_Dbg( p_demux, "Handle Key Event");
-
     demux_sys_t* p_sys = (demux_sys_t*)p_demux->p_sys;
-    const pci_t & pci = pci_packet;
 
     auto interpretor = p_sys->GetDVDInterpretor();
     if (!interpretor)
         return;
 
-    uint16_t i_curr_button = interpretor->GetSPRM( 0x88 );
-
-    if( i_curr_button <= 0 || i_curr_button > pci.hli.hl_gi.btn_ns )
-        return;
-
-    const btni_t & button_ptr = pci.hli.btnit[i_curr_button-1];
-
-    switch( ev.nav.query )
-    {
-    case DEMUX_NAV_LEFT: return ProcessNavAction( button_ptr.left, pci );
-    case DEMUX_NAV_RIGHT: return ProcessNavAction( button_ptr.right, pci );
-    case DEMUX_NAV_UP: return ProcessNavAction( button_ptr.up, pci );
-    case DEMUX_NAV_DOWN: return ProcessNavAction( button_ptr.down, pci );
-    case DEMUX_NAV_ACTIVATE:
-        {
-            vlc_mutex_unlock( &lock );
-            vlc_mutex_lock( &p_sys->lock_demuxer );
+    vlc_mutex_unlock( &lock );
+    vlc_mutex_lock( &p_sys->lock_demuxer );
 
-            // process the button action
-            interpretor->Interpret( button_ptr.cmd.bytes, 8 );
+    // process the button action
+    interpretor->HandleKeyEvent( key );
 
-            vlc_mutex_unlock( &p_sys->lock_demuxer );
-            vlc_mutex_lock( &lock );
-        }
-        break;
-    default:
-        break;
-    }
+    vlc_mutex_unlock( &p_sys->lock_demuxer );
+    vlc_mutex_lock( &lock );
 }
 
 void event_thread_t::HandleMouseEvent( EventInfo const& event )
 {
-    demux_sys_t* p_sys = (demux_sys_t*)p_demux->p_sys;
     int x = event.mouse.state_new.i_x;
     int y = event.mouse.state_new.i_y;
 
-    const pci_t & pci = pci_packet;
-
-    auto interpretor = p_sys->GetDVDInterpretor();
-    if (!interpretor)
-        return;
-
     if( vlc_mouse_HasPressed( &event.mouse.state_old, &event.mouse.state_new,
                               MOUSE_BUTTON_LEFT ) )
     {
-        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++)
-        {
-            const 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;
-                }
-            }
-        }
+        HandleMousePressed( (unsigned)x, (unsigned)y );
+    }
+    else if( vlc_mouse_HasMoved( &event.mouse.state_old, &event.mouse.state_new ) )
+    {
+//                dvdnav_mouse_select( NULL, pci, x, y );
+    }
+}
 
-        if ( best != 0)
-        {
-            const btni_t & button_ptr = pci.hli.btnit[best-1];
-            uint16_t i_curr_button = interpretor->GetSPRM( 0x88 );
+void event_thread_t::HandleMousePressed( unsigned x, unsigned y )
+{
+    demux_sys_t* p_sys = (demux_sys_t*)p_demux->p_sys;
 
-            msg_Dbg( &p_sys->demuxer, "Clicked button %d", best );
-            vlc_mutex_unlock( &lock );
-            vlc_mutex_lock( &p_sys->lock_demuxer );
+    auto interpretor = p_sys->GetDVDInterpretor();
+    if (!interpretor)
+        return;
 
-            // process the button action
-            interpretor->SetSPRM( 0x88, best );
-            interpretor->Interpret( button_ptr.cmd.bytes, 8 );
+    msg_Dbg( p_demux, "Handle Mouse Event: Mouse clicked x(%d)*y(%d)", x, y);
 
-            msg_Dbg( &p_sys->demuxer, "Processed button %d", best );
+    vlc_mutex_unlock( &lock );
+    vlc_mutex_lock( &p_sys->lock_demuxer );
+    interpretor->HandleMousePressed( x, y );
+    vlc_mutex_unlock( &p_sys->lock_demuxer );
+    vlc_mutex_lock( &lock );
+}
 
-            // select new button
-            if ( best != i_curr_button )
-            {
-                // TODO: make sure we do not overflow in the conversion
-                vlc_spu_highlight_t spu_hl = vlc_spu_highlight_t();
-
-                spu_hl.x_start = (int)button_ptr.x_start;
-                spu_hl.y_start = (int)button_ptr.y_start;
-
-                spu_hl.x_end = (int)button_ptr.x_end;
-                spu_hl.y_end = (int)button_ptr.y_end;
-
-                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;
-
-                    spu_hl.palette.palette[i][0] = (i_yuv >> 16) & 0xff;
-                    spu_hl.palette.palette[i][1] = (i_yuv >> 0) & 0xff;
-                    spu_hl.palette.palette[i][2] = (i_yuv >> 8) & 0xff;
-                    spu_hl.palette.palette[i][3] = i_alpha;
-                }
-
-                /* TODO: only control relevant SPU_ES given who fired the event */
-                for( es_list_t::iterator it = es_list.begin(); it != es_list.end(); ++it )
-                {
-                    if( it->category != SPU_ES )
-                        continue;
-
-                    es_out_Control( p_demux->out, ES_OUT_SPU_SET_HIGHLIGHT, it->es, &spu_hl );
-                }
-            }
-            vlc_mutex_unlock( &p_sys->lock_demuxer );
-            vlc_mutex_lock( &lock );
-        }
-    }
-    else if( vlc_mouse_HasMoved( &event.mouse.state_old, &event.mouse.state_new ) )
+void event_thread_t::SetHighlight( vlc_spu_highlight_t & spu_hl )
+{
+    /* TODO: only control relevant SPU_ES given who fired the event */
+    for( auto it : es_list )
     {
-//                dvdnav_mouse_select( NULL, pci, x, y );
+        if( it.category != SPU_ES )
+            continue;
+
+        es_out_Control( p_demux->out, ES_OUT_SPU_SET_HIGHLIGHT, it.es, &spu_hl );
     }
 }
 


=====================================
modules/demux/mkv/events.hpp
=====================================
@@ -33,6 +33,8 @@
 
 #include <list>
 
+struct vlc_spu_highlight_t;
+
 namespace mkv {
 
 struct demux_sys_t;
@@ -46,6 +48,7 @@ public:
     void SetPci(const pci_t *data);
     void ResetPci();
     int SendEventNav( int );
+    void SetHighlight( vlc_spu_highlight_t & spu_hl );
 
     bool AddES( es_out_id_t* es, int category );
     void DelES( es_out_id_t* es );
@@ -111,8 +114,6 @@ private:
     void HandleKeyEvent( EventInfo const& );
     void HandleMouseEvent( EventInfo const& );
 
-    void ProcessNavAction( uint16_t button, const pci_t & pci );
-
     demux_t      *p_demux;
 
     bool         is_running;
@@ -121,13 +122,16 @@ private:
     vlc_mutex_t  lock;
     vlc_cond_t   wait;
     bool         b_abort;
-    pci_t        pci_packet;
 
     typedef std::list<ESInfo> es_list_t;
     es_list_t es_list;
 
     typedef std::list<EventInfo> pending_events_t;
     pending_events_t pending_events;
+
+private:
+    void HandleKeyEvent( NavivationKey key );
+    void HandleMousePressed( unsigned x, unsigned y );
 };
 } // namespace
 



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/239067a71aa5d281f7d5cf580ffabdbd93254ea6...4e1259f35991ba2d5177a349634fc64c4216dc09

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/239067a71aa5d281f7d5cf580ffabdbd93254ea6...4e1259f35991ba2d5177a349634fc64c4216dc09
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list