]> git.sesse.net Git - vlc/commitdiff
Actually receive frame data and send it on.
authorSteinar Gunderson <sgunderson@bigfoot.com>
Thu, 23 Sep 2010 23:40:55 +0000 (01:40 +0200)
committerSteinar Gunderson <sgunderson@bigfoot.com>
Thu, 23 Sep 2010 23:40:55 +0000 (01:40 +0200)
modules/access/sdi.cpp

index 8b405ee3d71eb665a4325826dea18287d1f64618..51937e2ec9f921152de40b51c6cac4c5a190bef8 100644 (file)
@@ -53,6 +53,9 @@ struct demux_sys_t
     IDeckLinkInput *p_input;
     DeckLinkCaptureDelegate *p_delegate;
     es_out_id_t  *p_es;
+
+    vlc_mutex_t lock;
+    block_t *p_frame;  // protected by <lock>
 };
 
 class DeckLinkCaptureDelegate : public IDeckLinkInputCallback
@@ -80,7 +83,36 @@ HRESULT DeckLinkCaptureDelegate::VideoInputFormatChanged(BMDVideoInputFormatChan
 
 HRESULT DeckLinkCaptureDelegate::VideoInputFrameArrived(IDeckLinkVideoInputFrame* videoFrame, IDeckLinkAudioInputPacket* audioFrame)
 {
-    msg_Dbg( p_demux_, "Received a frame" );
+    demux_sys_t *p_sys = p_demux_->p_sys;
+
+    if (videoFrame) {
+        if (videoFrame->GetFlags() & bmdFrameHasNoInputSource) {
+            msg_Warn( p_demux_, "No input signal detected" );
+            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 ) {
+            msg_Err( p_demux_, "Could not allocate memory for frame" );
+            return S_OK;
+       }
+
+        void *frame_bytes;
+        videoFrame->GetBytes( &frame_bytes );
+        memcpy( p_frame->p_buffer, frame_bytes, 720 * 576 * 3 );
+
+        BMDTimeValue stream_time, frame_duration;
+        videoFrame->GetStreamTime( &stream_time, &frame_duration, 1000000 );
+        p_frame->i_pts = stream_time;
+
+        vlc_mutex_lock( &p_sys->lock );
+       p_sys->p_frame = p_frame;  // FIXME: leak
+        vlc_mutex_unlock( &p_sys->lock );
+    }
+
     return S_OK;
 }
 
@@ -103,7 +135,8 @@ static int Open( vlc_object_t *p_this )
     if( !p_sys )
         return VLC_ENOMEM;
 
-    msg_Dbg( p_demux, "hello world" );
+    vlc_mutex_init( &p_sys->lock );
+    p_sys->p_frame = NULL;
 
     IDeckLinkIterator *decklink_iterator = CreateDeckLinkIteratorInstance();
     if ( !decklink_iterator ) {
@@ -204,7 +237,18 @@ static int Demux( demux_t *p_demux )
 {
     demux_sys_t *p_sys = p_demux->p_sys;
 
-    // FIXME
+    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 );
+
+    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
+    }
 
     return 1;
 }