]> git.sesse.net Git - vlc/commitdiff
Change the busy-waiting to a proper thread condition.
authorSteinar Gunderson <sgunderson@bigfoot.com>
Fri, 24 Sep 2010 00:07:10 +0000 (02:07 +0200)
committerSteinar Gunderson <sgunderson@bigfoot.com>
Fri, 24 Sep 2010 00:07:10 +0000 (02:07 +0200)
modules/access/sdi.cpp

index 0e63d0cc3703218db0733b86be4e3faf7392d0b8..1b162f3947ec2f98a8605b3948551788e989f8da 100644 (file)
@@ -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 <lock>
+    vlc_mutex_t frame_lock;
+    block_t *p_frame;  // protected by <frame_lock>
+    vlc_cond_t has_frame;  // related to <frame_lock>
 };
 
 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;
 }