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
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;
}
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 ) {
{
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;
}