]> git.sesse.net Git - casparcg/commitdiff
2.0.0.2: Rewrite decklink consumer to use decklink API since WriteAudioSamplesSync...
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 13 Jan 2011 09:23:05 +0000 (09:23 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 13 Jan 2011 09:23:05 +0000 (09:23 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@346 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

12 files changed:
common/log/log.cpp
core/consumer/decklink/DeckLinkAPI.idl
core/consumer/decklink/DeckLinkAPI_v7_3.idl
core/consumer/decklink/decklink_consumer.cpp
core/consumer/decklink/util.h
core/core.vcxproj
core/core.vcxproj.filters
core/producer/decklink/decklink_producer.cpp
core/producer/flash/flash_producer.cpp
core/video_format.cpp
core/video_format.h
shell/caspar.config

index a307b2980ee8048bd1bca30075bf72360b75d2d2..8a46ca725429629fb0be6567e1bdc0c50932092e 100644 (file)
@@ -48,25 +48,25 @@ namespace internal{
 \r
 void init()\r
 {      \r
-    boost::log::add_common_attributes<wchar_t>();\r
-    typedef boost::log::aux::add_common_attributes_constants<wchar_t> traits_t;\r
+       boost::log::add_common_attributes<wchar_t>();\r
+       typedef boost::log::aux::add_common_attributes_constants<wchar_t> traits_t;\r
 \r
-    typedef boost::log::sinks::synchronous_sink<boost::log::sinks::wtext_file_backend> file_sink_type;\r
+       typedef boost::log::sinks::synchronous_sink<boost::log::sinks::wtext_file_backend> file_sink_type;\r
 \r
        typedef boost::log::sinks::asynchronous_sink<boost::log::sinks::wtext_ostream_backend> stream_sink_type;\r
 \r
-    auto stream_backend = boost::make_shared<boost::log::sinks::wtext_ostream_backend>();\r
+       auto stream_backend = boost::make_shared<boost::log::sinks::wtext_ostream_backend>();\r
        stream_backend->add_stream(boost::shared_ptr<std::wostream>(&std::wcout, boost::log::empty_deleter()));\r
        stream_backend->auto_flush(true);\r
 \r
        auto stream_sink = boost::make_shared<stream_sink_type>(stream_backend);\r
 \r
-    stream_sink->locked_backend()->set_formatter(\r
-        boost::log::formatters::wstream\r
-            << L"[" << boost::log::formatters::attr<boost::log::attributes::current_thread_id::held_type >(traits_t::thread_id_attr_name())\r
-            << L"] [" << boost::log::formatters::attr<severity_level >(boost::log::sources::aux::severity_attribute_name<wchar_t>::get())\r
-            << L"] " << boost::log::formatters::message<wchar_t>()\r
-    );\r
+       stream_sink->locked_backend()->set_formatter(\r
+               boost::log::formatters::wstream\r
+                       << L"[" << boost::log::formatters::attr<boost::log::attributes::current_thread_id::held_type >(traits_t::thread_id_attr_name())\r
+                       << L"] [" << boost::log::formatters::attr<severity_level >(boost::log::sources::aux::severity_attribute_name<wchar_t>::get())\r
+                       << L"] " << boost::log::formatters::message<wchar_t>()\r
+       );\r
 \r
        boost::log::wcore::get()->add_sink(stream_sink);\r
 }\r
@@ -75,10 +75,10 @@ void init()
 \r
 void add_file_sink(const std::wstring& folder)\r
 {      \r
-    boost::log::add_common_attributes<wchar_t>();\r
-    typedef boost::log::aux::add_common_attributes_constants<wchar_t> traits_t;\r
+       boost::log::add_common_attributes<wchar_t>();\r
+       typedef boost::log::aux::add_common_attributes_constants<wchar_t> traits_t;\r
 \r
-    typedef boost::log::sinks::synchronous_sink<boost::log::sinks::wtext_file_backend> file_sink_type;\r
+       typedef boost::log::sinks::synchronous_sink<boost::log::sinks::wtext_file_backend> file_sink_type;\r
 \r
        try\r
        {\r
index 0c055f70d8280f89722c21d739984db3b194f02a..b0d8070acbcb140191e62570a53e32bf3f48a2df 100644 (file)
@@ -34,38 +34,46 @@ version(1.0), helpstring("DeckLink API Library")]
 library DeckLinkAPI\r
 {\r
 \r
-/* Type Declarations */\r
+// Type Declarations\r
 \r
 typedef LONGLONG BMDTimeValue;\r
 typedef LONGLONG BMDTimeScale;\r
 typedef unsigned long BMDTimecodeBCD;\r
+typedef unsigned long BMDTimecodeUserBits;\r
 \r
-/* End Type Declarations */\r
 \r
-/* Enumeration Mapping */\r
+// Enumeration Mapping\r
 \r
+cpp_quote("typedef unsigned long BMDDisplayModeFlags;")\r
 cpp_quote("typedef unsigned long BMDFrameFlags;")\r
 cpp_quote("typedef unsigned long BMDVideoInputFlags;")\r
 cpp_quote("typedef unsigned long BMDVideoInputFormatChangedEvents;")\r
 cpp_quote("typedef unsigned long BMDDetectedVideoInputFormatFlags;")\r
 cpp_quote("typedef unsigned long BMDTimecodeFlags;")\r
 cpp_quote("typedef unsigned long BMDAnalogVideoFlags;")\r
+cpp_quote("typedef unsigned long BMDDeckControlStatusFlags;")\r
+cpp_quote("typedef unsigned long BMDDeckControlExportModeOpsFlags;")\r
 cpp_quote("#if 0")\r
+typedef enum _BMDDisplayModeFlags BMDDisplayModeFlags;\r
 typedef enum _BMDFrameFlags BMDFrameFlags;\r
 typedef enum _BMDVideoInputFlags BMDVideoInputFlags;\r
 typedef enum _BMDVideoInputFormatChangedEvents BMDVideoInputFormatChangedEvents;\r
 typedef enum _BMDDetectedVideoInputFormatFlags BMDDetectedVideoInputFormatFlags;\r
 typedef enum _BMDTimecodeFlags BMDTimecodeFlags;\r
 typedef enum _BMDAnalogVideoFlags BMDAnalogVideoFlags;\r
+typedef enum _BMDDeckControlStatusFlags BMDDeckControlStatusFlags;\r
+typedef enum _BMDDeckControlExportModeOpsFlags BMDDeckControlExportModeOpsFlags;\r
 cpp_quote("#endif")\r
 \r
-/* End Enumeration Mapping */\r
 \r
 /* Enum BMDDisplayMode - Video display modes */\r
 \r
 typedef [v1_enum] enum _BMDDisplayMode {\r
+\r
+    /* SD Modes */\r
+\r
     bmdModeNTSC                                        = /* 'ntsc' */ 0x6E747363,\r
-    bmdModeNTSC2398                                    = /* 'nt23' */ 0x6E743233, // 3:2 pulldown\r
+    bmdModeNTSC2398                                    = /* 'nt23' */ 0x6E743233,      // 3:2 pulldown\r
     bmdModePAL                                         = /* 'pal ' */ 0x70616C20,\r
 \r
     /* HD 1080 Modes */\r
@@ -77,10 +85,10 @@ typedef [v1_enum] enum      _BMDDisplayMode {
     bmdModeHD1080p30                                   = /* 'Hp30' */ 0x48703330,\r
     bmdModeHD1080i50                                   = /* 'Hi50' */ 0x48693530,\r
     bmdModeHD1080i5994                                 = /* 'Hi59' */ 0x48693539,\r
-    bmdModeHD1080i6000                                 = /* 'Hi60' */ 0x48693630, // N.B. This _really_ is 60.00 Hz.\r
+    bmdModeHD1080i6000                                 = /* 'Hi60' */ 0x48693630,      // N.B. This _really_ is 60.00 Hz.\r
     bmdModeHD1080p50                                   = /* 'Hp50' */ 0x48703530,\r
     bmdModeHD1080p5994                                 = /* 'Hp59' */ 0x48703539,\r
-    bmdModeHD1080p6000                                 = /* 'Hp60' */ 0x48703630, // N.B. This _really_ is 60.00 Hz.\r
+    bmdModeHD1080p6000                                 = /* 'Hp60' */ 0x48703630,      // N.B. This _really_ is 60.00 Hz.\r
 \r
     /* HD 720 Modes */\r
 \r
@@ -95,7 +103,6 @@ typedef [v1_enum] enum       _BMDDisplayMode {
     bmdMode2k25                                        = /* '2k25' */ 0x326B3235\r
 } BMDDisplayMode;\r
 \r
-/* End Enum BMDDisplayMode */\r
 \r
 /* Enum BMDFieldDominance - Video field dominance */\r
 \r
@@ -107,29 +114,37 @@ typedef [v1_enum] enum    _BMDFieldDominance {
     bmdProgressiveSegmentedFrame                       = /* 'psf ' */ 0x70736620\r
 } BMDFieldDominance;\r
 \r
-/* End Enum BMDFieldDominance */\r
 \r
 /* Enum BMDPixelFormat - Video pixel formats supported for output/input */\r
 \r
 typedef [v1_enum] enum _BMDPixelFormat {\r
     bmdFormat8BitYUV                                   = /* '2vuy' */ 0x32767579,\r
     bmdFormat10BitYUV                                  = /* 'v210' */ 0x76323130,\r
-    bmdFormat8BitARGB                                  = 0x20,\r
+    bmdFormat8BitARGB                                  = 32,\r
     bmdFormat8BitBGRA                                  = /* 'BGRA' */ 0x42475241,\r
-    bmdFormat10BitRGB                                  = /* 'r210' */ 0x72323130\r
+    bmdFormat10BitRGB                                  = /* 'r210' */ 0x72323130       // Big-endian RGB 10-bit per component with SMPTE video levels (64-960). Packed as 2:10:10:10\r
 } BMDPixelFormat;\r
 \r
-/* End Enum BMDPixelFormat */\r
+\r
+/* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */\r
+\r
+[v1_enum] enum _BMDDisplayModeFlags {\r
+    bmdDisplayModeSupports3D                           = 1 << 0,\r
+    bmdDisplayModeColorspaceRec601                     = 1 << 1,\r
+    bmdDisplayModeColorspaceRec709                     = 1 << 2\r
+};\r
+\r
 \r
 /* Enum BMDVideoOutputFlags - Flags to control the output of ancillary data along with video. */\r
 \r
 typedef [v1_enum] enum _BMDVideoOutputFlags {\r
     bmdVideoOutputFlagDefault                          = 0,\r
-    bmdVideoOutputRP188                                = 1 << 0,\r
-    bmdVideoOutputVANC                                 = 1 << 1\r
+    bmdVideoOutputVANC                                 = 1 << 0,\r
+    bmdVideoOutputVITC                                 = 1 << 1,\r
+    bmdVideoOutputRP188                                = 1 << 2,\r
+    bmdVideoOutputDualStream3D                         = 1 << 4\r
 } BMDVideoOutputFlags;\r
 \r
-/* End Enum BMDVideoOutputFlags */\r
 \r
 /* Enum BMDFrameFlags - Frame flags */\r
 \r
@@ -137,21 +152,20 @@ typedef [v1_enum] enum    _BMDVideoOutputFlags {
     bmdFrameFlagDefault                                = 0,\r
     bmdFrameFlagFlipVertical                           = 1 << 0,\r
 \r
-    /* Flags that are valid only for frames returned through IDeckLinkInput */\r
+    /* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */\r
 \r
     bmdFrameHasNoInputSource                           = 1 << 31\r
 };\r
 \r
-/* End Enum BMDFrameFlags */\r
 \r
 /* Enum BMDVideoInputFlags - Flags applicable to video input */\r
 \r
 [v1_enum] enum _BMDVideoInputFlags {\r
     bmdVideoInputFlagDefault                           = 0,\r
-    bmdVideoInputEnableFormatDetection                 = 1 << 0\r
+    bmdVideoInputEnableFormatDetection                 = 1 << 0,\r
+    bmdVideoInputDualStream3D                          = 1 << 1\r
 };\r
 \r
-/* End Enum BMDVideoInputFlags */\r
 \r
 /* Enum BMDVideoInputFormatChangedEvents - Bitmask passed to the VideoInputFormatChanged notification to identify the properties of the input signal that have changed */\r
 \r
@@ -161,7 +175,6 @@ typedef [v1_enum] enum      _BMDVideoOutputFlags {
     bmdVideoInputColorspaceChanged                     = 1 << 2\r
 };\r
 \r
-/* End Enum BMDVideoInputFormatChangedEvents */\r
 \r
 /* Enum BMDDetectedVideoInputFormatFlags - Flags passed to the VideoInputFormatChanged notification to describe the detected video input signal */\r
 \r
@@ -170,7 +183,6 @@ typedef [v1_enum] enum      _BMDVideoOutputFlags {
     bmdDetectedVideoInputRGB444                        = 1 << 1\r
 };\r
 \r
-/* End Enum BMDDetectedVideoInputFormatFlags */\r
 \r
 /* Enum BMDOutputFrameCompletionResult - Frame Completion Callback */\r
 \r
@@ -181,7 +193,14 @@ typedef [v1_enum] enum     _BMDOutputFrameCompletionResult {
     bmdOutputFrameFlushed                             \r
 } BMDOutputFrameCompletionResult;\r
 \r
-/* End Enum BMDOutputFrameCompletionResult */\r
+\r
+/* Enum BMDReferenceStatus - GenLock input status */\r
+\r
+typedef [v1_enum] enum _BMDReferenceStatus {\r
+    bmdReferenceNotSupportedByHardware                 = 1 << 0,\r
+    bmdReferenceLocked                                 = 1 << 1\r
+} BMDReferenceStatus;\r
+\r
 \r
 /* Enum BMDAudioSampleRate - Audio sample rates supported for output/input */\r
 \r
@@ -189,7 +208,6 @@ typedef [v1_enum] enum      _BMDAudioSampleRate {
     bmdAudioSampleRate48kHz                            = 48000\r
 } BMDAudioSampleRate;\r
 \r
-/* End Enum BMDAudioSampleRate */\r
 \r
 /* Enum BMDAudioSampleType - Audio sample sizes supported for output/input */\r
 \r
@@ -198,7 +216,6 @@ typedef [v1_enum] enum      _BMDAudioSampleType {
     bmdAudioSampleType32bitInteger                     = 32\r
 } BMDAudioSampleType;\r
 \r
-/* End Enum BMDAudioSampleType */\r
 \r
 /* Enum BMDAudioOutputStreamType - Audio output stream type */\r
 \r
@@ -208,7 +225,6 @@ typedef [v1_enum] enum      _BMDAudioOutputStreamType {
     bmdAudioOutputStreamTimestamped                   \r
 } BMDAudioOutputStreamType;\r
 \r
-/* End Enum BMDAudioOutputStreamType */\r
 \r
 /* Enum BMDDisplayModeSupport - Output mode supported flags */\r
 \r
@@ -218,7 +234,6 @@ typedef [v1_enum] enum      _BMDDisplayModeSupport {
     bmdDisplayModeSupportedWithConversion             \r
 } BMDDisplayModeSupport;\r
 \r
-/* End Enum BMDDisplayModeSupport */\r
 \r
 /* Enum BMDTimecodeFormat - Timecode formats for frame metadata */\r
 \r
@@ -228,7 +243,6 @@ typedef [v1_enum] enum      _BMDTimecodeFormat {
     bmdTimecodeSerial                                  = /* 'seri' */ 0x73657269\r
 } BMDTimecodeFormat;\r
 \r
-/* End Enum BMDTimecodeFormat */\r
 \r
 /* Enum BMDTimecodeFlags - Timecode flags */\r
 \r
@@ -237,20 +251,18 @@ typedef [v1_enum] enum    _BMDTimecodeFormat {
     bmdTimecodeIsDropFrame                             = 1 << 0\r
 };\r
 \r
-/* End Enum BMDTimecodeFlags */\r
 \r
 /* Enum BMDVideoConnection - Video connection types */\r
 \r
 typedef [v1_enum] enum _BMDVideoConnection {\r
-    bmdVideoConnectionSDI                              = /* 'sdi ' */ 0x73646920,\r
-    bmdVideoConnectionHDMI                             = /* 'hdmi' */ 0x68646D69,\r
-    bmdVideoConnectionOpticalSDI                       = /* 'opti' */ 0x6F707469,\r
-    bmdVideoConnectionComponent                        = /* 'cpnt' */ 0x63706E74,\r
-    bmdVideoConnectionComposite                        = /* 'cmst' */ 0x636D7374,\r
-    bmdVideoConnectionSVideo                           = /* 'svid' */ 0x73766964\r
+    bmdVideoConnectionSDI                              = 1 << 0,\r
+    bmdVideoConnectionHDMI                             = 1 << 1,\r
+    bmdVideoConnectionOpticalSDI                       = 1 << 2,\r
+    bmdVideoConnectionComponent                        = 1 << 3,\r
+    bmdVideoConnectionComposite                        = 1 << 4,\r
+    bmdVideoConnectionSVideo                           = 1 << 5\r
 } BMDVideoConnection;\r
 \r
-/* End Enum BMDVideoConnection */\r
 \r
 /* Enum BMDAnalogVideoFlags - Analog video display flags */\r
 \r
@@ -259,7 +271,6 @@ typedef [v1_enum] enum      _BMDVideoConnection {
     bmdAnalogVideoFlagComponentBetacamLevels           = 1 << 1\r
 };\r
 \r
-/* End Enum BMDAnalogVideoFlags */\r
 \r
 /* Enum BMDAudioConnection - Audio connection types */\r
 \r
@@ -269,21 +280,34 @@ typedef [v1_enum] enum    _BMDAudioConnection {
     bmdAudioConnectionAnalog                           = /* 'anlg' */ 0x616E6C67\r
 } BMDAudioConnection;\r
 \r
-/* End Enum BMDAudioConnection */\r
+\r
+/* Enum BMDAudioOutputAnalogAESSwitch - Audio output Analog/AESEBU switch */\r
+\r
+typedef [v1_enum] enum _BMDAudioOutputAnalogAESSwitch {\r
+    bmdAudioOutputSwitchAESEBU                         = /* 'aes ' */ 0x61657320,\r
+    bmdAudioOutputSwitchAnalog                         = /* 'anlg' */ 0x616E6C67\r
+} BMDAudioOutputAnalogAESSwitch;\r
+\r
 \r
 /* Enum BMDVideoOutputConversionMode - Video/audio conversion mode */\r
 \r
 typedef [v1_enum] enum _BMDVideoOutputConversionMode {\r
     bmdNoVideoOutputConversion                         = /* 'none' */ 0x6E6F6E65,\r
-    bmdVideoOutputLetterboxDownonversion               = /* 'ltbx' */ 0x6C746278,\r
-    bmdVideoOutputAnamorphicDownonversion              = /* 'amph' */ 0x616D7068,\r
+    bmdVideoOutputLetterboxDownconversion              = /* 'ltbx' */ 0x6C746278,\r
+    bmdVideoOutputAnamorphicDownconversion             = /* 'amph' */ 0x616D7068,\r
     bmdVideoOutputHD720toHD1080Conversion              = /* '720c' */ 0x37323063,\r
     bmdVideoOutputHardwareLetterboxDownconversion      = /* 'HWlb' */ 0x48576C62,\r
     bmdVideoOutputHardwareAnamorphicDownconversion     = /* 'HWam' */ 0x4857616D,\r
-    bmdVideoOutputHardwareCenterCutDownconversion      = /* 'HWcc' */ 0x48576363\r
+    bmdVideoOutputHardwareCenterCutDownconversion      = /* 'HWcc' */ 0x48576363,\r
+    bmdVideoOutputHardware720p1080pCrossconversion     = /* 'xcap' */ 0x78636170,\r
+    bmdVideoOutputHardwareAnamorphic720pUpconversion   = /* 'ua7p' */ 0x75613770,\r
+    bmdVideoOutputHardwareAnamorphic1080iUpconversion  = /* 'ua1i' */ 0x75613169,\r
+    bmdVideoOutputHardwareAnamorphic149To720pUpconversion = /* 'u47p' */ 0x75343770,\r
+    bmdVideoOutputHardwareAnamorphic149To1080iUpconversion = /* 'u41i' */ 0x75343169,\r
+    bmdVideoOutputHardwarePillarbox720pUpconversion    = /* 'up7p' */ 0x75703770,\r
+    bmdVideoOutputHardwarePillarbox1080iUpconversion   = /* 'up1i' */ 0x75703169\r
 } BMDVideoOutputConversionMode;\r
 \r
-/* End Enum BMDVideoOutputConversionMode */\r
 \r
 /* Enum BMDVideoInputConversionMode - Video input conversion mode */\r
 \r
@@ -297,9 +321,87 @@ typedef [v1_enum] enum     _BMDVideoInputConversionMode {
     bmdVideoInputAnamorphicUpconversion                = /* 'amup' */ 0x616D7570\r
 } BMDVideoInputConversionMode;\r
 \r
-/* End Enum BMDVideoInputConversionMode */\r
 \r
-/* Enum BMDDeckLinkAttributeID - DeckLink Atribute ID */\r
+/* Enum BMDVideo3DPackingFormat - Video 3D packing format */\r
+\r
+typedef [v1_enum] enum _BMDVideo3DPackingFormat {\r
+    bmdVideo3DPackingSidebySideHalf                    = /* 'sbsh' */ 0x73627368,\r
+    bmdVideo3DPackingLinebyLine                        = /* 'lbyl' */ 0x6C62796C,\r
+    bmdVideo3DPackingTopAndBottom                      = /* 'tabo' */ 0x7461626F,\r
+    bmdVideo3DPackingLeftOnly                          = /* 'left' */ 0x6C656674,\r
+    bmdVideo3DPackingRightOnly                         = /* 'righ' */ 0x72696768\r
+} BMDVideo3DPackingFormat;\r
+\r
+\r
+/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */\r
+\r
+typedef [v1_enum] enum _BMDDeckLinkConfigurationID {\r
+\r
+    /* Video Input/Output Flags */\r
+\r
+    bmdDeckLinkConfigUse1080pNotPsF                    = /* 'fpro' */ 0x6670726F,\r
+\r
+    /* Video Input/Output Integers */\r
+\r
+    bmdDeckLinkConfigHDMI3DPackingFormat               = /* '3dpf' */ 0x33647066,\r
+\r
+    /* Audio Input/Output Flags */\r
+\r
+    bmdDeckLinkConfigAnalogAudioConsumerLevels         = /* 'aacl' */ 0x6161636C,\r
+\r
+    /* Video output flags */\r
+\r
+    bmdDeckLinkConfigFieldFlickerRemoval               = /* 'fdfr' */ 0x66646672,\r
+    bmdDeckLinkConfigHD1080p24ToHD1080i5994Conversion  = /* 'to59' */ 0x746F3539,\r
+    bmdDeckLinkConfig444SDIVideoOutput                 = /* '444o' */ 0x3434346F,\r
+    bmdDeckLinkConfig3GBpsVideoOutput                  = /* '3gbs' */ 0x33676273,\r
+    bmdDeckLinkConfigBlackVideoOutputDuringCapture     = /* 'bvoc' */ 0x62766F63,\r
+    bmdDeckLinkConfigLowLatencyVideoOutput             = /* 'llvo' */ 0x6C6C766F,\r
+\r
+    /* Video Output Integers */\r
+\r
+    bmdDeckLinkConfigVideoOutputConnection             = /* 'vocn' */ 0x766F636E,\r
+    bmdDeckLinkConfigVideoOutputConversionMode         = /* 'vocm' */ 0x766F636D,\r
+    bmdDeckLinkConfigAnalogVideoOutputFlags            = /* 'avof' */ 0x61766F66,\r
+    bmdDeckLinkConfigReferenceInputTimingOffset        = /* 'glot' */ 0x676C6F74,\r
+\r
+    /* Video Input Integers */\r
+\r
+    bmdDeckLinkConfigVideoInputConnection              = /* 'vicn' */ 0x7669636E,\r
+    bmdDeckLinkConfigAnalogVideoInputFlags             = /* 'avif' */ 0x61766966,\r
+    bmdDeckLinkConfigVideoInputConversionMode          = /* 'vicm' */ 0x7669636D,\r
+    bmdDeckLinkConfig32PulldownSequenceInitialTimecodeFrame = /* 'pdif' */ 0x70646966,\r
+    bmdDeckLinkConfigVANCSourceLine1Mapping            = /* 'vsl1' */ 0x76736C31,\r
+    bmdDeckLinkConfigVANCSourceLine2Mapping            = /* 'vsl2' */ 0x76736C32,\r
+    bmdDeckLinkConfigVANCSourceLine3Mapping            = /* 'vsl3' */ 0x76736C33,\r
+\r
+    /* Audio Input Integers */\r
+\r
+    bmdDeckLinkConfigAudioInputConnection              = /* 'aicn' */ 0x6169636E,\r
+\r
+    /* Audio Input Floats */\r
+\r
+    bmdDeckLinkConfigAnalogAudioInputScaleChannel1     = /* 'ais1' */ 0x61697331,\r
+    bmdDeckLinkConfigAnalogAudioInputScaleChannel2     = /* 'ais2' */ 0x61697332,\r
+    bmdDeckLinkConfigAnalogAudioInputScaleChannel3     = /* 'ais3' */ 0x61697333,\r
+    bmdDeckLinkConfigAnalogAudioInputScaleChannel4     = /* 'ais4' */ 0x61697334,\r
+    bmdDeckLinkConfigDigitalAudioInputScale            = /* 'dais' */ 0x64616973,\r
+\r
+    /* Audio Output Integers */\r
+\r
+    bmdDeckLinkConfigAudioOutputAESAnalogSwitch        = /* 'aoaa' */ 0x616F6161,\r
+\r
+    /* Audio Output Floats */\r
+\r
+    bmdDeckLinkConfigAnalogAudioOutputScaleChannel1    = /* 'aos1' */ 0x616F7331,\r
+    bmdDeckLinkConfigAnalogAudioOutputScaleChannel2    = /* 'aos2' */ 0x616F7332,\r
+    bmdDeckLinkConfigAnalogAudioOutputScaleChannel3    = /* 'aos3' */ 0x616F7333,\r
+    bmdDeckLinkConfigAnalogAudioOutputScaleChannel4    = /* 'aos4' */ 0x616F7334,\r
+    bmdDeckLinkConfigDigitalAudioOutputScale           = /* 'daos' */ 0x64616F73\r
+} BMDDeckLinkConfigurationID;\r
+\r
+\r
+/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */\r
 \r
 typedef [v1_enum] enum _BMDDeckLinkAttributeID {\r
 \r
@@ -309,18 +411,22 @@ typedef [v1_enum] enum    _BMDDeckLinkAttributeID {
     BMDDeckLinkSupportsExternalKeying                  = /* 'keye' */ 0x6B657965,\r
     BMDDeckLinkSupportsHDKeying                        = /* 'keyh' */ 0x6B657968,\r
     BMDDeckLinkSupportsInputFormatDetection            = /* 'infd' */ 0x696E6664,\r
+    BMDDeckLinkHasReferenceInput                       = /* 'hrin' */ 0x6872696E,\r
     BMDDeckLinkHasSerialPort                           = /* 'hspt' */ 0x68737074,\r
 \r
     /* Integers */\r
 \r
     BMDDeckLinkMaximumAudioChannels                    = /* 'mach' */ 0x6D616368,\r
+    BMDDeckLinkNumberOfSubDevices                      = /* 'nsbd' */ 0x6E736264,\r
+    BMDDeckLinkSubDeviceIndex                          = /* 'subi' */ 0x73756269,\r
+    BMDDeckLinkVideoOutputConnections                  = /* 'vocn' */ 0x766F636E,\r
+    BMDDeckLinkVideoInputConnections                   = /* 'vicn' */ 0x7669636E,\r
 \r
     /* Strings */\r
 \r
     BMDDeckLinkSerialPortDeviceName                    = /* 'slpn' */ 0x736C706E\r
 } BMDDeckLinkAttributeID;\r
 \r
-/* End Enum BMDDeckLinkAttributeID */\r
 \r
 /* Enum BMDDeckLinkAPIInformationID - DeckLinkAPI information ID */\r
 \r
@@ -328,9 +434,111 @@ typedef [v1_enum] enum    _BMDDeckLinkAPIInformationID {
     BMDDeckLinkAPIVersion                              = /* 'vers' */ 0x76657273\r
 } BMDDeckLinkAPIInformationID;\r
 \r
-/* End Enum BMDDeckLinkAPIInformationID */\r
 \r
-/* Forward Declarations */\r
+/* Enum BMDDeckControlMode - DeckControl mode */\r
+\r
+typedef [v1_enum] enum _BMDDeckControlMode {\r
+    bmdDeckControlNotOpened                            = /* 'ntop' */ 0x6E746F70,\r
+    bmdDeckControlVTRControlMode                       = /* 'vtrc' */ 0x76747263,\r
+    bmdDeckControlExportMode                           = /* 'expm' */ 0x6578706D,\r
+    bmdDeckControlCaptureMode                          = /* 'capm' */ 0x6361706D\r
+} BMDDeckControlMode;\r
+\r
+\r
+/* Enum BMDDeckControlEvent - DeckControl event */\r
+\r
+typedef [v1_enum] enum _BMDDeckControlEvent {\r
+    bmdDeckControlAbortedEvent                         = /* 'abte' */ 0x61627465,      // This event is triggered when a capture or edit-to-tape operation is aborted.\r
+\r
+    /* Export-To-Tape events */\r
+\r
+    bmdDeckControlPrepareForExportEvent                = /* 'pfee' */ 0x70666565,      // This event is triggered a few frames before reaching the in-point. IDeckLinkInput::StartScheduledPlayback() should be called at this point.\r
+    bmdDeckControlExportCompleteEvent                  = /* 'exce' */ 0x65786365,      // This event is triggered a few frames after reaching the out-point. At this point, it is safe to stop playback.\r
+\r
+    /* Capture events */\r
+\r
+    bmdDeckControlPrepareForCaptureEvent               = /* 'pfce' */ 0x70666365,      // This event is triggered a few frames before reaching the in-point. The serial timecode attached to IDeckLinkVideoInputFrames is now valid.\r
+    bmdDeckControlCaptureCompleteEvent                 = /* 'ccev' */ 0x63636576       // This event is triggered a few frames after reaching the out-point.\r
+} BMDDeckControlEvent;\r
+\r
+\r
+/* Enum BMDDeckControlVTRControlState - VTR Control state */\r
+\r
+typedef [v1_enum] enum _BMDDeckControlVTRControlState {\r
+    bmdDeckControlNotInVTRControlMode                  = /* 'nvcm' */ 0x6E76636D,\r
+    bmdDeckControlVTRControlPlaying                    = /* 'vtrp' */ 0x76747270,\r
+    bmdDeckControlVTRControlRecording                  = /* 'vtrr' */ 0x76747272,\r
+    bmdDeckControlVTRControlStill                      = /* 'vtra' */ 0x76747261,\r
+    bmdDeckControlVTRControlSeeking                    = /* 'vtrs' */ 0x76747273,\r
+    bmdDeckControlVTRControlStopped                    = /* 'vtro' */ 0x7674726F\r
+} BMDDeckControlVTRControlState;\r
+\r
+\r
+/* Enum BMDDeckControlStatusFlags - Deck Control status flags */\r
+\r
+[v1_enum] enum _BMDDeckControlStatusFlags {\r
+    bmdDeckControlStatusDeckConnected                  = 1 << 0,\r
+    bmdDeckControlStatusRemoteMode                     = 1 << 1,\r
+    bmdDeckControlStatusRecordInhibited                = 1 << 2,\r
+    bmdDeckControlStatusCassetteOut                    = 1 << 3\r
+};\r
+\r
+\r
+/* Enum BMDDeckControlExportModeOpsFlags - Export mode flags */\r
+\r
+[v1_enum] enum _BMDDeckControlExportModeOpsFlags {\r
+    bmdDeckControlExportModeInsertVideo                = 1 << 0,\r
+    bmdDeckControlExportModeInsertAudio1               = 1 << 1,\r
+    bmdDeckControlExportModeInsertAudio2               = 1 << 2,\r
+    bmdDeckControlExportModeInsertAudio3               = 1 << 3,\r
+    bmdDeckControlExportModeInsertAudio4               = 1 << 4,\r
+    bmdDeckControlExportModeInsertAudio5               = 1 << 5,\r
+    bmdDeckControlExportModeInsertAudio6               = 1 << 6,\r
+    bmdDeckControlExportModeInsertAudio7               = 1 << 7,\r
+    bmdDeckControlExportModeInsertAudio8               = 1 << 8,\r
+    bmdDeckControlExportModeInsertAudio9               = 1 << 9,\r
+    bmdDeckControlExportModeInsertAudio10              = 1 << 10,\r
+    bmdDeckControlExportModeInsertAudio11              = 1 << 11,\r
+    bmdDeckControlExportModeInsertAudio12              = 1 << 12,\r
+    bmdDeckControlExportModeInsertTimeCode             = 1 << 13,\r
+    bmdDeckControlExportModeInsertAssemble             = 1 << 14,\r
+    bmdDeckControlExportModeInsertPreview              = 1 << 15,\r
+    bmdDeckControlUseManualExport                      = 1 << 16\r
+};\r
+\r
+\r
+/* Enum BMDDeckControlError - Deck Control error */\r
+\r
+typedef [v1_enum] enum _BMDDeckControlError {\r
+    bmdDeckControlNoError                              = /* 'noer' */ 0x6E6F6572,\r
+    bmdDeckControlModeError                            = /* 'moer' */ 0x6D6F6572,\r
+    bmdDeckControlMissedInPointError                   = /* 'mier' */ 0x6D696572,\r
+    bmdDeckControlDeckTimeoutError                     = /* 'dter' */ 0x64746572,\r
+    bmdDeckControlCommandFailedError                   = /* 'cfer' */ 0x63666572,\r
+    bmdDeckControlDeviceAlreadyOpenedError             = /* 'dalo' */ 0x64616C6F,\r
+    bmdDeckControlFailedToOpenDeviceError              = /* 'fder' */ 0x66646572,\r
+    bmdDeckControlInLocalModeError                     = /* 'lmer' */ 0x6C6D6572,\r
+    bmdDeckControlEndOfTapeError                       = /* 'eter' */ 0x65746572,\r
+    bmdDeckControlUserAbortError                       = /* 'uaer' */ 0x75616572,\r
+    bmdDeckControlNoTapeInDeckError                    = /* 'nter' */ 0x6E746572,\r
+    bmdDeckControlNoVideoFromCardError                 = /* 'nvfc' */ 0x6E766663,\r
+    bmdDeckControlNoCommunicationError                 = /* 'ncom' */ 0x6E636F6D,\r
+    bmdDeckControlUnknownError                         = /* 'uner' */ 0x756E6572\r
+} BMDDeckControlError;\r
+\r
+\r
+/* Enum BMD3DPreviewFormat - Linked Frame preview format */\r
+\r
+typedef [v1_enum] enum _BMD3DPreviewFormat {\r
+    bmd3DPreviewFormatDefault                          = /* 'defa' */ 0x64656661,\r
+    bmd3DPreviewFormatLeftOnly                         = /* 'left' */ 0x6C656674,\r
+    bmd3DPreviewFormatRightOnly                        = /* 'righ' */ 0x72696768,\r
+    bmd3DPreviewFormatSideBySide                       = /* 'side' */ 0x73696465,\r
+    bmd3DPreviewFormatTopBottom                        = /* 'topb' */ 0x746F7062\r
+} BMD3DPreviewFormat;\r
+\r
+\r
+// Forward Declarations\r
 \r
 interface IDeckLinkVideoOutputCallback;\r
 interface IDeckLinkInputCallback;\r
@@ -346,6 +554,7 @@ interface IDeckLinkInput;
 interface IDeckLinkTimecode;\r
 interface IDeckLinkVideoFrame;\r
 interface IDeckLinkMutableVideoFrame;\r
+interface IDeckLinkVideoFrame3DExtensions;\r
 interface IDeckLinkVideoInputFrame;\r
 interface IDeckLinkVideoFrameAncillary;\r
 interface IDeckLinkAudioInputPacket;\r
@@ -354,14 +563,16 @@ interface IDeckLinkGLScreenPreviewHelper;
 interface IDeckLinkConfiguration;\r
 interface IDeckLinkAttributes;\r
 interface IDeckLinkKeyer;\r
+interface IDeckLinkVideoConversion;\r
+interface IDeckLinkDeckControlStatusCallback;\r
+interface IDeckLinkDeckControl;\r
 \r
-/* End Forward Declarations */\r
 \r
 /* Interface IDeckLinkVideoOutputCallback - Frame completion callback. */\r
 \r
 [\r
     object,\r
-    uuid(E763A626-4A3C-49D1-BF13-E7AD3692AE52),\r
+    uuid(20AA5225-1958-47CB-820B-80A8D521A6EE),\r
     helpstring("Frame completion callback.")\r
 ] interface IDeckLinkVideoOutputCallback : IUnknown\r
 {\r
@@ -369,21 +580,19 @@ interface IDeckLinkKeyer;
     HRESULT ScheduledPlaybackHasStopped(void);\r
 };\r
 \r
-/* End Interface IDeckLinkVideoOutputCallback */\r
 \r
 /* Interface IDeckLinkInputCallback - Frame arrival callback. */\r
 \r
 [\r
     object,\r
-    uuid(31D28EE7-88B6-4CB1-897A-CDBF79A26414),\r
+    uuid(DD04E5EC-7415-42AB-AE4A-E80C4DFC044A),\r
     helpstring("Frame arrival callback.")\r
 ] interface IDeckLinkInputCallback : IUnknown\r
 {\r
     HRESULT VideoInputFormatChanged([in] BMDVideoInputFormatChangedEvents notificationEvents, [in] IDeckLinkDisplayMode *newDisplayMode, [in] BMDDetectedVideoInputFormatFlags detectedSignalFlags);\r
-    HRESULT VideoInputFrameArrived([in] IDeckLinkVideoInputFrame *videoFrame, [in] IDeckLinkAudioInputPacket *audioPacket);\r
+    HRESULT VideoInputFrameArrived([in] IDeckLinkVideoInputFrame* videoFrame, [in] IDeckLinkAudioInputPacket* audioPacket);\r
 };\r
 \r
-/* End Interface IDeckLinkInputCallback */\r
 \r
 /* Interface IDeckLinkMemoryAllocator - Memory allocator for video frames. */\r
 \r
@@ -394,14 +603,13 @@ interface IDeckLinkKeyer;
     helpstring("Memory allocator for video frames.")\r
 ] interface IDeckLinkMemoryAllocator : IUnknown\r
 {\r
-    HRESULT AllocateBuffer(unsigned long bufferSize, [out] void **allocatedBuffer);\r
+    HRESULT AllocateBuffer([in] unsigned long bufferSize, [out] void **allocatedBuffer);\r
     HRESULT ReleaseBuffer([in] void *buffer);\r
 \r
     HRESULT Commit(void);\r
     HRESULT Decommit(void);\r
 };\r
 \r
-/* End Interface IDeckLinkMemoryAllocator */\r
 \r
 /* Interface IDeckLinkAudioOutputCallback - Optional callback to allow audio samples to be pulled as required. */\r
 \r
@@ -412,10 +620,9 @@ interface IDeckLinkKeyer;
     helpstring("Optional callback to allow audio samples to be pulled as required.")\r
 ] interface IDeckLinkAudioOutputCallback : IUnknown\r
 {\r
-    HRESULT RenderAudioSamples(BOOL preroll);\r
+    HRESULT RenderAudioSamples([in] BOOL preroll);\r
 };\r
 \r
-/* End Interface IDeckLinkAudioOutputCallback */\r
 \r
 /* Interface IDeckLinkIterator - enumerates installed DeckLink hardware */\r
 \r
@@ -428,7 +635,6 @@ interface IDeckLinkKeyer;
     HRESULT Next([out] IDeckLink **deckLinkInstance);\r
 };\r
 \r
-/* End Interface IDeckLinkIterator */\r
 \r
 /* Interface IDeckLinkAPIInformation - DeckLinkAPI attribute interface */\r
 \r
@@ -444,26 +650,24 @@ interface IDeckLinkKeyer;
     HRESULT GetString([in] BMDDeckLinkAPIInformationID cfgID, [out] BSTR *value);\r
 };\r
 \r
-/* End Interface IDeckLinkAPIInformation */\r
 \r
 /* Interface IDeckLinkDisplayModeIterator - enumerates over supported input/output display modes. */\r
 \r
 [\r
     object,\r
-    uuid(455D741F-1779-4800-86F5-0B5D13D79751),\r
+    uuid(9C88499F-F601-4021-B80B-032E4EB41C35),\r
     helpstring("enumerates over supported input/output display modes.")\r
 ] interface IDeckLinkDisplayModeIterator : IUnknown\r
 {\r
     HRESULT Next([out] IDeckLinkDisplayMode **deckLinkDisplayMode);\r
 };\r
 \r
-/* End Interface IDeckLinkDisplayModeIterator */\r
 \r
 /* Interface IDeckLinkDisplayMode - represents a display mode */\r
 \r
 [\r
     object,\r
-    uuid(87451E84-2B7E-439E-A629-4393EA4A8550),\r
+    uuid(3EB2C1AB-0A3D-4523-A3AD-F40D7FB14E78),\r
     helpstring("represents a display mode")\r
 ] interface IDeckLinkDisplayMode : IUnknown\r
 {\r
@@ -473,9 +677,9 @@ interface IDeckLinkKeyer;
     long GetHeight(void);\r
     HRESULT GetFrameRate([out] BMDTimeValue *frameDuration, [out] BMDTimeScale *timeScale);\r
     BMDFieldDominance GetFieldDominance(void);\r
+    BMDDisplayModeFlags GetFlags(void);\r
 };\r
 \r
-/* End Interface IDeckLinkDisplayMode */\r
 \r
 /* Interface IDeckLink - represents a DeckLink device */\r
 \r
@@ -488,46 +692,45 @@ interface IDeckLinkKeyer;
     HRESULT GetModelName([out] BSTR *modelName);\r
 };\r
 \r
-/* End Interface IDeckLink */\r
 \r
 /* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */\r
 \r
 [\r
     object,\r
-    uuid(29228142-EB8C-4141-A621-F74026450955),\r
+    uuid(A3EF0963-0862-44ED-92A9-EE89ABF431C7),\r
     local, \r
     helpstring("Created by QueryInterface from IDeckLink.")\r
 ] interface IDeckLinkOutput : IUnknown\r
 {\r
-    HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);\r
+    HRESULT DoesSupportVideoMode([in] BMDDisplayMode displayMode, [in] BMDPixelFormat pixelFormat, [in] BMDVideoOutputFlags flags, [out] BMDDisplayModeSupport *result, [out] IDeckLinkDisplayMode **resultDisplayMode);\r
     HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator **iterator);\r
 \r
     HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback);\r
 \r
     /* Video Output */\r
 \r
-    HRESULT EnableVideoOutput(BMDDisplayMode displayMode, BMDVideoOutputFlags flags);\r
+    HRESULT EnableVideoOutput([in] BMDDisplayMode displayMode, [in] BMDVideoOutputFlags flags);\r
     HRESULT DisableVideoOutput(void);\r
 \r
     HRESULT SetVideoOutputFrameMemoryAllocator([in] IDeckLinkMemoryAllocator *theAllocator);\r
-    HRESULT CreateVideoFrame(long width, long height, long rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, [out] IDeckLinkMutableVideoFrame **outFrame);\r
-    HRESULT CreateAncillaryData(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] IDeckLinkVideoFrameAncillary **outBuffer);\r
+    HRESULT CreateVideoFrame([in] long width, [in] long height, [in] long rowBytes, [in] BMDPixelFormat pixelFormat, [in] BMDFrameFlags flags, [out] IDeckLinkMutableVideoFrame **outFrame);\r
+    HRESULT CreateAncillaryData([in] BMDPixelFormat pixelFormat, [out] IDeckLinkVideoFrameAncillary **outBuffer);\r
 \r
     HRESULT DisplayVideoFrameSync([in] IDeckLinkVideoFrame *theFrame);\r
-    HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale);\r
+    HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame *theFrame, [in] BMDTimeValue displayTime, [in] BMDTimeValue displayDuration, [in] BMDTimeScale timeScale);\r
     HRESULT SetScheduledFrameCompletionCallback([in] IDeckLinkVideoOutputCallback *theCallback);\r
     HRESULT GetBufferedVideoFrameCount([out] unsigned long *bufferedFrameCount);\r
 \r
     /* Audio Output */\r
 \r
-    HRESULT EnableAudioOutput(BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned long channelCount, BMDAudioOutputStreamType streamType);\r
+    HRESULT EnableAudioOutput([in] BMDAudioSampleRate sampleRate, [in] BMDAudioSampleType sampleType, [in] unsigned long channelCount, [in] BMDAudioOutputStreamType streamType);\r
     HRESULT DisableAudioOutput(void);\r
 \r
-    HRESULT WriteAudioSamplesSync([in] void *buffer, unsigned long sampleFrameCount, [out] unsigned long *sampleFramesWritten);\r
+    HRESULT WriteAudioSamplesSync([in] void *buffer, [in] unsigned long sampleFrameCount, [out] unsigned long *sampleFramesWritten);\r
 \r
     HRESULT BeginAudioPreroll(void);\r
     HRESULT EndAudioPreroll(void);\r
-    HRESULT ScheduleAudioSamples([in] void *buffer, unsigned long sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, [out] unsigned long *sampleFramesWritten);\r
+    HRESULT ScheduleAudioSamples([in] void *buffer, [in] unsigned long sampleFrameCount, [in] BMDTimeValue streamTime, [in] BMDTimeScale timeScale, [out] unsigned long *sampleFramesWritten);\r
 \r
     HRESULT GetBufferedAudioSampleFrameCount([out] unsigned long *bufferedSampleFrameCount);\r
     HRESULT FlushBufferedAudioSamples(void);\r
@@ -536,40 +739,40 @@ interface IDeckLinkKeyer;
 \r
     /* Output Control */\r
 \r
-    HRESULT StartScheduledPlayback(BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed);\r
-    HRESULT StopScheduledPlayback(BMDTimeValue stopPlaybackAtTime, [out] BMDTimeValue *actualStopTime, BMDTimeScale timeScale);\r
+    HRESULT StartScheduledPlayback([in] BMDTimeValue playbackStartTime, [in] BMDTimeScale timeScale, [in] double playbackSpeed);\r
+    HRESULT StopScheduledPlayback([in] BMDTimeValue stopPlaybackAtTime, [out] BMDTimeValue *actualStopTime, [in] BMDTimeScale timeScale);\r
     HRESULT IsScheduledPlaybackRunning([out] BOOL *active);\r
-    HRESULT GetScheduledStreamTime(BMDTimeScale desiredTimeScale, [out] BMDTimeValue *streamTime, [out] double *playbackSpeed);\r
+    HRESULT GetScheduledStreamTime([in] BMDTimeScale desiredTimeScale, [out] BMDTimeValue *streamTime, [out] double *playbackSpeed);\r
+    HRESULT GetReferenceStatus([out] BMDReferenceStatus *referenceStatus);\r
 \r
     /* Hardware Timing */\r
 \r
-    HRESULT GetHardwareReferenceClock(BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame);\r
+    HRESULT GetHardwareReferenceClock([in] BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame);\r
 };\r
 \r
-/* End Interface IDeckLinkOutput */\r
 \r
 /* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */\r
 \r
 [\r
     object,\r
-    uuid(300C135A-9F43-48E2-9906-6D7911D93CF1),\r
+    uuid(6D40EF78-28B9-4E21-990D-95BB7750A04F),\r
     helpstring("Created by QueryInterface from IDeckLink.")\r
 ] interface IDeckLinkInput : IUnknown\r
 {\r
-    HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);\r
+    HRESULT DoesSupportVideoMode([in] BMDDisplayMode displayMode, [in] BMDPixelFormat pixelFormat, [in] BMDVideoInputFlags flags, [out] BMDDisplayModeSupport *result, [out] IDeckLinkDisplayMode **resultDisplayMode);\r
     HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator **iterator);\r
 \r
     HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback);\r
 \r
     /* Video Input */\r
 \r
-    HRESULT EnableVideoInput(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags);\r
+    HRESULT EnableVideoInput([in] BMDDisplayMode displayMode, [in] BMDPixelFormat pixelFormat, [in] BMDVideoInputFlags flags);\r
     HRESULT DisableVideoInput(void);\r
     HRESULT GetAvailableVideoFrameCount([out] unsigned long *availableFrameCount);\r
 \r
     /* Audio Input */\r
 \r
-    HRESULT EnableAudioInput(BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned long channelCount);\r
+    HRESULT EnableAudioInput([in] BMDAudioSampleRate sampleRate, [in] BMDAudioSampleType sampleType, [in] unsigned long channelCount);\r
     HRESULT DisableAudioInput(void);\r
     HRESULT GetAvailableAudioSampleFrameCount([out] unsigned long *availableSampleFrameCount);\r
 \r
@@ -583,16 +786,15 @@ interface IDeckLinkKeyer;
 \r
     /* Hardware Timing */\r
 \r
-    HRESULT GetHardwareReferenceClock(BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame);\r
+    HRESULT GetHardwareReferenceClock([in] BMDTimeScale desiredTimeScale, [out] BMDTimeValue *hardwareTime, [out] BMDTimeValue *timeInFrame, [out] BMDTimeValue *ticksPerFrame);\r
 };\r
 \r
-/* End Interface IDeckLinkInput */\r
 \r
 /* Interface IDeckLinkTimecode - Used for video frame timecode representation. */\r
 \r
 [\r
     object,\r
-    uuid(EFB9BCA6-A521-44F7-BD69-2332F24D9EE6),\r
+    uuid(BC6CFBD3-8317-4325-AC1C-1216391E9340),\r
     helpstring("Used for video frame timecode representation.")\r
 ] interface IDeckLinkTimecode : IUnknown\r
 {\r
@@ -600,15 +802,15 @@ interface IDeckLinkKeyer;
     HRESULT GetComponents([out] unsigned char *hours, [out] unsigned char *minutes, [out] unsigned char *seconds, [out] unsigned char *frames);\r
     HRESULT GetString([out] BSTR *timecode);\r
     BMDTimecodeFlags GetFlags(void);\r
+    HRESULT GetTimecodeUserBits([out] BMDTimecodeUserBits *userBits);\r
 };\r
 \r
-/* End Interface IDeckLinkTimecode */\r
 \r
 /* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */\r
 \r
 [\r
     object,\r
-    uuid(A8D8238E-6B18-4196-99E1-5AF717B83D32),\r
+    uuid(3F716FE0-F023-4111-BE5D-EF4414C05B17),\r
     local, \r
     helpstring("Interface to encapsulate a video frame; can be caller-implemented.")\r
 ] interface IDeckLinkVideoFrame : IUnknown\r
@@ -620,44 +822,56 @@ interface IDeckLinkKeyer;
     BMDFrameFlags GetFlags(void);\r
     HRESULT GetBytes([out] void **buffer);\r
 \r
-    HRESULT GetTimecode(BMDTimecodeFormat format, [out] IDeckLinkTimecode **timecode);\r
+    HRESULT GetTimecode([in] BMDTimecodeFormat format, [out] IDeckLinkTimecode **timecode);\r
     HRESULT GetAncillaryData([out] IDeckLinkVideoFrameAncillary **ancillary);\r
 };\r
 \r
-/* End Interface IDeckLinkVideoFrame */\r
 \r
 /* Interface IDeckLinkMutableVideoFrame - Created by IDeckLinkOutput::CreateVideoFrame. */\r
 \r
 [\r
     object,\r
-    uuid(46FCEE00-B4E6-43D0-91C0-023A7FCEB34F),\r
+    uuid(69E2639F-40DA-4E19-B6F2-20ACE815C390),\r
     local, \r
     helpstring("Created by IDeckLinkOutput::CreateVideoFrame.")\r
 ] interface IDeckLinkMutableVideoFrame : IDeckLinkVideoFrame\r
 {\r
-    HRESULT SetFlags(BMDFrameFlags newFlags);\r
+    HRESULT SetFlags([in] BMDFrameFlags newFlags);\r
 \r
-    HRESULT SetTimecode(BMDTimecodeFormat format, [in] IDeckLinkTimecode *timecode);\r
-    HRESULT SetTimecodeFromComponents(BMDTimecodeFormat format, unsigned char hours, unsigned char minutes, unsigned char seconds, unsigned char frames, BMDTimecodeFlags flags);\r
+    HRESULT SetTimecode([in] BMDTimecodeFormat format, [in] IDeckLinkTimecode *timecode);\r
+    HRESULT SetTimecodeFromComponents([in] BMDTimecodeFormat format, [in] unsigned char hours, [in] unsigned char minutes, [in] unsigned char seconds, [in] unsigned char frames, [in] BMDTimecodeFlags flags);\r
     HRESULT SetAncillaryData([in] IDeckLinkVideoFrameAncillary *ancillary);\r
+    HRESULT SetTimecodeUserBits([in] BMDTimecodeFormat format, [in] BMDTimecodeUserBits userBits);\r
+};\r
+\r
+\r
+/* Interface IDeckLinkVideoFrame3DExtensions - Optional interface implemented on IDeckLinkVideoFrame to support 3D frames */\r
+\r
+[\r
+    object,\r
+    uuid(DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7),\r
+    local, \r
+    helpstring("Optional interface implemented on IDeckLinkVideoFrame to support 3D frames")\r
+] interface IDeckLinkVideoFrame3DExtensions : IUnknown\r
+{\r
+    BMDVideo3DPackingFormat Get3DPackingFormat(void);\r
+    HRESULT GetFrameForRightEye([in] IDeckLinkVideoFrame* *rightEyeFrame);\r
 };\r
 \r
-/* End Interface IDeckLinkMutableVideoFrame */\r
 \r
 /* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */\r
 \r
 [\r
     object,\r
-    uuid(9A74FA41-AE9F-47AC-8CF4-01F42DD59965),\r
+    uuid(05CFE374-537C-4094-9A57-680525118F44),\r
     local, \r
     helpstring("Provided by the IDeckLinkVideoInput frame arrival callback.")\r
 ] interface IDeckLinkVideoInputFrame : IDeckLinkVideoFrame\r
 {\r
-    HRESULT GetStreamTime([out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration, BMDTimeScale timeScale);\r
-    HRESULT GetHardwareReferenceTimestamp(BMDTimeScale timeScale, [out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration);\r
+    HRESULT GetStreamTime([out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration, [in] BMDTimeScale timeScale);\r
+    HRESULT GetHardwareReferenceTimestamp([in] BMDTimeScale timeScale, [out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration);\r
 };\r
 \r
-/* End Interface IDeckLinkVideoInputFrame */\r
 \r
 /* Interface IDeckLinkVideoFrameAncillary - Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */\r
 \r
@@ -669,12 +883,11 @@ interface IDeckLinkKeyer;
 ] interface IDeckLinkVideoFrameAncillary : IUnknown\r
 {\r
 \r
-    HRESULT GetBufferForVerticalBlankingLine(unsigned long lineNumber, [out] void **buffer);\r
+    HRESULT GetBufferForVerticalBlankingLine([in] unsigned long lineNumber, [out] void **buffer);\r
     BMDPixelFormat GetPixelFormat(void);\r
     BMDDisplayMode GetDisplayMode(void);\r
 };\r
 \r
-/* End Interface IDeckLinkVideoFrameAncillary */\r
 \r
 /* Interface IDeckLinkAudioInputPacket - Provided by the IDeckLinkInput callback. */\r
 \r
@@ -687,16 +900,15 @@ interface IDeckLinkKeyer;
 {\r
     long GetSampleFrameCount(void);\r
     HRESULT GetBytes([out] void **buffer);\r
-    HRESULT GetPacketTime([out] BMDTimeValue *packetTime, BMDTimeScale timeScale);\r
+    HRESULT GetPacketTime([out] BMDTimeValue *packetTime, [in] BMDTimeScale timeScale);\r
 };\r
 \r
-/* End Interface IDeckLinkAudioInputPacket */\r
 \r
 /* Interface IDeckLinkScreenPreviewCallback - Screen preview callback */\r
 \r
 [\r
     object,\r
-    uuid(373F499D-4B4D-4518-AD22-6354E5A5825E),\r
+    uuid(B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438),\r
     local, \r
     helpstring("Screen preview callback")\r
 ] interface IDeckLinkScreenPreviewCallback : IUnknown\r
@@ -704,13 +916,12 @@ interface IDeckLinkKeyer;
     HRESULT DrawFrame([in] IDeckLinkVideoFrame *theFrame);\r
 };\r
 \r
-/* End Interface IDeckLinkScreenPreviewCallback */\r
 \r
 /* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance(). */\r
 \r
 [\r
     object,\r
-    uuid(BA575CD9-A15E-497B-B2C2-F9AFE7BE4EBA),\r
+    uuid(504E2209-CAC7-4C1A-9FB4-C5BB6274D22F),\r
     local, \r
     helpstring("Created with CoCreateInstance().")\r
 ] interface IDeckLinkGLScreenPreviewHelper : IUnknown\r
@@ -721,68 +932,30 @@ interface IDeckLinkKeyer;
     HRESULT InitializeGL(void);\r
     HRESULT PaintGL(void);\r
     HRESULT SetFrame([in] IDeckLinkVideoFrame *theFrame);\r
+    HRESULT Set3DPreviewFormat([in] BMD3DPreviewFormat previewFormat);\r
 };\r
 \r
-/* End Interface IDeckLinkGLScreenPreviewHelper */\r
 \r
-/* Interface IDeckLinkConfiguration - Created by QueryInterface from IDeckLink. */\r
+/* Interface IDeckLinkConfiguration - DeckLink Configuration interface */\r
 \r
 [\r
     object,\r
-    uuid(B8EAD569-B764-47F0-A73F-AE40DF6CBF10),\r
-    helpstring("Created by QueryInterface from IDeckLink.")\r
+    uuid(C679A35B-610C-4D09-B748-1D0478100FC0),\r
+    local, \r
+    helpstring("DeckLink Configuration interface")\r
 ] interface IDeckLinkConfiguration : IUnknown\r
 {\r
-    HRESULT GetConfigurationValidator([out] IDeckLinkConfiguration **configObject);\r
+    HRESULT SetFlag([in] BMDDeckLinkConfigurationID cfgID, [in] BOOL value);\r
+    HRESULT GetFlag([in] BMDDeckLinkConfigurationID cfgID, [out] BOOL *value);\r
+    HRESULT SetInt([in] BMDDeckLinkConfigurationID cfgID, [in] LONGLONG value);\r
+    HRESULT GetInt([in] BMDDeckLinkConfigurationID cfgID, [out] LONGLONG *value);\r
+    HRESULT SetFloat([in] BMDDeckLinkConfigurationID cfgID, [in] double value);\r
+    HRESULT GetFloat([in] BMDDeckLinkConfigurationID cfgID, [out] double *value);\r
+    HRESULT SetString([in] BMDDeckLinkConfigurationID cfgID, [in] BSTR value);\r
+    HRESULT GetString([in] BMDDeckLinkConfigurationID cfgID, [out] BSTR *value);\r
     HRESULT WriteConfigurationToPreferences(void);\r
-\r
-    /* Video Output Configuration */\r
-\r
-    HRESULT SetVideoOutputFormat(BMDVideoConnection videoOutputConnection);\r
-    HRESULT IsVideoOutputActive(BMDVideoConnection videoOutputConnection, [out] BOOL *active);\r
-\r
-    HRESULT SetAnalogVideoOutputFlags(BMDAnalogVideoFlags analogVideoFlags);\r
-    HRESULT GetAnalogVideoOutputFlags([out] BMDAnalogVideoFlags *analogVideoFlags);\r
-\r
-    HRESULT EnableFieldFlickerRemovalWhenPaused(BOOL enable);\r
-    HRESULT IsEnabledFieldFlickerRemovalWhenPaused([out] BOOL *enabled);\r
-\r
-    HRESULT Set444And3GBpsVideoOutput(BOOL enable444VideoOutput, BOOL enable3GbsOutput);\r
-    HRESULT Get444And3GBpsVideoOutput([out] BOOL *is444VideoOutputEnabled, [out] BOOL *threeGbsOutputEnabled);\r
-\r
-    HRESULT SetVideoOutputConversionMode(BMDVideoOutputConversionMode conversionMode);\r
-    HRESULT GetVideoOutputConversionMode([out] BMDVideoOutputConversionMode *conversionMode);\r
-\r
-    HRESULT Set_HD1080p24_to_HD1080i5994_Conversion(BOOL enable);\r
-    HRESULT Get_HD1080p24_to_HD1080i5994_Conversion([out] BOOL *enabled);\r
-\r
-    /* Video Input Configuration */\r
-\r
-    HRESULT SetVideoInputFormat(BMDVideoConnection videoInputFormat);\r
-    HRESULT GetVideoInputFormat([out] BMDVideoConnection *videoInputFormat);\r
-\r
-    HRESULT SetAnalogVideoInputFlags(BMDAnalogVideoFlags analogVideoFlags);\r
-    HRESULT GetAnalogVideoInputFlags([out] BMDAnalogVideoFlags *analogVideoFlags);\r
-\r
-    HRESULT SetVideoInputConversionMode(BMDVideoInputConversionMode conversionMode);\r
-    HRESULT GetVideoInputConversionMode([out] BMDVideoInputConversionMode *conversionMode);\r
-\r
-    HRESULT SetBlackVideoOutputDuringCapture(BOOL blackOutInCapture);\r
-    HRESULT GetBlackVideoOutputDuringCapture([out] BOOL *blackOutInCapture);\r
-\r
-    HRESULT Set32PulldownSequenceInitialTimecodeFrame(unsigned long aFrameTimecode);\r
-    HRESULT Get32PulldownSequenceInitialTimecodeFrame([out] unsigned long *aFrameTimecode);\r
-\r
-    HRESULT SetVancSourceLineMapping(unsigned long activeLine1VANCsource, unsigned long activeLine2VANCsource, unsigned long activeLine3VANCsource);\r
-    HRESULT GetVancSourceLineMapping([out] unsigned long *activeLine1VANCsource, [out] unsigned long *activeLine2VANCsource, [out] unsigned long *activeLine3VANCsource);\r
-\r
-    /* Audio Input Configuration */\r
-\r
-    HRESULT SetAudioInputFormat(BMDAudioConnection audioInputFormat);\r
-    HRESULT GetAudioInputFormat([out] BMDAudioConnection *audioInputFormat);\r
 };\r
 \r
-/* End Interface IDeckLinkConfiguration */\r
 \r
 /* Interface IDeckLinkAttributes - DeckLink Attribute interface */\r
 \r
@@ -799,7 +972,6 @@ interface IDeckLinkKeyer;
     HRESULT GetString([in] BMDDeckLinkAttributeID cfgID, [out] BSTR *value);\r
 };\r
 \r
-/* End Interface IDeckLinkAttributes */\r
 \r
 /* Interface IDeckLinkKeyer - DeckLink Keyer interface */\r
 \r
@@ -817,7 +989,77 @@ interface IDeckLinkKeyer;
     HRESULT Disable(void);\r
 };\r
 \r
-/* End Interface IDeckLinkKeyer */\r
+\r
+/* Interface IDeckLinkVideoConversion - Created with CoCreateInstance(). */\r
+\r
+[\r
+    object,\r
+    uuid(3BBCB8A2-DA2C-42D9-B5D8-88083644E99A),\r
+    local, \r
+    helpstring("Created with CoCreateInstance().")\r
+] interface IDeckLinkVideoConversion : IUnknown\r
+{\r
+    HRESULT ConvertFrame([in] IDeckLinkVideoFrame* srcFrame, [in] IDeckLinkVideoFrame* dstFrame);\r
+};\r
+\r
+\r
+/* Interface IDeckLinkDeckControlStatusCallback - Deck control state change callback. */\r
+\r
+[\r
+    object,\r
+    uuid(E5F693C1-4283-4716-B18F-C1431521955B),\r
+    helpstring("Deck control state change callback.")\r
+] interface IDeckLinkDeckControlStatusCallback : IUnknown\r
+{\r
+    HRESULT TimecodeUpdate([in] BMDTimecodeBCD currentTimecode);\r
+    HRESULT VTRControlStateChanged([in] BMDDeckControlVTRControlState newState, [in] BMDDeckControlError error);\r
+    HRESULT DeckControlEventReceived([in] BMDDeckControlEvent event, [in] BMDDeckControlError error);\r
+    HRESULT DeckControlStatusChanged([in] BMDDeckControlStatusFlags flags, [in] unsigned long mask);\r
+};\r
+\r
+\r
+/* Interface IDeckLinkDeckControl - Deck Control main interface */\r
+\r
+[\r
+    object,\r
+    uuid(A4D81043-0619-42B7-8ED6-602D29041DF7),\r
+    helpstring("Deck Control main interface")\r
+] interface IDeckLinkDeckControl : IUnknown\r
+{\r
+    HRESULT Open([in] BMDTimeScale timeScale, [in] BMDTimeValue timeValue, [in] BOOL timecodeIsDropFrame, [out] BMDDeckControlError *error);\r
+    HRESULT Close([in] BOOL standbyOn);\r
+    HRESULT GetCurrentState([out] BMDDeckControlMode *mode, [out] BMDDeckControlVTRControlState *vtrControlState, [out] BMDDeckControlStatusFlags *flags);\r
+    HRESULT SetStandby([in] BOOL standbyOn);\r
+    HRESULT Play([out] BMDDeckControlError *error);\r
+    HRESULT Stop([out] BMDDeckControlError *error);\r
+    HRESULT TogglePlayStop([out] BMDDeckControlError *error);\r
+    HRESULT Eject([out] BMDDeckControlError *error);\r
+    HRESULT GoToTimecode([in] BMDTimecodeBCD timecode, [out] BMDDeckControlError *error);\r
+    HRESULT FastForward([in] BOOL viewTape, [out] BMDDeckControlError *error);\r
+    HRESULT Rewind([in] BOOL viewTape, [out] BMDDeckControlError *error);\r
+    HRESULT StepForward([out] BMDDeckControlError *error);\r
+    HRESULT StepBack([out] BMDDeckControlError *error);\r
+    HRESULT Jog([in] double rate, [out] BMDDeckControlError *error);\r
+    HRESULT Shuttle([in] double rate, [out] BMDDeckControlError *error);\r
+    HRESULT GetTimecodeString([out] BSTR *currentTimeCode, [out] BMDDeckControlError *error);\r
+    HRESULT GetTimecode([out] IDeckLinkTimecode **currentTimecode, [out] BMDDeckControlError *error);\r
+    HRESULT GetTimecodeBCD([out] BMDTimecodeBCD *currentTimecode, [out] BMDDeckControlError *error);\r
+    HRESULT SetPreroll([in] unsigned long prerollSeconds);\r
+    HRESULT GetPreroll([out] unsigned long *prerollSeconds);\r
+    HRESULT SetExportOffset([in] long exportOffsetFields);\r
+    HRESULT GetExportOffset([out] long *exportOffsetFields);\r
+    HRESULT GetManualExportOffset([out] long *deckManualExportOffsetFields);\r
+    HRESULT SetCaptureOffset([in] long captureOffsetFields);\r
+    HRESULT GetCaptureOffset([out] long *captureOffsetFields);\r
+    HRESULT StartExport([in] BMDTimecodeBCD inTimecode, [in] BMDTimecodeBCD outTimecode, [in] BMDDeckControlExportModeOpsFlags exportModeOps, [out] BMDDeckControlError *error);\r
+    HRESULT StartCapture([in] BOOL useVITC, [in] BMDTimecodeBCD inTimecode, [in] BMDTimecodeBCD outTimecode, [out] BMDDeckControlError *error);\r
+    HRESULT GetDeviceID([out] unsigned short *deviceId, [out] BMDDeckControlError *error);\r
+    HRESULT Abort(void);\r
+    HRESULT CrashRecordStart([out] BMDDeckControlError *error);\r
+    HRESULT CrashRecordStop([out] BMDDeckControlError *error);\r
+    HRESULT SetCallback([in] IDeckLinkDeckControlStatusCallback *callback);\r
+};\r
+\r
 \r
 /* Coclasses */\r
 \r
@@ -832,16 +1074,24 @@ importlib("stdole2.tlb");
 };\r
 \r
 [\r
-    uuid(D398CEE7-4434-4CA3-9BA6-5AE34556B905),\r
+    uuid(F63E77C7-B655-4A4A-9AD0-3CA85D394343),\r
     helpstring("CDeckLinkGLScreenPreviewHelper Class")\r
 ] coclass CDeckLinkGLScreenPreviewHelper\r
 {\r
     [default] interface IDeckLinkGLScreenPreviewHelper;\r
 };\r
 \r
-/* End Coclasses */\r
+[\r
+    uuid(7DBBBB11-5B7B-467D-AEA4-CEA468FD368C),\r
+    helpstring("CDeckLinkVideoConversion Class")\r
+] coclass CDeckLinkVideoConversion\r
+{\r
+    [default] interface IDeckLinkVideoConversion;\r
+};\r
+\r
 \r
 // import deprecated interfaces\r
-#include "DeckLinkAPI_v7_1.idl"\r
+#include "DeckLinkAPI_v7_6.idl"\r
 #include "DeckLinkAPI_v7_3.idl"\r
+#include "DeckLinkAPI_v7_1.idl"\r
 };\r
index 682b2007b09de3fb7ea34f3e2644230a9eb7955d..da367d6899a9407f25eb5c0d4f48ad91749eea8b 100644 (file)
@@ -43,7 +43,7 @@ interface IDeckLinkVideoInputFrame_v7_3;
     helpstring("Frame arrival callback.")
 ] interface IDeckLinkInputCallback_v7_3 : IUnknown
 {
-    HRESULT VideoInputFormatChanged([in] BMDVideoInputFormatChangedEvents notificationEvents, [in] IDeckLinkDisplayMode *newDisplayMode, [in] BMDDetectedVideoInputFormatFlags detectedSignalFlags);
+    HRESULT VideoInputFormatChanged([in] BMDVideoInputFormatChangedEvents notificationEvents, [in] IDeckLinkDisplayMode_v7_6 *newDisplayMode, [in] BMDDetectedVideoInputFormatFlags detectedSignalFlags);
     HRESULT VideoInputFrameArrived([in] IDeckLinkVideoInputFrame_v7_3 *videoFrame, [in] IDeckLinkAudioInputPacket *audioPacket);
 };
 
@@ -60,7 +60,7 @@ interface IDeckLinkVideoInputFrame_v7_3;
 ] interface IDeckLinkOutput_v7_3 : IUnknown
 {
     HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);
-    HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator **iterator);
+    HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator_v7_6 **iterator);
 
     HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback);
 
@@ -70,11 +70,11 @@ interface IDeckLinkVideoInputFrame_v7_3;
     HRESULT DisableVideoOutput(void);
 
     HRESULT SetVideoOutputFrameMemoryAllocator([in] IDeckLinkMemoryAllocator *theAllocator);
-    HRESULT CreateVideoFrame(long width, long height, long rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, [out] IDeckLinkMutableVideoFrame **outFrame);
-    HRESULT CreateAncillaryData(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] IDeckLinkVideoFrameAncillary **outBuffer);
+    HRESULT CreateVideoFrame(long width, long height, long rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, [out] IDeckLinkMutableVideoFrame_v7_6 **outFrame);
+    HRESULT CreateAncillaryData(BMDPixelFormat pixelFormat, [out] IDeckLinkVideoFrameAncillary **outBuffer);
 
-    HRESULT DisplayVideoFrameSync([in] IDeckLinkVideoFrame *theFrame);
-    HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale);
+    HRESULT DisplayVideoFrameSync([in] IDeckLinkVideoFrame_v7_6 *theFrame);
+    HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame_v7_6 *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale);
     HRESULT SetScheduledFrameCompletionCallback([in] IDeckLinkVideoOutputCallback *theCallback);
     HRESULT GetBufferedVideoFrameCount([out] unsigned long *bufferedFrameCount);
 
@@ -113,7 +113,7 @@ interface IDeckLinkVideoInputFrame_v7_3;
 ] interface IDeckLinkInput_v7_3 : IUnknown
 {
     HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);
-    HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator **iterator);
+    HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator_v7_6 **iterator);
 
     HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback);
 
@@ -148,7 +148,7 @@ interface IDeckLinkVideoInputFrame_v7_3;
     uuid(CF317790-2894-11DE-8C30-0800200C9A66),
     local, 
     helpstring("Provided by the IDeckLinkVideoInput frame arrival callback.")
-] interface IDeckLinkVideoInputFrame_v7_3 : IDeckLinkVideoFrame
+] interface IDeckLinkVideoInputFrame_v7_3 : IDeckLinkVideoFrame_v7_6
 {
     HRESULT GetStreamTime([out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration, BMDTimeScale timeScale);
 };
index a7270a186aa1a977635198e8992fd58181acca4d..df8004a54203d752d40f09f84383865264885928 100644 (file)
 \r
 namespace caspar { namespace core { namespace decklink{\r
 \r
-struct decklink_consumer::implementation : boost::noncopyable\r
+\r
+struct decklink_consumer::implementation : public IDeckLinkVideoOutputCallback, boost::noncopyable\r
 {                      \r
-       boost::unique_future<void> active_;\r
-       executor executor_;\r
+       struct co_init\r
+       {\r
+               co_init()\r
+               {\r
+                       if(FAILED(CoInitialize(nullptr))) \r
+                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Initialization of COM failed."));       \r
+               }\r
+               ~co_init()\r
+               {\r
+                       CoUninitialize();\r
+               }\r
+       } co_;\r
 \r
        std::array<std::pair<void*, CComPtr<IDeckLinkMutableVideoFrame>>, 3> reserved_frames_;\r
 \r
@@ -61,110 +72,137 @@ struct decklink_consumer::implementation : boost::noncopyable
        video_format::type current_format_;\r
        video_format_desc format_desc_;\r
 \r
+       BMDTimeScale frame_time_scale_;\r
+       BMDTimeValue frame_duration_;\r
+       unsigned long frames_scheduled_;\r
+\r
+       tbb::concurrent_bounded_queue<safe_ptr<const read_frame>> frame_buffer_;\r
+\r
 public:\r
        implementation(const video_format_desc& format_desc, size_t device_index, bool internalKey) \r
                : format_desc_(format_desc)\r
                , current_format_(video_format::pal)\r
                , internal_key(internalKey)\r
+               , frames_scheduled_(0)\r
        {       \r
-               executor_.start();\r
-               executor_.invoke([=]\r
-               {\r
-                       if(FAILED(CoInitialize(nullptr))) \r
-                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Initialization of COM failed."));               \r
+               CComPtr<IDeckLinkIterator> pDecklinkIterator;\r
+               if(FAILED(pDecklinkIterator.CoCreateInstance(CLSID_CDeckLinkIterator)))\r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: No Decklink drivers installed."));\r
 \r
-                       CComPtr<IDeckLinkIterator> pDecklinkIterator;\r
-                       if(FAILED(pDecklinkIterator.CoCreateInstance(CLSID_CDeckLinkIterator)))\r
-                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: No Decklink drivers installed."));\r
+               size_t n = 0;\r
+               while(n < device_index && pDecklinkIterator->Next(&decklink_) == S_OK){++n;}    \r
 \r
-                       size_t n = 0;\r
-                       while(n < device_index && pDecklinkIterator->Next(&decklink_) == S_OK){++n;}    \r
+               if(n != device_index || !decklink_)\r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: No Decklink card found.") << arg_name_info("device_index") << arg_value_info(boost::lexical_cast<std::string>(device_index)));\r
 \r
-                       if(n != device_index || !decklink_)\r
-                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: No Decklink card found.") << arg_name_info("device_index") << arg_value_info(boost::lexical_cast<std::string>(device_index)));\r
+               output_ = decklink_;\r
+               keyer_ = decklink_;\r
 \r
-                       output_ = decklink_;\r
-                       keyer_ = decklink_;\r
-\r
-                       BSTR pModelName;\r
-                       decklink_->GetModelName(&pModelName);\r
-                       if(pModelName != nullptr)\r
-                               CASPAR_LOG(info) << "DECKLINK: Modelname: " << pModelName;\r
+               BSTR pModelName;\r
+               decklink_->GetModelName(&pModelName);\r
+               if(pModelName != nullptr)\r
+                       CASPAR_LOG(info) << "DECKLINK: Modelname: " << pModelName;\r
                \r
-                       unsigned long decklinkVideoFormat = GetDecklinkVideoFormat(format_desc_.format);\r
-                       if(decklinkVideoFormat == ULONG_MAX\r
-                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Card does not support requested videoformat."));\r
+               auto display_mode = get_display_mode(output_.p, format_desc_.format);\r
+               if(display_mode == nullptr\r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Card does not support requested videoformat."));\r
                \r
-                       current_format_ = format_desc_.format;\r
+               display_mode->GetFrameRate(&frame_duration_, &frame_time_scale_);\r
+               current_format_ = format_desc_.format;\r
 \r
-                       BMDDisplayModeSupport displayModeSupport;\r
-                       if(FAILED(output_->DoesSupportVideoMode((BMDDisplayMode)decklinkVideoFormat, bmdFormat8BitBGRA, &displayModeSupport)))\r
-                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Card does not support requested videoformat."));\r
+               BMDDisplayModeSupport displayModeSupport;\r
+               if(FAILED(output_->DoesSupportVideoMode(display_mode->GetDisplayMode(), bmdFormat8BitBGRA, &displayModeSupport)))\r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Card does not support requested videoformat."));\r
                \r
-                       output_->DisableAudioOutput();\r
-                       if(FAILED(output_->EnableVideoOutput((BMDDisplayMode)decklinkVideoFormat, bmdVideoOutputFlagDefault))) \r
-                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Could not enable video output."));\r
-\r
-                       if(internal_key) \r
-                       {\r
-                               if(FAILED(keyer_->Enable(FALSE)))                       \r
-                                       CASPAR_LOG(error) << "DECKLINK: Failed to enable internal keye.r";                      \r
-                               else if(FAILED(keyer_->SetLevel(255)))                  \r
-                                       CASPAR_LOG(error) << "DECKLINK: Keyer - Failed to set key-level to max.";\r
-                               else\r
-                                       CASPAR_LOG(info) << "DECKLINK: Successfully configured internal keyer.";                \r
-                       }\r
+               output_->DisableAudioOutput();\r
+\r
+               if(FAILED(output_->EnableVideoOutput(display_mode->GetDisplayMode(), bmdVideoOutputFlagDefault))) \r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Could not enable video output."));\r
+\r
+               if(FAILED(output_->SetScheduledFrameCompletionCallback(this)))\r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Failed to set playback completion callback."));\r
+                       \r
+               if(internal_key) \r
+               {\r
+                       if(FAILED(keyer_->Enable(FALSE)))                       \r
+                               CASPAR_LOG(error) << "DECKLINK: Failed to enable internal keye.r";                      \r
+                       else if(FAILED(keyer_->SetLevel(255)))                  \r
+                               CASPAR_LOG(error) << "DECKLINK: Keyer - Failed to set key-level to max.";\r
+                       else\r
+                               CASPAR_LOG(info) << "DECKLINK: Successfully configured internal keyer.";                \r
+               }\r
+               else\r
+               {\r
+                       if(FAILED(keyer_->Enable(TRUE)))                        \r
+                               CASPAR_LOG(error) << "DECKLINK: Failed to enable external keyer.";      \r
                        else\r
-                       {\r
-                               if(FAILED(keyer_->Enable(TRUE)))                        \r
-                                       CASPAR_LOG(error) << "DECKLINK: Failed to enable external keyer.";      \r
-                               else\r
-                                       CASPAR_LOG(info) << "DECKLINK: Successfully configured external keyer.";                        \r
-                       }\r
+                               CASPAR_LOG(info) << "DECKLINK: Successfully configured external keyer.";                        \r
+               }\r
                \r
-                       for(size_t n = 0; n < reserved_frames_.size(); ++n)\r
-                       {\r
-                               if(FAILED(output_->CreateVideoFrame(format_desc_.width, format_desc_.height, format_desc_.size/format_desc_.height, bmdFormat8BitBGRA, bmdFrameFlagDefault, &reserved_frames_[n].second)))\r
-                                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Failed to create frame."));\r
-\r
-                               if(FAILED(reserved_frames_[n].second->GetBytes(&reserved_frames_[n].first)))\r
-                                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Failed to get frame bytes."));\r
-                       }\r
-\r
-                       CASPAR_LOG(info) << "DECKLINK: Successfully initialized decklink for " << format_desc_.name;\r
-               });\r
-               active_ = executor_.begin_invoke([]{});\r
+               for(size_t n = 0; n < reserved_frames_.size(); ++n)\r
+               {\r
+                       if(FAILED(output_->CreateVideoFrame(format_desc_.width, format_desc_.height, format_desc_.size/format_desc_.height, bmdFormat8BitBGRA, bmdFrameFlagDefault, &reserved_frames_[n].second)))\r
+                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Failed to create frame."));\r
+\r
+                       if(FAILED(reserved_frames_[n].second->GetBytes(&reserved_frames_[n].first)))\r
+                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Failed to get frame bytes."));\r
+               }\r
+                                       \r
+               auto frame_rate = static_cast<size_t>(frame_time_scale_/frame_duration_);\r
+               for(size_t n = 0; n < frame_rate; ++n)\r
+                       schedule_next_frame(safe_ptr<const read_frame>());\r
+\r
+               frame_buffer_.set_capacity(frame_rate);\r
+               for(size_t n = 0; n < frame_rate/2; ++n)\r
+                       frame_buffer_.try_push(safe_ptr<const read_frame>());\r
+                                               \r
+               if(FAILED(output_->StartScheduledPlayback(0, frame_time_scale_, 1.0))) \r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Failed to schedule playback."));\r
+\r
+               CASPAR_LOG(info) << "DECKLINK: Successfully initialized decklink for " << format_desc_.name;            \r
        }\r
 \r
        ~implementation()\r
-       {                               \r
-               executor_.invoke([this]\r
+       {                       \r
+               if(output_ != nullptr) \r
                {\r
-                       if(output_ != nullptr) \r
-                               output_->DisableVideoOutput();\r
-\r
-                       for(size_t n = 0; n < reserved_frames_.size(); ++n)\r
-                               reserved_frames_[n].second.Release();\r
+                       output_->StopScheduledPlayback(0, nullptr, static_cast<int>(format_desc_.fps));\r
+                       output_->DisableVideoOutput();\r
+               }\r
+       }\r
+       \r
+       virtual HRESULT STDMETHODCALLTYPE       QueryInterface (REFIID, LPVOID*)        {return E_NOINTERFACE;}\r
+       virtual ULONG STDMETHODCALLTYPE         AddRef ()                                                       {return 1;}\r
+       virtual ULONG STDMETHODCALLTYPE         Release ()                                                      {return 1;}\r
+       \r
+       virtual HRESULT STDMETHODCALLTYPE ScheduledFrameCompleted (IDeckLinkVideoFrame* /*completedFrame*/, BMDOutputFrameCompletionResult /*result*/)\r
+       {\r
+               safe_ptr<const read_frame> frame;               \r
+               frame_buffer_.pop(frame);               \r
+               schedule_next_frame(frame);\r
+               return S_OK;\r
+       }\r
 \r
-                       keyer_.Release();\r
-                       output_.Release();\r
-                       decklink_.Release();\r
-                       CoUninitialize();\r
-               });\r
+       virtual HRESULT STDMETHODCALLTYPE ScheduledPlaybackHasStopped (void)\r
+       {\r
+               return S_OK;\r
        }\r
        \r
-       void send(const safe_ptr<const read_frame>& frame)\r
+       void schedule_next_frame(const safe_ptr<const read_frame>& frame)\r
        {\r
-               active_.get();\r
-               active_ = executor_.begin_invoke([=]\r
-               {               \r
+               if(!frame->image_data().empty())\r
                        std::copy(frame->image_data().begin(), frame->image_data().end(), static_cast<char*>(reserved_frames_.front().first));\r
-                               \r
-                       if(FAILED(output_->DisplayVideoFrameSync(reserved_frames_.front().second)))\r
-                               CASPAR_LOG(error) << L"DECKLINK: Failed to display frame.";\r
+               else\r
+                       std::fill_n(static_cast<int*>(reserved_frames_.front().first), 0, format_desc_.size/4);\r
 \r
-                       std::rotate(reserved_frames_.begin(), reserved_frames_.begin() + 1, reserved_frames_.end());\r
-               });\r
+               if(FAILED(output_->ScheduleVideoFrame(reserved_frames_.front().second, (frames_scheduled_++) * frame_duration_, frame_duration_, frame_time_scale_)))\r
+                       CASPAR_LOG(error) << L"DECKLINK: Failed to display frame.";\r
+               std::rotate(reserved_frames_.begin(), reserved_frames_.begin() + 1, reserved_frames_.end());\r
+       }\r
+\r
+       void send(const safe_ptr<const read_frame>& frame)\r
+       {\r
+               frame_buffer_.push(frame);\r
        }\r
 \r
        size_t buffer_depth() const\r
index 588cd83bc0770aadbc8f05ffb59839afeb1294b1..0f11201e621f0808fb8de9ac6420b5a474da281b 100644 (file)
@@ -6,14 +6,14 @@
 \r
 namespace caspar { namespace core { namespace decklink {\r
        \r
-static unsigned long GetDecklinkVideoFormat(video_format::type fmt) \r
+static BMDDisplayMode GetDecklinkVideoFormat(video_format::type fmt) \r
 {\r
        switch(fmt)\r
        {\r
        case video_format::pal:                 return bmdModePAL;\r
        //case video_format::ntsc:              return bmdModeNTSC;\r
        //case video_format::x576p2500: return ULONG_MAX;\r
-       case video_format::x720p2500:   return ULONG_MAX;\r
+       case video_format::x720p2500:   return (BMDDisplayMode)ULONG_MAX;\r
        case video_format::x720p5000:   return bmdModeHD720p50;\r
        //case video_format::x720p5994: return bmdModeHD720p5994;\r
        //case video_format::x720p6000: return bmdModeHD720p60;\r
@@ -25,8 +25,30 @@ static unsigned long GetDecklinkVideoFormat(video_format::type fmt)
        case video_format::x1080p2500:  return bmdModeHD1080p25;\r
        //case video_format::x1080p2997:        return bmdModeHD1080p2997;\r
        //case video_format::x1080p3000:        return bmdModeHD1080p30;\r
-       default:                                                return ULONG_MAX;\r
+       default:                                                return (BMDDisplayMode)ULONG_MAX;\r
        }\r
 }\r
+       \r
+static IDeckLinkDisplayMode* get_display_mode(IDeckLinkOutput* output, BMDDisplayMode format)\r
+{\r
+       IDeckLinkDisplayModeIterator*           iterator;\r
+       IDeckLinkDisplayMode*                           mode;\r
+       \r
+       if(FAILED(output->GetDisplayModeIterator(&iterator)))\r
+               return nullptr;\r
+\r
+       while(SUCCEEDED(iterator->Next(&mode)) && mode != nullptr)\r
+       {       \r
+               if(mode->GetDisplayMode() == format)\r
+                       return mode;\r
+       }\r
+       iterator->Release();\r
+       return nullptr;\r
+}\r
+\r
+static IDeckLinkDisplayMode* get_display_mode(IDeckLinkOutput* output, video_format::type fmt)\r
+{\r
+       return get_display_mode(output, GetDecklinkVideoFormat(fmt));\r
+}\r
 \r
 }}}
\ No newline at end of file
index 7d8ab2baa71589476a612d2ca851d3b74179baf4..697ad2f5469c4afb7e3a89d7d6f891ad50cc5107 100644 (file)
   </ItemGroup>\r
   <ItemGroup>\r
     <Midl Include="consumer\decklink\DeckLinkAPI.idl">\r
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
     </Midl>\r
     <Midl Include="consumer\decklink\DeckLinkAPI_v7_1.idl">\r
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
     </Midl>\r
     <Midl Include="consumer\decklink\DeckLinkAPI_v7_3.idl">\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
+    </Midl>\r
+    <Midl Include="consumer\decklink\DeckLinkAPI_v7_6.idl">\r
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
     </Midl>\r
     <Midl Include="producer\flash\Flash9e.IDL">\r
       <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
index 867feb07f991c62486d6fc09609eac45369d1b2d..13690d4c2cb4f1c02d8b4e61bfb63d88f26fbf84 100644 (file)
     </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
-    <Midl Include="consumer\decklink\DeckLinkAPI_v7_3.idl">\r
+    <Midl Include="producer\flash\Flash9e.IDL">\r
+      <Filter>Source\producer\flash\interop</Filter>\r
+    </Midl>\r
+    <Midl Include="consumer\decklink\DeckLinkAPI_v7_6.idl">\r
       <Filter>Source\consumer\decklink\interop</Filter>\r
     </Midl>\r
     <Midl Include="consumer\decklink\DeckLinkAPI.idl">\r
     <Midl Include="consumer\decklink\DeckLinkAPI_v7_1.idl">\r
       <Filter>Source\consumer\decklink\interop</Filter>\r
     </Midl>\r
-    <Midl Include="producer\flash\Flash9e.IDL">\r
-      <Filter>Source\producer\flash\interop</Filter>\r
+    <Midl Include="consumer\decklink\DeckLinkAPI_v7_3.idl">\r
+      <Filter>Source\consumer\decklink\interop</Filter>\r
     </Midl>\r
   </ItemGroup>\r
   <ItemGroup>\r
index dbb258a5cdedc2e5c3bc352184a6c7c168960553..ccab6660f8bb134829fcbdd286f8c65742e98cba 100644 (file)
@@ -48,13 +48,25 @@ namespace caspar { namespace core {
 \r
 class decklink_input : public IDeckLinkInputCallback\r
 {\r
+       struct co_init\r
+       {\r
+               co_init()\r
+               {\r
+                       if(FAILED(CoInitialize(nullptr))) \r
+                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("DECKLINK: Initialization of COM failed."));       \r
+               }\r
+               ~co_init()\r
+               {\r
+                       CoUninitialize();\r
+               }\r
+       } co_;\r
+\r
        const video_format_desc format_desc_;\r
        const size_t device_index_;\r
 \r
        CComPtr<IDeckLink>                      decklink_;\r
        CComQIPtr<IDeckLinkInput>       input_;\r
 \r
-       tbb::atomic<ULONG> ref_count_;\r
        std::shared_ptr<frame_processor_device> frame_processor_;\r
 \r
        tbb::concurrent_bounded_queue<safe_ptr<draw_frame>> frame_buffer_;\r
@@ -70,7 +82,6 @@ public:
                , head_(draw_frame::empty())\r
                , tail_(draw_frame::empty())\r
        {\r
-               ref_count_ = 1;\r
                frame_buffer_.set_capacity(4);\r
                \r
                CComPtr<IDeckLinkIterator> pDecklinkIterator;\r
@@ -119,45 +130,11 @@ public:
                        input_->DisableVideoInput();\r
                }\r
        }\r
-       \r
-       virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID *ppv)\r
-       {\r
-               HRESULT result = E_NOINTERFACE; \r
-               *ppv = NULL;\r
-       \r
-               if (iid == IID_IUnknown)\r
-               {\r
-                       *ppv = this;\r
-                       AddRef();\r
-                       result = S_OK;\r
-               }\r
-               else if (iid == IID_IDeckLinkInputCallback)\r
-               {\r
-                       *ppv = (IDeckLinkInputCallback*)this;\r
-                       AddRef();\r
-                       result = S_OK;\r
-               }\r
-       \r
-               return result;\r
-       }\r
 \r
-       virtual ULONG STDMETHODCALLTYPE AddRef(void)\r
-       {\r
-               return ++ref_count_;\r
-       }\r
-\r
-       virtual ULONG STDMETHODCALLTYPE Release(void)\r
-       {       \r
-               auto new_ref_count = --ref_count_;\r
-               if (new_ref_count == 0)\r
-               {\r
-                       delete this;\r
-                       return 0;\r
-               }\r
-       \r
-               return new_ref_count;\r
-       }\r
-       \r
+       virtual HRESULT STDMETHODCALLTYPE       QueryInterface (REFIID, LPVOID*)        {return E_NOINTERFACE;}\r
+       virtual ULONG STDMETHODCALLTYPE         AddRef ()                                                       {return 1;}\r
+       virtual ULONG STDMETHODCALLTYPE         Release ()                                                      {return 1;}\r
+               \r
        virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged(BMDVideoInputFormatChangedEvents /*notificationEvents*/, IDeckLinkDisplayMode* /*newDisplayMode*/, BMDDetectedVideoInputFormatFlags /*detectedSignalFlags*/)\r
        {\r
                return S_OK;\r
@@ -233,8 +210,7 @@ public:
        {       \r
                executor_.invoke([this]\r
                {\r
-                       input_.reset();\r
-                       CoUninitialize();\r
+                       input_ = nullptr;\r
                });\r
        }\r
        \r
@@ -248,8 +224,6 @@ public:
                executor_.start();\r
                executor_.invoke([=]\r
                {\r
-                       if(FAILED(CoInitialize(nullptr))) \r
-                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("decklink_producer: Initialization of COM failed."));              \r
                        input_.reset(new decklink_input(device_index_, format_desc_, frame_processor));\r
                });\r
        }\r
index 2178de5505809b623fcb9b506e7f6ef6474f888a..585e31dffe076b7a7a4c8bbef7607c679556479c 100644 (file)
@@ -46,6 +46,19 @@ extern __declspec(selectany) CAtlModule* _pAtlModule = &_AtlModule;
 \r
 class flash_renderer\r
 {\r
+       struct co_init\r
+       {\r
+               co_init()\r
+               {\r
+                       if(FAILED(CoInitialize(nullptr))) \r
+                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Initialization of COM failed.")); \r
+               }\r
+               ~co_init()\r
+               {\r
+                       CoUninitialize();\r
+               }\r
+       } co_;\r
+\r
        std::wstring filename_;\r
        std::shared_ptr<frame_processor_device> frame_processor_;\r
        video_format_desc format_desc_;\r
@@ -173,12 +186,7 @@ struct flash_producer::implementation
                , tail_(draw_frame::empty())\r
        {       \r
                if(!boost::filesystem::exists(filename))\r
-                       BOOST_THROW_EXCEPTION(file_not_found() << boost::errinfo_file_name(narrow(filename)));\r
-               \r
-               executor_.begin_invoke([=]\r
-               {\r
-                       ::OleInitialize(nullptr);\r
-               });\r
+                       BOOST_THROW_EXCEPTION(file_not_found() << boost::errinfo_file_name(narrow(filename)));          \r
        }\r
 \r
        ~implementation()\r
@@ -187,7 +195,6 @@ struct flash_producer::implementation
                executor_.invoke([=]\r
                {\r
                        renderer_ = nullptr;\r
-                       ::OleUninitialize();\r
                });\r
        }\r
 \r
index 21f6dfca4b761c6ec46b07578ee1690c9b7d4910..e6922e301d32efecac048ce47cda6b7f62cc134f 100644 (file)
 \r
 #include <array>\r
 \r
-#define DEFINE_VIDEOFORMATDESC(w, h, m, f, s, fmt) { (fmt), (w), (h), (m), (m == video_mode::progressive ? f : f/2.0), (1.0/(m == video_mode::progressive ? f : f/2.0)), ((w)*(h)*4), (s) }\r
+#define DEFINE_VIDEOFORMATDESC(w, h, m, f, s, fmt, t, d) { (fmt), (w), (h), (m), (m == video_mode::progressive ? f : f/2.0), (1.0/(m == video_mode::progressive ? f : f/2.0)), ((w)*(h)*4), (s), (t), (d) }\r
 \r
 namespace caspar { namespace core {\r
        \r
 const video_format_desc format_descs[video_format::invalid] =  \r
 {                                                                         \r
-       DEFINE_VIDEOFORMATDESC(720,  576,  video_mode::upper,                   50,                     TEXT("PAL"),            video_format::pal               ), \r
+       DEFINE_VIDEOFORMATDESC(720,  576,  video_mode::upper,                   50,                     TEXT("PAL"),            video_format::pal               , 25, 1), \r
        //DEFINE_VIDEOFORMATDESC(720,  486,  video_mode::lower,                 60/1.001,       TEXT("NTSC"),           video_format::ntsc              ), \r
        //DEFINE_VIDEOFORMATDESC(720,  576,  video_mode::progressive,           25,                     TEXT("576p2500"),       video_format::x576p2500 ),\r
-       DEFINE_VIDEOFORMATDESC(1280, 720,  video_mode::progressive,             25,                     TEXT("720p2500"),       video_format::x720p2500 ), \r
-       DEFINE_VIDEOFORMATDESC(1280, 720,  video_mode::progressive,             50,                     TEXT("720p5000"),       video_format::x720p5000 ), \r
+       DEFINE_VIDEOFORMATDESC(1280, 720,  video_mode::progressive,             25,                     TEXT("720p2500"),       video_format::x720p2500 , 25, 1), \r
+       DEFINE_VIDEOFORMATDESC(1280, 720,  video_mode::progressive,             50,                     TEXT("720p5000"),       video_format::x720p5000 , 50, 1), \r
        //DEFINE_VIDEOFORMATDESC(1280, 720,  video_mode::progressive,   60/1.001,       TEXT("720p5994"),       video_format::x720p5994 ),\r
        //DEFINE_VIDEOFORMATDESC(1280, 720,  video_mode::progressive,   60,                     TEXT("720p6000"),       video_format::x720p6000 ),\r
        //DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,   24/1.001,       TEXT("1080p2397"),      video_format::x1080p2397),\r
        //DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,   24,                     TEXT("1080p2400"),      video_format::x1080p2400),\r
-       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::upper,                   50,                     TEXT("1080i5000"),      video_format::x1080i5000),\r
+       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::upper,                   50,                     TEXT("1080i5000"),      video_format::x1080i5000, 25, 1),\r
        //DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::upper,                 60/1.001,       TEXT("1080i5994"),      video_format::x1080i5994),\r
        //DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::upper,                 60,                     TEXT("1080i6000"),      video_format::x1080i6000),\r
-       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,             25,                     TEXT("1080p2500"),      video_format::x1080p2500),\r
+       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,             25,                     TEXT("1080p2500"),      video_format::x1080p2500, 25, 1),\r
        //DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,   30/1.001,       TEXT("1080p2997"),      video_format::x1080p2997),\r
        //DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive,   30,                     TEXT("1080p3000"),      video_format::x1080p3000),\r
-       DEFINE_VIDEOFORMATDESC(0,               0, video_mode::invalid,                 -1,                     TEXT("invalid"),        video_format::invalid)\r
+       DEFINE_VIDEOFORMATDESC(0,               0, video_mode::invalid,                 -1,                     TEXT("invalid"),        video_format::invalid,    0, 0)\r
 };\r
 \r
 const video_format_desc& video_format_desc::get(video_format::type format)     \r
index bdcf3f8ac47d1167baf294e062e77968f7013337..8caa42c12a99b5b9b8e6d5c0a09005b5d9db4b9f 100644 (file)
@@ -53,6 +53,8 @@ struct video_format_desc
        double                                  interval;       // time between frames\r
        size_t                                  size;           // output frame size in bytes \r
        std::wstring                    name;           // name of output format\r
+       size_t                                  time_scale;\r
+       size_t                                  display_duration;\r
 \r
        static const video_format_desc& get(video_format::type format);\r
        static const video_format_desc& get(const std::wstring& name);\r
index c5bf77c4b1d9c68c395ea45472ee967f02381dda..60a8db7b9b41a36253af0d443ce0780d82db2b36 100644 (file)
     <channel>\r
       <videomode>PAL</videomode>\r
       <consumers>\r
-        <bluefish>\r
+        <!--bluefish>\r
           <device>1</device> \r
           <embedded-audio>true</embedded-audio>\r
-        </bluefish>\r
+        </bluefish-->\r
+        <decklink>\r
+          <device>1</device>\r
+        </decklink>\r
       </consumers>\r
     </channel>\r
     <channel>\r