]> git.sesse.net Git - casparcg/blobdiff - modules/decklink/producer/decklink_producer.cpp
[decklink] Added missing channel-layer in diag for the producer
[casparcg] / modules / decklink / producer / decklink_producer.cpp
index 7ef70e66bb79b674b92b29c6fe10043df34e8f81..5200a6900c72f5c4568faad00657d7ed0d343dac 100644 (file)
@@ -44,6 +44,7 @@
 #include <core/frame/frame_factory.h>
 #include <core/producer/frame_producer.h>
 #include <core/monitor/monitor.h>
+#include <core/diagnostics/call_context.h>
 #include <core/mixer/audio/audio_mixer.h>
 #include <core/help/help_repository.h>
 #include <core/help/help_sink.h>
@@ -145,7 +146,8 @@ public:
                graph_->set_text(print());
                diagnostics::register_graph(graph_);
                
-               auto display_mode = get_display_mode(input_, in_format_desc.format, bmdFormat8BitYUV, bmdVideoInputFlagDefault);
+               bool will_attempt_dma;
+               auto display_mode = get_display_mode(input_, in_format_desc.format, bmdFormat8BitYUV, bmdVideoInputFlagDefault, will_attempt_dma);
                
                // NOTE: bmdFormat8BitARGB is currently not supported by any decklink card. (2011-05-08)
                if(FAILED(input_->EnableVideoInput(display_mode, bmdFormat8BitYUV, 0))) 
@@ -235,21 +237,33 @@ public:
 
                        // Audio
 
-                       void* audio_bytes = nullptr;
-                       if(FAILED(audio->GetBytes(&audio_bytes)) || !audio_bytes)
-                               return S_OK;
-                       
                        auto audio_frame = ffmpeg::create_frame();
+                       audio_frame->format = AV_SAMPLE_FMT_S32;
+                       core::mutable_audio_buffer audio_buf;
+
+                       if (audio)
+                       {
+                               void* audio_bytes = nullptr;
+                               if (FAILED(audio->GetBytes(&audio_bytes)) || !audio_bytes)
+                                       return S_OK;
 
-                       audio_frame->data[0]            = reinterpret_cast<uint8_t*>(audio_bytes);
-                       audio_frame->linesize[0]        = audio->GetSampleFrameCount() * channel_layout_.num_channels * sizeof(int32_t);
-                       audio_frame->nb_samples         = audio->GetSampleFrameCount();
-                       audio_frame->format                     = AV_SAMPLE_FMT_S32;
+
+                               audio_frame->data[0] = reinterpret_cast<uint8_t*>(audio_bytes);
+                               audio_frame->linesize[0] = audio->GetSampleFrameCount() * channel_layout_.num_channels * sizeof(int32_t);
+                               audio_frame->nb_samples = audio->GetSampleFrameCount();
+                       }
+                       else
+                       {
+                               audio_buf.resize(audio_cadence_.front() * channel_layout_.num_channels, 0);
+                               audio_frame->data[0] = reinterpret_cast<uint8_t*>(audio_buf.data());
+                               audio_frame->linesize[0] = audio_cadence_.front() * channel_layout_.num_channels * sizeof(int32_t);
+                               audio_frame->nb_samples = audio_cadence_.front();
+                       }
                                                
                        // Note: Uses 1 step rotated cadence for 1001 modes (1602, 1602, 1601, 1602, 1601)
                        // This cadence fills the audio mixer most optimally.
 
-                       sync_buffer_.push_back(audio->GetSampleFrameCount());           
+                       sync_buffer_.push_back(audio_frame->nb_samples);
                        if(!boost::range::equal(sync_buffer_, audio_cadence_))
                        {
                                CASPAR_LOG(trace) << print() << L" Syncing audio. Expected cadence: " << to_string(audio_cadence_) << L" Got cadence: " << to_string(sync_buffer_);
@@ -259,8 +273,8 @@ public:
                        
                        // PUSH
 
-                       muxer_.push_video(video_frame); 
-                       muxer_.push_audio(audio_frame);                                                                                 
+                       muxer_.push_video(video_frame);
+                       muxer_.push_audio(audio_frame);
                        
                        // POLL
 
@@ -335,8 +349,10 @@ public:
                : executor_(L"decklink_producer[" + boost::lexical_cast<std::wstring>(device_index) + L"]")
                , length_(length)
        {
+               auto ctx = core::diagnostics::call_context::for_thread();
                executor_.invoke([=]
                {
+                       core::diagnostics::call_context::for_thread() = ctx;
                        com_initialize();
                        producer_.reset(new decklink_producer(in_format_desc, device_index, frame_factory, out_format_desc, channel_layout, filter_str));
                });