From: Steinar Gunderson Date: Thu, 23 Sep 2010 23:40:55 +0000 (+0200) Subject: Actually receive frame data and send it on. X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=292a24de34ead1c5222ccf5618bd76fc8ff73c3f;p=vlc Actually receive frame data and send it on. --- diff --git a/modules/access/sdi.cpp b/modules/access/sdi.cpp index 8b405ee3d7..51937e2ec9 100644 --- a/modules/access/sdi.cpp +++ b/modules/access/sdi.cpp @@ -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 }; 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; }