vlc | branch: master | Filip Roséen <[email protected]> | Thu Jul 19 19:41:13 2018 +0200| [94ba16af77dda4511e7752786860a50d1992a154] | committer: Thomas Guillem
demux: mkv: prepare for new event handling > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=94ba16af77dda4511e7752786860a50d1992a154 --- modules/demux/mkv/events.cpp | 30 +++++++++++++++++++++++++++ modules/demux/mkv/events.hpp | 37 ++++++++++++++++++++++++++++++++++ modules/demux/mkv/matroska_segment.cpp | 6 ++++++ 3 files changed, 73 insertions(+) diff --git a/modules/demux/mkv/events.cpp b/modules/demux/mkv/events.cpp index d890dada46..483d98fe56 100644 --- a/modules/demux/mkv/events.cpp +++ b/modules/demux/mkv/events.cpp @@ -29,6 +29,8 @@ #include <vlc_actions.h> #include <vlc_threads.h> +#include <algorithm> + namespace mkv { event_thread_t::event_thread_t(demux_t *p_demux) : p_demux(p_demux) @@ -173,6 +175,13 @@ void event_thread_t::EventThread() if( p_vout && ( b_moved || b_clicked ) ) HandleMouseEvent( p_vout ); + while( !pending_events.empty() ) + { + /* TODO: handle events here */ + pending_events.pop_front(); + } + + b_vout = false; vlc_mutex_unlock( &lock ); @@ -438,5 +447,26 @@ void event_thread_t::HandleMouseEvent( vlc_object_t* p_vout ) b_clicked = false; } +void event_thread_t::AddES( es_out_id_t* es, int category ) +{ + vlc_mutex_locker lock_guard( &lock ); + + es_list.push_back( ESInfo( es, category, *this ) ); + es_list_t::reverse_iterator info = es_list.rbegin(); + + /* TODO: + * - subscribe to events if required, + * - use &*info as callback data if necessary + **/ + + VLC_UNUSED( info ); +} + +void event_thread_t::DelES( es_out_id_t* es ) +{ + vlc_mutex_locker lock_guard( &lock ); + es_list.erase( std::find( es_list.begin(), es_list.end(), es ) ); +} + } // namespace diff --git a/modules/demux/mkv/events.hpp b/modules/demux/mkv/events.hpp index 1ed207659d..1a94a13cc2 100644 --- a/modules/demux/mkv/events.hpp +++ b/modules/demux/mkv/events.hpp @@ -30,6 +30,8 @@ #include "dvd_types.hpp" +#include <list> + namespace mkv { struct demux_sys_t; @@ -43,7 +45,36 @@ public: void SetPci(const pci_t *data); void ResetPci(); + void AddES( es_out_id_t* es, int category ); + void DelES( es_out_id_t* es ); + private: + struct ESInfo { + ESInfo( es_out_id_t* es, int category, event_thread_t& owner ) + : es( es ) + , category( category ) + , owner( owner ) + { } + + bool operator==( es_out_id_t* es ) const { + return this->es == es; + } + + es_out_id_t* es; + int category; + event_thread_t& owner; + }; + + struct EventInfo { + enum { + /* XXX: event type */ + } type; + + union { + /* XXX: event specific data */ + }; + }; + void EventThread(); static void *EventThread(void *); @@ -67,6 +98,12 @@ private: int i_key_action; bool b_vout; 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; }; } // namespace diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp index c8ce568a81..06a57f612f 100644 --- a/modules/demux/mkv/matroska_segment.cpp +++ b/modules/demux/mkv/matroska_segment.cpp @@ -1121,8 +1121,13 @@ bool matroska_segment_c::ESCreate() } if( !track.p_es ) + { track.p_es = es_out_Add( sys.demuxer.out, &track.fmt ); + if( track.p_es ) + sys.ev.AddES( track.p_es, track.fmt.i_cat ); + } + /* Turn on a subtitles track if it has been flagged as default - * but only do this if no subtitles track has already been engaged, * either by an earlier 'default track' (??) or by default @@ -1157,6 +1162,7 @@ void matroska_segment_c::ESDestroy( ) if( track.p_es != NULL ) { es_out_Del( sys.demuxer.out, track.p_es ); + sys.ev.DelES( track.p_es ); track.p_es = NULL; } } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
