From 56a04c14fadfcaf4a78a105a823eadeed21a76c6 Mon Sep 17 00:00:00 2001 From: Dan Dennedy Date: Thu, 10 Nov 2011 19:35:29 -0800 Subject: [PATCH] Make decklink mlt_consumer_start more asynchronous. This puts preroll into a thread to make it more asynchronous - a problem noticed with multi consumer. --- src/modules/decklink/consumer_decklink.cpp | 36 +++++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/modules/decklink/consumer_decklink.cpp b/src/modules/decklink/consumer_decklink.cpp index bbb0e4e0..fd41046d 100644 --- a/src/modules/decklink/consumer_decklink.cpp +++ b/src/modules/decklink/consumer_decklink.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #ifdef WIN32 #include #include "DeckLinkAPI_h.h" @@ -58,6 +59,7 @@ private: uint32_t m_preroll; uint32_t m_acnt; bool m_reprio; + pthread_t m_prerollThread; IDeckLinkDisplayMode* getDisplayMode() { @@ -178,10 +180,28 @@ public: return true; } - + + + void* preroll_thread() + { + // preroll frames + for ( unsigned i = 0; i < m_preroll; i++ ) + ScheduleNextFrame( true ); + + // start scheduled playback + m_deckLinkOutput->StartScheduledPlayback( 0, m_timescale, 1.0 ); + + return 0; + } + + static void* preroll_thread_proxy( void* arg ) + { + DeckLinkConsumer* self = static_cast< DeckLinkConsumer* >( arg ); + return self->preroll_thread(); + } + bool start( unsigned preroll ) { - unsigned i; mlt_properties properties = MLT_CONSUMER_PROPERTIES( getConsumer() ); // Initialize members @@ -241,12 +261,8 @@ public: m_preroll = preroll; m_reprio = false; - // preroll frames - for( i = 0; i < preroll; i++ ) - ScheduleNextFrame( true ); - - // start scheduled playback - m_deckLinkOutput->StartScheduledPlayback( 0, m_timescale, 1.0 ); + // Do preroll in thread to ensure asynchronicity of mlt_consumer_start(). + pthread_create( &m_prerollThread, NULL, preroll_thread_proxy, this ); // Set the running state mlt_properties_set_int( properties, "running", 1 ); @@ -275,6 +291,10 @@ public: m_deckLinkOutput->DisableVideoOutput(); } + if ( m_prerollThread ) + pthread_join( m_prerollThread, NULL ); + m_prerollThread = 0; + return true; } -- 2.39.2