]> git.sesse.net Git - casparcg/commitdiff
Fixed usage of CComQIPtr temporaries (must be kept alive for the entire lifetime...
authorHelge Norberg <helge.norberg@gmail.com>
Thu, 27 Jun 2013 15:55:10 +0000 (17:55 +0200)
committerHelge Norberg <helge.norberg@gmail.com>
Thu, 27 Jun 2013 15:55:10 +0000 (17:55 +0200)
modules/decklink/consumer/blocking_decklink_consumer.cpp
modules/decklink/consumer/decklink_consumer.cpp

index 3d5769b835180e59f9e7e5e324e7d696c95dfb67..573c171b20114b3b6a872eb0454a3798dc84f858 100644 (file)
@@ -61,6 +61,9 @@ struct blocking_decklink_consumer : boost::noncopyable
 
        CComPtr<IDeckLink>                                              decklink_;
        CComQIPtr<IDeckLinkOutput>                              output_;
+       CComQIPtr<IDeckLinkKeyer>                               keyer_;
+       CComQIPtr<IDeckLinkAttributes>                  attributes_;
+       CComQIPtr<IDeckLinkConfiguration>               configuration_;
 
        const std::wstring                                              model_name_;
        const core::video_format_desc                   format_desc_;
@@ -84,6 +87,9 @@ public:
                , config_(config)
                , decklink_(get_device(config.device_index))
                , output_(decklink_)
+               , keyer_(decklink_)
+               , attributes_(decklink_)
+               , configuration_(decklink_)
                , model_name_(get_model_name(decklink_))
                , format_desc_(format_desc)
                , buffered_audio_samples_(0)
@@ -112,15 +118,8 @@ public:
                if(config.embedded_audio)
                        enable_audio();
 
-               set_latency(
-                               CComQIPtr<IDeckLinkConfiguration>(decklink_),
-                               configuration::low_latency,
-                               print());
-               set_keyer(
-                               CComQIPtr<IDeckLinkAttributes>(decklink_),
-                               CComQIPtr<IDeckLinkKeyer>(decklink_),
-                               config.keyer,
-                               print());
+               set_latency(configuration_, configuration::low_latency, print());
+               set_keyer(attributes_, keyer_, config.keyer, print());
        }
 
        ~blocking_decklink_consumer()
@@ -244,8 +243,9 @@ public:
                BMDTimeValue time_in_frame;
                BMDTimeValue ticks_per_frame;
 
-               output_->GetHardwareReferenceClock(
-                               time_scale, &hardware_time, &time_in_frame, &ticks_per_frame);
+               if (FAILED(output_->GetHardwareReferenceClock(
+                               time_scale, &hardware_time, &time_in_frame, &ticks_per_frame)))
+                       CASPAR_LOG(error) << print() << L" Failed to determine time in frame.";
 
                auto reference_clock_value = hardware_time - time_in_frame;
                auto frame_duration = static_cast<int>(1000 / format_desc_.fps);
index d21bda255486f98d618a66fd14e4713b2756c31b..11b6fd7f538c065c82e559f4af73be29e6ed6367 100644 (file)
@@ -56,6 +56,9 @@ struct decklink_consumer : public IDeckLinkVideoOutputCallback, public IDeckLink
 \r
        CComPtr<IDeckLink>                                      decklink_;\r
        CComQIPtr<IDeckLinkOutput>                      output_;\r
+       CComQIPtr<IDeckLinkKeyer>                       keyer_;\r
+       CComQIPtr<IDeckLinkAttributes>          attributes_;\r
+       CComQIPtr<IDeckLinkConfiguration>       configuration_;\r
 \r
        tbb::spin_mutex                                         exception_mutex_;\r
        std::exception_ptr                                      exception_;\r
@@ -89,6 +92,9 @@ public:
                , config_(config)\r
                , decklink_(get_device(config.device_index))\r
                , output_(decklink_)\r
+               , keyer_(decklink_)\r
+               , attributes_(decklink_)\r
+               , configuration_(decklink_)\r
                , model_name_(get_model_name(decklink_))\r
                , format_desc_(format_desc)\r
                , buffer_size_(config.buffer_depth()) // Minimum buffer-size 3.\r
@@ -125,15 +131,8 @@ public:
                if(config.embedded_audio)\r
                        enable_audio();\r
 \r
-               set_latency(\r
-                               CComQIPtr<IDeckLinkConfiguration>(decklink_),\r
-                               config.latency,\r
-                               print());\r
-               set_keyer(\r
-                               CComQIPtr<IDeckLinkAttributes>(decklink_),\r
-                               CComQIPtr<IDeckLinkKeyer>(decklink_),\r
-                               config.keyer,\r
-                               print());\r
+               set_latency(configuration_, config.latency, print());\r
+               set_keyer(attributes_, keyer_, config.keyer, print());\r
                                \r
                if(config.embedded_audio)               \r
                        output_->BeginAudioPreroll();           \r