]> git.sesse.net Git - vlc/blobdiff - modules/access/sdi.cpp
Set i_pts to frame end instead of frame start, to avoid i_pts=0.
[vlc] / modules / access / sdi.cpp
index ce593f0b36fa46cc656efe63060ac961eda35db7..201af4ac17f03b522f600251c7059c82aa6ea541 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
@@ -93,8 +94,6 @@ HRESULT DeckLinkCaptureDelegate::VideoInputFrameArrived(IDeckLinkVideoInputFrame
             return S_OK;
         }
 
-        msg_Dbg( p_demux_, "Received a frame" );
-
         block_t *p_frame;
         p_frame = block_New( p_demux_, 720 * 576 * 3 );
         if( !p_frame )
@@ -109,11 +108,12 @@ HRESULT DeckLinkCaptureDelegate::VideoInputFrameArrived(IDeckLinkVideoInputFrame
 
         BMDTimeValue stream_time, frame_duration;
         videoFrame->GetStreamTime( &stream_time, &frame_duration, 1000000 );
-        p_frame->i_pts = stream_time;
+        p_frame->i_pts = stream_time + frame_duration;  // FIXME: hack to avoid i_pts=0?
 
-        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 +138,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();
@@ -184,11 +185,13 @@ static int Open( vlc_object_t *p_this )
 
     /*eDeclare elementary streams */
     es_format_t fmt;
-    es_format_Init( &fmt, VIDEO_ES, VLC_CODEC_YUYV );
+    es_format_Init( &fmt, VIDEO_ES, VLC_CODEC_UYVY );
     fmt.video.i_width = 720;
     fmt.video.i_height = 576;
-    fmt.video.i_sar_num = 1;
-    fmt.video.i_sar_den = 1;
+    fmt.video.i_sar_num = 16 * fmt.video.i_height;
+    fmt.video.i_sar_den = 9 * fmt.video.i_width;
+    fmt.video.i_frame_rate = 25;
+    fmt.video.i_frame_rate_base = 1;
 
     msg_Dbg( p_demux, "added new video es %4.4s %dx%d",
              (char*)&fmt.i_codec, fmt.video.i_width, fmt.video.i_height );
@@ -244,22 +247,20 @@ 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->frame_lock );
 
-    vlc_mutex_lock( &p_sys->lock );
-    block_t *p_block = p_sys->p_frame;
+    while( !p_sys->p_frame )
+        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->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
-    {
-        usleep(50000);  // FIXME
-    }
+    vlc_mutex_unlock( &p_sys->frame_lock );
+
+    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;
 }