From: Steinar Gunderson Date: Fri, 24 Sep 2010 00:07:10 +0000 (+0200) Subject: Change the busy-waiting to a proper thread condition. X-Git-Url: https://git.sesse.net/?p=vlc;a=commitdiff_plain;h=406756f75f950dd8b6839bb2a4bea335ddb2a13c Change the busy-waiting to a proper thread condition. --- diff --git a/modules/access/sdi.cpp b/modules/access/sdi.cpp index 0e63d0cc37..1b162f3947 100644 --- a/modules/access/sdi.cpp +++ b/modules/access/sdi.cpp @@ -54,8 +54,9 @@ struct demux_sys_t DeckLinkCaptureDelegate *p_delegate; es_out_id_t *p_es; - vlc_mutex_t lock; - block_t *p_frame; // protected by + vlc_mutex_t frame_lock; + block_t *p_frame; // protected by + vlc_cond_t has_frame; // related to }; class DeckLinkCaptureDelegate : public IDeckLinkInputCallback @@ -111,9 +112,10 @@ HRESULT DeckLinkCaptureDelegate::VideoInputFrameArrived(IDeckLinkVideoInputFrame videoFrame->GetStreamTime( &stream_time, &frame_duration, 1000000 ); p_frame->i_pts = stream_time; - vlc_mutex_lock( &p_sys->lock ); + vlc_mutex_lock( &p_sys->frame_lock ); p_sys->p_frame = p_frame; // FIXME: leak - vlc_mutex_unlock( &p_sys->lock ); + vlc_cond_signal( &p_sys->has_frame ); + vlc_mutex_unlock( &p_sys->frame_lock ); } return S_OK; @@ -138,7 +140,8 @@ static int Open( vlc_object_t *p_this ) if( !p_sys ) return VLC_ENOMEM; - vlc_mutex_init( &p_sys->lock ); + vlc_mutex_init( &p_sys->frame_lock ); + vlc_cond_init( &p_sys->has_frame ); p_sys->p_frame = NULL; IDeckLinkIterator *decklink_iterator = CreateDeckLinkIteratorInstance(); @@ -244,22 +247,27 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) static int Demux( demux_t *p_demux ) { demux_sys_t *p_sys = p_demux->p_sys; + block_t *p_block; - vlc_mutex_lock( &p_sys->lock ); - block_t *p_block = p_sys->p_frame; - p_sys->p_frame = NULL; - vlc_mutex_unlock( &p_sys->lock ); + vlc_mutex_lock( &p_sys->frame_lock ); - if( p_block ) - { - msg_Dbg( p_demux, "Sending frame" ); - es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block->i_pts ); - es_out_Send( p_demux->out, p_sys->p_es, p_block ); - } - else + // Wait until p_frame is non-NULL. + for (;;) { - usleep(10000); // FIXME - } + if( p_sys->p_frame ) + break; + + vlc_cond_wait( &p_sys->has_frame, &p_sys->frame_lock ); + } + + p_block = p_sys->p_frame; + p_sys->p_frame = NULL; + + vlc_mutex_unlock( &p_sys->frame_lock ); + + msg_Dbg( p_demux, "Sending frame" ); + es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block->i_pts ); + es_out_Send( p_demux->out, p_sys->p_es, p_block ); return 1; }