Commit 56fbad8e authored by Laurent Aimar's avatar Laurent Aimar

Reworked how the event thread works in mkv demuxer.

It now uses vlc_clone()
It is started only when needed.
It does not uselessly poll every 100 or 10 milliseconds anymore...
parent b98e1a87
This diff is collapsed.
......@@ -295,18 +295,37 @@ typedef struct {
class virtual_segment_c;
class chapter_item_c;
typedef struct
class event_thread_t
{
VLC_COMMON_MEMBERS
public:
event_thread_t(demux_t *);
virtual ~event_thread_t();
void SetPci(const pci_t *data);
void ResetPci();
demux_t *p_demux;
vlc_mutex_t lock;
private:
void EventThread();
static void *EventThread(void *);
bool b_moved;
bool b_clicked;
int i_key_action;
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 * );
} event_thread_t;
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;
};
class demux_sys_t
......@@ -322,9 +341,7 @@ public:
,p_current_segment(NULL)
,dvd_interpretor( *this )
,f_duration(-1.0)
,b_ui_hooked(false)
,p_input(NULL)
,b_pci_packet_set(false)
,p_ev(NULL)
{
vlc_mutex_init( &lock_demuxer );
......@@ -369,27 +386,16 @@ public:
matroska_stream_c *AnalyseAllSegmentsFound( demux_t *p_demux, EbmlStream *p_estream, bool b_initial = false );
void JumpTo( virtual_segment_c & p_segment, chapter_item_c * p_chapter );
void StartUiThread();
void StopUiThread();
bool b_ui_hooked;
void SwapButtons();
void InitUi();
void CleanUi();
/* for spu variables */
input_thread_t *p_input;
pci_t pci_packet;
bool b_pci_packet_set;
uint8_t palette[4][4];
vlc_mutex_t lock_demuxer;
/* event */
event_thread_t *p_ev;
static void * EventThread( vlc_object_t *p_this );
static int EventMouse( vlc_object_t *p_this, char const *psz_var,
vlc_value_t oldval, vlc_value_t newval, void *p_data );
static int EventKey( vlc_object_t *p_this, char const *psz_var,
vlc_value_t oldval, vlc_value_t newval, void *p_data );
protected:
virtual_segment_c *VirtualFromSegments( matroska_segment_c *p_segment ) const;
......
......@@ -807,7 +807,6 @@ bool matroska_segment_c::Select( mtime_t i_start_time )
{
/* add all es */
msg_Dbg( &sys.demuxer, "found %d es", (int)tracks.size() );
sys.b_pci_packet_set = false;
for( size_t i_track = 0; i_track < tracks.size(); i_track++ )
{
......@@ -1253,6 +1252,7 @@ bool matroska_segment_c::Select( mtime_t i_start_time )
void matroska_segment_c::UnSelect( )
{
sys.p_ev->ResetPci();
for( size_t i_track = 0; i_track < tracks.size(); i_track++ )
{
if ( tracks[i_track]->p_es != NULL )
......
......@@ -245,7 +245,7 @@ static int Open( vlc_object_t * p_this )
goto error;
}
p_sys->StartUiThread();
p_sys->InitUi();
return VLC_SUCCESS;
......@@ -565,15 +565,8 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
if ( tk->fmt.i_cat == NAV_ES )
{
// TODO handle the start/stop times of this packet
if ( p_sys->b_ui_hooked )
{
vlc_mutex_lock( &p_sys->p_ev->lock );
memcpy( &p_sys->pci_packet, &p_block->p_buffer[1], sizeof(pci_t) );
p_sys->SwapButtons();
p_sys->b_pci_packet_set = true;
vlc_mutex_unlock( &p_sys->p_ev->lock );
block_Release( p_block );
}
p_sys->p_ev->SetPci( (const pci_t *)&p_block->p_buffer[1]);
block_Release( p_block );
return;
}
// correct timestamping when B frames are used
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment