]> git.sesse.net Git - casparcg/commitdiff
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
authorZebiolo <Zebiolo@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 30 Sep 2010 07:32:28 +0000 (07:32 +0000)
committerZebiolo <Zebiolo@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Thu, 30 Sep 2010 07:32:28 +0000 (07:32 +0000)
102 files changed:
core/Server.vcxproj [new file with mode: 0644]
core/Server.vcxproj.ampl.cfg [new file with mode: 0644]
core/Server.vcxproj.filters [new file with mode: 0644]
core/Server.vcxproj.insp.cfg [new file with mode: 0644]
core/Server.vcxproj.user [new file with mode: 0644]
core/StdAfx.cpp [new file with mode: 0644]
core/StdAfx.h [new file with mode: 0644]
core/caspar.config [new file with mode: 0644]
core/config.h [new file with mode: 0644]
core/consumer/bluefish/BlueFishVideoConsumer.cpp [new file with mode: 0644]
core/consumer/bluefish/BlueFishVideoConsumer.h [new file with mode: 0644]
core/consumer/bluefish/BluefishException.h [new file with mode: 0644]
core/consumer/bluefish/BluefishFrameManager.cpp [new file with mode: 0644]
core/consumer/bluefish/BluefishFrameManager.h [new file with mode: 0644]
core/consumer/bluefish/BluefishPlaybackStrategy.cpp [new file with mode: 0644]
core/consumer/bluefish/BluefishPlaybackStrategy.h [new file with mode: 0644]
core/consumer/decklink/DeckLinkAPI.idl [new file with mode: 0644]
core/consumer/decklink/DeckLinkAPI_h.h [new file with mode: 0644]
core/consumer/decklink/DeckLinkAPI_i.c [new file with mode: 0644]
core/consumer/decklink/DeckLinkAPI_v7_1.idl [new file with mode: 0644]
core/consumer/decklink/DeckLinkAPI_v7_3.idl [new file with mode: 0644]
core/consumer/decklink/DecklinkVideoConsumer.cpp [new file with mode: 0644]
core/consumer/decklink/DecklinkVideoConsumer.h [new file with mode: 0644]
core/consumer/frame_consumer.h [new file with mode: 0644]
core/consumer/oal/oal_frame_consumer.cpp [new file with mode: 0644]
core/consumer/oal/oal_frame_consumer.h [new file with mode: 0644]
core/consumer/ogl/ogl_frame_consumer.cpp [new file with mode: 0644]
core/consumer/ogl/ogl_frame_consumer.h [new file with mode: 0644]
core/frame/audio_chunk.cpp [new file with mode: 0644]
core/frame/audio_chunk.h [new file with mode: 0644]
core/frame/bitmap_frame.cpp [new file with mode: 0644]
core/frame/bitmap_frame.h [new file with mode: 0644]
core/frame/frame.h [new file with mode: 0644]
core/frame/frame_format.cpp [new file with mode: 0644]
core/frame/frame_format.h [new file with mode: 0644]
core/frame/frame_fwd.h [new file with mode: 0644]
core/frame/system_frame.cpp [new file with mode: 0644]
core/frame/system_frame.h [new file with mode: 0644]
core/main.cpp [new file with mode: 0644]
core/producer/color/color_producer.cpp [new file with mode: 0644]
core/producer/color/color_producer.h [new file with mode: 0644]
core/producer/ffmpeg/audio/audio_decoder.cpp [new file with mode: 0644]
core/producer/ffmpeg/audio/audio_decoder.h [new file with mode: 0644]
core/producer/ffmpeg/ffmpeg_producer.cpp [new file with mode: 0644]
core/producer/ffmpeg/ffmpeg_producer.h [new file with mode: 0644]
core/producer/ffmpeg/input.cpp [new file with mode: 0644]
core/producer/ffmpeg/input.h [new file with mode: 0644]
core/producer/ffmpeg/packet.h [new file with mode: 0644]
core/producer/ffmpeg/video/video_decoder.cpp [new file with mode: 0644]
core/producer/ffmpeg/video/video_decoder.h [new file with mode: 0644]
core/producer/ffmpeg/video/video_deinterlacer.cpp [new file with mode: 0644]
core/producer/ffmpeg/video/video_deinterlacer.h [new file with mode: 0644]
core/producer/ffmpeg/video/video_scaler.cpp [new file with mode: 0644]
core/producer/ffmpeg/video/video_scaler.h [new file with mode: 0644]
core/producer/flash/Flash9e.IDL [new file with mode: 0644]
core/producer/flash/Flash9e_i.c [new file with mode: 0644]
core/producer/flash/FlashAxContainer.cpp [new file with mode: 0644]
core/producer/flash/FlashAxContainer.h [new file with mode: 0644]
core/producer/flash/TimerHelper.h [new file with mode: 0644]
core/producer/flash/axflash.h [new file with mode: 0644]
core/producer/flash/cg_producer.cpp [new file with mode: 0644]
core/producer/flash/cg_producer.h [new file with mode: 0644]
core/producer/flash/ct_producer.cpp [new file with mode: 0644]
core/producer/flash/ct_producer.h [new file with mode: 0644]
core/producer/flash/flash_producer.cpp [new file with mode: 0644]
core/producer/flash/flash_producer.h [new file with mode: 0644]
core/producer/frame_producer.h [new file with mode: 0644]
core/producer/image/image_loader.cpp [new file with mode: 0644]
core/producer/image/image_loader.h [new file with mode: 0644]
core/producer/image/image_producer.cpp [new file with mode: 0644]
core/producer/image/image_producer.h [new file with mode: 0644]
core/producer/image/image_scroll_producer.cpp [new file with mode: 0644]
core/producer/image/image_scroll_producer.h [new file with mode: 0644]
core/producer/transition/transition_producer.cpp [new file with mode: 0644]
core/producer/transition/transition_producer.h [new file with mode: 0644]
core/protocol/amcp/AMCPCommand.h [new file with mode: 0644]
core/protocol/amcp/AMCPCommandQueue.cpp [new file with mode: 0644]
core/protocol/amcp/AMCPCommandQueue.h [new file with mode: 0644]
core/protocol/amcp/AMCPCommandsImpl.cpp [new file with mode: 0644]
core/protocol/amcp/AMCPCommandsImpl.h [new file with mode: 0644]
core/protocol/amcp/AMCPProtocolStrategy.cpp [new file with mode: 0644]
core/protocol/amcp/AMCPProtocolStrategy.h [new file with mode: 0644]
core/protocol/cii/CIICommand.h [new file with mode: 0644]
core/protocol/cii/CIICommandsImpl.cpp [new file with mode: 0644]
core/protocol/cii/CIICommandsImpl.h [new file with mode: 0644]
core/protocol/cii/CIIProtocolStrategy.cpp [new file with mode: 0644]
core/protocol/cii/CIIProtocolStrategy.h [new file with mode: 0644]
core/protocol/clk/CLKCommand.cpp [new file with mode: 0644]
core/protocol/clk/CLKCommand.h [new file with mode: 0644]
core/protocol/clk/CLKProtocolStrategy.cpp [new file with mode: 0644]
core/protocol/clk/CLKProtocolStrategy.h [new file with mode: 0644]
core/protocol/media.cpp [new file with mode: 0644]
core/protocol/media.h [new file with mode: 0644]
core/protocol/monitor/Monitor.cpp [new file with mode: 0644]
core/protocol/monitor/Monitor.h [new file with mode: 0644]
core/renderer/layer.cpp [new file with mode: 0644]
core/renderer/layer.h [new file with mode: 0644]
core/renderer/render_device.cpp [new file with mode: 0644]
core/renderer/render_device.h [new file with mode: 0644]
core/renderer/renderer_fwd.h [new file with mode: 0644]
core/server.cpp [new file with mode: 0644]
core/server.h [new file with mode: 0644]

diff --git a/core/Server.vcxproj b/core/Server.vcxproj
new file mode 100644 (file)
index 0000000..3a2428c
--- /dev/null
@@ -0,0 +1,613 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="no bluefish|Win32">\r
+      <Configuration>no bluefish</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="ReleaseProfiling|Win32">\r
+      <Configuration>ReleaseProfiling</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{79388C20-6499-4BF6-B8B9-D8C33D7D4DDD}</ProjectGuid>\r
+    <RootNamespace>Server</RootNamespace>\r
+    <Keyword>Win32Proj</Keyword>\r
+    <ProjectName>server</ProjectName>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <WholeProgramOptimization>true</WholeProgramOptimization>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>Application</ConfigurationType>\r
+    <CharacterSet>Unicode</CharacterSet>\r
+    <UseIntelTBB>true</UseIntelTBB>\r
+    <InstrumentIntelTBB>false</InstrumentIntelTBB>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">\r
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />\r
+  </ImportGroup>\r
+  <PropertyGroup Label="UserMacros" />\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(ProjectDir)build\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">debug\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(ProjectDir)build\</OutDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">$(ProjectDir)build\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">release\</IntDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">release\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">false</LinkIncremental>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">$(SolutionDir)$(Configuration)\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">$(Configuration)\</IntDir>\r
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">false</LinkIncremental>\r
+    <SourcePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">C:\Lokala Filer\SDK\ffmpeg\src\ffmpeg-export-2008-11-05\libavcodec\i386;$(SourcePath)</SourcePath>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <PreBuildEvent>\r
+      <Command>\r
+      </Command>\r
+    </PreBuildEvent>\r
+    <ClCompile>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <MinimalRebuild>true</MinimalRebuild>\r
+      <ExceptionHandling>Async</ExceptionHandling>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <SmallerTypeCheck>true</SmallerTypeCheck>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>\r
+      <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
+      <PrecompiledHeader>Use</PrecompiledHeader>\r
+      <BrowseInformation>true</BrowseInformation>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;TBB_USE_THREADING_TOOLS=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <TreatWarningAsError>true</TreatWarningAsError>\r
+    </ClCompile>\r
+    <Link>\r
+      <AdditionalDependencies>sfml-audio-d.lib;sfml-window-d.lib;OpenGL32.lib;FreeImage.lib;GLee.lib;Dxguid.lib;Dsound.lib;Winmm.lib;Ws2_32.lib;BlueVelvet3_d.lib;avformat-52.lib;avcodec-52.lib;avutil-50.lib;swscale-0.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <Version>\r
+      </Version>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <IgnoreSpecificDefaultLibraries>LIBC.LIB;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName).pdb</ProgramDatabaseFile>\r
+      <GenerateMapFile>true</GenerateMapFile>\r
+      <MapFileName>\r
+      </MapFileName>\r
+      <SubSystem>Console</SubSystem>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <PreBuildEvent>\r
+      <Command>\r
+      </Command>\r
+    </PreBuildEvent>\r
+    <ClCompile>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <ExceptionHandling>Async</ExceptionHandling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
+      <PrecompiledHeader>Use</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
+      <PreprocessorDefinitions>NDEBUG;_VC80_UPGRADE=0x0710;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <PreLinkEvent>\r
+      <Command>\r
+      </Command>\r
+    </PreLinkEvent>\r
+    <Link>\r
+      <AdditionalDependencies>sfml-audio.lib;sfml-window.lib;OpenGL32.lib;FreeImage.lib;Dxguid.lib;Dsound.lib;Winmm.lib;Ws2_32.lib;Bluevelvet3.lib;avformat-52.lib;avcodec-52.lib;avutil-50.lib;SWSCALE-0.lib;tbb.lib;Glee.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <Version>\r
+      </Version>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <IgnoreSpecificDefaultLibraries>LIBC.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <GenerateMapFile>true</GenerateMapFile>\r
+      <MapExports>true</MapExports>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>\r
+      </OptimizeReferences>\r
+      <EnableCOMDATFolding>\r
+      </EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <FixedBaseAddress>false</FixedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">\r
+    <PreBuildEvent>\r
+      <Command>\r
+      </Command>\r
+    </PreBuildEvent>\r
+    <ClCompile>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <ExceptionHandling>Async</ExceptionHandling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
+      <PrecompiledHeader>Use</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
+      <PreprocessorDefinitions>TBB_USE_THREADING_TOOLS=1;NDEBUG;_VC80_UPGRADE=0x0710;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <PreLinkEvent>\r
+      <Command>\r
+      </Command>\r
+    </PreLinkEvent>\r
+    <Link>\r
+      <AdditionalDependencies>OpenGL32.lib;FreeImage.lib;Dxguid.lib;Dsound.lib;Winmm.lib;Ws2_32.lib;Bluevelvet3.lib;avformat-52.lib;avcodec-52.lib;avutil-50.lib;SWSCALE-0.lib;tbb.lib;Glee.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <Version>\r
+      </Version>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <IgnoreSpecificDefaultLibraries>LIBC.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <GenerateMapFile>true</GenerateMapFile>\r
+      <MapExports>true</MapExports>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>\r
+      </OptimizeReferences>\r
+      <EnableCOMDATFolding>\r
+      </EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <FixedBaseAddress>false</FixedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">\r
+    <PreBuildEvent>\r
+      <Command>\r
+      </Command>\r
+    </PreBuildEvent>\r
+    <ClCompile>\r
+      <Optimization>Disabled</Optimization>\r
+      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
+      <IntrinsicFunctions>true</IntrinsicFunctions>\r
+      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\r
+      <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>DISABLE_BLUEFISH;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <ExceptionHandling>Async</ExceptionHandling>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
+      <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
+      <PrecompiledHeader>Use</PrecompiledHeader>\r
+      <WarningLevel>Level3</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+    </ClCompile>\r
+    <PreLinkEvent>\r
+      <Command>\r
+      </Command>\r
+    </PreLinkEvent>\r
+    <Link>\r
+      <AdditionalDependencies>OpenGL32.lib;FreeImage.lib;Dxguid.lib;Dsound.lib;Winmm.lib;Ws2_32.lib;avformat-52.lib;avcodec-52.lib;avutil-50.lib;swscale-0.lib;GLee.lib;tbb.lib;%(AdditionalDependencies)</AdditionalDependencies>\r
+      <Version>\r
+      </Version>\r
+      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
+      <IgnoreSpecificDefaultLibraries>LIBC.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>\r
+      <GenerateDebugInformation>true</GenerateDebugInformation>\r
+      <GenerateMapFile>true</GenerateMapFile>\r
+      <MapExports>true</MapExports>\r
+      <SubSystem>Console</SubSystem>\r
+      <OptimizeReferences>\r
+      </OptimizeReferences>\r
+      <EnableCOMDATFolding>\r
+      </EnableCOMDATFolding>\r
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>\r
+      <FixedBaseAddress>false</FixedBaseAddress>\r
+      <DataExecutionPrevention>\r
+      </DataExecutionPrevention>\r
+      <TargetMachine>MachineX86</TargetMachine>\r
+    </Link>\r
+    <PostBuildEvent>\r
+      <Command>\r
+      </Command>\r
+    </PostBuildEvent>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="config.h" />\r
+    <ClInclude Include="consumer\bluefish\BluefishException.h" />\r
+    <ClInclude Include="consumer\bluefish\BluefishFrameManager.h" />\r
+    <ClInclude Include="consumer\bluefish\BluefishPlaybackStrategy.h" />\r
+    <ClInclude Include="consumer\bluefish\BlueFishVideoConsumer.h" />\r
+    <ClInclude Include="consumer\decklink\DeckLinkAPI_h.h" />\r
+    <ClInclude Include="consumer\decklink\DecklinkVideoConsumer.h" />\r
+    <ClInclude Include="consumer\frame_consumer.h" />\r
+    <ClInclude Include="consumer\oal\oal_frame_consumer.h" />\r
+    <ClInclude Include="consumer\ogl\ogl_frame_consumer.h" />\r
+    <ClInclude Include="frame\frame.h" />\r
+    <ClInclude Include="frame\frame_format.h" />\r
+    <ClInclude Include="frame\audio_chunk.h" />\r
+    <ClInclude Include="frame\frame_fwd.h" />\r
+    <ClInclude Include="producer\color\color_producer.h" />\r
+    <ClInclude Include="producer\ffmpeg\audio\audio_decoder.h" />\r
+    <ClInclude Include="producer\ffmpeg\ffmpeg_producer.h" />\r
+    <ClInclude Include="producer\ffmpeg\input.h" />\r
+    <ClInclude Include="producer\ffmpeg\packet.h" />\r
+    <ClInclude Include="producer\ffmpeg\video\video_decoder.h" />\r
+    <ClInclude Include="producer\ffmpeg\video\video_deinterlacer.h" />\r
+    <ClInclude Include="producer\ffmpeg\video\video_scaler.h" />\r
+    <ClInclude Include="producer\flash\axflash.h" />\r
+    <ClInclude Include="producer\flash\cg_producer.h" />\r
+    <ClInclude Include="producer\flash\ct_producer.h" />\r
+    <ClInclude Include="producer\flash\FlashAxContainer.h" />\r
+    <ClInclude Include="producer\flash\flash_producer.h" />\r
+    <ClInclude Include="producer\flash\TimerHelper.h" />\r
+    <ClInclude Include="producer\image\image_loader.h" />\r
+    <ClInclude Include="producer\image\image_producer.h" />\r
+    <ClInclude Include="producer\image\image_scroll_producer.h" />\r
+    <ClInclude Include="producer\transition\transition_producer.h" />\r
+    <ClInclude Include="protocol\amcp\AMCPCommand.h" />\r
+    <ClInclude Include="protocol\amcp\AMCPCommandQueue.h" />\r
+    <ClInclude Include="protocol\amcp\AMCPCommandsImpl.h" />\r
+    <ClInclude Include="protocol\amcp\AMCPProtocolStrategy.h" />\r
+    <ClInclude Include="protocol\cii\CIICommand.h" />\r
+    <ClInclude Include="protocol\cii\CIICommandsImpl.h" />\r
+    <ClInclude Include="protocol\cii\CIIProtocolStrategy.h" />\r
+    <ClInclude Include="protocol\clk\CLKCommand.h" />\r
+    <ClInclude Include="protocol\clk\CLKProtocolStrategy.h" />\r
+    <ClInclude Include="protocol\media.h" />\r
+    <ClInclude Include="protocol\monitor\Monitor.h" />\r
+    <ClInclude Include="renderer\renderer_fwd.h" />\r
+    <ClInclude Include="renderer\render_device.h" />\r
+    <ClInclude Include="renderer\layer.h" />\r
+    <ClInclude Include="server.h" />\r
+    <CustomBuildStep Include="consumers\bluefish\BluefishException.h" />\r
+    <CustomBuildStep Include="consumers\bluefish\BluefishFrameManager.h" />\r
+    <CustomBuildStep Include="consumers\bluefish\BluefishPlaybackStrategy.h" />\r
+    <CustomBuildStep Include="consumers\bluefish\BlueFishVideoConsumer.h" />\r
+    <ClInclude Include="frame\bitmap_frame.h" />\r
+    <ClInclude Include="frame\system_frame.h" />\r
+    <CustomBuildStep Include="PlaybackControl.h" />\r
+    <ClInclude Include="StdAfx.h" />\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="consumer\bluefish\BluefishFrameManager.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="consumer\bluefish\BluefishPlaybackStrategy.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="consumer\bluefish\BlueFishVideoConsumer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="consumer\decklink\DeckLinkAPI_i.c">\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">NotUsing</PrecompiledHeader>\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">NotUsing</PrecompiledHeader>\r
+    </ClCompile>\r
+    <ClCompile Include="consumer\decklink\DecklinkVideoConsumer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="consumer\oal\oal_frame_consumer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="consumer\ogl\ogl_frame_consumer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="frame\audio_chunk.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="frame\frame_format.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\stdafx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">..\stdafx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\stdafx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">..\stdafx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\color\color_producer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\ffmpeg\audio\audio_decoder.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\ffmpeg\ffmpeg_producer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\ffmpeg\input.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\ffmpeg\video\video_decoder.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\ffmpeg\video\video_deinterlacer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\ffmpeg\video\video_scaler.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\flash\cg_producer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\flash\ct_producer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\flash\Flash9e_i.c">\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">NotUsing</PrecompiledHeader>\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">NotUsing</PrecompiledHeader>\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\flash\FlashAxContainer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\flash\flash_producer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\image\image_loader.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\image\image_producer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\image\image_scroll_producer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\transition\transition_producer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\amcp\AMCPCommandQueue.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\stdafx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">..\..\stdafx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">..\..\stdafx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\stdafx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\amcp\AMCPCommandsImpl.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\amcp\AMCPProtocolStrategy.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\cii\CIICommandsImpl.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\cii\CIIProtocolStrategy.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\clk\CLKCommand.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\clk\CLKProtocolStrategy.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\media.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\monitor\Monitor.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="renderer\render_device.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="renderer\layer.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">../StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="server.cpp">\r
+      <ExpandAttributedSource Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExpandAttributedSource>\r
+      <PreprocessToFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PreprocessToFile>\r
+    </ClCompile>\r
+    <ClCompile Include="frame\bitmap_frame.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">..\StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="frame\system_frame.cpp">\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">..\StdAfx.h</PrecompiledHeaderFile>\r
+      <PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">..\StdAfx.h</PrecompiledHeaderFile>\r
+    </ClCompile>\r
+    <ClCompile Include="main.cpp" />\r
+    <ClCompile Include="StdAfx.cpp">\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">Create</PrecompiledHeader>\r
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">Create</PrecompiledHeader>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Midl Include="consumer\decklink\DeckLinkAPI.idl">\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|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)'=='no bluefish|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+    </Midl>\r
+    <Midl Include="consumer\decklink\DeckLinkAPI_v7_3.idl">\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+    </Midl>\r
+    <Midl Include="producer\flash\Flash9e.IDL">\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='no bluefish|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseProfiling|Win32'">true</ExcludedFromBuild>\r
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+    </Midl>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <None Include="caspar.config">\r
+      <SubType>Designer</SubType>\r
+    </None>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ProjectReference Include="..\common\common.vcxproj">\r
+      <Project>{02308602-7fe0-4253-b96e-22134919f56a}</Project>\r
+    </ProjectReference>\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>
\ No newline at end of file
diff --git a/core/Server.vcxproj.ampl.cfg b/core/Server.vcxproj.ampl.cfg
new file mode 100644 (file)
index 0000000..3c0f59b
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<root>\r
+ <version type="u32_t">1</version>\r
+ <All_Configurations-All_Platforms>\r
+  <version type="u32_t">1</version>\r
+ </All_Configurations-All_Platforms>\r
+</root>\r
diff --git a/core/Server.vcxproj.filters b/core/Server.vcxproj.filters
new file mode 100644 (file)
index 0000000..bb1671a
--- /dev/null
@@ -0,0 +1,373 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="Source">\r
+      <UniqueIdentifier>{0361bd88-1d96-4d86-b3ad-34d40e2319c6}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\renderer">\r
+      <UniqueIdentifier>{db784096-c412-4d20-86f0-481e5e2979c5}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\frame">\r
+      <UniqueIdentifier>{69627759-fb18-42fa-8339-66ce27062c90}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\consumer">\r
+      <UniqueIdentifier>{35d7835f-f813-4b4b-8d8d-8a35dfef68d3}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\consumer\oal">\r
+      <UniqueIdentifier>{3dab53b0-e0ef-4431-8c1d-9a973b269ae7}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\consumer\ogl">\r
+      <UniqueIdentifier>{7217dee5-b7ca-4128-9994-03a844c06903}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\consumer\bluefish">\r
+      <UniqueIdentifier>{89e746b3-5d4d-4ff2-a66e-279b5371ac9d}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\consumer\decklink">\r
+      <UniqueIdentifier>{aa3626b2-ad7a-4e84-8867-0f5868a21567}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\consumer\decklink\interop">\r
+      <UniqueIdentifier>{a5cb89d7-dbbb-4fca-b899-f53a069727b4}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\producer">\r
+      <UniqueIdentifier>{71accefc-1437-4e1d-9ff7-9de654a32df9}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\producer\ffmpeg">\r
+      <UniqueIdentifier>{671d13be-c7e1-4f65-9909-03b7c8adcbde}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\producer\color">\r
+      <UniqueIdentifier>{78b16c14-bf29-4511-9122-684ff513dbf5}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\producer\transition">\r
+      <UniqueIdentifier>{26bf9811-1954-46f5-86ce-ecdc26e6db16}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\producer\flash">\r
+      <UniqueIdentifier>{fc25232a-cab1-4c79-962a-b51dc51161fb}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\producer\image">\r
+      <UniqueIdentifier>{3d4314f3-8a39-44e3-a0c9-9b833bb8f809}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\producer\ffmpeg\video">\r
+      <UniqueIdentifier>{a6d6bcc9-7ef1-47a3-9800-76e71f2b3f62}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\producer\ffmpeg\audio">\r
+      <UniqueIdentifier>{4031dc0c-88e9-46b5-b279-955639dca8b7}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\producer\flash\interop">\r
+      <UniqueIdentifier>{f99e4727-2b1b-4009-a445-99b11b071e8e}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\protocol">\r
+      <UniqueIdentifier>{57f477cb-9cff-4216-aab7-50b06df51f20}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\protocol\cii">\r
+      <UniqueIdentifier>{a94bc00a-4753-4bce-a777-6a3ea2ceca59}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\protocol\amcp">\r
+      <UniqueIdentifier>{d33e8ddc-ccb4-4f4f-ad20-e788a796bb7b}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\protocol\monitor">\r
+      <UniqueIdentifier>{300c491b-4f95-4b15-8d77-eff22fb4cd60}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\protocol\clk">\r
+      <UniqueIdentifier>{8355a891-c4db-4a0e-8ecc-795314127cdc}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Source\protocol\osc">\r
+      <UniqueIdentifier>{23166bfa-06eb-4da9-8a0d-1ae5eac4348b}</UniqueIdentifier>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="StdAfx.h">\r
+      <Filter>Source</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="protocol\amcp\AMCPCommandQueue.h">\r
+      <Filter>Source\protocol\amcp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="protocol\amcp\AMCPCommandsImpl.h">\r
+      <Filter>Source\protocol\amcp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="protocol\amcp\AMCPProtocolStrategy.h">\r
+      <Filter>Source\protocol\amcp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="protocol\amcp\AMCPCommand.h">\r
+      <Filter>Source\protocol\amcp</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="protocol\cii\CIICommandsImpl.h">\r
+      <Filter>Source\protocol\cii</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="protocol\cii\CIIProtocolStrategy.h">\r
+      <Filter>Source\protocol\cii</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="protocol\cii\CIICommand.h">\r
+      <Filter>Source\protocol\cii</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="protocol\clk\CLKCommand.h">\r
+      <Filter>Source\protocol\clk</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="protocol\clk\CLKProtocolStrategy.h">\r
+      <Filter>Source\protocol\clk</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="protocol\monitor\Monitor.h">\r
+      <Filter>Source\protocol\monitor</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="renderer\render_device.h">\r
+      <Filter>Source\renderer</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="renderer\layer.h">\r
+      <Filter>Source\renderer</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="renderer\renderer_fwd.h">\r
+      <Filter>Source\renderer</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="frame\frame_fwd.h">\r
+      <Filter>Source\frame</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="frame\frame_format.h">\r
+      <Filter>Source\frame</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="frame\bitmap_frame.h">\r
+      <Filter>Source\frame</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="frame\system_frame.h">\r
+      <Filter>Source\frame</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="frame\audio_chunk.h">\r
+      <Filter>Source\frame</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="frame\frame.h">\r
+      <Filter>Source\frame</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="config.h">\r
+      <Filter>Source</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="server.h">\r
+      <Filter>Source</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="consumer\bluefish\BluefishPlaybackStrategy.h">\r
+      <Filter>Source\consumer\bluefish</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="consumer\bluefish\BlueFishVideoConsumer.h">\r
+      <Filter>Source\consumer\bluefish</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="consumer\bluefish\BluefishException.h">\r
+      <Filter>Source\consumer\bluefish</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="consumer\bluefish\BluefishFrameManager.h">\r
+      <Filter>Source\consumer\bluefish</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="consumer\decklink\DecklinkVideoConsumer.h">\r
+      <Filter>Source\consumer\decklink</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="consumer\decklink\DeckLinkAPI_h.h">\r
+      <Filter>Source\consumer\decklink\interop</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="consumer\oal\oal_frame_consumer.h">\r
+      <Filter>Source\consumer\oal</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="consumer\ogl\ogl_frame_consumer.h">\r
+      <Filter>Source\consumer\ogl</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="consumer\frame_consumer.h">\r
+      <Filter>Source\consumer</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\color\color_producer.h">\r
+      <Filter>Source\producer\color</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\ffmpeg\ffmpeg_producer.h">\r
+      <Filter>Source\producer\ffmpeg</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\ffmpeg\input.h">\r
+      <Filter>Source\producer\ffmpeg</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\ffmpeg\packet.h">\r
+      <Filter>Source\producer\ffmpeg</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\ffmpeg\audio\audio_decoder.h">\r
+      <Filter>Source\producer\ffmpeg\audio</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\ffmpeg\video\video_decoder.h">\r
+      <Filter>Source\producer\ffmpeg\video</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\ffmpeg\video\video_deinterlacer.h">\r
+      <Filter>Source\producer\ffmpeg\video</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\ffmpeg\video\video_scaler.h">\r
+      <Filter>Source\producer\ffmpeg\video</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\flash\ct_producer.h">\r
+      <Filter>Source\producer\flash</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\flash\flash_producer.h">\r
+      <Filter>Source\producer\flash</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\flash\cg_producer.h">\r
+      <Filter>Source\producer\flash</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\flash\TimerHelper.h">\r
+      <Filter>Source\producer\flash\interop</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\flash\FlashAxContainer.h">\r
+      <Filter>Source\producer\flash\interop</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\flash\axflash.h">\r
+      <Filter>Source\producer\flash\interop</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\image\image_loader.h">\r
+      <Filter>Source\producer\image</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\image\image_producer.h">\r
+      <Filter>Source\producer\image</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\image\image_scroll_producer.h">\r
+      <Filter>Source\producer\image</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="producer\transition\transition_producer.h">\r
+      <Filter>Source\producer\transition</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="protocol\media.h">\r
+      <Filter>Source\protocol</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="StdAfx.cpp">\r
+      <Filter>Source</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\amcp\AMCPCommandQueue.cpp">\r
+      <Filter>Source\protocol\amcp</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\amcp\AMCPCommandsImpl.cpp">\r
+      <Filter>Source\protocol\amcp</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\amcp\AMCPProtocolStrategy.cpp">\r
+      <Filter>Source\protocol\amcp</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\cii\CIICommandsImpl.cpp">\r
+      <Filter>Source\protocol\cii</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\cii\CIIProtocolStrategy.cpp">\r
+      <Filter>Source\protocol\cii</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\clk\CLKProtocolStrategy.cpp">\r
+      <Filter>Source\protocol\clk</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\clk\CLKCommand.cpp">\r
+      <Filter>Source\protocol\clk</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\monitor\Monitor.cpp">\r
+      <Filter>Source\protocol\monitor</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="renderer\render_device.cpp">\r
+      <Filter>Source\renderer</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="renderer\layer.cpp">\r
+      <Filter>Source\renderer</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="frame\system_frame.cpp">\r
+      <Filter>Source\frame</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="frame\frame_format.cpp">\r
+      <Filter>Source\frame</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="frame\bitmap_frame.cpp">\r
+      <Filter>Source\frame</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="frame\audio_chunk.cpp">\r
+      <Filter>Source\frame</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="main.cpp">\r
+      <Filter>Source</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="server.cpp">\r
+      <Filter>Source</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="consumer\bluefish\BluefishPlaybackStrategy.cpp">\r
+      <Filter>Source\consumer\bluefish</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="consumer\bluefish\BlueFishVideoConsumer.cpp">\r
+      <Filter>Source\consumer\bluefish</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="consumer\bluefish\BluefishFrameManager.cpp">\r
+      <Filter>Source\consumer\bluefish</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="consumer\decklink\DecklinkVideoConsumer.cpp">\r
+      <Filter>Source\consumer\decklink</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="consumer\decklink\DeckLinkAPI_i.c">\r
+      <Filter>Source\consumer\decklink\interop</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="consumer\oal\oal_frame_consumer.cpp">\r
+      <Filter>Source\consumer\oal</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="consumer\ogl\ogl_frame_consumer.cpp">\r
+      <Filter>Source\consumer\ogl</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\color\color_producer.cpp">\r
+      <Filter>Source\producer\color</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\ffmpeg\ffmpeg_producer.cpp">\r
+      <Filter>Source\producer\ffmpeg</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\ffmpeg\input.cpp">\r
+      <Filter>Source\producer\ffmpeg</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\ffmpeg\audio\audio_decoder.cpp">\r
+      <Filter>Source\producer\ffmpeg\audio</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\ffmpeg\video\video_deinterlacer.cpp">\r
+      <Filter>Source\producer\ffmpeg\video</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\ffmpeg\video\video_scaler.cpp">\r
+      <Filter>Source\producer\ffmpeg\video</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\ffmpeg\video\video_decoder.cpp">\r
+      <Filter>Source\producer\ffmpeg\video</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\flash\ct_producer.cpp">\r
+      <Filter>Source\producer\flash</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\flash\flash_producer.cpp">\r
+      <Filter>Source\producer\flash</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\flash\cg_producer.cpp">\r
+      <Filter>Source\producer\flash</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\flash\FlashAxContainer.cpp">\r
+      <Filter>Source\producer\flash\interop</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\flash\Flash9e_i.c">\r
+      <Filter>Source\producer\flash\interop</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\image\image_loader.cpp">\r
+      <Filter>Source\producer\image</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\image\image_producer.cpp">\r
+      <Filter>Source\producer\image</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\image\image_scroll_producer.cpp">\r
+      <Filter>Source\producer\image</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="producer\transition\transition_producer.cpp">\r
+      <Filter>Source\producer\transition</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="protocol\media.cpp">\r
+      <Filter>Source\protocol</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <Midl Include="consumer\decklink\DeckLinkAPI_v7_3.idl">\r
+      <Filter>Source\consumer\decklink\interop</Filter>\r
+    </Midl>\r
+    <Midl Include="consumer\decklink\DeckLinkAPI.idl">\r
+      <Filter>Source\consumer\decklink\interop</Filter>\r
+    </Midl>\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>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <None Include="caspar.config">\r
+      <Filter>Source</Filter>\r
+    </None>\r
+  </ItemGroup>\r
+</Project>
\ No newline at end of file
diff --git a/core/Server.vcxproj.insp.cfg b/core/Server.vcxproj.insp.cfg
new file mode 100644 (file)
index 0000000..3c0f59b
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<root>\r
+ <version type="u32_t">1</version>\r
+ <All_Configurations-All_Platforms>\r
+  <version type="u32_t">1</version>\r
+ </All_Configurations-All_Platforms>\r
+</root>\r
diff --git a/core/Server.vcxproj.user b/core/Server.vcxproj.user
new file mode 100644 (file)
index 0000000..695b5c7
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+</Project>
\ No newline at end of file
diff --git a/core/StdAfx.cpp b/core/StdAfx.cpp
new file mode 100644 (file)
index 0000000..2bd615b
--- /dev/null
@@ -0,0 +1,28 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+// stdafx.cpp : source file that includes just the standard includes\r
+//     dma.pch will be the pre-compiled header\r
+//     stdafx.obj will contain the pre-compiled type information\r
+\r
+#include "stdafx.h"\r
+\r
+// TODO: reference any additional headers you need in STDAFX.H\r
+// and not in this file\r
diff --git a/core/StdAfx.h b/core/StdAfx.h
new file mode 100644 (file)
index 0000000..a2fb9e3
--- /dev/null
@@ -0,0 +1,69 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+// stdafx.h : include file for standard system include files,\r
+//  or project specific include files that are used frequently, but\r
+//      are changed infrequently\r
+//\r
+\r
+#pragma once\r
+\r
+#ifdef _MSC_VER\r
+#pragma warning (disable : 4482)\r
+#endif\r
+\r
+#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)\r
+#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_\r
+\r
+#ifdef _DEBUG\r
+#include <crtdbg.h>\r
+#endif\r
+\r
+#include "config.h"\r
+\r
+#include <winsock2.h>\r
+#include <tchar.h>\r
+#include <sstream>\r
+#include <memory>\r
+#include <functional>\r
+#include <algorithm>\r
+#include <vector>\r
+#include <deque>\r
+#include <queue>\r
+#include <string>\r
+#include <math.h>\r
+\r
+#include <tbb/atomic.h>\r
+#include <tbb/concurrent_queue.h>\r
+#include <tbb/parallel_invoke.h>\r
+\r
+#include <boost/assign.hpp>\r
+#include <boost/filesystem.hpp>\r
+#include <boost/foreach.hpp>\r
+\r
+#include "../common/utility/string_convert.h"\r
+\r
+#include "../common/log/Log.h"\r
+#include "../common/exception/exceptions.h"\r
+#include "../common/exception/win32_exception.h"\r
+\r
+#include <assert.h>\r
+\r
+#endif\r
diff --git a/core/caspar.config b/core/caspar.config
new file mode 100644 (file)
index 0000000..8a97e18
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<configuration>\r
+  <paths>\r
+    <media-path>C:\\casparcg\\Repository\\media\\</media-path>\r
+    <log-path>C:\\casparcg\\Repository\\log\\</log-path>\r
+    <template-path>C:\\casparcg\\Repository\\templates\\</template-path>\r
+    <data-path>C:\\casparcg\\Repository\\data\\</data-path>\r
+  </paths>\r
+       <channels>\r
+    <channel>\r
+      <videomode>PAL</videomode>\r
+      <consumers>\r
+        <ogl>\r
+          <device>0</device>\r
+          <stretch>uniform</stretch>\r
+          <windowed>true</windowed>\r
+        </ogl>\r
+        <audio/>\r
+      </consumers>\r
+    </channel>\r
+       </channels>\r
+  <controllers>\r
+    <tcpcontroller>\r
+      <port>5250</port>\r
+      <protocol>AMCP</protocol>\r
+    </tcpcontroller>\r
+  </controllers>\r
+</configuration>
\ No newline at end of file
diff --git a/core/config.h b/core/config.h
new file mode 100644 (file)
index 0000000..64d1694
--- /dev/null
@@ -0,0 +1,23 @@
+#pragma once\r
+\r
+#define NOMINMAX\r
+\r
+#if defined(_MSC_VER)\r
+#      ifndef _SCL_SECURE_NO_WARNINGS\r
+#              define _SCL_SECURE_NO_WARNINGS\r
+#      endif\r
+#      ifndef _CRT_SECURE_NO_WARNINGS\r
+#              define _CRT_SECURE_NO_WARNINGS\r
+#      endif\r
+#endif\r
+\r
+#define CASPAR_VERSION_STR     "2.0.0.0"\r
+#define CASPAR_VERSION_TAG     "EXPERIMENTAL"\r
+\r
+#ifndef TEMPLATEHOST_VERSION\r
+#      define TEMPLATEHOST_VERSION 1700\r
+#endif\r
+\r
+#define TBB_USE_THREADING_TOOLS 1\r
+\r
+//#define DISABLE_BLUEFISH\r
diff --git a/core/consumer/bluefish/BlueFishVideoConsumer.cpp b/core/consumer/bluefish/BlueFishVideoConsumer.cpp
new file mode 100644 (file)
index 0000000..bedaaa8
--- /dev/null
@@ -0,0 +1,472 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "..\..\StdAfx.h"\r
+\r
+#ifndef DISABLE_BLUEFISH\r
+\r
+#include <BlueVelvet4.h>\r
+#include "BlueFishVideoConsumer.h"\r
+#include "BluefishPlaybackStrategy.h"\r
+\r
+#include <stdlib.h>\r
+#include <stdio.h>\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (push, 1) // TODO: Legacy code, just disable warnings\r
+#endif\r
+\r
+namespace caspar {\r
+namespace bluefish {\r
+\r
+///////////////////////////////////////////\r
+// BlueFishVideoConsumer::EnumerateDevices\r
+// RETURNS: Number of identified bluefish-cards\r
+int BlueFishVideoConsumer::EnumerateDevices()\r
+{\r
+       CASPAR_LOG(info) << "Bleufhsi SDK version: " << BlueVelvetVersion;\r
+       BlueVelvetPtr pSDK(BlueVelvetFactory4());\r
+\r
+       if(pSDK != 0) {\r
+               int deviceCount = 0;\r
+               pSDK->device_enumerate(deviceCount);\r
+               return deviceCount;\r
+       }\r
+       else\r
+               return 0;\r
+}\r
+\r
+\r
+///////////////////////////////////////////\r
+// BlueFishVideoConsumer::Create\r
+// PARAMS: deviceIndex(index of the card that is to be wrapped in a consumer)\r
+// RETURNS: a new BlueFishVideoConsumer-object for the specified card\r
+// COMMENT: Creates and initializes a consumer that outputs video to a bluefish-card\r
+frame_consumer_ptr BlueFishVideoConsumer::Create(const frame_format_desc& format_desc, unsigned int deviceIndex)\r
+{\r
+       BlueFishFrameConsumerPtr card(new BlueFishVideoConsumer(format_desc));\r
+       if(card != 0 && card->SetupDevice(deviceIndex) == false)\r
+               card.reset();\r
+\r
+       return card;\r
+}\r
+\r
+////////////////////////////////////////\r
+// BlueFishVideoConsumer constructor\r
+BlueFishVideoConsumer::BlueFishVideoConsumer(const frame_format_desc& format_desc) : format_desc_(format_desc), pSDK_(BlueVelvetFactory4()), currentFormat_(frame_format::pal), _deviceIndex(0), hasEmbeddedAudio_(false)\r
+{\r
+       frameBuffer_.set_capacity(1);\r
+       thread_ = boost::thread([=]{Run();});\r
+}\r
+\r
+////////////////////////////////////////\r
+// BlueFishVideoConsumer destructor\r
+BlueFishVideoConsumer::~BlueFishVideoConsumer()\r
+{\r
+       frameBuffer_.push(nullptr),\r
+       thread_.join();\r
+       ReleaseDevice();\r
+}\r
+\r
+/*******************/\r
+/**    METHODS    **/\r
+/*******************/\r
+\r
+unsigned long BlueFishVideoConsumer::VidFmtFromFrameFormat(frame_format fmt) \r
+{\r
+       switch(fmt)\r
+       {\r
+       case frame_format::pal:                 return VID_FMT_PAL;\r
+       case frame_format::ntsc:                return VID_FMT_NTSC;\r
+       case frame_format::x576p2500:   return ULONG_MAX;       //not supported\r
+       case frame_format::x720p5000:   return VID_FMT_720P_5000;\r
+       case frame_format::x720p5994:   return VID_FMT_720P_5994;\r
+       case frame_format::x720p6000:   return VID_FMT_720P_6000;\r
+       case frame_format::x1080p2397:  return VID_FMT_1080P_2397;\r
+       case frame_format::x1080p2400:  return VID_FMT_1080P_2400;\r
+       case frame_format::x1080i5000:  return VID_FMT_1080I_5000;\r
+       case frame_format::x1080i5994:  return VID_FMT_1080I_5994;\r
+       case frame_format::x1080i6000:  return VID_FMT_1080I_6000;\r
+       case frame_format::x1080p2500:  return VID_FMT_1080P_2500;\r
+       case frame_format::x1080p2997:  return VID_FMT_1080P_2997;\r
+       case frame_format::x1080p3000:  return VID_FMT_1080P_3000;\r
+       default:                                                return ULONG_MAX;\r
+       }\r
+}\r
+\r
+TCHAR* GetBluefishCardDesc(int cardType) \r
+{\r
+       switch(cardType) \r
+       {\r
+       case CRD_BLUEDEEP_LT:                           return TEXT("Deepblue LT"); // D64 Lite\r
+       case CRD_BLUEDEEP_SD:                           return TEXT("Iridium SD"); // Iridium SD\r
+       case CRD_BLUEDEEP_AV:                           return TEXT("Iridium AV"); // Iridium AV\r
+       case CRD_BLUEDEEP_IO:                           return TEXT("Deepblue IO"); // D64 Full\r
+       case CRD_BLUEWILD_AV:                           return TEXT("Wildblue AV"); // D64 AV\r
+       case CRD_IRIDIUM_HD:                            return TEXT("Iridium HD"); // * Iridium HD\r
+       case CRD_BLUEWILD_RT:                           return TEXT("Wildblue RT"); // D64 RT\r
+       case CRD_BLUEWILD_HD:                           return TEXT("Wildblue HD"); // * BadAss G2\r
+       case CRD_REDDEVIL:                                      return TEXT("Iridium Full"); // Iridium Full\r
+       case CRD_BLUEDEEP_HD:                                                                                                            // * BadAss G2 variant, proposed, reserved\r
+       case CRD_BLUEDEEP_HDS:                          return TEXT("Reserved for \"BasAss G2"); // * BadAss G2 variant, proposed, reserved\r
+       case CRD_BLUE_ENVY:                                     return TEXT("Blue envy"); // Mini Din \r
+       case CRD_BLUE_PRIDE:                            return TEXT("Blue pride"); //Mini Din Output \r
+       case CRD_BLUE_GREED:                            return TEXT("Blue greed");\r
+       case CRD_BLUE_INGEST:                           return TEXT("Blue ingest");\r
+       case CRD_BLUE_SD_DUALLINK:                      return TEXT("Blue SD duallink");\r
+       case CRD_BLUE_CATALYST:                         return TEXT("Blue catalyst");\r
+       case CRD_BLUE_SD_DUALLINK_PRO:          return TEXT("Blue SD duallink pro");\r
+       case CRD_BLUE_SD_INGEST_PRO:            return TEXT("Blue SD ingest pro");\r
+       case CRD_BLUE_SD_DEEPBLUE_LITE_PRO:     return TEXT("Blue SD deepblue lite pro");\r
+       case CRD_BLUE_SD_SINGLELINK_PRO:        return TEXT("Blue SD singlelink pro");\r
+       case CRD_BLUE_SD_IRIDIUM_AV_PRO:        return TEXT("Blue SD iridium AV pro");\r
+       case CRD_BLUE_SD_FIDELITY:                      return TEXT("Blue SD fidelity");\r
+       case CRD_BLUE_SD_FOCUS:                         return TEXT("Blue SD focus");\r
+       case CRD_BLUE_SD_PRIME:                         return TEXT("Blue SD prime");\r
+       case CRD_BLUE_EPOCH_2K_CORE:            return TEXT("Blue epoch 2k core");\r
+       case CRD_BLUE_EPOCH_2K_ULTRA:           return TEXT("Blue epoch 2k ultra");\r
+       case CRD_BLUE_EPOCH_HORIZON:            return TEXT("Blue epoch horizon");\r
+       case CRD_BLUE_EPOCH_CORE:                       return TEXT("Blue epoch core");\r
+       case CRD_BLUE_EPOCH_ULTRA:                      return TEXT("Blue epoch ultra");\r
+       case CRD_BLUE_CREATE_HD:                        return TEXT("Blue create HD");\r
+       case CRD_BLUE_CREATE_2K:                        return TEXT("Blue create 2k");\r
+       case CRD_BLUE_CREATE_2K_ULTRA:          return TEXT("Blue create 2k ultra");\r
+       default:                                                        return TEXT("Unknown");\r
+       }\r
+}\r
+\r
+bool BlueFishVideoConsumer::SetupDevice(unsigned int deviceIndex)\r
+{\r
+       return this->DoSetupDevice(deviceIndex);\r
+}\r
+\r
+/*\r
+// Original initialization code\r
+bool BlueFishVideoConsumer::DoSetupDevice(unsigned int deviceIndex, std::wstring strDesiredFrameFormat)\r
+{\r
+       _deviceIndex = deviceIndex;\r
+\r
+       unsigned long memFmt = MEM_FMT_ARGB_PC, updFmt = UPD_FMT_FRAME, vidFmt = VID_FMT_PAL, resFmt = RES_FMT_NORMAL;\r
+       unsigned long desiredVideoFormat = VID_FMT_PAL;\r
+       int iDummy;\r
+\r
+       int bufferIndex=0;      //Bufferindex used when initializing the buffers\r
+\r
+       if(strDesiredFrameFormat.size() == 0)\r
+               strDesiredFrameFormat = TEXT("PAL");\r
+\r
+       frame_format casparVideoFormat = caspar::get_video_format(strDesiredFrameFormat);\r
+       desiredVideoFormat = BlueFishVideoConsumer::VidFmtFromFrameFormat(casparVideoFormat);\r
+       currentFormat_ = casparVideoFormat != FFormatInvalid ? casparVideoFormat : FFormatPAL;\r
+       if(desiredVideoFormat == ULONG_MAX) {\r
+               LOG << TEXT("BLUECARD ERROR: Unsupported videomode: ") << strDesiredFrameFormat << TEXT(". (device") << _deviceIndex << TEXT(")");\r
+               return false;\r
+       }\r
+\r
+       if(BLUE_FAIL(pSDK_->device_attach(_deviceIndex, FALSE))) {\r
+               LOG << TEXT("BLUECARD ERROR: Failed to attach device") << _deviceIndex;\r
+               return false;\r
+       }\r
+\r
+       if(desiredVideoFormat != VID_FMT_PAL) {\r
+               int videoModeCount = pSDK_->count_video_mode();\r
+               for(int videoModeIndex=1; videoModeIndex <= videoModeCount; ++videoModeIndex) {\r
+                       EVideoMode videoMode = pSDK_->enum_video_mode(videoModeIndex);\r
+                       if(videoMode == desiredVideoFormat) {\r
+                               vidFmt = videoMode;\r
+                       }\r
+               }\r
+       }\r
+\r
+       if(vidFmt == VID_FMT_PAL) {\r
+               strDesiredFrameFormat = TEXT("PAL");\r
+               currentFormat_ = FFormatPAL;\r
+       }\r
+\r
+       if(BLUE_FAIL(pSDK_->set_video_framestore_style(vidFmt, memFmt, updFmt, resFmt))) {\r
+               LOG << TEXT("BLUECARD ERROR: Failed to set videomode to ") << strDesiredFrameFormat << TEXT(". (device ") << _deviceIndex << TEXT(")");\r
+               return false;\r
+       }\r
+\r
+       LOG << TEXT("BLUECARD INFO: Successfully configured bluecard for ") << strDesiredFrameFormat << TEXT(". (device ") << _deviceIndex << TEXT(")");\r
+\r
+       if (pSDK_->has_output_key()) {\r
+               iDummy = TRUE;\r
+               int v4444 = FALSE, invert = FALSE, white = FALSE;\r
+               pSDK_->set_output_key(iDummy, v4444, invert, white);\r
+       }\r
+\r
+       if(pSDK_->GetHDCardType(_deviceIndex) != CRD_HD_INVALID) {\r
+               pSDK_->Set_DownConverterSignalType((vidFmt == VID_FMT_PAL) ? SD_SDI : HD_SDI);\r
+       }\r
+\r
+\r
+       iDummy = FALSE;\r
+       pSDK_->set_vertical_flip(iDummy);\r
+\r
+       // Get framestore parameters\r
+       if(BLUE_OK(pSDK_->render_buffer_sizeof(m_bufferCount, m_length, m_actual, m_golden))) {\r
+               LOG << TEXT("BLUECARD INFO: Buffers: ") << m_bufferCount << TEXT(", \"Length\": ") << m_length << TEXT(", Buffer size: ") << m_actual << TEXT(" (device ") << _deviceIndex << TEXT(")") << common::LogStream::Flush;\r
+       }\r
+       else {\r
+               LOG << TEXT("BLUECARD ERROR: Failed to get framestore parameters (device ") << _deviceIndex << TEXT(")");\r
+       }\r
+\r
+       pFrameManager_ = BluefishFrameManagerPtr(new BluefishFrameManager(pSDK_, currentFormat_, m_golden));\r
+\r
+       iDummy = TRUE;\r
+       pSDK_->set_output_video(iDummy);\r
+\r
+       // Now specify video output buffer\r
+       pSDK_->render_buffer_update(0);\r
+\r
+       pPlaybackControl_.reset(new FramePlaybackControl(FramePlaybackStrategyPtr(new BluefishPlaybackStrategy(this))));\r
+       pPlaybackControl_->Start();\r
+\r
+       LOG << TEXT("BLUECARD INFO: Successfully initialized device ") << _deviceIndex;\r
+       return true;\r
+}\r
+*/\r
+\r
+//New, improved(?) initialization code. \r
+//Based on code sent from the bluefish-sdk support 2009-08-25. Email "RE: [sdk] Ang. RE: Issue with SD Lite Pro PCI-E"\r
+bool BlueFishVideoConsumer::DoSetupDevice(unsigned int deviceIndex)\r
+{\r
+       _deviceIndex = deviceIndex;\r
+\r
+       unsigned long memFmt = MEM_FMT_ARGB_PC, updFmt = UPD_FMT_FRAME, vidFmt = VID_FMT_PAL, resFmt = RES_FMT_NORMAL, engineMode = VIDEO_ENGINE_FRAMESTORE;\r
+       unsigned long desiredVideoFormat = VID_FMT_PAL;\r
+       int iDummy;\r
+\r
+       int bufferIndex=0;      //Bufferindex used when initializing the buffers\r
+\r
+       if(BLUE_FAIL(pSDK_->device_attach(_deviceIndex, FALSE))) {\r
+               CASPAR_LOG(error) << "BLUECARD ERROR: Failed to attach device. (device " << _deviceIndex << TEXT(")");\r
+               return false;\r
+       }\r
+\r
+       int videoCardType = pSDK_->has_video_cardtype();\r
+       CASPAR_LOG(info) << "BLUECARD INFO: Card type: " << GetBluefishCardDesc(videoCardType) << TEXT(". (device ") << _deviceIndex << TEXT(")");\r
+\r
+       desiredVideoFormat = BlueFishVideoConsumer::VidFmtFromFrameFormat(format_desc_.format);\r
+       currentFormat_ = format_desc_.format != frame_format::invalid ? format_desc_.format : frame_format::pal;\r
+       if(desiredVideoFormat == ULONG_MAX) {\r
+               CASPAR_LOG(error) << "BLUECARD ERROR: Unsupported videomode: " << format_desc_.name << TEXT(". (device ") << _deviceIndex << TEXT(")");\r
+               return false;\r
+       }\r
+\r
+       if(desiredVideoFormat != VID_FMT_PAL) {\r
+               int videoModeCount = pSDK_->count_video_mode();\r
+               for(int videoModeIndex=1; videoModeIndex <= videoModeCount; ++videoModeIndex) {\r
+                       EVideoMode videoMode = pSDK_->enum_video_mode(videoModeIndex);\r
+                       if(videoMode == desiredVideoFormat) {\r
+                               vidFmt = videoMode;\r
+                       }\r
+               }\r
+       }\r
+\r
+       if(vidFmt != desiredVideoFormat) {\r
+               CASPAR_LOG(error) << "BLUECARD ERROR: Failed to set desired videomode: " << format_desc_.name << TEXT(". (device ") << _deviceIndex << TEXT(")");\r
+       }\r
+\r
+       if(vidFmt == VID_FMT_PAL) {\r
+               currentFormat_ = frame_format::pal;\r
+               format_desc_ = frame_format_desc::format_descs[frame_format::pal];\r
+       }\r
+\r
+       DisableVideoOutput();\r
+\r
+       VARIANT value;\r
+       value.vt = VT_UI4;\r
+\r
+       //Enable dual link output\r
+       value.ulVal = 1;\r
+       if(!BLUE_PASS(pSDK_->SetCardProperty(VIDEO_DUAL_LINK_OUTPUT, value))) {\r
+               CASPAR_LOG(error) << "BLUECARD ERROR: Failed to enable dual link. (device " << _deviceIndex << TEXT(")");\r
+               return false;\r
+       }\r
+\r
+       value.ulVal = Signal_FormatType_4224;\r
+       if(!BLUE_PASS(pSDK_->SetCardProperty(VIDEO_DUAL_LINK_OUTPUT_SIGNAL_FORMAT_TYPE, value))) {\r
+               CASPAR_LOG(error) << "BLUECARD ERROR: Failed to set dual link format type to 4:2:2:4. (device " << _deviceIndex << TEXT(")");\r
+               return false;\r
+       }\r
+\r
+       //Setting output Video mode\r
+       value.ulVal = vidFmt;\r
+       if(!BLUE_PASS(pSDK_->SetCardProperty(VIDEO_MODE, value))) {\r
+               CASPAR_LOG(error) << "BLUECARD ERROR: Failed to set videomode. (device " << _deviceIndex << TEXT(")");\r
+               return false;\r
+       }\r
+\r
+       //Select Update Mode for output\r
+       value.ulVal = updFmt;\r
+       if(!BLUE_PASS(pSDK_->SetCardProperty(VIDEO_UPDATE_TYPE, value))) {\r
+               CASPAR_LOG(error) << "BLUECARD ERROR: Failed to set update type. (device " << _deviceIndex << TEXT(")");\r
+               return false;\r
+       }\r
+       \r
+       //Select output memory format\r
+       value.ulVal = memFmt;\r
+       if(!BLUE_PASS(pSDK_->SetCardProperty(VIDEO_MEMORY_FORMAT, value))) {\r
+               CASPAR_LOG(error) << "BLUECARD ERROR: Failed to set memory format. (device " << _deviceIndex << TEXT(")");\r
+               return false;\r
+       }\r
+\r
+       //SELECT IMAGE ORIENTATION\r
+       value.ulVal = ImageOrientation_Normal;\r
+       if(!BLUE_PASS(pSDK_->SetCardProperty(VIDEO_IMAGE_ORIENTATION, value))) {\r
+               CASPAR_LOG(error) << "BLUECARD ERROR: Failed to set image orientation to normal. (device " << _deviceIndex << TEXT(")");\r
+       }\r
+\r
+       value.ulVal = CGR_RANGE;\r
+       if(!BLUE_PASS(pSDK_->SetCardProperty(VIDEO_RGB_DATA_RANGE, value))) {\r
+               CASPAR_LOG(error) << "BLUECARD ERROR: Failed to set RGB data range to CGR. (device " << _deviceIndex << TEXT(")");\r
+       }\r
+\r
+       value.ulVal = MATRIX_709_CGR;\r
+       if(vidFmt == VID_FMT_PAL) {\r
+               value.ulVal = MATRIX_601_CGR;\r
+       }\r
+       if(!BLUE_PASS(pSDK_->SetCardProperty(VIDEO_PREDEFINED_COLOR_MATRIX, value))) {\r
+               CASPAR_LOG(error) << "BLUECARD ERROR: Failed to set colormatrix to " << (vidFmt == VID_FMT_PAL ? TEXT("601 CGR") : TEXT("709 CGR")) << TEXT(". (device ") << _deviceIndex << TEXT(")");\r
+       }\r
+       \r
+\r
+       //Disable embedded audio\r
+       value.ulVal = 1;\r
+       if(!BLUE_PASS(pSDK_->SetCardProperty(EMBEDDED_AUDIO_OUTPUT, value))) {\r
+               CASPAR_LOG(error) << "BLUECARD ERROR: Failed to enable embedded audio. (device " << _deviceIndex << TEXT(")");\r
+       }\r
+       else {\r
+               CASPAR_LOG(info) << "BLUECARD INFO: Enabled embedded audio. (device " << _deviceIndex << TEXT(")");\r
+               hasEmbeddedAudio_ = true;\r
+       }\r
+\r
+       CASPAR_LOG(info) << "BLUECARD INFO: Successfully configured bluecard for " << format_desc_.name << TEXT(". (device ") << _deviceIndex << TEXT(")");\r
+\r
+       if (pSDK_->has_output_key()) {\r
+               iDummy = TRUE;\r
+               int v4444 = FALSE, invert = FALSE, white = FALSE;\r
+               pSDK_->set_output_key(iDummy, v4444, invert, white);\r
+       }\r
+\r
+       if(pSDK_->GetHDCardType(_deviceIndex) != CRD_HD_INVALID) {\r
+               pSDK_->Set_DownConverterSignalType((vidFmt == VID_FMT_PAL) ? SD_SDI : HD_SDI);\r
+       }\r
+\r
+       ULONG videoGolden = BlueVelvetGolden(vidFmt, memFmt, updFmt);\r
+\r
+       pFrameManager_ = BluefishFrameManagerPtr(new BluefishFrameManager(pSDK_, currentFormat_, videoGolden));\r
+\r
+       pPlayback_ = std::make_shared<BluefishPlaybackStrategy>(this);\r
+\r
+       if(BLUE_FAIL(pSDK_->set_video_engine(engineMode))) {\r
+               CASPAR_LOG(error) << "BLUECARD ERROR: Failed to set vido engine. (device " << _deviceIndex << TEXT(")");\r
+               return false;\r
+       }\r
+\r
+       EnableVideoOutput();\r
+\r
+       CASPAR_LOG(info) << "BLUECARD INFO: Successfully initialized device " << _deviceIndex;\r
+       return true;\r
+}\r
+\r
+bool BlueFishVideoConsumer::ReleaseDevice()\r
+{\r
+       pPlayback_.reset();\r
+\r
+       pFrameManager_.reset();\r
+       DisableVideoOutput();\r
+\r
+       if(pSDK_) {\r
+               pSDK_->device_detach();\r
+       }\r
+\r
+       CASPAR_LOG(info) << "BLUECARD INFO: Successfully released device " << _deviceIndex;\r
+       return true;\r
+}\r
+\r
+void BlueFishVideoConsumer::EnableVideoOutput()\r
+{\r
+       //Need sync. protection?\r
+       if(pSDK_)\r
+       {\r
+               VARIANT value;\r
+               value.vt = VT_UI4;\r
+\r
+               //Deactivate channel\r
+               value.ulVal = 0;\r
+               if(!BLUE_PASS(pSDK_->SetCardProperty(VIDEO_BLACKGENERATOR, value))) {\r
+                       CASPAR_LOG(error) << "BLUECARD ERROR: Failed to disable video output. (device " << _deviceIndex << TEXT(")");\r
+               }\r
+       }\r
+}\r
+\r
+void BlueFishVideoConsumer::DisableVideoOutput()\r
+{\r
+       //Need sync. protection?\r
+       if(pSDK_)\r
+       {\r
+               VARIANT value;\r
+               value.vt = VT_UI4;\r
+\r
+               //Deactivate channel\r
+               value.ulVal = 1;\r
+               if(!BLUE_PASS(pSDK_->SetCardProperty(VIDEO_BLACKGENERATOR, value))) {\r
+                       CASPAR_LOG(error) << "BLUECARD ERROR: Failed to disable video output. (device " << _deviceIndex << TEXT(")");\r
+               }\r
+       }\r
+}\r
+\r
+void BlueFishVideoConsumer::display(const frame_ptr& frame)\r
+{\r
+       if(frame == nullptr)\r
+               return;\r
+\r
+       if(pException_ != nullptr)\r
+               std::rethrow_exception(pException_);\r
+\r
+       frameBuffer_.push(frame);\r
+}\r
+\r
+void BlueFishVideoConsumer::Run()\r
+{\r
+       while(true)\r
+       {\r
+               try\r
+               {\r
+                       frame_ptr frame;\r
+                       frameBuffer_.pop(frame);\r
+                       if(frame == nullptr)\r
+                               return;\r
+\r
+                       pPlayback_->display(frame);\r
+               }\r
+               catch(...)\r
+               {\r
+                       pException_ = std::current_exception();\r
+               }\r
+       }       \r
+}\r
+\r
+}}\r
+\r
+#endif
\ No newline at end of file
diff --git a/core/consumer/bluefish/BlueFishVideoConsumer.h b/core/consumer/bluefish/BlueFishVideoConsumer.h
new file mode 100644 (file)
index 0000000..e62e0aa
--- /dev/null
@@ -0,0 +1,90 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../../../common/concurrency/thread.h"\r
+#include "BluefishException.h"\r
+#include "BluefishFrameManager.h"\r
+#include "../../consumer/frame_consumer.h"\r
+#include "../../renderer/render_device.h"\r
+#include <tbb/concurrent_queue.h>\r
+#include <boost/thread.hpp>\r
+\r
+#define TIMEOUT                        1000\r
+\r
+class CBlueVelvet4;\r
+\r
+namespace caspar {\r
+       \r
+namespace bluefish {\r
+\r
+typedef std::tr1::shared_ptr<CBlueVelvet4> BlueVelvetPtr;\r
+\r
+class BlueFishVideoConsumer : public frame_consumer\r
+{\r
+       friend class BluefishPlaybackStrategy;\r
+\r
+       BlueFishVideoConsumer(const frame_format_desc& format_desc);\r
+       BlueFishVideoConsumer(const BlueFishVideoConsumer&);\r
+       const BlueFishVideoConsumer& operator=(const BlueFishVideoConsumer&);\r
+\r
+public:\r
+       virtual ~BlueFishVideoConsumer();\r
+\r
+       static int EnumerateDevices();\r
+       static frame_consumer_ptr Create(const frame_format_desc& format_desc, unsigned int deviceIndex);\r
+       \r
+       void display(const frame_ptr&);\r
+               \r
+       const frame_format_desc& get_frame_format_desc() const { return format_desc_; }\r
+\r
+private:\r
+\r
+       void Run();\r
+\r
+       void EnableVideoOutput();\r
+       void DisableVideoOutput();\r
+       bool SetupDevice(unsigned int deviceIndex);\r
+       bool ReleaseDevice();\r
+\r
+       bool DoSetupDevice(unsigned int deviceIndex);\r
+\r
+       BlueVelvetPtr pSDK_;\r
+       std::shared_ptr<BluefishPlaybackStrategy> pPlayback_;\r
+       BluefishFrameManagerPtr pFrameManager_;\r
+       unsigned long m_bufferCount;\r
+       unsigned long m_length;\r
+       unsigned long m_actual;\r
+       unsigned long m_golden;\r
+\r
+       unsigned long VidFmtFromFrameFormat(frame_format fmt);\r
+\r
+       frame_format currentFormat_;\r
+       unsigned int _deviceIndex;\r
+       bool hasEmbeddedAudio_;\r
+       frame_format_desc format_desc_;\r
+       \r
+       std::exception_ptr pException_;\r
+       boost::thread thread_;\r
+       tbb::concurrent_bounded_queue<frame_ptr> frameBuffer_;\r
+};\r
+typedef std::tr1::shared_ptr<BlueFishVideoConsumer> BlueFishFrameConsumerPtr;\r
+\r
+}}\r
diff --git a/core/consumer/bluefish/BluefishException.h b/core/consumer/bluefish/BluefishException.h
new file mode 100644 (file)
index 0000000..4ea18eb
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#ifndef _CASPAR_BLUEFISHEXCEPTION_H__\r
+#define _CASPAR_BLUEFISHEXCEPTION_H__\r
+\r
+#include <exception>\r
+\r
+namespace caspar {\r
+namespace bluefish {\r
+\r
+class BluefishException : public std::exception\r
+{\r
+public:\r
+       explicit BluefishException(const char* msg) : std::exception(msg) {}\r
+       ~BluefishException() {}\r
+};\r
+\r
+}      //namespace bluefish\r
+}      //namespace caspar\r
+\r
+#endif //_CASPAR_BLUEFISHEXCEPTION_H__
\ No newline at end of file
diff --git a/core/consumer/bluefish/BluefishFrameManager.cpp b/core/consumer/bluefish/BluefishFrameManager.cpp
new file mode 100644 (file)
index 0000000..aa53528
--- /dev/null
@@ -0,0 +1,191 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "..\..\StdAfx.h"\r
+\r
+#include <BlueVelvet4.h>\r
+#include "BluefishFrameManager.h"\r
+#include <tbb/scalable_allocator.h>\r
+\r
+#define        BUFFER_ID_USER_BASE             (6)\r
+\r
+namespace caspar {\r
+namespace bluefish {\r
+\r
+//////////////////////\r
+// CardFrameInfo\r
+//\r
+CardFrameInfo::CardFrameInfo(BlueVelvetPtr pSDK, int dataSize, int bufferID) : pSDK_(pSDK), dataSize_(dataSize), pData_(0), bufferID_(bufferID)\r
+{\r
+       if(BLUE_FAIL(pSDK->system_buffer_map(reinterpret_cast<void**>(&pData_), bufferID)))\r
+       {\r
+               throw BluefishException("Failed to map buffer");\r
+       }\r
+}\r
+\r
+CardFrameInfo::~CardFrameInfo()\r
+{\r
+       try\r
+       {\r
+               if(pSDK_ != 0 && pData_ != 0)\r
+                       pSDK_->system_buffer_unmap(pData_);\r
+       }\r
+       catch(...) {}\r
+}\r
+\r
+\r
+//////////////////////\r
+// SystemFrameInfo\r
+//\r
+SystemFrameInfo::SystemFrameInfo(int dataSize, int bufferID) : dataSize_(dataSize), pData_(0), bufferID_(bufferID)\r
+{\r
+       pData_ = static_cast<unsigned char*>(::VirtualAlloc(NULL, dataSize_, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));\r
+       if(pData_ == 0)\r
+       {\r
+               throw BluefishException("Failed to allocate memory for frame");\r
+       }\r
+       if(::VirtualLock(pData_, dataSize_) == 0)\r
+       {\r
+               throw BluefishException("Failed to lock memory for frame");\r
+       }\r
+}\r
+\r
+SystemFrameInfo::~SystemFrameInfo()\r
+{\r
+       try\r
+       {\r
+               if(pData_ != 0)\r
+                       ::VirtualFree(pData_, 0, MEM_RELEASE);\r
+       }\r
+       catch(...) {}\r
+}\r
+\r
+////////////////////////\r
+// BluefishVideoFrame\r
+//\r
+BluefishVideoFrame::BluefishVideoFrame(BluefishFrameManager* pFrameManager) : pFrameManager_(pFrameManager)\r
+{\r
+       if(pFrameManager_ != 0)\r
+               pInfo_ = pFrameManager_->GetBuffer();\r
+       if(pInfo_ != nullptr)\r
+       {\r
+               size_ = pInfo_->size();\r
+               data_ = pInfo_->GetPtr();\r
+               buffer_id_ = pInfo_->GetBufferID();\r
+       }\r
+       else\r
+       {\r
+               size_ = pFrameManager->get_frame_format_desc().size;\r
+               data_ = static_cast<unsigned char*>(scalable_aligned_malloc(16, size_));\r
+               buffer_id_ = 0;\r
+       }\r
+}\r
+\r
+BluefishVideoFrame::~BluefishVideoFrame()\r
+{\r
+       if(pFrameManager_ != 0 && pInfo_ != 0)\r
+               pFrameManager_->ReturnBuffer(pInfo_);\r
+\r
+       if(pInfo_ != nullptr)\r
+       {\r
+       }\r
+       else\r
+       {\r
+               scalable_aligned_free(data_);\r
+       }\r
+}\r
+\r
+//////////////////////////////\r
+// BluefishVideoFrameFactory\r
+//\r
+BluefishFrameManager::BluefishFrameManager(BlueVelvetPtr pSDK, frame_format fmt, unsigned long optimalLength) : pSDK_(pSDK), format_(fmt)\r
+{\r
+       //const frame_format_desc& format_desc = frame_format_desc::format_descs[fmt];\r
+\r
+       SIZE_T workingSetMinSize = 0, workingSetMaxSize = 0;\r
+       if(::GetProcessWorkingSetSize(::GetCurrentProcess(), &workingSetMinSize, &workingSetMaxSize) != 0)\r
+       {\r
+               CASPAR_LOG(debug) << "WorkingSet size: min = " << workingSetMinSize << TEXT(", max = ") << workingSetMaxSize;\r
+               \r
+               workingSetMinSize += optimalLength * 6;\r
+               workingSetMaxSize += optimalLength * 6;\r
+\r
+               if(::SetProcessWorkingSetSize(::GetCurrentProcess(), workingSetMinSize, workingSetMaxSize) == 0)\r
+               {\r
+                       CASPAR_LOG(error) << "Failed to set workingset: min = " << workingSetMinSize << TEXT(", max = ") << workingSetMaxSize;\r
+               }\r
+       }\r
+\r
+       //for(int cardBufferIndex = 0; cardBufferIndex < 4; ++cardBufferIndex)\r
+       //{\r
+       //      frameBuffers_.push_back(VideoFrameInfoPtr(new CardFrameInfo(pSDK, optimalLength, BUFFER_ID_VIDEO0 + cardBufferIndex)));\r
+       //}\r
+       for(int systemBufferIndex = 0; systemBufferIndex < 6; ++systemBufferIndex)\r
+       {\r
+               frameBuffers_.push_back(VideoFrameInfoPtr(new SystemFrameInfo(optimalLength, BUFFER_ID_USER_BASE + systemBufferIndex)));\r
+       }\r
+\r
+       FrameInfoList::const_iterator it = frameBuffers_.begin();\r
+       FrameInfoList::const_iterator end = frameBuffers_.end();\r
+       for(; it != end; ++it)\r
+       {\r
+               if(BLUE_FAIL(pSDK_->system_buffer_assign((*it)->GetPtr(), (*it)->GetBufferID(), (*it)->size(), BUFFER_TYPE_VIDEO)))\r
+               {\r
+                       throw BluefishException("Failed to assign buffer");\r
+               }\r
+       }\r
+}\r
+\r
+BluefishFrameManager::~BluefishFrameManager()\r
+{\r
+}\r
+\r
+std::shared_ptr<BluefishVideoFrame> BluefishFrameManager::CreateFrame()\r
+{\r
+       return std::make_shared<BluefishVideoFrame>(this);\r
+}\r
+\r
+const frame_format_desc& BluefishFrameManager::get_frame_format_desc() const\r
+{\r
+       return frame_format_desc::format_descs[format_];\r
+}\r
+\r
+VideoFrameInfoPtr BluefishFrameManager::GetBuffer()\r
+{\r
+       tbb::mutex::scoped_lock lock(mutex_);\r
+       VideoFrameInfoPtr pInfo;\r
+\r
+       if(frameBuffers_.size() > 0)\r
+       {\r
+               pInfo = frameBuffers_.front();\r
+               frameBuffers_.pop_front();\r
+       }\r
+\r
+       return pInfo;\r
+}\r
+\r
+void BluefishFrameManager::ReturnBuffer(VideoFrameInfoPtr pInfo)\r
+{\r
+       tbb::mutex::scoped_lock lock(mutex_);\r
+       if(pInfo != 0)\r
+               frameBuffers_.push_back(pInfo);\r
+}\r
+\r
+}}
\ No newline at end of file
diff --git a/core/consumer/bluefish/BluefishFrameManager.h b/core/consumer/bluefish/BluefishFrameManager.h
new file mode 100644 (file)
index 0000000..e52d146
--- /dev/null
@@ -0,0 +1,154 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#ifndef _CASPAR_BLUEFISHVIDEOFRAMEFACTORY_H__\r
+#define _CASPAR_BLUEFISHVIDEOFRAMEFACTORY_H__\r
+\r
+#pragma once\r
+\r
+#include "..\..\frame\system_frame.h"\r
+#include "..\..\frame\frame_format.h"\r
+#include <list>\r
+#include <memory>\r
+#include "BluefishException.h"\r
+\r
+#include <tbb\mutex.h>\r
+\r
+class CBlueVelvet4;\r
+\r
+namespace caspar {\r
+namespace bluefish {\r
+\r
+typedef std::tr1::shared_ptr<CBlueVelvet4> BlueVelvetPtr;\r
+\r
+class VideoFrameInfo\r
+{\r
+public:\r
+       VideoFrameInfo() {}\r
+       virtual ~VideoFrameInfo() {}\r
+\r
+       virtual unsigned char* GetPtr() const = 0;\r
+       virtual int GetBufferID() const = 0;\r
+       virtual int size() const = 0;\r
+};\r
+typedef std::tr1::shared_ptr<VideoFrameInfo> VideoFrameInfoPtr;\r
+\r
+class CardFrameInfo : public VideoFrameInfo\r
+{\r
+public:\r
+       CardFrameInfo(BlueVelvetPtr pSDK, int dataSize, int bufferID);\r
+       ~CardFrameInfo();\r
+\r
+       unsigned char* GetPtr() const {\r
+               return pData_;\r
+       }\r
+       int GetBufferID() const {\r
+               return bufferID_;\r
+       }\r
+       int size() const {\r
+               return dataSize_;\r
+       }\r
+\r
+private:\r
+       BlueVelvetPtr pSDK_;\r
+       unsigned char* pData_;\r
+       int bufferID_;\r
+       int dataSize_;\r
+};\r
+\r
+class SystemFrameInfo : public VideoFrameInfo\r
+{\r
+public:\r
+       SystemFrameInfo(int dataSize, int bufferID);\r
+       ~SystemFrameInfo();\r
+\r
+       unsigned char* GetPtr() const {\r
+               return pData_;\r
+       }\r
+       int GetBufferID() const {\r
+               return bufferID_;\r
+       }\r
+       int size() const {\r
+               return dataSize_;\r
+       }\r
+\r
+private:\r
+       unsigned char* pData_;\r
+       int bufferID_;\r
+       int dataSize_;\r
+};\r
+\r
+class BluefishFrameManager\r
+{\r
+       friend class BluefishVideoFrame;\r
+       typedef std::list<VideoFrameInfoPtr> FrameInfoList;\r
+\r
+       BluefishFrameManager(const BluefishFrameManager&);\r
+       const BluefishFrameManager& operator=(const BluefishFrameManager&);\r
+\r
+public:\r
+       BluefishFrameManager(BlueVelvetPtr pSDK, frame_format fmt, unsigned long optimalLength);\r
+       virtual ~BluefishFrameManager();\r
+\r
+       virtual std::shared_ptr<BluefishVideoFrame> CreateFrame();\r
+       virtual const frame_format_desc& get_frame_format_desc() const;\r
+\r
+private:\r
+       VideoFrameInfoPtr GetBuffer();\r
+       void ReturnBuffer(VideoFrameInfoPtr);\r
+\r
+       BlueVelvetPtr pSDK_;\r
+       frame_format format_;\r
+       FrameInfoList frameBuffers_;\r
+       tbb::mutex mutex_;\r
+};\r
+typedef std::tr1::shared_ptr<BluefishFrameManager> BluefishFrameManagerPtr;\r
+\r
+\r
+class BluefishVideoFrame : public frame\r
+{\r
+public:\r
+       explicit BluefishVideoFrame(BluefishFrameManager* pFrameManager);\r
+\r
+       virtual ~BluefishVideoFrame();\r
+\r
+       unsigned char* data() { return data_;   }\r
+\r
+       unsigned int size() const { return size_; }\r
+       \r
+       long meta_data() const { return buffer_id_; }\r
+\r
+       void* tag() const\r
+       {\r
+               return pFrameManager_;\r
+       }\r
+private:\r
+       unsigned char* data_;\r
+       long buffer_id_;\r
+       size_t size_;\r
+       VideoFrameInfoPtr pInfo_;\r
+       BluefishFrameManager* pFrameManager_;\r
+};\r
+\r
+\r
+}      //namespace bluefish\r
+}      //namespace caspar\r
+\r
+#endif //_CASPAR_BLUEFISHVIDEOFRAMEFACTORY_H__
\ No newline at end of file
diff --git a/core/consumer/bluefish/BluefishPlaybackStrategy.cpp b/core/consumer/bluefish/BluefishPlaybackStrategy.cpp
new file mode 100644 (file)
index 0000000..9969662
--- /dev/null
@@ -0,0 +1,135 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "../../StdAfx.h"\r
+\r
+#include "../../../common/image/image.h"\r
+#include <BlueVelvet4.h>\r
+#include <BlueHancUtils.h>\r
+\r
+#include <vector>\r
+\r
+#include "BluefishPlaybackStrategy.h"\r
+#include "BluefishVideoConsumer.h"\r
+\r
+namespace caspar { namespace bluefish {\r
+\r
+using namespace caspar::common;\r
+\r
+struct BluefishPlaybackStrategy::Implementation\r
+{\r
+       Implementation(BlueFishVideoConsumer* pConsumer) : pConsumer_(pConsumer), currentReservedFrameIndex_(0)\r
+       {\r
+               auto frame = pConsumer->pFrameManager_->CreateFrame();\r
+               if(frame != 0)\r
+                       reservedFrames_.push_back(frame);\r
+               else {\r
+                       throw std::exception("Failed to reserve temporary bluefishframe");\r
+               }\r
+               frame.reset();\r
+\r
+               frame = pConsumer->pFrameManager_->CreateFrame();\r
+               if(frame != 0)\r
+                       reservedFrames_.push_back(frame);\r
+               else {\r
+                       throw std::exception("Failed to reserve temporary bluefishframe");\r
+               }\r
+\r
+               memset(&hancStreamInfo_, 0, sizeof(hancStreamInfo_));\r
+       }\r
+       std::shared_ptr<BluefishVideoFrame> GetReservedFrame() {\r
+               std::shared_ptr<BluefishVideoFrame> frame = reservedFrames_[currentReservedFrameIndex_];\r
+               currentReservedFrameIndex_ ^= 1;\r
+               return frame;\r
+       }\r
+\r
+       void DisplayFrame(const frame_ptr& frame)\r
+       {\r
+               if(frame != nullptr) {\r
+                       if(pConsumer_->pFrameManager_.get() == reinterpret_cast<BluefishFrameManager*>(frame->tag())) {\r
+                               DoRender(std::static_pointer_cast<BluefishVideoFrame>(frame));\r
+                       }\r
+                       else {\r
+                               std::shared_ptr<BluefishVideoFrame> pTempFrame = reservedFrames_[currentReservedFrameIndex_];\r
+                               if(frame->size() == pTempFrame->size()) {\r
+                                       common::image::copy(pTempFrame->data(), frame->data(), pTempFrame->size());\r
+                                       DoRender(pTempFrame);\r
+                               }\r
+\r
+                               currentReservedFrameIndex_ ^= 1;\r
+                       }\r
+               }\r
+               else {\r
+                       CASPAR_LOG(error) << "BLUEFISH: Tried to render frame with no data";\r
+               }\r
+       }\r
+\r
+       void DoRender(const std::shared_ptr<BluefishVideoFrame>& frame) {\r
+               static bool doLog = true;\r
+               static int frameID = 0;\r
+               // video synch\r
+               unsigned long fieldCount = 0;\r
+               pConsumer_->pSDK_->wait_output_video_synch(UPD_FMT_FRAME, fieldCount);\r
+\r
+               // Host->PCI in_Frame buffer to the card buffer\r
+               pConsumer_->pSDK_->system_buffer_write_async(frame->data(), frame->size(), 0, frame->meta_data(), 0);\r
+               if(BLUE_FAIL(pConsumer_->pSDK_->render_buffer_update(frame->meta_data()))) {\r
+               /*pConsumer_->pSDK_->system_buffer_write_async(frame->data(), frame->size(), 0, frameID, 0);\r
+               if(BLUE_FAIL(pConsumer_->pSDK_->render_buffer_update(frameID))) {*/\r
+                       if(doLog) {\r
+                               CASPAR_LOG(error) << "BLUEFISH: render_buffer_update failed";\r
+                               doLog = false;\r
+                       }\r
+               }\r
+               else\r
+                       doLog = true;\r
+\r
+               frameID = (frameID+1) & 3;\r
+       }\r
+\r
+       BlueFishVideoConsumer* pConsumer_;\r
+       std::vector<std::shared_ptr<BluefishVideoFrame>> reservedFrames_;\r
+       int currentReservedFrameIndex_;\r
+\r
+       hanc_stream_info_struct hancStreamInfo_;\r
+};\r
+\r
+BluefishPlaybackStrategy::BluefishPlaybackStrategy(BlueFishVideoConsumer* pConsumer) : pImpl_(new Implementation(pConsumer)) \r
+{ }\r
+\r
+BluefishPlaybackStrategy::~BluefishPlaybackStrategy()\r
+{ }\r
+//\r
+//FrameConsumer* BluefishPlaybackStrategy::GetConsumer()\r
+//{\r
+//     return pImpl_->pConsumer_;\r
+//}\r
+//\r
+//frame_ptr BluefishPlaybackStrategy::GetReservedFrame() {\r
+//     return pImpl_->GetReservedFrame();\r
+//}\r
+\r
+void BluefishPlaybackStrategy::display(const frame_ptr& frame) \r
+{\r
+       return pImpl_->DisplayFrame(frame);\r
+}\r
+\r
+}      //namespace bluefish\r
+}      //namespace caspar
\ No newline at end of file
diff --git a/core/consumer/bluefish/BluefishPlaybackStrategy.h b/core/consumer/bluefish/BluefishPlaybackStrategy.h
new file mode 100644 (file)
index 0000000..271e0c1
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#pragma once\r
+\r
+#include "../../frame/frame.h"\r
+#include "../../consumer/frame_consumer.h"\r
+\r
+namespace caspar {\r
+namespace bluefish {\r
+\r
+class BlueFishVideoConsumer;\r
+\r
+class BluefishPlaybackStrategy\r
+{\r
+       struct Implementation;\r
+       std::shared_ptr<Implementation> pImpl_;\r
+\r
+public:\r
+       explicit BluefishPlaybackStrategy(BlueFishVideoConsumer* pConsumer);\r
+       virtual ~BluefishPlaybackStrategy();\r
+\r
+       void display(const frame_ptr&);\r
+};\r
+\r
+}      //namespace bluefish\r
+}      //namespace caspar\r
diff --git a/core/consumer/decklink/DeckLinkAPI.idl b/core/consumer/decklink/DeckLinkAPI.idl
new file mode 100644 (file)
index 0000000..0c055f7
--- /dev/null
@@ -0,0 +1,847 @@
+/* -LICENSE-START-\r
+** Copyright (c) 2009 Blackmagic Design\r
+**\r
+** Permission is hereby granted, free of charge, to any person or organization\r
+** obtaining a copy of the software and accompanying documentation covered by\r
+** this license (the "Software") to use, reproduce, display, distribute,\r
+** execute, and transmit the Software, and to prepare derivative works of the\r
+** Software, and to permit third-parties to whom the Software is furnished to\r
+** do so, all subject to the following:\r
+** \r
+** The copyright notices in the Software and this entire statement, including\r
+** the above license grant, this restriction and the following disclaimer,\r
+** must be included in all copies of the Software, in whole or in part, and\r
+** all derivative works of the Software, unless such copies or derivative\r
+** works are solely in the form of machine-executable object code generated by\r
+** a source language processor.\r
+** \r
+** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\r
+** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\r
+** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\r
+** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+** DEALINGS IN THE SOFTWARE.\r
+** -LICENSE-END-\r
+*/\r
+\r
+/* DeckLinkAPI.idl */\r
+\r
+import "unknwn.idl";\r
+\r
+[uuid(D864517A-EDD5-466D-867D-C819F1C052BB),\r
+version(1.0), helpstring("DeckLink API Library")]\r
+library DeckLinkAPI\r
+{\r
+\r
+/* Type Declarations */\r
+\r
+typedef LONGLONG BMDTimeValue;\r
+typedef LONGLONG BMDTimeScale;\r
+typedef unsigned long BMDTimecodeBCD;\r
+\r
+/* End Type Declarations */\r
+\r
+/* Enumeration Mapping */\r
+\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("#if 0")\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
+cpp_quote("#endif")\r
+\r
+/* End Enumeration Mapping */\r
+\r
+/* Enum BMDDisplayMode - Video display modes */\r
+\r
+typedef [v1_enum] enum _BMDDisplayMode {\r
+    bmdModeNTSC                                        = /* 'ntsc' */ 0x6E747363,\r
+    bmdModeNTSC2398                                    = /* 'nt23' */ 0x6E743233, // 3:2 pulldown\r
+    bmdModePAL                                         = /* 'pal ' */ 0x70616C20,\r
+\r
+    /* HD 1080 Modes */\r
+\r
+    bmdModeHD1080p2398                                 = /* '23ps' */ 0x32337073,\r
+    bmdModeHD1080p24                                   = /* '24ps' */ 0x32347073,\r
+    bmdModeHD1080p25                                   = /* 'Hp25' */ 0x48703235,\r
+    bmdModeHD1080p2997                                 = /* 'Hp29' */ 0x48703239,\r
+    bmdModeHD1080p30                                   = /* 'Hp30' */ 0x48703330,\r
+    bmdModeHD1080i50                                   = /* 'Hi50' */ 0x48693530,\r
+    bmdModeHD1080i5994                                 = /* 'Hi59' */ 0x48693539,\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
+\r
+    /* HD 720 Modes */\r
+\r
+    bmdModeHD720p50                                    = /* 'hp50' */ 0x68703530,\r
+    bmdModeHD720p5994                                  = /* 'hp59' */ 0x68703539,\r
+    bmdModeHD720p60                                    = /* 'hp60' */ 0x68703630,\r
+\r
+    /* 2k Modes */\r
+\r
+    bmdMode2k2398                                      = /* '2k23' */ 0x326B3233,\r
+    bmdMode2k24                                        = /* '2k24' */ 0x326B3234,\r
+    bmdMode2k25                                        = /* '2k25' */ 0x326B3235\r
+} BMDDisplayMode;\r
+\r
+/* End Enum BMDDisplayMode */\r
+\r
+/* Enum BMDFieldDominance - Video field dominance */\r
+\r
+typedef [v1_enum] enum _BMDFieldDominance {\r
+    bmdUnknownFieldDominance                           = 0,\r
+    bmdLowerFieldFirst                                 = /* 'lowr' */ 0x6C6F7772,\r
+    bmdUpperFieldFirst                                 = /* 'uppr' */ 0x75707072,\r
+    bmdProgressiveFrame                                = /* 'prog' */ 0x70726F67,\r
+    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
+    bmdFormat8BitBGRA                                  = /* 'BGRA' */ 0x42475241,\r
+    bmdFormat10BitRGB                                  = /* 'r210' */ 0x72323130\r
+} BMDPixelFormat;\r
+\r
+/* End Enum BMDPixelFormat */\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
+} BMDVideoOutputFlags;\r
+\r
+/* End Enum BMDVideoOutputFlags */\r
+\r
+/* Enum BMDFrameFlags - Frame flags */\r
+\r
+[v1_enum] enum _BMDFrameFlags {\r
+    bmdFrameFlagDefault                                = 0,\r
+    bmdFrameFlagFlipVertical                           = 1 << 0,\r
+\r
+    /* Flags that are valid only for frames returned through IDeckLinkInput */\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
+};\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
+[v1_enum] enum _BMDVideoInputFormatChangedEvents {\r
+    bmdVideoInputDisplayModeChanged                    = 1 << 0,\r
+    bmdVideoInputFieldDominanceChanged                 = 1 << 1,\r
+    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
+[v1_enum] enum _BMDDetectedVideoInputFormatFlags {\r
+    bmdDetectedVideoInputYCbCr422                      = 1 << 0,\r
+    bmdDetectedVideoInputRGB444                        = 1 << 1\r
+};\r
+\r
+/* End Enum BMDDetectedVideoInputFormatFlags */\r
+\r
+/* Enum BMDOutputFrameCompletionResult - Frame Completion Callback */\r
+\r
+typedef [v1_enum] enum _BMDOutputFrameCompletionResult {\r
+    bmdOutputFrameCompleted,                          \r
+    bmdOutputFrameDisplayedLate,                      \r
+    bmdOutputFrameDropped,                            \r
+    bmdOutputFrameFlushed                             \r
+} BMDOutputFrameCompletionResult;\r
+\r
+/* End Enum BMDOutputFrameCompletionResult */\r
+\r
+/* Enum BMDAudioSampleRate - Audio sample rates supported for output/input */\r
+\r
+typedef [v1_enum] enum _BMDAudioSampleRate {\r
+    bmdAudioSampleRate48kHz                            = 48000\r
+} BMDAudioSampleRate;\r
+\r
+/* End Enum BMDAudioSampleRate */\r
+\r
+/* Enum BMDAudioSampleType - Audio sample sizes supported for output/input */\r
+\r
+typedef [v1_enum] enum _BMDAudioSampleType {\r
+    bmdAudioSampleType16bitInteger                     = 16,\r
+    bmdAudioSampleType32bitInteger                     = 32\r
+} BMDAudioSampleType;\r
+\r
+/* End Enum BMDAudioSampleType */\r
+\r
+/* Enum BMDAudioOutputStreamType - Audio output stream type */\r
+\r
+typedef [v1_enum] enum _BMDAudioOutputStreamType {\r
+    bmdAudioOutputStreamContinuous,                   \r
+    bmdAudioOutputStreamContinuousDontResample,       \r
+    bmdAudioOutputStreamTimestamped                   \r
+} BMDAudioOutputStreamType;\r
+\r
+/* End Enum BMDAudioOutputStreamType */\r
+\r
+/* Enum BMDDisplayModeSupport - Output mode supported flags */\r
+\r
+typedef [v1_enum] enum _BMDDisplayModeSupport {\r
+    bmdDisplayModeNotSupported                         = 0,\r
+    bmdDisplayModeSupported,                          \r
+    bmdDisplayModeSupportedWithConversion             \r
+} BMDDisplayModeSupport;\r
+\r
+/* End Enum BMDDisplayModeSupport */\r
+\r
+/* Enum BMDTimecodeFormat - Timecode formats for frame metadata */\r
+\r
+typedef [v1_enum] enum _BMDTimecodeFormat {\r
+    bmdTimecodeRP188                                   = /* 'rp18' */ 0x72703138,\r
+    bmdTimecodeVITC                                    = /* 'vitc' */ 0x76697463,\r
+    bmdTimecodeSerial                                  = /* 'seri' */ 0x73657269\r
+} BMDTimecodeFormat;\r
+\r
+/* End Enum BMDTimecodeFormat */\r
+\r
+/* Enum BMDTimecodeFlags - Timecode flags */\r
+\r
+[v1_enum] enum _BMDTimecodeFlags {\r
+    bmdTimecodeFlagDefault                             = 0,\r
+    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
+} BMDVideoConnection;\r
+\r
+/* End Enum BMDVideoConnection */\r
+\r
+/* Enum BMDAnalogVideoFlags - Analog video display flags */\r
+\r
+[v1_enum] enum _BMDAnalogVideoFlags {\r
+    bmdAnalogVideoFlagCompositeSetup75                 = 1 << 0,\r
+    bmdAnalogVideoFlagComponentBetacamLevels           = 1 << 1\r
+};\r
+\r
+/* End Enum BMDAnalogVideoFlags */\r
+\r
+/* Enum BMDAudioConnection - Audio connection types */\r
+\r
+typedef [v1_enum] enum _BMDAudioConnection {\r
+    bmdAudioConnectionEmbedded                         = /* 'embd' */ 0x656D6264,\r
+    bmdAudioConnectionAESEBU                           = /* 'aes ' */ 0x61657320,\r
+    bmdAudioConnectionAnalog                           = /* 'anlg' */ 0x616E6C67\r
+} BMDAudioConnection;\r
+\r
+/* End Enum BMDAudioConnection */\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
+    bmdVideoOutputHD720toHD1080Conversion              = /* '720c' */ 0x37323063,\r
+    bmdVideoOutputHardwareLetterboxDownconversion      = /* 'HWlb' */ 0x48576C62,\r
+    bmdVideoOutputHardwareAnamorphicDownconversion     = /* 'HWam' */ 0x4857616D,\r
+    bmdVideoOutputHardwareCenterCutDownconversion      = /* 'HWcc' */ 0x48576363\r
+} BMDVideoOutputConversionMode;\r
+\r
+/* End Enum BMDVideoOutputConversionMode */\r
+\r
+/* Enum BMDVideoInputConversionMode - Video input conversion mode */\r
+\r
+typedef [v1_enum] enum _BMDVideoInputConversionMode {\r
+    bmdNoVideoInputConversion                          = /* 'none' */ 0x6E6F6E65,\r
+    bmdVideoInputLetterboxDownconversionFromHD1080     = /* '10lb' */ 0x31306C62,\r
+    bmdVideoInputAnamorphicDownconversionFromHD1080    = /* '10am' */ 0x3130616D,\r
+    bmdVideoInputLetterboxDownconversionFromHD720      = /* '72lb' */ 0x37326C62,\r
+    bmdVideoInputAnamorphicDownconversionFromHD720     = /* '72am' */ 0x3732616D,\r
+    bmdVideoInputLetterboxUpconversion                 = /* 'lbup' */ 0x6C627570,\r
+    bmdVideoInputAnamorphicUpconversion                = /* 'amup' */ 0x616D7570\r
+} BMDVideoInputConversionMode;\r
+\r
+/* End Enum BMDVideoInputConversionMode */\r
+\r
+/* Enum BMDDeckLinkAttributeID - DeckLink Atribute ID */\r
+\r
+typedef [v1_enum] enum _BMDDeckLinkAttributeID {\r
+\r
+    /* Flags */\r
+\r
+    BMDDeckLinkSupportsInternalKeying                  = /* 'keyi' */ 0x6B657969,\r
+    BMDDeckLinkSupportsExternalKeying                  = /* 'keye' */ 0x6B657965,\r
+    BMDDeckLinkSupportsHDKeying                        = /* 'keyh' */ 0x6B657968,\r
+    BMDDeckLinkSupportsInputFormatDetection            = /* 'infd' */ 0x696E6664,\r
+    BMDDeckLinkHasSerialPort                           = /* 'hspt' */ 0x68737074,\r
+\r
+    /* Integers */\r
+\r
+    BMDDeckLinkMaximumAudioChannels                    = /* 'mach' */ 0x6D616368,\r
+\r
+    /* Strings */\r
+\r
+    BMDDeckLinkSerialPortDeviceName                    = /* 'slpn' */ 0x736C706E\r
+} BMDDeckLinkAttributeID;\r
+\r
+/* End Enum BMDDeckLinkAttributeID */\r
+\r
+/* Enum BMDDeckLinkAPIInformationID - DeckLinkAPI information ID */\r
+\r
+typedef [v1_enum] enum _BMDDeckLinkAPIInformationID {\r
+    BMDDeckLinkAPIVersion                              = /* 'vers' */ 0x76657273\r
+} BMDDeckLinkAPIInformationID;\r
+\r
+/* End Enum BMDDeckLinkAPIInformationID */\r
+\r
+/* Forward Declarations */\r
+\r
+interface IDeckLinkVideoOutputCallback;\r
+interface IDeckLinkInputCallback;\r
+interface IDeckLinkMemoryAllocator;\r
+interface IDeckLinkAudioOutputCallback;\r
+interface IDeckLinkIterator;\r
+interface IDeckLinkAPIInformation;\r
+interface IDeckLinkDisplayModeIterator;\r
+interface IDeckLinkDisplayMode;\r
+interface IDeckLink;\r
+interface IDeckLinkOutput;\r
+interface IDeckLinkInput;\r
+interface IDeckLinkTimecode;\r
+interface IDeckLinkVideoFrame;\r
+interface IDeckLinkMutableVideoFrame;\r
+interface IDeckLinkVideoInputFrame;\r
+interface IDeckLinkVideoFrameAncillary;\r
+interface IDeckLinkAudioInputPacket;\r
+interface IDeckLinkScreenPreviewCallback;\r
+interface IDeckLinkGLScreenPreviewHelper;\r
+interface IDeckLinkConfiguration;\r
+interface IDeckLinkAttributes;\r
+interface IDeckLinkKeyer;\r
+\r
+/* End Forward Declarations */\r
+\r
+/* Interface IDeckLinkVideoOutputCallback - Frame completion callback. */\r
+\r
+[\r
+    object,\r
+    uuid(E763A626-4A3C-49D1-BF13-E7AD3692AE52),\r
+    helpstring("Frame completion callback.")\r
+] interface IDeckLinkVideoOutputCallback : IUnknown\r
+{\r
+    HRESULT ScheduledFrameCompleted([in] IDeckLinkVideoFrame *completedFrame, [in] BMDOutputFrameCompletionResult result);\r
+    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
+    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
+};\r
+\r
+/* End Interface IDeckLinkInputCallback */\r
+\r
+/* Interface IDeckLinkMemoryAllocator - Memory allocator for video frames. */\r
+\r
+[\r
+    object,\r
+    uuid(B36EB6E7-9D29-4AA8-92EF-843B87A289E8),\r
+    local, \r
+    helpstring("Memory allocator for video frames.")\r
+] interface IDeckLinkMemoryAllocator : IUnknown\r
+{\r
+    HRESULT AllocateBuffer(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
+[\r
+    object,\r
+    uuid(403C681B-7F46-4A12-B993-2BB127084EE6),\r
+    local, \r
+    helpstring("Optional callback to allow audio samples to be pulled as required.")\r
+] interface IDeckLinkAudioOutputCallback : IUnknown\r
+{\r
+    HRESULT RenderAudioSamples(BOOL preroll);\r
+};\r
+\r
+/* End Interface IDeckLinkAudioOutputCallback */\r
+\r
+/* Interface IDeckLinkIterator - enumerates installed DeckLink hardware */\r
+\r
+[\r
+    object,\r
+    uuid(74E936FC-CC28-4A67-81A0-1E94E52D4E69),\r
+    helpstring("enumerates installed DeckLink hardware")\r
+] interface IDeckLinkIterator : IUnknown\r
+{\r
+    HRESULT Next([out] IDeckLink **deckLinkInstance);\r
+};\r
+\r
+/* End Interface IDeckLinkIterator */\r
+\r
+/* Interface IDeckLinkAPIInformation - DeckLinkAPI attribute interface */\r
+\r
+[\r
+    object,\r
+    uuid(7BEA3C68-730D-4322-AF34-8A7152B532A4),\r
+    helpstring("DeckLinkAPI attribute interface")\r
+] interface IDeckLinkAPIInformation : IUnknown\r
+{\r
+    HRESULT GetFlag([in] BMDDeckLinkAPIInformationID cfgID, [out] BOOL *value);\r
+    HRESULT GetInt([in] BMDDeckLinkAPIInformationID cfgID, [out] LONGLONG *value);\r
+    HRESULT GetFloat([in] BMDDeckLinkAPIInformationID cfgID, [out] double *value);\r
+    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
+    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
+    helpstring("represents a display mode")\r
+] interface IDeckLinkDisplayMode : IUnknown\r
+{\r
+    HRESULT GetName([out] BSTR *name);\r
+    BMDDisplayMode GetDisplayMode(void);\r
+    long GetWidth(void);\r
+    long GetHeight(void);\r
+    HRESULT GetFrameRate([out] BMDTimeValue *frameDuration, [out] BMDTimeScale *timeScale);\r
+    BMDFieldDominance GetFieldDominance(void);\r
+};\r
+\r
+/* End Interface IDeckLinkDisplayMode */\r
+\r
+/* Interface IDeckLink - represents a DeckLink device */\r
+\r
+[\r
+    object,\r
+    uuid(62BFF75D-6569-4E55-8D4D-66AA03829ABC),\r
+    helpstring("represents a DeckLink device")\r
+] interface IDeckLink : IUnknown\r
+{\r
+    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
+    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 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 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
+\r
+    HRESULT DisplayVideoFrameSync([in] IDeckLinkVideoFrame *theFrame);\r
+    HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, 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 DisableAudioOutput(void);\r
+\r
+    HRESULT WriteAudioSamplesSync([in] void *buffer, 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
+\r
+    HRESULT GetBufferedAudioSampleFrameCount([out] unsigned long *bufferedSampleFrameCount);\r
+    HRESULT FlushBufferedAudioSamples(void);\r
+\r
+    HRESULT SetAudioCallback([in] IDeckLinkAudioOutputCallback *theCallback);\r
+\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 IsScheduledPlaybackRunning([out] BOOL *active);\r
+    HRESULT GetScheduledStreamTime(BMDTimeScale desiredTimeScale, [out] BMDTimeValue *streamTime, [out] double *playbackSpeed);\r
+\r
+    /* Hardware Timing */\r
+\r
+    HRESULT GetHardwareReferenceClock(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
+    helpstring("Created by QueryInterface from IDeckLink.")\r
+] interface IDeckLinkInput : IUnknown\r
+{\r
+    HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);\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 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 DisableAudioInput(void);\r
+    HRESULT GetAvailableAudioSampleFrameCount([out] unsigned long *availableSampleFrameCount);\r
+\r
+    /* Input Control */\r
+\r
+    HRESULT StartStreams(void);\r
+    HRESULT StopStreams(void);\r
+    HRESULT PauseStreams(void);\r
+    HRESULT FlushStreams(void);\r
+    HRESULT SetCallback([in] IDeckLinkInputCallback *theCallback);\r
+\r
+    /* Hardware Timing */\r
+\r
+    HRESULT GetHardwareReferenceClock(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
+    helpstring("Used for video frame timecode representation.")\r
+] interface IDeckLinkTimecode : IUnknown\r
+{\r
+    BMDTimecodeBCD GetBCD(void);\r
+    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
+};\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
+    local, \r
+    helpstring("Interface to encapsulate a video frame; can be caller-implemented.")\r
+] interface IDeckLinkVideoFrame : IUnknown\r
+{\r
+    long GetWidth(void);\r
+    long GetHeight(void);\r
+    long GetRowBytes(void);\r
+    BMDPixelFormat GetPixelFormat(void);\r
+    BMDFrameFlags GetFlags(void);\r
+    HRESULT GetBytes([out] void **buffer);\r
+\r
+    HRESULT GetTimecode(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
+    local, \r
+    helpstring("Created by IDeckLinkOutput::CreateVideoFrame.")\r
+] interface IDeckLinkMutableVideoFrame : IDeckLinkVideoFrame\r
+{\r
+    HRESULT SetFlags(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 SetAncillaryData([in] IDeckLinkVideoFrameAncillary *ancillary);\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
+    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
+};\r
+\r
+/* End Interface IDeckLinkVideoInputFrame */\r
+\r
+/* Interface IDeckLinkVideoFrameAncillary - Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */\r
+\r
+[\r
+    object,\r
+    uuid(732E723C-D1A4-4E29-9E8E-4A88797A0004),\r
+    local, \r
+    helpstring("Obtained through QueryInterface() on an IDeckLinkVideoFrame object.")\r
+] interface IDeckLinkVideoFrameAncillary : IUnknown\r
+{\r
+\r
+    HRESULT GetBufferForVerticalBlankingLine(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
+[\r
+    object,\r
+    uuid(E43D5870-2894-11DE-8C30-0800200C9A66),\r
+    local, \r
+    helpstring("Provided by the IDeckLinkInput callback.")\r
+] interface IDeckLinkAudioInputPacket : IUnknown\r
+{\r
+    long GetSampleFrameCount(void);\r
+    HRESULT GetBytes([out] void **buffer);\r
+    HRESULT GetPacketTime([out] BMDTimeValue *packetTime, 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
+    local, \r
+    helpstring("Screen preview callback")\r
+] interface IDeckLinkScreenPreviewCallback : IUnknown\r
+{\r
+    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
+    local, \r
+    helpstring("Created with CoCreateInstance().")\r
+] interface IDeckLinkGLScreenPreviewHelper : IUnknown\r
+{\r
+\r
+    /* Methods must be called with OpenGL context set */\r
+\r
+    HRESULT InitializeGL(void);\r
+    HRESULT PaintGL(void);\r
+    HRESULT SetFrame([in] IDeckLinkVideoFrame *theFrame);\r
+};\r
+\r
+/* End Interface IDeckLinkGLScreenPreviewHelper */\r
+\r
+/* Interface IDeckLinkConfiguration - Created by QueryInterface from IDeckLink. */\r
+\r
+[\r
+    object,\r
+    uuid(B8EAD569-B764-47F0-A73F-AE40DF6CBF10),\r
+    helpstring("Created by QueryInterface from IDeckLink.")\r
+] interface IDeckLinkConfiguration : IUnknown\r
+{\r
+    HRESULT GetConfigurationValidator([out] IDeckLinkConfiguration **configObject);\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
+[\r
+    object,\r
+    uuid(ABC11843-D966-44CB-96E2-A1CB5D3135C4),\r
+    local, \r
+    helpstring("DeckLink Attribute interface")\r
+] interface IDeckLinkAttributes : IUnknown\r
+{\r
+    HRESULT GetFlag([in] BMDDeckLinkAttributeID cfgID, [out] BOOL *value);\r
+    HRESULT GetInt([in] BMDDeckLinkAttributeID cfgID, [out] LONGLONG *value);\r
+    HRESULT GetFloat([in] BMDDeckLinkAttributeID cfgID, [out] double *value);\r
+    HRESULT GetString([in] BMDDeckLinkAttributeID cfgID, [out] BSTR *value);\r
+};\r
+\r
+/* End Interface IDeckLinkAttributes */\r
+\r
+/* Interface IDeckLinkKeyer - DeckLink Keyer interface */\r
+\r
+[\r
+    object,\r
+    uuid(89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3),\r
+    local, \r
+    helpstring("DeckLink Keyer interface")\r
+] interface IDeckLinkKeyer : IUnknown\r
+{\r
+    HRESULT Enable([in] BOOL isExternal);\r
+    HRESULT SetLevel([in] unsigned char level);\r
+    HRESULT RampUp([in] unsigned long numberOfFrames);\r
+    HRESULT RampDown([in] unsigned long numberOfFrames);\r
+    HRESULT Disable(void);\r
+};\r
+\r
+/* End Interface IDeckLinkKeyer */\r
+\r
+/* Coclasses */\r
+\r
+importlib("stdole2.tlb");\r
+\r
+[\r
+    uuid(D9EDA3B3-2887-41FA-B724-017CF1EB1D37),\r
+    helpstring("CDeckLinkIterator Class")\r
+] coclass CDeckLinkIterator\r
+{\r
+    [default] interface IDeckLinkIterator;\r
+};\r
+\r
+[\r
+    uuid(D398CEE7-4434-4CA3-9BA6-5AE34556B905),\r
+    helpstring("CDeckLinkGLScreenPreviewHelper Class")\r
+] coclass CDeckLinkGLScreenPreviewHelper\r
+{\r
+    [default] interface IDeckLinkGLScreenPreviewHelper;\r
+};\r
+\r
+/* End Coclasses */\r
+\r
+// import deprecated interfaces\r
+#include "DeckLinkAPI_v7_1.idl"\r
+#include "DeckLinkAPI_v7_3.idl"\r
+};\r
diff --git a/core/consumer/decklink/DeckLinkAPI_h.h b/core/consumer/decklink/DeckLinkAPI_h.h
new file mode 100644 (file)
index 0000000..1321b07
--- /dev/null
@@ -0,0 +1,5584 @@
+\r
+\r
+/* this ALWAYS GENERATED file contains the definitions for the interfaces */\r
+\r
+\r
+ /* File created by MIDL compiler version 7.00.0500 */\r
+/* at Wed Jan 13 09:58:01 2010\r
+ */\r
+/* Compiler settings for .\consumers\declink\DeckLinkAPI.idl:\r
+    Oicf, W1, Zp8, env=Win32 (32b run)\r
+    protocol : dce , ms_ext, c_ext, robust\r
+    error checks: allocation ref bounds_check enum stub_data \r
+    VC __declspec() decoration level: \r
+         __declspec(uuid()), __declspec(selectany), __declspec(novtable)\r
+         DECLSPEC_UUID(), MIDL_INTERFACE()\r
+*/\r
+//@@MIDL_FILE_HEADING(  )\r
+\r
+#pragma warning( disable: 4049 )  /* more than 64k source lines */\r
+\r
+\r
+/* verify that the <rpcndr.h> version is high enough to compile this file*/\r
+#ifndef __REQUIRED_RPCNDR_H_VERSION__\r
+#define __REQUIRED_RPCNDR_H_VERSION__ 475\r
+#endif\r
+\r
+#include "rpc.h"\r
+#include "rpcndr.h"\r
+\r
+#ifndef __RPCNDR_H_VERSION__\r
+#error this stub requires an updated version of <rpcndr.h>\r
+#endif // __RPCNDR_H_VERSION__\r
+\r
+\r
+#ifndef __DeckLinkAPI_h_h__\r
+#define __DeckLinkAPI_h_h__\r
+\r
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)\r
+#pragma once\r
+#endif\r
+\r
+/* Forward Declarations */ \r
+\r
+#ifndef __IDeckLinkVideoOutputCallback_FWD_DEFINED__\r
+#define __IDeckLinkVideoOutputCallback_FWD_DEFINED__\r
+typedef interface IDeckLinkVideoOutputCallback IDeckLinkVideoOutputCallback;\r
+#endif         /* __IDeckLinkVideoOutputCallback_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkInputCallback_FWD_DEFINED__\r
+#define __IDeckLinkInputCallback_FWD_DEFINED__\r
+typedef interface IDeckLinkInputCallback IDeckLinkInputCallback;\r
+#endif         /* __IDeckLinkInputCallback_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkMemoryAllocator_FWD_DEFINED__\r
+#define __IDeckLinkMemoryAllocator_FWD_DEFINED__\r
+typedef interface IDeckLinkMemoryAllocator IDeckLinkMemoryAllocator;\r
+#endif         /* __IDeckLinkMemoryAllocator_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkAudioOutputCallback_FWD_DEFINED__\r
+#define __IDeckLinkAudioOutputCallback_FWD_DEFINED__\r
+typedef interface IDeckLinkAudioOutputCallback IDeckLinkAudioOutputCallback;\r
+#endif         /* __IDeckLinkAudioOutputCallback_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkIterator_FWD_DEFINED__\r
+#define __IDeckLinkIterator_FWD_DEFINED__\r
+typedef interface IDeckLinkIterator IDeckLinkIterator;\r
+#endif         /* __IDeckLinkIterator_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkAPIInformation_FWD_DEFINED__\r
+#define __IDeckLinkAPIInformation_FWD_DEFINED__\r
+typedef interface IDeckLinkAPIInformation IDeckLinkAPIInformation;\r
+#endif         /* __IDeckLinkAPIInformation_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkDisplayModeIterator_FWD_DEFINED__\r
+#define __IDeckLinkDisplayModeIterator_FWD_DEFINED__\r
+typedef interface IDeckLinkDisplayModeIterator IDeckLinkDisplayModeIterator;\r
+#endif         /* __IDeckLinkDisplayModeIterator_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkDisplayMode_FWD_DEFINED__\r
+#define __IDeckLinkDisplayMode_FWD_DEFINED__\r
+typedef interface IDeckLinkDisplayMode IDeckLinkDisplayMode;\r
+#endif         /* __IDeckLinkDisplayMode_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLink_FWD_DEFINED__\r
+#define __IDeckLink_FWD_DEFINED__\r
+typedef interface IDeckLink IDeckLink;\r
+#endif         /* __IDeckLink_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkOutput_FWD_DEFINED__\r
+#define __IDeckLinkOutput_FWD_DEFINED__\r
+typedef interface IDeckLinkOutput IDeckLinkOutput;\r
+#endif         /* __IDeckLinkOutput_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkInput_FWD_DEFINED__\r
+#define __IDeckLinkInput_FWD_DEFINED__\r
+typedef interface IDeckLinkInput IDeckLinkInput;\r
+#endif         /* __IDeckLinkInput_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkTimecode_FWD_DEFINED__\r
+#define __IDeckLinkTimecode_FWD_DEFINED__\r
+typedef interface IDeckLinkTimecode IDeckLinkTimecode;\r
+#endif         /* __IDeckLinkTimecode_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoFrame_FWD_DEFINED__\r
+#define __IDeckLinkVideoFrame_FWD_DEFINED__\r
+typedef interface IDeckLinkVideoFrame IDeckLinkVideoFrame;\r
+#endif         /* __IDeckLinkVideoFrame_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkMutableVideoFrame_FWD_DEFINED__\r
+#define __IDeckLinkMutableVideoFrame_FWD_DEFINED__\r
+typedef interface IDeckLinkMutableVideoFrame IDeckLinkMutableVideoFrame;\r
+#endif         /* __IDeckLinkMutableVideoFrame_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoInputFrame_FWD_DEFINED__\r
+#define __IDeckLinkVideoInputFrame_FWD_DEFINED__\r
+typedef interface IDeckLinkVideoInputFrame IDeckLinkVideoInputFrame;\r
+#endif         /* __IDeckLinkVideoInputFrame_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoFrameAncillary_FWD_DEFINED__\r
+#define __IDeckLinkVideoFrameAncillary_FWD_DEFINED__\r
+typedef interface IDeckLinkVideoFrameAncillary IDeckLinkVideoFrameAncillary;\r
+#endif         /* __IDeckLinkVideoFrameAncillary_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkAudioInputPacket_FWD_DEFINED__\r
+#define __IDeckLinkAudioInputPacket_FWD_DEFINED__\r
+typedef interface IDeckLinkAudioInputPacket IDeckLinkAudioInputPacket;\r
+#endif         /* __IDeckLinkAudioInputPacket_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkScreenPreviewCallback_FWD_DEFINED__\r
+#define __IDeckLinkScreenPreviewCallback_FWD_DEFINED__\r
+typedef interface IDeckLinkScreenPreviewCallback IDeckLinkScreenPreviewCallback;\r
+#endif         /* __IDeckLinkScreenPreviewCallback_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkGLScreenPreviewHelper_FWD_DEFINED__\r
+#define __IDeckLinkGLScreenPreviewHelper_FWD_DEFINED__\r
+typedef interface IDeckLinkGLScreenPreviewHelper IDeckLinkGLScreenPreviewHelper;\r
+#endif         /* __IDeckLinkGLScreenPreviewHelper_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkConfiguration_FWD_DEFINED__\r
+#define __IDeckLinkConfiguration_FWD_DEFINED__\r
+typedef interface IDeckLinkConfiguration IDeckLinkConfiguration;\r
+#endif         /* __IDeckLinkConfiguration_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkAttributes_FWD_DEFINED__\r
+#define __IDeckLinkAttributes_FWD_DEFINED__\r
+typedef interface IDeckLinkAttributes IDeckLinkAttributes;\r
+#endif         /* __IDeckLinkAttributes_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkKeyer_FWD_DEFINED__\r
+#define __IDeckLinkKeyer_FWD_DEFINED__\r
+typedef interface IDeckLinkKeyer IDeckLinkKeyer;\r
+#endif         /* __IDeckLinkKeyer_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __CDeckLinkIterator_FWD_DEFINED__\r
+#define __CDeckLinkIterator_FWD_DEFINED__\r
+\r
+#ifdef __cplusplus\r
+typedef class CDeckLinkIterator CDeckLinkIterator;\r
+#else\r
+typedef struct CDeckLinkIterator CDeckLinkIterator;\r
+#endif /* __cplusplus */\r
+\r
+#endif         /* __CDeckLinkIterator_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __CDeckLinkGLScreenPreviewHelper_FWD_DEFINED__\r
+#define __CDeckLinkGLScreenPreviewHelper_FWD_DEFINED__\r
+\r
+#ifdef __cplusplus\r
+typedef class CDeckLinkGLScreenPreviewHelper CDeckLinkGLScreenPreviewHelper;\r
+#else\r
+typedef struct CDeckLinkGLScreenPreviewHelper CDeckLinkGLScreenPreviewHelper;\r
+#endif /* __cplusplus */\r
+\r
+#endif         /* __CDeckLinkGLScreenPreviewHelper_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkDisplayModeIterator_v7_1_FWD_DEFINED__\r
+#define __IDeckLinkDisplayModeIterator_v7_1_FWD_DEFINED__\r
+typedef interface IDeckLinkDisplayModeIterator_v7_1 IDeckLinkDisplayModeIterator_v7_1;\r
+#endif         /* __IDeckLinkDisplayModeIterator_v7_1_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkDisplayMode_v7_1_FWD_DEFINED__\r
+#define __IDeckLinkDisplayMode_v7_1_FWD_DEFINED__\r
+typedef interface IDeckLinkDisplayMode_v7_1 IDeckLinkDisplayMode_v7_1;\r
+#endif         /* __IDeckLinkDisplayMode_v7_1_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoFrame_v7_1_FWD_DEFINED__\r
+#define __IDeckLinkVideoFrame_v7_1_FWD_DEFINED__\r
+typedef interface IDeckLinkVideoFrame_v7_1 IDeckLinkVideoFrame_v7_1;\r
+#endif         /* __IDeckLinkVideoFrame_v7_1_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoInputFrame_v7_1_FWD_DEFINED__\r
+#define __IDeckLinkVideoInputFrame_v7_1_FWD_DEFINED__\r
+typedef interface IDeckLinkVideoInputFrame_v7_1 IDeckLinkVideoInputFrame_v7_1;\r
+#endif         /* __IDeckLinkVideoInputFrame_v7_1_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkAudioInputPacket_v7_1_FWD_DEFINED__\r
+#define __IDeckLinkAudioInputPacket_v7_1_FWD_DEFINED__\r
+typedef interface IDeckLinkAudioInputPacket_v7_1 IDeckLinkAudioInputPacket_v7_1;\r
+#endif         /* __IDeckLinkAudioInputPacket_v7_1_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoOutputCallback_v7_1_FWD_DEFINED__\r
+#define __IDeckLinkVideoOutputCallback_v7_1_FWD_DEFINED__\r
+typedef interface IDeckLinkVideoOutputCallback_v7_1 IDeckLinkVideoOutputCallback_v7_1;\r
+#endif         /* __IDeckLinkVideoOutputCallback_v7_1_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkInputCallback_v7_1_FWD_DEFINED__\r
+#define __IDeckLinkInputCallback_v7_1_FWD_DEFINED__\r
+typedef interface IDeckLinkInputCallback_v7_1 IDeckLinkInputCallback_v7_1;\r
+#endif         /* __IDeckLinkInputCallback_v7_1_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkOutput_v7_1_FWD_DEFINED__\r
+#define __IDeckLinkOutput_v7_1_FWD_DEFINED__\r
+typedef interface IDeckLinkOutput_v7_1 IDeckLinkOutput_v7_1;\r
+#endif         /* __IDeckLinkOutput_v7_1_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkInput_v7_1_FWD_DEFINED__\r
+#define __IDeckLinkInput_v7_1_FWD_DEFINED__\r
+typedef interface IDeckLinkInput_v7_1 IDeckLinkInput_v7_1;\r
+#endif         /* __IDeckLinkInput_v7_1_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkInputCallback_v7_3_FWD_DEFINED__\r
+#define __IDeckLinkInputCallback_v7_3_FWD_DEFINED__\r
+typedef interface IDeckLinkInputCallback_v7_3 IDeckLinkInputCallback_v7_3;\r
+#endif         /* __IDeckLinkInputCallback_v7_3_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkOutput_v7_3_FWD_DEFINED__\r
+#define __IDeckLinkOutput_v7_3_FWD_DEFINED__\r
+typedef interface IDeckLinkOutput_v7_3 IDeckLinkOutput_v7_3;\r
+#endif         /* __IDeckLinkOutput_v7_3_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkInput_v7_3_FWD_DEFINED__\r
+#define __IDeckLinkInput_v7_3_FWD_DEFINED__\r
+typedef interface IDeckLinkInput_v7_3 IDeckLinkInput_v7_3;\r
+#endif         /* __IDeckLinkInput_v7_3_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoInputFrame_v7_3_FWD_DEFINED__\r
+#define __IDeckLinkVideoInputFrame_v7_3_FWD_DEFINED__\r
+typedef interface IDeckLinkVideoInputFrame_v7_3 IDeckLinkVideoInputFrame_v7_3;\r
+#endif         /* __IDeckLinkVideoInputFrame_v7_3_FWD_DEFINED__ */\r
+\r
+\r
+/* header files for imported files */\r
+#include "unknwn.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C"{\r
+#endif \r
+\r
+\r
+\r
+#ifndef __DeckLinkAPI_LIBRARY_DEFINED__\r
+#define __DeckLinkAPI_LIBRARY_DEFINED__\r
+\r
+/* library DeckLinkAPI */\r
+/* [helpstring][version][uuid] */ \r
+\r
+typedef LONGLONG BMDTimeValue;\r
+\r
+typedef LONGLONG BMDTimeScale;\r
+\r
+typedef unsigned long BMDTimecodeBCD;\r
+\r
+typedef unsigned long BMDFrameFlags;\r
+typedef unsigned long BMDVideoInputFlags;\r
+typedef unsigned long BMDVideoInputFormatChangedEvents;\r
+typedef unsigned long BMDDetectedVideoInputFormatFlags;\r
+typedef unsigned long BMDTimecodeFlags;\r
+typedef unsigned long BMDAnalogVideoFlags;\r
+#if 0\r
+typedef enum _BMDFrameFlags BMDFrameFlags;\r
+\r
+typedef enum _BMDVideoInputFlags BMDVideoInputFlags;\r
+\r
+typedef enum _BMDVideoInputFormatChangedEvents BMDVideoInputFormatChangedEvents;\r
+\r
+typedef enum _BMDDetectedVideoInputFormatFlags BMDDetectedVideoInputFormatFlags;\r
+\r
+typedef enum _BMDTimecodeFlags BMDTimecodeFlags;\r
+\r
+typedef enum _BMDAnalogVideoFlags BMDAnalogVideoFlags;\r
+\r
+#endif\r
+typedef /* [v1_enum] */ \r
+enum _BMDDisplayMode\r
+    {  bmdModeNTSC     = 0x6e747363,\r
+       bmdModeNTSC2398 = 0x6e743233,\r
+       bmdModePAL      = 0x70616c20,\r
+       bmdModeHD1080p2398      = 0x32337073,\r
+       bmdModeHD1080p24        = 0x32347073,\r
+       bmdModeHD1080p25        = 0x48703235,\r
+       bmdModeHD1080p2997      = 0x48703239,\r
+       bmdModeHD1080p30        = 0x48703330,\r
+       bmdModeHD1080i50        = 0x48693530,\r
+       bmdModeHD1080i5994      = 0x48693539,\r
+       bmdModeHD1080i6000      = 0x48693630,\r
+       bmdModeHD1080p50        = 0x48703530,\r
+       bmdModeHD1080p5994      = 0x48703539,\r
+       bmdModeHD1080p6000      = 0x48703630,\r
+       bmdModeHD720p50 = 0x68703530,\r
+       bmdModeHD720p5994       = 0x68703539,\r
+       bmdModeHD720p60 = 0x68703630,\r
+       bmdMode2k2398   = 0x326b3233,\r
+       bmdMode2k24     = 0x326b3234,\r
+       bmdMode2k25     = 0x326b3235\r
+    }  BMDDisplayMode;\r
+\r
+typedef /* [v1_enum] */ \r
+enum _BMDFieldDominance\r
+    {  bmdUnknownFieldDominance        = 0,\r
+       bmdLowerFieldFirst      = 0x6c6f7772,\r
+       bmdUpperFieldFirst      = 0x75707072,\r
+       bmdProgressiveFrame     = 0x70726f67,\r
+       bmdProgressiveSegmentedFrame    = 0x70736620\r
+    }  BMDFieldDominance;\r
+\r
+typedef /* [v1_enum] */ \r
+enum _BMDPixelFormat\r
+    {  bmdFormat8BitYUV        = 0x32767579,\r
+       bmdFormat10BitYUV       = 0x76323130,\r
+       bmdFormat8BitARGB       = 0x20,\r
+       bmdFormat8BitBGRA       = 0x42475241,\r
+       bmdFormat10BitRGB       = 0x72323130\r
+    }  BMDPixelFormat;\r
+\r
+typedef /* [v1_enum] */ \r
+enum _BMDVideoOutputFlags\r
+    {  bmdVideoOutputFlagDefault       = 0,\r
+       bmdVideoOutputRP188     = ( 1 << 0 ) ,\r
+       bmdVideoOutputVANC      = ( 1 << 1 ) \r
+    }  BMDVideoOutputFlags;\r
+\r
+/* [v1_enum] */ \r
+enum _BMDFrameFlags\r
+    {  bmdFrameFlagDefault     = 0,\r
+       bmdFrameFlagFlipVertical        = ( 1 << 0 ) ,\r
+       bmdFrameHasNoInputSource        = ( 1 << 31 ) \r
+    } ;\r
+/* [v1_enum] */ \r
+enum _BMDVideoInputFlags\r
+    {  bmdVideoInputFlagDefault        = 0,\r
+       bmdVideoInputEnableFormatDetection      = ( 1 << 0 ) \r
+    } ;\r
+/* [v1_enum] */ \r
+enum _BMDVideoInputFormatChangedEvents\r
+    {  bmdVideoInputDisplayModeChanged = ( 1 << 0 ) ,\r
+       bmdVideoInputFieldDominanceChanged      = ( 1 << 1 ) ,\r
+       bmdVideoInputColorspaceChanged  = ( 1 << 2 ) \r
+    } ;\r
+/* [v1_enum] */ \r
+enum _BMDDetectedVideoInputFormatFlags\r
+    {  bmdDetectedVideoInputYCbCr422   = ( 1 << 0 ) ,\r
+       bmdDetectedVideoInputRGB444     = ( 1 << 1 ) \r
+    } ;\r
+typedef /* [v1_enum] */ \r
+enum _BMDOutputFrameCompletionResult\r
+    {  bmdOutputFrameCompleted = 0,\r
+       bmdOutputFrameDisplayedLate     = ( bmdOutputFrameCompleted + 1 ) ,\r
+       bmdOutputFrameDropped   = ( bmdOutputFrameDisplayedLate + 1 ) ,\r
+       bmdOutputFrameFlushed   = ( bmdOutputFrameDropped + 1 ) \r
+    }  BMDOutputFrameCompletionResult;\r
+\r
+typedef /* [v1_enum] */ \r
+enum _BMDAudioSampleRate\r
+    {  bmdAudioSampleRate48kHz = 48000\r
+    }  BMDAudioSampleRate;\r
+\r
+typedef /* [v1_enum] */ \r
+enum _BMDAudioSampleType\r
+    {  bmdAudioSampleType16bitInteger  = 16,\r
+       bmdAudioSampleType32bitInteger  = 32\r
+    }  BMDAudioSampleType;\r
+\r
+typedef /* [v1_enum] */ \r
+enum _BMDAudioOutputStreamType\r
+    {  bmdAudioOutputStreamContinuous  = 0,\r
+       bmdAudioOutputStreamContinuousDontResample      = ( bmdAudioOutputStreamContinuous + 1 ) ,\r
+       bmdAudioOutputStreamTimestamped = ( bmdAudioOutputStreamContinuousDontResample + 1 ) \r
+    }  BMDAudioOutputStreamType;\r
+\r
+typedef /* [v1_enum] */ \r
+enum _BMDDisplayModeSupport\r
+    {  bmdDisplayModeNotSupported      = 0,\r
+       bmdDisplayModeSupported = ( bmdDisplayModeNotSupported + 1 ) ,\r
+       bmdDisplayModeSupportedWithConversion   = ( bmdDisplayModeSupported + 1 ) \r
+    }  BMDDisplayModeSupport;\r
+\r
+typedef /* [v1_enum] */ \r
+enum _BMDTimecodeFormat\r
+    {  bmdTimecodeRP188        = 0x72703138,\r
+       bmdTimecodeVITC = 0x76697463,\r
+       bmdTimecodeSerial       = 0x73657269\r
+    }  BMDTimecodeFormat;\r
+\r
+/* [v1_enum] */ \r
+enum _BMDTimecodeFlags\r
+    {  bmdTimecodeFlagDefault  = 0,\r
+       bmdTimecodeIsDropFrame  = ( 1 << 0 ) \r
+    } ;\r
+typedef /* [v1_enum] */ \r
+enum _BMDVideoConnection\r
+    {  bmdVideoConnectionSDI   = 0x73646920,\r
+       bmdVideoConnectionHDMI  = 0x68646d69,\r
+       bmdVideoConnectionOpticalSDI    = 0x6f707469,\r
+       bmdVideoConnectionComponent     = 0x63706e74,\r
+       bmdVideoConnectionComposite     = 0x636d7374,\r
+       bmdVideoConnectionSVideo        = 0x73766964\r
+    }  BMDVideoConnection;\r
+\r
+/* [v1_enum] */ \r
+enum _BMDAnalogVideoFlags\r
+    {  bmdAnalogVideoFlagCompositeSetup75      = ( 1 << 0 ) ,\r
+       bmdAnalogVideoFlagComponentBetacamLevels        = ( 1 << 1 ) \r
+    } ;\r
+typedef /* [v1_enum] */ \r
+enum _BMDAudioConnection\r
+    {  bmdAudioConnectionEmbedded      = 0x656d6264,\r
+       bmdAudioConnectionAESEBU        = 0x61657320,\r
+       bmdAudioConnectionAnalog        = 0x616e6c67\r
+    }  BMDAudioConnection;\r
+\r
+typedef /* [v1_enum] */ \r
+enum _BMDVideoOutputConversionMode\r
+    {  bmdNoVideoOutputConversion      = 0x6e6f6e65,\r
+       bmdVideoOutputLetterboxDownonversion    = 0x6c746278,\r
+       bmdVideoOutputAnamorphicDownonversion   = 0x616d7068,\r
+       bmdVideoOutputHD720toHD1080Conversion   = 0x37323063,\r
+       bmdVideoOutputHardwareLetterboxDownconversion   = 0x48576c62,\r
+       bmdVideoOutputHardwareAnamorphicDownconversion  = 0x4857616d,\r
+       bmdVideoOutputHardwareCenterCutDownconversion   = 0x48576363\r
+    }  BMDVideoOutputConversionMode;\r
+\r
+typedef /* [v1_enum] */ \r
+enum _BMDVideoInputConversionMode\r
+    {  bmdNoVideoInputConversion       = 0x6e6f6e65,\r
+       bmdVideoInputLetterboxDownconversionFromHD1080  = 0x31306c62,\r
+       bmdVideoInputAnamorphicDownconversionFromHD1080 = 0x3130616d,\r
+       bmdVideoInputLetterboxDownconversionFromHD720   = 0x37326c62,\r
+       bmdVideoInputAnamorphicDownconversionFromHD720  = 0x3732616d,\r
+       bmdVideoInputLetterboxUpconversion      = 0x6c627570,\r
+       bmdVideoInputAnamorphicUpconversion     = 0x616d7570\r
+    }  BMDVideoInputConversionMode;\r
+\r
+typedef /* [v1_enum] */ \r
+enum _BMDDeckLinkAttributeID\r
+    {  BMDDeckLinkSupportsInternalKeying       = 0x6b657969,\r
+       BMDDeckLinkSupportsExternalKeying       = 0x6b657965,\r
+       BMDDeckLinkSupportsHDKeying     = 0x6b657968,\r
+       BMDDeckLinkSupportsInputFormatDetection = 0x696e6664,\r
+       BMDDeckLinkHasSerialPort        = 0x68737074,\r
+       BMDDeckLinkMaximumAudioChannels = 0x6d616368,\r
+       BMDDeckLinkSerialPortDeviceName = 0x736c706e\r
+    }  BMDDeckLinkAttributeID;\r
+\r
+typedef /* [v1_enum] */ \r
+enum _BMDDeckLinkAPIInformationID\r
+    {  BMDDeckLinkAPIVersion   = 0x76657273\r
+    }  BMDDeckLinkAPIInformationID;\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+EXTERN_C const IID LIBID_DeckLinkAPI;\r
+\r
+#ifndef __IDeckLinkVideoOutputCallback_INTERFACE_DEFINED__\r
+#define __IDeckLinkVideoOutputCallback_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkVideoOutputCallback */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkVideoOutputCallback;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("E763A626-4A3C-49D1-BF13-E7AD3692AE52")\r
+    IDeckLinkVideoOutputCallback : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE ScheduledFrameCompleted( \r
+            /* [in] */ IDeckLinkVideoFrame *completedFrame,\r
+            /* [in] */ BMDOutputFrameCompletionResult result) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE ScheduledPlaybackHasStopped( void) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkVideoOutputCallbackVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkVideoOutputCallback * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkVideoOutputCallback * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkVideoOutputCallback * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *ScheduledFrameCompleted )( \r
+            IDeckLinkVideoOutputCallback * This,\r
+            /* [in] */ IDeckLinkVideoFrame *completedFrame,\r
+            /* [in] */ BMDOutputFrameCompletionResult result);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *ScheduledPlaybackHasStopped )( \r
+            IDeckLinkVideoOutputCallback * This);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkVideoOutputCallbackVtbl;\r
+\r
+    interface IDeckLinkVideoOutputCallback\r
+    {\r
+        CONST_VTBL struct IDeckLinkVideoOutputCallbackVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkVideoOutputCallback_QueryInterface(This,riid,ppvObject)       \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkVideoOutputCallback_AddRef(This)      \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkVideoOutputCallback_Release(This)     \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkVideoOutputCallback_ScheduledFrameCompleted(This,completedFrame,result)       \\r
+    ( (This)->lpVtbl -> ScheduledFrameCompleted(This,completedFrame,result) ) \r
+\r
+#define IDeckLinkVideoOutputCallback_ScheduledPlaybackHasStopped(This) \\r
+    ( (This)->lpVtbl -> ScheduledPlaybackHasStopped(This) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkVideoOutputCallback_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkInputCallback_INTERFACE_DEFINED__\r
+#define __IDeckLinkInputCallback_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkInputCallback */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkInputCallback;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("31D28EE7-88B6-4CB1-897A-CDBF79A26414")\r
+    IDeckLinkInputCallback : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged( \r
+            /* [in] */ BMDVideoInputFormatChangedEvents notificationEvents,\r
+            /* [in] */ IDeckLinkDisplayMode *newDisplayMode,\r
+            /* [in] */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived( \r
+            /* [in] */ IDeckLinkVideoInputFrame *videoFrame,\r
+            /* [in] */ IDeckLinkAudioInputPacket *audioPacket) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkInputCallbackVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkInputCallback * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkInputCallback * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkInputCallback * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *VideoInputFormatChanged )( \r
+            IDeckLinkInputCallback * This,\r
+            /* [in] */ BMDVideoInputFormatChangedEvents notificationEvents,\r
+            /* [in] */ IDeckLinkDisplayMode *newDisplayMode,\r
+            /* [in] */ BMDDetectedVideoInputFormatFlags detectedSignalFlags);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *VideoInputFrameArrived )( \r
+            IDeckLinkInputCallback * This,\r
+            /* [in] */ IDeckLinkVideoInputFrame *videoFrame,\r
+            /* [in] */ IDeckLinkAudioInputPacket *audioPacket);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkInputCallbackVtbl;\r
+\r
+    interface IDeckLinkInputCallback\r
+    {\r
+        CONST_VTBL struct IDeckLinkInputCallbackVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkInputCallback_QueryInterface(This,riid,ppvObject)     \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkInputCallback_AddRef(This)    \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkInputCallback_Release(This)   \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkInputCallback_VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags)     \\r
+    ( (This)->lpVtbl -> VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) ) \r
+\r
+#define IDeckLinkInputCallback_VideoInputFrameArrived(This,videoFrame,audioPacket)     \\r
+    ( (This)->lpVtbl -> VideoInputFrameArrived(This,videoFrame,audioPacket) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkInputCallback_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkMemoryAllocator_INTERFACE_DEFINED__\r
+#define __IDeckLinkMemoryAllocator_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkMemoryAllocator */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkMemoryAllocator;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("B36EB6E7-9D29-4AA8-92EF-843B87A289E8")\r
+    IDeckLinkMemoryAllocator : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE AllocateBuffer( \r
+            unsigned long bufferSize,\r
+            /* [out] */ void **allocatedBuffer) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE ReleaseBuffer( \r
+            /* [in] */ void *buffer) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE Commit( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE Decommit( void) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkMemoryAllocatorVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkMemoryAllocator * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkMemoryAllocator * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkMemoryAllocator * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *AllocateBuffer )( \r
+            IDeckLinkMemoryAllocator * This,\r
+            unsigned long bufferSize,\r
+            /* [out] */ void **allocatedBuffer);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *ReleaseBuffer )( \r
+            IDeckLinkMemoryAllocator * This,\r
+            /* [in] */ void *buffer);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *Commit )( \r
+            IDeckLinkMemoryAllocator * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *Decommit )( \r
+            IDeckLinkMemoryAllocator * This);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkMemoryAllocatorVtbl;\r
+\r
+    interface IDeckLinkMemoryAllocator\r
+    {\r
+        CONST_VTBL struct IDeckLinkMemoryAllocatorVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkMemoryAllocator_QueryInterface(This,riid,ppvObject)   \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkMemoryAllocator_AddRef(This)  \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkMemoryAllocator_Release(This) \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkMemoryAllocator_AllocateBuffer(This,bufferSize,allocatedBuffer)       \\r
+    ( (This)->lpVtbl -> AllocateBuffer(This,bufferSize,allocatedBuffer) ) \r
+\r
+#define IDeckLinkMemoryAllocator_ReleaseBuffer(This,buffer)    \\r
+    ( (This)->lpVtbl -> ReleaseBuffer(This,buffer) ) \r
+\r
+#define IDeckLinkMemoryAllocator_Commit(This)  \\r
+    ( (This)->lpVtbl -> Commit(This) ) \r
+\r
+#define IDeckLinkMemoryAllocator_Decommit(This)        \\r
+    ( (This)->lpVtbl -> Decommit(This) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkMemoryAllocator_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkAudioOutputCallback_INTERFACE_DEFINED__\r
+#define __IDeckLinkAudioOutputCallback_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkAudioOutputCallback */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkAudioOutputCallback;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("403C681B-7F46-4A12-B993-2BB127084EE6")\r
+    IDeckLinkAudioOutputCallback : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE RenderAudioSamples( \r
+            BOOL preroll) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkAudioOutputCallbackVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkAudioOutputCallback * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkAudioOutputCallback * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkAudioOutputCallback * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *RenderAudioSamples )( \r
+            IDeckLinkAudioOutputCallback * This,\r
+            BOOL preroll);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkAudioOutputCallbackVtbl;\r
+\r
+    interface IDeckLinkAudioOutputCallback\r
+    {\r
+        CONST_VTBL struct IDeckLinkAudioOutputCallbackVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkAudioOutputCallback_QueryInterface(This,riid,ppvObject)       \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkAudioOutputCallback_AddRef(This)      \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkAudioOutputCallback_Release(This)     \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkAudioOutputCallback_RenderAudioSamples(This,preroll)  \\r
+    ( (This)->lpVtbl -> RenderAudioSamples(This,preroll) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkAudioOutputCallback_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkIterator_INTERFACE_DEFINED__\r
+#define __IDeckLinkIterator_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkIterator */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkIterator;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("74E936FC-CC28-4A67-81A0-1E94E52D4E69")\r
+    IDeckLinkIterator : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE Next( \r
+            /* [out] */ IDeckLink **deckLinkInstance) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkIteratorVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkIterator * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkIterator * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkIterator * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *Next )( \r
+            IDeckLinkIterator * This,\r
+            /* [out] */ IDeckLink **deckLinkInstance);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkIteratorVtbl;\r
+\r
+    interface IDeckLinkIterator\r
+    {\r
+        CONST_VTBL struct IDeckLinkIteratorVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkIterator_QueryInterface(This,riid,ppvObject)  \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkIterator_AddRef(This) \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkIterator_Release(This)        \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkIterator_Next(This,deckLinkInstance)  \\r
+    ( (This)->lpVtbl -> Next(This,deckLinkInstance) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkIterator_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkAPIInformation_INTERFACE_DEFINED__\r
+#define __IDeckLinkAPIInformation_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkAPIInformation */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkAPIInformation;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("7BEA3C68-730D-4322-AF34-8A7152B532A4")\r
+    IDeckLinkAPIInformation : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE GetFlag( \r
+            /* [in] */ BMDDeckLinkAPIInformationID cfgID,\r
+            /* [out] */ BOOL *value) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetInt( \r
+            /* [in] */ BMDDeckLinkAPIInformationID cfgID,\r
+            /* [out] */ LONGLONG *value) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetFloat( \r
+            /* [in] */ BMDDeckLinkAPIInformationID cfgID,\r
+            /* [out] */ double *value) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetString( \r
+            /* [in] */ BMDDeckLinkAPIInformationID cfgID,\r
+            /* [out] */ BSTR *value) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkAPIInformationVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkAPIInformation * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkAPIInformation * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkAPIInformation * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetFlag )( \r
+            IDeckLinkAPIInformation * This,\r
+            /* [in] */ BMDDeckLinkAPIInformationID cfgID,\r
+            /* [out] */ BOOL *value);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetInt )( \r
+            IDeckLinkAPIInformation * This,\r
+            /* [in] */ BMDDeckLinkAPIInformationID cfgID,\r
+            /* [out] */ LONGLONG *value);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetFloat )( \r
+            IDeckLinkAPIInformation * This,\r
+            /* [in] */ BMDDeckLinkAPIInformationID cfgID,\r
+            /* [out] */ double *value);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetString )( \r
+            IDeckLinkAPIInformation * This,\r
+            /* [in] */ BMDDeckLinkAPIInformationID cfgID,\r
+            /* [out] */ BSTR *value);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkAPIInformationVtbl;\r
+\r
+    interface IDeckLinkAPIInformation\r
+    {\r
+        CONST_VTBL struct IDeckLinkAPIInformationVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkAPIInformation_QueryInterface(This,riid,ppvObject)    \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkAPIInformation_AddRef(This)   \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkAPIInformation_Release(This)  \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkAPIInformation_GetFlag(This,cfgID,value)      \\r
+    ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) \r
+\r
+#define IDeckLinkAPIInformation_GetInt(This,cfgID,value)       \\r
+    ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) \r
+\r
+#define IDeckLinkAPIInformation_GetFloat(This,cfgID,value)     \\r
+    ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) \r
+\r
+#define IDeckLinkAPIInformation_GetString(This,cfgID,value)    \\r
+    ( (This)->lpVtbl -> GetString(This,cfgID,value) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkAPIInformation_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkDisplayModeIterator_INTERFACE_DEFINED__\r
+#define __IDeckLinkDisplayModeIterator_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkDisplayModeIterator */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkDisplayModeIterator;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("455D741F-1779-4800-86F5-0B5D13D79751")\r
+    IDeckLinkDisplayModeIterator : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE Next( \r
+            /* [out] */ IDeckLinkDisplayMode **deckLinkDisplayMode) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkDisplayModeIteratorVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkDisplayModeIterator * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkDisplayModeIterator * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkDisplayModeIterator * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *Next )( \r
+            IDeckLinkDisplayModeIterator * This,\r
+            /* [out] */ IDeckLinkDisplayMode **deckLinkDisplayMode);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkDisplayModeIteratorVtbl;\r
+\r
+    interface IDeckLinkDisplayModeIterator\r
+    {\r
+        CONST_VTBL struct IDeckLinkDisplayModeIteratorVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkDisplayModeIterator_QueryInterface(This,riid,ppvObject)       \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkDisplayModeIterator_AddRef(This)      \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkDisplayModeIterator_Release(This)     \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkDisplayModeIterator_Next(This,deckLinkDisplayMode)    \\r
+    ( (This)->lpVtbl -> Next(This,deckLinkDisplayMode) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkDisplayModeIterator_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkDisplayMode_INTERFACE_DEFINED__\r
+#define __IDeckLinkDisplayMode_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkDisplayMode */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkDisplayMode;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("87451E84-2B7E-439E-A629-4393EA4A8550")\r
+    IDeckLinkDisplayMode : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE GetName( \r
+            /* [out] */ BSTR *name) = 0;\r
+        \r
+        virtual BMDDisplayMode STDMETHODCALLTYPE GetDisplayMode( void) = 0;\r
+        \r
+        virtual long STDMETHODCALLTYPE GetWidth( void) = 0;\r
+        \r
+        virtual long STDMETHODCALLTYPE GetHeight( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetFrameRate( \r
+            /* [out] */ BMDTimeValue *frameDuration,\r
+            /* [out] */ BMDTimeScale *timeScale) = 0;\r
+        \r
+        virtual BMDFieldDominance STDMETHODCALLTYPE GetFieldDominance( void) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkDisplayModeVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkDisplayMode * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkDisplayMode * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkDisplayMode * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetName )( \r
+            IDeckLinkDisplayMode * This,\r
+            /* [out] */ BSTR *name);\r
+        \r
+        BMDDisplayMode ( STDMETHODCALLTYPE *GetDisplayMode )( \r
+            IDeckLinkDisplayMode * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetWidth )( \r
+            IDeckLinkDisplayMode * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetHeight )( \r
+            IDeckLinkDisplayMode * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetFrameRate )( \r
+            IDeckLinkDisplayMode * This,\r
+            /* [out] */ BMDTimeValue *frameDuration,\r
+            /* [out] */ BMDTimeScale *timeScale);\r
+        \r
+        BMDFieldDominance ( STDMETHODCALLTYPE *GetFieldDominance )( \r
+            IDeckLinkDisplayMode * This);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkDisplayModeVtbl;\r
+\r
+    interface IDeckLinkDisplayMode\r
+    {\r
+        CONST_VTBL struct IDeckLinkDisplayModeVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkDisplayMode_QueryInterface(This,riid,ppvObject)       \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkDisplayMode_AddRef(This)      \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkDisplayMode_Release(This)     \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkDisplayMode_GetName(This,name)        \\r
+    ( (This)->lpVtbl -> GetName(This,name) ) \r
+\r
+#define IDeckLinkDisplayMode_GetDisplayMode(This)      \\r
+    ( (This)->lpVtbl -> GetDisplayMode(This) ) \r
+\r
+#define IDeckLinkDisplayMode_GetWidth(This)    \\r
+    ( (This)->lpVtbl -> GetWidth(This) ) \r
+\r
+#define IDeckLinkDisplayMode_GetHeight(This)   \\r
+    ( (This)->lpVtbl -> GetHeight(This) ) \r
+\r
+#define IDeckLinkDisplayMode_GetFrameRate(This,frameDuration,timeScale)        \\r
+    ( (This)->lpVtbl -> GetFrameRate(This,frameDuration,timeScale) ) \r
+\r
+#define IDeckLinkDisplayMode_GetFieldDominance(This)   \\r
+    ( (This)->lpVtbl -> GetFieldDominance(This) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkDisplayMode_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLink_INTERFACE_DEFINED__\r
+#define __IDeckLink_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLink */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLink;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("62BFF75D-6569-4E55-8D4D-66AA03829ABC")\r
+    IDeckLink : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE GetModelName( \r
+            /* [out] */ BSTR *modelName) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLink * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLink * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLink * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetModelName )( \r
+            IDeckLink * This,\r
+            /* [out] */ BSTR *modelName);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkVtbl;\r
+\r
+    interface IDeckLink\r
+    {\r
+        CONST_VTBL struct IDeckLinkVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLink_QueryInterface(This,riid,ppvObject)  \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLink_AddRef(This) \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLink_Release(This)        \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLink_GetModelName(This,modelName) \\r
+    ( (This)->lpVtbl -> GetModelName(This,modelName) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLink_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkOutput_INTERFACE_DEFINED__\r
+#define __IDeckLinkOutput_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkOutput */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkOutput;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("29228142-EB8C-4141-A621-F74026450955")\r
+    IDeckLinkOutput : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( \r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ BMDDisplayModeSupport *result) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( \r
+            /* [out] */ IDeckLinkDisplayModeIterator **iterator) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( \r
+            /* [in] */ IDeckLinkScreenPreviewCallback *previewCallback) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( \r
+            BMDDisplayMode displayMode,\r
+            BMDVideoOutputFlags flags) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisableVideoOutput( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( \r
+            /* [in] */ IDeckLinkMemoryAllocator *theAllocator) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( \r
+            long width,\r
+            long height,\r
+            long rowBytes,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDFrameFlags flags,\r
+            /* [out] */ IDeckLinkMutableVideoFrame **outFrame) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE CreateAncillaryData( \r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ IDeckLinkVideoFrameAncillary **outBuffer) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( \r
+            /* [in] */ IDeckLinkVideoFrame *theFrame) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( \r
+            /* [in] */ IDeckLinkVideoFrame *theFrame,\r
+            BMDTimeValue displayTime,\r
+            BMDTimeValue displayDuration,\r
+            BMDTimeScale timeScale) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( \r
+            /* [in] */ IDeckLinkVideoOutputCallback *theCallback) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetBufferedVideoFrameCount( \r
+            /* [out] */ unsigned long *bufferedFrameCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( \r
+            BMDAudioSampleRate sampleRate,\r
+            BMDAudioSampleType sampleType,\r
+            unsigned long channelCount,\r
+            BMDAudioOutputStreamType streamType) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisableAudioOutput( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( \r
+            /* [in] */ void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            /* [out] */ unsigned long *sampleFramesWritten) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE BeginAudioPreroll( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EndAudioPreroll( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( \r
+            /* [in] */ void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            BMDTimeValue streamTime,\r
+            BMDTimeScale timeScale,\r
+            /* [out] */ unsigned long *sampleFramesWritten) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( \r
+            /* [out] */ unsigned long *bufferedSampleFrameCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE FlushBufferedAudioSamples( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( \r
+            /* [in] */ IDeckLinkAudioOutputCallback *theCallback) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( \r
+            BMDTimeValue playbackStartTime,\r
+            BMDTimeScale timeScale,\r
+            double playbackSpeed) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( \r
+            BMDTimeValue stopPlaybackAtTime,\r
+            /* [out] */ BMDTimeValue *actualStopTime,\r
+            BMDTimeScale timeScale) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE IsScheduledPlaybackRunning( \r
+            /* [out] */ BOOL *active) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetScheduledStreamTime( \r
+            BMDTimeScale desiredTimeScale,\r
+            /* [out] */ BMDTimeValue *streamTime,\r
+            /* [out] */ double *playbackSpeed) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( \r
+            BMDTimeScale desiredTimeScale,\r
+            /* [out] */ BMDTimeValue *hardwareTime,\r
+            /* [out] */ BMDTimeValue *timeInFrame,\r
+            /* [out] */ BMDTimeValue *ticksPerFrame) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkOutputVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkOutput * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkOutput * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkOutput * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( \r
+            IDeckLinkOutput * This,\r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ BMDDisplayModeSupport *result);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( \r
+            IDeckLinkOutput * This,\r
+            /* [out] */ IDeckLinkDisplayModeIterator **iterator);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( \r
+            IDeckLinkOutput * This,\r
+            /* [in] */ IDeckLinkScreenPreviewCallback *previewCallback);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( \r
+            IDeckLinkOutput * This,\r
+            BMDDisplayMode displayMode,\r
+            BMDVideoOutputFlags flags);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( \r
+            IDeckLinkOutput * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( \r
+            IDeckLinkOutput * This,\r
+            /* [in] */ IDeckLinkMemoryAllocator *theAllocator);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( \r
+            IDeckLinkOutput * This,\r
+            long width,\r
+            long height,\r
+            long rowBytes,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDFrameFlags flags,\r
+            /* [out] */ IDeckLinkMutableVideoFrame **outFrame);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *CreateAncillaryData )( \r
+            IDeckLinkOutput * This,\r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ IDeckLinkVideoFrameAncillary **outBuffer);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( \r
+            IDeckLinkOutput * This,\r
+            /* [in] */ IDeckLinkVideoFrame *theFrame);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( \r
+            IDeckLinkOutput * This,\r
+            /* [in] */ IDeckLinkVideoFrame *theFrame,\r
+            BMDTimeValue displayTime,\r
+            BMDTimeValue displayDuration,\r
+            BMDTimeScale timeScale);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( \r
+            IDeckLinkOutput * This,\r
+            /* [in] */ IDeckLinkVideoOutputCallback *theCallback);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBufferedVideoFrameCount )( \r
+            IDeckLinkOutput * This,\r
+            /* [out] */ unsigned long *bufferedFrameCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( \r
+            IDeckLinkOutput * This,\r
+            BMDAudioSampleRate sampleRate,\r
+            BMDAudioSampleType sampleType,\r
+            unsigned long channelCount,\r
+            BMDAudioOutputStreamType streamType);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( \r
+            IDeckLinkOutput * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( \r
+            IDeckLinkOutput * This,\r
+            /* [in] */ void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            /* [out] */ unsigned long *sampleFramesWritten);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( \r
+            IDeckLinkOutput * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( \r
+            IDeckLinkOutput * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( \r
+            IDeckLinkOutput * This,\r
+            /* [in] */ void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            BMDTimeValue streamTime,\r
+            BMDTimeScale timeScale,\r
+            /* [out] */ unsigned long *sampleFramesWritten);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( \r
+            IDeckLinkOutput * This,\r
+            /* [out] */ unsigned long *bufferedSampleFrameCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( \r
+            IDeckLinkOutput * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( \r
+            IDeckLinkOutput * This,\r
+            /* [in] */ IDeckLinkAudioOutputCallback *theCallback);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( \r
+            IDeckLinkOutput * This,\r
+            BMDTimeValue playbackStartTime,\r
+            BMDTimeScale timeScale,\r
+            double playbackSpeed);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( \r
+            IDeckLinkOutput * This,\r
+            BMDTimeValue stopPlaybackAtTime,\r
+            /* [out] */ BMDTimeValue *actualStopTime,\r
+            BMDTimeScale timeScale);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *IsScheduledPlaybackRunning )( \r
+            IDeckLinkOutput * This,\r
+            /* [out] */ BOOL *active);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetScheduledStreamTime )( \r
+            IDeckLinkOutput * This,\r
+            BMDTimeScale desiredTimeScale,\r
+            /* [out] */ BMDTimeValue *streamTime,\r
+            /* [out] */ double *playbackSpeed);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( \r
+            IDeckLinkOutput * This,\r
+            BMDTimeScale desiredTimeScale,\r
+            /* [out] */ BMDTimeValue *hardwareTime,\r
+            /* [out] */ BMDTimeValue *timeInFrame,\r
+            /* [out] */ BMDTimeValue *ticksPerFrame);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkOutputVtbl;\r
+\r
+    interface IDeckLinkOutput\r
+    {\r
+        CONST_VTBL struct IDeckLinkOutputVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkOutput_QueryInterface(This,riid,ppvObject)    \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkOutput_AddRef(This)   \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkOutput_Release(This)  \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkOutput_DoesSupportVideoMode(This,displayMode,pixelFormat,result)      \\r
+    ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) \r
+\r
+#define IDeckLinkOutput_GetDisplayModeIterator(This,iterator)  \\r
+    ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) \r
+\r
+#define IDeckLinkOutput_SetScreenPreviewCallback(This,previewCallback) \\r
+    ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) \r
+\r
+#define IDeckLinkOutput_EnableVideoOutput(This,displayMode,flags)      \\r
+    ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode,flags) ) \r
+\r
+#define IDeckLinkOutput_DisableVideoOutput(This)       \\r
+    ( (This)->lpVtbl -> DisableVideoOutput(This) ) \r
+\r
+#define IDeckLinkOutput_SetVideoOutputFrameMemoryAllocator(This,theAllocator)  \\r
+    ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) \r
+\r
+#define IDeckLinkOutput_CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame)        \\r
+    ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) \r
+\r
+#define IDeckLinkOutput_CreateAncillaryData(This,displayMode,pixelFormat,outBuffer)    \\r
+    ( (This)->lpVtbl -> CreateAncillaryData(This,displayMode,pixelFormat,outBuffer) ) \r
+\r
+#define IDeckLinkOutput_DisplayVideoFrameSync(This,theFrame)   \\r
+    ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) \r
+\r
+#define IDeckLinkOutput_ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale)        \\r
+    ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) \r
+\r
+#define IDeckLinkOutput_SetScheduledFrameCompletionCallback(This,theCallback)  \\r
+    ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) \r
+\r
+#define IDeckLinkOutput_GetBufferedVideoFrameCount(This,bufferedFrameCount)    \\r
+    ( (This)->lpVtbl -> GetBufferedVideoFrameCount(This,bufferedFrameCount) ) \r
+\r
+#define IDeckLinkOutput_EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType)  \\r
+    ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) ) \r
+\r
+#define IDeckLinkOutput_DisableAudioOutput(This)       \\r
+    ( (This)->lpVtbl -> DisableAudioOutput(This) ) \r
+\r
+#define IDeckLinkOutput_WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten)        \\r
+    ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) \r
+\r
+#define IDeckLinkOutput_BeginAudioPreroll(This)        \\r
+    ( (This)->lpVtbl -> BeginAudioPreroll(This) ) \r
+\r
+#define IDeckLinkOutput_EndAudioPreroll(This)  \\r
+    ( (This)->lpVtbl -> EndAudioPreroll(This) ) \r
+\r
+#define IDeckLinkOutput_ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten)    \\r
+    ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) \r
+\r
+#define IDeckLinkOutput_GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount)        \\r
+    ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) ) \r
+\r
+#define IDeckLinkOutput_FlushBufferedAudioSamples(This)        \\r
+    ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) \r
+\r
+#define IDeckLinkOutput_SetAudioCallback(This,theCallback)     \\r
+    ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) \r
+\r
+#define IDeckLinkOutput_StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) \\r
+    ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) \r
+\r
+#define IDeckLinkOutput_StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale)        \\r
+    ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) \r
+\r
+#define IDeckLinkOutput_IsScheduledPlaybackRunning(This,active)        \\r
+    ( (This)->lpVtbl -> IsScheduledPlaybackRunning(This,active) ) \r
+\r
+#define IDeckLinkOutput_GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) \\r
+    ( (This)->lpVtbl -> GetScheduledStreamTime(This,desiredTimeScale,streamTime,playbackSpeed) ) \r
+\r
+#define IDeckLinkOutput_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame)        \\r
+    ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkOutput_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkInput_INTERFACE_DEFINED__\r
+#define __IDeckLinkInput_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkInput */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkInput;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("300C135A-9F43-48E2-9906-6D7911D93CF1")\r
+    IDeckLinkInput : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( \r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ BMDDisplayModeSupport *result) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( \r
+            /* [out] */ IDeckLinkDisplayModeIterator **iterator) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( \r
+            /* [in] */ IDeckLinkScreenPreviewCallback *previewCallback) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( \r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDVideoInputFlags flags) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisableVideoInput( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( \r
+            /* [out] */ unsigned long *availableFrameCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( \r
+            BMDAudioSampleRate sampleRate,\r
+            BMDAudioSampleType sampleType,\r
+            unsigned long channelCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisableAudioInput( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( \r
+            /* [out] */ unsigned long *availableSampleFrameCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE StartStreams( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE StopStreams( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE PauseStreams( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE FlushStreams( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetCallback( \r
+            /* [in] */ IDeckLinkInputCallback *theCallback) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( \r
+            BMDTimeScale desiredTimeScale,\r
+            /* [out] */ BMDTimeValue *hardwareTime,\r
+            /* [out] */ BMDTimeValue *timeInFrame,\r
+            /* [out] */ BMDTimeValue *ticksPerFrame) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkInputVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkInput * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkInput * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkInput * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( \r
+            IDeckLinkInput * This,\r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ BMDDisplayModeSupport *result);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( \r
+            IDeckLinkInput * This,\r
+            /* [out] */ IDeckLinkDisplayModeIterator **iterator);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( \r
+            IDeckLinkInput * This,\r
+            /* [in] */ IDeckLinkScreenPreviewCallback *previewCallback);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( \r
+            IDeckLinkInput * This,\r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDVideoInputFlags flags);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( \r
+            IDeckLinkInput * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( \r
+            IDeckLinkInput * This,\r
+            /* [out] */ unsigned long *availableFrameCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( \r
+            IDeckLinkInput * This,\r
+            BMDAudioSampleRate sampleRate,\r
+            BMDAudioSampleType sampleType,\r
+            unsigned long channelCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( \r
+            IDeckLinkInput * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( \r
+            IDeckLinkInput * This,\r
+            /* [out] */ unsigned long *availableSampleFrameCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *StartStreams )( \r
+            IDeckLinkInput * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *StopStreams )( \r
+            IDeckLinkInput * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *PauseStreams )( \r
+            IDeckLinkInput * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *FlushStreams )( \r
+            IDeckLinkInput * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetCallback )( \r
+            IDeckLinkInput * This,\r
+            /* [in] */ IDeckLinkInputCallback *theCallback);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( \r
+            IDeckLinkInput * This,\r
+            BMDTimeScale desiredTimeScale,\r
+            /* [out] */ BMDTimeValue *hardwareTime,\r
+            /* [out] */ BMDTimeValue *timeInFrame,\r
+            /* [out] */ BMDTimeValue *ticksPerFrame);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkInputVtbl;\r
+\r
+    interface IDeckLinkInput\r
+    {\r
+        CONST_VTBL struct IDeckLinkInputVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkInput_QueryInterface(This,riid,ppvObject)     \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkInput_AddRef(This)    \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkInput_Release(This)   \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkInput_DoesSupportVideoMode(This,displayMode,pixelFormat,result)       \\r
+    ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) \r
+\r
+#define IDeckLinkInput_GetDisplayModeIterator(This,iterator)   \\r
+    ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) \r
+\r
+#define IDeckLinkInput_SetScreenPreviewCallback(This,previewCallback)  \\r
+    ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) \r
+\r
+#define IDeckLinkInput_EnableVideoInput(This,displayMode,pixelFormat,flags)    \\r
+    ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) \r
+\r
+#define IDeckLinkInput_DisableVideoInput(This) \\r
+    ( (This)->lpVtbl -> DisableVideoInput(This) ) \r
+\r
+#define IDeckLinkInput_GetAvailableVideoFrameCount(This,availableFrameCount)   \\r
+    ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) \r
+\r
+#define IDeckLinkInput_EnableAudioInput(This,sampleRate,sampleType,channelCount)       \\r
+    ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) \r
+\r
+#define IDeckLinkInput_DisableAudioInput(This) \\r
+    ( (This)->lpVtbl -> DisableAudioInput(This) ) \r
+\r
+#define IDeckLinkInput_GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount)       \\r
+    ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) \r
+\r
+#define IDeckLinkInput_StartStreams(This)      \\r
+    ( (This)->lpVtbl -> StartStreams(This) ) \r
+\r
+#define IDeckLinkInput_StopStreams(This)       \\r
+    ( (This)->lpVtbl -> StopStreams(This) ) \r
+\r
+#define IDeckLinkInput_PauseStreams(This)      \\r
+    ( (This)->lpVtbl -> PauseStreams(This) ) \r
+\r
+#define IDeckLinkInput_FlushStreams(This)      \\r
+    ( (This)->lpVtbl -> FlushStreams(This) ) \r
+\r
+#define IDeckLinkInput_SetCallback(This,theCallback)   \\r
+    ( (This)->lpVtbl -> SetCallback(This,theCallback) ) \r
+\r
+#define IDeckLinkInput_GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) \\r
+    ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,hardwareTime,timeInFrame,ticksPerFrame) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkInput_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkTimecode_INTERFACE_DEFINED__\r
+#define __IDeckLinkTimecode_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkTimecode */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkTimecode;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("EFB9BCA6-A521-44F7-BD69-2332F24D9EE6")\r
+    IDeckLinkTimecode : public IUnknown\r
+    {\r
+    public:\r
+        virtual BMDTimecodeBCD STDMETHODCALLTYPE GetBCD( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetComponents( \r
+            /* [out] */ unsigned char *hours,\r
+            /* [out] */ unsigned char *minutes,\r
+            /* [out] */ unsigned char *seconds,\r
+            /* [out] */ unsigned char *frames) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetString( \r
+            /* [out] */ BSTR *timecode) = 0;\r
+        \r
+        virtual BMDTimecodeFlags STDMETHODCALLTYPE GetFlags( void) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkTimecodeVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkTimecode * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkTimecode * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkTimecode * This);\r
+        \r
+        BMDTimecodeBCD ( STDMETHODCALLTYPE *GetBCD )( \r
+            IDeckLinkTimecode * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetComponents )( \r
+            IDeckLinkTimecode * This,\r
+            /* [out] */ unsigned char *hours,\r
+            /* [out] */ unsigned char *minutes,\r
+            /* [out] */ unsigned char *seconds,\r
+            /* [out] */ unsigned char *frames);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetString )( \r
+            IDeckLinkTimecode * This,\r
+            /* [out] */ BSTR *timecode);\r
+        \r
+        BMDTimecodeFlags ( STDMETHODCALLTYPE *GetFlags )( \r
+            IDeckLinkTimecode * This);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkTimecodeVtbl;\r
+\r
+    interface IDeckLinkTimecode\r
+    {\r
+        CONST_VTBL struct IDeckLinkTimecodeVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkTimecode_QueryInterface(This,riid,ppvObject)  \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkTimecode_AddRef(This) \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkTimecode_Release(This)        \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkTimecode_GetBCD(This) \\r
+    ( (This)->lpVtbl -> GetBCD(This) ) \r
+\r
+#define IDeckLinkTimecode_GetComponents(This,hours,minutes,seconds,frames)     \\r
+    ( (This)->lpVtbl -> GetComponents(This,hours,minutes,seconds,frames) ) \r
+\r
+#define IDeckLinkTimecode_GetString(This,timecode)     \\r
+    ( (This)->lpVtbl -> GetString(This,timecode) ) \r
+\r
+#define IDeckLinkTimecode_GetFlags(This)       \\r
+    ( (This)->lpVtbl -> GetFlags(This) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkTimecode_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoFrame_INTERFACE_DEFINED__\r
+#define __IDeckLinkVideoFrame_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkVideoFrame */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkVideoFrame;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("A8D8238E-6B18-4196-99E1-5AF717B83D32")\r
+    IDeckLinkVideoFrame : public IUnknown\r
+    {\r
+    public:\r
+        virtual long STDMETHODCALLTYPE GetWidth( void) = 0;\r
+        \r
+        virtual long STDMETHODCALLTYPE GetHeight( void) = 0;\r
+        \r
+        virtual long STDMETHODCALLTYPE GetRowBytes( void) = 0;\r
+        \r
+        virtual BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat( void) = 0;\r
+        \r
+        virtual BMDFrameFlags STDMETHODCALLTYPE GetFlags( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetBytes( \r
+            /* [out] */ void **buffer) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetTimecode( \r
+            BMDTimecodeFormat format,\r
+            /* [out] */ IDeckLinkTimecode **timecode) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetAncillaryData( \r
+            /* [out] */ IDeckLinkVideoFrameAncillary **ancillary) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkVideoFrameVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkVideoFrame * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkVideoFrame * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkVideoFrame * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetWidth )( \r
+            IDeckLinkVideoFrame * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetHeight )( \r
+            IDeckLinkVideoFrame * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetRowBytes )( \r
+            IDeckLinkVideoFrame * This);\r
+        \r
+        BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( \r
+            IDeckLinkVideoFrame * This);\r
+        \r
+        BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( \r
+            IDeckLinkVideoFrame * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBytes )( \r
+            IDeckLinkVideoFrame * This,\r
+            /* [out] */ void **buffer);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetTimecode )( \r
+            IDeckLinkVideoFrame * This,\r
+            BMDTimecodeFormat format,\r
+            /* [out] */ IDeckLinkTimecode **timecode);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( \r
+            IDeckLinkVideoFrame * This,\r
+            /* [out] */ IDeckLinkVideoFrameAncillary **ancillary);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkVideoFrameVtbl;\r
+\r
+    interface IDeckLinkVideoFrame\r
+    {\r
+        CONST_VTBL struct IDeckLinkVideoFrameVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkVideoFrame_QueryInterface(This,riid,ppvObject)        \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkVideoFrame_AddRef(This)       \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkVideoFrame_Release(This)      \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkVideoFrame_GetWidth(This)     \\r
+    ( (This)->lpVtbl -> GetWidth(This) ) \r
+\r
+#define IDeckLinkVideoFrame_GetHeight(This)    \\r
+    ( (This)->lpVtbl -> GetHeight(This) ) \r
+\r
+#define IDeckLinkVideoFrame_GetRowBytes(This)  \\r
+    ( (This)->lpVtbl -> GetRowBytes(This) ) \r
+\r
+#define IDeckLinkVideoFrame_GetPixelFormat(This)       \\r
+    ( (This)->lpVtbl -> GetPixelFormat(This) ) \r
+\r
+#define IDeckLinkVideoFrame_GetFlags(This)     \\r
+    ( (This)->lpVtbl -> GetFlags(This) ) \r
+\r
+#define IDeckLinkVideoFrame_GetBytes(This,buffer)      \\r
+    ( (This)->lpVtbl -> GetBytes(This,buffer) ) \r
+\r
+#define IDeckLinkVideoFrame_GetTimecode(This,format,timecode)  \\r
+    ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) \r
+\r
+#define IDeckLinkVideoFrame_GetAncillaryData(This,ancillary)   \\r
+    ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkVideoFrame_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkMutableVideoFrame_INTERFACE_DEFINED__\r
+#define __IDeckLinkMutableVideoFrame_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkMutableVideoFrame */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkMutableVideoFrame;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("46FCEE00-B4E6-43D0-91C0-023A7FCEB34F")\r
+    IDeckLinkMutableVideoFrame : public IDeckLinkVideoFrame\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE SetFlags( \r
+            BMDFrameFlags newFlags) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetTimecode( \r
+            BMDTimecodeFormat format,\r
+            /* [in] */ IDeckLinkTimecode *timecode) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetTimecodeFromComponents( \r
+            BMDTimecodeFormat format,\r
+            unsigned char hours,\r
+            unsigned char minutes,\r
+            unsigned char seconds,\r
+            unsigned char frames,\r
+            BMDTimecodeFlags flags) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetAncillaryData( \r
+            /* [in] */ IDeckLinkVideoFrameAncillary *ancillary) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkMutableVideoFrameVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkMutableVideoFrame * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkMutableVideoFrame * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkMutableVideoFrame * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetWidth )( \r
+            IDeckLinkMutableVideoFrame * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetHeight )( \r
+            IDeckLinkMutableVideoFrame * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetRowBytes )( \r
+            IDeckLinkMutableVideoFrame * This);\r
+        \r
+        BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( \r
+            IDeckLinkMutableVideoFrame * This);\r
+        \r
+        BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( \r
+            IDeckLinkMutableVideoFrame * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBytes )( \r
+            IDeckLinkMutableVideoFrame * This,\r
+            /* [out] */ void **buffer);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetTimecode )( \r
+            IDeckLinkMutableVideoFrame * This,\r
+            BMDTimecodeFormat format,\r
+            /* [out] */ IDeckLinkTimecode **timecode);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( \r
+            IDeckLinkMutableVideoFrame * This,\r
+            /* [out] */ IDeckLinkVideoFrameAncillary **ancillary);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetFlags )( \r
+            IDeckLinkMutableVideoFrame * This,\r
+            BMDFrameFlags newFlags);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetTimecode )( \r
+            IDeckLinkMutableVideoFrame * This,\r
+            BMDTimecodeFormat format,\r
+            /* [in] */ IDeckLinkTimecode *timecode);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetTimecodeFromComponents )( \r
+            IDeckLinkMutableVideoFrame * This,\r
+            BMDTimecodeFormat format,\r
+            unsigned char hours,\r
+            unsigned char minutes,\r
+            unsigned char seconds,\r
+            unsigned char frames,\r
+            BMDTimecodeFlags flags);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetAncillaryData )( \r
+            IDeckLinkMutableVideoFrame * This,\r
+            /* [in] */ IDeckLinkVideoFrameAncillary *ancillary);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkMutableVideoFrameVtbl;\r
+\r
+    interface IDeckLinkMutableVideoFrame\r
+    {\r
+        CONST_VTBL struct IDeckLinkMutableVideoFrameVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkMutableVideoFrame_QueryInterface(This,riid,ppvObject) \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkMutableVideoFrame_AddRef(This)        \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkMutableVideoFrame_Release(This)       \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkMutableVideoFrame_GetWidth(This)      \\r
+    ( (This)->lpVtbl -> GetWidth(This) ) \r
+\r
+#define IDeckLinkMutableVideoFrame_GetHeight(This)     \\r
+    ( (This)->lpVtbl -> GetHeight(This) ) \r
+\r
+#define IDeckLinkMutableVideoFrame_GetRowBytes(This)   \\r
+    ( (This)->lpVtbl -> GetRowBytes(This) ) \r
+\r
+#define IDeckLinkMutableVideoFrame_GetPixelFormat(This)        \\r
+    ( (This)->lpVtbl -> GetPixelFormat(This) ) \r
+\r
+#define IDeckLinkMutableVideoFrame_GetFlags(This)      \\r
+    ( (This)->lpVtbl -> GetFlags(This) ) \r
+\r
+#define IDeckLinkMutableVideoFrame_GetBytes(This,buffer)       \\r
+    ( (This)->lpVtbl -> GetBytes(This,buffer) ) \r
+\r
+#define IDeckLinkMutableVideoFrame_GetTimecode(This,format,timecode)   \\r
+    ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) \r
+\r
+#define IDeckLinkMutableVideoFrame_GetAncillaryData(This,ancillary)    \\r
+    ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) \r
+\r
+\r
+#define IDeckLinkMutableVideoFrame_SetFlags(This,newFlags)     \\r
+    ( (This)->lpVtbl -> SetFlags(This,newFlags) ) \r
+\r
+#define IDeckLinkMutableVideoFrame_SetTimecode(This,format,timecode)   \\r
+    ( (This)->lpVtbl -> SetTimecode(This,format,timecode) ) \r
+\r
+#define IDeckLinkMutableVideoFrame_SetTimecodeFromComponents(This,format,hours,minutes,seconds,frames,flags)   \\r
+    ( (This)->lpVtbl -> SetTimecodeFromComponents(This,format,hours,minutes,seconds,frames,flags) ) \r
+\r
+#define IDeckLinkMutableVideoFrame_SetAncillaryData(This,ancillary)    \\r
+    ( (This)->lpVtbl -> SetAncillaryData(This,ancillary) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkMutableVideoFrame_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoInputFrame_INTERFACE_DEFINED__\r
+#define __IDeckLinkVideoInputFrame_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkVideoInputFrame */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkVideoInputFrame;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("9A74FA41-AE9F-47AC-8CF4-01F42DD59965")\r
+    IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE GetStreamTime( \r
+            /* [out] */ BMDTimeValue *frameTime,\r
+            /* [out] */ BMDTimeValue *frameDuration,\r
+            BMDTimeScale timeScale) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceTimestamp( \r
+            BMDTimeScale timeScale,\r
+            /* [out] */ BMDTimeValue *frameTime,\r
+            /* [out] */ BMDTimeValue *frameDuration) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkVideoInputFrameVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkVideoInputFrame * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkVideoInputFrame * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkVideoInputFrame * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetWidth )( \r
+            IDeckLinkVideoInputFrame * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetHeight )( \r
+            IDeckLinkVideoInputFrame * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetRowBytes )( \r
+            IDeckLinkVideoInputFrame * This);\r
+        \r
+        BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( \r
+            IDeckLinkVideoInputFrame * This);\r
+        \r
+        BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( \r
+            IDeckLinkVideoInputFrame * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBytes )( \r
+            IDeckLinkVideoInputFrame * This,\r
+            /* [out] */ void **buffer);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetTimecode )( \r
+            IDeckLinkVideoInputFrame * This,\r
+            BMDTimecodeFormat format,\r
+            /* [out] */ IDeckLinkTimecode **timecode);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( \r
+            IDeckLinkVideoInputFrame * This,\r
+            /* [out] */ IDeckLinkVideoFrameAncillary **ancillary);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( \r
+            IDeckLinkVideoInputFrame * This,\r
+            /* [out] */ BMDTimeValue *frameTime,\r
+            /* [out] */ BMDTimeValue *frameDuration,\r
+            BMDTimeScale timeScale);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceTimestamp )( \r
+            IDeckLinkVideoInputFrame * This,\r
+            BMDTimeScale timeScale,\r
+            /* [out] */ BMDTimeValue *frameTime,\r
+            /* [out] */ BMDTimeValue *frameDuration);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkVideoInputFrameVtbl;\r
+\r
+    interface IDeckLinkVideoInputFrame\r
+    {\r
+        CONST_VTBL struct IDeckLinkVideoInputFrameVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkVideoInputFrame_QueryInterface(This,riid,ppvObject)   \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkVideoInputFrame_AddRef(This)  \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_Release(This) \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkVideoInputFrame_GetWidth(This)        \\r
+    ( (This)->lpVtbl -> GetWidth(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_GetHeight(This)       \\r
+    ( (This)->lpVtbl -> GetHeight(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_GetRowBytes(This)     \\r
+    ( (This)->lpVtbl -> GetRowBytes(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_GetPixelFormat(This)  \\r
+    ( (This)->lpVtbl -> GetPixelFormat(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_GetFlags(This)        \\r
+    ( (This)->lpVtbl -> GetFlags(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_GetBytes(This,buffer) \\r
+    ( (This)->lpVtbl -> GetBytes(This,buffer) ) \r
+\r
+#define IDeckLinkVideoInputFrame_GetTimecode(This,format,timecode)     \\r
+    ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) \r
+\r
+#define IDeckLinkVideoInputFrame_GetAncillaryData(This,ancillary)      \\r
+    ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) \r
+\r
+\r
+#define IDeckLinkVideoInputFrame_GetStreamTime(This,frameTime,frameDuration,timeScale) \\r
+    ( (This)->lpVtbl -> GetStreamTime(This,frameTime,frameDuration,timeScale) ) \r
+\r
+#define IDeckLinkVideoInputFrame_GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) \\r
+    ( (This)->lpVtbl -> GetHardwareReferenceTimestamp(This,timeScale,frameTime,frameDuration) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkVideoInputFrame_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoFrameAncillary_INTERFACE_DEFINED__\r
+#define __IDeckLinkVideoFrameAncillary_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkVideoFrameAncillary */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkVideoFrameAncillary;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("732E723C-D1A4-4E29-9E8E-4A88797A0004")\r
+    IDeckLinkVideoFrameAncillary : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE GetBufferForVerticalBlankingLine( \r
+            unsigned long lineNumber,\r
+            /* [out] */ void **buffer) = 0;\r
+        \r
+        virtual BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat( void) = 0;\r
+        \r
+        virtual BMDDisplayMode STDMETHODCALLTYPE GetDisplayMode( void) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkVideoFrameAncillaryVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkVideoFrameAncillary * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkVideoFrameAncillary * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkVideoFrameAncillary * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBufferForVerticalBlankingLine )( \r
+            IDeckLinkVideoFrameAncillary * This,\r
+            unsigned long lineNumber,\r
+            /* [out] */ void **buffer);\r
+        \r
+        BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( \r
+            IDeckLinkVideoFrameAncillary * This);\r
+        \r
+        BMDDisplayMode ( STDMETHODCALLTYPE *GetDisplayMode )( \r
+            IDeckLinkVideoFrameAncillary * This);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkVideoFrameAncillaryVtbl;\r
+\r
+    interface IDeckLinkVideoFrameAncillary\r
+    {\r
+        CONST_VTBL struct IDeckLinkVideoFrameAncillaryVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkVideoFrameAncillary_QueryInterface(This,riid,ppvObject)       \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkVideoFrameAncillary_AddRef(This)      \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkVideoFrameAncillary_Release(This)     \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkVideoFrameAncillary_GetBufferForVerticalBlankingLine(This,lineNumber,buffer)  \\r
+    ( (This)->lpVtbl -> GetBufferForVerticalBlankingLine(This,lineNumber,buffer) ) \r
+\r
+#define IDeckLinkVideoFrameAncillary_GetPixelFormat(This)      \\r
+    ( (This)->lpVtbl -> GetPixelFormat(This) ) \r
+\r
+#define IDeckLinkVideoFrameAncillary_GetDisplayMode(This)      \\r
+    ( (This)->lpVtbl -> GetDisplayMode(This) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkVideoFrameAncillary_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkAudioInputPacket_INTERFACE_DEFINED__\r
+#define __IDeckLinkAudioInputPacket_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkAudioInputPacket */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkAudioInputPacket;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("E43D5870-2894-11DE-8C30-0800200C9A66")\r
+    IDeckLinkAudioInputPacket : public IUnknown\r
+    {\r
+    public:\r
+        virtual long STDMETHODCALLTYPE GetSampleFrameCount( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetBytes( \r
+            /* [out] */ void **buffer) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetPacketTime( \r
+            /* [out] */ BMDTimeValue *packetTime,\r
+            BMDTimeScale timeScale) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkAudioInputPacketVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkAudioInputPacket * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkAudioInputPacket * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkAudioInputPacket * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetSampleFrameCount )( \r
+            IDeckLinkAudioInputPacket * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBytes )( \r
+            IDeckLinkAudioInputPacket * This,\r
+            /* [out] */ void **buffer);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetPacketTime )( \r
+            IDeckLinkAudioInputPacket * This,\r
+            /* [out] */ BMDTimeValue *packetTime,\r
+            BMDTimeScale timeScale);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkAudioInputPacketVtbl;\r
+\r
+    interface IDeckLinkAudioInputPacket\r
+    {\r
+        CONST_VTBL struct IDeckLinkAudioInputPacketVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkAudioInputPacket_QueryInterface(This,riid,ppvObject)  \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkAudioInputPacket_AddRef(This) \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkAudioInputPacket_Release(This)        \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkAudioInputPacket_GetSampleFrameCount(This)    \\r
+    ( (This)->lpVtbl -> GetSampleFrameCount(This) ) \r
+\r
+#define IDeckLinkAudioInputPacket_GetBytes(This,buffer)        \\r
+    ( (This)->lpVtbl -> GetBytes(This,buffer) ) \r
+\r
+#define IDeckLinkAudioInputPacket_GetPacketTime(This,packetTime,timeScale)     \\r
+    ( (This)->lpVtbl -> GetPacketTime(This,packetTime,timeScale) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkAudioInputPacket_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkScreenPreviewCallback_INTERFACE_DEFINED__\r
+#define __IDeckLinkScreenPreviewCallback_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkScreenPreviewCallback */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkScreenPreviewCallback;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("373F499D-4B4D-4518-AD22-6354E5A5825E")\r
+    IDeckLinkScreenPreviewCallback : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE DrawFrame( \r
+            /* [in] */ IDeckLinkVideoFrame *theFrame) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkScreenPreviewCallbackVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkScreenPreviewCallback * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkScreenPreviewCallback * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkScreenPreviewCallback * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DrawFrame )( \r
+            IDeckLinkScreenPreviewCallback * This,\r
+            /* [in] */ IDeckLinkVideoFrame *theFrame);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkScreenPreviewCallbackVtbl;\r
+\r
+    interface IDeckLinkScreenPreviewCallback\r
+    {\r
+        CONST_VTBL struct IDeckLinkScreenPreviewCallbackVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkScreenPreviewCallback_QueryInterface(This,riid,ppvObject)     \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkScreenPreviewCallback_AddRef(This)    \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkScreenPreviewCallback_Release(This)   \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkScreenPreviewCallback_DrawFrame(This,theFrame)        \\r
+    ( (This)->lpVtbl -> DrawFrame(This,theFrame) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkScreenPreviewCallback_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkGLScreenPreviewHelper_INTERFACE_DEFINED__\r
+#define __IDeckLinkGLScreenPreviewHelper_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkGLScreenPreviewHelper */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkGLScreenPreviewHelper;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("BA575CD9-A15E-497B-B2C2-F9AFE7BE4EBA")\r
+    IDeckLinkGLScreenPreviewHelper : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE InitializeGL( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE PaintGL( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetFrame( \r
+            /* [in] */ IDeckLinkVideoFrame *theFrame) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkGLScreenPreviewHelperVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkGLScreenPreviewHelper * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkGLScreenPreviewHelper * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkGLScreenPreviewHelper * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *InitializeGL )( \r
+            IDeckLinkGLScreenPreviewHelper * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *PaintGL )( \r
+            IDeckLinkGLScreenPreviewHelper * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetFrame )( \r
+            IDeckLinkGLScreenPreviewHelper * This,\r
+            /* [in] */ IDeckLinkVideoFrame *theFrame);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkGLScreenPreviewHelperVtbl;\r
+\r
+    interface IDeckLinkGLScreenPreviewHelper\r
+    {\r
+        CONST_VTBL struct IDeckLinkGLScreenPreviewHelperVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkGLScreenPreviewHelper_QueryInterface(This,riid,ppvObject)     \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkGLScreenPreviewHelper_AddRef(This)    \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkGLScreenPreviewHelper_Release(This)   \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkGLScreenPreviewHelper_InitializeGL(This)      \\r
+    ( (This)->lpVtbl -> InitializeGL(This) ) \r
+\r
+#define IDeckLinkGLScreenPreviewHelper_PaintGL(This)   \\r
+    ( (This)->lpVtbl -> PaintGL(This) ) \r
+\r
+#define IDeckLinkGLScreenPreviewHelper_SetFrame(This,theFrame) \\r
+    ( (This)->lpVtbl -> SetFrame(This,theFrame) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkGLScreenPreviewHelper_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkConfiguration_INTERFACE_DEFINED__\r
+#define __IDeckLinkConfiguration_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkConfiguration */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkConfiguration;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("B8EAD569-B764-47F0-A73F-AE40DF6CBF10")\r
+    IDeckLinkConfiguration : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE GetConfigurationValidator( \r
+            /* [out] */ IDeckLinkConfiguration **configObject) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE WriteConfigurationToPreferences( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFormat( \r
+            BMDVideoConnection videoOutputConnection) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE IsVideoOutputActive( \r
+            BMDVideoConnection videoOutputConnection,\r
+            /* [out] */ BOOL *active) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetAnalogVideoOutputFlags( \r
+            BMDAnalogVideoFlags analogVideoFlags) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetAnalogVideoOutputFlags( \r
+            /* [out] */ BMDAnalogVideoFlags *analogVideoFlags) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EnableFieldFlickerRemovalWhenPaused( \r
+            BOOL enable) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE IsEnabledFieldFlickerRemovalWhenPaused( \r
+            /* [out] */ BOOL *enabled) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE Set444And3GBpsVideoOutput( \r
+            BOOL enable444VideoOutput,\r
+            BOOL enable3GbsOutput) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE Get444And3GBpsVideoOutput( \r
+            /* [out] */ BOOL *is444VideoOutputEnabled,\r
+            /* [out] */ BOOL *threeGbsOutputEnabled) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetVideoOutputConversionMode( \r
+            BMDVideoOutputConversionMode conversionMode) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetVideoOutputConversionMode( \r
+            /* [out] */ BMDVideoOutputConversionMode *conversionMode) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE Set_HD1080p24_to_HD1080i5994_Conversion( \r
+            BOOL enable) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE Get_HD1080p24_to_HD1080i5994_Conversion( \r
+            /* [out] */ BOOL *enabled) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetVideoInputFormat( \r
+            BMDVideoConnection videoInputFormat) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetVideoInputFormat( \r
+            /* [out] */ BMDVideoConnection *videoInputFormat) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetAnalogVideoInputFlags( \r
+            BMDAnalogVideoFlags analogVideoFlags) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetAnalogVideoInputFlags( \r
+            /* [out] */ BMDAnalogVideoFlags *analogVideoFlags) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetVideoInputConversionMode( \r
+            BMDVideoInputConversionMode conversionMode) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetVideoInputConversionMode( \r
+            /* [out] */ BMDVideoInputConversionMode *conversionMode) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetBlackVideoOutputDuringCapture( \r
+            BOOL blackOutInCapture) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetBlackVideoOutputDuringCapture( \r
+            /* [out] */ BOOL *blackOutInCapture) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE Set32PulldownSequenceInitialTimecodeFrame( \r
+            unsigned long aFrameTimecode) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE Get32PulldownSequenceInitialTimecodeFrame( \r
+            /* [out] */ unsigned long *aFrameTimecode) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetVancSourceLineMapping( \r
+            unsigned long activeLine1VANCsource,\r
+            unsigned long activeLine2VANCsource,\r
+            unsigned long activeLine3VANCsource) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetVancSourceLineMapping( \r
+            /* [out] */ unsigned long *activeLine1VANCsource,\r
+            /* [out] */ unsigned long *activeLine2VANCsource,\r
+            /* [out] */ unsigned long *activeLine3VANCsource) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetAudioInputFormat( \r
+            BMDAudioConnection audioInputFormat) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetAudioInputFormat( \r
+            /* [out] */ BMDAudioConnection *audioInputFormat) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkConfigurationVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkConfiguration * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkConfiguration * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetConfigurationValidator )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [out] */ IDeckLinkConfiguration **configObject);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *WriteConfigurationToPreferences )( \r
+            IDeckLinkConfiguration * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFormat )( \r
+            IDeckLinkConfiguration * This,\r
+            BMDVideoConnection videoOutputConnection);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *IsVideoOutputActive )( \r
+            IDeckLinkConfiguration * This,\r
+            BMDVideoConnection videoOutputConnection,\r
+            /* [out] */ BOOL *active);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetAnalogVideoOutputFlags )( \r
+            IDeckLinkConfiguration * This,\r
+            BMDAnalogVideoFlags analogVideoFlags);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetAnalogVideoOutputFlags )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [out] */ BMDAnalogVideoFlags *analogVideoFlags);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EnableFieldFlickerRemovalWhenPaused )( \r
+            IDeckLinkConfiguration * This,\r
+            BOOL enable);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *IsEnabledFieldFlickerRemovalWhenPaused )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [out] */ BOOL *enabled);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *Set444And3GBpsVideoOutput )( \r
+            IDeckLinkConfiguration * This,\r
+            BOOL enable444VideoOutput,\r
+            BOOL enable3GbsOutput);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *Get444And3GBpsVideoOutput )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [out] */ BOOL *is444VideoOutputEnabled,\r
+            /* [out] */ BOOL *threeGbsOutputEnabled);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetVideoOutputConversionMode )( \r
+            IDeckLinkConfiguration * This,\r
+            BMDVideoOutputConversionMode conversionMode);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetVideoOutputConversionMode )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [out] */ BMDVideoOutputConversionMode *conversionMode);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *Set_HD1080p24_to_HD1080i5994_Conversion )( \r
+            IDeckLinkConfiguration * This,\r
+            BOOL enable);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *Get_HD1080p24_to_HD1080i5994_Conversion )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [out] */ BOOL *enabled);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetVideoInputFormat )( \r
+            IDeckLinkConfiguration * This,\r
+            BMDVideoConnection videoInputFormat);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetVideoInputFormat )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [out] */ BMDVideoConnection *videoInputFormat);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetAnalogVideoInputFlags )( \r
+            IDeckLinkConfiguration * This,\r
+            BMDAnalogVideoFlags analogVideoFlags);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetAnalogVideoInputFlags )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [out] */ BMDAnalogVideoFlags *analogVideoFlags);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetVideoInputConversionMode )( \r
+            IDeckLinkConfiguration * This,\r
+            BMDVideoInputConversionMode conversionMode);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetVideoInputConversionMode )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [out] */ BMDVideoInputConversionMode *conversionMode);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetBlackVideoOutputDuringCapture )( \r
+            IDeckLinkConfiguration * This,\r
+            BOOL blackOutInCapture);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBlackVideoOutputDuringCapture )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [out] */ BOOL *blackOutInCapture);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *Set32PulldownSequenceInitialTimecodeFrame )( \r
+            IDeckLinkConfiguration * This,\r
+            unsigned long aFrameTimecode);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *Get32PulldownSequenceInitialTimecodeFrame )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [out] */ unsigned long *aFrameTimecode);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetVancSourceLineMapping )( \r
+            IDeckLinkConfiguration * This,\r
+            unsigned long activeLine1VANCsource,\r
+            unsigned long activeLine2VANCsource,\r
+            unsigned long activeLine3VANCsource);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetVancSourceLineMapping )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [out] */ unsigned long *activeLine1VANCsource,\r
+            /* [out] */ unsigned long *activeLine2VANCsource,\r
+            /* [out] */ unsigned long *activeLine3VANCsource);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetAudioInputFormat )( \r
+            IDeckLinkConfiguration * This,\r
+            BMDAudioConnection audioInputFormat);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetAudioInputFormat )( \r
+            IDeckLinkConfiguration * This,\r
+            /* [out] */ BMDAudioConnection *audioInputFormat);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkConfigurationVtbl;\r
+\r
+    interface IDeckLinkConfiguration\r
+    {\r
+        CONST_VTBL struct IDeckLinkConfigurationVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkConfiguration_QueryInterface(This,riid,ppvObject)     \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkConfiguration_AddRef(This)    \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkConfiguration_Release(This)   \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkConfiguration_GetConfigurationValidator(This,configObject)    \\r
+    ( (This)->lpVtbl -> GetConfigurationValidator(This,configObject) ) \r
+\r
+#define IDeckLinkConfiguration_WriteConfigurationToPreferences(This)   \\r
+    ( (This)->lpVtbl -> WriteConfigurationToPreferences(This) ) \r
+\r
+#define IDeckLinkConfiguration_SetVideoOutputFormat(This,videoOutputConnection)        \\r
+    ( (This)->lpVtbl -> SetVideoOutputFormat(This,videoOutputConnection) ) \r
+\r
+#define IDeckLinkConfiguration_IsVideoOutputActive(This,videoOutputConnection,active)  \\r
+    ( (This)->lpVtbl -> IsVideoOutputActive(This,videoOutputConnection,active) ) \r
+\r
+#define IDeckLinkConfiguration_SetAnalogVideoOutputFlags(This,analogVideoFlags)        \\r
+    ( (This)->lpVtbl -> SetAnalogVideoOutputFlags(This,analogVideoFlags) ) \r
+\r
+#define IDeckLinkConfiguration_GetAnalogVideoOutputFlags(This,analogVideoFlags)        \\r
+    ( (This)->lpVtbl -> GetAnalogVideoOutputFlags(This,analogVideoFlags) ) \r
+\r
+#define IDeckLinkConfiguration_EnableFieldFlickerRemovalWhenPaused(This,enable)        \\r
+    ( (This)->lpVtbl -> EnableFieldFlickerRemovalWhenPaused(This,enable) ) \r
+\r
+#define IDeckLinkConfiguration_IsEnabledFieldFlickerRemovalWhenPaused(This,enabled)    \\r
+    ( (This)->lpVtbl -> IsEnabledFieldFlickerRemovalWhenPaused(This,enabled) ) \r
+\r
+#define IDeckLinkConfiguration_Set444And3GBpsVideoOutput(This,enable444VideoOutput,enable3GbsOutput)   \\r
+    ( (This)->lpVtbl -> Set444And3GBpsVideoOutput(This,enable444VideoOutput,enable3GbsOutput) ) \r
+\r
+#define IDeckLinkConfiguration_Get444And3GBpsVideoOutput(This,is444VideoOutputEnabled,threeGbsOutputEnabled)   \\r
+    ( (This)->lpVtbl -> Get444And3GBpsVideoOutput(This,is444VideoOutputEnabled,threeGbsOutputEnabled) ) \r
+\r
+#define IDeckLinkConfiguration_SetVideoOutputConversionMode(This,conversionMode)       \\r
+    ( (This)->lpVtbl -> SetVideoOutputConversionMode(This,conversionMode) ) \r
+\r
+#define IDeckLinkConfiguration_GetVideoOutputConversionMode(This,conversionMode)       \\r
+    ( (This)->lpVtbl -> GetVideoOutputConversionMode(This,conversionMode) ) \r
+\r
+#define IDeckLinkConfiguration_Set_HD1080p24_to_HD1080i5994_Conversion(This,enable)    \\r
+    ( (This)->lpVtbl -> Set_HD1080p24_to_HD1080i5994_Conversion(This,enable) ) \r
+\r
+#define IDeckLinkConfiguration_Get_HD1080p24_to_HD1080i5994_Conversion(This,enabled)   \\r
+    ( (This)->lpVtbl -> Get_HD1080p24_to_HD1080i5994_Conversion(This,enabled) ) \r
+\r
+#define IDeckLinkConfiguration_SetVideoInputFormat(This,videoInputFormat)      \\r
+    ( (This)->lpVtbl -> SetVideoInputFormat(This,videoInputFormat) ) \r
+\r
+#define IDeckLinkConfiguration_GetVideoInputFormat(This,videoInputFormat)      \\r
+    ( (This)->lpVtbl -> GetVideoInputFormat(This,videoInputFormat) ) \r
+\r
+#define IDeckLinkConfiguration_SetAnalogVideoInputFlags(This,analogVideoFlags) \\r
+    ( (This)->lpVtbl -> SetAnalogVideoInputFlags(This,analogVideoFlags) ) \r
+\r
+#define IDeckLinkConfiguration_GetAnalogVideoInputFlags(This,analogVideoFlags) \\r
+    ( (This)->lpVtbl -> GetAnalogVideoInputFlags(This,analogVideoFlags) ) \r
+\r
+#define IDeckLinkConfiguration_SetVideoInputConversionMode(This,conversionMode)        \\r
+    ( (This)->lpVtbl -> SetVideoInputConversionMode(This,conversionMode) ) \r
+\r
+#define IDeckLinkConfiguration_GetVideoInputConversionMode(This,conversionMode)        \\r
+    ( (This)->lpVtbl -> GetVideoInputConversionMode(This,conversionMode) ) \r
+\r
+#define IDeckLinkConfiguration_SetBlackVideoOutputDuringCapture(This,blackOutInCapture)        \\r
+    ( (This)->lpVtbl -> SetBlackVideoOutputDuringCapture(This,blackOutInCapture) ) \r
+\r
+#define IDeckLinkConfiguration_GetBlackVideoOutputDuringCapture(This,blackOutInCapture)        \\r
+    ( (This)->lpVtbl -> GetBlackVideoOutputDuringCapture(This,blackOutInCapture) ) \r
+\r
+#define IDeckLinkConfiguration_Set32PulldownSequenceInitialTimecodeFrame(This,aFrameTimecode)  \\r
+    ( (This)->lpVtbl -> Set32PulldownSequenceInitialTimecodeFrame(This,aFrameTimecode) ) \r
+\r
+#define IDeckLinkConfiguration_Get32PulldownSequenceInitialTimecodeFrame(This,aFrameTimecode)  \\r
+    ( (This)->lpVtbl -> Get32PulldownSequenceInitialTimecodeFrame(This,aFrameTimecode) ) \r
+\r
+#define IDeckLinkConfiguration_SetVancSourceLineMapping(This,activeLine1VANCsource,activeLine2VANCsource,activeLine3VANCsource)        \\r
+    ( (This)->lpVtbl -> SetVancSourceLineMapping(This,activeLine1VANCsource,activeLine2VANCsource,activeLine3VANCsource) ) \r
+\r
+#define IDeckLinkConfiguration_GetVancSourceLineMapping(This,activeLine1VANCsource,activeLine2VANCsource,activeLine3VANCsource)        \\r
+    ( (This)->lpVtbl -> GetVancSourceLineMapping(This,activeLine1VANCsource,activeLine2VANCsource,activeLine3VANCsource) ) \r
+\r
+#define IDeckLinkConfiguration_SetAudioInputFormat(This,audioInputFormat)      \\r
+    ( (This)->lpVtbl -> SetAudioInputFormat(This,audioInputFormat) ) \r
+\r
+#define IDeckLinkConfiguration_GetAudioInputFormat(This,audioInputFormat)      \\r
+    ( (This)->lpVtbl -> GetAudioInputFormat(This,audioInputFormat) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkConfiguration_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkAttributes_INTERFACE_DEFINED__\r
+#define __IDeckLinkAttributes_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkAttributes */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkAttributes;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("ABC11843-D966-44CB-96E2-A1CB5D3135C4")\r
+    IDeckLinkAttributes : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE GetFlag( \r
+            /* [in] */ BMDDeckLinkAttributeID cfgID,\r
+            /* [out] */ BOOL *value) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetInt( \r
+            /* [in] */ BMDDeckLinkAttributeID cfgID,\r
+            /* [out] */ LONGLONG *value) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetFloat( \r
+            /* [in] */ BMDDeckLinkAttributeID cfgID,\r
+            /* [out] */ double *value) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetString( \r
+            /* [in] */ BMDDeckLinkAttributeID cfgID,\r
+            /* [out] */ BSTR *value) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkAttributesVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkAttributes * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkAttributes * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkAttributes * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetFlag )( \r
+            IDeckLinkAttributes * This,\r
+            /* [in] */ BMDDeckLinkAttributeID cfgID,\r
+            /* [out] */ BOOL *value);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetInt )( \r
+            IDeckLinkAttributes * This,\r
+            /* [in] */ BMDDeckLinkAttributeID cfgID,\r
+            /* [out] */ LONGLONG *value);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetFloat )( \r
+            IDeckLinkAttributes * This,\r
+            /* [in] */ BMDDeckLinkAttributeID cfgID,\r
+            /* [out] */ double *value);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetString )( \r
+            IDeckLinkAttributes * This,\r
+            /* [in] */ BMDDeckLinkAttributeID cfgID,\r
+            /* [out] */ BSTR *value);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkAttributesVtbl;\r
+\r
+    interface IDeckLinkAttributes\r
+    {\r
+        CONST_VTBL struct IDeckLinkAttributesVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkAttributes_QueryInterface(This,riid,ppvObject)        \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkAttributes_AddRef(This)       \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkAttributes_Release(This)      \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkAttributes_GetFlag(This,cfgID,value)  \\r
+    ( (This)->lpVtbl -> GetFlag(This,cfgID,value) ) \r
+\r
+#define IDeckLinkAttributes_GetInt(This,cfgID,value)   \\r
+    ( (This)->lpVtbl -> GetInt(This,cfgID,value) ) \r
+\r
+#define IDeckLinkAttributes_GetFloat(This,cfgID,value) \\r
+    ( (This)->lpVtbl -> GetFloat(This,cfgID,value) ) \r
+\r
+#define IDeckLinkAttributes_GetString(This,cfgID,value)        \\r
+    ( (This)->lpVtbl -> GetString(This,cfgID,value) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkAttributes_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkKeyer_INTERFACE_DEFINED__\r
+#define __IDeckLinkKeyer_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkKeyer */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkKeyer;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3")\r
+    IDeckLinkKeyer : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE Enable( \r
+            /* [in] */ BOOL isExternal) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetLevel( \r
+            /* [in] */ unsigned char level) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE RampUp( \r
+            /* [in] */ unsigned long numberOfFrames) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE RampDown( \r
+            /* [in] */ unsigned long numberOfFrames) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE Disable( void) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkKeyerVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkKeyer * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkKeyer * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkKeyer * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *Enable )( \r
+            IDeckLinkKeyer * This,\r
+            /* [in] */ BOOL isExternal);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetLevel )( \r
+            IDeckLinkKeyer * This,\r
+            /* [in] */ unsigned char level);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *RampUp )( \r
+            IDeckLinkKeyer * This,\r
+            /* [in] */ unsigned long numberOfFrames);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *RampDown )( \r
+            IDeckLinkKeyer * This,\r
+            /* [in] */ unsigned long numberOfFrames);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *Disable )( \r
+            IDeckLinkKeyer * This);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkKeyerVtbl;\r
+\r
+    interface IDeckLinkKeyer\r
+    {\r
+        CONST_VTBL struct IDeckLinkKeyerVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkKeyer_QueryInterface(This,riid,ppvObject)     \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkKeyer_AddRef(This)    \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkKeyer_Release(This)   \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkKeyer_Enable(This,isExternal) \\r
+    ( (This)->lpVtbl -> Enable(This,isExternal) ) \r
+\r
+#define IDeckLinkKeyer_SetLevel(This,level)    \\r
+    ( (This)->lpVtbl -> SetLevel(This,level) ) \r
+\r
+#define IDeckLinkKeyer_RampUp(This,numberOfFrames)     \\r
+    ( (This)->lpVtbl -> RampUp(This,numberOfFrames) ) \r
+\r
+#define IDeckLinkKeyer_RampDown(This,numberOfFrames)   \\r
+    ( (This)->lpVtbl -> RampDown(This,numberOfFrames) ) \r
+\r
+#define IDeckLinkKeyer_Disable(This)   \\r
+    ( (This)->lpVtbl -> Disable(This) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkKeyer_INTERFACE_DEFINED__ */\r
+\r
+\r
+EXTERN_C const CLSID CLSID_CDeckLinkIterator;\r
+\r
+#ifdef __cplusplus\r
+\r
+class DECLSPEC_UUID("D9EDA3B3-2887-41FA-B724-017CF1EB1D37")\r
+CDeckLinkIterator;\r
+#endif\r
+\r
+EXTERN_C const CLSID CLSID_CDeckLinkGLScreenPreviewHelper;\r
+\r
+#ifdef __cplusplus\r
+\r
+class DECLSPEC_UUID("D398CEE7-4434-4CA3-9BA6-5AE34556B905")\r
+CDeckLinkGLScreenPreviewHelper;\r
+#endif\r
+\r
+#ifndef __IDeckLinkDisplayModeIterator_v7_1_INTERFACE_DEFINED__\r
+#define __IDeckLinkDisplayModeIterator_v7_1_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkDisplayModeIterator_v7_1 */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkDisplayModeIterator_v7_1;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("B28131B6-59AC-4857-B5AC-CD75D5883E2F")\r
+    IDeckLinkDisplayModeIterator_v7_1 : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE Next( \r
+            /* [out] */ IDeckLinkDisplayMode_v7_1 **deckLinkDisplayMode) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkDisplayModeIterator_v7_1Vtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkDisplayModeIterator_v7_1 * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkDisplayModeIterator_v7_1 * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkDisplayModeIterator_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *Next )( \r
+            IDeckLinkDisplayModeIterator_v7_1 * This,\r
+            /* [out] */ IDeckLinkDisplayMode_v7_1 **deckLinkDisplayMode);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkDisplayModeIterator_v7_1Vtbl;\r
+\r
+    interface IDeckLinkDisplayModeIterator_v7_1\r
+    {\r
+        CONST_VTBL struct IDeckLinkDisplayModeIterator_v7_1Vtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkDisplayModeIterator_v7_1_QueryInterface(This,riid,ppvObject)  \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkDisplayModeIterator_v7_1_AddRef(This) \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkDisplayModeIterator_v7_1_Release(This)        \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkDisplayModeIterator_v7_1_Next(This,deckLinkDisplayMode)       \\r
+    ( (This)->lpVtbl -> Next(This,deckLinkDisplayMode) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkDisplayModeIterator_v7_1_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkDisplayMode_v7_1_INTERFACE_DEFINED__\r
+#define __IDeckLinkDisplayMode_v7_1_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkDisplayMode_v7_1 */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkDisplayMode_v7_1;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("AF0CD6D5-8376-435E-8433-54F9DD530AC3")\r
+    IDeckLinkDisplayMode_v7_1 : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE GetName( \r
+            /* [out] */ BSTR *name) = 0;\r
+        \r
+        virtual BMDDisplayMode STDMETHODCALLTYPE GetDisplayMode( void) = 0;\r
+        \r
+        virtual long STDMETHODCALLTYPE GetWidth( void) = 0;\r
+        \r
+        virtual long STDMETHODCALLTYPE GetHeight( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetFrameRate( \r
+            /* [out] */ BMDTimeValue *frameDuration,\r
+            /* [out] */ BMDTimeScale *timeScale) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkDisplayMode_v7_1Vtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkDisplayMode_v7_1 * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkDisplayMode_v7_1 * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkDisplayMode_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetName )( \r
+            IDeckLinkDisplayMode_v7_1 * This,\r
+            /* [out] */ BSTR *name);\r
+        \r
+        BMDDisplayMode ( STDMETHODCALLTYPE *GetDisplayMode )( \r
+            IDeckLinkDisplayMode_v7_1 * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetWidth )( \r
+            IDeckLinkDisplayMode_v7_1 * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetHeight )( \r
+            IDeckLinkDisplayMode_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetFrameRate )( \r
+            IDeckLinkDisplayMode_v7_1 * This,\r
+            /* [out] */ BMDTimeValue *frameDuration,\r
+            /* [out] */ BMDTimeScale *timeScale);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkDisplayMode_v7_1Vtbl;\r
+\r
+    interface IDeckLinkDisplayMode_v7_1\r
+    {\r
+        CONST_VTBL struct IDeckLinkDisplayMode_v7_1Vtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkDisplayMode_v7_1_QueryInterface(This,riid,ppvObject)  \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkDisplayMode_v7_1_AddRef(This) \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkDisplayMode_v7_1_Release(This)        \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkDisplayMode_v7_1_GetName(This,name)   \\r
+    ( (This)->lpVtbl -> GetName(This,name) ) \r
+\r
+#define IDeckLinkDisplayMode_v7_1_GetDisplayMode(This) \\r
+    ( (This)->lpVtbl -> GetDisplayMode(This) ) \r
+\r
+#define IDeckLinkDisplayMode_v7_1_GetWidth(This)       \\r
+    ( (This)->lpVtbl -> GetWidth(This) ) \r
+\r
+#define IDeckLinkDisplayMode_v7_1_GetHeight(This)      \\r
+    ( (This)->lpVtbl -> GetHeight(This) ) \r
+\r
+#define IDeckLinkDisplayMode_v7_1_GetFrameRate(This,frameDuration,timeScale)   \\r
+    ( (This)->lpVtbl -> GetFrameRate(This,frameDuration,timeScale) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkDisplayMode_v7_1_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoFrame_v7_1_INTERFACE_DEFINED__\r
+#define __IDeckLinkVideoFrame_v7_1_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkVideoFrame_v7_1 */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkVideoFrame_v7_1;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("333F3A10-8C2D-43CF-B79D-46560FEEA1CE")\r
+    IDeckLinkVideoFrame_v7_1 : public IUnknown\r
+    {\r
+    public:\r
+        virtual long STDMETHODCALLTYPE GetWidth( void) = 0;\r
+        \r
+        virtual long STDMETHODCALLTYPE GetHeight( void) = 0;\r
+        \r
+        virtual long STDMETHODCALLTYPE GetRowBytes( void) = 0;\r
+        \r
+        virtual BMDPixelFormat STDMETHODCALLTYPE GetPixelFormat( void) = 0;\r
+        \r
+        virtual BMDFrameFlags STDMETHODCALLTYPE GetFlags( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetBytes( \r
+            void **buffer) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkVideoFrame_v7_1Vtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkVideoFrame_v7_1 * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkVideoFrame_v7_1 * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkVideoFrame_v7_1 * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetWidth )( \r
+            IDeckLinkVideoFrame_v7_1 * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetHeight )( \r
+            IDeckLinkVideoFrame_v7_1 * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetRowBytes )( \r
+            IDeckLinkVideoFrame_v7_1 * This);\r
+        \r
+        BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( \r
+            IDeckLinkVideoFrame_v7_1 * This);\r
+        \r
+        BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( \r
+            IDeckLinkVideoFrame_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBytes )( \r
+            IDeckLinkVideoFrame_v7_1 * This,\r
+            void **buffer);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkVideoFrame_v7_1Vtbl;\r
+\r
+    interface IDeckLinkVideoFrame_v7_1\r
+    {\r
+        CONST_VTBL struct IDeckLinkVideoFrame_v7_1Vtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkVideoFrame_v7_1_QueryInterface(This,riid,ppvObject)   \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkVideoFrame_v7_1_AddRef(This)  \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkVideoFrame_v7_1_Release(This) \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkVideoFrame_v7_1_GetWidth(This)        \\r
+    ( (This)->lpVtbl -> GetWidth(This) ) \r
+\r
+#define IDeckLinkVideoFrame_v7_1_GetHeight(This)       \\r
+    ( (This)->lpVtbl -> GetHeight(This) ) \r
+\r
+#define IDeckLinkVideoFrame_v7_1_GetRowBytes(This)     \\r
+    ( (This)->lpVtbl -> GetRowBytes(This) ) \r
+\r
+#define IDeckLinkVideoFrame_v7_1_GetPixelFormat(This)  \\r
+    ( (This)->lpVtbl -> GetPixelFormat(This) ) \r
+\r
+#define IDeckLinkVideoFrame_v7_1_GetFlags(This)        \\r
+    ( (This)->lpVtbl -> GetFlags(This) ) \r
+\r
+#define IDeckLinkVideoFrame_v7_1_GetBytes(This,buffer) \\r
+    ( (This)->lpVtbl -> GetBytes(This,buffer) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkVideoFrame_v7_1_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoInputFrame_v7_1_INTERFACE_DEFINED__\r
+#define __IDeckLinkVideoInputFrame_v7_1_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkVideoInputFrame_v7_1 */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkVideoInputFrame_v7_1;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("C8B41D95-8848-40EE-9B37-6E3417FB114B")\r
+    IDeckLinkVideoInputFrame_v7_1 : public IDeckLinkVideoFrame_v7_1\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE GetFrameTime( \r
+            BMDTimeValue *frameTime,\r
+            BMDTimeValue *frameDuration,\r
+            BMDTimeScale timeScale) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkVideoInputFrame_v7_1Vtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkVideoInputFrame_v7_1 * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkVideoInputFrame_v7_1 * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkVideoInputFrame_v7_1 * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetWidth )( \r
+            IDeckLinkVideoInputFrame_v7_1 * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetHeight )( \r
+            IDeckLinkVideoInputFrame_v7_1 * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetRowBytes )( \r
+            IDeckLinkVideoInputFrame_v7_1 * This);\r
+        \r
+        BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( \r
+            IDeckLinkVideoInputFrame_v7_1 * This);\r
+        \r
+        BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( \r
+            IDeckLinkVideoInputFrame_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBytes )( \r
+            IDeckLinkVideoInputFrame_v7_1 * This,\r
+            void **buffer);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetFrameTime )( \r
+            IDeckLinkVideoInputFrame_v7_1 * This,\r
+            BMDTimeValue *frameTime,\r
+            BMDTimeValue *frameDuration,\r
+            BMDTimeScale timeScale);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkVideoInputFrame_v7_1Vtbl;\r
+\r
+    interface IDeckLinkVideoInputFrame_v7_1\r
+    {\r
+        CONST_VTBL struct IDeckLinkVideoInputFrame_v7_1Vtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkVideoInputFrame_v7_1_QueryInterface(This,riid,ppvObject)      \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_1_AddRef(This)     \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_1_Release(This)    \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkVideoInputFrame_v7_1_GetWidth(This)   \\r
+    ( (This)->lpVtbl -> GetWidth(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_1_GetHeight(This)  \\r
+    ( (This)->lpVtbl -> GetHeight(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_1_GetRowBytes(This)        \\r
+    ( (This)->lpVtbl -> GetRowBytes(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_1_GetPixelFormat(This)     \\r
+    ( (This)->lpVtbl -> GetPixelFormat(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_1_GetFlags(This)   \\r
+    ( (This)->lpVtbl -> GetFlags(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_1_GetBytes(This,buffer)    \\r
+    ( (This)->lpVtbl -> GetBytes(This,buffer) ) \r
+\r
+\r
+#define IDeckLinkVideoInputFrame_v7_1_GetFrameTime(This,frameTime,frameDuration,timeScale)     \\r
+    ( (This)->lpVtbl -> GetFrameTime(This,frameTime,frameDuration,timeScale) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkVideoInputFrame_v7_1_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkAudioInputPacket_v7_1_INTERFACE_DEFINED__\r
+#define __IDeckLinkAudioInputPacket_v7_1_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkAudioInputPacket_v7_1 */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkAudioInputPacket_v7_1;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("C86DE4F6-A29F-42E3-AB3A-1363E29F0788")\r
+    IDeckLinkAudioInputPacket_v7_1 : public IUnknown\r
+    {\r
+    public:\r
+        virtual long STDMETHODCALLTYPE GetSampleCount( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetBytes( \r
+            void **buffer) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetAudioPacketTime( \r
+            BMDTimeValue *packetTime,\r
+            BMDTimeScale timeScale) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkAudioInputPacket_v7_1Vtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkAudioInputPacket_v7_1 * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkAudioInputPacket_v7_1 * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkAudioInputPacket_v7_1 * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetSampleCount )( \r
+            IDeckLinkAudioInputPacket_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBytes )( \r
+            IDeckLinkAudioInputPacket_v7_1 * This,\r
+            void **buffer);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetAudioPacketTime )( \r
+            IDeckLinkAudioInputPacket_v7_1 * This,\r
+            BMDTimeValue *packetTime,\r
+            BMDTimeScale timeScale);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkAudioInputPacket_v7_1Vtbl;\r
+\r
+    interface IDeckLinkAudioInputPacket_v7_1\r
+    {\r
+        CONST_VTBL struct IDeckLinkAudioInputPacket_v7_1Vtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkAudioInputPacket_v7_1_QueryInterface(This,riid,ppvObject)     \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkAudioInputPacket_v7_1_AddRef(This)    \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkAudioInputPacket_v7_1_Release(This)   \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkAudioInputPacket_v7_1_GetSampleCount(This)    \\r
+    ( (This)->lpVtbl -> GetSampleCount(This) ) \r
+\r
+#define IDeckLinkAudioInputPacket_v7_1_GetBytes(This,buffer)   \\r
+    ( (This)->lpVtbl -> GetBytes(This,buffer) ) \r
+\r
+#define IDeckLinkAudioInputPacket_v7_1_GetAudioPacketTime(This,packetTime,timeScale)   \\r
+    ( (This)->lpVtbl -> GetAudioPacketTime(This,packetTime,timeScale) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkAudioInputPacket_v7_1_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoOutputCallback_v7_1_INTERFACE_DEFINED__\r
+#define __IDeckLinkVideoOutputCallback_v7_1_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkVideoOutputCallback_v7_1 */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkVideoOutputCallback_v7_1;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("EBD01AFA-E4B0-49C6-A01D-EDB9D1B55FD9")\r
+    IDeckLinkVideoOutputCallback_v7_1 : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE ScheduledFrameCompleted( \r
+            /* [in] */ IDeckLinkVideoFrame_v7_1 *completedFrame,\r
+            /* [in] */ BMDOutputFrameCompletionResult result) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkVideoOutputCallback_v7_1Vtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkVideoOutputCallback_v7_1 * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkVideoOutputCallback_v7_1 * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkVideoOutputCallback_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *ScheduledFrameCompleted )( \r
+            IDeckLinkVideoOutputCallback_v7_1 * This,\r
+            /* [in] */ IDeckLinkVideoFrame_v7_1 *completedFrame,\r
+            /* [in] */ BMDOutputFrameCompletionResult result);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkVideoOutputCallback_v7_1Vtbl;\r
+\r
+    interface IDeckLinkVideoOutputCallback_v7_1\r
+    {\r
+        CONST_VTBL struct IDeckLinkVideoOutputCallback_v7_1Vtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkVideoOutputCallback_v7_1_QueryInterface(This,riid,ppvObject)  \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkVideoOutputCallback_v7_1_AddRef(This) \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkVideoOutputCallback_v7_1_Release(This)        \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkVideoOutputCallback_v7_1_ScheduledFrameCompleted(This,completedFrame,result)  \\r
+    ( (This)->lpVtbl -> ScheduledFrameCompleted(This,completedFrame,result) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkVideoOutputCallback_v7_1_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkInputCallback_v7_1_INTERFACE_DEFINED__\r
+#define __IDeckLinkInputCallback_v7_1_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkInputCallback_v7_1 */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkInputCallback_v7_1;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("7F94F328-5ED4-4E9F-9729-76A86BDC99CC")\r
+    IDeckLinkInputCallback_v7_1 : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived( \r
+            /* [in] */ IDeckLinkVideoInputFrame_v7_1 *videoFrame,\r
+            /* [in] */ IDeckLinkAudioInputPacket_v7_1 *audioPacket) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkInputCallback_v7_1Vtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkInputCallback_v7_1 * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkInputCallback_v7_1 * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkInputCallback_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *VideoInputFrameArrived )( \r
+            IDeckLinkInputCallback_v7_1 * This,\r
+            /* [in] */ IDeckLinkVideoInputFrame_v7_1 *videoFrame,\r
+            /* [in] */ IDeckLinkAudioInputPacket_v7_1 *audioPacket);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkInputCallback_v7_1Vtbl;\r
+\r
+    interface IDeckLinkInputCallback_v7_1\r
+    {\r
+        CONST_VTBL struct IDeckLinkInputCallback_v7_1Vtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkInputCallback_v7_1_QueryInterface(This,riid,ppvObject)        \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkInputCallback_v7_1_AddRef(This)       \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkInputCallback_v7_1_Release(This)      \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkInputCallback_v7_1_VideoInputFrameArrived(This,videoFrame,audioPacket)        \\r
+    ( (This)->lpVtbl -> VideoInputFrameArrived(This,videoFrame,audioPacket) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkInputCallback_v7_1_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkOutput_v7_1_INTERFACE_DEFINED__\r
+#define __IDeckLinkOutput_v7_1_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkOutput_v7_1 */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkOutput_v7_1;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("AE5B3E9B-4E1E-4535-B6E8-480FF52F6CE5")\r
+    IDeckLinkOutput_v7_1 : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( \r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ BMDDisplayModeSupport *result) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( \r
+            /* [out] */ IDeckLinkDisplayModeIterator_v7_1 **iterator) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( \r
+            BMDDisplayMode displayMode) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisableVideoOutput( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( \r
+            /* [in] */ IDeckLinkMemoryAllocator *theAllocator) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( \r
+            long width,\r
+            long height,\r
+            long rowBytes,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDFrameFlags flags,\r
+            IDeckLinkVideoFrame_v7_1 **outFrame) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE CreateVideoFrameFromBuffer( \r
+            void *buffer,\r
+            long width,\r
+            long height,\r
+            long rowBytes,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDFrameFlags flags,\r
+            IDeckLinkVideoFrame_v7_1 **outFrame) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( \r
+            IDeckLinkVideoFrame_v7_1 *theFrame) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( \r
+            IDeckLinkVideoFrame_v7_1 *theFrame,\r
+            BMDTimeValue displayTime,\r
+            BMDTimeValue displayDuration,\r
+            BMDTimeScale timeScale) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( \r
+            /* [in] */ IDeckLinkVideoOutputCallback_v7_1 *theCallback) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( \r
+            BMDAudioSampleRate sampleRate,\r
+            BMDAudioSampleType sampleType,\r
+            unsigned long channelCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisableAudioOutput( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( \r
+            void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            /* [out] */ unsigned long *sampleFramesWritten) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE BeginAudioPreroll( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EndAudioPreroll( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( \r
+            void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            BMDTimeValue streamTime,\r
+            BMDTimeScale timeScale,\r
+            /* [out] */ unsigned long *sampleFramesWritten) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( \r
+            /* [out] */ unsigned long *bufferedSampleCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE FlushBufferedAudioSamples( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( \r
+            /* [in] */ IDeckLinkAudioOutputCallback *theCallback) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( \r
+            BMDTimeValue playbackStartTime,\r
+            BMDTimeScale timeScale,\r
+            double playbackSpeed) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( \r
+            BMDTimeValue stopPlaybackAtTime,\r
+            BMDTimeValue *actualStopTime,\r
+            BMDTimeScale timeScale) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( \r
+            BMDTimeScale desiredTimeScale,\r
+            BMDTimeValue *elapsedTimeSinceSchedulerBegan) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkOutput_v7_1Vtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkOutput_v7_1 * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkOutput_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ BMDDisplayModeSupport *result);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            /* [out] */ IDeckLinkDisplayModeIterator_v7_1 **iterator);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            BMDDisplayMode displayMode);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( \r
+            IDeckLinkOutput_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            /* [in] */ IDeckLinkMemoryAllocator *theAllocator);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            long width,\r
+            long height,\r
+            long rowBytes,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDFrameFlags flags,\r
+            IDeckLinkVideoFrame_v7_1 **outFrame);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *CreateVideoFrameFromBuffer )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            void *buffer,\r
+            long width,\r
+            long height,\r
+            long rowBytes,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDFrameFlags flags,\r
+            IDeckLinkVideoFrame_v7_1 **outFrame);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            IDeckLinkVideoFrame_v7_1 *theFrame);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            IDeckLinkVideoFrame_v7_1 *theFrame,\r
+            BMDTimeValue displayTime,\r
+            BMDTimeValue displayDuration,\r
+            BMDTimeScale timeScale);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            /* [in] */ IDeckLinkVideoOutputCallback_v7_1 *theCallback);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            BMDAudioSampleRate sampleRate,\r
+            BMDAudioSampleType sampleType,\r
+            unsigned long channelCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( \r
+            IDeckLinkOutput_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            /* [out] */ unsigned long *sampleFramesWritten);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( \r
+            IDeckLinkOutput_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( \r
+            IDeckLinkOutput_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            BMDTimeValue streamTime,\r
+            BMDTimeScale timeScale,\r
+            /* [out] */ unsigned long *sampleFramesWritten);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            /* [out] */ unsigned long *bufferedSampleCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( \r
+            IDeckLinkOutput_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            /* [in] */ IDeckLinkAudioOutputCallback *theCallback);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            BMDTimeValue playbackStartTime,\r
+            BMDTimeScale timeScale,\r
+            double playbackSpeed);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            BMDTimeValue stopPlaybackAtTime,\r
+            BMDTimeValue *actualStopTime,\r
+            BMDTimeScale timeScale);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( \r
+            IDeckLinkOutput_v7_1 * This,\r
+            BMDTimeScale desiredTimeScale,\r
+            BMDTimeValue *elapsedTimeSinceSchedulerBegan);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkOutput_v7_1Vtbl;\r
+\r
+    interface IDeckLinkOutput_v7_1\r
+    {\r
+        CONST_VTBL struct IDeckLinkOutput_v7_1Vtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkOutput_v7_1_QueryInterface(This,riid,ppvObject)       \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkOutput_v7_1_AddRef(This)      \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkOutput_v7_1_Release(This)     \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkOutput_v7_1_DoesSupportVideoMode(This,displayMode,pixelFormat,result) \\r
+    ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) \r
+\r
+#define IDeckLinkOutput_v7_1_GetDisplayModeIterator(This,iterator)     \\r
+    ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) \r
+\r
+#define IDeckLinkOutput_v7_1_EnableVideoOutput(This,displayMode)       \\r
+    ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode) ) \r
+\r
+#define IDeckLinkOutput_v7_1_DisableVideoOutput(This)  \\r
+    ( (This)->lpVtbl -> DisableVideoOutput(This) ) \r
+\r
+#define IDeckLinkOutput_v7_1_SetVideoOutputFrameMemoryAllocator(This,theAllocator)     \\r
+    ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) \r
+\r
+#define IDeckLinkOutput_v7_1_CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame)   \\r
+    ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) \r
+\r
+#define IDeckLinkOutput_v7_1_CreateVideoFrameFromBuffer(This,buffer,width,height,rowBytes,pixelFormat,flags,outFrame)  \\r
+    ( (This)->lpVtbl -> CreateVideoFrameFromBuffer(This,buffer,width,height,rowBytes,pixelFormat,flags,outFrame) ) \r
+\r
+#define IDeckLinkOutput_v7_1_DisplayVideoFrameSync(This,theFrame)      \\r
+    ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) \r
+\r
+#define IDeckLinkOutput_v7_1_ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale)   \\r
+    ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) \r
+\r
+#define IDeckLinkOutput_v7_1_SetScheduledFrameCompletionCallback(This,theCallback)     \\r
+    ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) \r
+\r
+#define IDeckLinkOutput_v7_1_EnableAudioOutput(This,sampleRate,sampleType,channelCount)        \\r
+    ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount) ) \r
+\r
+#define IDeckLinkOutput_v7_1_DisableAudioOutput(This)  \\r
+    ( (This)->lpVtbl -> DisableAudioOutput(This) ) \r
+\r
+#define IDeckLinkOutput_v7_1_WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten)   \\r
+    ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) \r
+\r
+#define IDeckLinkOutput_v7_1_BeginAudioPreroll(This)   \\r
+    ( (This)->lpVtbl -> BeginAudioPreroll(This) ) \r
+\r
+#define IDeckLinkOutput_v7_1_EndAudioPreroll(This)     \\r
+    ( (This)->lpVtbl -> EndAudioPreroll(This) ) \r
+\r
+#define IDeckLinkOutput_v7_1_ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten)       \\r
+    ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) \r
+\r
+#define IDeckLinkOutput_v7_1_GetBufferedAudioSampleFrameCount(This,bufferedSampleCount)        \\r
+    ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleCount) ) \r
+\r
+#define IDeckLinkOutput_v7_1_FlushBufferedAudioSamples(This)   \\r
+    ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) \r
+\r
+#define IDeckLinkOutput_v7_1_SetAudioCallback(This,theCallback)        \\r
+    ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) \r
+\r
+#define IDeckLinkOutput_v7_1_StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed)    \\r
+    ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) \r
+\r
+#define IDeckLinkOutput_v7_1_StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale)   \\r
+    ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) \r
+\r
+#define IDeckLinkOutput_v7_1_GetHardwareReferenceClock(This,desiredTimeScale,elapsedTimeSinceSchedulerBegan)   \\r
+    ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,elapsedTimeSinceSchedulerBegan) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkOutput_v7_1_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkInput_v7_1_INTERFACE_DEFINED__\r
+#define __IDeckLinkInput_v7_1_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkInput_v7_1 */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkInput_v7_1;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("2B54EDEF-5B32-429F-BA11-BB990596EACD")\r
+    IDeckLinkInput_v7_1 : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( \r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ BMDDisplayModeSupport *result) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( \r
+            /* [out] */ IDeckLinkDisplayModeIterator_v7_1 **iterator) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( \r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDVideoInputFlags flags) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisableVideoInput( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( \r
+            BMDAudioSampleRate sampleRate,\r
+            BMDAudioSampleType sampleType,\r
+            unsigned long channelCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisableAudioInput( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE ReadAudioSamples( \r
+            void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            /* [out] */ unsigned long *sampleFramesRead,\r
+            /* [out] */ BMDTimeValue *audioPacketTime,\r
+            BMDTimeScale timeScale) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( \r
+            /* [out] */ unsigned long *bufferedSampleCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE StartStreams( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE StopStreams( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE PauseStreams( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetCallback( \r
+            /* [in] */ IDeckLinkInputCallback_v7_1 *theCallback) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkInput_v7_1Vtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkInput_v7_1 * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkInput_v7_1 * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkInput_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( \r
+            IDeckLinkInput_v7_1 * This,\r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ BMDDisplayModeSupport *result);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( \r
+            IDeckLinkInput_v7_1 * This,\r
+            /* [out] */ IDeckLinkDisplayModeIterator_v7_1 **iterator);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( \r
+            IDeckLinkInput_v7_1 * This,\r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDVideoInputFlags flags);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( \r
+            IDeckLinkInput_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( \r
+            IDeckLinkInput_v7_1 * This,\r
+            BMDAudioSampleRate sampleRate,\r
+            BMDAudioSampleType sampleType,\r
+            unsigned long channelCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( \r
+            IDeckLinkInput_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *ReadAudioSamples )( \r
+            IDeckLinkInput_v7_1 * This,\r
+            void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            /* [out] */ unsigned long *sampleFramesRead,\r
+            /* [out] */ BMDTimeValue *audioPacketTime,\r
+            BMDTimeScale timeScale);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( \r
+            IDeckLinkInput_v7_1 * This,\r
+            /* [out] */ unsigned long *bufferedSampleCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *StartStreams )( \r
+            IDeckLinkInput_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *StopStreams )( \r
+            IDeckLinkInput_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *PauseStreams )( \r
+            IDeckLinkInput_v7_1 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetCallback )( \r
+            IDeckLinkInput_v7_1 * This,\r
+            /* [in] */ IDeckLinkInputCallback_v7_1 *theCallback);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkInput_v7_1Vtbl;\r
+\r
+    interface IDeckLinkInput_v7_1\r
+    {\r
+        CONST_VTBL struct IDeckLinkInput_v7_1Vtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkInput_v7_1_QueryInterface(This,riid,ppvObject)        \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkInput_v7_1_AddRef(This)       \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkInput_v7_1_Release(This)      \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkInput_v7_1_DoesSupportVideoMode(This,displayMode,pixelFormat,result)  \\r
+    ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) \r
+\r
+#define IDeckLinkInput_v7_1_GetDisplayModeIterator(This,iterator)      \\r
+    ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) \r
+\r
+#define IDeckLinkInput_v7_1_EnableVideoInput(This,displayMode,pixelFormat,flags)       \\r
+    ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) \r
+\r
+#define IDeckLinkInput_v7_1_DisableVideoInput(This)    \\r
+    ( (This)->lpVtbl -> DisableVideoInput(This) ) \r
+\r
+#define IDeckLinkInput_v7_1_EnableAudioInput(This,sampleRate,sampleType,channelCount)  \\r
+    ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) \r
+\r
+#define IDeckLinkInput_v7_1_DisableAudioInput(This)    \\r
+    ( (This)->lpVtbl -> DisableAudioInput(This) ) \r
+\r
+#define IDeckLinkInput_v7_1_ReadAudioSamples(This,buffer,sampleFrameCount,sampleFramesRead,audioPacketTime,timeScale)  \\r
+    ( (This)->lpVtbl -> ReadAudioSamples(This,buffer,sampleFrameCount,sampleFramesRead,audioPacketTime,timeScale) ) \r
+\r
+#define IDeckLinkInput_v7_1_GetBufferedAudioSampleFrameCount(This,bufferedSampleCount) \\r
+    ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleCount) ) \r
+\r
+#define IDeckLinkInput_v7_1_StartStreams(This) \\r
+    ( (This)->lpVtbl -> StartStreams(This) ) \r
+\r
+#define IDeckLinkInput_v7_1_StopStreams(This)  \\r
+    ( (This)->lpVtbl -> StopStreams(This) ) \r
+\r
+#define IDeckLinkInput_v7_1_PauseStreams(This) \\r
+    ( (This)->lpVtbl -> PauseStreams(This) ) \r
+\r
+#define IDeckLinkInput_v7_1_SetCallback(This,theCallback)      \\r
+    ( (This)->lpVtbl -> SetCallback(This,theCallback) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkInput_v7_1_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkInputCallback_v7_3_INTERFACE_DEFINED__\r
+#define __IDeckLinkInputCallback_v7_3_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkInputCallback_v7_3 */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkInputCallback_v7_3;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("FD6F311D-4D00-444B-9ED4-1F25B5730AD0")\r
+    IDeckLinkInputCallback_v7_3 : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged( \r
+            /* [in] */ BMDVideoInputFormatChangedEvents notificationEvents,\r
+            /* [in] */ IDeckLinkDisplayMode *newDisplayMode,\r
+            /* [in] */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived( \r
+            /* [in] */ IDeckLinkVideoInputFrame_v7_3 *videoFrame,\r
+            /* [in] */ IDeckLinkAudioInputPacket *audioPacket) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkInputCallback_v7_3Vtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkInputCallback_v7_3 * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkInputCallback_v7_3 * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkInputCallback_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *VideoInputFormatChanged )( \r
+            IDeckLinkInputCallback_v7_3 * This,\r
+            /* [in] */ BMDVideoInputFormatChangedEvents notificationEvents,\r
+            /* [in] */ IDeckLinkDisplayMode *newDisplayMode,\r
+            /* [in] */ BMDDetectedVideoInputFormatFlags detectedSignalFlags);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *VideoInputFrameArrived )( \r
+            IDeckLinkInputCallback_v7_3 * This,\r
+            /* [in] */ IDeckLinkVideoInputFrame_v7_3 *videoFrame,\r
+            /* [in] */ IDeckLinkAudioInputPacket *audioPacket);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkInputCallback_v7_3Vtbl;\r
+\r
+    interface IDeckLinkInputCallback_v7_3\r
+    {\r
+        CONST_VTBL struct IDeckLinkInputCallback_v7_3Vtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkInputCallback_v7_3_QueryInterface(This,riid,ppvObject)        \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkInputCallback_v7_3_AddRef(This)       \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkInputCallback_v7_3_Release(This)      \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkInputCallback_v7_3_VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags)        \\r
+    ( (This)->lpVtbl -> VideoInputFormatChanged(This,notificationEvents,newDisplayMode,detectedSignalFlags) ) \r
+\r
+#define IDeckLinkInputCallback_v7_3_VideoInputFrameArrived(This,videoFrame,audioPacket)        \\r
+    ( (This)->lpVtbl -> VideoInputFrameArrived(This,videoFrame,audioPacket) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkInputCallback_v7_3_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkOutput_v7_3_INTERFACE_DEFINED__\r
+#define __IDeckLinkOutput_v7_3_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkOutput_v7_3 */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkOutput_v7_3;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("271C65E3-C323-4344-A30F-D908BCB20AA3")\r
+    IDeckLinkOutput_v7_3 : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( \r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ BMDDisplayModeSupport *result) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( \r
+            /* [out] */ IDeckLinkDisplayModeIterator **iterator) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( \r
+            /* [in] */ IDeckLinkScreenPreviewCallback *previewCallback) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EnableVideoOutput( \r
+            BMDDisplayMode displayMode,\r
+            BMDVideoOutputFlags flags) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisableVideoOutput( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetVideoOutputFrameMemoryAllocator( \r
+            /* [in] */ IDeckLinkMemoryAllocator *theAllocator) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE CreateVideoFrame( \r
+            long width,\r
+            long height,\r
+            long rowBytes,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDFrameFlags flags,\r
+            /* [out] */ IDeckLinkMutableVideoFrame **outFrame) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE CreateAncillaryData( \r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ IDeckLinkVideoFrameAncillary **outBuffer) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisplayVideoFrameSync( \r
+            /* [in] */ IDeckLinkVideoFrame *theFrame) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE ScheduleVideoFrame( \r
+            /* [in] */ IDeckLinkVideoFrame *theFrame,\r
+            BMDTimeValue displayTime,\r
+            BMDTimeValue displayDuration,\r
+            BMDTimeScale timeScale) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetScheduledFrameCompletionCallback( \r
+            /* [in] */ IDeckLinkVideoOutputCallback *theCallback) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetBufferedVideoFrameCount( \r
+            /* [out] */ unsigned long *bufferedFrameCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EnableAudioOutput( \r
+            BMDAudioSampleRate sampleRate,\r
+            BMDAudioSampleType sampleType,\r
+            unsigned long channelCount,\r
+            BMDAudioOutputStreamType streamType) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisableAudioOutput( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE WriteAudioSamplesSync( \r
+            /* [in] */ void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            /* [out] */ unsigned long *sampleFramesWritten) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE BeginAudioPreroll( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EndAudioPreroll( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE ScheduleAudioSamples( \r
+            /* [in] */ void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            BMDTimeValue streamTime,\r
+            BMDTimeScale timeScale,\r
+            /* [out] */ unsigned long *sampleFramesWritten) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetBufferedAudioSampleFrameCount( \r
+            /* [out] */ unsigned long *bufferedSampleFrameCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE FlushBufferedAudioSamples( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetAudioCallback( \r
+            /* [in] */ IDeckLinkAudioOutputCallback *theCallback) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE StartScheduledPlayback( \r
+            BMDTimeValue playbackStartTime,\r
+            BMDTimeScale timeScale,\r
+            double playbackSpeed) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE StopScheduledPlayback( \r
+            BMDTimeValue stopPlaybackAtTime,\r
+            /* [out] */ BMDTimeValue *actualStopTime,\r
+            BMDTimeScale timeScale) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE IsScheduledPlaybackRunning( \r
+            /* [out] */ BOOL *active) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetHardwareReferenceClock( \r
+            BMDTimeScale desiredTimeScale,\r
+            /* [out] */ BMDTimeValue *elapsedTimeSinceSchedulerBegan) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkOutput_v7_3Vtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkOutput_v7_3 * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkOutput_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ BMDDisplayModeSupport *result);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            /* [out] */ IDeckLinkDisplayModeIterator **iterator);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            /* [in] */ IDeckLinkScreenPreviewCallback *previewCallback);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EnableVideoOutput )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            BMDDisplayMode displayMode,\r
+            BMDVideoOutputFlags flags);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisableVideoOutput )( \r
+            IDeckLinkOutput_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetVideoOutputFrameMemoryAllocator )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            /* [in] */ IDeckLinkMemoryAllocator *theAllocator);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *CreateVideoFrame )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            long width,\r
+            long height,\r
+            long rowBytes,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDFrameFlags flags,\r
+            /* [out] */ IDeckLinkMutableVideoFrame **outFrame);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *CreateAncillaryData )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ IDeckLinkVideoFrameAncillary **outBuffer);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisplayVideoFrameSync )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            /* [in] */ IDeckLinkVideoFrame *theFrame);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *ScheduleVideoFrame )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            /* [in] */ IDeckLinkVideoFrame *theFrame,\r
+            BMDTimeValue displayTime,\r
+            BMDTimeValue displayDuration,\r
+            BMDTimeScale timeScale);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetScheduledFrameCompletionCallback )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            /* [in] */ IDeckLinkVideoOutputCallback *theCallback);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBufferedVideoFrameCount )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            /* [out] */ unsigned long *bufferedFrameCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EnableAudioOutput )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            BMDAudioSampleRate sampleRate,\r
+            BMDAudioSampleType sampleType,\r
+            unsigned long channelCount,\r
+            BMDAudioOutputStreamType streamType);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisableAudioOutput )( \r
+            IDeckLinkOutput_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *WriteAudioSamplesSync )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            /* [in] */ void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            /* [out] */ unsigned long *sampleFramesWritten);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *BeginAudioPreroll )( \r
+            IDeckLinkOutput_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EndAudioPreroll )( \r
+            IDeckLinkOutput_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *ScheduleAudioSamples )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            /* [in] */ void *buffer,\r
+            unsigned long sampleFrameCount,\r
+            BMDTimeValue streamTime,\r
+            BMDTimeScale timeScale,\r
+            /* [out] */ unsigned long *sampleFramesWritten);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBufferedAudioSampleFrameCount )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            /* [out] */ unsigned long *bufferedSampleFrameCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *FlushBufferedAudioSamples )( \r
+            IDeckLinkOutput_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetAudioCallback )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            /* [in] */ IDeckLinkAudioOutputCallback *theCallback);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *StartScheduledPlayback )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            BMDTimeValue playbackStartTime,\r
+            BMDTimeScale timeScale,\r
+            double playbackSpeed);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *StopScheduledPlayback )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            BMDTimeValue stopPlaybackAtTime,\r
+            /* [out] */ BMDTimeValue *actualStopTime,\r
+            BMDTimeScale timeScale);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *IsScheduledPlaybackRunning )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            /* [out] */ BOOL *active);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetHardwareReferenceClock )( \r
+            IDeckLinkOutput_v7_3 * This,\r
+            BMDTimeScale desiredTimeScale,\r
+            /* [out] */ BMDTimeValue *elapsedTimeSinceSchedulerBegan);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkOutput_v7_3Vtbl;\r
+\r
+    interface IDeckLinkOutput_v7_3\r
+    {\r
+        CONST_VTBL struct IDeckLinkOutput_v7_3Vtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkOutput_v7_3_QueryInterface(This,riid,ppvObject)       \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkOutput_v7_3_AddRef(This)      \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkOutput_v7_3_Release(This)     \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkOutput_v7_3_DoesSupportVideoMode(This,displayMode,pixelFormat,result) \\r
+    ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) \r
+\r
+#define IDeckLinkOutput_v7_3_GetDisplayModeIterator(This,iterator)     \\r
+    ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) \r
+\r
+#define IDeckLinkOutput_v7_3_SetScreenPreviewCallback(This,previewCallback)    \\r
+    ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) \r
+\r
+#define IDeckLinkOutput_v7_3_EnableVideoOutput(This,displayMode,flags) \\r
+    ( (This)->lpVtbl -> EnableVideoOutput(This,displayMode,flags) ) \r
+\r
+#define IDeckLinkOutput_v7_3_DisableVideoOutput(This)  \\r
+    ( (This)->lpVtbl -> DisableVideoOutput(This) ) \r
+\r
+#define IDeckLinkOutput_v7_3_SetVideoOutputFrameMemoryAllocator(This,theAllocator)     \\r
+    ( (This)->lpVtbl -> SetVideoOutputFrameMemoryAllocator(This,theAllocator) ) \r
+\r
+#define IDeckLinkOutput_v7_3_CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame)   \\r
+    ( (This)->lpVtbl -> CreateVideoFrame(This,width,height,rowBytes,pixelFormat,flags,outFrame) ) \r
+\r
+#define IDeckLinkOutput_v7_3_CreateAncillaryData(This,displayMode,pixelFormat,outBuffer)       \\r
+    ( (This)->lpVtbl -> CreateAncillaryData(This,displayMode,pixelFormat,outBuffer) ) \r
+\r
+#define IDeckLinkOutput_v7_3_DisplayVideoFrameSync(This,theFrame)      \\r
+    ( (This)->lpVtbl -> DisplayVideoFrameSync(This,theFrame) ) \r
+\r
+#define IDeckLinkOutput_v7_3_ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale)   \\r
+    ( (This)->lpVtbl -> ScheduleVideoFrame(This,theFrame,displayTime,displayDuration,timeScale) ) \r
+\r
+#define IDeckLinkOutput_v7_3_SetScheduledFrameCompletionCallback(This,theCallback)     \\r
+    ( (This)->lpVtbl -> SetScheduledFrameCompletionCallback(This,theCallback) ) \r
+\r
+#define IDeckLinkOutput_v7_3_GetBufferedVideoFrameCount(This,bufferedFrameCount)       \\r
+    ( (This)->lpVtbl -> GetBufferedVideoFrameCount(This,bufferedFrameCount) ) \r
+\r
+#define IDeckLinkOutput_v7_3_EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType)     \\r
+    ( (This)->lpVtbl -> EnableAudioOutput(This,sampleRate,sampleType,channelCount,streamType) ) \r
+\r
+#define IDeckLinkOutput_v7_3_DisableAudioOutput(This)  \\r
+    ( (This)->lpVtbl -> DisableAudioOutput(This) ) \r
+\r
+#define IDeckLinkOutput_v7_3_WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten)   \\r
+    ( (This)->lpVtbl -> WriteAudioSamplesSync(This,buffer,sampleFrameCount,sampleFramesWritten) ) \r
+\r
+#define IDeckLinkOutput_v7_3_BeginAudioPreroll(This)   \\r
+    ( (This)->lpVtbl -> BeginAudioPreroll(This) ) \r
+\r
+#define IDeckLinkOutput_v7_3_EndAudioPreroll(This)     \\r
+    ( (This)->lpVtbl -> EndAudioPreroll(This) ) \r
+\r
+#define IDeckLinkOutput_v7_3_ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten)       \\r
+    ( (This)->lpVtbl -> ScheduleAudioSamples(This,buffer,sampleFrameCount,streamTime,timeScale,sampleFramesWritten) ) \r
+\r
+#define IDeckLinkOutput_v7_3_GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount)   \\r
+    ( (This)->lpVtbl -> GetBufferedAudioSampleFrameCount(This,bufferedSampleFrameCount) ) \r
+\r
+#define IDeckLinkOutput_v7_3_FlushBufferedAudioSamples(This)   \\r
+    ( (This)->lpVtbl -> FlushBufferedAudioSamples(This) ) \r
+\r
+#define IDeckLinkOutput_v7_3_SetAudioCallback(This,theCallback)        \\r
+    ( (This)->lpVtbl -> SetAudioCallback(This,theCallback) ) \r
+\r
+#define IDeckLinkOutput_v7_3_StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed)    \\r
+    ( (This)->lpVtbl -> StartScheduledPlayback(This,playbackStartTime,timeScale,playbackSpeed) ) \r
+\r
+#define IDeckLinkOutput_v7_3_StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale)   \\r
+    ( (This)->lpVtbl -> StopScheduledPlayback(This,stopPlaybackAtTime,actualStopTime,timeScale) ) \r
+\r
+#define IDeckLinkOutput_v7_3_IsScheduledPlaybackRunning(This,active)   \\r
+    ( (This)->lpVtbl -> IsScheduledPlaybackRunning(This,active) ) \r
+\r
+#define IDeckLinkOutput_v7_3_GetHardwareReferenceClock(This,desiredTimeScale,elapsedTimeSinceSchedulerBegan)   \\r
+    ( (This)->lpVtbl -> GetHardwareReferenceClock(This,desiredTimeScale,elapsedTimeSinceSchedulerBegan) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkOutput_v7_3_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkInput_v7_3_INTERFACE_DEFINED__\r
+#define __IDeckLinkInput_v7_3_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkInput_v7_3 */\r
+/* [helpstring][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkInput_v7_3;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("4973F012-9925-458C-871C-18774CDBBECB")\r
+    IDeckLinkInput_v7_3 : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE DoesSupportVideoMode( \r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ BMDDisplayModeSupport *result) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetDisplayModeIterator( \r
+            /* [out] */ IDeckLinkDisplayModeIterator **iterator) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetScreenPreviewCallback( \r
+            /* [in] */ IDeckLinkScreenPreviewCallback *previewCallback) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EnableVideoInput( \r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDVideoInputFlags flags) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisableVideoInput( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetAvailableVideoFrameCount( \r
+            /* [out] */ unsigned long *availableFrameCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE EnableAudioInput( \r
+            BMDAudioSampleRate sampleRate,\r
+            BMDAudioSampleType sampleType,\r
+            unsigned long channelCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE DisableAudioInput( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE GetAvailableAudioSampleFrameCount( \r
+            /* [out] */ unsigned long *availableSampleFrameCount) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE StartStreams( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE StopStreams( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE PauseStreams( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE FlushStreams( void) = 0;\r
+        \r
+        virtual HRESULT STDMETHODCALLTYPE SetCallback( \r
+            /* [in] */ IDeckLinkInputCallback_v7_3 *theCallback) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkInput_v7_3Vtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkInput_v7_3 * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkInput_v7_3 * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkInput_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DoesSupportVideoMode )( \r
+            IDeckLinkInput_v7_3 * This,\r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            /* [out] */ BMDDisplayModeSupport *result);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetDisplayModeIterator )( \r
+            IDeckLinkInput_v7_3 * This,\r
+            /* [out] */ IDeckLinkDisplayModeIterator **iterator);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetScreenPreviewCallback )( \r
+            IDeckLinkInput_v7_3 * This,\r
+            /* [in] */ IDeckLinkScreenPreviewCallback *previewCallback);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EnableVideoInput )( \r
+            IDeckLinkInput_v7_3 * This,\r
+            BMDDisplayMode displayMode,\r
+            BMDPixelFormat pixelFormat,\r
+            BMDVideoInputFlags flags);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisableVideoInput )( \r
+            IDeckLinkInput_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetAvailableVideoFrameCount )( \r
+            IDeckLinkInput_v7_3 * This,\r
+            /* [out] */ unsigned long *availableFrameCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *EnableAudioInput )( \r
+            IDeckLinkInput_v7_3 * This,\r
+            BMDAudioSampleRate sampleRate,\r
+            BMDAudioSampleType sampleType,\r
+            unsigned long channelCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *DisableAudioInput )( \r
+            IDeckLinkInput_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetAvailableAudioSampleFrameCount )( \r
+            IDeckLinkInput_v7_3 * This,\r
+            /* [out] */ unsigned long *availableSampleFrameCount);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *StartStreams )( \r
+            IDeckLinkInput_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *StopStreams )( \r
+            IDeckLinkInput_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *PauseStreams )( \r
+            IDeckLinkInput_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *FlushStreams )( \r
+            IDeckLinkInput_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *SetCallback )( \r
+            IDeckLinkInput_v7_3 * This,\r
+            /* [in] */ IDeckLinkInputCallback_v7_3 *theCallback);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkInput_v7_3Vtbl;\r
+\r
+    interface IDeckLinkInput_v7_3\r
+    {\r
+        CONST_VTBL struct IDeckLinkInput_v7_3Vtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkInput_v7_3_QueryInterface(This,riid,ppvObject)        \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkInput_v7_3_AddRef(This)       \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkInput_v7_3_Release(This)      \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkInput_v7_3_DoesSupportVideoMode(This,displayMode,pixelFormat,result)  \\r
+    ( (This)->lpVtbl -> DoesSupportVideoMode(This,displayMode,pixelFormat,result) ) \r
+\r
+#define IDeckLinkInput_v7_3_GetDisplayModeIterator(This,iterator)      \\r
+    ( (This)->lpVtbl -> GetDisplayModeIterator(This,iterator) ) \r
+\r
+#define IDeckLinkInput_v7_3_SetScreenPreviewCallback(This,previewCallback)     \\r
+    ( (This)->lpVtbl -> SetScreenPreviewCallback(This,previewCallback) ) \r
+\r
+#define IDeckLinkInput_v7_3_EnableVideoInput(This,displayMode,pixelFormat,flags)       \\r
+    ( (This)->lpVtbl -> EnableVideoInput(This,displayMode,pixelFormat,flags) ) \r
+\r
+#define IDeckLinkInput_v7_3_DisableVideoInput(This)    \\r
+    ( (This)->lpVtbl -> DisableVideoInput(This) ) \r
+\r
+#define IDeckLinkInput_v7_3_GetAvailableVideoFrameCount(This,availableFrameCount)      \\r
+    ( (This)->lpVtbl -> GetAvailableVideoFrameCount(This,availableFrameCount) ) \r
+\r
+#define IDeckLinkInput_v7_3_EnableAudioInput(This,sampleRate,sampleType,channelCount)  \\r
+    ( (This)->lpVtbl -> EnableAudioInput(This,sampleRate,sampleType,channelCount) ) \r
+\r
+#define IDeckLinkInput_v7_3_DisableAudioInput(This)    \\r
+    ( (This)->lpVtbl -> DisableAudioInput(This) ) \r
+\r
+#define IDeckLinkInput_v7_3_GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount)  \\r
+    ( (This)->lpVtbl -> GetAvailableAudioSampleFrameCount(This,availableSampleFrameCount) ) \r
+\r
+#define IDeckLinkInput_v7_3_StartStreams(This) \\r
+    ( (This)->lpVtbl -> StartStreams(This) ) \r
+\r
+#define IDeckLinkInput_v7_3_StopStreams(This)  \\r
+    ( (This)->lpVtbl -> StopStreams(This) ) \r
+\r
+#define IDeckLinkInput_v7_3_PauseStreams(This) \\r
+    ( (This)->lpVtbl -> PauseStreams(This) ) \r
+\r
+#define IDeckLinkInput_v7_3_FlushStreams(This) \\r
+    ( (This)->lpVtbl -> FlushStreams(This) ) \r
+\r
+#define IDeckLinkInput_v7_3_SetCallback(This,theCallback)      \\r
+    ( (This)->lpVtbl -> SetCallback(This,theCallback) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkInput_v7_3_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDeckLinkVideoInputFrame_v7_3_INTERFACE_DEFINED__\r
+#define __IDeckLinkVideoInputFrame_v7_3_INTERFACE_DEFINED__\r
+\r
+/* interface IDeckLinkVideoInputFrame_v7_3 */\r
+/* [helpstring][local][uuid][object] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDeckLinkVideoInputFrame_v7_3;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("CF317790-2894-11DE-8C30-0800200C9A66")\r
+    IDeckLinkVideoInputFrame_v7_3 : public IDeckLinkVideoFrame\r
+    {\r
+    public:\r
+        virtual HRESULT STDMETHODCALLTYPE GetStreamTime( \r
+            /* [out] */ BMDTimeValue *frameTime,\r
+            /* [out] */ BMDTimeValue *frameDuration,\r
+            BMDTimeScale timeScale) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDeckLinkVideoInputFrame_v7_3Vtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDeckLinkVideoInputFrame_v7_3 * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ \r
+            __RPC__deref_out  void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDeckLinkVideoInputFrame_v7_3 * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDeckLinkVideoInputFrame_v7_3 * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetWidth )( \r
+            IDeckLinkVideoInputFrame_v7_3 * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetHeight )( \r
+            IDeckLinkVideoInputFrame_v7_3 * This);\r
+        \r
+        long ( STDMETHODCALLTYPE *GetRowBytes )( \r
+            IDeckLinkVideoInputFrame_v7_3 * This);\r
+        \r
+        BMDPixelFormat ( STDMETHODCALLTYPE *GetPixelFormat )( \r
+            IDeckLinkVideoInputFrame_v7_3 * This);\r
+        \r
+        BMDFrameFlags ( STDMETHODCALLTYPE *GetFlags )( \r
+            IDeckLinkVideoInputFrame_v7_3 * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetBytes )( \r
+            IDeckLinkVideoInputFrame_v7_3 * This,\r
+            /* [out] */ void **buffer);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetTimecode )( \r
+            IDeckLinkVideoInputFrame_v7_3 * This,\r
+            BMDTimecodeFormat format,\r
+            /* [out] */ IDeckLinkTimecode **timecode);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetAncillaryData )( \r
+            IDeckLinkVideoInputFrame_v7_3 * This,\r
+            /* [out] */ IDeckLinkVideoFrameAncillary **ancillary);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetStreamTime )( \r
+            IDeckLinkVideoInputFrame_v7_3 * This,\r
+            /* [out] */ BMDTimeValue *frameTime,\r
+            /* [out] */ BMDTimeValue *frameDuration,\r
+            BMDTimeScale timeScale);\r
+        \r
+        END_INTERFACE\r
+    } IDeckLinkVideoInputFrame_v7_3Vtbl;\r
+\r
+    interface IDeckLinkVideoInputFrame_v7_3\r
+    {\r
+        CONST_VTBL struct IDeckLinkVideoInputFrame_v7_3Vtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDeckLinkVideoInputFrame_v7_3_QueryInterface(This,riid,ppvObject)      \\r
+    ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_3_AddRef(This)     \\r
+    ( (This)->lpVtbl -> AddRef(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_3_Release(This)    \\r
+    ( (This)->lpVtbl -> Release(This) ) \r
+\r
+\r
+#define IDeckLinkVideoInputFrame_v7_3_GetWidth(This)   \\r
+    ( (This)->lpVtbl -> GetWidth(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_3_GetHeight(This)  \\r
+    ( (This)->lpVtbl -> GetHeight(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_3_GetRowBytes(This)        \\r
+    ( (This)->lpVtbl -> GetRowBytes(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_3_GetPixelFormat(This)     \\r
+    ( (This)->lpVtbl -> GetPixelFormat(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_3_GetFlags(This)   \\r
+    ( (This)->lpVtbl -> GetFlags(This) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_3_GetBytes(This,buffer)    \\r
+    ( (This)->lpVtbl -> GetBytes(This,buffer) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_3_GetTimecode(This,format,timecode)        \\r
+    ( (This)->lpVtbl -> GetTimecode(This,format,timecode) ) \r
+\r
+#define IDeckLinkVideoInputFrame_v7_3_GetAncillaryData(This,ancillary) \\r
+    ( (This)->lpVtbl -> GetAncillaryData(This,ancillary) ) \r
+\r
+\r
+#define IDeckLinkVideoInputFrame_v7_3_GetStreamTime(This,frameTime,frameDuration,timeScale)    \\r
+    ( (This)->lpVtbl -> GetStreamTime(This,frameTime,frameDuration,timeScale) ) \r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IDeckLinkVideoInputFrame_v7_3_INTERFACE_DEFINED__ */\r
+\r
+#endif /* __DeckLinkAPI_LIBRARY_DEFINED__ */\r
+\r
+/* Additional Prototypes for ALL interfaces */\r
+\r
+/* end of Additional Prototypes */\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif\r
+\r
+\r
diff --git a/core/consumer/decklink/DeckLinkAPI_i.c b/core/consumer/decklink/DeckLinkAPI_i.c
new file mode 100644 (file)
index 0000000..b2e87a9
--- /dev/null
@@ -0,0 +1,190 @@
+\r
+\r
+/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */\r
+\r
+/* link this file in with the server and any clients */\r
+\r
+\r
+ /* File created by MIDL compiler version 7.00.0500 */\r
+/* at Wed Jan 13 09:58:01 2010\r
+ */\r
+/* Compiler settings for .\consumers\declink\DeckLinkAPI.idl:\r
+    Oicf, W1, Zp8, env=Win32 (32b run)\r
+    protocol : dce , ms_ext, c_ext, robust\r
+    error checks: allocation ref bounds_check enum stub_data \r
+    VC __declspec() decoration level: \r
+         __declspec(uuid()), __declspec(selectany), __declspec(novtable)\r
+         DECLSPEC_UUID(), MIDL_INTERFACE()\r
+*/\r
+//@@MIDL_FILE_HEADING(  )\r
+\r
+#pragma warning( disable: 4049 )  /* more than 64k source lines */\r
+\r
+\r
+#ifdef __cplusplus\r
+extern "C"{\r
+#endif \r
+\r
+\r
+#include <rpc.h>\r
+#include <rpcndr.h>\r
+\r
+#ifdef _MIDL_USE_GUIDDEF_\r
+\r
+#ifndef INITGUID\r
+#define INITGUID\r
+#include <guiddef.h>\r
+#undef INITGUID\r
+#else\r
+#include <guiddef.h>\r
+#endif\r
+\r
+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \\r
+        DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)\r
+\r
+#else // !_MIDL_USE_GUIDDEF_\r
+\r
+#ifndef __IID_DEFINED__\r
+#define __IID_DEFINED__\r
+\r
+typedef struct _IID\r
+{\r
+    unsigned long x;\r
+    unsigned short s1;\r
+    unsigned short s2;\r
+    unsigned char  c[8];\r
+} IID;\r
+\r
+#endif // __IID_DEFINED__\r
+\r
+#ifndef CLSID_DEFINED\r
+#define CLSID_DEFINED\r
+typedef IID CLSID;\r
+#endif // CLSID_DEFINED\r
+\r
+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \\r
+        const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}\r
+\r
+#endif !_MIDL_USE_GUIDDEF_\r
+\r
+MIDL_DEFINE_GUID(IID, LIBID_DeckLinkAPI,0xD864517A,0xEDD5,0x466D,0x86,0x7D,0xC8,0x19,0xF1,0xC0,0x52,0xBB);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoOutputCallback,0xE763A626,0x4A3C,0x49D1,0xBF,0x13,0xE7,0xAD,0x36,0x92,0xAE,0x52);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkInputCallback,0x31D28EE7,0x88B6,0x4CB1,0x89,0x7A,0xCD,0xBF,0x79,0xA2,0x64,0x14);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkMemoryAllocator,0xB36EB6E7,0x9D29,0x4AA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkAudioOutputCallback,0x403C681B,0x7F46,0x4A12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkIterator,0x74E936FC,0xCC28,0x4A67,0x81,0xA0,0x1E,0x94,0xE5,0x2D,0x4E,0x69);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkAPIInformation,0x7BEA3C68,0x730D,0x4322,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayModeIterator,0x455D741F,0x1779,0x4800,0x86,0xF5,0x0B,0x5D,0x13,0xD7,0x97,0x51);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayMode,0x87451E84,0x2B7E,0x439E,0xA6,0x29,0x43,0x93,0xEA,0x4A,0x85,0x50);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLink,0x62BFF75D,0x6569,0x4E55,0x8D,0x4D,0x66,0xAA,0x03,0x82,0x9A,0xBC);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput,0x29228142,0xEB8C,0x4141,0xA6,0x21,0xF7,0x40,0x26,0x45,0x09,0x55);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput,0x300C135A,0x9F43,0x48E2,0x99,0x06,0x6D,0x79,0x11,0xD9,0x3C,0xF1);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkTimecode,0xEFB9BCA6,0xA521,0x44F7,0xBD,0x69,0x23,0x32,0xF2,0x4D,0x9E,0xE6);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrame,0xA8D8238E,0x6B18,0x4196,0x99,0xE1,0x5A,0xF7,0x17,0xB8,0x3D,0x32);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkMutableVideoFrame,0x46FCEE00,0xB4E6,0x43D0,0x91,0xC0,0x02,0x3A,0x7F,0xCE,0xB3,0x4F);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoInputFrame,0x9A74FA41,0xAE9F,0x47AC,0x8C,0xF4,0x01,0xF4,0x2D,0xD5,0x99,0x65);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrameAncillary,0x732E723C,0xD1A4,0x4E29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkAudioInputPacket,0xE43D5870,0x2894,0x11DE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkScreenPreviewCallback,0x373F499D,0x4B4D,0x4518,0xAD,0x22,0x63,0x54,0xE5,0xA5,0x82,0x5E);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkGLScreenPreviewHelper,0xBA575CD9,0xA15E,0x497B,0xB2,0xC2,0xF9,0xAF,0xE7,0xBE,0x4E,0xBA);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkConfiguration,0xB8EAD569,0xB764,0x47F0,0xA7,0x3F,0xAE,0x40,0xDF,0x6C,0xBF,0x10);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkAttributes,0xABC11843,0xD966,0x44CB,0x96,0xE2,0xA1,0xCB,0x5D,0x31,0x35,0xC4);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkKeyer,0x89AFCAF5,0x65F8,0x421E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3);\r
+\r
+\r
+MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkIterator,0xD9EDA3B3,0x2887,0x41FA,0xB7,0x24,0x01,0x7C,0xF1,0xEB,0x1D,0x37);\r
+\r
+\r
+MIDL_DEFINE_GUID(CLSID, CLSID_CDeckLinkGLScreenPreviewHelper,0xD398CEE7,0x4434,0x4CA3,0x9B,0xA6,0x5A,0xE3,0x45,0x56,0xB9,0x05);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayModeIterator_v7_1,0xB28131B6,0x59AC,0x4857,0xB5,0xAC,0xCD,0x75,0xD5,0x88,0x3E,0x2F);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkDisplayMode_v7_1,0xAF0CD6D5,0x8376,0x435E,0x84,0x33,0x54,0xF9,0xDD,0x53,0x0A,0xC3);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoFrame_v7_1,0x333F3A10,0x8C2D,0x43CF,0xB7,0x9D,0x46,0x56,0x0F,0xEE,0xA1,0xCE);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoInputFrame_v7_1,0xC8B41D95,0x8848,0x40EE,0x9B,0x37,0x6E,0x34,0x17,0xFB,0x11,0x4B);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkAudioInputPacket_v7_1,0xC86DE4F6,0xA29F,0x42E3,0xAB,0x3A,0x13,0x63,0xE2,0x9F,0x07,0x88);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoOutputCallback_v7_1,0xEBD01AFA,0xE4B0,0x49C6,0xA0,0x1D,0xED,0xB9,0xD1,0xB5,0x5F,0xD9);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkInputCallback_v7_1,0x7F94F328,0x5ED4,0x4E9F,0x97,0x29,0x76,0xA8,0x6B,0xDC,0x99,0xCC);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput_v7_1,0xAE5B3E9B,0x4E1E,0x4535,0xB6,0xE8,0x48,0x0F,0xF5,0x2F,0x6C,0xE5);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v7_1,0x2B54EDEF,0x5B32,0x429F,0xBA,0x11,0xBB,0x99,0x05,0x96,0xEA,0xCD);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkInputCallback_v7_3,0xFD6F311D,0x4D00,0x444B,0x9E,0xD4,0x1F,0x25,0xB5,0x73,0x0A,0xD0);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkOutput_v7_3,0x271C65E3,0xC323,0x4344,0xA3,0x0F,0xD9,0x08,0xBC,0xB2,0x0A,0xA3);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkInput_v7_3,0x4973F012,0x9925,0x458C,0x87,0x1C,0x18,0x77,0x4C,0xDB,0xBE,0xCB);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDeckLinkVideoInputFrame_v7_3,0xCF317790,0x2894,0x11DE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66);\r
+\r
+#undef MIDL_DEFINE_GUID\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+\r
+\r
diff --git a/core/consumer/decklink/DeckLinkAPI_v7_1.idl b/core/consumer/decklink/DeckLinkAPI_v7_1.idl
new file mode 100644 (file)
index 0000000..20d4e5f
--- /dev/null
@@ -0,0 +1,160 @@
+/* -LICENSE-START-\r
+** Copyright (c) 2009 Blackmagic Design\r
+**\r
+** Permission is hereby granted, free of charge, to any person or organization\r
+** obtaining a copy of the software and accompanying documentation covered by\r
+** this license (the "Software") to use, reproduce, display, distribute,\r
+** execute, and transmit the Software, and to prepare derivative works of the\r
+** Software, and to permit third-parties to whom the Software is furnished to\r
+** do so, all subject to the following:\r
+** \r
+** The copyright notices in the Software and this entire statement, including\r
+** the above license grant, this restriction and the following disclaimer,\r
+** must be included in all copies of the Software, in whole or in part, and\r
+** all derivative works of the Software, unless such copies or derivative\r
+** works are solely in the form of machine-executable object code generated by\r
+** a source language processor.\r
+** \r
+** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
+** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\r
+** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\r
+** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\r
+** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
+** DEALINGS IN THE SOFTWARE.\r
+** -LICENSE-END-\r
+*/\r
+/* DeckLinkAPI_v7_1.idl */\r
+\r
+       interface IDeckLinkDisplayModeIterator_v7_1;\r
+       interface IDeckLinkDisplayMode_v7_1;\r
+       interface IDeckLinkVideoFrame_v7_1;\r
+       interface IDeckLinkVideoInputFrame_v7_1;\r
+       interface IDeckLinkAudioInputPacket_v7_1;\r
+       \r
+       [object, uuid(B28131B6-59AC-4857-B5AC-CD75D5883E2F),\r
+        helpstring("IDeckLinkDisplayModeIterator_v7_1 enumerates over supported input/output display modes.")]\r
+       interface IDeckLinkDisplayModeIterator_v7_1 : IUnknown\r
+       {\r
+               HRESULT         Next ([out] IDeckLinkDisplayMode_v7_1** deckLinkDisplayMode);\r
+       };\r
+\r
+\r
+       [object, uuid(AF0CD6D5-8376-435E-8433-54F9DD530AC3),\r
+        helpstring("IDeckLinkDisplayMode_v7_1 represents a display mode")]\r
+       interface IDeckLinkDisplayMode_v7_1 : IUnknown\r
+       {\r
+               HRESULT                         GetName ([out] BSTR* name);\r
+               BMDDisplayMode          GetDisplayMode ();\r
+               long                            GetWidth ();\r
+               long                            GetHeight ();\r
+               HRESULT                         GetFrameRate ([out] BMDTimeValue *frameDuration, [out] BMDTimeScale *timeScale);\r
+       };\r
+       \r
+       [object, uuid(EBD01AFA-E4B0-49C6-A01D-EDB9D1B55FD9),\r
+     helpstring("IDeckLinkVideoOutputCallback. Frame completion callback.")]\r
+    interface IDeckLinkVideoOutputCallback_v7_1 : IUnknown\r
+    {\r
+        HRESULT                ScheduledFrameCompleted ([in] IDeckLinkVideoFrame_v7_1* completedFrame, [in] BMDOutputFrameCompletionResult result);\r
+    };\r
+       \r
+    [object, uuid(7F94F328-5ED4-4E9F-9729-76A86BDC99CC),\r
+     helpstring("IDeckLinkInputCallback_v7_1. Frame arrival callback.")]\r
+    interface IDeckLinkInputCallback_v7_1 : IUnknown\r
+    {\r
+        HRESULT                VideoInputFrameArrived ([in] IDeckLinkVideoInputFrame_v7_1* videoFrame, [in] IDeckLinkAudioInputPacket_v7_1* audioPacket);\r
+    };\r
+       \r
+\r
+    [object, uuid(AE5B3E9B-4E1E-4535-B6E8-480FF52F6CE5), local,\r
+     helpstring("IDeckLinkOutput_v7_1.  Created by QueryInterface from IDeckLink.")]\r
+    interface IDeckLinkOutput_v7_1 : IUnknown\r
+    {\r
+               HRESULT         DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);\r
+               HRESULT         GetDisplayModeIterator ([out] IDeckLinkDisplayModeIterator_v7_1 **iterator);\r
+               \r
+               // Video output\r
+        HRESULT                EnableVideoOutput (BMDDisplayMode displayMode);\r
+        HRESULT                DisableVideoOutput ();\r
+               \r
+               HRESULT         SetVideoOutputFrameMemoryAllocator ([in] IDeckLinkMemoryAllocator* theAllocator);\r
+        HRESULT                CreateVideoFrame (long width, long height, long rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1** outFrame);\r
+        HRESULT                CreateVideoFrameFromBuffer (void* buffer, long width, long height, long rowBytes, BMDPixelFormat pixelFormat, BMDFrameFlags flags, IDeckLinkVideoFrame_v7_1** outFrame);\r
+\r
+        HRESULT                DisplayVideoFrameSync (IDeckLinkVideoFrame_v7_1* theFrame);\r
+        HRESULT                ScheduleVideoFrame (IDeckLinkVideoFrame_v7_1* theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale);\r
+        HRESULT                SetScheduledFrameCompletionCallback ([in] IDeckLinkVideoOutputCallback_v7_1* theCallback);\r
+               \r
+               // Audio output\r
+               HRESULT         EnableAudioOutput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned long channelCount);\r
+               HRESULT         DisableAudioOutput ();\r
+               \r
+               HRESULT         WriteAudioSamplesSync (void* buffer, unsigned long sampleFrameCount, [out] unsigned long *sampleFramesWritten);\r
+               \r
+               HRESULT         BeginAudioPreroll ();\r
+               HRESULT         EndAudioPreroll ();\r
+               HRESULT         ScheduleAudioSamples (void* buffer, unsigned long sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, [out] unsigned long *sampleFramesWritten);\r
+               \r
+               HRESULT         GetBufferedAudioSampleFrameCount ( [out] unsigned long *bufferedSampleCount);\r
+               HRESULT         FlushBufferedAudioSamples ();\r
+               \r
+               HRESULT         SetAudioCallback ( [in] IDeckLinkAudioOutputCallback* theCallback);\r
+               \r
+               // Output control\r
+        HRESULT                StartScheduledPlayback (BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed);\r
+        HRESULT                StopScheduledPlayback (BMDTimeValue stopPlaybackAtTime, BMDTimeValue *actualStopTime, BMDTimeScale timeScale);\r
+        HRESULT                GetHardwareReferenceClock (BMDTimeScale desiredTimeScale, BMDTimeValue *elapsedTimeSinceSchedulerBegan);\r
+    };\r
+\r
+    [object, uuid(2B54EDEF-5B32-429F-BA11-BB990596EACD),\r
+     helpstring("IDeckLinkInput_v7_1.  Created by QueryInterface from IDeckLink.")]\r
+    interface IDeckLinkInput_v7_1 : IUnknown\r
+    {\r
+               HRESULT         DoesSupportVideoMode (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);\r
+               HRESULT         GetDisplayModeIterator ([out] IDeckLinkDisplayModeIterator_v7_1 **iterator);\r
+               \r
+               // Video input\r
+               HRESULT         EnableVideoInput (BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags);\r
+               HRESULT         DisableVideoInput ();\r
+               \r
+               // Audio input\r
+               HRESULT         EnableAudioInput (BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned long channelCount);\r
+               HRESULT         DisableAudioInput ();\r
+               HRESULT         ReadAudioSamples (void* buffer, unsigned long sampleFrameCount, [out] unsigned long *sampleFramesRead, [out] BMDTimeValue *audioPacketTime, BMDTimeScale timeScale);\r
+               HRESULT         GetBufferedAudioSampleFrameCount ( [out] unsigned long *bufferedSampleCount);\r
+               \r
+               // Input control\r
+               HRESULT         StartStreams ();\r
+               HRESULT         StopStreams ();\r
+               HRESULT         PauseStreams ();\r
+               HRESULT         SetCallback ([in] IDeckLinkInputCallback_v7_1* theCallback);\r
+    };\r
+       \r
+       [object, uuid(333F3A10-8C2D-43CF-B79D-46560FEEA1CE), local,\r
+     helpstring("IDeckLinkVideoFrame_v7_1.  Created by IDeckLinkVideoOutput::CreateVideoFrame.")]\r
+    interface IDeckLinkVideoFrame_v7_1 : IUnknown\r
+    {\r
+        long                           GetWidth ();\r
+        long                           GetHeight ();\r
+        long                           GetRowBytes ();\r
+        BMDPixelFormat         GetPixelFormat ();\r
+        BMDFrameFlags          GetFlags ();\r
+        HRESULT                                GetBytes (void* *buffer);\r
+    };\r
+       \r
+       [object, uuid(C8B41D95-8848-40EE-9B37-6E3417FB114B), local,\r
+     helpstring("IDeckLinkVideoInputFrame_v7_1.  Provided by the IDeckLinkVideoInput frame arrival callback.")]\r
+    interface IDeckLinkVideoInputFrame_v7_1 : IDeckLinkVideoFrame_v7_1\r
+    {\r
+        HRESULT                                GetFrameTime (BMDTimeValue *frameTime, BMDTimeValue *frameDuration, BMDTimeScale timeScale);\r
+    };\r
+       \r
+       [object, uuid(C86DE4F6-A29F-42E3-AB3A-1363E29F0788), local,\r
+     helpstring("IDeckLinkAudioInputPacket_v7_1.  Provided by the IDeckLinkInput callback.")]\r
+    interface IDeckLinkAudioInputPacket_v7_1 : IUnknown\r
+    {\r
+               long                            GetSampleCount ();\r
+               HRESULT                         GetBytes (void* *buffer);\r
+               HRESULT                         GetAudioPacketTime (BMDTimeValue *packetTime, BMDTimeScale timeScale);\r
+    };\r
+       \r
diff --git a/core/consumer/decklink/DeckLinkAPI_v7_3.idl b/core/consumer/decklink/DeckLinkAPI_v7_3.idl
new file mode 100644 (file)
index 0000000..682b200
--- /dev/null
@@ -0,0 +1,157 @@
+/* -LICENSE-START-
+** Copyright (c) 2009 Blackmagic Design
+**
+** Permission is hereby granted, free of charge, to any person or organization
+** obtaining a copy of the software and accompanying documentation covered by
+** this license (the "Software") to use, reproduce, display, distribute,
+** execute, and transmit the Software, and to prepare derivative works of the
+** Software, and to permit third-parties to whom the Software is furnished to
+** do so, all subject to the following:
+** 
+** The copyright notices in the Software and this entire statement, including
+** the above license grant, this restriction and the following disclaimer,
+** must be included in all copies of the Software, in whole or in part, and
+** all derivative works of the Software, unless such copies or derivative
+** works are solely in the form of machine-executable object code generated by
+** a source language processor.
+** 
+** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+** DEALINGS IN THE SOFTWARE.
+** -LICENSE-END-
+*/
+
+/* Forward Declarations */
+
+interface IDeckLinkInputCallback_v7_3;
+interface IDeckLinkOutput_v7_3;
+interface IDeckLinkInput_v7_3;
+interface IDeckLinkVideoInputFrame_v7_3;
+
+/* End Forward Declarations */
+
+
+/* Interface IDeckLinkInputCallback - Frame arrival callback. */
+
+[
+    object,
+    uuid(FD6F311D-4D00-444B-9ED4-1F25B5730AD0),
+    helpstring("Frame arrival callback.")
+] interface IDeckLinkInputCallback_v7_3 : IUnknown
+{
+    HRESULT VideoInputFormatChanged([in] BMDVideoInputFormatChangedEvents notificationEvents, [in] IDeckLinkDisplayMode *newDisplayMode, [in] BMDDetectedVideoInputFormatFlags detectedSignalFlags);
+    HRESULT VideoInputFrameArrived([in] IDeckLinkVideoInputFrame_v7_3 *videoFrame, [in] IDeckLinkAudioInputPacket *audioPacket);
+};
+
+/* End Interface IDeckLinkInputCallback */
+
+
+/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */
+
+[
+    object,
+    uuid(271C65E3-C323-4344-A30F-D908BCB20AA3),
+    local, 
+    helpstring("Created by QueryInterface from IDeckLink.")
+] interface IDeckLinkOutput_v7_3 : IUnknown
+{
+    HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);
+    HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator **iterator);
+
+    HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback);
+
+    /* Video Output */
+
+    HRESULT EnableVideoOutput(BMDDisplayMode displayMode, BMDVideoOutputFlags flags);
+    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 DisplayVideoFrameSync([in] IDeckLinkVideoFrame *theFrame);
+    HRESULT ScheduleVideoFrame([in] IDeckLinkVideoFrame *theFrame, BMDTimeValue displayTime, BMDTimeValue displayDuration, BMDTimeScale timeScale);
+    HRESULT SetScheduledFrameCompletionCallback([in] IDeckLinkVideoOutputCallback *theCallback);
+    HRESULT GetBufferedVideoFrameCount([out] unsigned long *bufferedFrameCount);
+
+    /* Audio Output */
+
+    HRESULT EnableAudioOutput(BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned long channelCount, BMDAudioOutputStreamType streamType);
+    HRESULT DisableAudioOutput(void);
+
+    HRESULT WriteAudioSamplesSync([in] void *buffer, unsigned long sampleFrameCount, [out] unsigned long *sampleFramesWritten);
+
+    HRESULT BeginAudioPreroll(void);
+    HRESULT EndAudioPreroll(void);
+    HRESULT ScheduleAudioSamples([in] void *buffer, unsigned long sampleFrameCount, BMDTimeValue streamTime, BMDTimeScale timeScale, [out] unsigned long *sampleFramesWritten);
+
+    HRESULT GetBufferedAudioSampleFrameCount([out] unsigned long *bufferedSampleFrameCount);
+    HRESULT FlushBufferedAudioSamples(void);
+
+    HRESULT SetAudioCallback([in] IDeckLinkAudioOutputCallback *theCallback);
+
+    /* Output Control */
+
+    HRESULT StartScheduledPlayback(BMDTimeValue playbackStartTime, BMDTimeScale timeScale, double playbackSpeed);
+    HRESULT StopScheduledPlayback(BMDTimeValue stopPlaybackAtTime, [out] BMDTimeValue *actualStopTime, BMDTimeScale timeScale);
+    HRESULT IsScheduledPlaybackRunning([out] BOOL *active);
+    HRESULT GetHardwareReferenceClock(BMDTimeScale desiredTimeScale, [out] BMDTimeValue *elapsedTimeSinceSchedulerBegan);
+};
+
+/* End Interface IDeckLinkOutput */
+
+/* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */
+
+[
+    object,
+    uuid(4973F012-9925-458C-871C-18774CDBBECB),
+    helpstring("Created by QueryInterface from IDeckLink.")
+] interface IDeckLinkInput_v7_3 : IUnknown
+{
+    HRESULT DoesSupportVideoMode(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, [out] BMDDisplayModeSupport *result);
+    HRESULT GetDisplayModeIterator([out] IDeckLinkDisplayModeIterator **iterator);
+
+    HRESULT SetScreenPreviewCallback([in] IDeckLinkScreenPreviewCallback *previewCallback);
+
+    /* Video Input */
+
+    HRESULT EnableVideoInput(BMDDisplayMode displayMode, BMDPixelFormat pixelFormat, BMDVideoInputFlags flags);
+    HRESULT DisableVideoInput(void);
+    HRESULT GetAvailableVideoFrameCount([out] unsigned long *availableFrameCount);
+
+    /* Audio Input */
+
+    HRESULT EnableAudioInput(BMDAudioSampleRate sampleRate, BMDAudioSampleType sampleType, unsigned long channelCount);
+    HRESULT DisableAudioInput(void);
+    HRESULT GetAvailableAudioSampleFrameCount([out] unsigned long *availableSampleFrameCount);
+
+    /* Input Control */
+
+    HRESULT StartStreams(void);
+    HRESULT StopStreams(void);
+    HRESULT PauseStreams(void);
+    HRESULT FlushStreams(void);
+    HRESULT SetCallback([in] IDeckLinkInputCallback_v7_3 *theCallback);
+};
+
+/* End Interface IDeckLinkInput */
+
+
+/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */
+
+[
+    object,
+    uuid(CF317790-2894-11DE-8C30-0800200C9A66),
+    local, 
+    helpstring("Provided by the IDeckLinkVideoInput frame arrival callback.")
+] interface IDeckLinkVideoInputFrame_v7_3 : IDeckLinkVideoFrame
+{
+    HRESULT GetStreamTime([out] BMDTimeValue *frameTime, [out] BMDTimeValue *frameDuration, BMDTimeScale timeScale);
+};
+
+/* End Interface IDeckLinkVideoInputFrame */
+
diff --git a/core/consumer/decklink/DecklinkVideoConsumer.cpp b/core/consumer/decklink/DecklinkVideoConsumer.cpp
new file mode 100644 (file)
index 0000000..f13a40f
--- /dev/null
@@ -0,0 +1,467 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "../../stdafx.h"\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (push, 1) // TODO: Legacy code, just disable warnings\r
+#pragma warning (disable : 4244)\r
+#endif\r
+\r
+#include "DecklinkVideoConsumer.h"\r
+#include "DeckLinkAPI_h.h"\r
+\r
+#include "../../frame/system_frame.h"\r
+#include "../../frame/frame_format.h"\r
+#include "../../../common/image/image.h"\r
+\r
+#include "../../renderer/render_device.h"\r
+\r
+#include <tbb/concurrent_queue.h>\r
+#include <boost/thread.hpp>\r
+\r
+#pragma warning(push)\r
+#pragma warning(disable : 4996)\r
+\r
+       #include <atlbase.h>\r
+\r
+       #include <atlcom.h>\r
+       #include <atlhost.h>\r
+\r
+#pragma warning(push)\r
+\r
+namespace caspar{ namespace decklink{\r
+\r
+struct DecklinkVideoConsumer::Implementation : public IDeckLinkVideoOutputCallback\r
+{\r
+       struct DecklinkFrameManager;\r
+       struct DecklinkVideoFrame : public frame\r
+       {\r
+               explicit DecklinkVideoFrame(DecklinkFrameManager* pFactory)\r
+               {\r
+                       IDeckLinkMutableVideoFrame* frame = NULL;\r
+                       const caspar::frame_format_desc& format_desc = pFactory->pConsumerImpl_->get_frame_format_desc();\r
+                       if(pFactory->pConsumerImpl_->pDecklinkOutput_->CreateVideoFrame(format_desc.width, format_desc.height, format_desc.size/format_desc.height, bmdFormat8BitBGRA, bmdFrameFlagDefault, &frame) != S_OK) \r
+                       {\r
+                               throw std::exception("DECKLINK: Failed to create frame");\r
+                       }\r
+                       pDecklinkFrame_ = frame;\r
+                       frame->Release();\r
+\r
+                       if(pDecklinkFrame_->GetBytes((void**)&pBytes_) != S_OK)\r
+                               throw std::exception("DECKLINK: Failed to get bytes to frame");\r
+               }\r
+\r
+               unsigned char* data() \r
+               {\r
+                       return pBytes_;\r
+               }\r
+\r
+               bool valid() const \r
+               {\r
+                       return true;\r
+               }\r
+\r
+               unsigned int size() const \r
+               {\r
+                       return pDecklinkFrame_->GetRowBytes() * pDecklinkFrame_->GetHeight();\r
+               }\r
+\r
+               IDeckLinkMutableVideoFrame*  meta_data() const \r
+               {\r
+                       return pDecklinkFrame_;\r
+               }\r
+\r
+               void* tag() const\r
+               {\r
+                       return pFactory_;\r
+               }\r
+\r
+               DecklinkFrameManager* pFactory_;\r
+               CComPtr<IDeckLinkMutableVideoFrame> pDecklinkFrame_;\r
+               unsigned char* pBytes_;\r
+       };\r
+\r
+       struct DecklinkPlaybackStrategy\r
+       {\r
+               explicit DecklinkPlaybackStrategy(Implementation* pConsumerImpl) : pConsumerImpl_(pConsumerImpl), currentReservedFrameIndex_(0), totalFramesScheduled_(0)\r
+               {\r
+                       for(int i = 0; i<4; ++i) \r
+                       {\r
+                               reservedFrames_.push_back(pConsumerImpl_->pFrameManager_->CreateReservedFrame());\r
+                       }\r
+               }\r
+               \r
+               std::shared_ptr<DecklinkVideoFrame> GetReservedFrame()\r
+               {\r
+                       std::shared_ptr<DecklinkVideoFrame> pResult;\r
+                       if(reservedFrames_.size() > currentReservedFrameIndex_)\r
+                       {\r
+                               pResult = reservedFrames_[currentReservedFrameIndex_];\r
+                               currentReservedFrameIndex_ = (currentReservedFrameIndex_+1) & 3;\r
+                       }\r
+                       return pResult;\r
+               }\r
+\r
+               void DisplayFrame(const frame_ptr& frame)\r
+               {\r
+                       if(frame != NULL) \r
+                       {\r
+                               if(pConsumerImpl_->pFrameManager_.get() == reinterpret_cast<DecklinkFrameManager*>(frame->tag()))\r
+                               {\r
+                                       DoRender(std::static_pointer_cast<DecklinkVideoFrame>(frame));\r
+                               }\r
+                               else \r
+                               {\r
+                                       std::shared_ptr<DecklinkVideoFrame> pTempFrame = GetReservedFrame();\r
+                                       if(pTempFrame && frame->size() == pTempFrame->size())\r
+                                       {\r
+                                               common::image::copy(pTempFrame->data(), frame->data(), pTempFrame->size());\r
+                                               DoRender(pTempFrame);\r
+                                       }\r
+                                       else\r
+                                               CASPAR_LOG(error) << "DECKLINK: Failed to get reserved frame";\r
+                               }\r
+                       }\r
+                       else \r
+                       {\r
+                               CASPAR_LOG(error) << "DECKLINK: Tried to render frame with no data";\r
+                       }\r
+               }\r
+               void DoRender(const std::shared_ptr<DecklinkVideoFrame>& frame)\r
+               {\r
+                       static DWORD lastTime = 0;\r
+                       static bool bDoLog = true;\r
+\r
+                       if(pConsumerImpl_->pDecklinkOutput_->DisplayVideoFrameSync(reinterpret_cast<IDeckLinkMutableVideoFrame*>(frame->meta_data())) != S_OK) \r
+                       {\r
+                               if(bDoLog)\r
+                               {\r
+                                       CASPAR_LOG(error) << "DECKLINK: Failed to render frame";\r
+                                       bDoLog = false;\r
+                               }\r
+                       }\r
+                       else \r
+                       {\r
+                               bDoLog = true;\r
+                       }\r
+//                     lastFrameID_ = frame->ID();\r
+               }\r
+\r
+               int totalFramesScheduled_;\r
+               std::vector<std::shared_ptr<DecklinkVideoFrame> > reservedFrames_;\r
+               unsigned int currentReservedFrameIndex_;\r
+               Implementation* pConsumerImpl_;\r
+       };\r
+       friend struct DecklinkPlaybackStrategy;\r
+\r
+       struct DecklinkFrameManager\r
+       {\r
+               explicit DecklinkFrameManager(Implementation* pConsumerImpl) : pConsumerImpl_(pConsumerImpl)\r
+               {\r
+               }\r
+\r
+               frame_ptr CreateFrame() {\r
+                       return std::make_shared<system_frame>(pConsumerImpl_->get_frame_format_desc().size);\r
+               }\r
+\r
+               std::shared_ptr<DecklinkVideoFrame>  CreateReservedFrame() {\r
+                       return std::make_shared<DecklinkVideoFrame>(this);\r
+               }\r
+\r
+               const caspar::frame_format_desc& get_frame_format_desc() const {\r
+                       return pConsumerImpl_->get_frame_format_desc();\r
+               }\r
+\r
+               Implementation* pConsumerImpl_;\r
+       };\r
+\r
+       typedef std::tr1::shared_ptr<DecklinkFrameManager> DecklinkFrameManagerPtr;\r
+\r
+       bool internalKey_;\r
+       CComPtr<IDeckLink> pDecklink_;\r
+       CComQIPtr<IDeckLinkOutput> pDecklinkOutput_;\r
+       CComQIPtr<IDeckLinkKeyer> pDecklinkKeyer_;\r
+\r
+       std::shared_ptr<DecklinkPlaybackStrategy> pPlayback_;\r
+       DecklinkFrameManagerPtr pFrameManager_;\r
+       frame_format currentFormat_;\r
+       frame_format_desc format_desc_;\r
+\r
+       std::exception_ptr pException_;\r
+       boost::thread thread_;\r
+       tbb::concurrent_bounded_queue<frame_ptr> frameBuffer_;\r
+\r
+//     IDeckLinkMutableVideoFrame* pNextFrame_;\r
+\r
+       explicit Implementation(const caspar::frame_format_desc& format_desc, bool internalKey) \r
+               : format_desc_(format_desc), currentFormat_(frame_format::pal), internalKey_(internalKey)\r
+       {\r
+       \r
+               CComPtr<IDeckLinkIterator> pDecklinkIterator;\r
+               HRESULT result = pDecklinkIterator.CoCreateInstance(CLSID_CDeckLinkIterator);\r
+               if(FAILED(result))\r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("No Decklink drivers installed"));\r
+\r
+               CComPtr<IDeckLink> pDecklink;\r
+               IDeckLink* pTempDecklink = NULL;\r
+               while(pDecklinkIterator->Next(&pTempDecklink) == S_OK) \r
+               {\r
+                       if(pDecklink == NULL)\r
+                               pDecklink = pTempDecklink;\r
+\r
+                       if(pTempDecklink)\r
+                               pTempDecklink->Release();\r
+                       pTempDecklink = NULL;\r
+               }\r
+\r
+               if(pDecklink == nullptr)\r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("No Decklink card found"));\r
+\r
+               if(!SetupDevice())\r
+                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Failed to initialize decklink consumer."));\r
+               \r
+               pDecklink_ = pDecklink;\r
+\r
+               frameBuffer_.set_capacity(1),\r
+               thread_ = boost::thread([=]{Run();});\r
+       }\r
+\r
+       ~Implementation()\r
+       {\r
+               frameBuffer_.push(nullptr);\r
+               thread_.join();\r
+               ReleaseDevice();\r
+       }\r
+       \r
+       void DisplayFrame(const frame_ptr& frame)\r
+       {\r
+               if(frame == nullptr)\r
+                       return;         \r
+\r
+               if(pException_ != nullptr)\r
+                       std::rethrow_exception(pException_);\r
+\r
+               frameBuffer_.push(frame);\r
+       }\r
+\r
+       void Run()\r
+       {                               \r
+               auto period = boost::posix_time::microseconds(get_frame_format_period(format_desc_)*1000000);\r
+               auto time = boost::posix_time::microsec_clock::local_time();\r
+               while(true)\r
+               {\r
+                       try\r
+                       {       \r
+                               frame_ptr frame;\r
+                               frameBuffer_.pop(frame);\r
+                               if(frame == nullptr)\r
+                                       return;\r
+\r
+                               auto remaining = period - (boost::posix_time::microsec_clock::local_time() - time);\r
+                               if(remaining > boost::posix_time::microseconds(5000))\r
+                                       boost::this_thread::sleep(remaining - boost::posix_time::microseconds(5000));\r
+                               time = boost::posix_time::microsec_clock::local_time();\r
+\r
+                               pPlayback_->DisplayFrame(frame);\r
+                       }\r
+                       catch(...)\r
+                       {\r
+                               pException_ = std::current_exception();\r
+                       }\r
+               }\r
+       }\r
+\r
+       bool SetupDevice()\r
+       {\r
+               if(!pDecklink_)\r
+                       return false;\r
+\r
+               BSTR pModelName;\r
+               pDecklink_->GetModelName(&pModelName);\r
+               if(pModelName != NULL)\r
+                       CASPAR_LOG(info) << "DECKLINK: Modelname: " << pModelName;\r
+\r
+               pDecklinkOutput_ = pDecklink_;\r
+               if(pDecklinkOutput_ == NULL) {\r
+                       CASPAR_LOG(info) << "DECKLINK: Failed to get IDecklinkOutput interface";\r
+                       return false;\r
+               }\r
+\r
+               unsigned long decklinkVideoFormat = GetDecklinkVideoFormat(format_desc_.format);\r
+               if(decklinkVideoFormat == ULONG_MAX) {\r
+                       CASPAR_LOG(error) << "DECKLINK: Card does not support requested videoformat: " << format_desc_.name;\r
+                       return false;\r
+               }\r
+               \r
+               currentFormat_ = format_desc_.format;\r
+\r
+               BMDDisplayModeSupport displayModeSupport;\r
+               if(FAILED(pDecklinkOutput_->DoesSupportVideoMode((BMDDisplayMode)decklinkVideoFormat, bmdFormat8BitBGRA, &displayModeSupport))) {\r
+                       CASPAR_LOG(error) << "DECKLINK: Card does not support requested videoformat";\r
+                       return false;\r
+               }\r
+\r
+               pDecklinkOutput_->DisableAudioOutput();\r
+               if(FAILED(pDecklinkOutput_->EnableVideoOutput((BMDDisplayMode)decklinkVideoFormat, bmdVideoOutputFlagDefault))) {\r
+                       CASPAR_LOG(error) << "DECKLINK: Could not enable video output";\r
+                       return false;\r
+               }\r
+\r
+               pFrameManager_.reset(new DecklinkFrameManager(this));\r
+\r
+               if(internalKey_) {\r
+                       pDecklinkKeyer_ = pDecklink_;\r
+                       if(pDecklinkKeyer_) {\r
+                               bool bSuccess = true;\r
+                               if(FAILED(pDecklinkKeyer_->Enable(FALSE))) {\r
+                                       CASPAR_LOG(error) << "DECKLINK: Failed to enable internal keyer";\r
+                                       bSuccess = false;\r
+                               }\r
+                               if(FAILED(pDecklinkKeyer_->SetLevel(255))) {\r
+                                       CASPAR_LOG(error) << "DECKLINK: Keyer - Failed to set blend-level to max";\r
+                                       bSuccess = false;\r
+                               }\r
+\r
+                               if(bSuccess)\r
+                                       CASPAR_LOG(info) << "DECKLINK: Successfully configured internal keyer";\r
+                       }\r
+                       else {\r
+                               CASPAR_LOG(error) << "DECKLINK: Failed to get keyer-interface";\r
+                       }\r
+               }\r
+\r
+               pPlayback_ = std::make_shared<DecklinkPlaybackStrategy>(this);\r
+\r
+               CASPAR_LOG(info) << "DECKLINK: Successfully initialized decklink for " << format_desc_.name;\r
+               return true;\r
+       }\r
+\r
+       bool ReleaseDevice()\r
+       {\r
+               pPlayback_.reset();\r
+\r
+               if(pDecklinkKeyer_) {\r
+                       pDecklinkKeyer_.Release();\r
+               }\r
+\r
+               if(pDecklinkOutput_) {\r
+                       BOOL bIsRunning = FALSE;\r
+                       pDecklinkOutput_->IsScheduledPlaybackRunning(&bIsRunning);\r
+                       if(bIsRunning)\r
+                               pDecklinkOutput_->StopScheduledPlayback(0, NULL, 0);\r
+\r
+                       pDecklinkOutput_->DisableVideoOutput();\r
+               }\r
+\r
+               return true;\r
+       }\r
+\r
+       //void DoScheduleNextFrame() {\r
+       //      static int frame = 0;\r
+       //      static bool bLog = true;\r
+       //      if(pDecklinkOutput_->ScheduleVideoFrame(pNextFrame_, frame++, 1, 25) != S_OK) {\r
+       //              if(bLog) {\r
+       //                      LOG << TEXT("DECKLINK: Failed to display frame");\r
+       //                      bLog = false;\r
+       //              }\r
+       //      }\r
+       //      else {\r
+       //              if(((frame-1) % 25) == 0)\r
+       //                      LOG << TEXT("DECKLINK: Scheduled frame ") << (frame-1);\r
+       //              bLog = true;\r
+       //      }\r
+       //}\r
+\r
+       // IUnknown needs o a dummy implementation\r
+       virtual HRESULT STDMETHODCALLTYPE       QueryInterface(REFIID iid, LPVOID *ppv) \r
+       {\r
+               if(ppv != NULL) {\r
+                       if(iid == IID_IUnknown) {\r
+                               (*ppv) = this;\r
+                               return S_OK;\r
+                       }\r
+                       if(iid == IID_IDeckLinkVideoOutputCallback_v7_1) {\r
+                               (*ppv) = (IDeckLinkVideoOutputCallback_v7_1*)this;\r
+                               return S_OK;\r
+                       }\r
+                       if(iid == IID_IDeckLinkVideoOutputCallback) {\r
+                               (*ppv) = (IDeckLinkVideoOutputCallback*)this;\r
+                               return S_OK;\r
+                       }\r
+               }\r
+               return E_NOINTERFACE;\r
+       }\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
+               //DoScheduleNextFrame();\r
+               return S_OK;\r
+       }\r
+\r
+       virtual HRESULT STDMETHODCALLTYPE ScheduledPlaybackHasStopped() \r
+       {\r
+               return S_OK;\r
+       }\r
+\r
+       const caspar::frame_format_desc& get_frame_format_desc() const \r
+       {\r
+               return frame_format_desc::format_descs[currentFormat_];\r
+       }\r
+\r
+       unsigned long GetDecklinkVideoFormat(frame_format fmt) \r
+       {\r
+               switch(fmt)\r
+               {\r
+               case frame_format::pal:                 return bmdModePAL;\r
+               case frame_format::ntsc:                return bmdModeNTSC;\r
+               case frame_format::x576p2500:   return ULONG_MAX;       //not supported\r
+               case frame_format::x720p5000:   return bmdModeHD720p50;\r
+               case frame_format::x720p5994:   return bmdModeHD720p5994;\r
+               case frame_format::x720p6000:   return bmdModeHD720p60;\r
+               case frame_format::x1080p2397:  return bmdModeHD1080p2398;\r
+               case frame_format::x1080p2400:  return bmdModeHD1080p24;\r
+               case frame_format::x1080i5000:  return bmdModeHD1080i50;\r
+               case frame_format::x1080i5994:  return bmdModeHD1080i5994;\r
+               case frame_format::x1080i6000:  return bmdModeHD1080i6000;\r
+               case frame_format::x1080p2500:  return bmdModeHD1080p25;\r
+               case frame_format::x1080p2997:  return bmdModeHD1080p2997;\r
+               case frame_format::x1080p3000:  return bmdModeHD1080p30;\r
+               default:                                                return ULONG_MAX;\r
+               }\r
+       }\r
+};\r
+\r
+DecklinkVideoConsumer::DecklinkVideoConsumer(const caspar::frame_format_desc& format_desc, bool internalKey) : pImpl_(new Implementation(format_desc, internalKey))\r
+{}\r
+\r
+void DecklinkVideoConsumer::display(const frame_ptr& frame)\r
+{\r
+       pImpl_->DisplayFrame(frame);\r
+}\r
+\r
+const frame_format_desc& DecklinkVideoConsumer::get_frame_format_desc() const\r
+{\r
+       return pImpl_->format_desc_;\r
+}\r
+       \r
+}      //namespace decklink\r
+}      //namespace caspar
\ No newline at end of file
diff --git a/core/consumer/decklink/DecklinkVideoConsumer.h b/core/consumer/decklink/DecklinkVideoConsumer.h
new file mode 100644 (file)
index 0000000..ecdd83f
--- /dev/null
@@ -0,0 +1,40 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../../consumer/frame_consumer.h"\r
+\r
+#include "../../frame/frame_fwd.h"\r
+\r
+namespace caspar { namespace decklink {\r
+\r
+class DecklinkVideoConsumer : public frame_consumer\r
+{\r
+public:\r
+       explicit DecklinkVideoConsumer(const caspar::frame_format_desc& format_desc, bool internalKey = false);\r
+       \r
+       void display(const frame_ptr&);\r
+       const frame_format_desc& get_frame_format_desc() const;\r
+private:\r
+       struct Implementation;\r
+       std::tr1::shared_ptr<Implementation> pImpl_;\r
+};\r
+\r
+}}
\ No newline at end of file
diff --git a/core/consumer/frame_consumer.h b/core/consumer/frame_consumer.h
new file mode 100644 (file)
index 0000000..daeeae7
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../frame/frame_fwd.h"\r
+\r
+#include <boost/noncopyable.hpp>\r
+\r
+#include <memory>\r
+\r
+namespace caspar {\r
+       \r
+class frame_consumer : boost::noncopyable\r
+{\r
+public:\r
+       virtual ~frame_consumer() {}\r
+\r
+       virtual const frame_format_desc& get_frame_format_desc() const = 0;\r
+       virtual void prepare(const frame_ptr&){};\r
+       virtual void display(const frame_ptr&){};\r
+};\r
+typedef std::shared_ptr<frame_consumer> frame_consumer_ptr;\r
+typedef std::shared_ptr<const frame_consumer> frame_consumer_const_ptr;\r
+\r
+typedef std::unique_ptr<frame_consumer> frame_consumer_uptr;\r
+typedef std::unique_ptr<const frame_consumer> frame_consumer_const_uptr;\r
+\r
+}
\ No newline at end of file
diff --git a/core/consumer/oal/oal_frame_consumer.cpp b/core/consumer/oal/oal_frame_consumer.cpp
new file mode 100644 (file)
index 0000000..a746fc4
--- /dev/null
@@ -0,0 +1,159 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "../../StdAfx.h"\r
+\r
+#include "oal_frame_consumer.h"\r
+\r
+#include "../../frame/audio_chunk.h"\r
+#include "../../frame/frame.h"\r
+#include "../../frame/frame_format.h"\r
+\r
+#include <SFML/Audio.hpp>\r
+\r
+#include <boost/circular_buffer.hpp>\r
+#include <boost/foreach.hpp>\r
+\r
+#include <windows.h>\r
+\r
+namespace caspar{ namespace audio{     \r
+\r
+class sound_channel : public sf::SoundStream\r
+{\r
+public:\r
+       sound_channel() : internal_chunks_(5)\r
+       {\r
+               external_chunks_.set_capacity(3);\r
+       }\r
+\r
+       ~sound_channel()\r
+       {\r
+               external_chunks_.clear();\r
+               external_chunks_.push(nullptr);\r
+               Stop();\r
+       }\r
+\r
+       void Initialize(const sound_channel_info_ptr& info)\r
+       {\r
+               sf::SoundStream::Initialize(info->channels_count, info->sample_rate);\r
+               assert(info->bits_per_sample/(8*sizeof(char)) == sizeof(sf::Int16));\r
+       }\r
+\r
+       void Push(const audio_chunk_ptr& paudio_chunk)\r
+       {\r
+               if(!external_chunks_.try_push(paudio_chunk))\r
+               {\r
+                       //CASPAR_LOG(debug) << "Sound Buffer Overrun";\r
+                       external_chunks_.push(paudio_chunk);\r
+               }\r
+\r
+               if(GetStatus() != Playing && external_chunks_.size() >= 3)\r
+                       Play();\r
+       }\r
+\r
+private:\r
+\r
+       bool OnStart() \r
+       {\r
+               external_chunks_.clear();\r
+               return true;\r
+       }\r
+\r
+       bool OnGetData(sf::SoundStream::Chunk& data)\r
+    {\r
+               audio_chunk_ptr pChunk;\r
+               if(!external_chunks_.try_pop(pChunk))\r
+               {\r
+                       CASPAR_LOG(trace) << "Sound Buffer Underrun";\r
+                       external_chunks_.pop(pChunk);\r
+               }\r
+\r
+               if(pChunk == nullptr)\r
+               {\r
+                       external_chunks_.clear();\r
+                       return false;\r
+               }\r
+\r
+               internal_chunks_.push_back(pChunk);\r
+               SetVolume(pChunk->volume());\r
+               data.Samples = reinterpret_cast<sf::Int16*>(pChunk->data());\r
+               data.NbSamples = pChunk->size()/sizeof(sf::Int16);\r
+        return true;\r
+    }\r
+\r
+       boost::circular_buffer<audio_chunk_ptr> internal_chunks_;\r
+       tbb::concurrent_bounded_queue<audio_chunk_ptr> external_chunks_;\r
+};\r
+typedef std::shared_ptr<sound_channel> sound_channelPtr;\r
+\r
+struct oal_frame_consumer::implementation : boost::noncopyable\r
+{      \r
+       implementation(const frame_format_desc& format_desc) : format_desc_(format_desc)\r
+       {\r
+               for(int n = 0; n < 3; ++n)\r
+                       channel_pool_.push(std::make_shared<sound_channel>());\r
+       }\r
+       \r
+       void push(const frame_ptr& frame)\r
+       {\r
+               if(frame == nullptr)\r
+                       return;\r
+\r
+               decltype(channels_) active_channels;\r
+               BOOST_FOREACH(const audio_chunk_ptr& pChunk, frame->audio_data())\r
+               {\r
+                       auto info = pChunk->sound_channel_info();\r
+                       auto it = channels_.find(info);\r
+                       sound_channelPtr channel;\r
+                       if(it == channels_.end())\r
+                       {\r
+                               if(channel_pool_.size() <= 1)\r
+                                       channel_pool_.push(std::make_shared<sound_channel>());\r
+                               \r
+                               sound_channelPtr pNewChannel;\r
+                               channel_pool_.pop(pNewChannel);\r
+\r
+                               channel = sound_channelPtr(pNewChannel.get(), [=](sound_channel*)\r
+                               {\r
+                                       channel_pool_.push(pNewChannel);\r
+                                       pNewChannel->Push(nullptr);\r
+                               });\r
+                               channel->Initialize(info);\r
+                       }\r
+                       else\r
+                               channel = it->second;\r
+\r
+                       active_channels.insert(std::make_pair(info, channel));\r
+                       channel->Push(pChunk); // Could Block\r
+               }\r
+\r
+               channels_ = std::move(active_channels);\r
+       }\r
+               \r
+       tbb::concurrent_bounded_queue<sound_channelPtr> channel_pool_;\r
+       std::map<sound_channel_info_ptr, sound_channelPtr> channels_;\r
+\r
+       caspar::frame_format_desc format_desc_;\r
+};\r
+\r
+oal_frame_consumer::oal_frame_consumer(const caspar::frame_format_desc& format_desc) : impl_(new implementation(format_desc)){}\r
+const caspar::frame_format_desc& oal_frame_consumer::get_frame_format_desc() const{return impl_->format_desc_;}\r
+void oal_frame_consumer::prepare(const frame_ptr& frame){impl_->push(frame);}\r
+}}\r
diff --git a/core/consumer/oal/oal_frame_consumer.h b/core/consumer/oal/oal_frame_consumer.h
new file mode 100644 (file)
index 0000000..4a2e368
--- /dev/null
@@ -0,0 +1,38 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../../consumer/frame_consumer.h"\r
+\r
+namespace caspar { namespace audio {\r
+\r
+class oal_frame_consumer : public frame_consumer\r
+{\r
+public:        \r
+       explicit oal_frame_consumer(const frame_format_desc& format_desc);\r
+       \r
+       const frame_format_desc& get_frame_format_desc() const; \r
+       void prepare(const frame_ptr& frame);\r
+private:\r
+       struct implementation;\r
+       std::shared_ptr<implementation> impl_;\r
+};\r
+\r
+}}
\ No newline at end of file
diff --git a/core/consumer/ogl/ogl_frame_consumer.cpp b/core/consumer/ogl/ogl_frame_consumer.cpp
new file mode 100644 (file)
index 0000000..126f19d
--- /dev/null
@@ -0,0 +1,309 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "../../StdAfx.h"\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (disable : 4244)\r
+#endif\r
+\r
+#include "ogl_frame_consumer.h"\r
+\r
+#include "../../frame/system_frame.h"\r
+#include "../../frame/frame_format.h"\r
+#include "../../../common/image/image.h"\r
+\r
+#include <boost/thread.hpp>\r
+\r
+#include <Glee.h>\r
+#include <SFML/Window.hpp>\r
+\r
+#include <windows.h>\r
+\r
+namespace caspar{ namespace ogl{       \r
+\r
+void GL_CHECK()\r
+{\r
+       if(glGetError() != GL_NO_ERROR)\r
+               BOOST_THROW_EXCEPTION(ogl_error() << msg_info(boost::lexical_cast<std::string>(glGetError())));\r
+}\r
+\r
+struct ogl_frame_consumer::implementation : boost::noncopyable\r
+{      \r
+       implementation(const frame_format_desc& format_desc, unsigned int screen_index, stretch stretch, bool windowed) \r
+               : format_desc_(format_desc), stretch_(stretch), texture_(0), pbo_index_(0), screen_width_(0), screen_height_(0), windowed_(windowed)\r
+       {\r
+               pbos_[0] = pbos_[1] = 0;\r
+               \r
+#ifdef _WIN32\r
+               DISPLAY_DEVICE dDevice;                 \r
+               memset(&dDevice,0,sizeof(dDevice));\r
+               dDevice.cb = sizeof(dDevice);\r
+\r
+               std::vector<DISPLAY_DEVICE> displayDevices;\r
+               for(int n = 0; EnumDisplayDevices(NULL, n, &dDevice, NULL); ++n)\r
+               {\r
+                       displayDevices.push_back(dDevice);\r
+                       memset(&dDevice,0,sizeof(dDevice));\r
+                       dDevice.cb = sizeof(dDevice);\r
+               }\r
+\r
+               if(screen_index >= displayDevices.size())\r
+                       BOOST_THROW_EXCEPTION(out_of_range() << arg_name_info("screen_index_"));\r
+               \r
+               DEVMODE devmode;\r
+               memset(&devmode,0,sizeof(devmode));\r
+               \r
+               if(!EnumDisplaySettings(displayDevices[screen_index].DeviceName, ENUM_CURRENT_SETTINGS, &devmode))\r
+                       BOOST_THROW_EXCEPTION(invalid_operation() << arg_name_info("screen_index") << msg_info("EnumDisplaySettings"));\r
+               \r
+               screen_width_ = windowed ? format_desc_.width : devmode.dmPelsWidth;\r
+               screen_height_ = windowed ? format_desc_.height : devmode.dmPelsHeight;\r
+               screenX_ = devmode.dmPosition.x;\r
+               screenY_ = devmode.dmPosition.y;\r
+#else\r
+               if(!windowed)\r
+                       BOOST_THROW_EXCEPTION(not_supported() << msg_info("OGLConsumer doesn't support non-Win32 fullscreen"));\r
+\r
+               if(screen_index != 0)\r
+                       CASPAR_LOG(warning) << "OGLConsumer only supports screen_index=0 for non-Win32";\r
+               \r
+               screen_width_ = format_desc_.width;\r
+               screen_height_ = format_desc_.height;\r
+               screenX_ = 0;\r
+               screenY_ = 0;\r
+#endif\r
+               frame_buffer_.set_capacity(1);\r
+               thread_ = boost::thread([=]{run();});\r
+       }\r
+       \r
+       ~implementation()\r
+       {\r
+               frame_buffer_.push(nullptr),\r
+               thread_.join();\r
+\r
+               if(texture_)\r
+                       glDeleteTextures(1, &texture_);\r
+               if(pbos_[0] && pbos_[1])\r
+                       glDeleteBuffers(2, pbos_);\r
+       }\r
+\r
+       void init()     \r
+       {\r
+               window_.reset(new sf::Window());\r
+               window_->Create(sf::VideoMode(format_desc_.width, format_desc_.height, 32), "CasparCG", windowed_ ? sf::Style::Titlebar : sf::Style::Fullscreen);\r
+               window_->ShowMouseCursor(false);\r
+               window_->SetPosition(screenX_, screenY_);\r
+               window_->SetSize(screen_width_, screen_height_);\r
+               window_->SetActive();\r
+\r
+               glClearColor(0.0f, 0.0f, 0.0f, 0.0f);\r
+               glEnable(GL_TEXTURE_2D);\r
+                                       \r
+               glViewport(0, 0, screen_width_, screen_height_);\r
+               \r
+               GL_CHECK();\r
+               \r
+               std::pair<float, float> target_ratio = None();\r
+               if(stretch_ == ogl::fill)\r
+                       target_ratio = Fill();\r
+               else if(stretch_ == ogl::uniform)\r
+                       target_ratio = Uniform();\r
+               else if(stretch_ == ogl::uniform_to_fill)\r
+                       target_ratio = UniformToFill();\r
+\r
+               float wSize = target_ratio.first;\r
+               float hSize = target_ratio.second;\r
+\r
+               dlist_ = glGenLists(1);\r
+               GL_CHECK();\r
+\r
+               glNewList(dlist_, GL_COMPILE);\r
+                       glBegin(GL_QUADS);\r
+                               glTexCoord2f(0.0f,       1.0f);         glVertex2f(-wSize, -hSize);\r
+                               glTexCoord2f(1.0f,       1.0f);         glVertex2f( wSize, -hSize);\r
+                               glTexCoord2f(1.0f,       0.0f);         glVertex2f( wSize,  hSize);\r
+                               glTexCoord2f(0.0f,       0.0f);         glVertex2f(-wSize,  hSize);\r
+                       glEnd();        \r
+               glEndList();\r
+               GL_CHECK();\r
+                       \r
+               glGenTextures(1, &texture_);    \r
+               GL_CHECK();\r
+\r
+               glBindTexture( GL_TEXTURE_2D, texture_);\r
+               GL_CHECK();\r
+\r
+               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );\r
+               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );\r
+               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );\r
+               glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );\r
+\r
+               glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, format_desc_.width, format_desc_.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);\r
+               GL_CHECK();\r
+\r
+               glGenBuffersARB(2, pbos_);\r
+               GL_CHECK();\r
+               glBindBuffer(GL_PIXEL_PACK_BUFFER, pbos_[0]);\r
+               glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, format_desc_.size, 0, GL_STREAM_DRAW);\r
+               glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbos_[1]);\r
+               glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, format_desc_.size, 0, GL_STREAM_DRAW);              \r
+\r
+               pbo_index_ = 0;\r
+       }\r
+\r
+       std::pair<float, float> None()\r
+       {\r
+               float width = static_cast<float>(format_desc_.width)/static_cast<float>(screen_width_);\r
+               float height = static_cast<float>(format_desc_.height)/static_cast<float>(screen_height_);\r
+\r
+               return std::make_pair(width, height);\r
+       }\r
+\r
+       std::pair<float, float> Uniform()\r
+       {\r
+               float aspect = static_cast<float>(format_desc_.width)/static_cast<float>(format_desc_.height);\r
+               float width = std::min(1.0f, static_cast<float>(screen_height_)*aspect/static_cast<float>(screen_width_));\r
+               float height = static_cast<float>(screen_width_*width)/static_cast<float>(screen_height_*aspect);\r
+\r
+               return std::make_pair(width, height);\r
+       }\r
+\r
+       std::pair<float, float> Fill()\r
+       {\r
+               return std::make_pair(1.0f, 1.0f);\r
+       }\r
+\r
+       std::pair<float, float> UniformToFill()\r
+       {\r
+               float wr = static_cast<float>(format_desc_.width)/static_cast<float>(screen_width_);\r
+               float hr = static_cast<float>(format_desc_.height)/static_cast<float>(screen_height_);\r
+               float r_inv = 1.0f/std::min(wr, hr);\r
+\r
+               float width = wr*r_inv;\r
+               float height = hr*r_inv;\r
+\r
+               return std::make_pair(width, height);\r
+       }\r
+\r
+       void render(const frame_ptr& frame)\r
+       {                                       \r
+               // Render\r
+               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\r
+               glClearColor(0.0f, 0.0f, 0.0f, 0.0f);\r
+               glLoadIdentity();\r
+       \r
+               glBindTexture(GL_TEXTURE_2D, texture_);\r
+               glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbos_[pbo_index_]);\r
+       \r
+               glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, format_desc_.width, format_desc_.height, GL_BGRA, GL_UNSIGNED_BYTE, 0);\r
+\r
+               glCallList(dlist_);             \r
+\r
+               // Update\r
+               int nextPboIndex = pbo_index_ ^ 1;\r
+\r
+               glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbos_[nextPboIndex]);\r
+               glBufferData(GL_PIXEL_UNPACK_BUFFER, format_desc_.size, NULL, GL_STREAM_DRAW);\r
+               GLubyte* ptr = static_cast<GLubyte*>(glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY));\r
+\r
+               if(ptr != NULL)                 \r
+               {\r
+                       common::image::copy(ptr, frame->data(), frame->size());\r
+                       glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);\r
+               }\r
+\r
+               // Swap\r
+               pbo_index_ = nextPboIndex;\r
+       }\r
+                       \r
+       void display(const frame_ptr& frame)\r
+       {\r
+               if(frame == nullptr)\r
+                       return;         \r
+\r
+               if(exception_ != nullptr)\r
+                       std::rethrow_exception(exception_);\r
+\r
+               frame_buffer_.push(frame);\r
+       }\r
+\r
+       void run()\r
+       {                       \r
+               init();\r
+               \r
+               auto period = boost::posix_time::microseconds(static_cast<long>(get_frame_format_period(format_desc_)*1000000.0));\r
+               auto time = boost::posix_time::microsec_clock::local_time();\r
+               \r
+               frame_ptr frame;\r
+               do\r
+               {\r
+                       try\r
+                       {               \r
+                               frame_buffer_.pop(frame);\r
+                               if(frame != nullptr)\r
+                               {\r
+                                       auto remaining = period - (boost::posix_time::microsec_clock::local_time() - time);\r
+                                       if(remaining > boost::posix_time::microseconds(5000))\r
+                                               boost::this_thread::sleep(remaining - boost::posix_time::microseconds(5000));\r
+                                       time = boost::posix_time::microsec_clock::local_time();\r
+\r
+                                       sf::Event e;\r
+                                       while(window_->GetEvent(e)){}\r
+                                       window_->SetActive();\r
+                                       render(frame);\r
+                                       window_->Display();\r
+                               }\r
+                       }\r
+                       catch(...)\r
+                       {\r
+                               exception_ = std::current_exception();\r
+                       }\r
+               }               \r
+               while(frame != nullptr);\r
+       }\r
+               \r
+\r
+       GLuint dlist_;\r
+       GLuint texture_;\r
+\r
+       bool windowed_;\r
+       unsigned int screen_width_;\r
+       unsigned int screen_height_;\r
+       unsigned int screenX_;\r
+       unsigned int screenY_;\r
+                               \r
+       GLuint pbos_[2];\r
+       int pbo_index_;\r
+\r
+       std::unique_ptr<sf::Window> window_;\r
+       stretch stretch_;\r
+       caspar::frame_format_desc format_desc_;\r
+\r
+       std::exception_ptr exception_;\r
+       boost::thread thread_;\r
+       tbb::concurrent_bounded_queue<frame_ptr> frame_buffer_;\r
+};\r
+\r
+ogl_frame_consumer::ogl_frame_consumer(const caspar::frame_format_desc& format_desc, unsigned int screen_index, stretch stretch, bool windowed)\r
+: impl_(new implementation(format_desc, screen_index, stretch, windowed)){}\r
+const caspar::frame_format_desc& ogl_frame_consumer::get_frame_format_desc() const{return impl_->format_desc_;}\r
+void ogl_frame_consumer::display(const frame_ptr& frame){impl_->display(frame);}\r
+}}\r
diff --git a/core/consumer/ogl/ogl_frame_consumer.h b/core/consumer/ogl/ogl_frame_consumer.h
new file mode 100644 (file)
index 0000000..44fe7ea
--- /dev/null
@@ -0,0 +1,48 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../../consumer/frame_consumer.h"\r
+\r
+namespace caspar { namespace ogl {\r
+\r
+struct ogl_error : virtual caspar_exception{};\r
+\r
+enum stretch\r
+{\r
+       none,\r
+       uniform,\r
+       fill,\r
+       uniform_to_fill\r
+};\r
+\r
+class ogl_frame_consumer : public frame_consumer\r
+{\r
+public:        \r
+       explicit ogl_frame_consumer(const frame_format_desc& format_desc, unsigned int screen_index = 0, stretch stretch = stretch::fill, bool windowed = false);\r
+       \r
+       const frame_format_desc& get_frame_format_desc() const; \r
+       void display(const frame_ptr& frame);\r
+private:\r
+       struct implementation;\r
+       std::shared_ptr<implementation> impl_;\r
+};\r
+\r
+}}
\ No newline at end of file
diff --git a/core/frame/audio_chunk.cpp b/core/frame/audio_chunk.cpp
new file mode 100644 (file)
index 0000000..b0c7abe
--- /dev/null
@@ -0,0 +1,50 @@
+#include "../StdAfx.h"\r
+\r
+#include "audio_chunk.h"\r
+\r
+#include <tbb/scalable_allocator.h>\r
+\r
+namespace caspar{\r
+\r
+audio_chunk::audio_chunk(size_t dataSize, const sound_channel_info_ptr& snd_channel_info) \r
+       : size_(dataSize), snd_channel_info_(snd_channel_info), data_(static_cast<unsigned char*>(scalable_aligned_malloc(dataSize, 16))), volume_(100.0f)\r
+{}\r
+\r
+audio_chunk::~audio_chunk() \r
+{\r
+       scalable_aligned_free(data_);\r
+}\r
+\r
+const unsigned char* audio_chunk::data() const\r
+{\r
+       return data_;\r
+}\r
+\r
+unsigned char* audio_chunk::data()\r
+{\r
+       return data_;\r
+}\r
+\r
+size_t audio_chunk::size() const\r
+{\r
+       return size_;\r
+}\r
+\r
+float audio_chunk::volume() const\r
+{\r
+       return volume_;\r
+}\r
+\r
+void audio_chunk::set_volume(float volume)\r
+{\r
+       assert(volume_ > 0.0f);\r
+       assert(volume_ < (100.0f + std::numeric_limits<float>::epsilon()));\r
+       volume_ = volume;\r
+}\r
+       \r
+const sound_channel_info_ptr& audio_chunk::sound_channel_info() const\r
+{\r
+       return snd_channel_info_;\r
+}\r
+\r
+}
\ No newline at end of file
diff --git a/core/frame/audio_chunk.h b/core/frame/audio_chunk.h
new file mode 100644 (file)
index 0000000..2dbd19b
--- /dev/null
@@ -0,0 +1,62 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include <boost/noncopyable.hpp>\r
+\r
+#include <memory>\r
+\r
+namespace caspar{\r
+       \r
+struct sound_channel_info : boost::noncopyable\r
+{\r
+public:\r
+       sound_channel_info(size_t channels_count, size_t bits_per_sample, size_t sample_rate)\r
+               : channels_count(channels_count), bits_per_sample(bits_per_sample), sample_rate(sample_rate){}\r
+       const size_t channels_count;\r
+       const size_t bits_per_sample;\r
+       const size_t sample_rate;\r
+};\r
+typedef std::shared_ptr<sound_channel_info> sound_channel_info_ptr;\r
+typedef std::unique_ptr<sound_channel_info> sound_channel_info_uptr;\r
+\r
+class audio_chunk : boost::noncopyable\r
+{\r
+public:\r
+       audio_chunk(size_t dataSize, const sound_channel_info_ptr& snd_channel_info);\r
+       ~audio_chunk();\r
+\r
+       const unsigned char* data() const;\r
+       unsigned char* data();\r
+       size_t size() const;\r
+       float volume() const;\r
+       void set_volume(float volume);\r
+       const sound_channel_info_ptr& sound_channel_info() const;\r
+\r
+private:\r
+       float volume_;\r
+       const sound_channel_info_ptr snd_channel_info_;\r
+       unsigned char* const data_;\r
+       const int size_;\r
+};\r
+typedef std::shared_ptr<audio_chunk> audio_chunk_ptr;\r
+typedef std::unique_ptr<audio_chunk> audio_chunk_uptr;\r
+\r
+}
\ No newline at end of file
diff --git a/core/frame/bitmap_frame.cpp b/core/frame/bitmap_frame.cpp
new file mode 100644 (file)
index 0000000..3c1ca7b
--- /dev/null
@@ -0,0 +1,104 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "../StdAfx.h"\r
+\r
+#include "bitmap_frame.h"\r
+\r
+#include <windows.h>\r
+\r
+namespace caspar{\r
+       \r
+class scoped_hdc : boost::noncopyable\r
+{ \r
+public:\r
+       scoped_hdc(HDC hdc) : hdc_(hdc){}\r
+       void operator=(scoped_hdc&& other) \r
+       { \r
+               hdc_ = other.hdc_;\r
+               other.hdc_ = nullptr; \r
+       }\r
+       ~scoped_hdc()\r
+       { \r
+               if(hdc_ != nullptr)\r
+                       DeleteDC(hdc_);\r
+       }\r
+       operator HDC() { return hdc_; }\r
+private:\r
+       HDC hdc_;\r
+};\r
+\r
+class scoped_bitmap : boost::noncopyable\r
+{ \r
+public:\r
+       scoped_bitmap(HBITMAP bmp) : bmp_(bmp){}\r
+       void operator=(scoped_bitmap&& other) \r
+       { \r
+               bmp_ = other.bmp_;\r
+               other.bmp_ = nullptr; \r
+       }\r
+       ~scoped_bitmap() \r
+       { \r
+               if(bmp_ != nullptr) \r
+                       DeleteObject(bmp_);\r
+       }\r
+       operator HBITMAP() const { return bmp_; }\r
+private:\r
+       HBITMAP bmp_;\r
+};\r
+\r
+struct bitmap_frame::implementation : boost::noncopyable\r
+{\r
+       implementation(size_t width, size_t height) : size_(width*height*4), hdc_(CreateCompatibleDC(nullptr)), bitmap_(nullptr)\r
+       {       \r
+               if(hdc_ == nullptr)\r
+                       throw std::bad_alloc();\r
+\r
+               BITMAPINFO bitmapInfo;\r
+               bitmapInfo.bmiHeader.biBitCount = 32;\r
+               bitmapInfo.bmiHeader.biClrImportant = 0;\r
+               bitmapInfo.bmiHeader.biClrUsed = 0;\r
+               bitmapInfo.bmiHeader.biCompression = BI_RGB;\r
+       #pragma warning(disable:4146)\r
+               bitmapInfo.bmiHeader.biHeight = -height;\r
+       #pragma warning(default:4146)\r
+               bitmapInfo.bmiHeader.biPlanes = 1;\r
+               bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFO);\r
+               bitmapInfo.bmiHeader.biWidth = width;\r
+               bitmapInfo.bmiHeader.biSizeImage = 0;\r
+               bitmapInfo.bmiHeader.biXPelsPerMeter = 0;\r
+               bitmapInfo.bmiHeader.biYPelsPerMeter = 0;\r
+\r
+               bitmap_ = std::move(CreateDIBSection(hdc_, &bitmapInfo, DIB_RGB_COLORS, reinterpret_cast<void**>(&bitmap_data_), NULL, 0));\r
+               SelectObject(hdc_, bitmap_);    \r
+       }\r
+       \r
+       const size_t size_;\r
+       unsigned char* bitmap_data_;\r
+       scoped_hdc hdc_;\r
+       scoped_bitmap bitmap_;\r
+};\r
+\r
+bitmap_frame::bitmap_frame(size_t width, size_t height) : impl_(new implementation(width, height)){}\r
+unsigned int bitmap_frame::size() const { return impl_->size_; }\r
+unsigned char* bitmap_frame::data() { return impl_->bitmap_data_; }\r
+HDC bitmap_frame::hdc() { return impl_->hdc_; }\r
+\r
+}
\ No newline at end of file
diff --git a/core/frame/bitmap_frame.h b/core/frame/bitmap_frame.h
new file mode 100644 (file)
index 0000000..e6601d1
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "frame.h"\r
+\r
+#include <memory>\r
+\r
+namespace caspar{\r
+\r
+class bitmap_frame : public frame\r
+{\r
+public:\r
+       bitmap_frame(size_t width, size_t height);\r
+\r
+       unsigned char* data();\r
+       unsigned int size() const;      \r
+       HDC hdc();\r
+private:\r
+       struct implementation;\r
+       std::shared_ptr<implementation> impl_;\r
+};\r
+typedef std::shared_ptr<bitmap_frame> bitmap_frame_ptr;\r
+typedef std::unique_ptr<bitmap_frame> bitmap_frame_uptr;\r
+\r
+}\r
+\r
diff --git a/core/frame/frame.h b/core/frame/frame.h
new file mode 100644 (file)
index 0000000..998792a
--- /dev/null
@@ -0,0 +1,163 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include <memory>\r
+#include <vector>\r
+\r
+#include "audio_chunk.h"\r
+#include "frame_format.h"\r
+\r
+#include "../../common/image/image.h"\r
+\r
+#include <tbb/parallel_invoke.h>\r
+\r
+#include <boost/range/algorithm.hpp>\r
+\r
+namespace caspar {\r
+\r
+// NOTE: audio data is ALWAYS shallow copy\r
+class frame : boost::noncopyable\r
+{\r
+public:\r
+       virtual ~frame(){}\r
+       \r
+       virtual const unsigned char* data() const { return const_cast<frame&>(*this).data(); }\r
+       virtual unsigned char* data() = 0;\r
+       virtual size_t size() const = 0;\r
+       virtual void* tag() const { return nullptr; }\r
+       virtual const std::vector<audio_chunk_ptr>& audio_data() const { return audioData_; }   \r
+       virtual std::vector<audio_chunk_ptr>& audio_data() { return audioData_; }                       \r
+\r
+       static std::shared_ptr<frame> null()\r
+       {\r
+               class null_frame : public frame\r
+               {\r
+                       unsigned char* data() { return nullptr; };\r
+                       size_t size() const { return 0; };\r
+               };\r
+               static auto my_null_frame = std::make_shared<null_frame>();\r
+               return my_null_frame;\r
+       }\r
+private:       \r
+       std::vector<audio_chunk_ptr> audioData_;\r
+};\r
+typedef std::shared_ptr<frame> frame_ptr;\r
+typedef std::shared_ptr<const frame> frame_const_ptr;\r
+typedef std::unique_ptr<frame> frame_uptr;\r
+typedef std::unique_ptr<const frame> frame_const_uptr;\r
+\r
+inline bool operator==(const frame& lhs, const frame& rhs)\r
+{\r
+       return lhs.data() == rhs.data() && (lhs.data() == nullptr || lhs.size() == rhs.size());\r
+}\r
+\r
+template<typename frame_ptr_type>\r
+frame_ptr_type& set_frame_volume(frame_ptr_type& result_frame, float volume)\r
+{\r
+       assert(result_frame != nullptr);\r
+       assert(boost::range::find(result_frame->audio_data(), nullptr) == result_frame->audio_data().end());\r
+       boost::range::for_each(result_frame->audio_data(), std::bind(&audio_chunk::set_volume, std::placeholders::_1, volume));\r
+       return result_frame;\r
+}\r
+\r
+template<typename frame_ptr_type>\r
+frame_ptr_type& clear_frame(frame_ptr_type& result_frame)\r
+{\r
+       assert(result_frame != nullptr);\r
+       common::image::clear(result_frame->data(), result_frame->size());\r
+       result_frame->audio_data().clear();\r
+       return result_frame;\r
+}\r
+\r
+template<typename frame_ptr_type>\r
+frame_ptr_type& pre_over_frame(frame_ptr_type& result_frame, const frame_const_ptr& frame1, const frame_const_ptr& frame2)\r
+{\r
+       assert(result_frame != nullptr && frame1 != nullptr && frame2 != nullptr);\r
+       assert(result_frame->size() == frame1->size());\r
+       assert(result_frame->size() == frame2->size());\r
+       assert(boost::range::find(frame1->audio_data(), nullptr) == frame1->audio_data().end());\r
+       assert(boost::range::find(frame2->audio_data(), nullptr) == frame2->audio_data().end());\r
+       tbb::parallel_invoke(\r
+       [&]{common::image::pre_over(result_frame->data(), frame1->data(), frame2->data(), result_frame->size());},\r
+       [&]\r
+       {\r
+               if(result_frame != frame1)\r
+                       boost::range::copy(frame1->audio_data(), std::back_inserter(result_frame->audio_data()));\r
+               if(result_frame != frame2)\r
+                       boost::range::copy(frame2->audio_data(), std::back_inserter(result_frame->audio_data()));\r
+       });\r
+       return result_frame;\r
+}\r
+\r
+template<typename frame_ptr_type>\r
+frame_ptr_type& copy_frame(frame_ptr_type& result_frame, const frame_const_ptr& frame)\r
+{      \r
+       assert(result_frame != nullptr && frame != nullptr);\r
+       assert(result_frame->size() == frame->size());\r
+       if(result_frame == frame)\r
+               return result_frame;\r
+       tbb::parallel_invoke(\r
+       [&]{common::image::copy(result_frame->data(), frame->data(), result_frame->size());},\r
+       [&]{boost::range::copy(frame->audio_data(), std::back_inserter(result_frame->audio_data()));});\r
+       return result_frame;\r
+} \r
+\r
+template<typename frame_ptr_type>\r
+frame_ptr_type& copy_frame(frame_ptr_type& result_frame, const frame_const_ptr& frame, const frame_format_desc& format_desc)\r
+{      \r
+       assert(result_frame != nullptr && frame != nullptr);\r
+       assert(result_frame->size() == format_desc.size);\r
+       assert(frame->size() == format_desc.size);\r
+       if(result_frame == frame)\r
+               return result_frame;\r
+       tbb::parallel_invoke(\r
+       [&]\r
+       {\r
+               if(format_desc.mode == video_mode::progressive)\r
+                       common::image::copy(result_frame->data(), frame->data(), result_frame->size());\r
+               else\r
+                       common::image::copy_field(result_frame->data(), frame->data(), format_desc.mode == video_mode::upper ? 1 : 0, format_desc.width, format_desc.height);\r
+       },\r
+       [&]{boost::range::copy(frame->audio_data(), std::back_inserter(result_frame->audio_data()));});\r
+       return result_frame;\r
+} \r
+\r
+template<typename frame_ptr_type, typename frame_container>\r
+frame_ptr_type& compose_frames(frame_ptr_type& result_frame, const frame_container& frames)\r
+{\r
+       assert(boost::range::find(frames, nullptr) == frames.end());\r
+       assert(boost::range::find_if(frames, [&](const frame_ptr& frame) { return frame->size() != result_frame->size();}) == frames.end());\r
+       if(frames.empty())      \r
+               clear_frame(result_frame);      \r
+       else if(frames.size() == 1)     \r
+               copy_frame(result_frame, frames[0]);    \r
+       else if(frames.size() == 2)     \r
+               pre_over_frame(result_frame, frames[0], frames[1]);     \r
+       else\r
+       {\r
+               for(size_t n = 0; n < frames.size() - 2; ++n)\r
+                       pre_over_frame(frames[0], frames[n], frames[n+1]);\r
+               pre_over_frame(result_frame, frames[0], frames[frames.size()-1]);\r
+       }\r
+       return result_frame;\r
+}\r
+\r
+}
\ No newline at end of file
diff --git a/core/frame/frame_format.cpp b/core/frame/frame_format.cpp
new file mode 100644 (file)
index 0000000..20a73e5
--- /dev/null
@@ -0,0 +1,61 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "..\StdAfx.h"\r
+\r
+#include "frame_format.h"\r
+\r
+#include <boost/algorithm/string.hpp>\r
+\r
+#define DEFINE_VIDEOFORMATDESC(w, h, m, f, s, fmt) { (w), (h), (m), (f), (w)*(h)*4, s, (fmt) }\r
+\r
+namespace caspar {\r
+\r
+const frame_format_desc frame_format_desc::format_descs[frame_format::count] =  \r
+{      \r
+       DEFINE_VIDEOFORMATDESC(720, 576, video_mode::upper, 50, TEXT("PAL"), frame_format::pal), \r
+       DEFINE_VIDEOFORMATDESC(720, 486, video_mode::lower, 60/1.001, TEXT("NTSC"), frame_format::ntsc), \r
+       DEFINE_VIDEOFORMATDESC(720, 576, video_mode::progressive, 25, TEXT("576p2500"), frame_format::x576p2500),\r
+       DEFINE_VIDEOFORMATDESC(1280, 720, video_mode::progressive, 50, TEXT("720p5000"), frame_format::x720p5000), \r
+       DEFINE_VIDEOFORMATDESC(1280, 720, video_mode::progressive, 60/1.001, TEXT("720p5994"), frame_format::x720p5994),\r
+       DEFINE_VIDEOFORMATDESC(1280, 720, video_mode::progressive, 60, TEXT("720p6000"), frame_format::x720p6000),\r
+       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive, 24/1.001, TEXT("1080p2397"), frame_format::x1080p2397),\r
+       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive, 24, TEXT("1080p2400"), frame_format::x1080p2400),\r
+       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::upper, 50, TEXT("1080i5000"), frame_format::x1080i5000),\r
+       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::upper, 60/1.001, TEXT("1080i5994"), frame_format::x1080i5994),\r
+       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::upper, 60, TEXT("1080i6000"), frame_format::x1080i6000),\r
+       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive, 25, TEXT("1080p2500"), frame_format::x1080p2500),\r
+       DEFINE_VIDEOFORMATDESC(1920, 1080, video_mode::progressive, 30/1.001, TEXT("1080p2997"), frame_format::x1080p2997),\r
+       DEFINE_VIDEOFORMATDESC(1920, 1080,video_mode:: progressive, 30, TEXT("1080p3000"), frame_format::x1080p3000)\r
+};\r
+\r
+frame_format get_video_format(const std::wstring& strVideoMode)\r
+{\r
+       for(int n = 0; n < frame_format::count; ++n)\r
+       {\r
+               if(boost::iequals(frame_format_desc::format_descs[n].name, strVideoMode))\r
+                       return static_cast<frame_format>(n);\r
+       }\r
+\r
+       return frame_format::invalid;\r
+}\r
+\r
+}      //namespace caspar\r
+\r
diff --git a/core/frame/frame_format.h b/core/frame/frame_format.h
new file mode 100644 (file)
index 0000000..9ecf39a
--- /dev/null
@@ -0,0 +1,78 @@
+#pragma once\r
+\r
+#include <string>\r
+\r
+namespace caspar{\r
+       \r
+enum video_mode\r
+{\r
+       progressive,\r
+       lower,\r
+       upper\r
+};\r
+\r
+enum frame_format\r
+{\r
+       pal = 0,\r
+       ntsc,\r
+       x576p2500,\r
+       x720p5000,\r
+       x720p5994,\r
+       x720p6000,\r
+       x1080p2397,\r
+       x1080p2400,\r
+       x1080i5000,\r
+       x1080i5994,\r
+       x1080i6000,\r
+       x1080p2500,\r
+       x1080p2997,\r
+       x1080p3000,\r
+       count,\r
+       invalid\r
+};\r
+\r
+struct frame_format_desc\r
+{\r
+       size_t width;\r
+       size_t height;\r
+       video_mode mode;\r
+       double fps;\r
+       size_t size;\r
+       std::wstring name;\r
+       frame_format format;\r
+\r
+       static const frame_format_desc format_descs[frame_format::count];\r
+};\r
+\r
+inline bool operator==(const frame_format_desc& rhs, const frame_format_desc& lhs)\r
+{\r
+       return rhs.format == lhs.format;\r
+}\r
+\r
+inline bool operator!=(const frame_format_desc& rhs, const frame_format_desc& lhs)\r
+{\r
+       return !(rhs == lhs);\r
+}\r
+\r
+frame_format get_video_format(const std::wstring& strVideoMode);\r
+\r
+inline frame_format_desc get_video_format_desc(const std::wstring& strVideoMode, frame_format defaultFormat = frame_format::x576p2500)\r
+{                      \r
+       auto casparVideoFormat = defaultFormat;\r
+       if(!strVideoMode.empty())\r
+               casparVideoFormat = caspar::get_video_format(std::wstring(strVideoMode.begin(), strVideoMode.end()));\r
+       return frame_format_desc::format_descs[casparVideoFormat];\r
+}\r
+\r
+inline double get_frame_format_period(const frame_format_desc& format_desc)\r
+{\r
+       return 1.0/(format_desc.mode == video_mode::progressive ? format_desc.fps : format_desc.fps/2.0);\r
+}\r
+\r
+inline std::wostream& operator<<(std::wostream& out, const frame_format_desc& format_desc)\r
+{\r
+  out << format_desc.name.c_str();\r
+  return out;\r
+}\r
+\r
+}
\ No newline at end of file
diff --git a/core/frame/frame_fwd.h b/core/frame/frame_fwd.h
new file mode 100644 (file)
index 0000000..fac407c
--- /dev/null
@@ -0,0 +1,23 @@
+#pragma once\r
+\r
+#include <memory>\r
+\r
+namespace caspar{\r
+       \r
+class frame;\r
+typedef std::shared_ptr<frame> frame_ptr;\r
+typedef std::shared_ptr<const frame> frame_const_ptr;\r
+typedef std::unique_ptr<frame> frame_uptr;\r
+typedef std::unique_ptr<const frame> frame_const_uptr;\r
+\r
+struct frame_format_desc;\r
+       \r
+struct sound_channel_info;\r
+typedef std::shared_ptr<sound_channel_info> sound_channel_info_ptr;\r
+typedef std::unique_ptr<sound_channel_info> sound_channel_info_uptr;\r
+\r
+class audio_chunk;\r
+typedef std::shared_ptr<audio_chunk> audio_chunk_ptr;\r
+typedef std::unique_ptr<audio_chunk> audio_chunk_uptr;\r
+\r
+}
\ No newline at end of file
diff --git a/core/frame/system_frame.cpp b/core/frame/system_frame.cpp
new file mode 100644 (file)
index 0000000..d9b2123
--- /dev/null
@@ -0,0 +1,36 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "../stdafx.h"\r
+\r
+#include "system_frame.h"\r
+\r
+#include <tbb/scalable_allocator.h>\r
+\r
+namespace caspar {\r
+\r
+system_frame::system_frame(unsigned int dataSize) \r
+       : size_(dataSize), data_(static_cast<unsigned char*>(scalable_aligned_malloc(dataSize, 16))){}\r
+system_frame::~system_frame(){scalable_aligned_free(data_);}\r
+unsigned char* system_frame::data() {return data_;}    \r
+unsigned int system_frame::size() const{return size_;}\r
+\r
+}\r
+\r
diff --git a/core/frame/system_frame.h b/core/frame/system_frame.h
new file mode 100644 (file)
index 0000000..e63b2e7
--- /dev/null
@@ -0,0 +1,41 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "frame.h"\r
+\r
+#include <memory>\r
+\r
+namespace caspar {\r
+\r
+class system_frame : public frame\r
+{\r
+public:\r
+       explicit system_frame(unsigned int dataSize);\r
+       ~system_frame();\r
+\r
+       unsigned char* data();\r
+       unsigned int size() const;\r
+private:\r
+       unsigned char* const data_;\r
+       const size_t size_;\r
+};\r
+\r
+}
\ No newline at end of file
diff --git a/core/main.cpp b/core/main.cpp
new file mode 100644 (file)
index 0000000..53edc38
--- /dev/null
@@ -0,0 +1,103 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+\r
+#include "StdAfx.h"\r
+\r
+#include <tbb/tbbmalloc_proxy.h>\r
+#include <tbb/task_scheduler_observer.h>\r
+\r
+#ifdef _DEBUG\r
+       #define _CRTDBG_MAP_ALLOC\r
+       #include <stdlib.h>\r
+       #include <crtdbg.h>\r
+#endif\r
+\r
+#include <conio.h>\r
+\r
+#include "server.h"\r
+#include "protocol/amcp/AMCPProtocolStrategy.h"\r
+\r
+class win32_handler_tbb_installer : public tbb::task_scheduler_observer\r
+{\r
+public:\r
+       win32_handler_tbb_installer()   {observe(true);}\r
+       void on_scheduler_entry(bool is_worker) {caspar::win32_exception::install_handler();} \r
+};\r
\r
+int _tmain(int argc, _TCHAR* argv[])\r
+{\r
+       std::wstringstream str;\r
+       str << "CasparCG " << CASPAR_VERSION_STR << " " << CASPAR_VERSION_TAG;\r
+       SetConsoleTitle(str.str().c_str());\r
+\r
+       EnableMenuItem(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE , MF_GRAYED);\r
+    DrawMenuBar(GetConsoleWindow());\r
+       MoveWindow(GetConsoleWindow(), 800, 0, 800, 1000, true);\r
+\r
+#ifdef _DEBUG\r
+       _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF );\r
+       _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );\r
+       _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_DEBUG );\r
+       _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_DEBUG );\r
+\r
+       MessageBox(nullptr, TEXT("Now is the time to connect for remote debugging..."), TEXT("Debug"), MB_OK | MB_TOPMOST);\r
+#endif\r
+\r
+       caspar::log::add_file_sink(caspar::server::log_folder());\r
+\r
+       win32_handler_tbb_installer win32_handler_tbb_installer;\r
+       caspar::win32_exception::install_handler();\r
+               \r
+       std::wcout << L"Starting CasparCG Video Playout Server Ver: " << CASPAR_VERSION_STR << " tag: " << CASPAR_VERSION_TAG << std::endl;\r
+       std::wcout << L"Copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\n\n" << std::endl;\r
+               \r
+       CASPAR_LOG(debug) << "Started Main Thread";\r
+       try \r
+       {\r
+               caspar::server caspar_device;\r
+                               \r
+               auto dummy = std::make_shared<caspar::IO::DummyClientInfo>();\r
+               caspar::amcp::AMCPProtocolStrategy amcp(caspar_device.get_channels());\r
+               bool is_running = true;\r
+               while(is_running)\r
+               {\r
+                       std::wstring wcmd;\r
+                       std::getline(std::wcin, wcmd); // TODO: It's blocking...\r
+                       is_running = wcmd != L"exit" && wcmd != L"q";\r
+                       if(wcmd == L"1")\r
+                               wcmd = L"LOADBG 1-1 DV SLIDE 50 LOOP AUTOPLAY";\r
+                       else if(wcmd == L"2")\r
+                               wcmd = L"CG 1-2 ADD 1 BBTELEFONARE 1";\r
+\r
+                       wcmd += L"\r\n";\r
+                       amcp.Parse(wcmd.c_str(), wcmd.length(), dummy);\r
+               }\r
+       }\r
+       catch(const std::exception&)\r
+       {\r
+               CASPAR_LOG(fatal) << "UNHANDLED EXCEPTION in main thread.";\r
+               CASPAR_LOG_CURRENT_EXCEPTION();\r
+               std::wcout << L"Press Any Key To Exit";\r
+               _getwch();\r
+       }       \r
+       CASPAR_LOG(debug) << "Ended Main Thread";\r
+\r
+       return 0;\r
+}\r
diff --git a/core/producer/color/color_producer.cpp b/core/producer/color/color_producer.cpp
new file mode 100644 (file)
index 0000000..0d08b29
--- /dev/null
@@ -0,0 +1,90 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "../../stdafx.h"\r
+\r
+#include "color_producer.h"\r
+\r
+#include "../../frame/system_frame.h"\r
+#include "../../frame/frame_format.h"\r
+\r
+#include <intrin.h>\r
+#pragma intrinsic(__movsd, __stosd)\r
+\r
+namespace caspar {\r
+\r
+class color_producer : public frame_producer\r
+{\r
+public:\r
+       explicit color_producer(unsigned long color_value, const frame_format_desc& format_desc) : format_desc_(format_desc)\r
+       {\r
+               frame_ = std::make_shared<system_frame>(format_desc.size);\r
+               __stosd(reinterpret_cast<unsigned long*>(frame_->data()), color_value_, frame_->size() / sizeof(unsigned long));\r
+       }\r
+\r
+       frame_ptr get_frame() { return frame_; }\r
+       const frame_format_desc& get_frame_format_desc() const { return format_desc_; }\r
+\r
+       frame_format_desc format_desc_;\r
+       frame_ptr frame_;\r
+       unsigned long color_value_;\r
+};\r
+\r
+union Color \r
+{\r
+       struct Components \r
+       {\r
+               unsigned char a;\r
+               unsigned char r;\r
+               unsigned char g;\r
+               unsigned char b;\r
+       } comp;\r
+\r
+       unsigned long value;\r
+};\r
+\r
+unsigned long get_pixel_color_value(const std::wstring& parameter)\r
+{\r
+       std::wstring color_code;\r
+       if(parameter.length() != 9 || parameter[0] != '#')\r
+               BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("parameter") << arg_value_info(common::narrow(parameter)) << msg_info("Invalid color code"));\r
+       \r
+       color_code = parameter.substr(1);\r
+\r
+       Color color;\r
+       color.value = _tcstoul(color_code.c_str(), 0, 16);\r
+       unsigned char temp = color.comp.a;\r
+       color.comp.a = color.comp.b;\r
+       color.comp.b = temp;\r
+       temp = color.comp.r;\r
+       color.comp.r = color.comp.g;\r
+       color.comp.g = temp;\r
+\r
+       return color.value;\r
+}\r
+\r
+frame_producer_ptr create_color_producer(const std::vector<std::wstring>& params, const frame_format_desc& format_desc)\r
+{\r
+       if(params.empty() || params[0].at(0) != '#')\r
+               return nullptr;\r
+       return std::make_shared<color_producer>(get_pixel_color_value(params[0]), format_desc);\r
+}\r
+\r
+}
\ No newline at end of file
diff --git a/core/producer/color/color_producer.h b/core/producer/color/color_producer.h
new file mode 100644 (file)
index 0000000..397a624
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../frame_producer.h"\r
+\r
+#include <string>\r
+#include <vector>\r
+\r
+namespace caspar {\r
+       \r
+frame_producer_ptr create_color_producer(const std::vector<std::wstring>& params, const frame_format_desc& format_desc);\r
+\r
+}\r
diff --git a/core/producer/ffmpeg/audio/audio_decoder.cpp b/core/producer/ffmpeg/audio/audio_decoder.cpp
new file mode 100644 (file)
index 0000000..139606c
--- /dev/null
@@ -0,0 +1,86 @@
+#include "../../../stdafx.h"\r
+\r
+#include "audio_decoder.h"\r
+\r
+#include "../../../../common/image/image.h"\r
+\r
+#include <queue>\r
+               \r
+namespace caspar{ namespace ffmpeg{\r
+\r
+struct audio_decoder::implementation : boost::noncopyable\r
+{\r
+       implementation(const sound_channel_info_ptr& snd_channel_info) : discard_bytes_(0), current_audio_chunk_offset_(0), snd_channel_info_(snd_channel_info)\r
+       {\r
+               audio_decomp_buffer_.resize(audio_decoder::AUDIO_DECOMP_BUFFER_SIZE);\r
+               int alignment_offset_ = static_cast<unsigned char>(audio_decoder::ALIGNMENT - (reinterpret_cast<size_t>(&audio_decomp_buffer_.front()) % audio_decoder::ALIGNMENT));\r
+               aligned_audio_decomp_addr_ = &audio_decomp_buffer_.front() + alignment_offset_;                         \r
+       }\r
+               \r
+       audio_packet_ptr execute(const audio_packet_ptr& audio_packet)\r
+       {                       \r
+               int max_chunk_length = std::min(audio_packet->audio_frame_size, audio_packet->src_audio_frame_size);\r
+\r
+               int written_bytes = audio_decoder::AUDIO_DECOMP_BUFFER_SIZE - audio_decoder::ALIGNMENT;\r
+               int result = avcodec_decode_audio2(audio_packet->codec_context, reinterpret_cast<int16_t*>(aligned_audio_decomp_addr_), &written_bytes, audio_packet->data, audio_packet->size);\r
+\r
+               if(result <= 0)\r
+                       return audio_packet;\r
+\r
+               unsigned char* pDecomp = aligned_audio_decomp_addr_;\r
+\r
+               //if there are bytes to discard, do that first\r
+               while(written_bytes > 0 && discard_bytes_ != 0)\r
+               {\r
+                       int bytesToDiscard = std::min(written_bytes, static_cast<int>(discard_bytes_));\r
+                       pDecomp += bytesToDiscard;\r
+\r
+                       discard_bytes_ -= bytesToDiscard;\r
+                       written_bytes -= bytesToDiscard;\r
+               }\r
+\r
+               while(written_bytes > 0)\r
+               {\r
+                       //if we're starting on a new chunk, allocate it\r
+                       if(current_chunk_ == nullptr) \r
+                       {\r
+                               current_chunk_ = std::make_shared<audio_chunk>(audio_packet->audio_frame_size, snd_channel_info_);\r
+                               current_audio_chunk_offset_ = 0;\r
+                       }\r
+\r
+                       //either fill what's left of the chunk or copy all written_bytes that are left\r
+                       int targetLength = std::min((max_chunk_length - current_audio_chunk_offset_), written_bytes);\r
+                       common::image::copy(current_chunk_->data() + current_audio_chunk_offset_, pDecomp, targetLength);\r
+                       written_bytes -= targetLength;\r
+\r
+                       current_audio_chunk_offset_ += targetLength;\r
+                       pDecomp += targetLength;\r
+\r
+                       if(current_audio_chunk_offset_ >= max_chunk_length) \r
+                       {\r
+                               if(max_chunk_length < static_cast<int>(audio_packet->audio_frame_size)) \r
+                                       common::image::clear(current_chunk_->data() + max_chunk_length, audio_packet->audio_frame_size-max_chunk_length);                                       \r
+                               else if(audio_packet->audio_frame_size < audio_packet->src_audio_frame_size) \r
+                                       discard_bytes_ = audio_packet->src_audio_frame_size-audio_packet->audio_frame_size;\r
+\r
+                               audio_packet->audio_chunks.push_back(current_chunk_);\r
+                               current_chunk_.reset();\r
+                       }\r
+               }\r
+\r
+               return audio_packet;\r
+       }\r
+                       \r
+       int                                                                     discard_bytes_;\r
+               \r
+       std::vector<unsigned char>                      audio_decomp_buffer_;\r
+       unsigned char*                                          aligned_audio_decomp_addr_;\r
+\r
+       audio_chunk_ptr                                         current_chunk_;\r
+       int                                                                     current_audio_chunk_offset_;\r
+       sound_channel_info_ptr                                  snd_channel_info_;\r
+};\r
+\r
+audio_decoder::audio_decoder(const sound_channel_info_ptr& snd_channel_info) : impl_(new implementation(snd_channel_info)){}\r
+audio_packet_ptr audio_decoder::execute(const audio_packet_ptr& audio_packet){return impl_->execute(audio_packet);}\r
+}}
\ No newline at end of file
diff --git a/core/producer/ffmpeg/audio/audio_decoder.h b/core/producer/ffmpeg/audio/audio_decoder.h
new file mode 100644 (file)
index 0000000..5cda54d
--- /dev/null
@@ -0,0 +1,27 @@
+#pragma once\r
+\r
+#include "../packet.h"\r
+#include "../../../frame/audio_chunk.h"\r
+\r
+namespace caspar{ namespace ffmpeg     {\r
+\r
+class audio_decoder : boost::noncopyable\r
+{\r
+public:\r
+       audio_decoder(const sound_channel_info_ptr& snd_channel_info);\r
+       audio_packet_ptr execute(const audio_packet_ptr& audio_packet);\r
+       \r
+       /// <summary> The alignment </summary>\r
+       /// <remarks> Four sec of 16 bit stereo 48kHz should be enough </remarks>\r
+       static const int ALIGNMENT = 16 ;\r
+\r
+       /// <summary> Size of the audio decomp buffer </summary>\r
+       static const int AUDIO_DECOMP_BUFFER_SIZE = 4*48000*4+ALIGNMENT;\r
+private:\r
+       struct implementation;\r
+       std::shared_ptr<implementation> impl_;\r
+};\r
+typedef std::shared_ptr<audio_decoder> audio_decoder_ptr;\r
+typedef std::unique_ptr<audio_decoder> audio_decoder_uptr;\r
+\r
+}}
\ No newline at end of file
diff --git a/core/producer/ffmpeg/ffmpeg_producer.cpp b/core/producer/ffmpeg/ffmpeg_producer.cpp
new file mode 100644 (file)
index 0000000..20a0d03
--- /dev/null
@@ -0,0 +1,169 @@
+#include "../../stdafx.h"\r
+\r
+#include "ffmpeg_producer.h"\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (push)\r
+#pragma warning (disable : 4244)\r
+#endif\r
+\r
+extern "C" \r
+{\r
+       #define __STDC_CONSTANT_MACROS\r
+       #define __STDC_LIMIT_MACROS\r
+       #include <libavcodec/avcodec.h>\r
+       #include <libavformat/avformat.h>\r
+       #include <libavutil/avutil.h>\r
+       #include <libswscale/swscale.h>\r
+}\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (pop)\r
+#endif\r
+\r
+#include "input.h"\r
+\r
+#include "audio/audio_decoder.h"\r
+#include "video/video_decoder.h"\r
+#include "video/video_deinterlacer.h"\r
+#include "video/video_scaler.h"\r
+\r
+#include "../../frame/frame_format.h"\r
+#include "../../../common/utility/find_file.h"\r
+#include "../../server.h"\r
+#include "../../../common/image/image.h"\r
+#include "../../../common/utility/scope_exit.h"\r
+\r
+#include <tbb/mutex.h>\r
+#include <tbb/parallel_invoke.h>\r
+#include <tbb/task_group.h>\r
+\r
+#include <boost/algorithm/string/case_conv.hpp>\r
+#include <boost/lexical_cast.hpp>\r
+#include <boost/thread.hpp>\r
+#include <boost/thread/once.hpp>\r
+\r
+using namespace boost::assign;\r
+\r
+namespace caspar{ namespace ffmpeg{\r
+       \r
+struct ffmpeg_producer : public frame_producer\r
+{\r
+public:\r
+       static const size_t MAX_TOKENS = 5;\r
+       static const size_t MIN_BUFFER_SIZE = 2;\r
+       static const size_t DEFAULT_BUFFER_SIZE = 8;\r
+       static const size_t MAX_BUFFER_SIZE = 64;\r
+       static const size_t LOAD_TARGET_BUFFER_SIZE = 4;\r
+       static const size_t THREAD_TIMEOUT_MS = 1000;\r
+\r
+       ffmpeg_producer(const std::wstring& filename, const  std::vector<std::wstring>& params, const frame_format_desc& format_desc) \r
+               : filename_(filename), format_desc_(format_desc)\r
+       {\r
+       if(!boost::filesystem::exists(filename))\r
+               BOOST_THROW_EXCEPTION(file_not_found() <<  boost::errinfo_file_name(common::narrow(filename)));\r
+               \r
+               static boost::once_flag flag = BOOST_ONCE_INIT;\r
+               boost::call_once(av_register_all, flag);        \r
+               \r
+               input_.reset(new input(format_desc));\r
+               input_->set_loop(std::find(params.begin(), params.end(), L"LOOP") != params.end());\r
+               input_->load(common::narrow(filename_));\r
+\r
+               sound_channel_info_ptr snd_channel_info = input_->get_audio_codec_context() != nullptr ? \r
+                               std::make_shared<sound_channel_info>\r
+                               (\r
+                                       input_->get_audio_codec_context()->channels, \r
+                                       input_->get_audio_codec_context()->bits_per_coded_sample, \r
+                                       input_->get_audio_codec_context()->sample_rate\r
+                               ) : nullptr;\r
+               \r
+               video_decoder_.reset(new video_decoder());\r
+               video_scaler_.reset(new video_scaler());\r
+               audio_decoder_.reset(new audio_decoder(snd_channel_info));\r
+               has_audio_ = input_->get_audio_codec_context() != nullptr;\r
+       }\r
+               \r
+       frame_ptr get_frame()\r
+       {\r
+               while(ouput_channel_.empty() && !input_->is_eof())\r
+               {                                                                               \r
+                       tbb::parallel_invoke(\r
+                       [&]\r
+                       { // Video Decoding and Scaling\r
+                               auto video_packet = input_->get_video_packet();\r
+                               if(video_packet)\r
+                               {\r
+                                       video_packet = video_decoder_->execute(video_packet);\r
+                                       auto frame = video_scaler_->execute(video_packet)->frame;\r
+                                       video_frame_channel_.push_back(std::move(frame));       \r
+                               }\r
+                       }, \r
+                       [&] \r
+                       { // Audio Decoding\r
+                               auto audio_packet = input_->get_audio_packet();\r
+                               if(audio_packet)\r
+                               {\r
+                                       auto audio_chunks = audio_decoder_->execute(audio_packet);\r
+                                       audio_chunk_channel_.insert(audio_chunk_channel_.end(), audio_packet->audio_chunks.begin(), audio_packet->audio_chunks.end());\r
+                               }\r
+                       });\r
+\r
+                       while(!video_frame_channel_.empty() && (!audio_chunk_channel_.empty() || !has_audio_))\r
+                       {\r
+                               if(has_audio_)\r
+                               {\r
+                                       video_frame_channel_.front()->audio_data().push_back(audio_chunk_channel_.front());\r
+                                       audio_chunk_channel_.pop_front();\r
+                               }\r
+                               \r
+                               frame_ptr frame = video_frame_channel_.front();\r
+                               video_frame_channel_.pop_front();\r
+                               ouput_channel_.push(std::move(frame));\r
+                       }                               \r
+               }\r
+\r
+               frame_ptr frame;\r
+               if(!ouput_channel_.empty())\r
+               {\r
+                       frame = ouput_channel_.front();\r
+                       ouput_channel_.pop();\r
+               }\r
+               return frame;\r
+       }\r
+\r
+       const frame_format_desc& get_frame_format_desc() const { return format_desc_; }\r
+               \r
+       bool has_audio_;\r
+\r
+       // Filter 1 : Input\r
+       input_uptr                                              input_;         \r
+\r
+       // Filter 2 : Video Decoding and Scaling\r
+       video_decoder_uptr                              video_decoder_;\r
+       video_scaler_uptr                               video_scaler_;\r
+       //std::deque<video_packet_ptr>                                  videoDecodedPacketChannel_;\r
+       std::deque<frame_ptr>                   video_frame_channel_;\r
+       \r
+       // Filter 3 : Audio Decoding\r
+       audio_decoder_uptr                              audio_decoder_;\r
+       std::deque<audio_chunk_ptr>             audio_chunk_channel_;\r
+\r
+       // Filter 4 : Merge Video and Audio\r
+       std::queue<frame_ptr>                   ouput_channel_;\r
+       \r
+       std::wstring                                    filename_;\r
+       frame_format_desc                       format_desc_;\r
+};\r
+\r
+frame_producer_ptr create_ffmpeg_producer(const  std::vector<std::wstring>& params, const frame_format_desc& format_desc)\r
+{\r
+       std::wstring filename = params[0];\r
+       std::wstring result_filename = common::find_file(server::media_folder() + filename, list_of(L"mpg")(L"avi")(L"mov")(L"dv")(L"wav")(L"mp3")(L"mp4")(L"f4v")(L"flv"));\r
+       if(result_filename.empty())\r
+               return nullptr;\r
+\r
+       return std::make_shared<ffmpeg_producer>(result_filename, params, format_desc);\r
+}\r
+\r
+}}
\ No newline at end of file
diff --git a/core/producer/ffmpeg/ffmpeg_producer.h b/core/producer/ffmpeg/ffmpeg_producer.h
new file mode 100644 (file)
index 0000000..cbe4b9d
--- /dev/null
@@ -0,0 +1,12 @@
+#pragma once\r
+\r
+#include "../frame_producer.h"\r
+\r
+#include <string>\r
+#include <vector>\r
+\r
+namespace caspar { namespace ffmpeg {\r
+       \r
+frame_producer_ptr create_ffmpeg_producer(const  std::vector<std::wstring>& params, const frame_format_desc& format_desc);\r
+\r
+}}
\ No newline at end of file
diff --git a/core/producer/ffmpeg/input.cpp b/core/producer/ffmpeg/input.cpp
new file mode 100644 (file)
index 0000000..48d9a1c
--- /dev/null
@@ -0,0 +1,230 @@
+#include "..\..\stdafx.h"\r
+\r
+#include "input.h"\r
+\r
+#include "../../frame/system_frame.h"\r
+#include "../../frame/frame_format.h"\r
+#include "../../../common/image/image.h"\r
+#include "../../../common/utility/scope_exit.h"\r
+\r
+#include <tbb/concurrent_queue.h>\r
+\r
+#include <boost/thread.hpp>\r
+\r
+#include <errno.h>\r
+#include <system_error>\r
+\r
+#pragma warning(disable : 4482)\r
+               \r
+namespace caspar{ namespace ffmpeg{\r
+               \r
+struct input::implementation : boost::noncopyable\r
+{\r
+       implementation(const frame_format_desc& format_desc) \r
+               : video_frame_rate_(25.0), video_s_index_(-1), audio_s_index_(-1), video_codec_(nullptr), audio_codec_a(nullptr), format_desc_(format_desc)\r
+       {\r
+               loop_ = false;\r
+               video_packet_buffer_.set_capacity(28);\r
+               audio_packet_buffer_.set_capacity(28);\r
+       }\r
+\r
+       ~implementation()\r
+       {               \r
+               is_running_ = false;\r
+               audio_packet_buffer_.clear();\r
+               video_packet_buffer_.clear();\r
+               io_thread_.join();\r
+       }\r
+       \r
+       void load(const std::string& filename)\r
+       {       \r
+               try\r
+               {\r
+                       int errn;\r
+                       AVFormatContext* weak_format_context;\r
+                       if((errn = -av_open_input_file(&weak_format_context, filename.c_str(), nullptr, 0, nullptr)) > 0)\r
+                               BOOST_THROW_EXCEPTION(ffmpeg_error() << boost::errinfo_errno(errn));\r
+                       format_context.reset(weak_format_context, av_close_input_file);\r
+                       \r
+                       if((errn = -av_find_stream_info(format_context.get())) > 0)\r
+                               BOOST_THROW_EXCEPTION(ffmpeg_error() << boost::errinfo_errno(errn));\r
+\r
+                       video_codec_context_ = open_video_stream();\r
+                       if(!video_codec_context_)\r
+                               CASPAR_LOG(info) << "No video stream found.";\r
+               \r
+                       audio_codex_context = open_audio_stream();\r
+                       if(!audio_codex_context)\r
+                               CASPAR_LOG(info) << "No audio stream found.";\r
+\r
+                       if(!video_codec_context_ && !audio_codex_context)\r
+                               BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("No video or audio codec found."));\r
+                       \r
+                       video_frame_rate_ = static_cast<double>(video_codec_context_->time_base.den) / static_cast<double>(video_codec_context_->time_base.num);\r
+\r
+                       is_running_ = true;\r
+                       io_thread_ = boost::thread([=]{this->read_file();});\r
+               }\r
+               catch(...)\r
+               {\r
+                       video_codec_context_.reset();\r
+                       audio_codex_context.reset();\r
+                       format_context.reset();\r
+                       video_frame_rate_ = 25.0;\r
+                       video_s_index_ = -1;\r
+                       audio_s_index_ = -1;    \r
+                       throw;\r
+               }\r
+               filename_ = filename;\r
+       }\r
+                       \r
+       std::shared_ptr<AVCodecContext> open_video_stream()\r
+       {\r
+               bool succeeded = false;\r
+\r
+               CASPAR_SCOPE_EXIT([&]\r
+               {\r
+                       if(!succeeded)\r
+                       {\r
+                               video_s_index_ = -1;\r
+                               video_codec_ = nullptr;\r
+                       }\r
+               });\r
+\r
+               AVStream** streams_end = format_context->streams+format_context->nb_streams;\r
+               AVStream** video_stream = std::find_if(format_context->streams, streams_end, \r
+                       [](AVStream* stream) { return stream != nullptr && stream->codec->codec_type == CODEC_TYPE_VIDEO ;});\r
+\r
+               video_s_index_ = video_stream != streams_end ? (*video_stream)->index : -1;\r
+               if(video_s_index_ == -1) \r
+                       return nullptr;\r
+               \r
+               video_codec_ = avcodec_find_decoder((*video_stream)->codec->codec_id);                  \r
+               if(video_codec_ == nullptr)\r
+                       return nullptr;\r
+                       \r
+               if((-avcodec_open((*video_stream)->codec, video_codec_)) > 0)           \r
+                       return nullptr;\r
+\r
+               succeeded = true;\r
+\r
+               return std::shared_ptr<AVCodecContext>((*video_stream)->codec, avcodec_close);\r
+       }\r
+\r
+       std::shared_ptr<AVCodecContext> open_audio_stream()\r
+       {       \r
+               bool succeeded = false;\r
+\r
+               CASPAR_SCOPE_EXIT([&]\r
+               {\r
+                       if(!succeeded)\r
+                       {\r
+                               audio_s_index_ = -1;\r
+                               audio_codec_a = nullptr;\r
+                       }\r
+               });\r
+\r
+               AVStream** streams_end = format_context->streams+format_context->nb_streams;\r
+               AVStream** audio_stream = std::find_if(format_context->streams, streams_end, \r
+                       [](AVStream* stream) { return stream != nullptr && stream->codec->codec_type == CODEC_TYPE_AUDIO;});\r
+\r
+               audio_s_index_ = audio_stream != streams_end ? (*audio_stream)->index : -1;\r
+               if(audio_s_index_ == -1)\r
+                       return nullptr;\r
+               \r
+               audio_codec_a = avcodec_find_decoder((*audio_stream)->codec->codec_id);\r
+               if(audio_codec_a == nullptr)\r
+                       return nullptr;\r
+\r
+               if((-avcodec_open((*audio_stream)->codec, audio_codec_a)) > 0)          \r
+                       return nullptr;\r
+\r
+               succeeded = true;\r
+\r
+               return std::shared_ptr<AVCodecContext>((*audio_stream)->codec, avcodec_close);\r
+       }       \r
+\r
+       void read_file()\r
+       {       \r
+               CASPAR_LOG(info) << "Started ffmpeg_producer::read_file Thread for " << filename_.c_str();\r
+               win32_exception::install_handler();\r
+\r
+               try\r
+               {\r
+                       AVPacket tmp_packet;\r
+                       while(is_running_)\r
+                       {\r
+                               std::shared_ptr<AVPacket> packet(&tmp_packet, av_free_packet);\r
+\r
+                               if (av_read_frame(format_context.get(), packet.get()) >= 0) // NOTE: Packet is only valid until next call of av_read_frame or av_close_input_file\r
+                               {\r
+                                       if(packet->stream_index == video_s_index_)                              \r
+                                               video_packet_buffer_.push(std::make_shared<video_packet>(packet, std::make_shared<system_frame>(format_desc_.size), format_desc_, video_codec_context_.get(), video_codec_));            // NOTE: video_packet makes a copy of AVPacket\r
+                                       else if(packet->stream_index == audio_s_index_)         \r
+                                               audio_packet_buffer_.push(std::make_shared<audio_packet>(packet, audio_codex_context.get(), audio_codec_a, video_frame_rate_));                 \r
+                               }\r
+                               else if(!loop_ || av_seek_frame(format_context.get(), -1, 0, AVSEEK_FLAG_BACKWARD) < 0) // TODO: av_seek_frame does not work for all formats\r
+                                       is_running_ = false;\r
+                       }\r
+               }\r
+               catch(...)\r
+               {\r
+                       CASPAR_LOG_CURRENT_EXCEPTION();\r
+               }\r
+\r
+               is_running_ = false;\r
+               \r
+               CASPAR_LOG(info) << " Ended ffmpeg_producer::read_file Thread for " << filename_.c_str();\r
+       }\r
+       \r
+       video_packet_ptr get_video_packet()\r
+       {\r
+               video_packet_ptr video_packet;\r
+               video_packet_buffer_.try_pop(video_packet);\r
+               return video_packet;\r
+       }\r
+\r
+       audio_packet_ptr get_audio_packet()\r
+       {\r
+               audio_packet_ptr audio_packet;\r
+               audio_packet_buffer_.try_pop(audio_packet);\r
+               return audio_packet;\r
+       }\r
+\r
+       bool is_eof() const\r
+       {\r
+               return !is_running_ && video_packet_buffer_.empty() && audio_packet_buffer_.empty();\r
+       }\r
+                               \r
+       std::string                                                     filename_;\r
+       std::shared_ptr<AVFormatContext>        format_context; // Destroy this last\r
+\r
+       std::shared_ptr<AVCodecContext>         video_codec_context_;\r
+       AVCodec*                                                        video_codec_;\r
+\r
+       std::shared_ptr<AVCodecContext>         audio_codex_context;\r
+       AVCodec*                                                        audio_codec_a;\r
+\r
+       tbb::atomic<bool>                                       loop_;\r
+       int                                                                     video_s_index_;\r
+       int                                                                     audio_s_index_;\r
+\r
+       frame_format_desc format_desc_;\r
+\r
+       tbb::concurrent_bounded_queue<video_packet_ptr> video_packet_buffer_;\r
+       tbb::concurrent_bounded_queue<audio_packet_ptr> audio_packet_buffer_;\r
+       boost::thread   io_thread_;\r
+       tbb::atomic<bool> is_running_;\r
+\r
+       double video_frame_rate_;\r
+};\r
+\r
+input::input(const frame_format_desc& format_desc) : impl_(new implementation(format_desc)){}\r
+void input::load(const std::string& filename){impl_->load(filename);}\r
+void input::set_loop(bool value){impl_->loop_ = value;}\r
+const std::shared_ptr<AVCodecContext>& input::get_video_codec_context() const{return impl_->video_codec_context_;}\r
+const std::shared_ptr<AVCodecContext>& input::get_audio_codec_context() const{return impl_->audio_codex_context;}\r
+bool input::is_eof() const{return impl_->is_eof();}\r
+video_packet_ptr input::get_video_packet(){return impl_->get_video_packet();}\r
+audio_packet_ptr input::get_audio_packet(){return impl_->get_audio_packet();}\r
+}}
\ No newline at end of file
diff --git a/core/producer/ffmpeg/input.h b/core/producer/ffmpeg/input.h
new file mode 100644 (file)
index 0000000..1946279
--- /dev/null
@@ -0,0 +1,32 @@
+#pragma once\r
+\r
+#include "packet.h"\r
+\r
+#include <system_error>\r
+\r
+namespace caspar{ namespace ffmpeg{    \r
+       \r
+typedef std::shared_ptr<AVFormatContext> AVFormatContextPtr;\r
+\r
+class input : boost::noncopyable\r
+{\r
+public:\r
+       input(const frame_format_desc& format_desc);\r
+       void load(const std::string& filename);\r
+       const std::shared_ptr<AVCodecContext>& get_video_codec_context() const;\r
+       const std::shared_ptr<AVCodecContext>& get_audio_codec_context() const;\r
+\r
+       video_packet_ptr get_video_packet();\r
+       audio_packet_ptr get_audio_packet();\r
+\r
+       bool is_eof() const;\r
+       void set_loop(bool value);\r
+private:\r
+       struct implementation;\r
+       std::shared_ptr<implementation> impl_;\r
+};\r
+typedef std::shared_ptr<input> input_ptr;\r
+typedef std::unique_ptr<input> input_uptr;\r
+\r
+       }\r
+}\r
diff --git a/core/producer/ffmpeg/packet.h b/core/producer/ffmpeg/packet.h
new file mode 100644 (file)
index 0000000..2238a84
--- /dev/null
@@ -0,0 +1,94 @@
+#pragma once\r
+\r
+#include "../../frame/audio_chunk.h"\r
+#include "../../frame/frame.h"\r
+\r
+#include <tbb/scalable_allocator.h>\r
+#include <type_traits>\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (push)\r
+#pragma warning (disable : 4244)\r
+#endif\r
+extern "C" \r
+{\r
+       #define __STDC_CONSTANT_MACROS\r
+       #define __STDC_LIMIT_MACROS\r
+       #include <libavformat/avformat.h>\r
+}\r
+#if defined(_MSC_VER)\r
+#pragma warning (pop)\r
+#endif\r
+\r
+namespace caspar{ namespace ffmpeg{\r
+\r
+typedef std::tr1::shared_ptr<AVFrame> AVFramePtr;      \r
+typedef std::tr1::shared_ptr<AVPacket> AVPacketPtr;\r
+\r
+struct ffmpeg_error: virtual boost::exception, virtual std::exception { };\r
+\r
+struct video_packet : boost::noncopyable\r
+{\r
+       video_packet(const AVPacketPtr& packet, frame_ptr&& frame, const frame_format_desc& format_desc, AVCodecContext* codec_context, AVCodec* codec) \r
+               :  size(packet->size), codec_context(codec_context), codec(codec), frame(std::move(frame)), format_desc(format_desc), \r
+                       data(static_cast<uint8_t*>(scalable_aligned_malloc(packet->size, 16)))\r
+       {\r
+               memcpy(const_cast<uint8_t*>(data), packet->data, packet->size);\r
+       }\r
+               \r
+       ~video_packet()\r
+       {\r
+               scalable_aligned_free(const_cast<uint8_t*>(data));\r
+       }\r
+       \r
+       const size_t                                    size;\r
+       const uint8_t* const                    data;\r
+       AVCodecContext* const                   codec_context;\r
+       const AVCodec* const                    codec;\r
+       const frame_ptr                                 frame;\r
+       AVFramePtr                                              decoded_frame;\r
+       const frame_format_desc&                format_desc;\r
+};     \r
+typedef std::shared_ptr<video_packet> video_packet_ptr;\r
+\r
+struct audio_packet : boost::noncopyable\r
+{\r
+       audio_packet(const AVPacketPtr& packet, AVCodecContext* codec_context, AVCodec* codec, double frame_rate = 25.0) \r
+               : \r
+               size(packet->size), \r
+               codec_context(codec_context), \r
+               codec(codec),\r
+               data(static_cast<uint8_t*>(scalable_aligned_malloc(packet->size, 16)))\r
+       {\r
+               memcpy(const_cast<uint8_t*>(data), packet->data, packet->size);\r
+\r
+               size_t bytesPerSec = (codec_context->sample_rate * codec_context->channels * 2);\r
+\r
+               audio_frame_size = bytesPerSec / 25;\r
+               src_audio_frame_size = static_cast<size_t>(static_cast<double>(bytesPerSec) / frame_rate);\r
+\r
+               //make sure the framesize is a multiple of the samplesize\r
+               int sourceSizeMod = src_audio_frame_size % (codec_context->channels * 2);\r
+               if(sourceSizeMod != 0)\r
+                       src_audio_frame_size += (codec_context->channels * 2) - sourceSizeMod;\r
+       }\r
+               \r
+       ~audio_packet()\r
+       {\r
+               scalable_aligned_free(const_cast<uint8_t*>(data));\r
+       }\r
+               \r
+       size_t                                  src_audio_frame_size;\r
+       size_t                                  audio_frame_size;\r
+\r
+       AVCodecContext* const   codec_context;\r
+       const AVCodec* const    codec;\r
+       const size_t                    size;\r
+       const uint8_t* const    data;\r
+\r
+       std::vector<audio_chunk_ptr> audio_chunks;\r
+};\r
+typedef std::shared_ptr<audio_packet> audio_packet_ptr;\r
+\r
+       }\r
+}\r
diff --git a/core/producer/ffmpeg/video/video_decoder.cpp b/core/producer/ffmpeg/video/video_decoder.cpp
new file mode 100644 (file)
index 0000000..09c0dbc
--- /dev/null
@@ -0,0 +1,28 @@
+#include "../../../stdafx.h"\r
+\r
+#include "video_decoder.h"\r
+               \r
+namespace caspar{ namespace ffmpeg{\r
+\r
+struct video_decoder::implementation : boost::noncopyable\r
+{\r
+       video_packet_ptr execute(const video_packet_ptr& video_packet)\r
+       {                               \r
+               if(video_packet->codec->id == CODEC_ID_RAWVIDEO) // TODO: doesnt sws_scale do this?\r
+                       common::image::shuffle(video_packet->frame->data(), video_packet->data, video_packet->size, 3, 2, 1, 0);\r
+               else\r
+               {\r
+                       video_packet->decoded_frame.reset(avcodec_alloc_frame(), av_free);\r
+\r
+                       int frame_finished = 0;\r
+                       if((-avcodec_decode_video(video_packet->codec_context, video_packet->decoded_frame.get(), &frame_finished, video_packet->data, video_packet->size)) > 0)                                                \r
+                               video_packet->decoded_frame.reset();                    \r
+               }\r
+\r
+               return video_packet;            \r
+       }\r
+};\r
+\r
+video_decoder::video_decoder() : impl_(new implementation()){}\r
+video_packet_ptr video_decoder::execute(const video_packet_ptr& video_packet){return impl_->execute(video_packet);}\r
+}}
\ No newline at end of file
diff --git a/core/producer/ffmpeg/video/video_decoder.h b/core/producer/ffmpeg/video/video_decoder.h
new file mode 100644 (file)
index 0000000..303a6f5
--- /dev/null
@@ -0,0 +1,22 @@
+#pragma once\r
+\r
+#include "../packet.h"\r
+\r
+namespace caspar{ namespace ffmpeg{\r
+\r
+typedef std::tr1::shared_ptr<AVCodecContext> AVCodecContextPtr;\r
+\r
+class video_decoder : boost::noncopyable\r
+{\r
+public:\r
+       video_decoder();\r
+       video_packet_ptr execute(const video_packet_ptr& video_packet);\r
+private:\r
+       struct implementation;\r
+       std::shared_ptr<implementation> impl_;\r
+};\r
+typedef std::shared_ptr<video_decoder> video_decoder_ptr;\r
+typedef std::unique_ptr<video_decoder> video_decoder_uptr;\r
+\r
+       }\r
+}
\ No newline at end of file
diff --git a/core/producer/ffmpeg/video/video_deinterlacer.cpp b/core/producer/ffmpeg/video/video_deinterlacer.cpp
new file mode 100644 (file)
index 0000000..e59c6d3
--- /dev/null
@@ -0,0 +1,51 @@
+#include "../../../stdafx.h"\r
+\r
+#include "video_deinterlacer.h"\r
+\r
+#include "../packet.h"\r
+\r
+#include "../../../../common/image/image.h"\r
+\r
+#include <tbb/parallel_for.h>\r
+#include <tbb/atomic.h>\r
+#include <tbb/mutex.h>\r
+#include <tbb/concurrent_queue.h>\r
+\r
+using namespace std::tr1::placeholders;\r
+\r
+namespace caspar\r
+{\r
+       namespace ffmpeg\r
+       {\r
+               \r
+//struct VideoPacketDeinterlacerFilter::Implementation\r
+//{\r
+//     void* process(video_packet* pVideoPacket)\r
+//     {                               \r
+//             avpicture_deinterlace(reinterpret_cast<AVPicture*>(pVideoPacket->pDecodedFrame.get()), reinterpret_cast<AVPicture*>(pVideoPacket->pDecodedFrame.get()), pVideoPacket->codecContext->pix_fmt, pVideoPacket->codecContext->width, pVideoPacket->codecContext->height);\r
+//             return pVideoPacket;    \r
+//     }\r
+//\r
+//     bool is_valid(video_packet* pVideoPacket)\r
+//     {\r
+//             return pVideoPacket->pDecodedFrame != nullptr && pVideoPacket->pDecodedFrame->interlaced_frame;\r
+//     }\r
+//};\r
+//\r
+//VideoPacketDeinterlacerFilter::VideoPacketDeinterlacerFilter()\r
+//     : tbb::filter(parallel), pImpl_(new Implementation())\r
+//{\r
+//}\r
+//\r
+//\r
+//void* VideoPacketDeinterlacerFilter::operator()(void* item)\r
+//{\r
+//     return (*pImpl_)(item);\r
+//}\r
+//\r
+//void VideoPacketDeinterlacerFilter::finalize(void* item)\r
+//{\r
+//     pImpl_->finalize(item);\r
+//}\r
+       }\r
+}
\ No newline at end of file
diff --git a/core/producer/ffmpeg/video/video_deinterlacer.h b/core/producer/ffmpeg/video/video_deinterlacer.h
new file mode 100644 (file)
index 0000000..c420c0c
--- /dev/null
@@ -0,0 +1,22 @@
+#pragma once\r
+\r
+namespace caspar\r
+{\r
+       namespace ffmpeg\r
+       {\r
+//class VideoPacketDeinterlacerFilter : public tbb::filter, private boost::noncopyable\r
+//{\r
+//public:\r
+//     VideoPacketDeinterlacerFilter();\r
+//     void* operator()(void* item);\r
+//     void finalize(void* item);\r
+//\r
+//private:\r
+//     struct Implementation;\r
+//     std::tr1::shared_ptr<Implementation> pImpl_;\r
+//};\r
+//typedef std::shared_ptr<video_ler> video_scer_ptr;\r
+//typedef std::unique_ptr<video_scer> video_scer_uptr;\r
+\r
+       }\r
+}
\ No newline at end of file
diff --git a/core/producer/ffmpeg/video/video_scaler.cpp b/core/producer/ffmpeg/video/video_scaler.cpp
new file mode 100644 (file)
index 0000000..0222f59
--- /dev/null
@@ -0,0 +1,88 @@
+#include "../../../stdafx.h"\r
+\r
+#include "video_scaler.h"\r
+\r
+#include "../../../frame/frame_format.h"\r
+#include "../../../../common/image/image.h"\r
+\r
+#include <tbb/parallel_for.h>\r
+#include <tbb/atomic.h>\r
+#include <tbb/mutex.h>\r
+#include <tbb/concurrent_queue.h>\r
+#include <tbb/scalable_allocator.h>\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (push)\r
+#pragma warning (disable : 4244)\r
+#endif\r
+extern "C" \r
+{\r
+       #define __STDC_CONSTANT_MACROS\r
+       #define __STDC_LIMIT_MACROS\r
+       #include <libswscale/swscale.h>\r
+}\r
+#if defined(_MSC_VER)\r
+#pragma warning (pop)\r
+#endif\r
+\r
+namespace caspar{ namespace ffmpeg{\r
+\r
+typedef std::shared_ptr<SwsContext> SwsContextPtr;\r
+\r
+// TODO: Remove and do copy right into frame\r
+struct fill_frame\r
+{\r
+       fill_frame(size_t width, size_t height) \r
+               : frame(avcodec_alloc_frame(), av_free), buffer(static_cast<unsigned char*>(scalable_aligned_malloc(width*height*4, 16)), scalable_aligned_free)\r
+       {       \r
+               avpicture_fill(reinterpret_cast<AVPicture*>(frame.get()), buffer.get(), PIX_FMT_BGRA, width, height);\r
+       }\r
+       const AVFramePtr        frame;\r
+       const std::shared_ptr<unsigned char>            buffer;\r
+};\r
+typedef std::shared_ptr<fill_frame> fill_frame_ptr;\r
+\r
+struct video_scaler::implementation : boost::noncopyable\r
+{\r
+       video_packet_ptr execute(const video_packet_ptr video_packet)\r
+       {                               \r
+               assert(video_packet);\r
+\r
+               if(!sws_context_)\r
+               {\r
+                       double param;\r
+                       sws_context_.reset(sws_getContext(video_packet->codec_context->width, video_packet->codec_context->height, video_packet->codec_context->pix_fmt, video_packet->format_desc.width, video_packet->format_desc.height, \r
+                                                                                               PIX_FMT_BGRA, SWS_BILINEAR, nullptr, nullptr, &param), sws_freeContext);\r
+               }\r
+               \r
+               //AVFrame avFrame;      \r
+               //avcodec_get_frame_defaults(avFrame);\r
+               //avpicture_fill(reinterpret_cast<AVPicture*>(&avFrame), video_packet->frame->data(), PIX_FMT_BGRA, video_packet->frameFormat.width, video_packet->frameFormat.height);\r
+               \r
+               fill_frame fill_frame(video_packet->format_desc.width, video_packet->format_desc.height);\r
+               int result = sws_scale(sws_context_.get(), video_packet->decoded_frame->data, video_packet->decoded_frame->linesize, 0, video_packet->codec_context->height, fill_frame.frame->data, fill_frame.frame->linesize);\r
+               video_packet->decoded_frame.reset(); // Free memory\r
+               \r
+               if(video_packet->codec->id == CODEC_ID_DVVIDEO) // Move up one field\r
+               {\r
+                       size_t size = video_packet->format_desc.width * video_packet->format_desc.height * 4;\r
+                       size_t linesize = video_packet->format_desc.width * 4;\r
+                       common::image::copy(video_packet->frame->data(), fill_frame.buffer.get() + linesize, size - linesize);\r
+                       common::image::clear(video_packet->frame->data() + size - linesize, linesize);\r
+               }\r
+               else\r
+               {\r
+                        // This copy should be unnecessary. But it seems that when mapping the frame memory to an avframe for scaling there are some artifacts in the picture. See line 59-61.\r
+                       common::image::copy(video_packet->frame->data(), fill_frame.buffer.get(), video_packet->frame->size());\r
+               }\r
+\r
+               return video_packet;    \r
+       }\r
+\r
+private:\r
+       SwsContextPtr sws_context_;\r
+};\r
+\r
+video_scaler::video_scaler() : impl_(new implementation()){}\r
+video_packet_ptr video_scaler::execute(const video_packet_ptr& video_packet){return impl_->execute(video_packet);}\r
+}}
\ No newline at end of file
diff --git a/core/producer/ffmpeg/video/video_scaler.h b/core/producer/ffmpeg/video/video_scaler.h
new file mode 100644 (file)
index 0000000..03aa8a7
--- /dev/null
@@ -0,0 +1,19 @@
+#pragma once\r
+\r
+#include "../packet.h"\r
+\r
+namespace caspar{ namespace ffmpeg{\r
+\r
+class video_scaler : boost::noncopyable\r
+{\r
+public:\r
+       video_scaler();\r
+       video_packet_ptr execute(const video_packet_ptr& video_packet);\r
+private:\r
+       struct implementation;\r
+       std::shared_ptr<implementation> impl_;\r
+};\r
+typedef std::shared_ptr<video_scaler> video_scaler_ptr;\r
+typedef std::unique_ptr<video_scaler> video_scaler_uptr;\r
+\r
+}}
\ No newline at end of file
diff --git a/core/producer/flash/Flash9e.IDL b/core/producer/flash/Flash9e.IDL
new file mode 100644 (file)
index 0000000..c85a3bb
--- /dev/null
@@ -0,0 +1,367 @@
+// Generated .IDL file (by the OLE/COM Object Viewer)\r
+// \r
+// typelib filename: Flash9e.ocx\r
+\r
+[\r
+  uuid(D27CDB6B-AE6D-11CF-96B8-444553540000),\r
+  version(1.0),\r
+  helpstring("Shockwave Flash"),\r
+  custom(DE77BA64-517C-11D1-A2DA-0000F8773CE9, 100663662),\r
+  custom(DE77BA63-517C-11D1-A2DA-0000F8773CE9, 1180654890)\r
+\r
+]\r
+library ShockwaveFlashObjects\r
+{\r
+    // TLib :     // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}\r
+    importlib("stdole2.tlb");\r
+\r
+    // Forward declare all types defined in this typelib\r
+    interface IShockwaveFlash;\r
+    dispinterface _IShockwaveFlashEvents;\r
+    interface IFlashFactory;\r
+    interface IFlashObjectInterface;\r
+    interface IDispatchEx;\r
+    interface IServiceProvider;\r
+\r
+    [\r
+      odl,\r
+      uuid(D27CDB6C-AE6D-11CF-96B8-444553540000),\r
+      helpstring("Shockwave Flash"),\r
+      dual,\r
+      oleautomation\r
+    ]\r
+    interface IShockwaveFlash : IDispatch {\r
+        [id(0xfffffdf3), propget, helpstring("property ReadyState")]\r
+        HRESULT ReadyState([out, retval] long* pVal);\r
+        [id(0x0000007c), propget, helpstring("property TotalFrames")]\r
+        HRESULT TotalFrames([out, retval] long* pVal);\r
+        [id(0x0000007d), propget, helpstring("property Playing")]\r
+        HRESULT Playing([out, retval] VARIANT_BOOL* pVal);\r
+        [id(0x0000007d), propput, helpstring("property Playing")]\r
+        HRESULT Playing([in] VARIANT_BOOL pVal);\r
+        [id(0x00000069), propget, helpstring("property Quality")]\r
+        HRESULT Quality([out, retval] int* pVal);\r
+        [id(0x00000069), propput, helpstring("property Quality")]\r
+        HRESULT Quality([in] int pVal);\r
+        [id(0x00000078), propget, helpstring("property ScaleMode")]\r
+        HRESULT ScaleMode([out, retval] int* pVal);\r
+        [id(0x00000078), propput, helpstring("property ScaleMode")]\r
+        HRESULT ScaleMode([in] int pVal);\r
+        [id(0x00000079), propget, helpstring("property AlignMode")]\r
+        HRESULT AlignMode([out, retval] int* pVal);\r
+        [id(0x00000079), propput, helpstring("property AlignMode")]\r
+        HRESULT AlignMode([in] int pVal);\r
+        [id(0x0000007b), propget, helpstring("property BackgroundColor")]\r
+        HRESULT BackgroundColor([out, retval] long* pVal);\r
+        [id(0x0000007b), propput, helpstring("property BackgroundColor")]\r
+        HRESULT BackgroundColor([in] long pVal);\r
+        [id(0x0000006a), propget, helpstring("property Loop")]\r
+        HRESULT Loop([out, retval] VARIANT_BOOL* pVal);\r
+        [id(0x0000006a), propput, helpstring("property Loop")]\r
+        HRESULT Loop([in] VARIANT_BOOL pVal);\r
+        [id(0x00000066), propget, helpstring("property Movie")]\r
+        HRESULT Movie([out, retval] BSTR* pVal);\r
+        [id(0x00000066), propput, helpstring("property Movie")]\r
+        HRESULT Movie([in] BSTR pVal);\r
+        [id(0x0000006b), propget, helpstring("property FrameNum")]\r
+        HRESULT FrameNum([out, retval] long* pVal);\r
+        [id(0x0000006b), propput, helpstring("property FrameNum")]\r
+        HRESULT FrameNum([in] long pVal);\r
+        [id(0x0000006d), helpstring("method SetZoomRect")]\r
+        HRESULT SetZoomRect(\r
+                        [in] long left, \r
+                        [in] long top, \r
+                        [in] long right, \r
+                        [in] long bottom);\r
+        [id(0x00000076), helpstring("method Zoom")]\r
+        HRESULT Zoom([in] int factor);\r
+        [id(0x00000077), helpstring("method Pan")]\r
+        HRESULT Pan(\r
+                        [in] long x, \r
+                        [in] long y, \r
+                        [in] int mode);\r
+        [id(0x00000070), helpstring("method Play")]\r
+        HRESULT Play();\r
+        [id(0x00000071), helpstring("method Stop")]\r
+        HRESULT Stop();\r
+        [id(0x00000072), helpstring("method Back")]\r
+        HRESULT Back();\r
+        [id(0x00000073), helpstring("method Forward")]\r
+        HRESULT Forward();\r
+        [id(0x00000074), helpstring("method Rewind")]\r
+        HRESULT Rewind();\r
+        [id(0x0000007e), helpstring("method StopPlay")]\r
+        HRESULT StopPlay();\r
+        [id(0x0000007f), helpstring("method GotoFrame")]\r
+        HRESULT GotoFrame([in] long FrameNum);\r
+        [id(0x00000080), helpstring("method CurrentFrame")]\r
+        HRESULT CurrentFrame([out, retval] long* FrameNum);\r
+        [id(0x00000081), helpstring("method IsPlaying")]\r
+        HRESULT IsPlaying([out, retval] VARIANT_BOOL* Playing);\r
+        [id(0x00000082), helpstring("method PercentLoaded")]\r
+        HRESULT PercentLoaded([out, retval] long* percent);\r
+        [id(0x00000083), helpstring("method FrameLoaded")]\r
+        HRESULT FrameLoaded(\r
+                        [in] long FrameNum, \r
+                        [out, retval] VARIANT_BOOL* loaded);\r
+        [id(0x00000084), helpstring("method FlashVersion")]\r
+        HRESULT FlashVersion([out, retval] long* version);\r
+        [id(0x00000085), propget, helpstring("property WMode")]\r
+        HRESULT WMode([out, retval] BSTR* pVal);\r
+        [id(0x00000085), propput, helpstring("property WMode")]\r
+        HRESULT WMode([in] BSTR pVal);\r
+        [id(0x00000086), propget, helpstring("property SAlign")]\r
+        HRESULT SAlign([out, retval] BSTR* pVal);\r
+        [id(0x00000086), propput, helpstring("property SAlign")]\r
+        HRESULT SAlign([in] BSTR pVal);\r
+        [id(0x00000087), propget, helpstring("property Menu")]\r
+        HRESULT Menu([out, retval] VARIANT_BOOL* pVal);\r
+        [id(0x00000087), propput, helpstring("property Menu")]\r
+        HRESULT Menu([in] VARIANT_BOOL pVal);\r
+        [id(0x00000088), propget, helpstring("property Base")]\r
+        HRESULT Base([out, retval] BSTR* pVal);\r
+        [id(0x00000088), propput, helpstring("property Base")]\r
+        HRESULT Base([in] BSTR pVal);\r
+        [id(0x00000089), propget, helpstring("property Scale")]\r
+        HRESULT Scale([out, retval] BSTR* pVal);\r
+        [id(0x00000089), propput, helpstring("property Scale")]\r
+        HRESULT Scale([in] BSTR pVal);\r
+        [id(0x0000008a), propget, helpstring("property DeviceFont")]\r
+        HRESULT DeviceFont([out, retval] VARIANT_BOOL* pVal);\r
+        [id(0x0000008a), propput, helpstring("property DeviceFont")]\r
+        HRESULT DeviceFont([in] VARIANT_BOOL pVal);\r
+        [id(0x0000008b), propget, helpstring("property EmbedMovie")]\r
+        HRESULT EmbedMovie([out, retval] VARIANT_BOOL* pVal);\r
+        [id(0x0000008b), propput, helpstring("property EmbedMovie")]\r
+        HRESULT EmbedMovie([in] VARIANT_BOOL pVal);\r
+        [id(0x0000008c), propget, helpstring("property BGColor")]\r
+        HRESULT BGColor([out, retval] BSTR* pVal);\r
+        [id(0x0000008c), propput, helpstring("property BGColor")]\r
+        HRESULT BGColor([in] BSTR pVal);\r
+        [id(0x0000008d), propget, helpstring("property Quality2")]\r
+        HRESULT Quality2([out, retval] BSTR* pVal);\r
+        [id(0x0000008d), propput, helpstring("property Quality2")]\r
+        HRESULT Quality2([in] BSTR pVal);\r
+        [id(0x0000008e), helpstring("method LoadMovie")]\r
+        HRESULT LoadMovie(\r
+                        [in] int layer, \r
+                        [in] BSTR url);\r
+        [id(0x0000008f), helpstring("method TGotoFrame")]\r
+        HRESULT TGotoFrame(\r
+                        [in] BSTR target, \r
+                        [in] long FrameNum);\r
+        [id(0x00000090), helpstring("method TGotoLabel")]\r
+        HRESULT TGotoLabel(\r
+                        [in] BSTR target, \r
+                        [in] BSTR label);\r
+        [id(0x00000091), helpstring("method TCurrentFrame")]\r
+        HRESULT TCurrentFrame(\r
+                        [in] BSTR target, \r
+                        [out, retval] long* FrameNum);\r
+        [id(0x00000092), helpstring("method TCurrentLabel")]\r
+        HRESULT TCurrentLabel(\r
+                        [in] BSTR target, \r
+                        [out, retval] BSTR* pVal);\r
+        [id(0x00000093), helpstring("method TPlay")]\r
+        HRESULT TPlay([in] BSTR target);\r
+        [id(0x00000094), helpstring("method TStopPlay")]\r
+        HRESULT TStopPlay([in] BSTR target);\r
+        [id(0x00000097), helpstring("method SetVariable")]\r
+        HRESULT SetVariable(\r
+                        [in] BSTR name, \r
+                        [in] BSTR value);\r
+        [id(0x00000098), helpstring("method GetVariable")]\r
+        HRESULT GetVariable(\r
+                        [in] BSTR name, \r
+                        [out, retval] BSTR* pVal);\r
+        [id(0x00000099), helpstring("method TSetProperty")]\r
+        HRESULT TSetProperty(\r
+                        [in] BSTR target, \r
+                        [in] int property, \r
+                        [in] BSTR value);\r
+        [id(0x0000009a), helpstring("method TGetProperty")]\r
+        HRESULT TGetProperty(\r
+                        [in] BSTR target, \r
+                        [in] int property, \r
+                        [out, retval] BSTR* pVal);\r
+        [id(0x0000009b), helpstring("method TCallFrame")]\r
+        HRESULT TCallFrame(\r
+                        [in] BSTR target, \r
+                        [in] int FrameNum);\r
+        [id(0x0000009c), helpstring("method TCallLabel")]\r
+        HRESULT TCallLabel(\r
+                        [in] BSTR target, \r
+                        [in] BSTR label);\r
+        [id(0x0000009d), helpstring("method TSetPropertyNum")]\r
+        HRESULT TSetPropertyNum(\r
+                        [in] BSTR target, \r
+                        [in] int property, \r
+                        [in] double value);\r
+        [id(0x0000009e), helpstring("method TGetPropertyNum")]\r
+        HRESULT TGetPropertyNum(\r
+                        [in] BSTR target, \r
+                        [in] int property, \r
+                        [out, retval] double* pVal);\r
+        [id(0x000000ac), helpstring("method TGetPropertyAsNumber")]\r
+        HRESULT TGetPropertyAsNumber(\r
+                        [in] BSTR target, \r
+                        [in] int property, \r
+                        [out, retval] double* pVal);\r
+        [id(0x0000009f), propget, helpstring("property SWRemote")]\r
+        HRESULT SWRemote([out, retval] BSTR* pVal);\r
+        [id(0x0000009f), propput, helpstring("property SWRemote")]\r
+        HRESULT SWRemote([in] BSTR pVal);\r
+        [id(0x000000aa), propget, helpstring("property FlashVars")]\r
+        HRESULT FlashVars([out, retval] BSTR* pVal);\r
+        [id(0x000000aa), propput, helpstring("property FlashVars")]\r
+        HRESULT FlashVars([in] BSTR pVal);\r
+        [id(0x000000ab), propget, helpstring("property AllowScriptAccess")]\r
+        HRESULT AllowScriptAccess([out, retval] BSTR* pVal);\r
+        [id(0x000000ab), propput, helpstring("property AllowScriptAccess")]\r
+        HRESULT AllowScriptAccess([in] BSTR pVal);\r
+        [id(0x000000be), propget, helpstring("property MovieData")]\r
+        HRESULT MovieData([out, retval] BSTR* pVal);\r
+        [id(0x000000be), propput, helpstring("property MovieData")]\r
+        HRESULT MovieData([in] BSTR pVal);\r
+        [id(0x000000bf), propget, helpstring("property inline-data")]\r
+        HRESULT InlineData([out, retval] IUnknown** ppIUnknown);\r
+        [id(0x000000bf), propput, helpstring("property inline-data")]\r
+        HRESULT InlineData([in] IUnknown* ppIUnknown);\r
+        [id(0x000000c0), propget, helpstring("property SeamlessTabbing")]\r
+        HRESULT SeamlessTabbing([out, retval] VARIANT_BOOL* pVal);\r
+        [id(0x000000c0), propput, helpstring("property SeamlessTabbing")]\r
+        HRESULT SeamlessTabbing([in] VARIANT_BOOL pVal);\r
+        [id(0x000000c1), helpstring("method EnforceLocalSecurity")]\r
+        HRESULT EnforceLocalSecurity();\r
+        [id(0x000000c2), propget, helpstring("property Profile")]\r
+        HRESULT Profile([out, retval] VARIANT_BOOL* pVal);\r
+        [id(0x000000c2), propput, helpstring("property Profile")]\r
+        HRESULT Profile([in] VARIANT_BOOL pVal);\r
+        [id(0x000000c3), propget, helpstring("property ProfileAddress")]\r
+        HRESULT ProfileAddress([out, retval] BSTR* pVal);\r
+        [id(0x000000c3), propput, helpstring("property ProfileAddress")]\r
+        HRESULT ProfileAddress([in] BSTR pVal);\r
+        [id(0x000000c4), propget, helpstring("property ProfilePort")]\r
+        HRESULT ProfilePort([out, retval] long* pVal);\r
+        [id(0x000000c4), propput, helpstring("property ProfilePort")]\r
+        HRESULT ProfilePort([in] long pVal);\r
+        [id(0x000000c6), helpstring("method Call")]\r
+        HRESULT CallFunction(\r
+                        [in] BSTR request, \r
+                        [out, retval] BSTR* response);\r
+        [id(0x000000c7), helpstring("method SetReturnValue")]\r
+        HRESULT SetReturnValue([in] BSTR returnValue);\r
+        [id(0x000000c8), helpstring("method DisableLocalSecurity")]\r
+        HRESULT DisableLocalSecurity();\r
+        [id(0x000000c9), propget, helpstring("property AllowNetworking")]\r
+        HRESULT AllowNetworking([out, retval] BSTR* pVal);\r
+        [id(0x000000c9), propput, helpstring("property AllowNetworking")]\r
+        HRESULT AllowNetworking([in] BSTR pVal);\r
+        [id(0x000000ca), propget, helpstring("property AllowFullScreen")]\r
+        HRESULT AllowFullScreen([out, retval] BSTR* pVal);\r
+        [id(0x000000ca), propput, helpstring("property AllowFullScreen")]\r
+        HRESULT AllowFullScreen([in] BSTR pVal);\r
+    };\r
+\r
+    [\r
+      uuid(D27CDB6D-AE6D-11CF-96B8-444553540000),\r
+      helpstring("Event interface for Shockwave Flash"),\r
+         hidden\r
+    ]\r
+    dispinterface _IShockwaveFlashEvents {\r
+        properties:\r
+        methods:\r
+            [id(0xfffffd9f)]\r
+            void OnReadyStateChange(long newState);\r
+            [id(0x000007a6)]\r
+            void OnProgress(long percentDone);\r
+            [id(0x00000096)]\r
+            void FSCommand(\r
+                            [in] BSTR command, \r
+                            [in] BSTR args);\r
+            [id(0x000000c5)]\r
+            void FlashCall([in] BSTR request);\r
+    };\r
+\r
+    [\r
+      uuid(D27CDB6E-AE6D-11CF-96B8-444553540000),\r
+      helpstring("Shockwave Flash")\r
+    ]\r
+    coclass ShockwaveFlash {\r
+        [default] interface IShockwaveFlash;\r
+        [default, source] dispinterface _IShockwaveFlashEvents;\r
+    };\r
+\r
+    [\r
+      odl,\r
+      uuid(D27CDB70-AE6D-11CF-96B8-444553540000),\r
+      helpstring("IFlashFactory Interface")\r
+    ]\r
+    interface IFlashFactory : IUnknown {\r
+    };\r
+\r
+    [\r
+      odl,\r
+      uuid(D27CDB72-AE6D-11CF-96B8-444553540000),\r
+      helpstring("IFlashObjectInterface Interface")\r
+    ]\r
+    interface IFlashObjectInterface : IDispatchEx {\r
+    };\r
+\r
+    [\r
+      odl,\r
+      uuid(A6EF9860-C720-11D0-9337-00A0C90DCAA9)\r
+    ]\r
+    interface IDispatchEx : IDispatch {\r
+        HRESULT _stdcall GetDispID(\r
+                        [in] BSTR bstrName, \r
+                        [in] unsigned long grfdex, \r
+                        [out] long* pid);\r
+        HRESULT _stdcall RemoteInvokeEx(\r
+                        [in] long id, \r
+                        [in] unsigned long lcid, \r
+                        [in] unsigned long dwFlags, \r
+                        [in] DISPPARAMS* pdp, \r
+                        [out] VARIANT* pvarRes, \r
+                        [out] EXCEPINFO* pei, \r
+                        [in] IServiceProvider* pspCaller, \r
+                        [in] unsigned int cvarRefArg, \r
+                        [in] unsigned int* rgiRefArg, \r
+                        [in, out] VARIANT* rgvarRefArg);\r
+        HRESULT _stdcall DeleteMemberByName(\r
+                        [in] BSTR bstrName, \r
+                        [in] unsigned long grfdex);\r
+        HRESULT _stdcall DeleteMemberByDispID([in] long id);\r
+        HRESULT _stdcall GetMemberProperties(\r
+                        [in] long id, \r
+                        [in] unsigned long grfdexFetch, \r
+                        [out] unsigned long* pgrfdex);\r
+        HRESULT _stdcall GetMemberName(\r
+                        [in] long id, \r
+                        [out] BSTR* pbstrName);\r
+        HRESULT _stdcall GetNextDispID(\r
+                        [in] unsigned long grfdex, \r
+                        [in] long id, \r
+                        [out] long* pid);\r
+        HRESULT _stdcall GetNameSpaceParent([out] IUnknown** ppunk);\r
+    };\r
+\r
+    [\r
+      odl,\r
+      uuid(6D5140C1-7436-11CE-8034-00AA006009FA)\r
+    ]\r
+    interface IServiceProvider : IUnknown {\r
+        HRESULT _stdcall RemoteQueryService(\r
+                        [in] GUID* guidService, \r
+                        [in] GUID* riid, \r
+                        [out] IUnknown** ppvObject);\r
+    };\r
+\r
+    [\r
+      uuid(D27CDB71-AE6D-11CF-96B8-444553540000),\r
+      helpstring("IFlashObjectInterface Interface")\r
+    ]\r
+    coclass FlashObjectInterface {\r
+        [default] interface IFlashObjectInterface;\r
+    };\r
+};\r
diff --git a/core/producer/flash/Flash9e_i.c b/core/producer/flash/Flash9e_i.c
new file mode 100644 (file)
index 0000000..3cc610e
--- /dev/null
@@ -0,0 +1,103 @@
+\r
+\r
+/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */\r
+\r
+/* link this file in with the server and any clients */\r
+\r
+\r
+ /* File created by MIDL compiler version 6.00.0366 */\r
+/* at Tue Mar 18 13:05:00 2008\r
+ */\r
+/* Compiler settings for .\flash\Flash9e.IDL:\r
+    Oicf, W4, Zp8, env=Win32 (32b run)\r
+    protocol : dce , ms_ext, c_ext, robust\r
+    error checks: allocation ref bounds_check enum stub_data \r
+    VC __declspec() decoration level: \r
+         __declspec(uuid()), __declspec(selectany), __declspec(novtable)\r
+         DECLSPEC_UUID(), MIDL_INTERFACE()\r
+*/\r
+//@@MIDL_FILE_HEADING(  )\r
+\r
+#pragma warning( disable: 4049 )  /* more than 64k source lines */\r
+\r
+\r
+#ifdef __cplusplus\r
+extern "C"{\r
+#endif \r
+\r
+\r
+#include <rpc.h>\r
+#include <rpcndr.h>\r
+\r
+#ifdef _MIDL_USE_GUIDDEF_\r
+\r
+#ifndef INITGUID\r
+#define INITGUID\r
+#include <guiddef.h>\r
+#undef INITGUID\r
+#else\r
+#include <guiddef.h>\r
+#endif\r
+\r
+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \\r
+        DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)\r
+\r
+#else // !_MIDL_USE_GUIDDEF_\r
+\r
+#ifndef __IID_DEFINED__\r
+#define __IID_DEFINED__\r
+\r
+typedef struct _IID\r
+{\r
+    unsigned long x;\r
+    unsigned short s1;\r
+    unsigned short s2;\r
+    unsigned char  c[8];\r
+} IID;\r
+\r
+#endif // __IID_DEFINED__\r
+\r
+#ifndef CLSID_DEFINED\r
+#define CLSID_DEFINED\r
+typedef IID CLSID;\r
+#endif // CLSID_DEFINED\r
+\r
+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \\r
+        const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}\r
+\r
+#endif !_MIDL_USE_GUIDDEF_\r
+\r
+MIDL_DEFINE_GUID(IID, LIBID_ShockwaveFlashObjects,0xD27CDB6B,0xAE6D,0x11CF,0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IShockwaveFlash,0xD27CDB6C,0xAE6D,0x11CF,0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, DIID__IShockwaveFlashEvents,0xD27CDB6D,0xAE6D,0x11CF,0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IFlashFactory,0xD27CDB70,0xAE6D,0x11CF,0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IDispatchEx,0xA6EF9860,0xC720,0x11D0,0x93,0x37,0x00,0xA0,0xC9,0x0D,0xCA,0xA9);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IFlashObjectInterface,0xD27CDB72,0xAE6D,0x11CF,0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00);\r
+\r
+\r
+MIDL_DEFINE_GUID(IID, IID_IServiceProvider,0x6D5140C1,0x7436,0x11CE,0x80,0x34,0x00,0xAA,0x00,0x60,0x09,0xFA);\r
+\r
+\r
+MIDL_DEFINE_GUID(CLSID, CLSID_ShockwaveFlash,0xD27CDB6E,0xAE6D,0x11CF,0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00);\r
+\r
+\r
+MIDL_DEFINE_GUID(CLSID, CLSID_FlashObjectInterface,0xD27CDB71,0xAE6D,0x11CF,0x96,0xB8,0x44,0x45,0x53,0x54,0x00,0x00);\r
+\r
+#undef MIDL_DEFINE_GUID\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+\r
+\r
diff --git a/core/producer/flash/FlashAxContainer.cpp b/core/producer/flash/FlashAxContainer.cpp
new file mode 100644 (file)
index 0000000..c8b0bb1
--- /dev/null
@@ -0,0 +1,902 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "..\..\stdafx.h"\r
+\r
+#include "FlashAxContainer.h"\r
+#include "..\..\frame\frame_format.h"\r
+#include "..\..\protocol\monitor\Monitor.h"\r
+#include "flash_producer.h"\r
+#include "TimerHelper.h"\r
+\r
+using namespace ATL;\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (push, 1) // TODO: Legacy code, just disable warnings\r
+#endif\r
+\r
+namespace caspar {\r
+namespace flash {\r
+\r
+CComBSTR FlashAxContainer::flashGUID_(_T("{D27CDB6E-AE6D-11CF-96B8-444553540000}"));\r
+\r
+_ATL_FUNC_INFO fnInfoFlashCallEvent = { CC_STDCALL, VT_EMPTY, 1, { VT_BSTR } };\r
+_ATL_FUNC_INFO fnInfoReadyStateChangeEvent = { CC_STDCALL, VT_EMPTY, 1, { VT_I4 } };\r
+\r
+FlashAxContainer::FlashAxContainer() : pflash_producer_(0), bInPlaceActive_(FALSE), pTimerHelper(0), lastTime_(0)\r
+{\r
+       bInvalidRect_ = false;\r
+       bCallSuccessful_ = false;\r
+       bReadyToRender_ = false;\r
+       bIsEmpty_ = false;\r
+       bHasNewTiming_ = false;\r
+}\r
+FlashAxContainer::~FlashAxContainer()\r
+{\r
+//     ReleaseAll();\r
+       if(pTimerHelper != 0)\r
+               delete pTimerHelper;\r
+\r
+       CASPAR_LOG(info) << "[FlashAxContainer] Destroyed";\r
+}\r
+\r
+\r
+///////////////////\r
+// IObjectWithSite\r
+///////////////////\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::SetSite(IUnknown* pUnkSite)\r
+{\r
+       ATLTRACE(_T("IObjectWithSite::SetSite\n"));\r
+       HRESULT hr = IObjectWithSiteImpl<FlashAxContainer>::SetSite(pUnkSite);\r
+\r
+       if (SUCCEEDED(hr) && m_spUnkSite)\r
+       {\r
+               // Look for "outer" IServiceProvider\r
+               hr = m_spUnkSite->QueryInterface(__uuidof(IServiceProvider), (void**)&m_spServices);\r
+               ATLASSERT( !hr && _T("No ServiceProvider!") );\r
+       }\r
+\r
+       if (pUnkSite == NULL)\r
+               m_spServices.Release();\r
+\r
+       return hr;\r
+}\r
+\r
+///////////////////\r
+// IOleClientSite\r
+///////////////////\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::SaveObject()\r
+{\r
+       ATLTRACENOTIMPL(_T("IOleClientSite::SaveObject"));\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk)\r
+{\r
+/*     if(*ppmk != NULL) {\r
+               if(m_spMyMoniker == NULL) {\r
+                       ATL::CComObject<MyMoniker>* pMoniker = NULL;\r
+                       HRESULT hr = ATL::CComObject<MyMoniker>::CreateInstance(&pMoniker);\r
+                       if(SUCCEEDED(hr))\r
+                               m_spMyMoniker = pMoniker;\r
+               }\r
+\r
+               if(m_spMyMoniker != NULL) {\r
+                       *ppmk = m_spMyMoniker;\r
+                       (*ppmk)->AddRef();\r
+                       return S_OK;\r
+               }\r
+       }\r
+*/     if(ppmk != NULL)\r
+               *ppmk = NULL;\r
+       return E_FAIL;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::GetContainer(IOleContainer** ppContainer)\r
+{\r
+       ATLTRACE(_T("IOleClientSite::GetContainer\n"));\r
+       (*ppContainer) = NULL;\r
+       return E_NOINTERFACE;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::ShowObject()\r
+{\r
+       ATLTRACE(_T("IOleClientSite::ShowObject\n"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::OnShowWindow(BOOL fShow)\r
+{\r
+       ATLTRACE(_T("IOleClientSite::OnShowWindow"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::RequestNewObjectLayout()\r
+{\r
+       ATLTRACE(_T("IOleClientSite::RequestNewObjectLayout"));\r
+       return S_OK;\r
+}\r
+\r
+///////////////////\r
+// IOleInPlaceSite\r
+///////////////////\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::GetWindow(HWND* pHwnd)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSite::GetWindow\n"));\r
+       (*pHwnd) = NULL;//GetApplication()->GetMainWindow()->getHwnd();\r
+       return E_FAIL;\r
+}\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::ContextSensitiveHelp(BOOL fEnterMode)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSite::ContextSensitiveHelp"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::CanInPlaceActivate()\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSite::CanInPlaceActivate\n"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::OnInPlaceActivate()\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSite::OnInPlaceActivate"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::OnUIActivate()\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSite::OnUIActivate\n"));\r
+       bUIActive_ = TRUE;\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::GetWindowContext(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO pFrameInfo)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSite::GetWindowContext\n"));\r
+       if (ppFrame != NULL)\r
+               *ppFrame = NULL;\r
+       if (ppDoc != NULL)\r
+               *ppDoc = NULL;\r
+\r
+       if (ppFrame == NULL || ppDoc == NULL || lprcPosRect == NULL || lprcClipRect == NULL)\r
+               return E_POINTER;\r
+\r
+       pFrameInfo->fMDIApp = FALSE;\r
+       pFrameInfo->haccel = NULL;\r
+       pFrameInfo->cAccelEntries = 0;\r
+       pFrameInfo->hwndFrame = NULL;\r
+\r
+       lprcPosRect->top = m_rcPos.top;\r
+       lprcPosRect->left = m_rcPos.left;\r
+       lprcPosRect->right = m_rcPos.right;\r
+       lprcPosRect->bottom = m_rcPos.bottom;\r
+\r
+       lprcClipRect->top = m_rcPos.top;\r
+       lprcClipRect->left = m_rcPos.left;\r
+       lprcClipRect->right = m_rcPos.right;\r
+       lprcClipRect->bottom = m_rcPos.bottom;\r
+\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::Scroll(SIZE scrollExtant)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSite::Scroll"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::OnUIDeactivate(BOOL fUndoable)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSite::OnUIDeactivate\n"));\r
+       bUIActive_ = FALSE;\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::OnInPlaceDeactivate()\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSite::OnInPlaceDeactivate\n"));\r
+       bInPlaceActive_ = FALSE;\r
+       m_spInPlaceObjectWindowless.Release();\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::DiscardUndoState()\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSite::DiscardUndoState"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::DeactivateAndUndo()\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSite::DeactivateAndUndo"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::OnPosRectChange(LPCRECT lprcPosRect)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSite::OnPosRectChange"));\r
+       return S_OK;\r
+}\r
+\r
+\r
+/////////////////////\r
+// IOleInPlaceSiteEx\r
+/////////////////////\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::OnInPlaceActivateEx(BOOL* pfNoRedraw, DWORD dwFlags)\r
+{\r
+       // should only be called once the first time control is inplace-activated\r
+       ATLTRACE(_T("IOleInPlaceSiteEx::OnInPlaceActivateEx\n"));\r
+       ATLASSERT(bInPlaceActive_ == FALSE);\r
+       ATLASSERT(m_spInPlaceObjectWindowless == NULL);\r
+\r
+       bInPlaceActive_ = TRUE;\r
+       OleLockRunning(m_spOleObject, TRUE, FALSE);\r
+       HRESULT hr = E_FAIL;\r
+       if (dwFlags & ACTIVATE_WINDOWLESS)\r
+       {\r
+               hr = m_spOleObject->QueryInterface(__uuidof(IOleInPlaceObjectWindowless), (void**) &m_spInPlaceObjectWindowless);\r
+\r
+               if (m_spInPlaceObjectWindowless != NULL)\r
+                       m_spInPlaceObjectWindowless->SetObjectRects(&m_rcPos, &m_rcPos);\r
+       }\r
+\r
+       return (m_spInPlaceObjectWindowless != NULL) ? S_OK : E_FAIL;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::OnInPlaceDeactivateEx(BOOL fNoRedraw)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSiteEx::OnInPlaceDeactivateEx\n"));\r
+       bInPlaceActive_ = FALSE;\r
+       m_spInPlaceObjectWindowless.Release();\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::RequestUIActivate()\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSiteEx::RequestUIActivate\n"));\r
+       return S_OK;\r
+}\r
+\r
+\r
+/////////////////////////////\r
+// IOleInPlaceSiteWindowless\r
+/////////////////////////////\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::CanWindowlessActivate()\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSiteWindowless::CanWindowlessActivate\n"));\r
+       return S_OK;\r
+//     return S_FALSE;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::GetCapture()\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSiteWindowless::GetCapture\n"));\r
+       return bCapture_ ? S_OK : S_FALSE;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::SetCapture(BOOL fCapture)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSiteWindowless::SetCapture\n"));\r
+       bCapture_ = fCapture;\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::GetFocus()\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSiteWindowless::GetFocus\n"));\r
+       return bHaveFocus_ ? S_OK : S_FALSE;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::SetFocus(BOOL fGotFocus)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSiteWindowless::SetFocus\n"));\r
+       bHaveFocus_ = fGotFocus;\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::GetDC(LPCRECT pRect, DWORD grfFlags, HDC* phDC)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSiteWindowless::GetDC"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::ReleaseDC(HDC hDC)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSiteWindowless::ReleaseDC"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::InvalidateRect(LPCRECT pRect, BOOL fErase)\r
+{\r
+//     ATLTRACE(_T("IOleInPlaceSiteWindowless::InvalidateRect\n"));\r
+       \r
+       bInvalidRect_ = true;\r
+\r
+/*     //Keep a list of dirty rectangles in order to be able to redraw only them\r
+       if(pRect != NULL) {\r
+               bDirtyRects_.push_back(DirtyRect(*pRect, fErase != 0));\r
+       }\r
+       else {\r
+               bDirtyRects_.push_back(DirtyRect(true));\r
+       }\r
+*/     return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::InvalidateRgn(HRGN hRGN, BOOL fErase)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSiteWindowless::InvalidateRng\n"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::ScrollRect(INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSiteWindowless::ScrollRect"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::AdjustRect(LPRECT prc)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSiteWindowless::AdjustRect"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::OnDefWindowMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult)\r
+{\r
+       ATLTRACE(_T("IOleInPlaceSiteWindowless::OnDefWindowMessage"));\r
+       return S_OK;\r
+}\r
+\r
+///////////////////\r
+// IOleControlSite\r
+///////////////////\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::OnControlInfoChanged()\r
+{\r
+       ATLTRACE(_T("IOleControlSite::OnControlInfoChanged"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::LockInPlaceActive(BOOL fLock)\r
+{\r
+       ATLTRACE(_T("IOleControlSite::LockInPlaceActive"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::GetExtendedControl(IDispatch** ppDisp)\r
+{\r
+       ATLTRACE(_T("IOleControlSite::GetExtendedControl"));\r
+\r
+       if (ppDisp == NULL)\r
+               return E_POINTER;\r
+       return m_spOleObject.QueryInterface(ppDisp);\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::TransformCoords(POINTL* pPtlHimetric, POINTF* pPtfContainer, DWORD dwFlags)\r
+{\r
+       ATLTRACE(_T("IOleControlSite::TransformCoords"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::TranslateAccelerator(LPMSG lpMsg, DWORD grfModifiers)\r
+{\r
+       ATLTRACE(_T("IOleControlSite::TranslateAccelerator"));\r
+       return S_FALSE;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::OnFocus(BOOL fGotFocus)\r
+{\r
+       bHaveFocus_ = fGotFocus;\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::ShowPropertyFrame()\r
+{\r
+       ATLTRACE(_T("IOleControlSite::ShowPropertyFrame"));\r
+       return S_OK;\r
+}\r
+\r
+\r
+///////////////////\r
+// IAdviseSink\r
+///////////////////\r
+void STDMETHODCALLTYPE FlashAxContainer::OnDataChange(FORMATETC* pFormatetc, STGMEDIUM* pStgmed)\r
+{\r
+       ATLTRACE(_T("IAdviseSink::OnDataChange\n"));\r
+}\r
+\r
+void STDMETHODCALLTYPE FlashAxContainer::OnViewChange(DWORD dwAspect, LONG lindex)\r
+{\r
+       ATLTRACE(_T("IAdviseSink::OnViewChange\n"));\r
+}\r
+\r
+void STDMETHODCALLTYPE FlashAxContainer::OnRename(IMoniker* pmk)\r
+{\r
+       ATLTRACE(_T("IAdviseSink::OnRename\n"));\r
+}\r
+\r
+void STDMETHODCALLTYPE FlashAxContainer::OnSave()\r
+{\r
+       ATLTRACE(_T("IAdviseSink::OnSave\n"));\r
+}\r
+\r
+void STDMETHODCALLTYPE FlashAxContainer::OnClose()\r
+{\r
+       ATLTRACE(_T("IAdviseSink::OnClose\n"));\r
+}\r
+\r
+\r
+///////////////////\r
+// IServiceProvider\r
+///////////////////\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::QueryService( REFGUID rsid, REFIID riid, void** ppvObj) \r
+{\r
+//     ATLTRACE(_T("IServiceProvider::QueryService\n"));\r
+       //the flashcontrol asks for an interface {618F8AD4-8B7A-11D0-8FCC-00C04FD9189D}, this is IID for a DirectDraw3 object\r
+\r
+       ATLASSERT(ppvObj != NULL);\r
+       if (ppvObj == NULL)\r
+               return E_POINTER;\r
+       *ppvObj = NULL;\r
+\r
+       //TODO: The fullscreen-consumer requires that ths does NOT return an ITimerService\r
+       HRESULT hr = QueryInterface(riid, ppvObj);//E_NOINTERFACE;\r
+\r
+       return hr;\r
+}\r
+\r
+\r
+///////////////////\r
+// ITimerService\r
+///////////////////\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::CreateTimer(ITimer *pReferenceTimer, ITimer **ppNewTimer)\r
+{\r
+       ATLTRACE(_T("ITimerService::CreateTimer\n"));\r
+       if(pTimerHelper != 0)\r
+       {\r
+               delete pTimerHelper;\r
+               pTimerHelper = 0;\r
+       }\r
+       pTimerHelper = new TimerHelper();\r
+       return QueryInterface(__uuidof(ITimer), (void**) ppNewTimer);\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::GetNamedTimer(REFGUID rguidName, ITimer **ppTimer)\r
+{\r
+       ATLTRACE(_T("ITimerService::GetNamedTimer"));\r
+       if(ppTimer == NULL)\r
+               return E_POINTER;\r
+       else\r
+               *ppTimer = NULL;\r
+\r
+       return E_FAIL;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::SetNamedTimerReference(REFGUID rguidName, ITimer *pReferenceTimer)\r
+{\r
+       ATLTRACE(_T("ITimerService::SetNamedTimerReference"));\r
+       return S_OK;\r
+}\r
+\r
+///////////\r
+// ITimer\r
+///////////\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::Advise(VARIANT vtimeMin, VARIANT vtimeMax, VARIANT vtimeInterval, DWORD dwFlags, ITimerSink *pTimerSink, DWORD *pdwCookie)\r
+{\r
+       ATLTRACE(_T("Timer::Advise\n"));\r
+       if(pdwCookie == 0)\r
+               return E_POINTER;\r
+\r
+       if(pTimerHelper != 0)\r
+       {\r
+               pTimerHelper->Setup(vtimeMin.ulVal, vtimeInterval.ulVal, pTimerSink);\r
+               *pdwCookie = pTimerHelper->ID;\r
+               bHasNewTiming_ = true;\r
+\r
+               return S_OK;\r
+       }\r
+       else\r
+               return E_OUTOFMEMORY;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::Unadvise(/* [in] */ DWORD dwCookie)\r
+{\r
+       ATLTRACE(_T("Timer::Unadvice\n"));\r
+       if(pTimerHelper != 0)\r
+       {\r
+               pTimerHelper->pTimerSink = 0;\r
+               return S_OK;\r
+       }\r
+       else\r
+               return E_FAIL;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::Freeze(/* [in] */ BOOL fFreeze)\r
+{\r
+       ATLTRACE(_T("Timer::Freeze\n"));\r
+       return S_OK;\r
+}\r
+\r
+HRESULT STDMETHODCALLTYPE FlashAxContainer::GetTime(/* [out] */ VARIANT *pvtime)\r
+{\r
+       ATLTRACE(_T("Timer::GetTime\n"));\r
+       if(pvtime == 0)\r
+               return E_POINTER;\r
+\r
+//     return E_NOTIMPL;\r
+       pvtime->lVal = 0;\r
+       return S_OK;\r
+}\r
+\r
+int FlashAxContainer::GetFPS() {\r
+       if(pTimerHelper != 0 && pTimerHelper->interval > 0)\r
+               return (1000 / pTimerHelper->interval);\r
+       \r
+       return 0;\r
+}\r
+\r
+bool FlashAxContainer::IsReadyToRender() const {\r
+       return bReadyToRender_;\r
+}\r
+\r
+void FlashAxContainer::EnterFullscreen()\r
+{\r
+       if(m_spInPlaceObjectWindowless != 0)\r
+       {\r
+               HRESULT result;\r
+               m_spInPlaceObjectWindowless->OnWindowMessage(WM_LBUTTONDOWN, 0, MAKELPARAM(1, 1), &result);\r
+               m_spInPlaceObjectWindowless->OnWindowMessage(WM_LBUTTONUP, 0, MAKELPARAM(1, 1), &result);\r
+       }\r
+}\r
+\r
+void STDMETHODCALLTYPE FlashAxContainer::OnFlashCall(BSTR request)\r
+{\r
+       std::wstring str(request);\r
+       if(str.find(TEXT("DisplayedTemplate")) != std::wstring::npos)\r
+       {\r
+               ATLTRACE(_T("ShockwaveFlash::DisplayedTemplate\n"));\r
+               bReadyToRender_ = true;\r
+       }\r
+       else if(str.find(TEXT("OnCommand")) != std::wstring::npos) {\r
+               //this is how templatehost 1.8 reports that a command has been received\r
+               CASPAR_LOG(info) << "TEMPLATEHOST: " << str;\r
+               bCallSuccessful_ = true;\r
+       }\r
+       else if(str.find(TEXT("Activity")) != std::wstring::npos)\r
+       {\r
+               CASPAR_LOG(info) << "TEMPLATEHOST: " << str;\r
+\r
+               //this is how templatehost 1.7 reports that a command has been received\r
+               if(str.find(TEXT("Command recieved")) != std::wstring::npos)\r
+                       bCallSuccessful_ = true;\r
+\r
+               /*if(pflash_producer_ != 0 && pflash_producer_->pMonitor_) {\r
+                       std::wstring::size_type pos = str.find(TEXT('@'));\r
+                       if(pos != std::wstring::npos)\r
+                               pflash_producer_->GetMonitor()->Inform(str.substr(pos, str.find(TEXT('<'), pos)-pos));\r
+               }*/\r
+       }\r
+       else if(str.find(TEXT("OnNotify")) != std::wstring::npos)\r
+       {\r
+               CASPAR_LOG(info) << "TEMPLATEHOST: " << str;\r
+\r
+               //if(pflash_producer_ != 0 && pflash_producer_->pMonitor_) {\r
+               //      std::wstring::size_type pos = str.find(TEXT('@'));\r
+               //      if(pos != std::wstring::npos)\r
+               //              pflash_producer_->pMonitor_->Inform(str.substr(pos, str.find(TEXT('<'), pos)-pos));\r
+               //}\r
+       }\r
+       else if(str.find(TEXT("IsEmpty")) != std::wstring::npos)\r
+       {\r
+               ATLTRACE(_T("ShockwaveFlash::IsEmpty\n"));\r
+               bIsEmpty_ = true;\r
+       }\r
+       else if(str.find(TEXT("OnError")) != std::wstring::npos)\r
+       {\r
+               CASPAR_LOG(error) << "FLASHERROR: " << str;\r
+       }\r
+\r
+       CComPtr<IShockwaveFlash> spFlash;\r
+       HRESULT hr = m_spOleObject->QueryInterface(__uuidof(IShockwaveFlash), (void**) &spFlash);\r
+       if(hr == S_OK && spFlash)\r
+       {\r
+               hr = spFlash->SetReturnValue(TEXT("<null/>"));\r
+       }\r
+}\r
+\r
+void STDMETHODCALLTYPE FlashAxContainer::OnReadyStateChange(long newState)\r
+{\r
+       if(newState == 4)\r
+       {\r
+               bReadyToRender_ = true;\r
+       }\r
+       else\r
+               bReadyToRender_ = false;\r
+}\r
+\r
+void FlashAxContainer::DestroyAxControl()\r
+{\r
+       GetControllingUnknown()->AddRef();\r
+\r
+       if ((!m_spViewObject) == false)\r
+               m_spViewObject->SetAdvise(DVASPECT_CONTENT, 0, NULL);\r
+\r
+       if ((!m_spOleObject) == false)\r
+       {\r
+               DispEventUnadvise(m_spOleObject, &DIID__IShockwaveFlashEvents);\r
+               m_spOleObject->Unadvise(m_dwOleObject);\r
+               m_spOleObject->Close(OLECLOSE_NOSAVE);\r
+               m_spOleObject->SetClientSite(NULL);\r
+       }\r
+\r
+       if ((!m_spUnknown) == false)\r
+       {\r
+               CComPtr<IObjectWithSite> spSite;\r
+               m_spUnknown->QueryInterface(__uuidof(IObjectWithSite), (void**)&spSite);\r
+               if (spSite != NULL)\r
+                       spSite->SetSite(NULL);\r
+       }\r
+\r
+       if ((!m_spViewObject) == false)\r
+               m_spViewObject.Release();\r
+\r
+       if ((!m_spInPlaceObjectWindowless) == false)\r
+               m_spInPlaceObjectWindowless.Release();\r
+\r
+       if ((!m_spOleObject) == false)\r
+               m_spOleObject.Release();\r
+\r
+       if ((!m_spUnknown) == false)\r
+               m_spUnknown.Release();\r
+}\r
+\r
+bool FlashAxContainer::CheckForFlashSupport()\r
+{\r
+       CLSID clsid;\r
+       return SUCCEEDED(CLSIDFromString((LPOLESTR)flashGUID_, &clsid));\r
+}\r
+\r
+HRESULT FlashAxContainer::CreateAxControl()\r
+{\r
+       CLSID clsid;\r
+       HRESULT hr = CLSIDFromString((LPOLESTR)flashGUID_, &clsid); \r
+       if(SUCCEEDED(hr))\r
+               hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, __uuidof(IUnknown), (void**)&m_spUnknown);\r
+\r
+//Start ActivateAx\r
+       if(SUCCEEDED(hr))\r
+       {\r
+               m_spUnknown->QueryInterface(__uuidof(IOleObject), (void**)&m_spOleObject);\r
+               if(m_spOleObject)\r
+               {\r
+                       m_spOleObject->GetMiscStatus(DVASPECT_CONTENT, &m_dwMiscStatus);\r
+                       if (m_dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST)\r
+                       {\r
+                               CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown());\r
+                               m_spOleObject->SetClientSite(spClientSite);\r
+                       }\r
+\r
+                       //Initialize control\r
+                       CComQIPtr<IPersistStreamInit> spPSI(m_spOleObject);\r
+                       if (spPSI)\r
+                               hr = spPSI->InitNew();\r
+\r
+                       if (FAILED(hr)) // If the initialization of the control failed...\r
+                       {\r
+                               // Clean up and return\r
+                               if (m_dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST)\r
+                                       m_spOleObject->SetClientSite(NULL);\r
+\r
+                               m_dwMiscStatus = 0;\r
+                               m_spOleObject.Release();\r
+                               m_spUnknown.Release();\r
+\r
+                               return hr;\r
+                       }\r
+                       //end Initialize object\r
+\r
+                       if (0 == (m_dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST))\r
+                       {\r
+                               CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown());\r
+                               m_spOleObject->SetClientSite(spClientSite);\r
+                       }\r
+\r
+                       CComPtr<IShockwaveFlash> spFlash;\r
+                       HRESULT hResultQuality;\r
+                       HRESULT hr2 = m_spOleObject->QueryInterface(__uuidof(IShockwaveFlash), (void**) &spFlash);\r
+                       if(hr2 == S_OK && spFlash)\r
+                       {\r
+                               spFlash->put_WMode(TEXT("Transparent"));\r
+                               //spFlash->put_WMode(TEXT("GPU"));\r
+                               hResultQuality = spFlash->put_Quality2(TEXT("Best"));\r
+                       }\r
+                       if(SUCCEEDED(DispEventAdvise(spFlash, &DIID__IShockwaveFlashEvents)))\r
+                       {\r
+                       }\r
+\r
+                       HRESULT hrView = m_spOleObject->QueryInterface(__uuidof(IViewObjectEx), (void**) &m_spViewObject);\r
+\r
+                       CComQIPtr<IAdviseSink> spAdviseSink(GetControllingUnknown());\r
+                       m_spOleObject->Advise(spAdviseSink, &m_dwOleObject);\r
+                       if (m_spViewObject)\r
+                               m_spViewObject->SetAdvise(DVASPECT_CONTENT, 0, spAdviseSink);\r
+\r
+                       if ((m_dwMiscStatus & OLEMISC_INVISIBLEATRUNTIME) == 0)\r
+                       {\r
+                               //Initialize window to some dummy size\r
+                               m_rcPos.top = 0;\r
+                               m_rcPos.left = 0;\r
+                               m_rcPos.right = 720;\r
+                               m_rcPos.bottom = 576;\r
+\r
+                               m_pxSize.cx = m_rcPos.right - m_rcPos.left;\r
+                               m_pxSize.cy = m_rcPos.bottom - m_rcPos.top;\r
+                               AtlPixelToHiMetric(&m_pxSize, &m_hmSize);\r
+                               m_spOleObject->SetExtent(DVASPECT_CONTENT, &m_hmSize);\r
+                               m_spOleObject->GetExtent(DVASPECT_CONTENT, &m_hmSize);\r
+                               AtlHiMetricToPixel(&m_hmSize, &m_pxSize);\r
+                               m_rcPos.right = m_rcPos.left + m_pxSize.cx;\r
+                               m_rcPos.bottom = m_rcPos.top + m_pxSize.cy;\r
+\r
+                               CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown());\r
+                               hr = m_spOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, spClientSite, 0, NULL, &m_rcPos);\r
+                       }\r
+               }\r
+               CComPtr<IObjectWithSite> spSite;\r
+               m_spUnknown->QueryInterface(__uuidof(IObjectWithSite), (void**)&spSite);\r
+               if (spSite != NULL)\r
+                       spSite->SetSite(GetControllingUnknown());\r
+       }\r
+//End ActivateAx\r
+\r
+//     hr = E_FAIL;\r
+       if (FAILED(hr) || m_spUnknown == NULL)\r
+       {\r
+               return E_FAIL;\r
+               // We don't have a control or something failed so release\r
+//             ReleaseAll();\r
+       }\r
+\r
+       return S_OK;\r
+}\r
+\r
+HRESULT FlashAxContainer::SetFormat(const caspar::frame_format_desc& format_desc) \r
+{\r
+       if(m_spInPlaceObjectWindowless == nullptr)\r
+               return E_FAIL;\r
+\r
+       if(m_rcPos.right != format_desc.width || m_rcPos.bottom != format_desc.height)\r
+       {\r
+               RECT oldRcPos = m_rcPos;\r
+               m_rcPos.top = 0;\r
+               m_rcPos.left = 0;\r
+               m_rcPos.right = format_desc.width;\r
+               m_rcPos.bottom = format_desc.height;\r
+\r
+               m_pxSize.cx = m_rcPos.right - m_rcPos.left;\r
+               m_pxSize.cy = m_rcPos.bottom - m_rcPos.top;\r
+               AtlPixelToHiMetric(&m_pxSize, &m_hmSize);\r
+               m_spOleObject->SetExtent(DVASPECT_CONTENT, &m_hmSize);\r
+               m_spOleObject->GetExtent(DVASPECT_CONTENT, &m_hmSize);\r
+               AtlHiMetricToPixel(&m_hmSize, &m_pxSize);\r
+               m_rcPos.right = m_rcPos.left + m_pxSize.cx;\r
+               m_rcPos.bottom = m_rcPos.top + m_pxSize.cy;\r
+\r
+               HRESULT result = m_spInPlaceObjectWindowless->SetObjectRects(&m_rcPos, &m_rcPos);\r
+               bInvalidRect_ = true;\r
+               if(FAILED(result))\r
+                        m_spInPlaceObjectWindowless->SetObjectRects(&oldRcPos, &oldRcPos);\r
+\r
+               return result;\r
+       }\r
+\r
+       return S_OK;\r
+}\r
+\r
+HRESULT FlashAxContainer::QueryControl(REFIID iid, void** ppUnk)\r
+{\r
+       ATLASSERT(ppUnk != NULL);\r
+       if (ppUnk == NULL)\r
+               return E_POINTER;\r
+       HRESULT hr;\r
+       hr = m_spOleObject->QueryInterface(iid, ppUnk);\r
+       return hr;\r
+}\r
+\r
+bool FlashAxContainer::DrawControl(HDC targetDC)\r
+{\r
+//     ATLTRACE(_T("FlashAxContainer::DrawControl\n"));\r
+       DVASPECTINFO aspectInfo = {sizeof(DVASPECTINFO), DVASPECTINFOFLAG_CANOPTIMIZE};\r
+       HRESULT hr = S_OK;\r
+       \r
+       hr = m_spViewObject->Draw(DVASPECT_CONTENT, -1, &aspectInfo, NULL, NULL, targetDC, NULL, NULL, NULL, NULL); \r
+       assert(SUCCEEDED(hr));\r
+       bInvalidRect_ = false;\r
+\r
+/*     const caspar::frame_format_desc& format_desc = caspar::frame_format_desc::format_descs[format_];\r
+\r
+       //Trying to redraw just the dirty rectangles. Doesn't seem to work when the movie uses "filters", such as glow, dropshadow etc.\r
+       std::vector<flash::DirtyRect>::iterator it = bDirtyRects_.begin();\r
+       std::vector<flash::DirtyRect>::iterator end = bDirtyRects_.end();\r
+       for(; it != end; ++it) {\r
+               flash::DirtyRect& dirtyRect = (*it);\r
+               if(dirtyRect.bWhole || dirtyRect.rect.right >= format_desc.width || dirtyRect.rect.bottom >= format_desc.height) {\r
+                       m_spInPlaceObjectWindowless->SetObjectRects(&m_rcPos, &m_rcPos);\r
+                       hr = m_spViewObject->Draw(DVASPECT_OPAQUE, -1, NULL, NULL, NULL, targetDC, NULL, NULL, NULL, NULL); \r
+                       break;\r
+               }\r
+               else {\r
+                       m_spInPlaceObjectWindowless->SetObjectRects(&m_rcPos, &(dirtyRect.rect));\r
+                       hr = m_spViewObject->Draw(DVASPECT_OPAQUE, -1, NULL, NULL, NULL, targetDC, NULL, NULL, NULL, NULL); \r
+               }\r
+       }\r
+       bDirtyRects_.clear();\r
+*/\r
+\r
+       return (hr == S_OK);\r
+}\r
+\r
+bool FlashAxContainer::InvalidRectangle() const\r
+{\r
+       return bInvalidRect_;\r
+}\r
+\r
+void FlashAxContainer::Tick()\r
+{\r
+       if(pTimerHelper)\r
+       {\r
+               HRESULT result;\r
+               DWORD time = pTimerHelper->Invoke(); // Tick flash\r
+               if(time - lastTime_ >= 400)\r
+               {\r
+                       m_spInPlaceObjectWindowless->OnWindowMessage(WM_TIMER, 3, 0, &result);\r
+                       lastTime_ = time;\r
+               }\r
+       }\r
+}\r
+\r
+bool FlashAxContainer::CallFunction(const std::wstring& param)\r
+{\r
+       bIsEmpty_ = false;\r
+       bCallSuccessful_ = false;\r
+\r
+       CComPtr<IShockwaveFlash> spFlash;\r
+       if(SUCCEEDED(QueryControl(&spFlash)))\r
+       {\r
+               CComBSTR request(param.c_str());\r
+               CComBSTR result;\r
+               return SUCCEEDED(spFlash->CallFunction(request, &result)) || bCallSuccessful_;          \r
+       }\r
+\r
+       return false;\r
+}\r
+\r
+bool FlashAxContainer::IsEmpty() const\r
+{\r
+       return bIsEmpty_;\r
+}\r
+\r
+// Receives the following messages:\r
+// 0           0x0000 ?\r
+// 275         0x0113 WM_TIMER\r
+// 536         0x0218 WM_POWERBROADCAST\r
+// 49286       0xC086 ?\r
+\r
+\r
+}      //namespace flash\r
+}      //namespace caspar
\ No newline at end of file
diff --git a/core/producer/flash/FlashAxContainer.h b/core/producer/flash/FlashAxContainer.h
new file mode 100644 (file)
index 0000000..2c1119e
--- /dev/null
@@ -0,0 +1,294 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#if defined(_MSC_VER)\r
+#pragma once\r
+#endif\r
+\r
+#ifndef _FLASHAXCONTAINER_H__\r
+#define _FLASHAXCONTAINER_H__\r
+\r
+#pragma warning(push)\r
+#pragma warning(disable : 4996)\r
+\r
+       #include <atlbase.h>\r
+\r
+       #include <atlcom.h>\r
+       #include <atlhost.h>\r
+\r
+#pragma warning(push)\r
+\r
+#include "..\..\frame\frame.h"\r
+\r
+#include <ocmm.h>\r
+#include <vector>\r
+#include <tbb\atomic.h>\r
+\r
+#include "axflash.h"\r
+//#import "progid:ShockwaveFlash.ShockwaveFlash.9" no_namespace, named_guids\r
+\r
+namespace caspar { namespace flash {\r
+       \r
+class flash_producer;\r
+\r
+class TimerHelper;\r
+struct DirtyRect {\r
+       DirtyRect(LONG l, LONG t, LONG r, LONG b, bool e) : bErase(e), bWhole(false) { \r
+               rect.left = l;\r
+               rect.top = t;\r
+               rect.right = r;\r
+               rect.bottom = b; \r
+       }\r
+       DirtyRect(const RECT& rc, bool e) : bErase(e), bWhole(false)  {\r
+               rect.left = rc.left;\r
+               rect.top = rc.top;\r
+               rect.right = rc.right;\r
+               rect.bottom = rc.bottom; \r
+       }\r
+       explicit DirtyRect(bool b) : bWhole(b) {}\r
+\r
+       RECT    rect;\r
+       bool    bErase;\r
+       bool    bWhole;\r
+};\r
+\r
+extern _ATL_FUNC_INFO fnInfoFlashCallEvent;\r
+extern _ATL_FUNC_INFO fnInfoReadyStateChangeEvent;\r
+\r
+class ATL_NO_VTABLE FlashAxContainer : \r
+               public ATL::CComCoClass<FlashAxContainer , &CLSID_NULL>,\r
+               public ATL::CComObjectRootEx<ATL::CComMultiThreadModel>,\r
+               public IOleClientSite,\r
+               public IOleContainer,\r
+               public IOleControlSite,\r
+               public IOleInPlaceSiteWindowless,\r
+               public IObjectWithSiteImpl<FlashAxContainer>,\r
+               public IServiceProvider,\r
+               public IAdviseSink,\r
+               public ITimerService,\r
+               public ITimer,\r
+               public IDispatchImpl<IDispatch>,\r
+               public IDispEventSimpleImpl<0, FlashAxContainer, &DIID__IShockwaveFlashEvents>\r
+{\r
+\r
+public:\r
+\r
+       FlashAxContainer();\r
+       virtual ~FlashAxContainer();\r
+\r
+       DECLARE_NO_REGISTRY()\r
+       DECLARE_POLY_AGGREGATABLE(FlashAxContainer)\r
+       DECLARE_GET_CONTROLLING_UNKNOWN()\r
+\r
+       BEGIN_COM_MAP(FlashAxContainer)\r
+               COM_INTERFACE_ENTRY(IDispatch)\r
+               COM_INTERFACE_ENTRY(IOleClientSite)\r
+               COM_INTERFACE_ENTRY(IObjectWithSite)\r
+               COM_INTERFACE_ENTRY(IOleControlSite)\r
+               COM_INTERFACE_ENTRY(IOleContainer)\r
+\r
+               COM_INTERFACE_ENTRY(IOleInPlaceSiteWindowless)\r
+               COM_INTERFACE_ENTRY(IOleInPlaceSiteEx)\r
+               COM_INTERFACE_ENTRY(IOleInPlaceSite)\r
+               COM_INTERFACE_ENTRY(IOleWindow)\r
+\r
+               COM_INTERFACE_ENTRY(IServiceProvider)\r
+\r
+               COM_INTERFACE_ENTRY(IAdviseSink)\r
+\r
+               COM_INTERFACE_ENTRY(ITimerService)\r
+\r
+               COM_INTERFACE_ENTRY(ITimer)\r
+       END_COM_MAP()\r
+\r
+       BEGIN_SINK_MAP(FlashAxContainer)\r
+               SINK_ENTRY_INFO(0, DIID__IShockwaveFlashEvents, 0xc5, OnFlashCall, &fnInfoFlashCallEvent)\r
+               SINK_ENTRY_INFO(0, DIID__IShockwaveFlashEvents, 0xfffffd9f, OnReadyStateChange, &fnInfoReadyStateChangeEvent)\r
+       END_SINK_MAP()\r
+\r
+       void STDMETHODCALLTYPE OnFlashCall(BSTR request);\r
+       void STDMETHODCALLTYPE OnReadyStateChange(long newState);\r
+\r
+// IObjectWithSite\r
+       STDMETHOD(SetSite)(IUnknown* pUnkSite);\r
+\r
+// IOleClientSite\r
+       STDMETHOD(SaveObject)();\r
+       STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk);\r
+       STDMETHOD(GetContainer)(IOleContainer** ppContainer);\r
+       STDMETHOD(ShowObject)();\r
+       STDMETHOD(OnShowWindow)(BOOL fShow);\r
+       STDMETHOD(RequestNewObjectLayout)();\r
+\r
+// IOleInPlaceSite\r
+       STDMETHOD(GetWindow)(HWND* pHwnd);\r
+       STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);\r
+       STDMETHOD(CanInPlaceActivate)();\r
+       STDMETHOD(OnInPlaceActivate)();\r
+       STDMETHOD(OnInPlaceDeactivate)();\r
+       STDMETHOD(OnUIActivate)();\r
+       STDMETHOD(OnUIDeactivate)(BOOL fUndoable);\r
+       STDMETHOD(GetWindowContext)(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO pFrameInfo);\r
+       STDMETHOD(Scroll)(SIZE scrollExtant);\r
+       STDMETHOD(DiscardUndoState)();\r
+       STDMETHOD(DeactivateAndUndo)();\r
+       STDMETHOD(OnPosRectChange)(LPCRECT lprcPosRect);\r
+\r
+// IOleInPlaceSiteEx\r
+       STDMETHOD(OnInPlaceActivateEx)(BOOL* pfNoRedraw, DWORD dwFlags);\r
+       STDMETHOD(OnInPlaceDeactivateEx)(BOOL fNoRedraw);\r
+       STDMETHOD(RequestUIActivate)();\r
+\r
+// IOleInPlaceSiteWindowless\r
+       STDMETHOD(CanWindowlessActivate)();\r
+       STDMETHOD(GetCapture)();\r
+       STDMETHOD(SetCapture)(BOOL fCapture);\r
+       STDMETHOD(GetFocus)();\r
+       STDMETHOD(SetFocus)(BOOL fGotFocus);\r
+       STDMETHOD(GetDC)(LPCRECT pRect, DWORD grfFlags, HDC* phDC);\r
+       STDMETHOD(ReleaseDC)(HDC hDC);\r
+       STDMETHOD(InvalidateRect)(LPCRECT pRect, BOOL fErase);\r
+       STDMETHOD(InvalidateRgn)(HRGN hRGN, BOOL fErase);\r
+       STDMETHOD(ScrollRect)(INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip);\r
+       STDMETHOD(AdjustRect)(LPRECT prc);\r
+       STDMETHOD(OnDefWindowMessage)(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult);\r
+\r
+// IOleControlSite\r
+       STDMETHOD(OnControlInfoChanged)();\r
+       STDMETHOD(LockInPlaceActive)(BOOL fLock);\r
+       STDMETHOD(GetExtendedControl)(IDispatch** ppDisp);\r
+       STDMETHOD(TransformCoords)(POINTL* pPtlHimetric, POINTF* pPtfContainer, DWORD dwFlags);\r
+       STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, DWORD grfModifiers);\r
+       STDMETHOD(OnFocus)(BOOL fGotFocus);\r
+       STDMETHOD(ShowPropertyFrame)();\r
+\r
+// IAdviseSink\r
+       STDMETHOD_(void, OnDataChange)(FORMATETC* pFormatetc, STGMEDIUM* pStgmed);\r
+       STDMETHOD_(void, OnViewChange)(DWORD dwAspect, LONG lindex);\r
+       STDMETHOD_(void, OnRename)(IMoniker* pmk);\r
+       STDMETHOD_(void, OnSave)();\r
+       STDMETHOD_(void, OnClose)();\r
+\r
+// IServiceProvider\r
+       STDMETHOD(QueryService)( REFGUID rsid, REFIID riid, void** ppvObj);\r
+\r
+// IOleContainer\r
+       STDMETHOD(ParseDisplayName)(IBindCtx*, LPOLESTR, ULONG*, IMoniker**)\r
+       {\r
+               ATLTRACENOTIMPL(_T("IOleContainer::ParseDisplayName"));\r
+       }\r
+       STDMETHOD(EnumObjects)(DWORD, IEnumUnknown** ppenum)\r
+       {\r
+               if (ppenum == NULL)\r
+                       return E_POINTER;\r
+               *ppenum = NULL;\r
+               typedef CComObject<CComEnum<IEnumUnknown, &__uuidof(IEnumUnknown), IUnknown*, _CopyInterface<IUnknown> > > enumunk;\r
+               enumunk* p = NULL;\r
+               ATLTRY(p = new enumunk);\r
+               if(p == NULL)\r
+                       return E_OUTOFMEMORY;\r
+               IUnknown* pTemp = m_spUnknown;\r
+               // There is always only one object.\r
+               HRESULT hRes = p->Init(reinterpret_cast<IUnknown**>(&pTemp), reinterpret_cast<IUnknown**>(&pTemp + 1), GetControllingUnknown(), AtlFlagCopy);\r
+               if (SUCCEEDED(hRes))\r
+                       hRes = p->QueryInterface(__uuidof(IEnumUnknown), (void**)ppenum);\r
+               if (FAILED(hRes))\r
+                       delete p;\r
+               return hRes;\r
+       }\r
+       STDMETHOD(LockContainer)(BOOL)\r
+       {\r
+               ATLTRACENOTIMPL(_T("IOleContainer::LockContainer"));\r
+       }\r
+\r
+//ITimerService\r
+       STDMETHOD(CreateTimer)(ITimer *pReferenceTimer, ITimer **ppNewTimer);\r
+       STDMETHOD(GetNamedTimer)(REFGUID rguidName, ITimer **ppTimer);\r
+       STDMETHOD(SetNamedTimerReference)(REFGUID rguidName, ITimer *pReferenceTimer);\r
+\r
+//ITimer\r
+       STDMETHOD(Advise)(VARIANT vtimeMin, VARIANT vtimeMax, VARIANT vtimeInterval, DWORD dwFlags, ITimerSink *pTimerSink, DWORD *pdwCookie);\r
+       STDMETHOD(Unadvise)(DWORD dwCookie);\r
+       STDMETHOD(Freeze)(BOOL fFreeze);\r
+       STDMETHOD(GetTime)(VARIANT *pvtime);\r
+       int GetFPS();\r
+\r
+       HRESULT CreateAxControl();\r
+       void DestroyAxControl();\r
+       HRESULT QueryControl(REFIID iid, void** ppUnk);\r
+\r
+       template <class Q>\r
+       HRESULT QueryControl(Q** ppUnk)\r
+       {\r
+               return QueryControl(__uuidof(Q), (void**)ppUnk);\r
+       }\r
+\r
+       bool InvalidRectangle() const;\r
+       void Tick();\r
+       bool CallFunction(const std::wstring& param);\r
+       bool IsEmpty() const;\r
+\r
+//     static ATL::CComObject<FlashAxContainer>* CreateInstance();\r
+\r
+       bool DrawControl(HDC targetDC);\r
+\r
+       TimerHelper* pTimerHelper;\r
+       tbb::atomic<bool> bInvalidRect_;\r
+       tbb::atomic<bool> bCallSuccessful_;\r
+       tbb::atomic<bool> bReadyToRender_;\r
+       tbb::atomic<bool> bIsEmpty_;\r
+       tbb::atomic<bool> bHasNewTiming_;\r
+       flash::flash_producer* pflash_producer_;\r
+       std::vector<DirtyRect> bDirtyRects_;\r
+\r
+       HRESULT SetFormat(const caspar::frame_format_desc&);\r
+       bool IsReadyToRender() const;\r
+       void EnterFullscreen();\r
+\r
+       static bool CheckForFlashSupport();\r
+private:\r
+       static CComBSTR flashGUID_;\r
+\r
+       DWORD lastTime_;\r
+//     state\r
+       bool            bUIActive_;\r
+       bool            bInPlaceActive_;\r
+       unsigned long           bHaveFocus_ : 1;\r
+       unsigned long           bCapture_ : 1;\r
+\r
+       DWORD m_dwOleObject;\r
+       DWORD m_dwMiscStatus;\r
+       SIZEL m_hmSize;\r
+       SIZEL m_pxSize;\r
+       RECT m_rcPos;\r
+\r
+       ATL::CComPtr<IUnknown> m_spUnknown;\r
+       ATL::CComPtr<IOleObject> m_spServices;\r
+       ATL::CComPtr<IOleObject> m_spOleObject;\r
+       ATL::CComPtr<IViewObjectEx> m_spViewObject;\r
+       ATL::CComPtr<IOleInPlaceObjectWindowless> m_spInPlaceObjectWindowless;\r
+\r
+//     ATL::CComPtr<ATL::CComObject<MyMoniker> > m_spMyMoniker;\r
+};\r
+\r
+}      //namespace flash\r
+}      //namespace caspar\r
+\r
+#endif //_FLASHAXCONTAINER_H__
\ No newline at end of file
diff --git a/core/producer/flash/TimerHelper.h b/core/producer/flash/TimerHelper.h
new file mode 100644 (file)
index 0000000..a0de2b1
--- /dev/null
@@ -0,0 +1,77 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#ifndef _TIMER_HELPER_H__\r
+#define _TIMER_HELPER_H__\r
+\r
+#include "FlashAxContainer.h"\r
+\r
+namespace caspar {\r
+namespace flash {\r
+\r
+       class TimerHelper\r
+       {\r
+               TimerHelper(const TimerHelper&);\r
+               const TimerHelper& operator=(const TimerHelper&);\r
+\r
+       public:\r
+               TimerHelper()\r
+               {}\r
+               TimerHelper(DWORD first, DWORD interv, ITimerSink* pTS) : firstTime(first), interval(interv), currentTime(first), pTimerSink(pTS)\r
+               {\r
+                       ID = first;\r
+               }\r
+               ~TimerHelper()\r
+               {\r
+               }\r
+               void Setup(DWORD first, DWORD interv, ITimerSink* pTS)\r
+               {\r
+                       firstTime = first;\r
+                       interval = interv;\r
+                       currentTime = first;\r
+                       pTimerSink = pTS;\r
+                       ID = first;\r
+               }\r
+\r
+               DWORD Invoke()\r
+               {\r
+                       if(pTimerSink != 0)\r
+                       {\r
+                               VARIANT value;\r
+                               value.vt = VT_UI4;\r
+                               value.ulVal = currentTime;\r
+\r
+                               pTimerSink->OnTimer(value);\r
+                               currentTime += interval;\r
+                       }\r
+                       return currentTime;\r
+               }\r
+\r
+               DWORD firstTime;\r
+               DWORD interval;\r
+               DWORD currentTime;\r
+               ATL::CComPtr<ITimerSink> pTimerSink;\r
+               DWORD ID;\r
+       };\r
+\r
+}      //namespace flash\r
+}      //namespace caspar\r
+\r
+#endif //_TIMER_HELPER_H__
\ No newline at end of file
diff --git a/core/producer/flash/axflash.h b/core/producer/flash/axflash.h
new file mode 100644 (file)
index 0000000..4685f3a
--- /dev/null
@@ -0,0 +1,3156 @@
+\r
+\r
+/* this ALWAYS GENERATED file contains the definitions for the interfaces */\r
+\r
+\r
+ /* File created by MIDL compiler version 6.00.0366 */\r
+/* at Tue Mar 18 13:05:00 2008\r
+ */\r
+/* Compiler settings for .\flash\Flash9e.IDL:\r
+    Oicf, W4, Zp8, env=Win32 (32b run)\r
+    protocol : dce , ms_ext, c_ext, robust\r
+    error checks: allocation ref bounds_check enum stub_data \r
+    VC __declspec() decoration level: \r
+         __declspec(uuid()), __declspec(selectany), __declspec(novtable)\r
+         DECLSPEC_UUID(), MIDL_INTERFACE()\r
+*/\r
+//@@MIDL_FILE_HEADING(  )\r
+\r
+#pragma warning( disable: 4049 )  /* more than 64k source lines */\r
+\r
+\r
+/* verify that the <rpcndr.h> version is high enough to compile this file*/\r
+#ifndef __REQUIRED_RPCNDR_H_VERSION__\r
+#define __REQUIRED_RPCNDR_H_VERSION__ 475\r
+#endif\r
+\r
+#include "rpc.h"\r
+#include "rpcndr.h"\r
+#include <dispex.h>\r
+\r
+#ifndef __RPCNDR_H_VERSION__\r
+#error this stub requires an updated version of <rpcndr.h>\r
+#endif // __RPCNDR_H_VERSION__\r
+\r
+\r
+#ifndef __axflash_h__\r
+#define __axflash_h__\r
+\r
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)\r
+#pragma once\r
+#endif\r
+\r
+/* Forward Declarations */ \r
+\r
+#ifndef __IShockwaveFlash_FWD_DEFINED__\r
+#define __IShockwaveFlash_FWD_DEFINED__\r
+typedef interface IShockwaveFlash IShockwaveFlash;\r
+#endif         /* __IShockwaveFlash_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef ___IShockwaveFlashEvents_FWD_DEFINED__\r
+#define ___IShockwaveFlashEvents_FWD_DEFINED__\r
+typedef interface _IShockwaveFlashEvents _IShockwaveFlashEvents;\r
+#endif         /* ___IShockwaveFlashEvents_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IFlashFactory_FWD_DEFINED__\r
+#define __IFlashFactory_FWD_DEFINED__\r
+typedef interface IFlashFactory IFlashFactory;\r
+#endif         /* __IFlashFactory_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IDispatchEx_FWD_DEFINED__\r
+#define __IDispatchEx_FWD_DEFINED__\r
+typedef interface IDispatchEx IDispatchEx;\r
+#endif         /* __IDispatchEx_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IFlashObjectInterface_FWD_DEFINED__\r
+#define __IFlashObjectInterface_FWD_DEFINED__\r
+typedef interface IFlashObjectInterface IFlashObjectInterface;\r
+#endif         /* __IFlashObjectInterface_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __IServiceProvider_FWD_DEFINED__\r
+#define __IServiceProvider_FWD_DEFINED__\r
+typedef interface IServiceProvider IServiceProvider;\r
+#endif         /* __IServiceProvider_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __ShockwaveFlash_FWD_DEFINED__\r
+#define __ShockwaveFlash_FWD_DEFINED__\r
+\r
+#ifdef __cplusplus\r
+typedef class ShockwaveFlash ShockwaveFlash;\r
+#else\r
+typedef struct ShockwaveFlash ShockwaveFlash;\r
+#endif /* __cplusplus */\r
+\r
+#endif         /* __ShockwaveFlash_FWD_DEFINED__ */\r
+\r
+\r
+#ifndef __FlashObjectInterface_FWD_DEFINED__\r
+#define __FlashObjectInterface_FWD_DEFINED__\r
+\r
+#ifdef __cplusplus\r
+typedef class FlashObjectInterface FlashObjectInterface;\r
+#else\r
+typedef struct FlashObjectInterface FlashObjectInterface;\r
+#endif /* __cplusplus */\r
+\r
+#endif         /* __FlashObjectInterface_FWD_DEFINED__ */\r
+\r
+\r
+#ifdef __cplusplus\r
+extern "C"{\r
+#endif \r
+\r
+void * __RPC_USER MIDL_user_allocate(size_t);\r
+void __RPC_USER MIDL_user_free( void * ); \r
+\r
+\r
+#ifndef __ShockwaveFlashObjects_LIBRARY_DEFINED__\r
+#define __ShockwaveFlashObjects_LIBRARY_DEFINED__\r
+\r
+/* library ShockwaveFlashObjects */\r
+/* [custom][custom][helpstring][version][uuid] */ \r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+EXTERN_C const IID LIBID_ShockwaveFlashObjects;\r
+\r
+#ifndef __IShockwaveFlash_INTERFACE_DEFINED__\r
+#define __IShockwaveFlash_INTERFACE_DEFINED__\r
+\r
+/* interface IShockwaveFlash */\r
+/* [object][oleautomation][dual][helpstring][uuid] */ \r
+\r
+\r
+EXTERN_C const IID IID_IShockwaveFlash;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("D27CDB6C-AE6D-11CF-96B8-444553540000")\r
+    IShockwaveFlash : public IDispatch\r
+    {\r
+    public:\r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_ReadyState( \r
+            /* [retval][out] */ long *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_TotalFrames( \r
+            /* [retval][out] */ long *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Playing( \r
+            /* [retval][out] */ VARIANT_BOOL *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Playing( \r
+            /* [in] */ VARIANT_BOOL pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Quality( \r
+            /* [retval][out] */ int *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Quality( \r
+            /* [in] */ int pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_ScaleMode( \r
+            /* [retval][out] */ int *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_ScaleMode( \r
+            /* [in] */ int pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_AlignMode( \r
+            /* [retval][out] */ int *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_AlignMode( \r
+            /* [in] */ int pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_BackgroundColor( \r
+            /* [retval][out] */ long *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_BackgroundColor( \r
+            /* [in] */ long pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Loop( \r
+            /* [retval][out] */ VARIANT_BOOL *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Loop( \r
+            /* [in] */ VARIANT_BOOL pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Movie( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Movie( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_FrameNum( \r
+            /* [retval][out] */ long *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_FrameNum( \r
+            /* [in] */ long pVal) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetZoomRect( \r
+            /* [in] */ long left,\r
+            /* [in] */ long top,\r
+            /* [in] */ long right,\r
+            /* [in] */ long bottom) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Zoom( \r
+            /* [in] */ int factor) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Pan( \r
+            /* [in] */ long x,\r
+            /* [in] */ long y,\r
+            /* [in] */ int mode) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Play( void) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Stop( void) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Back( void) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Forward( void) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Rewind( void) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE StopPlay( void) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GotoFrame( \r
+            /* [in] */ long FrameNum) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CurrentFrame( \r
+            /* [retval][out] */ long *FrameNum) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IsPlaying( \r
+            /* [retval][out] */ VARIANT_BOOL *Playing) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE PercentLoaded( \r
+            /* [retval][out] */ long *percent) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE FrameLoaded( \r
+            /* [in] */ long FrameNum,\r
+            /* [retval][out] */ VARIANT_BOOL *loaded) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE FlashVersion( \r
+            /* [retval][out] */ long *version) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_WMode( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_WMode( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_SAlign( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_SAlign( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Menu( \r
+            /* [retval][out] */ VARIANT_BOOL *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Menu( \r
+            /* [in] */ VARIANT_BOOL pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Base( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Base( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Scale( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Scale( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_DeviceFont( \r
+            /* [retval][out] */ VARIANT_BOOL *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_DeviceFont( \r
+            /* [in] */ VARIANT_BOOL pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_EmbedMovie( \r
+            /* [retval][out] */ VARIANT_BOOL *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_EmbedMovie( \r
+            /* [in] */ VARIANT_BOOL pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_BGColor( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_BGColor( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Quality2( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Quality2( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE LoadMovie( \r
+            /* [in] */ int layer,\r
+            /* [in] */ BSTR url) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TGotoFrame( \r
+            /* [in] */ BSTR target,\r
+            /* [in] */ long FrameNum) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TGotoLabel( \r
+            /* [in] */ BSTR target,\r
+            /* [in] */ BSTR label) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TCurrentFrame( \r
+            /* [in] */ BSTR target,\r
+            /* [retval][out] */ long *FrameNum) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TCurrentLabel( \r
+            /* [in] */ BSTR target,\r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TPlay( \r
+            /* [in] */ BSTR target) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TStopPlay( \r
+            /* [in] */ BSTR target) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetVariable( \r
+            /* [in] */ BSTR name,\r
+            /* [in] */ BSTR value) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE GetVariable( \r
+            /* [in] */ BSTR name,\r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TSetProperty( \r
+            /* [in] */ BSTR target,\r
+            /* [in] */ int property,\r
+            /* [in] */ BSTR value) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TGetProperty( \r
+            /* [in] */ BSTR target,\r
+            /* [in] */ int property,\r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TCallFrame( \r
+            /* [in] */ BSTR target,\r
+            /* [in] */ int FrameNum) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TCallLabel( \r
+            /* [in] */ BSTR target,\r
+            /* [in] */ BSTR label) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TSetPropertyNum( \r
+            /* [in] */ BSTR target,\r
+            /* [in] */ int property,\r
+            /* [in] */ double value) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TGetPropertyNum( \r
+            /* [in] */ BSTR target,\r
+            /* [in] */ int property,\r
+            /* [retval][out] */ double *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE TGetPropertyAsNumber( \r
+            /* [in] */ BSTR target,\r
+            /* [in] */ int property,\r
+            /* [retval][out] */ double *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_SWRemote( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_SWRemote( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_FlashVars( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_FlashVars( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_AllowScriptAccess( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_AllowScriptAccess( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_MovieData( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_MovieData( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_InlineData( \r
+            /* [retval][out] */ IUnknown **ppIUnknown) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_InlineData( \r
+            /* [in] */ IUnknown *ppIUnknown) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_SeamlessTabbing( \r
+            /* [retval][out] */ VARIANT_BOOL *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_SeamlessTabbing( \r
+            /* [in] */ VARIANT_BOOL pVal) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE EnforceLocalSecurity( void) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Profile( \r
+            /* [retval][out] */ VARIANT_BOOL *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_Profile( \r
+            /* [in] */ VARIANT_BOOL pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_ProfileAddress( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_ProfileAddress( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_ProfilePort( \r
+            /* [retval][out] */ long *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_ProfilePort( \r
+            /* [in] */ long pVal) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE CallFunction( \r
+            /* [in] */ BSTR request,\r
+            /* [retval][out] */ BSTR *response) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE SetReturnValue( \r
+            /* [in] */ BSTR returnValue) = 0;\r
+        \r
+        virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE DisableLocalSecurity( void) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_AllowNetworking( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_AllowNetworking( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_AllowFullScreen( \r
+            /* [retval][out] */ BSTR *pVal) = 0;\r
+        \r
+        virtual /* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE put_AllowFullScreen( \r
+            /* [in] */ BSTR pVal) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IShockwaveFlashVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IShockwaveFlash * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IShockwaveFlash * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \r
+            IShockwaveFlash * This,\r
+            /* [out] */ UINT *pctinfo);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ UINT iTInfo,\r
+            /* [in] */ LCID lcid,\r
+            /* [out] */ ITypeInfo **ppTInfo);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [size_is][in] */ LPOLESTR *rgszNames,\r
+            /* [in] */ UINT cNames,\r
+            /* [in] */ LCID lcid,\r
+            /* [size_is][out] */ DISPID *rgDispId);\r
+        \r
+        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ DISPID dispIdMember,\r
+            /* [in] */ REFIID riid,\r
+            /* [in] */ LCID lcid,\r
+            /* [in] */ WORD wFlags,\r
+            /* [out][in] */ DISPPARAMS *pDispParams,\r
+            /* [out] */ VARIANT *pVarResult,\r
+            /* [out] */ EXCEPINFO *pExcepInfo,\r
+            /* [out] */ UINT *puArgErr);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_ReadyState )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ long *pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_TotalFrames )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ long *pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Playing )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ VARIANT_BOOL *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Playing )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ VARIANT_BOOL pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Quality )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ int *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Quality )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ int pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_ScaleMode )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ int *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_ScaleMode )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ int pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_AlignMode )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ int *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_AlignMode )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ int pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_BackgroundColor )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ long *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_BackgroundColor )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ long pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Loop )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ VARIANT_BOOL *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Loop )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ VARIANT_BOOL pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Movie )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Movie )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_FrameNum )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ long *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_FrameNum )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ long pVal);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetZoomRect )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ long left,\r
+            /* [in] */ long top,\r
+            /* [in] */ long right,\r
+            /* [in] */ long bottom);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Zoom )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ int factor);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Pan )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ long x,\r
+            /* [in] */ long y,\r
+            /* [in] */ int mode);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Play )( \r
+            IShockwaveFlash * This);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Stop )( \r
+            IShockwaveFlash * This);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Back )( \r
+            IShockwaveFlash * This);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Forward )( \r
+            IShockwaveFlash * This);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Rewind )( \r
+            IShockwaveFlash * This);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *StopPlay )( \r
+            IShockwaveFlash * This);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GotoFrame )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ long FrameNum);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CurrentFrame )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ long *FrameNum);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *IsPlaying )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ VARIANT_BOOL *Playing);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *PercentLoaded )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ long *percent);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *FrameLoaded )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ long FrameNum,\r
+            /* [retval][out] */ VARIANT_BOOL *loaded);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *FlashVersion )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ long *version);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_WMode )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_WMode )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_SAlign )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_SAlign )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Menu )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ VARIANT_BOOL *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Menu )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ VARIANT_BOOL pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Base )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Base )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Scale )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Scale )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_DeviceFont )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ VARIANT_BOOL *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_DeviceFont )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ VARIANT_BOOL pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_EmbedMovie )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ VARIANT_BOOL *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_EmbedMovie )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ VARIANT_BOOL pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_BGColor )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_BGColor )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Quality2 )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Quality2 )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *LoadMovie )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ int layer,\r
+            /* [in] */ BSTR url);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *TGotoFrame )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR target,\r
+            /* [in] */ long FrameNum);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *TGotoLabel )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR target,\r
+            /* [in] */ BSTR label);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *TCurrentFrame )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR target,\r
+            /* [retval][out] */ long *FrameNum);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *TCurrentLabel )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR target,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *TPlay )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR target);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *TStopPlay )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR target);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetVariable )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR name,\r
+            /* [in] */ BSTR value);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *GetVariable )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR name,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *TSetProperty )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR target,\r
+            /* [in] */ int property,\r
+            /* [in] */ BSTR value);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *TGetProperty )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR target,\r
+            /* [in] */ int property,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *TCallFrame )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR target,\r
+            /* [in] */ int FrameNum);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *TCallLabel )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR target,\r
+            /* [in] */ BSTR label);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *TSetPropertyNum )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR target,\r
+            /* [in] */ int property,\r
+            /* [in] */ double value);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *TGetPropertyNum )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR target,\r
+            /* [in] */ int property,\r
+            /* [retval][out] */ double *pVal);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *TGetPropertyAsNumber )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR target,\r
+            /* [in] */ int property,\r
+            /* [retval][out] */ double *pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_SWRemote )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_SWRemote )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_FlashVars )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_FlashVars )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_AllowScriptAccess )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_AllowScriptAccess )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_MovieData )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_MovieData )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_InlineData )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ IUnknown **ppIUnknown);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_InlineData )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ IUnknown *ppIUnknown);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_SeamlessTabbing )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ VARIANT_BOOL *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_SeamlessTabbing )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ VARIANT_BOOL pVal);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *EnforceLocalSecurity )( \r
+            IShockwaveFlash * This);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Profile )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ VARIANT_BOOL *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_Profile )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ VARIANT_BOOL pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_ProfileAddress )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_ProfileAddress )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_ProfilePort )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ long *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_ProfilePort )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ long pVal);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *CallFunction )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR request,\r
+            /* [retval][out] */ BSTR *response);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *SetReturnValue )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR returnValue);\r
+        \r
+        /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *DisableLocalSecurity )( \r
+            IShockwaveFlash * This);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_AllowNetworking )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_AllowNetworking )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        /* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_AllowFullScreen )( \r
+            IShockwaveFlash * This,\r
+            /* [retval][out] */ BSTR *pVal);\r
+        \r
+        /* [helpstring][propput][id] */ HRESULT ( STDMETHODCALLTYPE *put_AllowFullScreen )( \r
+            IShockwaveFlash * This,\r
+            /* [in] */ BSTR pVal);\r
+        \r
+        END_INTERFACE\r
+    } IShockwaveFlashVtbl;\r
+\r
+    interface IShockwaveFlash\r
+    {\r
+        CONST_VTBL struct IShockwaveFlashVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IShockwaveFlash_QueryInterface(This,riid,ppvObject)    \\r
+    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)\r
+\r
+#define IShockwaveFlash_AddRef(This)   \\r
+    (This)->lpVtbl -> AddRef(This)\r
+\r
+#define IShockwaveFlash_Release(This)  \\r
+    (This)->lpVtbl -> Release(This)\r
+\r
+\r
+#define IShockwaveFlash_GetTypeInfoCount(This,pctinfo) \\r
+    (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)\r
+\r
+#define IShockwaveFlash_GetTypeInfo(This,iTInfo,lcid,ppTInfo)  \\r
+    (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)\r
+\r
+#define IShockwaveFlash_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)        \\r
+    (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\r
+\r
+#define IShockwaveFlash_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)  \\r
+    (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\r
+\r
+\r
+#define IShockwaveFlash_get_ReadyState(This,pVal)      \\r
+    (This)->lpVtbl -> get_ReadyState(This,pVal)\r
+\r
+#define IShockwaveFlash_get_TotalFrames(This,pVal)     \\r
+    (This)->lpVtbl -> get_TotalFrames(This,pVal)\r
+\r
+#define IShockwaveFlash_get_Playing(This,pVal) \\r
+    (This)->lpVtbl -> get_Playing(This,pVal)\r
+\r
+#define IShockwaveFlash_put_Playing(This,pVal) \\r
+    (This)->lpVtbl -> put_Playing(This,pVal)\r
+\r
+#define IShockwaveFlash_get_Quality(This,pVal) \\r
+    (This)->lpVtbl -> get_Quality(This,pVal)\r
+\r
+#define IShockwaveFlash_put_Quality(This,pVal) \\r
+    (This)->lpVtbl -> put_Quality(This,pVal)\r
+\r
+#define IShockwaveFlash_get_ScaleMode(This,pVal)       \\r
+    (This)->lpVtbl -> get_ScaleMode(This,pVal)\r
+\r
+#define IShockwaveFlash_put_ScaleMode(This,pVal)       \\r
+    (This)->lpVtbl -> put_ScaleMode(This,pVal)\r
+\r
+#define IShockwaveFlash_get_AlignMode(This,pVal)       \\r
+    (This)->lpVtbl -> get_AlignMode(This,pVal)\r
+\r
+#define IShockwaveFlash_put_AlignMode(This,pVal)       \\r
+    (This)->lpVtbl -> put_AlignMode(This,pVal)\r
+\r
+#define IShockwaveFlash_get_BackgroundColor(This,pVal) \\r
+    (This)->lpVtbl -> get_BackgroundColor(This,pVal)\r
+\r
+#define IShockwaveFlash_put_BackgroundColor(This,pVal) \\r
+    (This)->lpVtbl -> put_BackgroundColor(This,pVal)\r
+\r
+#define IShockwaveFlash_get_Loop(This,pVal)    \\r
+    (This)->lpVtbl -> get_Loop(This,pVal)\r
+\r
+#define IShockwaveFlash_put_Loop(This,pVal)    \\r
+    (This)->lpVtbl -> put_Loop(This,pVal)\r
+\r
+#define IShockwaveFlash_get_Movie(This,pVal)   \\r
+    (This)->lpVtbl -> get_Movie(This,pVal)\r
+\r
+#define IShockwaveFlash_put_Movie(This,pVal)   \\r
+    (This)->lpVtbl -> put_Movie(This,pVal)\r
+\r
+#define IShockwaveFlash_get_FrameNum(This,pVal)        \\r
+    (This)->lpVtbl -> get_FrameNum(This,pVal)\r
+\r
+#define IShockwaveFlash_put_FrameNum(This,pVal)        \\r
+    (This)->lpVtbl -> put_FrameNum(This,pVal)\r
+\r
+#define IShockwaveFlash_SetZoomRect(This,left,top,right,bottom)        \\r
+    (This)->lpVtbl -> SetZoomRect(This,left,top,right,bottom)\r
+\r
+#define IShockwaveFlash_Zoom(This,factor)      \\r
+    (This)->lpVtbl -> Zoom(This,factor)\r
+\r
+#define IShockwaveFlash_Pan(This,x,y,mode)     \\r
+    (This)->lpVtbl -> Pan(This,x,y,mode)\r
+\r
+#define IShockwaveFlash_Play(This)     \\r
+    (This)->lpVtbl -> Play(This)\r
+\r
+#define IShockwaveFlash_Stop(This)     \\r
+    (This)->lpVtbl -> Stop(This)\r
+\r
+#define IShockwaveFlash_Back(This)     \\r
+    (This)->lpVtbl -> Back(This)\r
+\r
+#define IShockwaveFlash_Forward(This)  \\r
+    (This)->lpVtbl -> Forward(This)\r
+\r
+#define IShockwaveFlash_Rewind(This)   \\r
+    (This)->lpVtbl -> Rewind(This)\r
+\r
+#define IShockwaveFlash_StopPlay(This) \\r
+    (This)->lpVtbl -> StopPlay(This)\r
+\r
+#define IShockwaveFlash_GotoFrame(This,FrameNum)       \\r
+    (This)->lpVtbl -> GotoFrame(This,FrameNum)\r
+\r
+#define IShockwaveFlash_CurrentFrame(This,FrameNum)    \\r
+    (This)->lpVtbl -> CurrentFrame(This,FrameNum)\r
+\r
+#define IShockwaveFlash_IsPlaying(This,Playing)        \\r
+    (This)->lpVtbl -> IsPlaying(This,Playing)\r
+\r
+#define IShockwaveFlash_PercentLoaded(This,percent)    \\r
+    (This)->lpVtbl -> PercentLoaded(This,percent)\r
+\r
+#define IShockwaveFlash_FrameLoaded(This,FrameNum,loaded)      \\r
+    (This)->lpVtbl -> FrameLoaded(This,FrameNum,loaded)\r
+\r
+#define IShockwaveFlash_FlashVersion(This,version)     \\r
+    (This)->lpVtbl -> FlashVersion(This,version)\r
+\r
+#define IShockwaveFlash_get_WMode(This,pVal)   \\r
+    (This)->lpVtbl -> get_WMode(This,pVal)\r
+\r
+#define IShockwaveFlash_put_WMode(This,pVal)   \\r
+    (This)->lpVtbl -> put_WMode(This,pVal)\r
+\r
+#define IShockwaveFlash_get_SAlign(This,pVal)  \\r
+    (This)->lpVtbl -> get_SAlign(This,pVal)\r
+\r
+#define IShockwaveFlash_put_SAlign(This,pVal)  \\r
+    (This)->lpVtbl -> put_SAlign(This,pVal)\r
+\r
+#define IShockwaveFlash_get_Menu(This,pVal)    \\r
+    (This)->lpVtbl -> get_Menu(This,pVal)\r
+\r
+#define IShockwaveFlash_put_Menu(This,pVal)    \\r
+    (This)->lpVtbl -> put_Menu(This,pVal)\r
+\r
+#define IShockwaveFlash_get_Base(This,pVal)    \\r
+    (This)->lpVtbl -> get_Base(This,pVal)\r
+\r
+#define IShockwaveFlash_put_Base(This,pVal)    \\r
+    (This)->lpVtbl -> put_Base(This,pVal)\r
+\r
+#define IShockwaveFlash_get_Scale(This,pVal)   \\r
+    (This)->lpVtbl -> get_Scale(This,pVal)\r
+\r
+#define IShockwaveFlash_put_Scale(This,pVal)   \\r
+    (This)->lpVtbl -> put_Scale(This,pVal)\r
+\r
+#define IShockwaveFlash_get_DeviceFont(This,pVal)      \\r
+    (This)->lpVtbl -> get_DeviceFont(This,pVal)\r
+\r
+#define IShockwaveFlash_put_DeviceFont(This,pVal)      \\r
+    (This)->lpVtbl -> put_DeviceFont(This,pVal)\r
+\r
+#define IShockwaveFlash_get_EmbedMovie(This,pVal)      \\r
+    (This)->lpVtbl -> get_EmbedMovie(This,pVal)\r
+\r
+#define IShockwaveFlash_put_EmbedMovie(This,pVal)      \\r
+    (This)->lpVtbl -> put_EmbedMovie(This,pVal)\r
+\r
+#define IShockwaveFlash_get_BGColor(This,pVal) \\r
+    (This)->lpVtbl -> get_BGColor(This,pVal)\r
+\r
+#define IShockwaveFlash_put_BGColor(This,pVal) \\r
+    (This)->lpVtbl -> put_BGColor(This,pVal)\r
+\r
+#define IShockwaveFlash_get_Quality2(This,pVal)        \\r
+    (This)->lpVtbl -> get_Quality2(This,pVal)\r
+\r
+#define IShockwaveFlash_put_Quality2(This,pVal)        \\r
+    (This)->lpVtbl -> put_Quality2(This,pVal)\r
+\r
+#define IShockwaveFlash_LoadMovie(This,layer,url)      \\r
+    (This)->lpVtbl -> LoadMovie(This,layer,url)\r
+\r
+#define IShockwaveFlash_TGotoFrame(This,target,FrameNum)       \\r
+    (This)->lpVtbl -> TGotoFrame(This,target,FrameNum)\r
+\r
+#define IShockwaveFlash_TGotoLabel(This,target,label)  \\r
+    (This)->lpVtbl -> TGotoLabel(This,target,label)\r
+\r
+#define IShockwaveFlash_TCurrentFrame(This,target,FrameNum)    \\r
+    (This)->lpVtbl -> TCurrentFrame(This,target,FrameNum)\r
+\r
+#define IShockwaveFlash_TCurrentLabel(This,target,pVal)        \\r
+    (This)->lpVtbl -> TCurrentLabel(This,target,pVal)\r
+\r
+#define IShockwaveFlash_TPlay(This,target)     \\r
+    (This)->lpVtbl -> TPlay(This,target)\r
+\r
+#define IShockwaveFlash_TStopPlay(This,target) \\r
+    (This)->lpVtbl -> TStopPlay(This,target)\r
+\r
+#define IShockwaveFlash_SetVariable(This,name,value)   \\r
+    (This)->lpVtbl -> SetVariable(This,name,value)\r
+\r
+#define IShockwaveFlash_GetVariable(This,name,pVal)    \\r
+    (This)->lpVtbl -> GetVariable(This,name,pVal)\r
+\r
+#define IShockwaveFlash_TSetProperty(This,target,property,value)       \\r
+    (This)->lpVtbl -> TSetProperty(This,target,property,value)\r
+\r
+#define IShockwaveFlash_TGetProperty(This,target,property,pVal)        \\r
+    (This)->lpVtbl -> TGetProperty(This,target,property,pVal)\r
+\r
+#define IShockwaveFlash_TCallFrame(This,target,FrameNum)       \\r
+    (This)->lpVtbl -> TCallFrame(This,target,FrameNum)\r
+\r
+#define IShockwaveFlash_TCallLabel(This,target,label)  \\r
+    (This)->lpVtbl -> TCallLabel(This,target,label)\r
+\r
+#define IShockwaveFlash_TSetPropertyNum(This,target,property,value)    \\r
+    (This)->lpVtbl -> TSetPropertyNum(This,target,property,value)\r
+\r
+#define IShockwaveFlash_TGetPropertyNum(This,target,property,pVal)     \\r
+    (This)->lpVtbl -> TGetPropertyNum(This,target,property,pVal)\r
+\r
+#define IShockwaveFlash_TGetPropertyAsNumber(This,target,property,pVal)        \\r
+    (This)->lpVtbl -> TGetPropertyAsNumber(This,target,property,pVal)\r
+\r
+#define IShockwaveFlash_get_SWRemote(This,pVal)        \\r
+    (This)->lpVtbl -> get_SWRemote(This,pVal)\r
+\r
+#define IShockwaveFlash_put_SWRemote(This,pVal)        \\r
+    (This)->lpVtbl -> put_SWRemote(This,pVal)\r
+\r
+#define IShockwaveFlash_get_FlashVars(This,pVal)       \\r
+    (This)->lpVtbl -> get_FlashVars(This,pVal)\r
+\r
+#define IShockwaveFlash_put_FlashVars(This,pVal)       \\r
+    (This)->lpVtbl -> put_FlashVars(This,pVal)\r
+\r
+#define IShockwaveFlash_get_AllowScriptAccess(This,pVal)       \\r
+    (This)->lpVtbl -> get_AllowScriptAccess(This,pVal)\r
+\r
+#define IShockwaveFlash_put_AllowScriptAccess(This,pVal)       \\r
+    (This)->lpVtbl -> put_AllowScriptAccess(This,pVal)\r
+\r
+#define IShockwaveFlash_get_MovieData(This,pVal)       \\r
+    (This)->lpVtbl -> get_MovieData(This,pVal)\r
+\r
+#define IShockwaveFlash_put_MovieData(This,pVal)       \\r
+    (This)->lpVtbl -> put_MovieData(This,pVal)\r
+\r
+#define IShockwaveFlash_get_InlineData(This,ppIUnknown)        \\r
+    (This)->lpVtbl -> get_InlineData(This,ppIUnknown)\r
+\r
+#define IShockwaveFlash_put_InlineData(This,ppIUnknown)        \\r
+    (This)->lpVtbl -> put_InlineData(This,ppIUnknown)\r
+\r
+#define IShockwaveFlash_get_SeamlessTabbing(This,pVal) \\r
+    (This)->lpVtbl -> get_SeamlessTabbing(This,pVal)\r
+\r
+#define IShockwaveFlash_put_SeamlessTabbing(This,pVal) \\r
+    (This)->lpVtbl -> put_SeamlessTabbing(This,pVal)\r
+\r
+#define IShockwaveFlash_EnforceLocalSecurity(This)     \\r
+    (This)->lpVtbl -> EnforceLocalSecurity(This)\r
+\r
+#define IShockwaveFlash_get_Profile(This,pVal) \\r
+    (This)->lpVtbl -> get_Profile(This,pVal)\r
+\r
+#define IShockwaveFlash_put_Profile(This,pVal) \\r
+    (This)->lpVtbl -> put_Profile(This,pVal)\r
+\r
+#define IShockwaveFlash_get_ProfileAddress(This,pVal)  \\r
+    (This)->lpVtbl -> get_ProfileAddress(This,pVal)\r
+\r
+#define IShockwaveFlash_put_ProfileAddress(This,pVal)  \\r
+    (This)->lpVtbl -> put_ProfileAddress(This,pVal)\r
+\r
+#define IShockwaveFlash_get_ProfilePort(This,pVal)     \\r
+    (This)->lpVtbl -> get_ProfilePort(This,pVal)\r
+\r
+#define IShockwaveFlash_put_ProfilePort(This,pVal)     \\r
+    (This)->lpVtbl -> put_ProfilePort(This,pVal)\r
+\r
+#define IShockwaveFlash_CallFunction(This,request,response)    \\r
+    (This)->lpVtbl -> CallFunction(This,request,response)\r
+\r
+#define IShockwaveFlash_SetReturnValue(This,returnValue)       \\r
+    (This)->lpVtbl -> SetReturnValue(This,returnValue)\r
+\r
+#define IShockwaveFlash_DisableLocalSecurity(This)     \\r
+    (This)->lpVtbl -> DisableLocalSecurity(This)\r
+\r
+#define IShockwaveFlash_get_AllowNetworking(This,pVal) \\r
+    (This)->lpVtbl -> get_AllowNetworking(This,pVal)\r
+\r
+#define IShockwaveFlash_put_AllowNetworking(This,pVal) \\r
+    (This)->lpVtbl -> put_AllowNetworking(This,pVal)\r
+\r
+#define IShockwaveFlash_get_AllowFullScreen(This,pVal) \\r
+    (This)->lpVtbl -> get_AllowFullScreen(This,pVal)\r
+\r
+#define IShockwaveFlash_put_AllowFullScreen(This,pVal) \\r
+    (This)->lpVtbl -> put_AllowFullScreen(This,pVal)\r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_ReadyState_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ long *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_ReadyState_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_TotalFrames_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ long *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_TotalFrames_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_Playing_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ VARIANT_BOOL *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_Playing_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_Playing_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ VARIANT_BOOL pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_Playing_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_Quality_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ int *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_Quality_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_Quality_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ int pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_Quality_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_ScaleMode_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ int *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_ScaleMode_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_ScaleMode_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ int pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_ScaleMode_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_AlignMode_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ int *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_AlignMode_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_AlignMode_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ int pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_AlignMode_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_BackgroundColor_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ long *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_BackgroundColor_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_BackgroundColor_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ long pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_BackgroundColor_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_Loop_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ VARIANT_BOOL *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_Loop_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_Loop_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ VARIANT_BOOL pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_Loop_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_Movie_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_Movie_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_Movie_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_Movie_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_FrameNum_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ long *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_FrameNum_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_FrameNum_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ long pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_FrameNum_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_SetZoomRect_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ long left,\r
+    /* [in] */ long top,\r
+    /* [in] */ long right,\r
+    /* [in] */ long bottom);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_SetZoomRect_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_Zoom_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ int factor);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_Zoom_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_Pan_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ long x,\r
+    /* [in] */ long y,\r
+    /* [in] */ int mode);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_Pan_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_Play_Proxy( \r
+    IShockwaveFlash * This);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_Play_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_Stop_Proxy( \r
+    IShockwaveFlash * This);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_Stop_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_Back_Proxy( \r
+    IShockwaveFlash * This);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_Back_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_Forward_Proxy( \r
+    IShockwaveFlash * This);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_Forward_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_Rewind_Proxy( \r
+    IShockwaveFlash * This);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_Rewind_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_StopPlay_Proxy( \r
+    IShockwaveFlash * This);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_StopPlay_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_GotoFrame_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ long FrameNum);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_GotoFrame_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_CurrentFrame_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ long *FrameNum);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_CurrentFrame_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_IsPlaying_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ VARIANT_BOOL *Playing);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_IsPlaying_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_PercentLoaded_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ long *percent);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_PercentLoaded_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_FrameLoaded_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ long FrameNum,\r
+    /* [retval][out] */ VARIANT_BOOL *loaded);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_FrameLoaded_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_FlashVersion_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ long *version);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_FlashVersion_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_WMode_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_WMode_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_WMode_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_WMode_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_SAlign_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_SAlign_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_SAlign_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_SAlign_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_Menu_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ VARIANT_BOOL *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_Menu_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_Menu_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ VARIANT_BOOL pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_Menu_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_Base_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_Base_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_Base_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_Base_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_Scale_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_Scale_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_Scale_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_Scale_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_DeviceFont_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ VARIANT_BOOL *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_DeviceFont_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_DeviceFont_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ VARIANT_BOOL pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_DeviceFont_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_EmbedMovie_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ VARIANT_BOOL *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_EmbedMovie_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_EmbedMovie_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ VARIANT_BOOL pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_EmbedMovie_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_BGColor_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_BGColor_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_BGColor_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_BGColor_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_Quality2_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_Quality2_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_Quality2_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_Quality2_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_LoadMovie_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ int layer,\r
+    /* [in] */ BSTR url);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_LoadMovie_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_TGotoFrame_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR target,\r
+    /* [in] */ long FrameNum);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_TGotoFrame_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_TGotoLabel_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR target,\r
+    /* [in] */ BSTR label);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_TGotoLabel_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_TCurrentFrame_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR target,\r
+    /* [retval][out] */ long *FrameNum);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_TCurrentFrame_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_TCurrentLabel_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR target,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_TCurrentLabel_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_TPlay_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR target);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_TPlay_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_TStopPlay_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR target);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_TStopPlay_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_SetVariable_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR name,\r
+    /* [in] */ BSTR value);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_SetVariable_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_GetVariable_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR name,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_GetVariable_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_TSetProperty_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR target,\r
+    /* [in] */ int property,\r
+    /* [in] */ BSTR value);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_TSetProperty_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_TGetProperty_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR target,\r
+    /* [in] */ int property,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_TGetProperty_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_TCallFrame_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR target,\r
+    /* [in] */ int FrameNum);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_TCallFrame_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_TCallLabel_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR target,\r
+    /* [in] */ BSTR label);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_TCallLabel_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_TSetPropertyNum_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR target,\r
+    /* [in] */ int property,\r
+    /* [in] */ double value);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_TSetPropertyNum_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_TGetPropertyNum_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR target,\r
+    /* [in] */ int property,\r
+    /* [retval][out] */ double *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_TGetPropertyNum_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_TGetPropertyAsNumber_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR target,\r
+    /* [in] */ int property,\r
+    /* [retval][out] */ double *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_TGetPropertyAsNumber_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_SWRemote_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_SWRemote_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_SWRemote_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_SWRemote_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_FlashVars_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_FlashVars_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_FlashVars_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_FlashVars_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_AllowScriptAccess_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_AllowScriptAccess_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_AllowScriptAccess_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_AllowScriptAccess_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_MovieData_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_MovieData_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_MovieData_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_MovieData_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_InlineData_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ IUnknown **ppIUnknown);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_InlineData_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_InlineData_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ IUnknown *ppIUnknown);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_InlineData_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_SeamlessTabbing_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ VARIANT_BOOL *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_SeamlessTabbing_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_SeamlessTabbing_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ VARIANT_BOOL pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_SeamlessTabbing_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_EnforceLocalSecurity_Proxy( \r
+    IShockwaveFlash * This);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_EnforceLocalSecurity_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_Profile_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ VARIANT_BOOL *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_Profile_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_Profile_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ VARIANT_BOOL pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_Profile_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_ProfileAddress_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_ProfileAddress_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_ProfileAddress_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_ProfileAddress_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_ProfilePort_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ long *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_ProfilePort_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_ProfilePort_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ long pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_ProfilePort_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_CallFunction_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR request,\r
+    /* [retval][out] */ BSTR *response);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_CallFunction_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_SetReturnValue_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR returnValue);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_SetReturnValue_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_DisableLocalSecurity_Proxy( \r
+    IShockwaveFlash * This);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_DisableLocalSecurity_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_AllowNetworking_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_AllowNetworking_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_AllowNetworking_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_AllowNetworking_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_get_AllowFullScreen_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [retval][out] */ BSTR *pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_get_AllowFullScreen_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+/* [helpstring][propput][id] */ HRESULT STDMETHODCALLTYPE IShockwaveFlash_put_AllowFullScreen_Proxy( \r
+    IShockwaveFlash * This,\r
+    /* [in] */ BSTR pVal);\r
+\r
+\r
+void __RPC_STUB IShockwaveFlash_put_AllowFullScreen_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+\r
+#endif         /* __IShockwaveFlash_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef ___IShockwaveFlashEvents_DISPINTERFACE_DEFINED__\r
+#define ___IShockwaveFlashEvents_DISPINTERFACE_DEFINED__\r
+\r
+/* dispinterface _IShockwaveFlashEvents */\r
+/* [hidden][helpstring][uuid] */ \r
+\r
+\r
+EXTERN_C const IID DIID__IShockwaveFlashEvents;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+\r
+    MIDL_INTERFACE("D27CDB6D-AE6D-11CF-96B8-444553540000")\r
+    _IShockwaveFlashEvents : public IDispatch\r
+    {\r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct _IShockwaveFlashEventsVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            _IShockwaveFlashEvents * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            _IShockwaveFlashEvents * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            _IShockwaveFlashEvents * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \r
+            _IShockwaveFlashEvents * This,\r
+            /* [out] */ UINT *pctinfo);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \r
+            _IShockwaveFlashEvents * This,\r
+            /* [in] */ UINT iTInfo,\r
+            /* [in] */ LCID lcid,\r
+            /* [out] */ ITypeInfo **ppTInfo);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \r
+            _IShockwaveFlashEvents * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [size_is][in] */ LPOLESTR *rgszNames,\r
+            /* [in] */ UINT cNames,\r
+            /* [in] */ LCID lcid,\r
+            /* [size_is][out] */ DISPID *rgDispId);\r
+        \r
+        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \r
+            _IShockwaveFlashEvents * This,\r
+            /* [in] */ DISPID dispIdMember,\r
+            /* [in] */ REFIID riid,\r
+            /* [in] */ LCID lcid,\r
+            /* [in] */ WORD wFlags,\r
+            /* [out][in] */ DISPPARAMS *pDispParams,\r
+            /* [out] */ VARIANT *pVarResult,\r
+            /* [out] */ EXCEPINFO *pExcepInfo,\r
+            /* [out] */ UINT *puArgErr);\r
+        \r
+        END_INTERFACE\r
+    } _IShockwaveFlashEventsVtbl;\r
+\r
+    interface _IShockwaveFlashEvents\r
+    {\r
+        CONST_VTBL struct _IShockwaveFlashEventsVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define _IShockwaveFlashEvents_QueryInterface(This,riid,ppvObject)     \\r
+    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)\r
+\r
+#define _IShockwaveFlashEvents_AddRef(This)    \\r
+    (This)->lpVtbl -> AddRef(This)\r
+\r
+#define _IShockwaveFlashEvents_Release(This)   \\r
+    (This)->lpVtbl -> Release(This)\r
+\r
+\r
+#define _IShockwaveFlashEvents_GetTypeInfoCount(This,pctinfo)  \\r
+    (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)\r
+\r
+#define _IShockwaveFlashEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo)   \\r
+    (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)\r
+\r
+#define _IShockwaveFlashEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \\r
+    (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\r
+\r
+#define _IShockwaveFlashEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)   \\r
+    (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+#endif         /* ___IShockwaveFlashEvents_DISPINTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IFlashFactory_INTERFACE_DEFINED__\r
+#define __IFlashFactory_INTERFACE_DEFINED__\r
+\r
+/* interface IFlashFactory */\r
+/* [object][helpstring][uuid] */ \r
+\r
+\r
+EXTERN_C const IID IID_IFlashFactory;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("D27CDB70-AE6D-11CF-96B8-444553540000")\r
+    IFlashFactory : public IUnknown\r
+    {\r
+    public:\r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IFlashFactoryVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IFlashFactory * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IFlashFactory * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IFlashFactory * This);\r
+        \r
+        END_INTERFACE\r
+    } IFlashFactoryVtbl;\r
+\r
+    interface IFlashFactory\r
+    {\r
+        CONST_VTBL struct IFlashFactoryVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IFlashFactory_QueryInterface(This,riid,ppvObject)      \\r
+    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)\r
+\r
+#define IFlashFactory_AddRef(This)     \\r
+    (This)->lpVtbl -> AddRef(This)\r
+\r
+#define IFlashFactory_Release(This)    \\r
+    (This)->lpVtbl -> Release(This)\r
+\r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IFlashFactory_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IFlashObjectInterface_INTERFACE_DEFINED__\r
+#define __IFlashObjectInterface_INTERFACE_DEFINED__\r
+\r
+/* interface IFlashObjectInterface */\r
+/* [object][helpstring][uuid] */ \r
+\r
+\r
+EXTERN_C const IID IID_IFlashObjectInterface;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("D27CDB72-AE6D-11CF-96B8-444553540000")\r
+    IFlashObjectInterface : public IDispatchEx\r
+    {\r
+    public:\r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IFlashObjectInterfaceVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IFlashObjectInterface * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IFlashObjectInterface * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IFlashObjectInterface * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \r
+            IFlashObjectInterface * This,\r
+            /* [out] */ UINT *pctinfo);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \r
+            IFlashObjectInterface * This,\r
+            /* [in] */ UINT iTInfo,\r
+            /* [in] */ LCID lcid,\r
+            /* [out] */ ITypeInfo **ppTInfo);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \r
+            IFlashObjectInterface * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [size_is][in] */ LPOLESTR *rgszNames,\r
+            /* [in] */ UINT cNames,\r
+            /* [in] */ LCID lcid,\r
+            /* [size_is][out] */ DISPID *rgDispId);\r
+        \r
+        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \r
+            IFlashObjectInterface * This,\r
+            /* [in] */ DISPID dispIdMember,\r
+            /* [in] */ REFIID riid,\r
+            /* [in] */ LCID lcid,\r
+            /* [in] */ WORD wFlags,\r
+            /* [out][in] */ DISPPARAMS *pDispParams,\r
+            /* [out] */ VARIANT *pVarResult,\r
+            /* [out] */ EXCEPINFO *pExcepInfo,\r
+            /* [out] */ UINT *puArgErr);\r
+        \r
+        HRESULT ( __stdcall *GetDispID )( \r
+            IFlashObjectInterface * This,\r
+            /* [in] */ BSTR bstrName,\r
+            /* [in] */ unsigned long grfdex,\r
+            /* [out] */ long *pid);\r
+        \r
+        HRESULT ( __stdcall *RemoteInvokeEx )( \r
+            IFlashObjectInterface * This,\r
+            /* [in] */ long id,\r
+            /* [in] */ unsigned long lcid,\r
+            /* [in] */ unsigned long dwFlags,\r
+            /* [in] */ DISPPARAMS *pdp,\r
+            /* [out] */ VARIANT *pvarRes,\r
+            /* [out] */ EXCEPINFO *pei,\r
+            /* [in] */ IServiceProvider *pspCaller,\r
+            /* [in] */ unsigned int cvarRefArg,\r
+            /* [in] */ unsigned int *rgiRefArg,\r
+            /* [out][in] */ VARIANT *rgvarRefArg);\r
+        \r
+        HRESULT ( __stdcall *DeleteMemberByName )( \r
+            IFlashObjectInterface * This,\r
+            /* [in] */ BSTR bstrName,\r
+            /* [in] */ unsigned long grfdex);\r
+        \r
+        HRESULT ( __stdcall *DeleteMemberByDispID )( \r
+            IFlashObjectInterface * This,\r
+            /* [in] */ long id);\r
+        \r
+        HRESULT ( __stdcall *GetMemberProperties )( \r
+            IFlashObjectInterface * This,\r
+            /* [in] */ long id,\r
+            /* [in] */ unsigned long grfdexFetch,\r
+            /* [out] */ unsigned long *pgrfdex);\r
+        \r
+        HRESULT ( __stdcall *GetMemberName )( \r
+            IFlashObjectInterface * This,\r
+            /* [in] */ long id,\r
+            /* [out] */ BSTR *pbstrName);\r
+        \r
+        HRESULT ( __stdcall *GetNextDispID )( \r
+            IFlashObjectInterface * This,\r
+            /* [in] */ unsigned long grfdex,\r
+            /* [in] */ long id,\r
+            /* [out] */ long *pid);\r
+        \r
+        HRESULT ( __stdcall *GetNameSpaceParent )( \r
+            IFlashObjectInterface * This,\r
+            /* [out] */ IUnknown **ppunk);\r
+        \r
+        END_INTERFACE\r
+    } IFlashObjectInterfaceVtbl;\r
+\r
+    interface IFlashObjectInterface\r
+    {\r
+        CONST_VTBL struct IFlashObjectInterfaceVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IFlashObjectInterface_QueryInterface(This,riid,ppvObject)      \\r
+    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)\r
+\r
+#define IFlashObjectInterface_AddRef(This)     \\r
+    (This)->lpVtbl -> AddRef(This)\r
+\r
+#define IFlashObjectInterface_Release(This)    \\r
+    (This)->lpVtbl -> Release(This)\r
+\r
+\r
+#define IFlashObjectInterface_GetTypeInfoCount(This,pctinfo)   \\r
+    (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)\r
+\r
+#define IFlashObjectInterface_GetTypeInfo(This,iTInfo,lcid,ppTInfo)    \\r
+    (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)\r
+\r
+#define IFlashObjectInterface_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)  \\r
+    (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\r
+\r
+#define IFlashObjectInterface_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)    \\r
+    (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\r
+\r
+\r
+#define IFlashObjectInterface_GetDispID(This,bstrName,grfdex,pid)      \\r
+    (This)->lpVtbl -> GetDispID(This,bstrName,grfdex,pid)\r
+\r
+#define IFlashObjectInterface_RemoteInvokeEx(This,id,lcid,dwFlags,pdp,pvarRes,pei,pspCaller,cvarRefArg,rgiRefArg,rgvarRefArg)  \\r
+    (This)->lpVtbl -> RemoteInvokeEx(This,id,lcid,dwFlags,pdp,pvarRes,pei,pspCaller,cvarRefArg,rgiRefArg,rgvarRefArg)\r
+\r
+#define IFlashObjectInterface_DeleteMemberByName(This,bstrName,grfdex) \\r
+    (This)->lpVtbl -> DeleteMemberByName(This,bstrName,grfdex)\r
+\r
+#define IFlashObjectInterface_DeleteMemberByDispID(This,id)    \\r
+    (This)->lpVtbl -> DeleteMemberByDispID(This,id)\r
+\r
+#define IFlashObjectInterface_GetMemberProperties(This,id,grfdexFetch,pgrfdex) \\r
+    (This)->lpVtbl -> GetMemberProperties(This,id,grfdexFetch,pgrfdex)\r
+\r
+#define IFlashObjectInterface_GetMemberName(This,id,pbstrName) \\r
+    (This)->lpVtbl -> GetMemberName(This,id,pbstrName)\r
+\r
+#define IFlashObjectInterface_GetNextDispID(This,grfdex,id,pid)        \\r
+    (This)->lpVtbl -> GetNextDispID(This,grfdex,id,pid)\r
+\r
+#define IFlashObjectInterface_GetNameSpaceParent(This,ppunk)   \\r
+    (This)->lpVtbl -> GetNameSpaceParent(This,ppunk)\r
+\r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+\r
+#endif         /* __IFlashObjectInterface_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IDispatchEx_INTERFACE_DEFINED__\r
+#define __IDispatchEx_INTERFACE_DEFINED__\r
+\r
+/* interface IDispatchEx */\r
+/* [object][uuid] */ \r
+\r
+\r
+EXTERN_C const IID IID_IDispatchEx;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("A6EF9860-C720-11D0-9337-00A0C90DCAA9")\r
+    IDispatchEx : public IDispatch\r
+    {\r
+    public:\r
+        virtual HRESULT __stdcall GetDispID( \r
+            /* [in] */ BSTR bstrName,\r
+            /* [in] */ unsigned long grfdex,\r
+            /* [out] */ long *pid) = 0;\r
+        \r
+        virtual HRESULT __stdcall RemoteInvokeEx( \r
+            /* [in] */ long id,\r
+            /* [in] */ unsigned long lcid,\r
+            /* [in] */ unsigned long dwFlags,\r
+            /* [in] */ DISPPARAMS *pdp,\r
+            /* [out] */ VARIANT *pvarRes,\r
+            /* [out] */ EXCEPINFO *pei,\r
+            /* [in] */ IServiceProvider *pspCaller,\r
+            /* [in] */ unsigned int cvarRefArg,\r
+            /* [in] */ unsigned int *rgiRefArg,\r
+            /* [out][in] */ VARIANT *rgvarRefArg) = 0;\r
+        \r
+        virtual HRESULT __stdcall DeleteMemberByName( \r
+            /* [in] */ BSTR bstrName,\r
+            /* [in] */ unsigned long grfdex) = 0;\r
+        \r
+        virtual HRESULT __stdcall DeleteMemberByDispID( \r
+            /* [in] */ long id) = 0;\r
+        \r
+        virtual HRESULT __stdcall GetMemberProperties( \r
+            /* [in] */ long id,\r
+            /* [in] */ unsigned long grfdexFetch,\r
+            /* [out] */ unsigned long *pgrfdex) = 0;\r
+        \r
+        virtual HRESULT __stdcall GetMemberName( \r
+            /* [in] */ long id,\r
+            /* [out] */ BSTR *pbstrName) = 0;\r
+        \r
+        virtual HRESULT __stdcall GetNextDispID( \r
+            /* [in] */ unsigned long grfdex,\r
+            /* [in] */ long id,\r
+            /* [out] */ long *pid) = 0;\r
+        \r
+        virtual HRESULT __stdcall GetNameSpaceParent( \r
+            /* [out] */ IUnknown **ppunk) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IDispatchExVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IDispatchEx * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IDispatchEx * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IDispatchEx * This);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )( \r
+            IDispatchEx * This,\r
+            /* [out] */ UINT *pctinfo);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )( \r
+            IDispatchEx * This,\r
+            /* [in] */ UINT iTInfo,\r
+            /* [in] */ LCID lcid,\r
+            /* [out] */ ITypeInfo **ppTInfo);\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )( \r
+            IDispatchEx * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [size_is][in] */ LPOLESTR *rgszNames,\r
+            /* [in] */ UINT cNames,\r
+            /* [in] */ LCID lcid,\r
+            /* [size_is][out] */ DISPID *rgDispId);\r
+        \r
+        /* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )( \r
+            IDispatchEx * This,\r
+            /* [in] */ DISPID dispIdMember,\r
+            /* [in] */ REFIID riid,\r
+            /* [in] */ LCID lcid,\r
+            /* [in] */ WORD wFlags,\r
+            /* [out][in] */ DISPPARAMS *pDispParams,\r
+            /* [out] */ VARIANT *pVarResult,\r
+            /* [out] */ EXCEPINFO *pExcepInfo,\r
+            /* [out] */ UINT *puArgErr);\r
+        \r
+        HRESULT ( __stdcall *GetDispID )( \r
+            IDispatchEx * This,\r
+            /* [in] */ BSTR bstrName,\r
+            /* [in] */ unsigned long grfdex,\r
+            /* [out] */ long *pid);\r
+        \r
+        HRESULT ( __stdcall *RemoteInvokeEx )( \r
+            IDispatchEx * This,\r
+            /* [in] */ long id,\r
+            /* [in] */ unsigned long lcid,\r
+            /* [in] */ unsigned long dwFlags,\r
+            /* [in] */ DISPPARAMS *pdp,\r
+            /* [out] */ VARIANT *pvarRes,\r
+            /* [out] */ EXCEPINFO *pei,\r
+            /* [in] */ IServiceProvider *pspCaller,\r
+            /* [in] */ unsigned int cvarRefArg,\r
+            /* [in] */ unsigned int *rgiRefArg,\r
+            /* [out][in] */ VARIANT *rgvarRefArg);\r
+        \r
+        HRESULT ( __stdcall *DeleteMemberByName )( \r
+            IDispatchEx * This,\r
+            /* [in] */ BSTR bstrName,\r
+            /* [in] */ unsigned long grfdex);\r
+        \r
+        HRESULT ( __stdcall *DeleteMemberByDispID )( \r
+            IDispatchEx * This,\r
+            /* [in] */ long id);\r
+        \r
+        HRESULT ( __stdcall *GetMemberProperties )( \r
+            IDispatchEx * This,\r
+            /* [in] */ long id,\r
+            /* [in] */ unsigned long grfdexFetch,\r
+            /* [out] */ unsigned long *pgrfdex);\r
+        \r
+        HRESULT ( __stdcall *GetMemberName )( \r
+            IDispatchEx * This,\r
+            /* [in] */ long id,\r
+            /* [out] */ BSTR *pbstrName);\r
+        \r
+        HRESULT ( __stdcall *GetNextDispID )( \r
+            IDispatchEx * This,\r
+            /* [in] */ unsigned long grfdex,\r
+            /* [in] */ long id,\r
+            /* [out] */ long *pid);\r
+        \r
+        HRESULT ( __stdcall *GetNameSpaceParent )( \r
+            IDispatchEx * This,\r
+            /* [out] */ IUnknown **ppunk);\r
+        \r
+        END_INTERFACE\r
+    } IDispatchExVtbl;\r
+\r
+    interface IDispatchEx\r
+    {\r
+        CONST_VTBL struct IDispatchExVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IDispatchEx_QueryInterface(This,riid,ppvObject)        \\r
+    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)\r
+\r
+#define IDispatchEx_AddRef(This)       \\r
+    (This)->lpVtbl -> AddRef(This)\r
+\r
+#define IDispatchEx_Release(This)      \\r
+    (This)->lpVtbl -> Release(This)\r
+\r
+\r
+#define IDispatchEx_GetTypeInfoCount(This,pctinfo)     \\r
+    (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)\r
+\r
+#define IDispatchEx_GetTypeInfo(This,iTInfo,lcid,ppTInfo)      \\r
+    (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)\r
+\r
+#define IDispatchEx_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)    \\r
+    (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)\r
+\r
+#define IDispatchEx_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)      \\r
+    (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)\r
+\r
+\r
+#define IDispatchEx_GetDispID(This,bstrName,grfdex,pid)        \\r
+    (This)->lpVtbl -> GetDispID(This,bstrName,grfdex,pid)\r
+\r
+#define IDispatchEx_RemoteInvokeEx(This,id,lcid,dwFlags,pdp,pvarRes,pei,pspCaller,cvarRefArg,rgiRefArg,rgvarRefArg)    \\r
+    (This)->lpVtbl -> RemoteInvokeEx(This,id,lcid,dwFlags,pdp,pvarRes,pei,pspCaller,cvarRefArg,rgiRefArg,rgvarRefArg)\r
+\r
+#define IDispatchEx_DeleteMemberByName(This,bstrName,grfdex)   \\r
+    (This)->lpVtbl -> DeleteMemberByName(This,bstrName,grfdex)\r
+\r
+#define IDispatchEx_DeleteMemberByDispID(This,id)      \\r
+    (This)->lpVtbl -> DeleteMemberByDispID(This,id)\r
+\r
+#define IDispatchEx_GetMemberProperties(This,id,grfdexFetch,pgrfdex)   \\r
+    (This)->lpVtbl -> GetMemberProperties(This,id,grfdexFetch,pgrfdex)\r
+\r
+#define IDispatchEx_GetMemberName(This,id,pbstrName)   \\r
+    (This)->lpVtbl -> GetMemberName(This,id,pbstrName)\r
+\r
+#define IDispatchEx_GetNextDispID(This,grfdex,id,pid)  \\r
+    (This)->lpVtbl -> GetNextDispID(This,grfdex,id,pid)\r
+\r
+#define IDispatchEx_GetNameSpaceParent(This,ppunk)     \\r
+    (This)->lpVtbl -> GetNameSpaceParent(This,ppunk)\r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+HRESULT __stdcall IDispatchEx_GetDispID_Proxy( \r
+    IDispatchEx * This,\r
+    /* [in] */ BSTR bstrName,\r
+    /* [in] */ unsigned long grfdex,\r
+    /* [out] */ long *pid);\r
+\r
+\r
+void __RPC_STUB IDispatchEx_GetDispID_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+HRESULT __stdcall IDispatchEx_RemoteInvokeEx_Proxy( \r
+    IDispatchEx * This,\r
+    /* [in] */ long id,\r
+    /* [in] */ unsigned long lcid,\r
+    /* [in] */ unsigned long dwFlags,\r
+    /* [in] */ DISPPARAMS *pdp,\r
+    /* [out] */ VARIANT *pvarRes,\r
+    /* [out] */ EXCEPINFO *pei,\r
+    /* [in] */ IServiceProvider *pspCaller,\r
+    /* [in] */ unsigned int cvarRefArg,\r
+    /* [in] */ unsigned int *rgiRefArg,\r
+    /* [out][in] */ VARIANT *rgvarRefArg);\r
+\r
+\r
+void __RPC_STUB IDispatchEx_RemoteInvokeEx_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+HRESULT __stdcall IDispatchEx_DeleteMemberByName_Proxy( \r
+    IDispatchEx * This,\r
+    /* [in] */ BSTR bstrName,\r
+    /* [in] */ unsigned long grfdex);\r
+\r
+\r
+void __RPC_STUB IDispatchEx_DeleteMemberByName_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+HRESULT __stdcall IDispatchEx_DeleteMemberByDispID_Proxy( \r
+    IDispatchEx * This,\r
+    /* [in] */ long id);\r
+\r
+\r
+void __RPC_STUB IDispatchEx_DeleteMemberByDispID_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+HRESULT __stdcall IDispatchEx_GetMemberProperties_Proxy( \r
+    IDispatchEx * This,\r
+    /* [in] */ long id,\r
+    /* [in] */ unsigned long grfdexFetch,\r
+    /* [out] */ unsigned long *pgrfdex);\r
+\r
+\r
+void __RPC_STUB IDispatchEx_GetMemberProperties_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+HRESULT __stdcall IDispatchEx_GetMemberName_Proxy( \r
+    IDispatchEx * This,\r
+    /* [in] */ long id,\r
+    /* [out] */ BSTR *pbstrName);\r
+\r
+\r
+void __RPC_STUB IDispatchEx_GetMemberName_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+HRESULT __stdcall IDispatchEx_GetNextDispID_Proxy( \r
+    IDispatchEx * This,\r
+    /* [in] */ unsigned long grfdex,\r
+    /* [in] */ long id,\r
+    /* [out] */ long *pid);\r
+\r
+\r
+void __RPC_STUB IDispatchEx_GetNextDispID_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+HRESULT __stdcall IDispatchEx_GetNameSpaceParent_Proxy( \r
+    IDispatchEx * This,\r
+    /* [out] */ IUnknown **ppunk);\r
+\r
+\r
+void __RPC_STUB IDispatchEx_GetNameSpaceParent_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+\r
+#endif         /* __IDispatchEx_INTERFACE_DEFINED__ */\r
+\r
+\r
+#ifndef __IServiceProvider_INTERFACE_DEFINED__\r
+#define __IServiceProvider_INTERFACE_DEFINED__\r
+\r
+/* interface IServiceProvider */\r
+/* [object][uuid] */ \r
+\r
+\r
+EXTERN_C const IID IID_IServiceProvider;\r
+\r
+#if defined(__cplusplus) && !defined(CINTERFACE)\r
+    \r
+    MIDL_INTERFACE("6D5140C1-7436-11CE-8034-00AA006009FA")\r
+    IServiceProvider : public IUnknown\r
+    {\r
+    public:\r
+        virtual HRESULT __stdcall RemoteQueryService( \r
+            /* [in] */ GUID *guidService,\r
+            /* [in] */ GUID *riid,\r
+            /* [out] */ IUnknown **ppvObject) = 0;\r
+        \r
+    };\r
+    \r
+#else  /* C style interface */\r
+\r
+    typedef struct IServiceProviderVtbl\r
+    {\r
+        BEGIN_INTERFACE\r
+        \r
+        HRESULT ( STDMETHODCALLTYPE *QueryInterface )( \r
+            IServiceProvider * This,\r
+            /* [in] */ REFIID riid,\r
+            /* [iid_is][out] */ void **ppvObject);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *AddRef )( \r
+            IServiceProvider * This);\r
+        \r
+        ULONG ( STDMETHODCALLTYPE *Release )( \r
+            IServiceProvider * This);\r
+        \r
+        HRESULT ( __stdcall *RemoteQueryService )( \r
+            IServiceProvider * This,\r
+            /* [in] */ GUID *guidService,\r
+            /* [in] */ GUID *riid,\r
+            /* [out] */ IUnknown **ppvObject);\r
+        \r
+        END_INTERFACE\r
+    } IServiceProviderVtbl;\r
+\r
+    interface IServiceProvider\r
+    {\r
+        CONST_VTBL struct IServiceProviderVtbl *lpVtbl;\r
+    };\r
+\r
+    \r
+\r
+#ifdef COBJMACROS\r
+\r
+\r
+#define IServiceProvider_QueryInterface(This,riid,ppvObject)   \\r
+    (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)\r
+\r
+#define IServiceProvider_AddRef(This)  \\r
+    (This)->lpVtbl -> AddRef(This)\r
+\r
+#define IServiceProvider_Release(This) \\r
+    (This)->lpVtbl -> Release(This)\r
+\r
+\r
+#define IServiceProvider_RemoteQueryService(This,guidService,riid,ppvObject)   \\r
+    (This)->lpVtbl -> RemoteQueryService(This,guidService,riid,ppvObject)\r
+\r
+#endif /* COBJMACROS */\r
+\r
+\r
+#endif         /* C style interface */\r
+\r
+\r
+\r
+HRESULT __stdcall IServiceProvider_RemoteQueryService_Proxy( \r
+    IServiceProvider * This,\r
+    /* [in] */ GUID *guidService,\r
+    /* [in] */ GUID *riid,\r
+    /* [out] */ IUnknown **ppvObject);\r
+\r
+\r
+void __RPC_STUB IServiceProvider_RemoteQueryService_Stub(\r
+    IRpcStubBuffer *This,\r
+    IRpcChannelBuffer *_pRpcChannelBuffer,\r
+    PRPC_MESSAGE _pRpcMessage,\r
+    DWORD *_pdwStubPhase);\r
+\r
+\r
+\r
+#endif         /* __IServiceProvider_INTERFACE_DEFINED__ */\r
+\r
+\r
+EXTERN_C const CLSID CLSID_ShockwaveFlash;\r
+\r
+#ifdef __cplusplus\r
+\r
+class DECLSPEC_UUID("D27CDB6E-AE6D-11CF-96B8-444553540000")\r
+ShockwaveFlash;\r
+#endif\r
+\r
+EXTERN_C const CLSID CLSID_FlashObjectInterface;\r
+\r
+#ifdef __cplusplus\r
+\r
+class DECLSPEC_UUID("D27CDB71-AE6D-11CF-96B8-444553540000")\r
+FlashObjectInterface;\r
+#endif\r
+#endif /* __ShockwaveFlashObjects_LIBRARY_DEFINED__ */\r
+\r
+/* Additional Prototypes for ALL interfaces */\r
+\r
+/* end of Additional Prototypes */\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif\r
+\r
+\r
diff --git a/core/producer/flash/cg_producer.cpp b/core/producer/flash/cg_producer.cpp
new file mode 100644 (file)
index 0000000..94d544d
--- /dev/null
@@ -0,0 +1,280 @@
+#include "../../StdAfx.h"\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (disable : 4714) // marked as __forceinline not inlined\r
+#endif\r
+\r
+#include "cg_producer.h"\r
+#include "flash_producer.h"\r
+\r
+#include "../../renderer/render_device.h"\r
+#include "../../frame/frame_format.h"\r
+#include "../../frame/frame.h"\r
+#include "../../Server.h"\r
+\r
+#include <boost/filesystem.hpp>\r
+#include <boost/assign.hpp>\r
+#include <tbb/concurrent_unordered_map.h>\r
+               \r
+namespace caspar{ namespace flash{\r
+\r
+struct flash_cg_proxy\r
+{\r
+       virtual std::wstring add(int layer, const std::wstring& templateName,  bool playOnLoad, const std::wstring& startFromLabel = TEXT(""), const std::wstring& data = TEXT("")) = 0;\r
+       virtual std::wstring remove(int layer) = 0;\r
+       virtual std::wstring play(int layer)  = 0;\r
+       virtual std::wstring stop(int layer, unsigned int mixOutDuration) = 0;\r
+       virtual std::wstring next(int layer) = 0;\r
+       virtual std::wstring update(int layer, const std::wstring& data) = 0;\r
+       virtual std::wstring invoke(int layer, const std::wstring& label) = 0;\r
+};\r
+\r
+struct flash_cg_proxy16 : public flash_cg_proxy\r
+{              \r
+       virtual std::wstring add(int layer, const std::wstring& templateName, bool playOnLoad, const std::wstring& label, const std::wstring& data) \r
+       {\r
+               std::wstringstream flashParam;\r
+               std::wstring::size_type pos = templateName.find('.');\r
+               std::wstring filename = (pos != std::wstring::npos) ? templateName.substr(0, pos) : templateName;               \r
+               flashParam << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << filename << TEXT("</string><number>0</number>") << (playOnLoad?TEXT("<true/>"):TEXT("<false/>")) << TEXT("<string>") << label << TEXT("</string><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+\r
+       virtual std::wstring remove(int layer) \r
+       {\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"Delete\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+\r
+       virtual std::wstring play(int layer) \r
+       {\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"Play\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+\r
+       virtual std::wstring stop(int layer, unsigned int mixOutDuration) \r
+       {\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"Stop\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><number>") << mixOutDuration << TEXT("</number></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+\r
+       virtual std::wstring next(int layer) \r
+       {\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"Next\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+\r
+       virtual std::wstring update(int layer, const std::wstring& data) \r
+       {\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"SetData\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+\r
+       virtual std::wstring invoke(int layer, const std::wstring& label) \r
+       {\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"ExecuteMethod\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << label << TEXT("</string></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+};\r
+\r
+struct flash_cg_proxy17 : public flash_cg_proxy\r
+{\r
+       virtual std::wstring add(int layer, const std::wstring& templateName, bool playOnLoad, const std::wstring& label, const std::wstring& data) \r
+       {\r
+               std::wstringstream flashParam;\r
+\r
+               std::wstring::size_type pos = templateName.find('.');\r
+               std::wstring filename = (pos != std::wstring::npos) ? templateName.substr(0, pos) : templateName;\r
+               \r
+               flashParam << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << filename << TEXT("</string>") << (playOnLoad?TEXT("<true/>"):TEXT("<false/>")) << TEXT("<string>") << label << TEXT("</string><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+\r
+       virtual std::wstring remove(int layer) \r
+       {\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"Delete\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+\r
+       virtual std::wstring play(int layer) \r
+       {\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"Play\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+\r
+       virtual std::wstring stop(int layer, unsigned int mixOutDuration)\r
+       {\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"Stop\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><number>") << mixOutDuration << TEXT("</number></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+\r
+       virtual std::wstring next(int layer)\r
+       {\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"Next\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+\r
+       virtual std::wstring update(int layer, const std::wstring& data) \r
+       {\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"SetData\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+\r
+       virtual std::wstring invoke(int layer, const std::wstring& label)\r
+       {\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"Invoke\" returntype=\"xml\"><arguments><array><property id=\"0\"><number>") << layer << TEXT("</number></property></array><string>") << label << TEXT("</string></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+};\r
+\r
+struct flash_cg_proxy18 : public flash_cg_proxy17\r
+{\r
+       virtual std::wstring add(int layer, const std::wstring& templateName, bool playOnLoad, const std::wstring& label, const std::wstring& data)\r
+       {\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>") << layer << TEXT("</number><string>") << templateName << TEXT("</string>") << (playOnLoad?TEXT("<true/>"):TEXT("<false/>")) << TEXT("<string>") << label << TEXT("</string><string><![CDATA[ ") << data << TEXT(" ]]></string></arguments></invoke>");\r
+               return flashParam.str();\r
+       }\r
+};\r
+\r
+struct cg_producer::implementation : boost::noncopyable\r
+{\r
+public:\r
+\r
+       implementation(const frame_format_desc& fmtDesc, Monitor* pMonitor) : format_desc_(fmtDesc)\r
+       {\r
+               if(boost::filesystem::exists(server::template_folder()+TEXT("cg.fth.18")))\r
+               {\r
+                       flash_producer_ = std::make_shared<flash_producer>(server::template_folder()+TEXT("cg.fth.18"), fmtDesc, pMonitor);\r
+                       proxy_.reset(new flash_cg_proxy18());\r
+                       CASPAR_LOG(info) << L"Running version 1.8 template graphics.";\r
+               }\r
+               else if(boost::filesystem::exists(server::template_folder()+TEXT("cg.fth.17")))\r
+               {\r
+                       flash_producer_ = std::make_shared<flash_producer>(server::template_folder()+TEXT("cg.fth.17"), fmtDesc, pMonitor);\r
+                       proxy_.reset(new flash_cg_proxy17());\r
+                       CASPAR_LOG(info) << L"Running version 1.7 template graphics.";\r
+               }\r
+               else if(boost::filesystem::exists(server::template_folder()+TEXT("cg.fth"))) \r
+               {\r
+                       flash_producer_ = std::make_shared<flash_producer>(server::template_folder()+TEXT("cg.fth"), fmtDesc, pMonitor);\r
+                       proxy_.reset(new flash_cg_proxy16());\r
+                       CASPAR_LOG(info) << L"Running version 1.6 template graphics.";\r
+               }\r
+               else \r
+                       CASPAR_LOG(info) << L"No templatehost found. Template graphics will be disabled";\r
+               \r
+       }\r
+\r
+       void clear()\r
+       {\r
+               flash_producer_.reset();\r
+       }\r
+\r
+       void add(int layer, const std::wstring& templateName,  bool playOnLoad, const std::wstring& startFromLabel, const std::wstring& data)\r
+       {\r
+               if(flash_producer_ == nullptr)\r
+                       return;\r
+               CASPAR_LOG(info) << "Invoking add-command";\r
+               flash_producer_->param(proxy_->add(layer, templateName, playOnLoad, startFromLabel, data));\r
+       }\r
+\r
+       void remove(int layer)\r
+       {\r
+               if(flash_producer_ == nullptr)\r
+                       return;\r
+               CASPAR_LOG(info) << "Invoking remove-command";\r
+               flash_producer_->param(proxy_->remove(layer));\r
+       }\r
+\r
+       void play(int layer)\r
+       {\r
+               if(flash_producer_ == nullptr)\r
+                       return;\r
+               CASPAR_LOG(info) << "Invoking play-command";\r
+               flash_producer_->param(proxy_->play(layer));\r
+       }\r
+\r
+       void stop(int layer, unsigned int mixOutDuration)\r
+       {\r
+               if(flash_producer_ == nullptr)\r
+                       return;\r
+               CASPAR_LOG(info) << "Invoking stop-command";\r
+               flash_producer_->param(proxy_->stop(layer, mixOutDuration));\r
+       }\r
+\r
+       void next(int layer)\r
+       {\r
+               if(flash_producer_ == nullptr)\r
+                       return;\r
+               CASPAR_LOG(info) << "Invoking next-command";\r
+               flash_producer_->param(proxy_->next(layer));\r
+       }\r
+\r
+       void update(int layer, const std::wstring& data)\r
+       {\r
+               if(flash_producer_ == nullptr)\r
+                       return;\r
+               CASPAR_LOG(info) << "Invoking update-command";\r
+               flash_producer_->param(proxy_->update(layer, data));\r
+       }\r
+\r
+       void invoke(int layer, const std::wstring& label)\r
+       {\r
+               if(flash_producer_ == nullptr)\r
+                       return;\r
+               CASPAR_LOG(info) << "Invoking invoke-command";\r
+               flash_producer_->param(proxy_->invoke(layer, label));\r
+       }\r
+\r
+       frame_ptr get_frame()\r
+       {\r
+               return flash_producer_ ? flash_producer_->get_frame() : nullptr;\r
+       }\r
+\r
+       frame_format_desc format_desc_;\r
+       flash_producer_ptr flash_producer_;\r
+       std::unique_ptr<flash_cg_proxy> proxy_;\r
+};\r
+       \r
+\r
+// This is somewhat a hack... needs redesign\r
+cg_producer_ptr get_default_cg_producer(const renderer::render_device_ptr& prender_device, unsigned int exLayer)\r
+{\r
+       if(!prender_device)\r
+               BOOST_THROW_EXCEPTION(null_argument() << msg_info("prender_device"));\r
+       \r
+       auto pProducer = std::dynamic_pointer_cast<cg_producer>(prender_device->active(exLayer));\r
+       if(!pProducer)  \r
+       {\r
+               pProducer = std::make_shared<cg_producer>(prender_device->frame_format_desc(), &prender_device->monitor());             \r
+               prender_device->load(exLayer, pProducer, renderer::load_option::auto_play); \r
+       }\r
+       \r
+       return pProducer;\r
+}\r
+\r
+cg_producer::cg_producer(const frame_format_desc& fmtDesc, Monitor* pMonitor) : impl_(new implementation(fmtDesc, pMonitor)){}\r
+frame_ptr cg_producer::get_frame(){return impl_->get_frame();}\r
+void cg_producer::clear(){impl_->clear();}\r
+void cg_producer::add(int layer, const std::wstring& templateName,  bool playOnLoad, const std::wstring& startFromLabel, const std::wstring& data){impl_->add(layer, templateName, playOnLoad, startFromLabel, data);}\r
+void cg_producer::remove(int layer){impl_->remove(layer);}\r
+void cg_producer::play(int layer){impl_->play(layer);}\r
+void cg_producer::stop(int layer, unsigned int mixOutDuration){impl_->stop(layer, mixOutDuration);}\r
+void cg_producer::next(int layer){impl_->next(layer);}\r
+void cg_producer::update(int layer, const std::wstring& data){impl_->update(layer, data);}\r
+void cg_producer::invoke(int layer, const std::wstring& label){impl_->invoke(layer, label);}\r
+const frame_format_desc& cg_producer::get_frame_format_desc() const { return impl_->format_desc_; }\r
+}}
\ No newline at end of file
diff --git a/core/producer/flash/cg_producer.h b/core/producer/flash/cg_producer.h
new file mode 100644 (file)
index 0000000..857181b
--- /dev/null
@@ -0,0 +1,36 @@
+#pragma once\r
+\r
+#include "../frame_producer.h"\r
+#include "../../frame/frame_fwd.h"\r
+#include "../../renderer/render_device.h"\r
+\r
+namespace caspar{ namespace flash{\r
+               \r
+class cg_producer : public frame_producer\r
+{\r
+public:\r
+       cg_producer(const frame_format_desc& format_desc, Monitor* pMonitor);\r
+       \r
+       frame_ptr get_frame();\r
+\r
+       void clear();\r
+       void add(int layer, const std::wstring& template_name,  bool play_on_load, const std::wstring& start_from_label = TEXT(""), const std::wstring& data = TEXT(""));\r
+       void remove(int layer);\r
+       void play(int layer);\r
+       void stop(int layer, unsigned int mix_out_duration);\r
+       void next(int layer);\r
+       void update(int layer, const std::wstring& data);\r
+       void invoke(int layer, const std::wstring& label);\r
+\r
+       const frame_format_desc& get_frame_format_desc() const;\r
+private:\r
+       struct implementation;\r
+       std::shared_ptr<implementation> impl_;\r
+};\r
+typedef std::shared_ptr<cg_producer> cg_producer_ptr;\r
+\r
+static const unsigned int CG_DEFAULT_LAYER = 5000;\r
+\r
+cg_producer_ptr get_default_cg_producer(const renderer::render_device_ptr& render_device, unsigned int layer_index = CG_DEFAULT_LAYER);\r
+\r
+}}
\ No newline at end of file
diff --git a/core/producer/flash/ct_producer.cpp b/core/producer/flash/ct_producer.cpp
new file mode 100644 (file)
index 0000000..b7c5193
--- /dev/null
@@ -0,0 +1,56 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "../../stdafx.h"\r
+\r
+#include "ct_producer.h"\r
+\r
+#include "cg_producer.h"\r
+\r
+#include "../../../common/utility/find_file.h"\r
+#include "../../frame/frame.h"\r
+#include "../../server.h"\r
+\r
+#include <boost/assign/list_of.hpp>\r
+\r
+using namespace boost::assign;\r
+\r
+namespace caspar { namespace flash {\r
+       \r
+frame_producer_ptr create_ct_producer(const std::vector<std::wstring>& params, const frame_format_desc& format_desc) \r
+{\r
+       std::wstring filename = params[0];\r
+       std::wstring result_filename = common::find_file(server::media_folder() + filename, list_of(L"ct"));\r
+       if(result_filename.empty())\r
+               return nullptr;\r
+       \r
+       std::wstring fixed_filename = result_filename;\r
+       std::wstring::size_type pos = 0;\r
+       while((pos = fixed_filename.find(TEXT('\\'), pos)) != std::wstring::npos) \r
+               fixed_filename[pos] = TEXT('/');\r
+       \r
+       cg_producer_ptr cg_producer(new cg_producer(format_desc, nullptr));\r
+       cg_producer->add(0, filename, 1);\r
+       return cg_producer;\r
+}\r
+\r
+}\r
+\r
+}      //namespace caspar
\ No newline at end of file
diff --git a/core/producer/flash/ct_producer.h b/core/producer/flash/ct_producer.h
new file mode 100644 (file)
index 0000000..581edf5
--- /dev/null
@@ -0,0 +1,28 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../frame_producer.h"\r
+\r
+namespace caspar{ namespace flash{\r
+               \r
+caspar::frame_producer_ptr create_ct_producer(const std::vector<std::wstring>& params, const frame_format_desc& format_desc);\r
+\r
+}}
\ No newline at end of file
diff --git a/core/producer/flash/flash_producer.cpp b/core/producer/flash/flash_producer.cpp
new file mode 100644 (file)
index 0000000..6b6ef3e
--- /dev/null
@@ -0,0 +1,312 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "..\..\stdafx.h"\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (disable : 4714) // marked as __forceinline not inlined\r
+#endif\r
+\r
+#include "flash_producer.h"\r
+#include "FlashAxContainer.h"\r
+#include "TimerHelper.h"\r
+\r
+#include "../../frame/bitmap_frame.h"\r
+#include "../../frame/frame_format.h"\r
+#include "../../frame/system_frame.h"\r
+#include "../../../common/utility/find_file.h"\r
+#include "../../server.h"\r
+#include "../../../common/concurrency/executor.h"\r
+#include "../../../common/concurrency/function_task.h"\r
+#include "../../../common/image/image.h"\r
+#include "../../../common/utility/scope_exit.h"\r
+\r
+#include <boost/assign.hpp>\r
+#include <boost/filesystem.hpp>\r
+#include <boost/thread.hpp>\r
+\r
+#include <tbb/atomic.h>\r
+#include <tbb/concurrent_queue.h>\r
+\r
+#include <type_traits>\r
+\r
+namespace caspar { namespace flash {\r
+\r
+using namespace boost::assign;\r
+\r
+// This is needed in order to make CComObject work since this is not a real ATL project\r
+CComModule _AtlModule;\r
+extern __declspec(selectany) CAtlModule* _pAtlModule = &_AtlModule;\r
+\r
+struct flash_producer::implementation\r
+{      \r
+       implementation(flash_producer* self, const std::wstring& filename, const frame_format_desc& format_desc, Monitor* monitor) \r
+               : flashax_container_(nullptr), filename_(filename), self_(self), format_desc_(format_desc), monitor_(monitor),\r
+                       bitmap_pool_(new bitmap_pool), executor_([=]{run();}), invalid_count_(0)\r
+       {       \r
+       if(!boost::filesystem::exists(filename))\r
+               BOOST_THROW_EXCEPTION(file_not_found() << boost::errinfo_file_name(common::narrow(filename)));\r
+\r
+               frame_buffer_.set_capacity(flash_producer::DEFAULT_BUFFER_SIZE);\r
+               last_frame_ = std::make_shared<bitmap_frame>(format_desc_.width, format_desc_.height);\r
+\r
+               start();\r
+       }\r
+\r
+       ~implementation() \r
+       {\r
+               stop();\r
+       }\r
+\r
+       void start()\r
+       {               \r
+               try\r
+               {\r
+                       is_empty_ = true;\r
+                       executor_.stop(); // Restart if running\r
+                       executor_.start();\r
+                       executor_.invoke([=]()\r
+                       {\r
+                               if(FAILED(CComObject<FlashAxContainer>::CreateInstance(&flashax_container_)) || \r
+                                                       flashax_container_ == nullptr)\r
+                                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Failed to create FlashAxContainer"));\r
+               \r
+                               flashax_container_->pflash_producer_ = self_;\r
+                               CComPtr<IShockwaveFlash> spFlash;\r
+\r
+                               if(FAILED(flashax_container_->CreateAxControl()))\r
+                                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Failed to Create FlashAxControl"));\r
+\r
+                               if(FAILED(flashax_container_->QueryControl(&spFlash)))\r
+                                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Failed to Query FlashAxControl"));\r
+                                                                                               \r
+                               if(FAILED(spFlash->put_Playing(true)) )\r
+                                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Failed to start playing Flash"));\r
+\r
+                               if(FAILED(spFlash->put_Movie(CComBSTR(filename_.c_str()))))\r
+                                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Failed to Load Template Host"));\r
+                                               \r
+                               //Exact fit. Scale without respect to the aspect ratio.\r
+                               if(FAILED(spFlash->put_ScaleMode(2))) \r
+                                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Failed to Set Scale Mode"));\r
+                                                                                               \r
+                               // stop if failed\r
+                               if(FAILED(flashax_container_->SetFormat(format_desc_))) \r
+                                       BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Failed to Set Format"));\r
+\r
+                               current_frame_ = nullptr; // Force re-render of current frame                   \r
+                       });\r
+               }\r
+               catch(...)\r
+               {\r
+                       stop();\r
+                       CASPAR_LOG_CURRENT_EXCEPTION();\r
+                       throw;\r
+               }\r
+       }\r
+\r
+       void stop()\r
+       {\r
+               is_empty_ = true;\r
+               if(executor_.is_running())\r
+               {\r
+                       frame_buffer_.clear();\r
+                       executor_.stop();\r
+               }\r
+       }\r
+\r
+       void param(const std::wstring& param) \r
+       {       \r
+               if(!executor_.is_running())\r
+               {\r
+                       try\r
+                       {\r
+                               start();\r
+                       }\r
+                       catch(caspar_exception& e)\r
+                       {\r
+                               e << msg_info("Flashproducer failed to recover from failure.");\r
+                               throw e;\r
+                       }\r
+               }\r
+\r
+               executor_.invoke([&]()\r
+               {                       \r
+                       for(size_t retries = 0; !flashax_container_->CallFunction(param); ++retries)\r
+                       {\r
+                               CASPAR_LOG(debug) << "Retrying. Count: " << retries;\r
+                               if(retries > 3)\r
+                                       BOOST_THROW_EXCEPTION(operation_failed() << warg_name_info(L"param") << warg_value_info(param));\r
+                       }\r
+                       is_empty_ = false;      \r
+               });\r
+       }\r
+       \r
+       void run()\r
+       {\r
+               win32_exception::install_handler();\r
+               CASPAR_LOG(info) << L"started flash_producer Thread";\r
+\r
+               try\r
+               {\r
+                       ::OleInitialize(nullptr);\r
+                       CASPAR_SCOPE_EXIT(::OleUninitialize);\r
+\r
+                       CASPAR_SCOPE_EXIT([=]\r
+                       {\r
+                               if(flashax_container_ != nullptr)\r
+                               {\r
+                                       flashax_container_->DestroyAxControl();\r
+                                       flashax_container_->Release();\r
+                                       flashax_container_ = nullptr;\r
+                               }\r
+                       });\r
+\r
+                       CASPAR_SCOPE_EXIT([=]\r
+                       {                                               \r
+                               stop();\r
+\r
+                               frame_buffer_.clear();\r
+                               frame_buffer_.try_push(nullptr); // EOF\r
+               \r
+                               current_frame_ = nullptr;\r
+                       });\r
+\r
+                       while(executor_.is_running())\r
+                       {       \r
+                               if(!is_empty_)\r
+                               {\r
+                                       render();       \r
+                                       while(executor_.try_execute()){}\r
+                               }\r
+                               else\r
+                               {\r
+                                       executor_.execute();\r
+                                       while(executor_.try_execute()){}\r
+                               }\r
+                       }\r
+               }\r
+               catch(...)\r
+               {\r
+                       CASPAR_LOG_CURRENT_EXCEPTION();\r
+               }\r
+               \r
+               CASPAR_LOG(info) << L"Ended flash_producer Thread";\r
+       }\r
+\r
+       void render()\r
+       {\r
+               assert(flashax_container_);\r
+               \r
+               if(!is_empty_ || current_frame_ == nullptr)\r
+               {\r
+                       if(!flashax_container_->IsReadyToRender())\r
+                       {\r
+                               CASPAR_LOG(trace) << "Flash Producer Underflow";\r
+                               boost::thread::yield();\r
+                               return;\r
+                       }\r
+\r
+                       bool isProgressive = format_desc_.mode == video_mode::progressive || (flashax_container_->GetFPS() - format_desc_.fps/2 == 0);\r
+                       frame_buffer_.push(isProgressive ? render_frame() : render_interlace_frame());\r
+                       is_empty_ = flashax_container_->IsEmpty();\r
+               }\r
+       }\r
+\r
+       frame_ptr render_interlace_frame()\r
+       {               \r
+               return copy_frame(render_frame(), render_frame(), format_desc_);\r
+       }\r
+       \r
+       frame_ptr render_frame()\r
+       {\r
+               flashax_container_->Tick();\r
+               invalid_count_ = !flashax_container_->InvalidRectangle() ? std::min(2, invalid_count_+1) : 0;\r
+               if(current_frame_ == nullptr || invalid_count_ < 2)\r
+               {               \r
+                       bitmap_frame_ptr frame;         \r
+                       if(!bitmap_pool_->try_pop(frame))                                       \r
+                       {       \r
+                               CASPAR_LOG(trace) << "Allocated bitmap_frame";\r
+                               frame = clear_frame(std::make_shared<bitmap_frame>(format_desc_.width, format_desc_.height));                   \r
+                       }\r
+                       flashax_container_->DrawControl(frame->hdc());\r
+\r
+                       auto pool = bitmap_pool_;\r
+                       current_frame_.reset(frame.get(), [=](bitmap_frame*)\r
+                       {\r
+                               common::function_task::enqueue([=]{pool->try_push(clear_frame(frame));});\r
+                       });\r
+               }       \r
+               return current_frame_;\r
+       }\r
+               \r
+       frame_ptr get_frame()\r
+       {\r
+               return frame_buffer_.try_pop(last_frame_) || !is_empty_ ? last_frame_ : frame::null();\r
+       }\r
+       \r
+       typedef tbb::concurrent_bounded_queue<bitmap_frame_ptr> bitmap_pool;\r
+       std::shared_ptr<bitmap_pool> bitmap_pool_;\r
+       frame_format_desc format_desc_;\r
+\r
+       CComObject<caspar::flash::FlashAxContainer>* flashax_container_;\r
+               \r
+       tbb::concurrent_bounded_queue<frame_ptr> frame_buffer_;\r
+       frame_ptr last_frame_;\r
+       frame_ptr current_frame_;\r
+       \r
+       std::wstring filename_;\r
+       flash_producer* self_;\r
+       Monitor* monitor_;\r
+\r
+       tbb::atomic<bool> is_empty_;\r
+       common::executor executor_;\r
+       int invalid_count_;\r
+};\r
+\r
+flash_producer::flash_producer(const std::wstring& filename, const frame_format_desc& format_desc, Monitor* monitor) : impl_(new implementation(this, filename, format_desc, monitor)){}\r
+frame_ptr flash_producer::get_frame(){return impl_->get_frame();}\r
+Monitor* flash_producer::get_monitor(){return impl_->monitor_; }\r
+void flash_producer::param(const std::wstring& param){impl_->param(param);}\r
+const frame_format_desc& flash_producer::get_frame_format_desc() const { return impl_->format_desc_; } \r
+\r
+std::wstring flash_producer::find_template(const std::wstring& template_name)\r
+{\r
+       if(boost::filesystem::exists(template_name + TEXT(".ft"))) \r
+               return template_name + TEXT(".ft");\r
+       \r
+       if(boost::filesystem::exists(template_name + TEXT(".ct")))\r
+               return template_name + TEXT(".ct");\r
+\r
+       return TEXT("");\r
+}\r
+\r
+flash_producer_ptr create_flash_producer(const std::vector<std::wstring>& params, const frame_format_desc& format_desc)\r
+{\r
+       // TODO: Check for flash support\r
+       auto filename = params[0];\r
+       std::wstring result_filename = common::find_file(server::media_folder() + filename, \r
+                                                                                       list_of(L"swf"));\r
+\r
+       return result_filename.empty() ? nullptr : std::make_shared<flash_producer>(result_filename, format_desc);\r
+}\r
+\r
+}}
\ No newline at end of file
diff --git a/core/producer/flash/flash_producer.h b/core/producer/flash/flash_producer.h
new file mode 100644 (file)
index 0000000..0a815af
--- /dev/null
@@ -0,0 +1,67 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../frame_producer.h"\r
+\r
+namespace caspar {\r
+\r
+class Monitor;\r
+\r
+namespace flash {\r
+\r
+class FlashAxContainer;\r
+\r
+///=================================================================================================\r
+/// <summary>  Flash Producer. </summary>\r
+///=================================================================================================\r
+class flash_producer : public frame_producer\r
+{\r
+public:\r
+       /// <summary> Default frame buffer size. </summary>\r
+       static const int DEFAULT_BUFFER_SIZE = 2;\r
+       /// <summary> The maximum number of retries when trying to invoce a flash method. </summary>\r
+       static const int MAX_PARAM_RETRIES = 5;\r
+       /// <summary> Timeout for blocking while trying to stop the producer. </summary>\r
+       static const int STOP_TIMEOUT = 2000;\r
+\r
+       flash_producer(const std::wstring& filename, const frame_format_desc& format_desc, Monitor* monitor = nullptr);\r
+       frame_ptr get_frame();\r
+       const frame_format_desc& get_frame_format_desc() const;\r
+\r
+       void param(const std::wstring& param);\r
+       \r
+       static std::wstring find_template(const std::wstring& templateName);\r
+\r
+private:       \r
+       friend class flash::FlashAxContainer;\r
+\r
+       Monitor* get_monitor();\r
+\r
+       struct implementation;\r
+       std::shared_ptr<implementation> impl_;\r
+\r
+};\r
+\r
+typedef std::tr1::shared_ptr<flash_producer> flash_producer_ptr;\r
+\r
+flash_producer_ptr create_flash_producer(const std::vector<std::wstring>& params, const frame_format_desc& format_desc);\r
+\r
+}}
\ No newline at end of file
diff --git a/core/producer/frame_producer.h b/core/producer/frame_producer.h
new file mode 100644 (file)
index 0000000..bdd4cc1
--- /dev/null
@@ -0,0 +1,43 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../frame/frame_fwd.h"\r
+\r
+#include <boost/noncopyable.hpp>\r
+\r
+#include <memory>\r
+\r
+namespace caspar {\r
+\r
+class Monitor;\r
+\r
+class frame_producer : boost::noncopyable\r
+{\r
+public:\r
+       virtual ~frame_producer(){}     \r
+       virtual frame_ptr get_frame() = 0;\r
+       virtual std::shared_ptr<frame_producer> get_following_producer() const { return nullptr; }\r
+       virtual void set_leading_producer(const std::shared_ptr<frame_producer>&) {}\r
+       virtual const frame_format_desc& get_frame_format_desc() const = 0;\r
+};\r
+typedef std::shared_ptr<frame_producer> frame_producer_ptr;\r
+\r
+}
\ No newline at end of file
diff --git a/core/producer/image/image_loader.cpp b/core/producer/image/image_loader.cpp
new file mode 100644 (file)
index 0000000..9513186
--- /dev/null
@@ -0,0 +1,51 @@
+#include "..\..\StdAfx.h"\r
+\r
+#include "image_loader.h"\r
+\r
+#include "../../../common/exception/Exceptions.h"\r
+\r
+#include "../../frame/frame.h"\r
+#include "../../frame/system_frame.h"\r
+#include "../../../common/image/image.h"\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (disable : 4714) // marked as __forceinline not inlined\r
+#endif\r
+\r
+#include <boost/filesystem.hpp>\r
+#include <boost/exception/errinfo_file_name.hpp>\r
+\r
+namespace caspar{ namespace image{\r
+\r
+std::shared_ptr<FIBITMAP> load_image(const std::string& filename)\r
+{\r
+       if(!boost::filesystem::exists(filename))\r
+               BOOST_THROW_EXCEPTION(file_not_found() << boost::errinfo_file_name(filename));\r
+\r
+       FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;\r
+       fif = FreeImage_GetFileType(filename.c_str(), 0);\r
+       if(fif == FIF_UNKNOWN) \r
+               fif = FreeImage_GetFIFFromFilename(filename.c_str());\r
+               \r
+       if(fif == FIF_UNKNOWN || !FreeImage_FIFSupportsReading(fif)) \r
+               BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("Unsupported image format."));\r
+               \r
+       auto bitmap = std::shared_ptr<FIBITMAP>(FreeImage_Load(fif, filename.c_str(), 0), FreeImage_Unload);\r
+       //FREE_IMAGE_TYPE ImageType = FreeImage_GetImageType(bitmap.get());\r
+                 \r
+       if(FreeImage_GetBPP(bitmap.get()) != 32)\r
+       {\r
+               bitmap = std::shared_ptr<FIBITMAP>(FreeImage_ConvertTo32Bits(bitmap.get()), FreeImage_Unload);\r
+               if(!bitmap)\r
+                       BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("Unsupported image format."));                     \r
+       }\r
+       \r
+       return bitmap;\r
+}\r
+\r
+std::shared_ptr<FIBITMAP> load_image(const std::wstring& filename)\r
+{\r
+       return load_image(common::narrow(filename));\r
+}\r
+\r
+}}
\ No newline at end of file
diff --git a/core/producer/image/image_loader.h b/core/producer/image/image_loader.h
new file mode 100644 (file)
index 0000000..53cfec3
--- /dev/null
@@ -0,0 +1,13 @@
+#pragma once\r
+\r
+#include <FreeImage.h>\r
+\r
+#include <memory>\r
+#include <string>\r
+\r
+namespace caspar{ namespace image{\r
+\r
+std::shared_ptr<FIBITMAP> load_image(const std::string& filename);\r
+std::shared_ptr<FIBITMAP> load_image(const std::wstring& filename);\r
+\r
+}}\r
diff --git a/core/producer/image/image_producer.cpp b/core/producer/image/image_producer.cpp
new file mode 100644 (file)
index 0000000..17acabe
--- /dev/null
@@ -0,0 +1,58 @@
+#include "../../StdAfx.h"\r
+\r
+#include "image_producer.h"\r
+#include "image_loader.h"\r
+\r
+#include "../../frame/system_frame.h"\r
+#include "../../frame/frame_format.h"\r
+#include "../../server.h"\r
+#include "../../../common/utility/find_file.h"\r
+#include "../../../common/image/image.h"\r
+\r
+#include <boost/assign.hpp>\r
+\r
+using namespace boost::assign;\r
+\r
+namespace caspar{ namespace image{\r
+\r
+struct image_producer : public frame_producer\r
+{\r
+       image_producer(const std::wstring& filename, const frame_format_desc& format_desc) : format_desc_(format_desc)\r
+       {\r
+               auto bitmap = load_image(filename);\r
+\r
+               if(FreeImage_GetWidth(bitmap.get()) != format_desc.width || FreeImage_GetHeight(bitmap.get()) == format_desc.height)\r
+               {\r
+                       bitmap = std::shared_ptr<FIBITMAP>(FreeImage_Rescale(bitmap.get(), format_desc.width, format_desc.width, FILTER_BICUBIC), FreeImage_Unload);\r
+                       if(!bitmap)\r
+                               BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("Unsupported image format."));\r
+               }\r
+\r
+               FreeImage_FlipVertical(bitmap.get());\r
+\r
+               frame_ = std::make_shared<system_frame>(format_desc.size);\r
+               common::image::copy(frame_->data(), FreeImage_GetBits(bitmap.get()), frame_->size());\r
+       }\r
+\r
+       frame_ptr get_frame()\r
+       {\r
+               return frame_;\r
+       }\r
+\r
+       const frame_format_desc& get_frame_format_desc() const { return format_desc_; } \r
+\r
+       frame_format_desc format_desc_;\r
+       frame_ptr frame_;\r
+};\r
+\r
+frame_producer_ptr create_image_producer(const  std::vector<std::wstring>& params, const frame_format_desc& format_desc)\r
+{\r
+       std::wstring filename = params[0];\r
+       std::wstring resultFilename = common::find_file(server::media_folder() + filename, list_of(L"png")(L"tga")(L"bmp")(L"jpg")(L"jpeg"));\r
+       if(!resultFilename.empty())\r
+               return std::make_shared<image_producer>(resultFilename, format_desc);\r
+\r
+       return nullptr;\r
+}\r
+\r
+}}
\ No newline at end of file
diff --git a/core/producer/image/image_producer.h b/core/producer/image/image_producer.h
new file mode 100644 (file)
index 0000000..54df972
--- /dev/null
@@ -0,0 +1,12 @@
+#pragma once\r
+\r
+#include "../frame_producer.h"\r
+\r
+#include <string>\r
+#include <vector>\r
+\r
+namespace caspar { namespace image {\r
+\r
+frame_producer_ptr create_image_producer(const std::vector<std::wstring>& params, const frame_format_desc& format_desc);\r
+\r
+}}
\ No newline at end of file
diff --git a/core/producer/image/image_scroll_producer.cpp b/core/producer/image/image_scroll_producer.cpp
new file mode 100644 (file)
index 0000000..764432c
--- /dev/null
@@ -0,0 +1,166 @@
+#include "../../StdAfx.h"\r
+\r
+#include "image_scroll_producer.h"\r
+\r
+#include "image_loader.h"\r
+\r
+#include "../../frame/frame_format.h"\r
+#include "../../frame/system_frame.h"\r
+#include "../../server.h"\r
+#include "../../../common/utility/find_file.h"\r
+#include "../../../common/image/image.h"\r
+\r
+#include <tbb/parallel_for.h>\r
+#include <tbb/parallel_invoke.h>\r
+#include <tbb/scalable_allocator.h>\r
+\r
+#include <boost/assign.hpp>\r
+#include <boost/algorithm/string/case_conv.hpp>\r
+\r
+using namespace boost::assign;\r
+\r
+namespace caspar{ namespace image{\r
+\r
+enum direction\r
+{\r
+       Up, Down, Left, Right\r
+};\r
+\r
+struct image_scroll_producer : public frame_producer\r
+{\r
+       static const int DEFAULT_SCROLL_SPEED = 50;\r
+\r
+       image_scroll_producer(const std::wstring& filename, const std::vector<std::wstring>& params, const frame_format_desc& format_desc) \r
+               : format_desc_(format_desc), speed_(image_scroll_producer::DEFAULT_SCROLL_SPEED), direction_(direction::Up), offset_(0)\r
+       {\r
+               load_and_pad_image(filename);\r
+\r
+               auto pos = filename.find_last_of(L'_');\r
+               if(pos != std::wstring::npos && pos + 1 < filename.size())\r
+               {\r
+                       std::wstring speedStr = filename.substr(pos + 1);\r
+                       pos = speedStr.find_first_of(L'.');\r
+                       if(pos != std::wstring::npos)\r
+                       {\r
+                               speedStr = speedStr.substr(0, pos);             \r
+                               speed_ = common::lexical_cast_or_default<int>(speedStr, image_scroll_producer::DEFAULT_SCROLL_SPEED);\r
+                       }\r
+               }\r
+\r
+               loop_ = std::find(params.begin(), params.end(), L"LOOP") != params.end();\r
+                               \r
+               if(image_width_ - format_desc.width > image_height_ - format_desc_.height)\r
+                       direction_ = speed_ < 0 ? direction::Right : direction::Left;\r
+               else\r
+                       direction_ = speed_ < 0 ? direction::Down : direction::Up;\r
+\r
+               if (direction_ == direction::Down)\r
+                       offset_ = image_height_ - format_desc_.height;\r
+               else if (direction_ == direction::Right)\r
+                       offset_ = image_width_ - format_desc_.width;\r
+\r
+               speed_ = static_cast<int>(abs(static_cast<double>(speed_) / format_desc.fps));\r
+       }\r
+\r
+       void load_and_pad_image(const std::wstring& filename)\r
+       {\r
+               auto pBitmap = load_image(filename);\r
+\r
+               size_t width = FreeImage_GetWidth(pBitmap.get());\r
+               size_t height = FreeImage_GetHeight(pBitmap.get());\r
+\r
+               image_width_ = std::max(width, format_desc_.width);\r
+               image_height_ = std::max(height, format_desc_.height);\r
+\r
+               image_ = std::shared_ptr<unsigned char>(static_cast<unsigned char*>(scalable_aligned_malloc(image_width_*image_height_*4, 16)));\r
+               common::image::clear(image_.get(), image_width_*image_height_*4);\r
+\r
+               unsigned char* pBits = FreeImage_GetBits(pBitmap.get());\r
+               \r
+               for (size_t i = 0; i < height; ++i)\r
+                       common::image::copy(&image_.get()[i * image_width_ * 4], &pBits[i* width * 4], width * 4);\r
+       }\r
+\r
+       frame_ptr render_frame()\r
+       {\r
+               frame_ptr frame = std::make_shared<system_frame>(format_desc_.size);\r
+               common::image::clear(frame->data(), frame->size());\r
+\r
+               const int delta_x = direction_ == direction::Left ? speed_ : -speed_;\r
+               const int delta_y = direction_ == direction::Up ? speed_ : -speed_;\r
+\r
+               unsigned char* frame_data = frame->data();\r
+               unsigned char* image_data = image_.get();\r
+       \r
+               if (direction_ == direction::Up || direction_ == direction::Down)\r
+               {\r
+                       tbb::parallel_for(static_cast<size_t>(0), format_desc_.height, static_cast<size_t>(1), [&](size_t i)\r
+                       {\r
+                               int srcRow = i + offset_;\r
+                               int dstInxex = i * format_desc_.width * 4;\r
+                               int srcIndex = srcRow * format_desc_.width * 4;\r
+                               int size = format_desc_.width * 4;\r
+\r
+                               memcpy(&frame_data[dstInxex], &image_data[srcIndex], size);     \r
+                       });                             \r
+                       \r
+                       offset_ += delta_y;\r
+               }\r
+               else\r
+               {\r
+                       tbb::parallel_for(static_cast<size_t>(0), format_desc_.height, static_cast<size_t>(1), [&](size_t i)\r
+                       {\r
+                               int correctOffset = offset_;\r
+                               int dstIndex = i * format_desc_.width * 4;\r
+                               int srcIndex = (i * image_width_ + correctOffset) * 4;\r
+                       \r
+                               int stopOffset = std::min<int>(correctOffset + format_desc_ .width, image_width_);\r
+                               int size = (stopOffset - correctOffset) * 4;\r
+\r
+                               memcpy(&frame_data[dstIndex], &image_data[srcIndex], size);\r
+                       });\r
+\r
+                       offset_ += delta_x;\r
+               }\r
+\r
+               return frame;\r
+       }\r
+\r
+       frame_ptr render_interlaced_frame()\r
+       {\r
+               frame_ptr next_frame1;\r
+               frame_ptr next_frame2;\r
+               tbb::parallel_invoke([&]{ next_frame1 = render_frame(); }, [&]{ next_frame2 = render_frame(); });\r
+               \r
+               return copy_frame(next_frame1, next_frame2, format_desc_);\r
+       }\r
+       \r
+       frame_ptr get_frame()\r
+       {\r
+               return format_desc_.mode == video_mode::progressive ? render_frame() : render_interlaced_frame();\r
+       }\r
+\r
+       const frame_format_desc& get_frame_format_desc() const { return format_desc_; } \r
+       \r
+       int image_width_;\r
+       int image_height_;\r
+       int speed_;\r
+       int offset_;\r
+       direction direction_;\r
+\r
+       tbb::atomic<bool> loop_;\r
+       std::shared_ptr<unsigned char> image_;\r
+       frame_format_desc format_desc_;\r
+};\r
+\r
+frame_producer_ptr create_image_scroll_producer(const std::vector<std::wstring>& params, const frame_format_desc& format_desc)\r
+{\r
+       std::wstring filename = params[0];\r
+       auto result_filename = common::find_file(server::media_folder() + filename, list_of(L"spng")(L"stga")(L"sbmp")(L"sjpg")(L"sjpeg"));\r
+       if(!result_filename.empty())\r
+               return std::make_shared<image_scroll_producer>(result_filename, params, format_desc);\r
+\r
+       return nullptr;\r
+}\r
+\r
+}}
\ No newline at end of file
diff --git a/core/producer/image/image_scroll_producer.h b/core/producer/image/image_scroll_producer.h
new file mode 100644 (file)
index 0000000..99d10fe
--- /dev/null
@@ -0,0 +1,12 @@
+#pragma once\r
+\r
+#include "../frame_producer.h"\r
+\r
+#include <string>\r
+#include <vector>\r
+\r
+namespace caspar { namespace image {\r
+       \r
+frame_producer_ptr create_image_scroll_producer(const std::vector<std::wstring>& params, const frame_format_desc& format_desc);\r
+\r
+}}
\ No newline at end of file
diff --git a/core/producer/transition/transition_producer.cpp b/core/producer/transition/transition_producer.cpp
new file mode 100644 (file)
index 0000000..5ecb7b2
--- /dev/null
@@ -0,0 +1,269 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/ \r
+#include "../../stdafx.h"\r
+\r
+#include "transition_producer.h"\r
+\r
+#include "../../frame/frame_format.h"\r
+\r
+#include "../../../common/image/image.h"\r
+#include "../../frame/system_frame.h"\r
+#include "../../frame/audio_chunk.h"\r
+#include "../../renderer/render_device.h"\r
+\r
+#include <boost/range/algorithm/copy.hpp>\r
+\r
+namespace caspar{      \r
+       \r
+class empty_producer : public frame_producer\r
+{\r
+public:\r
+       explicit empty_producer(const frame_format_desc& format_desc) \r
+               : format_desc_(format_desc), frame_(clear_frame(std::make_shared<system_frame>(format_desc_.size)))\r
+       {}      \r
+\r
+       frame_ptr get_frame() { return frame_; }\r
+       const frame_format_desc& get_frame_format_desc() const { return format_desc_; }\r
+private:\r
+       frame_format_desc format_desc_;\r
+       frame_ptr frame_;\r
+};\r
+\r
+struct transition_producer::implementation : boost::noncopyable\r
+{\r
+       implementation(const frame_producer_ptr& dest, const transition_info& info, const frame_format_desc& format_desc) \r
+               : current_frame_(0), info_(info), border_color_(0), format_desc_(format_desc), \r
+                       empty_(std::make_shared<empty_producer>(format_desc)), source_(empty_), dest_(dest)\r
+       {\r
+               if(!dest)\r
+                       BOOST_THROW_EXCEPTION(null_argument() << arg_name_info("dest"));\r
+       }\r
+               \r
+       frame_producer_ptr get_following_producer() const\r
+       {\r
+               return dest_;\r
+       }\r
+       \r
+       void set_leading_producer(const frame_producer_ptr& producer)\r
+       {\r
+               source_ = producer != nullptr ? producer : empty_;\r
+       }\r
+               \r
+       frame_ptr get_frame()\r
+       {\r
+               if(++current_frame_ >= info_.duration)\r
+                       return nullptr;\r
+\r
+               return compose(get_producer_frame(dest_), get_producer_frame(source_));\r
+       }\r
+\r
+       frame_ptr get_producer_frame(frame_producer_ptr& producer)\r
+       {\r
+               assert(producer != nullptr);\r
+\r
+               frame_ptr frame;\r
+               try\r
+               {\r
+                       frame = producer->get_frame();\r
+               }\r
+               catch(...)\r
+               {\r
+                       CASPAR_LOG_CURRENT_EXCEPTION();\r
+                       CASPAR_LOG(warning) << "Removed renderer from transition.";\r
+               }\r
+\r
+               if(frame == nullptr && producer->get_following_producer() != nullptr)\r
+               {\r
+                       auto following = producer->get_following_producer();\r
+                       following->set_leading_producer(producer);\r
+                       producer = following;\r
+                       return get_producer_frame(producer);\r
+               }\r
+               return frame;\r
+       }\r
+                       \r
+       frame_ptr compose(const frame_ptr& dest_frame, const frame_ptr& src_frame) \r
+       {               \r
+               frame_ptr result_frame = dest_frame;            \r
+               if(src_frame != nullptr && dest_frame != nullptr)\r
+               {\r
+                       result_frame = std::make_shared<system_frame>(format_desc_.size);\r
+                       tbb::parallel_invoke(\r
+                       [&]\r
+                       {\r
+                               GenerateFrame(result_frame->data(), src_frame->data(), dest_frame->data());\r
+                       },\r
+                       [&]\r
+                       {\r
+                               float delta = static_cast<float>(current_frame_)/static_cast<float>(info_.duration);\r
+                               set_frame_volume(dest_frame, delta*100.0f);\r
+                               set_frame_volume(src_frame, (1.0f-delta)*100.0f);               \r
+\r
+                               boost::range::copy(src_frame->audio_data(), std::back_inserter(result_frame->audio_data()));                            \r
+                               boost::range::copy(dest_frame->audio_data(), std::back_inserter(result_frame->audio_data()));;\r
+                       });\r
+               }\r
+               return result_frame;\r
+       }\r
+       \r
+       void GenerateFrame(unsigned char* pResultData, const unsigned char* pSourceData, const unsigned char* pDestData)\r
+       {\r
+               if(info_.type == transition_type::cut)\r
+               {\r
+                       common::image::copy(pResultData, pSourceData, format_desc_.size);\r
+                       return;\r
+               }\r
+\r
+               if(current_frame_ >= info_.duration)                    \r
+               {\r
+                       common::image::copy(pResultData, pDestData, format_desc_.size);\r
+                       return;\r
+               }\r
+\r
+               if(info_.type == transition_type::mix)\r
+               {\r
+                       common::image::lerp(pResultData, pSourceData, pDestData, 1.0f-static_cast<float>(current_frame_)/static_cast<float>(info_.duration), format_desc_.size);\r
+                       return;\r
+               }\r
+\r
+               size_t totalWidth = format_desc_.width + info_.border_width;\r
+                       \r
+               float fStep   = totalWidth / static_cast<float>(info_.duration);\r
+               float fOffset = fStep * static_cast<float>(current_frame_);\r
+\r
+               size_t halfStep = static_cast<size_t>(fStep/2.0);\r
+               size_t offset   = static_cast<size_t>(fOffset+0.5f);\r
+                       \r
+               //read source to buffer\r
+               for(size_t row = 0, even = 0; row < format_desc_.height; ++row, even ^= 1)\r
+               {\r
+                       size_t fieldCorrectedOffset = offset + (halfStep*even);\r
+                       if(fieldCorrectedOffset < format_desc_.width)\r
+                       {\r
+                               if(info_.direction != transition_direction::from_left)\r
+                               {\r
+                                       if(info_.type == transition_type::push)\r
+                                               memcpy(&(pResultData[4*row*format_desc_.width]), &(pSourceData[4*(row*format_desc_.width+fieldCorrectedOffset)]), (format_desc_.width-fieldCorrectedOffset)*4);\r
+                                       else    //Slide | Wipe\r
+                                               memcpy(&(pResultData[4*row*format_desc_.width]), &(pSourceData[4*row*format_desc_.width]), (format_desc_.width-fieldCorrectedOffset)*4);\r
+                               }\r
+                               else // if (direction == LEFT)\r
+                               {                               \r
+                                       if(info_.type == transition_type::push)\r
+                                               memcpy(&(pResultData[4*(row*format_desc_.width+fieldCorrectedOffset)]), &(pSourceData[4*(row*format_desc_.width)]), (format_desc_.width-fieldCorrectedOffset)*4);\r
+                                       else    //slide eller wipe\r
+                                               memcpy(&(pResultData[4*(row*format_desc_.width+fieldCorrectedOffset)]), &(pSourceData[4*(row*format_desc_.width+fieldCorrectedOffset)]), (format_desc_.width-fieldCorrectedOffset)*4);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               //write border to buffer\r
+               if(info_.border_width > 0)\r
+               {\r
+                       for(size_t row = 0, even = 0; row < format_desc_.height; ++row, even ^= 1)\r
+                       {\r
+                               size_t fieldCorrectedOffset = offset + (halfStep*even);\r
+                               size_t length = info_.border_width;\r
+                               size_t start = 0;\r
+\r
+                               if(info_.direction != transition_direction::from_left)\r
+                               {\r
+                                       if(fieldCorrectedOffset > format_desc_.width)\r
+                                       {\r
+                                               length -= fieldCorrectedOffset-format_desc_.width;\r
+                                               start += fieldCorrectedOffset-format_desc_.width;\r
+                                               fieldCorrectedOffset = format_desc_.width;\r
+                                       }\r
+                                       else if(fieldCorrectedOffset < length)\r
+                                       {\r
+                                               length = fieldCorrectedOffset;\r
+                                       }\r
+\r
+                                       for(size_t i = 0; i < length; ++i)\r
+                                               memcpy(&(pResultData[4*(row*format_desc_.width+format_desc_.width-fieldCorrectedOffset+i)]), &border_color_, 4);\r
+                                               \r
+                               }\r
+                               else // if (direction == LEFT)\r
+                               {\r
+                                       if(fieldCorrectedOffset > format_desc_.width)\r
+                                       {\r
+                                               length -= fieldCorrectedOffset-format_desc_.width;\r
+                                               start = 0;\r
+                                               fieldCorrectedOffset -= info_.border_width-length;\r
+                                       }\r
+                                       else if(fieldCorrectedOffset < length)\r
+                                       {\r
+                                               length = fieldCorrectedOffset;\r
+                                               start = info_.border_width-fieldCorrectedOffset;\r
+                                       }\r
+\r
+                                       for(size_t i = 0; i < length; ++i)\r
+                                               memcpy(&(pResultData[4*(row*format_desc_.width+fieldCorrectedOffset-length+i)]), &border_color_, 4);                                            \r
+                               }\r
+\r
+                       }\r
+               }\r
+\r
+               //read dest to buffer\r
+               offset -= info_.border_width;\r
+               if(offset > 0)\r
+               {\r
+                       for(size_t row = 0, even = 0; row < format_desc_.height; ++row, even ^= 1)\r
+                       {\r
+                               int fieldCorrectedOffset = offset + (halfStep*even);\r
+\r
+                               if(info_.direction != transition_direction::from_left)\r
+                               {\r
+                                       if(info_.type == transition_type::wipe)\r
+                                               memcpy(&(pResultData[4*(row*format_desc_.width+format_desc_.width-fieldCorrectedOffset)]), &(pDestData[4*(row*format_desc_.width+format_desc_.width-fieldCorrectedOffset)]), fieldCorrectedOffset*4);\r
+                                       else\r
+                                               memcpy(&(pResultData[4*(row*format_desc_.width+format_desc_.width-fieldCorrectedOffset)]), &(pDestData[4*row*format_desc_.width]), fieldCorrectedOffset*4);\r
+                               }\r
+                               else // if (direction == LEFT)\r
+                               {                               \r
+                                       if(info_.type == transition_type::wipe)\r
+                                               memcpy(&(pResultData[4*(row*format_desc_.width)]), &(pDestData[4*(row*format_desc_.width)]), fieldCorrectedOffset*4);\r
+                                       else\r
+                                               memcpy(&(pResultData[4*(row*format_desc_.width)]), &(pDestData[4*(row*format_desc_.width+format_desc_.width-fieldCorrectedOffset)]), fieldCorrectedOffset*4);   \r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       const frame_format_desc format_desc_;\r
+\r
+       frame_producer_ptr              empty_;\r
+       frame_producer_ptr              source_;\r
+       frame_producer_ptr              dest_;\r
+       \r
+       unsigned short                  current_frame_;\r
+       \r
+       const transition_info   info_;\r
+       const unsigned long             border_color_;\r
+};\r
+\r
+transition_producer::transition_producer(const frame_producer_ptr& dest, const transition_info& info, const frame_format_desc& format_desc) \r
+       : impl_(new implementation(dest, info, format_desc)){}\r
+frame_ptr transition_producer::get_frame(){return impl_->get_frame();}\r
+frame_producer_ptr transition_producer::get_following_producer() const{return impl_->get_following_producer();}\r
+void transition_producer::set_leading_producer(const frame_producer_ptr& producer) { impl_->set_leading_producer(producer); }\r
+const frame_format_desc& transition_producer::get_frame_format_desc() const { return impl_->format_desc_; } \r
+\r
+}
\ No newline at end of file
diff --git a/core/producer/transition/transition_producer.h b/core/producer/transition/transition_producer.h
new file mode 100644 (file)
index 0000000..6acd3ae
--- /dev/null
@@ -0,0 +1,74 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../frame_producer.h"\r
+\r
+#include <string>\r
+#include <vector>\r
+\r
+namespace caspar {\r
+\r
+enum transition_type\r
+{\r
+       cut = 1,\r
+       mix,\r
+       push,\r
+       slide,\r
+       wipe\r
+};\r
+\r
+enum transition_direction\r
+{\r
+       from_left = 1,\r
+       from_right,\r
+       from_top,\r
+       from_bottom\r
+};\r
+\r
+struct transition_info\r
+{\r
+       transition_info() : type(transition_type::cut), duration(0), border_width(0), border_color(TEXT("#00000000")), direction(transition_direction::from_left){}\r
+    \r
+       unsigned short                                  duration;\r
+       unsigned short                                  border_width;\r
+       transition_direction                    direction;\r
+       transition_type                                 type;\r
+       std::wstring                                    border_color;\r
+       std::wstring                                    border_image;\r
+};\r
+\r
+class transition_producer : public frame_producer\r
+{\r
+public:\r
+       transition_producer(const frame_producer_ptr& destination, const transition_info& info, const frame_format_desc& fmt);\r
+\r
+       frame_ptr get_frame();\r
+\r
+       frame_producer_ptr get_following_producer() const;\r
+       void set_leading_producer(const frame_producer_ptr& producer);\r
+       const frame_format_desc& get_frame_format_desc() const;\r
+private:\r
+       struct implementation;\r
+       std::shared_ptr<implementation> impl_;\r
+};\r
+typedef std::shared_ptr<transition_producer> transition_producer_ptr;\r
+\r
+}
\ No newline at end of file
diff --git a/core/protocol/amcp/AMCPCommand.h b/core/protocol/amcp/AMCPCommand.h
new file mode 100644 (file)
index 0000000..7e1d914
--- /dev/null
@@ -0,0 +1,110 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../../../common/io/clientinfo.h"\r
+#include "../../consumer/frame_consumer.h"\r
+#include <boost/algorithm/string.hpp>\r
+#include "../../renderer/render_device.h"\r
+\r
+namespace caspar {\r
+namespace amcp {\r
+\r
+       enum AMCPCommandScheduling\r
+       {\r
+               Default = 0,\r
+               AddToQueue,\r
+               ImmediatelyAndClear\r
+       };\r
+\r
+       class AMCPCommand\r
+       {\r
+               AMCPCommand(const AMCPCommand&);\r
+               AMCPCommand& operator=(const AMCPCommand&);\r
+       public:\r
+               AMCPCommand();\r
+               virtual ~AMCPCommand() {}\r
+               virtual bool Execute() = 0;\r
+\r
+               virtual bool NeedChannel() = 0;\r
+               virtual AMCPCommandScheduling GetDefaultScheduling() = 0;\r
+               virtual int GetMinimumParameters() = 0;\r
+\r
+               void SendReply();\r
+\r
+               void AddParameter(const std::wstring& param){_parameters.push_back(param);}\r
+\r
+               void SetClientInfo(caspar::IO::ClientInfoPtr& s){pClientInfo_ = s;}\r
+               caspar::IO::ClientInfoPtr GetClientInfo(){return pClientInfo_;}\r
+\r
+               void SetChannel(const renderer::render_device_ptr& pChannel){pChannel_ = pChannel;}\r
+               renderer::render_device_ptr GetChannel(){return pChannel_;}\r
+\r
+               void SetChannelIndex(unsigned int channelIndex){channelIndex_ = channelIndex;}\r
+               unsigned int GetChannelIndex(){return channelIndex_;}\r
+\r
+               void SetLayerIntex(int layerIndex){layerIndex_ = layerIndex;}\r
+               int GetLayerIndex(int defaultValue = 0) const{return layerIndex_ != -1 ? layerIndex_ : defaultValue;}\r
+\r
+               virtual void Clear();\r
+\r
+               AMCPCommandScheduling GetScheduling()\r
+               {\r
+                       return scheduling_ == Default ? GetDefaultScheduling() : scheduling_;\r
+               }\r
+\r
+               void SetScheduling(AMCPCommandScheduling s){scheduling_ = s;}\r
+\r
+       protected:\r
+               void SetReplyString(const std::wstring& str){replyString_ = str;}\r
+               std::vector<std::wstring> _parameters;\r
+\r
+       private:\r
+               unsigned int channelIndex_;\r
+               int layerIndex_;\r
+               caspar::IO::ClientInfoPtr pClientInfo_;\r
+               renderer::render_device_ptr pChannel_;\r
+               AMCPCommandScheduling scheduling_;\r
+               std::wstring replyString_;\r
+       };\r
+\r
+       typedef std::tr1::shared_ptr<AMCPCommand> AMCPCommandPtr;\r
+\r
+       template<bool TNeedChannel, AMCPCommandScheduling TScheduling, int TMinParameters>\r
+       class AMCPCommandBase : public AMCPCommand\r
+       {\r
+       public:\r
+               virtual bool Execute()\r
+               {\r
+                       for(size_t n = 0; n < _parameters.size(); ++n)\r
+                               _parameters[n] = boost::to_upper_copy(_parameters[n]);\r
+                       return (TNeedChannel && !GetChannel()) || _parameters.size() < TMinParameters ? false : DoExecute();\r
+               }\r
+\r
+               virtual bool NeedChannel(){return TNeedChannel;}                \r
+               virtual AMCPCommandScheduling GetDefaultScheduling(){return TScheduling;}\r
+               virtual int GetMinimumParameters(){return TMinParameters;}\r
+       protected:\r
+               ~AMCPCommandBase(){}\r
+       private:\r
+               virtual bool DoExecute() = 0;\r
+       };      \r
+\r
+}}\r
diff --git a/core/protocol/amcp/AMCPCommandQueue.cpp b/core/protocol/amcp/AMCPCommandQueue.cpp
new file mode 100644 (file)
index 0000000..d07d444
--- /dev/null
@@ -0,0 +1,134 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "..\..\stdafx.h"\r
+\r
+#include "AMCPCommandQueue.h"\r
+\r
+namespace caspar { namespace amcp {\r
+\r
+using namespace common;\r
+\r
+AMCPCommandQueue::AMCPCommandQueue() : newCommandEvent_(FALSE, FALSE) \r
+{}\r
+\r
+AMCPCommandQueue::~AMCPCommandQueue() \r
+{\r
+       Stop();\r
+}\r
+\r
+bool AMCPCommandQueue::Start() \r
+{\r
+       if(commandPump_.IsRunning())\r
+               return false;\r
+\r
+       return commandPump_.Start(this);\r
+}\r
+\r
+void AMCPCommandQueue::Stop() \r
+{\r
+       commandPump_.Stop();\r
+}\r
+\r
+void AMCPCommandQueue::AddCommand(AMCPCommandPtr pNewCommand)\r
+{\r
+       {\r
+               tbb::mutex::scoped_lock lock(mutex_);\r
+\r
+               if(pNewCommand->GetScheduling() == ImmediatelyAndClear) {\r
+                       //Clears the queue, objects are deleted automatically\r
+                       commands_.clear();\r
+\r
+                       commands_.push_back(pNewCommand);\r
+                       CASPAR_LOG(info) << "Cleared queue and added command";\r
+               }\r
+               else {\r
+                       commands_.push_back(pNewCommand);\r
+                       CASPAR_LOG(info) << "Added command to end of queue";\r
+               }\r
+       }\r
+\r
+       SetEvent(newCommandEvent_);\r
+}\r
+\r
+void AMCPCommandQueue::Run(HANDLE stopEvent)\r
+{\r
+       bool logTemporarilyBadState = true;\r
+       AMCPCommandPtr pCurrentCommand;\r
+\r
+       CASPAR_LOG(info) << "AMCP CommandPump started";\r
+\r
+       while(WaitForSingleObject(stopEvent, 0) != WAIT_OBJECT_0)\r
+       {\r
+               DWORD waitResult = WaitForSingleObject(newCommandEvent_, 50);\r
+               if(waitResult == WAIT_OBJECT_0) \r
+               {\r
+                       tbb::mutex::scoped_lock lock(mutex_);\r
+\r
+                       if(commands_.size() > 0)\r
+                       {\r
+                               CASPAR_LOG(debug) << "Found " << commands_.size() << " commands in queue";\r
+\r
+                               AMCPCommandPtr pNextCommand = commands_.front();\r
+\r
+                               if(pCurrentCommand == 0 || pNextCommand->GetScheduling() == ImmediatelyAndClear) {\r
+                                       pCurrentCommand = pNextCommand;\r
+                                       commands_.pop_front();\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if(pCurrentCommand != 0) \r
+               {\r
+                       if(pCurrentCommand->Execute()) \r
+                               CASPAR_LOG(info) << "Executed command";\r
+                       else \r
+                               CASPAR_LOG(info) << "Failed to executed command";\r
+                               \r
+                       pCurrentCommand->SendReply();\r
+                       pCurrentCommand.reset();\r
+\r
+                       newCommandEvent_.Set();\r
+                       logTemporarilyBadState = true;\r
+\r
+                       CASPAR_LOG(info) << "Ready for a new command";\r
+               }\r
+       }\r
+\r
+       CASPAR_LOG(info) << "CommandPump ended";\r
+}\r
+\r
+bool AMCPCommandQueue::OnUnhandledException(const std::exception& ex) throw() \r
+{\r
+       bool bDoRestart = true;\r
+\r
+       try \r
+       {\r
+               CASPAR_LOG(fatal) << "UNHANDLED EXCEPTION in commandqueue. Message: " << ex.what();\r
+       }\r
+       catch(...)\r
+       {\r
+               bDoRestart = false;\r
+       }\r
+\r
+       return bDoRestart;\r
+}\r
+\r
+}}
\ No newline at end of file
diff --git a/core/protocol/amcp/AMCPCommandQueue.h b/core/protocol/amcp/AMCPCommandQueue.h
new file mode 100644 (file)
index 0000000..4da281b
--- /dev/null
@@ -0,0 +1,55 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../../../common/concurrency\thread.h"\r
+\r
+#include "AMCPCommand.h"\r
+\r
+#include <tbb\mutex.h>\r
+\r
+namespace caspar { namespace amcp {\r
+\r
+class AMCPCommandQueue : public common::IRunnable\r
+{\r
+       AMCPCommandQueue(const AMCPCommandQueue&);\r
+       AMCPCommandQueue& operator=(const AMCPCommandQueue&);\r
+public:\r
+       AMCPCommandQueue();\r
+       ~AMCPCommandQueue();\r
+\r
+       bool Start();\r
+       void Stop();\r
+       void AddCommand(AMCPCommandPtr pCommand);\r
+\r
+private:\r
+       common::Thread                          commandPump_;\r
+       virtual void Run(HANDLE stopEvent);\r
+       virtual bool OnUnhandledException(const std::exception& ex) throw();\r
+\r
+       common::Event newCommandEvent_;\r
+\r
+       //Needs synro-protection\r
+       std::list<AMCPCommandPtr>       commands_;\r
+       tbb::mutex mutex_;\r
+};\r
+typedef std::tr1::shared_ptr<AMCPCommandQueue> AMCPCommandQueuePtr;\r
+\r
+}}\r
diff --git a/core/protocol/amcp/AMCPCommandsImpl.cpp b/core/protocol/amcp/AMCPCommandsImpl.cpp
new file mode 100644 (file)
index 0000000..d95c8dd
--- /dev/null
@@ -0,0 +1,859 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+\r
+#include "../../StdAfx.h"\r
+\r
+#include "AMCPCommandsImpl.h"\r
+#include "AMCPProtocolStrategy.h"\r
+#include "../../producer/frame_producer.h"\r
+#include "../../Frame/frame_format.h"\r
+#include "../../producer/flash/flash_producer.h"\r
+#include "../../producer/transition/transition_producer.h"\r
+#include <boost/lexical_cast.hpp>\r
+#include "../monitor/Monitor.h"\r
+#include "../../producer/flash/cg_producer.h"\r
+#include "../media.h"\r
+#include "../../Server.h"\r
+\r
+#include <algorithm>\r
+#include <locale>\r
+#include <fstream>\r
+#include <cctype>\r
+#include <io.h>\r
+\r
+#include <boost/date_time/posix_time/posix_time.hpp>\r
+#include <boost/lexical_cast.hpp>\r
+#include <boost/algorithm/string.hpp>\r
+#include <boost/filesystem.hpp>\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (push, 1) // TODO: Legacy code, just disable warnings\r
+#endif\r
+\r
+/* Return codes\r
+\r
+100 [action]                   Information om att nÃ¥got har hänt  \r
+101 [action]                   Information om att nÃ¥got har hänt, en rad data skickas  \r
+\r
+202 [kommando] OK              Kommandot har utförts  \r
+201 [kommando] OK              Kommandot har utförts, och en rad data skickas tillbaka  \r
+200 [kommando] OK              Kommandot har utförts, och flera rader data skickas tillbaka. Avslutas med tomrad  \r
+\r
+400 ERROR                              Kommandot kunde inte förstÃ¥s  \r
+401 [kommando] ERROR   Ogiltig kanal  \r
+402 [kommando] ERROR   Parameter saknas  \r
+403 [kommando] ERROR   Ogiltig parameter  \r
+404 [kommando] ERROR   Mediafilen hittades inte  \r
+\r
+500 FAILED                             Internt serverfel  \r
+501 [kommando] FAILED  Internt serverfel  \r
+502 [kommando] FAILED  Oläslig mediafil  \r
+\r
+600 [kommando] FAILED  funktion ej implementerad\r
+*/\r
+\r
+namespace caspar {\r
+\r
+std::wstring ListMedia()\r
+{      \r
+       std::wstringstream replyString;\r
+       for (boost::filesystem::wrecursive_directory_iterator itr(server::media_folder()), end; itr != end; ++itr)\r
+    {                  \r
+               if(boost::filesystem::is_regular_file(itr->path()))\r
+               {\r
+                       std::wstring clipttype = TEXT(" N/A ");\r
+                       std::wstring extension = boost::to_upper_copy(itr->path().extension());\r
+                       if(extension == TEXT(".TGA") || extension == TEXT(".COL"))\r
+                               clipttype = TEXT(" STILL ");\r
+                       else if(extension == TEXT(".SWF") || extension == TEXT(".DV") || extension == TEXT(".MOV") || extension == TEXT(".MPG") || \r
+                                       extension == TEXT(".AVI") || extension == TEXT(".FLV") || extension == TEXT(".F4V") || extension == TEXT(".MP4"))\r
+                               clipttype = TEXT(" MOVIE ");\r
+                       else if(extension == TEXT(".WAV") || extension == TEXT(".MP3"))\r
+                               clipttype = TEXT(" STILL ");\r
+\r
+                       if(clipttype != TEXT(" N/A "))\r
+                       {               \r
+                               auto is_not_digit = [](char c){ return std::isdigit(c) == 0; };\r
+\r
+                               auto relativePath = boost::filesystem::wpath(itr->path().file_string().substr(server::media_folder().size()-1, itr->path().file_string().size()));\r
+\r
+                               auto writeTimeStr = boost::posix_time::to_iso_string(boost::posix_time::from_time_t(boost::filesystem::last_write_time(itr->path())));\r
+                               writeTimeStr.erase(std::remove_if(writeTimeStr.begin(), writeTimeStr.end(), is_not_digit), writeTimeStr.end());\r
+                               auto writeTimeWStr = std::wstring(writeTimeStr.begin(), writeTimeStr.end());\r
+\r
+                               auto sizeStr = boost::lexical_cast<std::wstring>(boost::filesystem::file_size(itr->path()));\r
+                               sizeStr.erase(std::remove_if(sizeStr.begin(), sizeStr.end(), is_not_digit), sizeStr.end());\r
+                               auto sizeWStr = std::wstring(sizeStr.begin(), sizeStr.end());\r
+\r
+                               replyString << TEXT("\"") << relativePath.replace_extension(TEXT(""))\r
+                                                       << TEXT("\" ") << clipttype \r
+                                                       << TEXT(" ") << sizeStr\r
+                                                       << TEXT(" ") << writeTimeWStr\r
+                                                       << TEXT("\r\n");\r
+                       }       \r
+               }\r
+       }\r
+       return boost::to_upper_copy(replyString.str());\r
+}\r
+\r
+std::wstring ListTemplates() \r
+{\r
+       std::wstringstream replyString;\r
+\r
+       for (boost::filesystem::wrecursive_directory_iterator itr(server::template_folder()), end; itr != end; ++itr)\r
+    {          \r
+               if(boost::filesystem::is_regular_file(itr->path()) && itr->path().extension() == L".ft")\r
+               {\r
+                       auto relativePath = boost::filesystem::wpath(itr->path().file_string().substr(server::template_folder().size()-1, itr->path().file_string().size()));\r
+\r
+                       auto writeTimeStr = boost::posix_time::to_iso_string(boost::posix_time::from_time_t(boost::filesystem::last_write_time(itr->path())));\r
+                       writeTimeStr.erase(std::remove_if(writeTimeStr.begin(), writeTimeStr.end(), [](char c){ return std::isdigit(c) == 0;}), writeTimeStr.end());\r
+                       auto writeTimeWStr = std::wstring(writeTimeStr.begin(), writeTimeStr.end());\r
+\r
+                       auto sizeStr = boost::lexical_cast<std::string>(boost::filesystem::file_size(itr->path()));\r
+                       sizeStr.erase(std::remove_if(sizeStr.begin(), sizeStr.end(), [](char c){ return std::isdigit(c) == 0;}), sizeStr.end());\r
+\r
+                       auto sizeWStr = std::wstring(sizeStr.begin(), sizeStr.end());\r
+                       \r
+                       replyString << TEXT("\"") << relativePath.replace_extension(TEXT(""))\r
+                                               << TEXT("\" ") << sizeWStr\r
+                                               << TEXT(" ") << writeTimeWStr\r
+                                               << TEXT("\r\n");                \r
+               }\r
+       }\r
+       return boost::to_upper_copy(replyString.str());\r
+}\r
+\r
+namespace amcp {\r
+\r
+using namespace common;\r
+\r
+AMCPCommand::AMCPCommand() : channelIndex_(0), scheduling_(Default), layerIndex_(-1)\r
+{}\r
+\r
+void AMCPCommand::SendReply()\r
+{\r
+       if(!pClientInfo_) \r
+               return;\r
+\r
+       if(replyString_.empty())\r
+               return;\r
+       pClientInfo_->Send(replyString_);\r
+}\r
+\r
+void AMCPCommand::Clear() \r
+{\r
+       pChannel_.reset();\r
+       pClientInfo_.reset();\r
+       channelIndex_ = 0;\r
+       _parameters.clear();\r
+}\r
+\r
+bool LoadCommand::DoExecute()\r
+{      \r
+       //Perform loading of the clip\r
+       try\r
+       {\r
+               auto pFP = load_media(_parameters,  GetChannel()->frame_format_desc()); \r
+               bool autoPlay = std::find(_parameters.begin(), _parameters.end(), TEXT("AUTOPLAY")) != _parameters.end();               \r
+               GetChannel()->load(GetLayerIndex(), pFP, autoPlay ? renderer::load_option::auto_play : renderer::load_option::preview);\r
+       \r
+               CASPAR_LOG(info) << "Loaded " <<  _parameters[0] << TEXT(" successfully");\r
+\r
+               SetReplyString(TEXT("202 LOAD OK\r\n"));\r
+\r
+               GetChannel()->monitor().Inform(LOAD, _parameters[0]);\r
+               return true;\r
+       }\r
+       catch(file_not_found&)\r
+       {\r
+               CASPAR_LOG_CURRENT_EXCEPTION();\r
+               SetReplyString(TEXT("404 LOADBG ERROR\r\n"));\r
+               return false;\r
+       }\r
+       catch(...)\r
+       {\r
+               CASPAR_LOG_CURRENT_EXCEPTION();\r
+               SetReplyString(TEXT("502 LOADBG FAILED\r\n"));\r
+               return false;\r
+       }\r
+}\r
+\r
+bool LoadbgCommand::DoExecute()\r
+{\r
+       transition_info transitionInfo;\r
+       \r
+       bool bLoop = false;\r
+       unsigned short transitionParameterIndex = 1;\r
+\r
+       if(_parameters.size() > 1 && _parameters[1] == TEXT("LOOP"))\r
+               ++transitionParameterIndex;\r
+\r
+       //Setup transition info\r
+       if(_parameters.size() > transitionParameterIndex)       //type\r
+       {\r
+               std::wstring transitionType = _parameters[transitionParameterIndex];\r
+\r
+               if(transitionType == TEXT("CUT"))\r
+                       transitionInfo.type = transition_type::cut;\r
+               else if(transitionType == TEXT("MIX"))\r
+                       transitionInfo.type = transition_type::mix;\r
+               else if(transitionType == TEXT("PUSH"))\r
+                       transitionInfo.type = transition_type::push;\r
+               else if(transitionType == TEXT("SLIDE"))\r
+                       transitionInfo.type = transition_type::slide;\r
+               else if(transitionType == TEXT("WIPE"))\r
+                       transitionInfo.type = transition_type::wipe;\r
+\r
+               if(_parameters.size() > static_cast<unsigned short>(transitionParameterIndex+1))        //duration\r
+               {\r
+                       int duration = _ttoi(_parameters[transitionParameterIndex+1].c_str());\r
+                       if(duration > 0)\r
+                               transitionInfo.duration = duration;\r
+\r
+                       if(_parameters.size() > static_cast<unsigned short>(transitionParameterIndex+2))        //direction\r
+                       {\r
+                               std::wstring direction = _parameters[transitionParameterIndex+2];\r
+\r
+                               if(direction == TEXT("FROMLEFT"))\r
+                                       transitionInfo.direction = transition_direction::from_left;\r
+                               else if(direction == TEXT("FROMRIGHT"))\r
+                                       transitionInfo.direction = transition_direction::from_right;\r
+                               else if(direction == TEXT("LEFT"))\r
+                                       transitionInfo.direction = transition_direction::from_right;\r
+                               else if(direction == TEXT("RIGHT"))\r
+                                       transitionInfo.direction = transition_direction::from_left;\r
+\r
+                               if(_parameters.size() > static_cast<unsigned short>(transitionParameterIndex+3))        //border\r
+                               {\r
+                                       std::wstring border = _parameters[transitionParameterIndex+3];\r
+                                       if(border.size()>0)\r
+                                       {\r
+                                               if(border[0] == TEXT('#'))\r
+                                                       transitionInfo.border_color = border;\r
+                                               else\r
+                                                       transitionInfo.border_image = border;\r
+                                       }\r
+\r
+                                       if(_parameters.size() > static_cast<unsigned short>(transitionParameterIndex+4))        //border width\r
+                                               transitionInfo.border_width = _ttoi(_parameters[transitionParameterIndex+4].c_str());\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       //Perform loading of the clip\r
+       try\r
+       {\r
+               auto pFP = load_media(_parameters,  GetChannel()->frame_format_desc());\r
+               if(pFP == nullptr)\r
+                       BOOST_THROW_EXCEPTION(file_not_found() << msg_info(_parameters.size() > 0 ? common::narrow(_parameters[0]) : ""));\r
+\r
+               pFP = std::make_shared<transition_producer>(pFP, transitionInfo, GetChannel()->frame_format_desc());\r
+               bool autoPlay = std::find(_parameters.begin(), _parameters.end(), TEXT("AUTOPLAY")) != _parameters.end();\r
+               GetChannel()->load(GetLayerIndex(), pFP, autoPlay ? renderer::load_option::auto_play : renderer::load_option::none); // TODO: LOOP\r
+       \r
+               CASPAR_LOG(info) << "Loaded " << _parameters[0] << TEXT(" successfully to background");\r
+               SetReplyString(TEXT("202 LOADBG OK\r\n"));\r
+\r
+               GetChannel()->monitor().Inform(LOADBG, _parameters[0]);\r
+               return true;\r
+       }\r
+       catch(file_not_found&)\r
+       {\r
+               CASPAR_LOG_CURRENT_EXCEPTION();\r
+               SetReplyString(TEXT("404 LOADBG ERROR\r\n"));\r
+               return false;\r
+       }\r
+       catch(...)\r
+       {\r
+               CASPAR_LOG_CURRENT_EXCEPTION();\r
+               SetReplyString(TEXT("502 LOADBG FAILED\r\n"));\r
+               return false;\r
+       }\r
+}\r
+\r
+bool PlayCommand::DoExecute()\r
+{\r
+       try\r
+       {\r
+               GetChannel()->play(GetLayerIndex());\r
+               SetReplyString(TEXT("202 PLAY OK\r\n"));\r
+               return true;\r
+       }\r
+       catch(...)\r
+       {\r
+               SetReplyString(TEXT("501 PLAY FAILED\r\n"));\r
+       }\r
+\r
+       return false;\r
+}\r
+\r
+bool StopCommand::DoExecute()\r
+{\r
+       try\r
+       {\r
+               GetChannel()->stop(GetLayerIndex());\r
+               SetReplyString(TEXT("202 STOP OK\r\n"));\r
+               return true;\r
+       }\r
+       catch(...)\r
+       {\r
+               SetReplyString(TEXT("501 STOP FAILED\r\n"));\r
+       }\r
+\r
+       return false;\r
+}\r
+\r
+bool ClearCommand::DoExecute()\r
+{\r
+       GetChannel()->clear(GetLayerIndex());\r
+       SetReplyString(TEXT("202 CLEAR OK\r\n"));\r
+\r
+       GetChannel()->monitor().Inform(CLEAR);\r
+       return true;\r
+}\r
+\r
+bool CGCommand::DoExecute()\r
+{\r
+       std::wstring command = _parameters[0];\r
+       if(command == TEXT("ADD"))\r
+               return DoExecuteAdd();\r
+       else if(command == TEXT("PLAY"))\r
+               return DoExecutePlay();\r
+       else if(command == TEXT("STOP"))\r
+               return DoExecuteStop();\r
+       else if(command == TEXT("NEXT"))\r
+               return DoExecuteNext();\r
+       else if(command == TEXT("REMOVE"))\r
+               return DoExecuteRemove();\r
+       else if(command == TEXT("CLEAR"))\r
+               return DoExecuteClear();\r
+       else if(command == TEXT("UPDATE"))\r
+               return DoExecuteUpdate();\r
+       else if(command == TEXT("INVOKE"))\r
+               return DoExecuteInvoke();\r
+       else if(command == TEXT("INFO"))\r
+               return DoExecuteInfo();\r
+\r
+       SetReplyString(TEXT("403 CG ERROR\r\n"));\r
+       return false;\r
+}\r
+\r
+bool CGCommand::ValidateLayer(const std::wstring& layerstring) {\r
+       int length = layerstring.length();\r
+       for(int i = 0; i < length; ++i) {\r
+               if(!_istdigit(layerstring[i])) {\r
+                       return false;\r
+               }\r
+       }\r
+\r
+       return true;\r
+}\r
+\r
+bool CGCommand::DoExecuteAdd() {\r
+       //CG 1 ADD 0 "template_folder/templatename" [STARTLABEL] 0/1 [DATA]\r
+\r
+       int layer = 0;                          //_parameters[1]\r
+//     std::wstring templateName;      //_parameters[2]\r
+       std::wstring label;             //_parameters[3]\r
+       bool bDoStart = false;          //_parameters[3] alt. _parameters[4]\r
+//     std::wstring data;                      //_parameters[4] alt. _parameters[5]\r
+\r
+       if(_parameters.size() < 4) \r
+       {\r
+               SetReplyString(TEXT("402 CG ERROR\r\n"));\r
+               return false;\r
+       }\r
+       unsigned int dataIndex = 4;\r
+\r
+       if(!ValidateLayer(_parameters[1])) \r
+       {\r
+               SetReplyString(TEXT("403 CG ERROR\r\n"));\r
+               return false;\r
+       }\r
+\r
+       layer = _ttoi(_parameters[1].c_str());\r
+\r
+       if(_parameters[3].length() > 1) \r
+       {       //read label\r
+               label = _parameters[3];\r
+               ++dataIndex;\r
+\r
+               if(_parameters.size() > 4 && _parameters[4].length() > 0)       //read play-on-load-flag\r
+                       bDoStart = (_parameters[4][0]==TEXT('1')) ? true : false;\r
+               else \r
+               {\r
+                       SetReplyString(TEXT("402 CG ERROR\r\n"));\r
+                       return false;\r
+               }\r
+       }\r
+       else if(_parameters[3].length() > 0) {  //read play-on-load-flag\r
+               bDoStart = (_parameters[3][0]==TEXT('1')) ? true : false;\r
+       }\r
+       else \r
+       {\r
+               SetReplyString(TEXT("403 CG ERROR\r\n"));\r
+               return false;\r
+       }\r
+\r
+       const TCHAR* pDataString = 0;\r
+       std::wstringstream data;\r
+       std::wstring dataFromFile;\r
+       if(_parameters.size() > dataIndex) \r
+       {       //read data\r
+               const std::wstring& dataString = _parameters[dataIndex];\r
+\r
+               if(dataString[0] == TEXT('<')) //the data is an XML-string\r
+                       pDataString = dataString.c_str();\r
+               else \r
+               {\r
+                       //The data is not an XML-string, it must be a filename\r
+                       std::wstring filename = server::data_folder();\r
+                       filename.append(dataString);\r
+                       filename.append(TEXT(".ftd"));\r
+\r
+                       //open file\r
+                       std::wifstream datafile(filename.c_str());\r
+                       if(datafile) \r
+                       {\r
+                               //read all data\r
+                               data << datafile.rdbuf();\r
+                               datafile.close();\r
+\r
+                               //extract data to _parameters\r
+                               dataFromFile = data.str();\r
+                               pDataString = dataFromFile.c_str();\r
+                       }\r
+               }\r
+       }\r
+\r
+       std::wstring fullFilename = flash::flash_producer::find_template(server::template_folder() + _parameters[2]);\r
+       if(!fullFilename.empty())\r
+       {\r
+               std::wstring extension = boost::filesystem::wpath(fullFilename).extension();\r
+               std::wstring filename = _parameters[2];\r
+               filename.append(extension);\r
+\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->add(layer, filename, bDoStart, label, (pDataString!=0) ? pDataString : TEXT(""));\r
+               SetReplyString(TEXT("202 CG OK\r\n"));\r
+\r
+               GetChannel()->monitor().Inform(CG_ADD, _parameters[2]);\r
+       }\r
+       else\r
+       {\r
+               CASPAR_LOG(warning) << "Could not find template " << _parameters[2];\r
+               SetReplyString(TEXT("404 CG ERROR\r\n"));\r
+       }\r
+       return true;\r
+}\r
+\r
+bool CGCommand::DoExecutePlay()\r
+{\r
+       if(_parameters.size() > 1)\r
+       {\r
+               if(!ValidateLayer(_parameters[1])) \r
+               {\r
+                       SetReplyString(TEXT("403 CG ERROR\r\n"));\r
+                       return false;\r
+               }\r
+               int layer = _ttoi(_parameters[1].c_str());\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->play(layer);\r
+       }\r
+       else\r
+       {\r
+               SetReplyString(TEXT("402 CG ERROR\r\n"));\r
+               return true;\r
+       }\r
+\r
+       SetReplyString(TEXT("202 CG OK\r\n"));\r
+       return true;\r
+}\r
+\r
+bool CGCommand::DoExecuteStop() \r
+{\r
+       if(_parameters.size() > 1)\r
+       {\r
+               if(!ValidateLayer(_parameters[1])) \r
+               {\r
+                       SetReplyString(TEXT("403 CG ERROR\r\n"));\r
+                       return false;\r
+               }\r
+               int layer = _ttoi(_parameters[1].c_str());\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->stop(layer, 0);\r
+       }\r
+       else \r
+       {\r
+               SetReplyString(TEXT("402 CG ERROR\r\n"));\r
+               return true;\r
+       }\r
+\r
+       SetReplyString(TEXT("202 CG OK\r\n"));\r
+       return true;\r
+}\r
+\r
+bool CGCommand::DoExecuteNext()\r
+{\r
+       if(_parameters.size() > 1) \r
+       {\r
+               if(!ValidateLayer(_parameters[1])) \r
+               {\r
+                       SetReplyString(TEXT("403 CG ERROR\r\n"));\r
+                       return false;\r
+               }\r
+               int layer = _ttoi(_parameters[1].c_str());\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->next(layer);\r
+       }\r
+       else \r
+       {\r
+               SetReplyString(TEXT("402 CG ERROR\r\n"));\r
+               return true;\r
+       }\r
+\r
+       SetReplyString(TEXT("202 CG OK\r\n"));\r
+       return true;\r
+}\r
+\r
+bool CGCommand::DoExecuteRemove() \r
+{\r
+       if(_parameters.size() > 1) \r
+       {\r
+               if(!ValidateLayer(_parameters[1])) \r
+               {\r
+                       SetReplyString(TEXT("403 CG ERROR\r\n"));\r
+                       return false;\r
+               }\r
+               int layer = _ttoi(_parameters[1].c_str());\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->remove(layer);\r
+       }\r
+       else \r
+       {\r
+               SetReplyString(TEXT("402 CG ERROR\r\n"));\r
+               return true;\r
+       }\r
+\r
+       SetReplyString(TEXT("202 CG OK\r\n"));\r
+       return true;\r
+}\r
+\r
+bool CGCommand::DoExecuteClear() \r
+{\r
+       flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->clear();\r
+       SetReplyString(TEXT("202 CG OK\r\n"));\r
+       GetChannel()->monitor().Inform(CG_CLEAR);\r
+       return true;\r
+}\r
+\r
+bool CGCommand::DoExecuteUpdate() \r
+{\r
+       if(_parameters.size() > 2) \r
+       {\r
+               if(!ValidateLayer(_parameters[1]))\r
+               {\r
+                       SetReplyString(TEXT("403 CG ERROR\r\n"));\r
+                       return false;\r
+               }\r
+               int layer = _ttoi(_parameters[1].c_str());\r
+               //TODO: Implement indirect data loading from file. Same as in Add\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->update(layer, _parameters[2]);\r
+       }\r
+       else \r
+       {\r
+               SetReplyString(TEXT("402 CG ERROR\r\n"));\r
+               return true;\r
+       }\r
+\r
+       SetReplyString(TEXT("202 CG OK\r\n"));\r
+       return true;\r
+}\r
+\r
+bool CGCommand::DoExecuteInvoke() \r
+{\r
+       if(_parameters.size() > 2)\r
+       {\r
+               if(!ValidateLayer(_parameters[1]))\r
+               {\r
+                       SetReplyString(TEXT("403 CG ERROR\r\n"));\r
+                       return false;\r
+               }\r
+               int layer = _ttoi(_parameters[1].c_str());\r
+               flash::get_default_cg_producer(GetChannel(), GetLayerIndex(flash::CG_DEFAULT_LAYER))->invoke(layer, _parameters[2]);\r
+       }\r
+       else \r
+       {\r
+               SetReplyString(TEXT("402 CG ERROR\r\n"));\r
+               return true;\r
+       }\r
+\r
+       SetReplyString(TEXT("202 CG OK\r\n"));\r
+       return true;\r
+}\r
+\r
+bool CGCommand::DoExecuteInfo() \r
+{\r
+       // TODO\r
+       //flash::get_default_cg_producer(GetChannel())->Info();\r
+       SetReplyString(TEXT("600 CG FAILED\r\n"));\r
+       return true;\r
+}\r
+\r
+bool DataCommand::DoExecute()\r
+{\r
+       std::wstring command = _parameters[0];\r
+       if(command == TEXT("STORE"))\r
+               return DoExecuteStore();\r
+       else if(command == TEXT("RETRIEVE"))\r
+               return DoExecuteRetrieve();\r
+       else if(command == TEXT("LIST"))\r
+               return DoExecuteList();\r
+\r
+       SetReplyString(TEXT("403 DATA ERROR\r\n"));\r
+       return false;\r
+}\r
+\r
+bool DataCommand::DoExecuteStore() \r
+{\r
+       if(_parameters.size() < 3) \r
+       {\r
+               SetReplyString(TEXT("402 DATA STORE ERROR\r\n"));\r
+               return false;\r
+       }\r
+\r
+       std::wstring filename = server::data_folder();\r
+       filename.append(_parameters[1]);\r
+       filename.append(TEXT(".ftd"));\r
+\r
+       std::wofstream datafile(filename.c_str());\r
+       if(!datafile) \r
+       {\r
+               SetReplyString(TEXT("501 DATA STORE FAILED\r\n"));\r
+               return false;\r
+       }\r
+\r
+       datafile << _parameters[2];\r
+       datafile.close();\r
+\r
+       std::wstring replyString = TEXT("202 DATA STORE OK\r\n");\r
+       SetReplyString(replyString);\r
+       return true;\r
+}\r
+\r
+bool DataCommand::DoExecuteRetrieve() \r
+{\r
+       if(_parameters.size() < 2) \r
+       {\r
+               SetReplyString(TEXT("402 DATA RETRIEVE ERROR\r\n"));\r
+               return false;\r
+       }\r
+\r
+       std::wstring filename = server::data_folder();\r
+       filename.append(_parameters[1]);\r
+       filename.append(TEXT(".ftd"));\r
+\r
+       std::wifstream datafile(filename.c_str());\r
+       if(!datafile) \r
+       {\r
+               SetReplyString(TEXT("404 DATA RETRIEVE ERROR\r\n"));\r
+               return false;\r
+       }\r
+\r
+       std::wstringstream reply(TEXT("201 DATA RETRIEVE OK\r\n"));\r
+       std::wstring line;\r
+       bool bFirstLine = true;\r
+       while(std::getline(datafile, line))\r
+       {\r
+               if(!bFirstLine)\r
+                       reply << "\\n";\r
+               else\r
+                       bFirstLine = false;\r
+\r
+               reply << line;\r
+       }\r
+       datafile.close();\r
+\r
+       reply << "\r\n";\r
+       SetReplyString(reply.str());\r
+       return true;\r
+}\r
+\r
+bool DataCommand::DoExecuteList() \r
+{\r
+       std::wstringstream replyString;\r
+       replyString << TEXT("200 DATA LIST OK\r\n");\r
+       replyString << ListMedia();\r
+       replyString << TEXT("\r\n");\r
+\r
+       SetReplyString(boost::to_upper_copy(replyString.str()));\r
+       return true;\r
+}\r
+\r
+bool CinfCommand::DoExecute()\r
+{\r
+       std::wstringstream replyString;\r
+\r
+       std::wstring filename = server::media_folder()+_parameters[0];\r
+\r
+       // TODO:\r
+\r
+       //FileInfo fileInfo;\r
+\r
+       //MediaManagerPtr pMediaManager = GetApplication()->FindMediaFile(filename, &fileInfo);\r
+       //if(pMediaManager != 0 && fileInfo.filetype.length() >0)       //File was found\r
+       //{\r
+       //      if(pMediaManager->getFileInfo(&fileInfo))\r
+       //      {\r
+       //              TCHAR numBuffer[32];\r
+       //              _ui64tot_s(fileInfo.size, numBuffer, 32, 10);\r
+\r
+       //              replyString << TEXT("201 CINF OK\r\n\"") << fileInfo.filename << TEXT("\" ") << fileInfo.type << TEXT("/") << fileInfo.filetype << TEXT("/") << fileInfo.encoding << TEXT(" ") << numBuffer << TEXT("\r\n");\r
+\r
+       //              SetReplyString(replyString.str());\r
+       //              return true;\r
+       //      }\r
+       //}\r
+\r
+       SetReplyString(TEXT("404 CINF ERROR\r\n"));\r
+       return false;\r
+}\r
+\r
+void GenerateChannelInfo(int index, const renderer::render_device_ptr& pChannel, std::wstringstream& replyString)\r
+{\r
+       replyString << index << TEXT(" ") << pChannel->frame_format_desc().name  << TEXT("\r\n") << (pChannel->active(0) != nullptr ? TEXT(" PLAYING") : TEXT(" STOPPED"));\r
+}\r
+\r
+bool InfoCommand::DoExecute()\r
+{\r
+       std::wstringstream replyString;\r
+\r
+       if(_parameters.size() >= 1)\r
+       {\r
+               int channelIndex = _ttoi(_parameters[0].c_str())-1;\r
+\r
+               if(channelIndex < channels_.size())\r
+               {\r
+                       replyString << TEXT("201 INFO OK\r\n");\r
+                       GenerateChannelInfo(channelIndex, channels_[channelIndex], replyString);\r
+               }\r
+               else\r
+               {\r
+                       SetReplyString(TEXT("401 INFO ERROR\r\n"));\r
+                       return false;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               replyString << TEXT("200 INFO OK\r\n");\r
+               for(size_t n = 0; n < channels_.size(); ++n)\r
+                       GenerateChannelInfo(n, channels_[n], replyString);\r
+               replyString << TEXT("\r\n");\r
+       }\r
+\r
+       SetReplyString(replyString.str());\r
+       return true;\r
+}\r
+\r
+bool ClsCommand::DoExecute()\r
+{\r
+/*\r
+               wav = audio\r
+               mp3 = audio\r
+               swf     = movie\r
+               dv  = movie\r
+               tga = still\r
+               col = still\r
+       */\r
+       std::wstringstream replyString;\r
+       replyString << TEXT("200 CLS OK\r\n");\r
+       replyString << ListMedia();\r
+       replyString << TEXT("\r\n");\r
+       SetReplyString(boost::to_upper_copy(replyString.str()));\r
+       return true;\r
+}\r
+\r
+bool TlsCommand::DoExecute()\r
+{\r
+       std::wstringstream replyString;\r
+       replyString << TEXT("200 TLS OK\r\n");\r
+\r
+       replyString << ListTemplates();\r
+       replyString << TEXT("\r\n");\r
+\r
+       SetReplyString(replyString.str());\r
+       return true;\r
+}\r
+\r
+bool VersionCommand::DoExecute()\r
+{\r
+       std::wstringstream replyString;\r
+       replyString << TEXT("201 VERSION OK\r\n") << TEXT(CASPAR_VERSION_STR) << TEXT("\r\n");\r
+\r
+       SetReplyString(replyString.str());\r
+       return true;\r
+}\r
+\r
+bool ByeCommand::DoExecute()\r
+{\r
+       GetClientInfo()->Disconnect();\r
+       return true;\r
+}\r
+\r
+bool SetCommand::DoExecute()\r
+{\r
+       std::wstring name = _parameters[0];\r
+       std::transform(name.begin(), name.end(), name.begin(), toupper);\r
+\r
+       std::wstring value = _parameters[1];\r
+       std::transform(value.begin(), value.end(), value.begin(), toupper);\r
+\r
+       if(name == TEXT("MODE"))\r
+       {\r
+               //if(this->GetChannel()->SetVideoFormat(value)) TODO\r
+               //      this->SetReplyString(TEXT("202 SET MODE OK\r\n"));\r
+               //else\r
+                       this->SetReplyString(TEXT("501 SET MODE FAILED\r\n"));\r
+       }\r
+       else\r
+       {\r
+               this->SetReplyString(TEXT("403 SET ERROR\r\n"));\r
+       }\r
+\r
+       return true;\r
+}\r
+\r
+bool MonitorCommand::DoExecute()\r
+{\r
+       std::wstring cmd = _parameters[0];\r
+\r
+       if(cmd == TEXT("START")) {\r
+               GetChannel()->monitor().AddListener(GetClientInfo());\r
+               SetReplyString(TEXT("202 MONITOR START OK\r\n"));\r
+       }\r
+       else if(cmd == TEXT("STOP")) {\r
+               GetChannel()->monitor().RemoveListener(GetClientInfo());\r
+               SetReplyString(TEXT("202 MONITOR STOP OK\r\n"));\r
+       }\r
+       else\r
+               SetReplyString(TEXT("403 MONITOR ERROR\r\n"));\r
+\r
+       return true;\r
+}\r
+\r
+}      //namespace amcp\r
+}      //namespace caspar
\ No newline at end of file
diff --git a/core/protocol/amcp/AMCPCommandsImpl.h b/core/protocol/amcp/AMCPCommandsImpl.h
new file mode 100644 (file)
index 0000000..677e7be
--- /dev/null
@@ -0,0 +1,147 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#ifndef __AMCPCOMMANDSIMPL_H__\r
+#define __AMCPCOMMANDSIMPL_H__\r
+\r
+#include "AMCPCommand.h"\r
+\r
+namespace caspar {\r
+       \r
+std::wstring ListMedia();\r
+std::wstring ListTemplates();\r
+\r
+namespace amcp {\r
+\r
+class LoadCommand : public AMCPCommandBase<true, ImmediatelyAndClear, 1>\r
+{\r
+       bool DoExecute();\r
+};\r
+\r
+class LoadbgCommand : public AMCPCommandBase<true, AddToQueue, 1>\r
+{\r
+       bool DoExecute();\r
+};\r
+\r
+class PlayCommand: public AMCPCommandBase<true, AddToQueue, 0>\r
+{\r
+       bool DoExecute();\r
+};\r
+\r
+class StopCommand : public AMCPCommandBase<true, ImmediatelyAndClear, 0>\r
+{\r
+       bool DoExecute();\r
+};\r
+\r
+class ClearCommand : public AMCPCommandBase<true, ImmediatelyAndClear, 0>\r
+{\r
+       bool DoExecute();\r
+};\r
+\r
+class CGCommand : public AMCPCommandBase<true, AddToQueue, 1>\r
+{\r
+       bool DoExecute();\r
+       bool ValidateLayer(const std::wstring& layerstring);\r
+\r
+       bool DoExecuteAdd();\r
+       bool DoExecutePlay();\r
+       bool DoExecuteStop();\r
+       bool DoExecuteNext();\r
+       bool DoExecuteRemove();\r
+       bool DoExecuteClear();\r
+       bool DoExecuteUpdate();\r
+       bool DoExecuteInvoke();\r
+       bool DoExecuteInfo();\r
+};\r
+\r
+class DataCommand : public AMCPCommandBase<false, AddToQueue, 1>\r
+{\r
+       bool DoExecute();\r
+       bool DoExecuteStore();\r
+       bool DoExecuteRetrieve();\r
+       bool DoExecuteList();\r
+};\r
+\r
+class ClsCommand : public AMCPCommandBase<false, AddToQueue, 0>\r
+{\r
+       bool DoExecute();\r
+};\r
+\r
+class TlsCommand : public AMCPCommandBase<false, AddToQueue, 0>\r
+{\r
+       bool DoExecute();\r
+};\r
+\r
+class CinfCommand : public AMCPCommandBase<false, AddToQueue, 1>\r
+{\r
+       bool DoExecute();\r
+};\r
+\r
+class InfoCommand : public AMCPCommandBase<false, AddToQueue, 0>\r
+{\r
+public:\r
+       InfoCommand(const std::vector<renderer::render_device_ptr>& channels) : channels_(channels){}\r
+       bool DoExecute();\r
+private:\r
+       const std::vector<renderer::render_device_ptr>& channels_;\r
+};\r
+\r
+class VersionCommand : public AMCPCommandBase<false, AddToQueue, 0>\r
+{\r
+       bool DoExecute();\r
+};\r
+\r
+class ByeCommand : public AMCPCommandBase<false, AddToQueue, 0>\r
+{\r
+       bool DoExecute();\r
+};\r
+\r
+class SetCommand : public AMCPCommandBase<true, AddToQueue, 2>\r
+{\r
+       bool DoExecute();\r
+};\r
+\r
+class MonitorCommand : public AMCPCommandBase<true, AddToQueue, 1>\r
+{\r
+       bool DoExecute();\r
+};\r
+\r
+//class KillCommand : public AMCPCommand\r
+//{\r
+//public:\r
+//     KillCommand() {}\r
+//     virtual bool DoExecute();\r
+//     virtual AMCPCommandCondition CheckConditions();\r
+//\r
+//     virtual bool NeedChannel() {\r
+//             return false;\r
+//     }\r
+//     virtual AMCPCommandScheduling GetDefaultScheduling() {\r
+//             return AddToQueue;\r
+//     }\r
+//     virtual int GetMinimumParameters() {\r
+//             return 0;\r
+//     }\r
+//};\r
+\r
+}      //namespace amcp\r
+}      //namespace caspar\r
+\r
+#endif //__AMCPCOMMANDSIMPL_H__
\ No newline at end of file
diff --git a/core/protocol/amcp/AMCPProtocolStrategy.cpp b/core/protocol/amcp/AMCPProtocolStrategy.cpp
new file mode 100644 (file)
index 0000000..8a0fd71
--- /dev/null
@@ -0,0 +1,421 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "../../StdAfx.h"\r
+#include "../../renderer/render_device.h"\r
+\r
+#include "AMCPProtocolStrategy.h"\r
+\r
+#include "../../../common/io/AsyncEventServer.h"\r
+#include "AMCPCommandsImpl.h"\r
+\r
+#include <stdio.h>\r
+#include <crtdbg.h>\r
+#include <string.h>\r
+#include <algorithm>\r
+#include <cctype>\r
+\r
+#include <boost/algorithm/string/trim.hpp>\r
+#include <boost/algorithm/string/split.hpp>\r
+#include <boost/lexical_cast.hpp>\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (push, 1) // TODO: Legacy code, just disable warnings\r
+#endif\r
+\r
+namespace caspar { namespace amcp {\r
+\r
+using namespace common;\r
+using IO::ClientInfoPtr;\r
+\r
+const std::wstring AMCPProtocolStrategy::MessageDelimiter = TEXT("\r\n");\r
+\r
+inline renderer::render_device_ptr GetChannelSafe(unsigned int index, const std::vector<renderer::render_device_ptr>& channels)\r
+{\r
+       return index < channels.size() ? channels[index] : nullptr;\r
+}\r
+\r
+AMCPProtocolStrategy::AMCPProtocolStrategy(const std::vector<renderer::render_device_ptr>& channels) : channels_(channels) {\r
+       AMCPCommandQueuePtr pGeneralCommandQueue(new AMCPCommandQueue());\r
+       if(!pGeneralCommandQueue->Start()) {\r
+               CASPAR_LOG(error) << "Failed to start the general command-queue";\r
+\r
+               //TODO: THROW!\r
+       }\r
+       else\r
+               commandQueues_.push_back(pGeneralCommandQueue);\r
+\r
+\r
+       renderer::render_device_ptr pChannel;\r
+       unsigned int index = -1;\r
+       //Create a commandpump for each channel\r
+       while((pChannel = GetChannelSafe(++index, channels_)) != 0) {\r
+               AMCPCommandQueuePtr pChannelCommandQueue(new AMCPCommandQueue());\r
+               std::wstring title = TEXT("CHANNEL ");\r
+\r
+               //HACK: Perform real conversion from int to string\r
+               TCHAR num = TEXT('1')+static_cast<TCHAR>(index);\r
+               title += num;\r
+\r
+               if(!pChannelCommandQueue->Start()) {\r
+                       std::wstring logString = TEXT("Failed to start command-queue for ");\r
+                       logString += title;\r
+                       CASPAR_LOG(error) << logString;\r
+\r
+                       //TODO: THROW!\r
+               }\r
+               else\r
+                       commandQueues_.push_back(pChannelCommandQueue);\r
+       }\r
+}\r
+\r
+AMCPProtocolStrategy::~AMCPProtocolStrategy() {\r
+}\r
+\r
+void AMCPProtocolStrategy::Parse(const TCHAR* pData, int charCount, ClientInfoPtr pClientInfo)\r
+{\r
+       size_t pos;\r
+       std::wstring recvData(pData, charCount);\r
+       std::wstring availibleData = (pClientInfo != nullptr ? pClientInfo->currentMessage_ : L"") + recvData;\r
+\r
+       while(true) {\r
+               pos = availibleData.find(MessageDelimiter);\r
+               if(pos != std::wstring::npos)\r
+               {\r
+                       std::wstring message = availibleData.substr(0,pos);\r
+\r
+                       //This is where a complete message gets taken care of\r
+                       if(message.length() > 0) {\r
+                               ProcessMessage(message, pClientInfo);\r
+                       }\r
+\r
+                       std::size_t nextStartPos = pos + MessageDelimiter.length();\r
+                       if(nextStartPos < availibleData.length())\r
+                               availibleData = availibleData.substr(nextStartPos);\r
+                       else {\r
+                               availibleData.clear();\r
+                               break;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       break;\r
+               }\r
+       }\r
+       if(pClientInfo)\r
+               pClientInfo->currentMessage_ = availibleData;\r
+}\r
+\r
+void AMCPProtocolStrategy::ProcessMessage(const std::wstring& message, ClientInfoPtr& pClientInfo)\r
+{\r
+       bool bError = true;\r
+       MessageParserState state = New;\r
+\r
+       AMCPCommandPtr pCommand;\r
+\r
+       pCommand = InterpretCommandString(message, &state);\r
+\r
+       if(pCommand != 0) {\r
+               pCommand->SetClientInfo(pClientInfo);   \r
+               if(QueueCommand(pCommand))\r
+                       bError = false;\r
+               else\r
+                       state = GetChannel;\r
+       }\r
+\r
+       if(bError == true) {\r
+               std::wstringstream answer;\r
+               switch(state)\r
+               {\r
+               case GetCommand:\r
+                       answer << TEXT("400 ERROR\r\n") + message << "\r\n";\r
+                       break;\r
+               case GetChannel:\r
+                       answer << TEXT("401 ERROR\r\n");\r
+                       break;\r
+               case GetParameters:\r
+                       answer << TEXT("402 ERROR\r\n");\r
+                       break;\r
+               default:\r
+                       answer << TEXT("500 FAILED\r\n");\r
+                       break;\r
+               }\r
+               pClientInfo->Send(answer.str());\r
+       }\r
+}\r
+\r
+AMCPCommandPtr AMCPProtocolStrategy::InterpretCommandString(const std::wstring& message, MessageParserState* pOutState)\r
+{\r
+       std::vector<std::wstring> tokens;\r
+       unsigned int currentToken = 0;\r
+       std::wstring commandSwitch;\r
+\r
+       AMCPCommandPtr pCommand;\r
+       MessageParserState state = New;\r
+\r
+       CASPAR_LOG(trace) << message;\r
+\r
+       std::size_t tokensInMessage = TokenizeMessage(message, &tokens);\r
+\r
+       //parse the message one token at the time\r
+       while(currentToken < tokensInMessage)\r
+       {\r
+               switch(state)\r
+               {\r
+               case New:\r
+                       if(tokens[currentToken][0] == TEXT('/'))\r
+                               state = GetSwitch;\r
+                       else\r
+                               state = GetCommand;\r
+                       break;\r
+\r
+               case GetSwitch:\r
+                       commandSwitch = tokens[currentToken];\r
+                       state = GetCommand;\r
+                       ++currentToken;\r
+                       break;\r
+\r
+               case GetCommand:\r
+                       pCommand = CommandFactory(tokens[currentToken]);\r
+                       if(pCommand == 0) {\r
+                               goto ParseFinnished;\r
+                       }\r
+                       else\r
+                       {\r
+                               //Set scheduling\r
+                               if(commandSwitch.size() > 0) {\r
+                                       transform(commandSwitch.begin(), commandSwitch.end(), commandSwitch.begin(), toupper);\r
+\r
+                                       if(commandSwitch == TEXT("/APP"))\r
+                                               pCommand->SetScheduling(AddToQueue);\r
+                                       else if(commandSwitch  == TEXT("/IMMF"))\r
+                                               pCommand->SetScheduling(ImmediatelyAndClear);\r
+                               }\r
+\r
+                               if(pCommand->NeedChannel())\r
+                                       state = GetChannel;\r
+                               else\r
+                                       state = GetParameters;\r
+                       }\r
+                       ++currentToken;\r
+                       break;\r
+\r
+               case GetParameters:\r
+                       {\r
+                               _ASSERTE(pCommand != 0);\r
+                               int parameterCount=0;\r
+                               while(currentToken<tokensInMessage)\r
+                               {\r
+                                       pCommand->AddParameter(tokens[currentToken++]);\r
+                                       ++parameterCount;\r
+                               }\r
+\r
+                               if(parameterCount < pCommand->GetMinimumParameters()) {\r
+                                       goto ParseFinnished;\r
+                               }\r
+\r
+                               state = Done;\r
+                               break;\r
+                       }\r
+\r
+               case GetChannel:\r
+                       {\r
+//                             assert(pCommand != 0);\r
+\r
+                               std::wstring str = boost::trim_copy(tokens[currentToken]);\r
+                               std::vector<std::wstring> split;\r
+                               boost::split(split, str, boost::is_any_of("-"));\r
+                                       \r
+                               int channelIndex = boost::lexical_cast<int>(split[0]) - 1;\r
+\r
+                               int layerIndex = -1;\r
+                               if(split.size() > 1)\r
+                                       layerIndex = boost::lexical_cast<int>(split[1]);\r
+\r
+                               renderer::render_device_ptr pChannel = GetChannelSafe(channelIndex, channels_);\r
+                               if(pChannel == 0) {\r
+                                       goto ParseFinnished;\r
+                               }\r
+\r
+                               pCommand->SetChannel(pChannel);\r
+                               pCommand->SetChannelIndex(channelIndex);\r
+                               pCommand->SetLayerIntex(layerIndex);\r
+\r
+                               state = GetParameters;\r
+                               ++currentToken;\r
+                               break;\r
+                       }\r
+\r
+               default:        //Done and unexpected\r
+                       goto ParseFinnished;\r
+               }\r
+       }\r
+\r
+ParseFinnished:\r
+       if(state == GetParameters && pCommand->GetMinimumParameters()==0)\r
+               state = Done;\r
+\r
+       if(state != Done) {\r
+               pCommand.reset();\r
+       }\r
+\r
+       if(pOutState != 0) {\r
+               *pOutState = state;\r
+       }\r
+\r
+       return pCommand;\r
+}\r
+\r
+bool AMCPProtocolStrategy::QueueCommand(AMCPCommandPtr pCommand) {\r
+       if(pCommand->NeedChannel()) {\r
+               unsigned int channelIndex = pCommand->GetChannelIndex() + 1;\r
+               if(commandQueues_.size() > channelIndex) {\r
+                       commandQueues_[channelIndex]->AddCommand(pCommand);\r
+               }\r
+               else\r
+                       return false;\r
+       }\r
+       else {\r
+               commandQueues_[0]->AddCommand(pCommand);\r
+       }\r
+       return true;\r
+}\r
+\r
+AMCPCommandPtr AMCPProtocolStrategy::CommandFactory(const std::wstring& str)\r
+{\r
+       std::wstring s = str;\r
+       transform(s.begin(), s.end(), s.begin(), toupper);\r
+\r
+       AMCPCommandPtr result;\r
+\r
+       if(s == TEXT("LOAD"))\r
+               result = AMCPCommandPtr(new LoadCommand());\r
+       else if(s == TEXT("LOADBG"))\r
+               result = AMCPCommandPtr(new LoadbgCommand());\r
+       else if(s == TEXT("PLAY"))\r
+               result = AMCPCommandPtr(new PlayCommand());\r
+       else if(s == TEXT("STOP"))\r
+               result = AMCPCommandPtr(new StopCommand());\r
+       else if(s == TEXT("CLEAR"))\r
+               result = AMCPCommandPtr(new ClearCommand());\r
+       else if(s == TEXT("CG"))\r
+               result = AMCPCommandPtr(new CGCommand());\r
+       else if(s == TEXT("DATA"))\r
+               result = AMCPCommandPtr(new DataCommand());\r
+       else if(s == TEXT("CINF"))\r
+               result = AMCPCommandPtr(new CinfCommand());\r
+       else if(s == TEXT("INFO"))\r
+               result = AMCPCommandPtr(new InfoCommand(channels_));\r
+       else if(s == TEXT("CLS"))\r
+               result = AMCPCommandPtr(new ClsCommand());\r
+       else if(s == TEXT("TLS"))\r
+               result = AMCPCommandPtr(new TlsCommand());\r
+       else if(s == TEXT("VERSION"))\r
+               result = AMCPCommandPtr(new VersionCommand());\r
+       else if(s == TEXT("BYE"))\r
+               result = AMCPCommandPtr(new ByeCommand());\r
+       else if(s == TEXT("SET"))\r
+               result = AMCPCommandPtr(new SetCommand());\r
+       //else if(s == TEXT("MONITOR"))\r
+       //{\r
+       //      result = AMCPCommandPtr(new MonitorCommand());\r
+       //}\r
+       //else if(s == TEXT("KILL"))\r
+       //{\r
+       //      result = AMCPCommandPtr(new KillCommand());\r
+       //}\r
+       return result;\r
+}\r
+\r
+std::size_t AMCPProtocolStrategy::TokenizeMessage(const std::wstring& message, std::vector<std::wstring>* pTokenVector)\r
+{\r
+       //split on whitespace but keep strings within quotationmarks\r
+       //treat \ as the start of an escape-sequence: the following char will indicate what to actually put in the string\r
+\r
+       std::wstring currentToken;\r
+\r
+       char inQuote = 0;\r
+       bool getSpecialCode = false;\r
+\r
+       for(unsigned int charIndex=0; charIndex<message.size(); ++charIndex)\r
+       {\r
+               if(getSpecialCode)\r
+               {\r
+                       //insert code-handling here\r
+                       switch(message[charIndex])\r
+                       {\r
+                       case TEXT('\\'):\r
+                currentToken += TEXT("\\");\r
+                               break;\r
+                       case TEXT('\"'):\r
+                               currentToken += TEXT("\"");\r
+                               break;\r
+                       case TEXT('n'):\r
+                               currentToken += TEXT("\n");\r
+                               break;\r
+                       default:\r
+                               break;\r
+                       };\r
+                       getSpecialCode = false;\r
+                       continue;\r
+               }\r
+\r
+               if(message[charIndex]==TEXT('\\'))\r
+               {\r
+                       getSpecialCode = true;\r
+                       continue;\r
+               }\r
+\r
+               if(message[charIndex]==' ' && inQuote==false)\r
+               {\r
+                       if(currentToken.size()>0)\r
+                       {\r
+                               pTokenVector->push_back(currentToken);\r
+                               currentToken.clear();\r
+                       }\r
+                       continue;\r
+               }\r
+\r
+               if(message[charIndex]==TEXT('\"'))\r
+               {\r
+                       inQuote ^= 1;\r
+\r
+                       if(currentToken.size()>0)\r
+                       {\r
+                               pTokenVector->push_back(currentToken);\r
+                               currentToken.clear();\r
+                       }\r
+                       continue;\r
+               }\r
+\r
+               currentToken += message[charIndex];\r
+       }\r
+\r
+       if(currentToken.size()>0)\r
+       {\r
+               pTokenVector->push_back(currentToken);\r
+               currentToken.clear();\r
+       }\r
+\r
+       return pTokenVector->size();\r
+}\r
+\r
+}      //namespace amcp\r
+}      //namespace caspar
\ No newline at end of file
diff --git a/core/protocol/amcp/AMCPProtocolStrategy.h b/core/protocol/amcp/AMCPProtocolStrategy.h
new file mode 100644 (file)
index 0000000..f2a101d
--- /dev/null
@@ -0,0 +1,67 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../../../common/io/protocolstrategy.h"\r
+#include "AMCPCommand.h"\r
+#include "AMCPCommandQueue.h"\r
+\r
+namespace caspar { namespace amcp {\r
+\r
+class AMCPProtocolStrategy : public IO::IProtocolStrategy\r
+{\r
+       enum MessageParserState {\r
+               New = 0,\r
+               GetSwitch,\r
+               GetCommand,\r
+               GetParameters,\r
+               GetChannel,\r
+               Done\r
+       };\r
+\r
+       AMCPProtocolStrategy(const AMCPProtocolStrategy&);\r
+       AMCPProtocolStrategy& operator=(const AMCPProtocolStrategy&);\r
+\r
+public:\r
+       AMCPProtocolStrategy(const std::vector<renderer::render_device_ptr>& channels);\r
+       virtual ~AMCPProtocolStrategy();\r
+\r
+       virtual void Parse(const TCHAR* pData, int charCount, caspar::IO::ClientInfoPtr pClientInfo);\r
+       virtual UINT GetCodepage() {\r
+               return CP_UTF8;\r
+       }\r
+\r
+       AMCPCommandPtr InterpretCommandString(const std::wstring& str, MessageParserState* pOutState=0);\r
+\r
+private:\r
+       friend class AMCPCommand;\r
+\r
+       void ProcessMessage(const std::wstring& message, caspar::IO::ClientInfoPtr& pClientInfo);\r
+       std::size_t TokenizeMessage(const std::wstring& message, std::vector<std::wstring>* pTokenVector);\r
+       AMCPCommandPtr CommandFactory(const std::wstring& str);\r
+\r
+       bool QueueCommand(AMCPCommandPtr);\r
+\r
+       const std::vector<renderer::render_device_ptr>& channels_;\r
+       std::vector<AMCPCommandQueuePtr> commandQueues_;\r
+       static const std::wstring MessageDelimiter;\r
+};\r
+\r
+}}\r
diff --git a/core/protocol/cii/CIICommand.h b/core/protocol/cii/CIICommand.h
new file mode 100644 (file)
index 0000000..dfb099c
--- /dev/null
@@ -0,0 +1,38 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#pragma once\r
+\r
+namespace caspar {\r
+namespace cii {\r
+\r
+class ICIICommand\r
+{\r
+public:\r
+       virtual ~ICIICommand() {}\r
+       virtual int GetMinimumParameters() = 0;\r
+       virtual void Setup(const std::vector<std::wstring>& parameters) = 0;\r
+\r
+       virtual void Execute() = 0;\r
+};\r
+typedef std::tr1::shared_ptr<ICIICommand> CIICommandPtr;\r
+\r
+}      //namespace cii\r
+}      //namespace caspar
\ No newline at end of file
diff --git a/core/protocol/cii/CIICommandsImpl.cpp b/core/protocol/cii/CIICommandsImpl.cpp
new file mode 100644 (file)
index 0000000..95265fb
--- /dev/null
@@ -0,0 +1,192 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "../../StdAfx.h"\r
+\r
+#include "CIIProtocolStrategy.h"\r
+#include "CIICommandsImpl.h"\r
+#include <sstream>\r
+#include <algorithm>\r
+#include "../../producer/flash/cg_producer.h"\r
+\r
+namespace caspar { namespace cii {\r
+\r
+/////////////////\r
+// MediaCommand\r
+void MediaCommand::Setup(const std::vector<std::wstring>& parameters) \r
+{\r
+       graphicProfile_ = parameters[1].substr(2);\r
+}\r
+\r
+void MediaCommand::Execute() \r
+{\r
+       pCIIStrategy_->SetProfile(graphicProfile_);\r
+}\r
+\r
+\r
+/////////////////\r
+// WriteCommand\r
+void WriteCommand::Setup(const std::vector<std::wstring>& parameters)\r
+{\r
+       try \r
+       {\r
+               if(parameters.size() > 2)\r
+               {\r
+                       targetName_ = parameters[1];\r
+                       templateName_ = parameters[2];\r
+\r
+                       std::wstringstream dataStream;\r
+\r
+                       dataStream << TEXT("<templateData>");\r
+\r
+                       std::vector<std::wstring>::size_type end = parameters.size();\r
+                       for(std::vector<std::wstring>::size_type i = 3; i < end; ++i) \r
+                               dataStream << TEXT("<componentData id=\"field") << i-2 << TEXT("\"><data id=\"text\" value=\"") << parameters[i] << TEXT("\" /></componentData>"); \r
+\r
+                       dataStream << TEXT("</templateData>");\r
+                       xmlData_ = dataStream.str();\r
+               }\r
+       }\r
+       catch(std::exception) {\r
+       }\r
+}\r
+\r
+void WriteCommand::Execute() \r
+{\r
+       pCIIStrategy_->WriteTemplateData(templateName_, targetName_, xmlData_);\r
+}\r
+\r
+\r
+//////////////////////\r
+// ImagestoreCommand\r
+void ImagestoreCommand::Setup(const std::vector<std::wstring>& parameters) \r
+{\r
+       if(parameters[1] == TEXT("7") && parameters.size() > 2) \r
+               titleName_ = parameters[2].substr(0, 4);        \r
+}\r
+\r
+void ImagestoreCommand::Execute()\r
+{\r
+       pCIIStrategy_->DisplayTemplate(titleName_);\r
+}\r
+\r
+\r
+//////////////////////\r
+// MiscellaneousCommand\r
+void MiscellaneousCommand::Setup(const std::vector<std::wstring>& parameters)\r
+{\r
+       //HAWRYS:       V\5\3\1\1\namn.tga\1\r
+       //                      Display still\r
+       if((parameters.size() > 5) && parameters[1] == TEXT("5") && parameters[2] == TEXT("3"))\r
+       {\r
+               filename_ = parameters[5];\r
+               filename_ = filename_.substr(0, filename_.find_last_of(TEXT('.')));\r
+               state_ = 0;\r
+               return;\r
+       }\r
+       \r
+       //NEPTUNE:      V\5\13\1\X\Template\0\TabField1\TabField2...\r
+       //                      Add Template to layer X in the active templatehost\r
+       if((parameters.size() > 5) && parameters[1] == TEXT("5") && parameters[2] == TEXT("13"))\r
+       {\r
+               layer_ = _ttoi(parameters[4].c_str());\r
+               filename_ = parameters[5];\r
+               state_ = 1;\r
+               if(parameters.size() > 7) {\r
+                       std::wstringstream dataStream;\r
+\r
+                       dataStream << TEXT("<templateData>");\r
+                       std::vector<std::wstring>::size_type end = parameters.size();\r
+                       for(std::vector<std::wstring>::size_type i = 7; i < end; ++i) {\r
+                               dataStream << TEXT("<componentData id=\"f") << i-7 << TEXT("\"><data id=\"text\" value=\"") << parameters[i] << TEXT("\" /></componentData>"); \r
+                       }\r
+                       dataStream << TEXT("</templateData>");\r
+\r
+                       xmlData_ = dataStream.str();\r
+               }\r
+       }\r
+\r
+       // VIDEO MODE V\5\14\MODE\r
+       if((parameters.size() > 3) && parameters[1] == TEXT("5") && parameters[2] == TEXT("14"))\r
+       {\r
+               std::wstring value = parameters[3];\r
+               std::transform(value.begin(), value.end(), value.begin(), toupper);\r
+\r
+               //this->pCIIStrategy_->GetChannel()->SetVideoFormat(value); TODO\r
+       }\r
+}\r
+\r
+void MiscellaneousCommand::Execute() \r
+{\r
+       if(state_ == 0)\r
+               pCIIStrategy_->DisplayMediaFile(filename_);     \r
+\r
+       //TODO: Need to be checked for validity\r
+       else if(state_ == 1)\r
+               flash::get_default_cg_producer(pCIIStrategy_->GetChannel())->add(layer_, filename_, false, TEXT(""), xmlData_);\r
+}\r
+\r
+\r
+///////////////////\r
+// KeydataCommand\r
+void KeydataCommand::Execute() \r
+{\r
+       if(state_ == 0) \r
+               pCIIStrategy_->DisplayTemplate(titleName_);\r
+       \r
+\r
+       //TODO: Need to be checked for validity\r
+       else if(state_ == 1)\r
+               flash::get_default_cg_producer(pCIIStrategy_->GetChannel())->stop(layer_, 0);\r
+       else if(state_ == 2)\r
+               flash::get_default_cg_producer(pCIIStrategy_->GetChannel())->clear();\r
+       else if(state_ == 3)\r
+               flash::get_default_cg_producer(pCIIStrategy_->GetChannel())->play(layer_);\r
+}\r
+\r
+void KeydataCommand::Setup(const std::vector<std::wstring>& parameters) {\r
+       //HAWRYS:       Y\<205><247><202><196><192><192><200><248>\r
+       //parameter[1] looks like this: "=g:XXXXh" where XXXX is the name that we want\r
+       if(parameters[1].size() > 6) \r
+       {\r
+               titleName_.resize(4);\r
+               for(int i=0;i<4;++i)\r
+               {\r
+                       if(parameters[1][i+3] < 176) {\r
+                               titleName_ = TEXT("");\r
+                               break;\r
+                       }\r
+                       titleName_[i] = parameters[1][i+3]-144;\r
+               }\r
+               state_ = 0;\r
+       }\r
+\r
+       if(parameters.size() > 2)       \r
+               layer_ = _ttoi(parameters[2].c_str());  \r
+\r
+       if(parameters[1].at(0) == 27)   //NEPTUNE:      Y\<27>\X                        Stop layer X.\r
+               state_ = 1;\r
+       else if(static_cast<unsigned char>(parameters[1].at(0)) == 254) //NEPTUNE:      Y\<254>                 Clear Canvas. \r
+               state_ = 2;\r
+       else if(static_cast<unsigned char>(parameters[1].at(0)) == 213) //NEPTUNE:      Y\<213><243>\X  Play layer X. \r
+               state_ = 3;\r
+}\r
+\r
+}}
\ No newline at end of file
diff --git a/core/protocol/cii/CIICommandsImpl.h b/core/protocol/cii/CIICommandsImpl.h
new file mode 100644 (file)
index 0000000..19ca55f
--- /dev/null
@@ -0,0 +1,134 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#pragma once\r
+\r
+#include "ciicommand.h"\r
+\r
+namespace caspar {\r
+\r
+namespace cii {\r
+\r
+class CIIProtocolStrategy;\r
+\r
+class MediaCommand : public ICIICommand\r
+{\r
+public:\r
+       MediaCommand(CIIProtocolStrategy* pPS) : pCIIStrategy_(pPS)\r
+       {}\r
+\r
+       virtual int GetMinimumParameters() {\r
+               return 1;\r
+       }\r
+\r
+       virtual void Setup(const std::vector<std::wstring>& parameters);\r
+       virtual void Execute();\r
+\r
+private:\r
+       std::wstring graphicProfile_;\r
+\r
+       CIIProtocolStrategy* pCIIStrategy_;\r
+};\r
+\r
+class WriteCommand : public ICIICommand\r
+{\r
+public:\r
+       WriteCommand(CIIProtocolStrategy* pPS) : pCIIStrategy_(pPS)\r
+       {}\r
+\r
+       virtual int GetMinimumParameters() {\r
+               return 2;\r
+       }\r
+\r
+       virtual void Setup(const std::vector<std::wstring>& parameters);\r
+       virtual void Execute();\r
+\r
+private:\r
+       std::wstring targetName_;\r
+       std::wstring templateName_;\r
+       std::wstring xmlData_;\r
+\r
+       CIIProtocolStrategy* pCIIStrategy_;\r
+};\r
+\r
+class MiscellaneousCommand : public ICIICommand\r
+{\r
+public:\r
+       MiscellaneousCommand(CIIProtocolStrategy* pPS) : pCIIStrategy_(pPS), state_(-1), layer_(0)\r
+       {}\r
+\r
+       virtual int GetMinimumParameters() {\r
+               return 5;\r
+       }\r
+\r
+       virtual void Setup(const std::vector<std::wstring>& parameters);\r
+       virtual void Execute();\r
+\r
+private:\r
+       std::wstring filename_;\r
+       std::wstring xmlData_;\r
+       int state_;\r
+       int layer_;\r
+\r
+       CIIProtocolStrategy* pCIIStrategy_;\r
+};\r
+\r
+class ImagestoreCommand : public ICIICommand\r
+{\r
+public:\r
+       ImagestoreCommand(CIIProtocolStrategy* pPS) : pCIIStrategy_(pPS)\r
+       {}\r
+\r
+       virtual int GetMinimumParameters() {\r
+               return 1;\r
+       }\r
+\r
+       virtual void Setup(const std::vector<std::wstring>& parameters);\r
+       virtual void Execute();\r
+\r
+private:\r
+       std::wstring titleName_;\r
+\r
+       CIIProtocolStrategy* pCIIStrategy_;\r
+};\r
+\r
+class KeydataCommand : public ICIICommand\r
+{\r
+public:\r
+       KeydataCommand(CIIProtocolStrategy* pPS) : pCIIStrategy_(pPS), state_(-1), layer_(0)\r
+       {}\r
+\r
+       virtual int GetMinimumParameters() {\r
+               return 1;\r
+       }\r
+\r
+       virtual void Setup(const std::vector<std::wstring>& parameters);\r
+       virtual void Execute();\r
+\r
+private:\r
+       std::wstring titleName_;\r
+       int state_;\r
+       int layer_;\r
+\r
+       CIIProtocolStrategy* pCIIStrategy_;\r
+};\r
+\r
+}      //namespace cii\r
+}      //namespace caspar
\ No newline at end of file
diff --git a/core/protocol/cii/CIIProtocolStrategy.cpp b/core/protocol/cii/CIIProtocolStrategy.cpp
new file mode 100644 (file)
index 0000000..9967440
--- /dev/null
@@ -0,0 +1,286 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "../../StdAfx.h"\r
+\r
+#include <string>\r
+#include <sstream>\r
+#include <algorithm>\r
+#include "../media.h"\r
+#include "CIIProtocolStrategy.h"\r
+#include "CIICommandsimpl.h"\r
+#include "../../producer/flash/flash_producer.h"\r
+#include "../../producer/transition/transition_producer.h"\r
+#include "../../Server.h"\r
+#include "../../producer/frame_producer.h"\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (push, 1) // TODO: Legacy code, just disable warnings\r
+#endif\r
+\r
+namespace caspar { namespace cii {\r
+\r
+using namespace common;\r
+\r
+const std::wstring CIIProtocolStrategy::MessageDelimiter = TEXT("\r\n");\r
+const TCHAR CIIProtocolStrategy::TokenDelimiter = TEXT('\\');\r
+\r
+CIIProtocolStrategy::CIIProtocolStrategy(const std::vector<renderer::render_device_ptr>& channels) \r
+{\r
+       if(channels.empty())\r
+               BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("channels"));\r
+       pChannel_ = channels[0];\r
+       executor_.start();\r
+}\r
+\r
+void CIIProtocolStrategy::Parse(const TCHAR* pData, int charCount, caspar::IO::ClientInfoPtr pClientInfo) \r
+{\r
+       std::size_t pos;\r
+       std::wstring msg(pData, charCount);\r
+       std::wstring availibleData = currentMessage_ + msg;\r
+\r
+       while(true)\r
+       {\r
+               pos = availibleData.find(MessageDelimiter);\r
+               if(pos != std::wstring::npos)\r
+               {\r
+                       std::wstring message = availibleData.substr(0,pos);\r
+\r
+                       if(message.length() > 0) {\r
+                               ProcessMessage(message);\r
+                               if(pClientInfo != 0)\r
+                                       pClientInfo->Send(TEXT("*\r\n"));\r
+                       }\r
+\r
+                       std::size_t nextStartPos = pos + MessageDelimiter.length();\r
+                       if(nextStartPos < availibleData.length())\r
+                               availibleData = availibleData.substr(nextStartPos);\r
+                       else \r
+                       {\r
+                               availibleData.clear();\r
+                               break;\r
+                       }\r
+               }\r
+               else\r
+                       break;\r
+       }\r
+       currentMessage_ = availibleData;\r
+}\r
+\r
+void CIIProtocolStrategy::ProcessMessage(const std::wstring& message)\r
+{\r
+       CASPAR_LOG(debug) << message.c_str();\r
+\r
+       std::vector<std::wstring> tokens;\r
+       int tokenCount = TokenizeMessage(message, &tokens);\r
+\r
+       CIICommandPtr pCommand = Create(tokens[0]);\r
+       if((pCommand != 0) && (tokenCount-1) >= pCommand->GetMinimumParameters()) \r
+       {\r
+               pCommand->Setup(tokens);\r
+               executor_.begin_invoke([=]{pCommand->Execute();});\r
+       }\r
+       else {} //report error  \r
+}\r
+\r
+int CIIProtocolStrategy::TokenizeMessage(const std::wstring& message, std::vector<std::wstring>* pTokenVector)\r
+{\r
+       std::wstringstream currentToken;\r
+\r
+       for(unsigned int charIndex=0; charIndex<message.size(); ++charIndex) \r
+       {\r
+               if(message[charIndex] == TokenDelimiter) \r
+               {\r
+                       pTokenVector->push_back(currentToken.str());\r
+                       currentToken.str(TEXT(""));\r
+                       continue;\r
+               }\r
+\r
+               if(message[charIndex] == TEXT('\"')) \r
+                       currentToken << TEXT("&quot;");         \r
+               else if(message[charIndex] == TEXT('<')) \r
+                       currentToken << TEXT("&lt;");           \r
+               else if(message[charIndex] == TEXT('>')) \r
+                       currentToken << TEXT("&gt;");           \r
+               else \r
+                       currentToken << message[charIndex];\r
+       }\r
+\r
+       if(currentToken.str().size() > 0)\r
+               pTokenVector->push_back(currentToken.str());    \r
+\r
+       return (int)pTokenVector->size();\r
+}\r
+\r
+/************\r
+// Examples (<X> = ASCIICHAR X)\r
+\r
+I\25\3\VII\\                                                                   sätter outputtype till 'vii'\r
+I\25\4\1\\                                                                             enablar framebuffer (ignore this)\r
+\r
+M\C/SVTNEWS\\                                                                  pekar ut vilken grafisk profil som skall användas\r
+\r
+W\4009\4067\Jonas Björkman\\                                   Skriver "Jonas Björkman" till första textfältet i template 4067 och sparar den färdiga skylten som 4009\r
+\r
+T\7\4009.VII\A\\                                                               lägger ut skylt 4009\r
+\r
+Y\<205><247><202><196><192><192><200><248>\\   lägger ut skylten 4008 (<205><247><202><196><192><192><200><248> = "=g:4008h" om man drar bort 144 frÃ¥n varje asciivärde)\r
+\r
+V\5\3\1\1\namn.tga\1\\                                                 lägger ut bilden namn.tga\r
+V\0\1\D\C\10\0\0\0\\                                                   gör nÃ¥gon inställning som har med föregÃ¥ende kommando att göra.\r
+\r
+*************/\r
+\r
+/**********************\r
+New Commands to support the Netupe automation system\r
+V\5\13\1\1\Template\0\TabField1\TabField2...\\         Build. Ettan före Template indikerar vilket lager den nya templaten skall laddas in i. OBS. Skall inte visas efter det här steget\r
+Y\<27>\\                                                                                       Stop. Här kommer ett lagerID ocksÃ¥ att skickas med (<27> = ESC)\r
+Y\<254>\\                                                                                      Clear Canvas. Här kommer ett lagerID ocksÃ¥ att skickas med, utan det skall allt tömmas\r
+Y\<213><243>\\                                                                         Play. Här kommer ett lagerID ocksÃ¥ att skickas med\r
+\r
+**********************/\r
+CIICommandPtr CIIProtocolStrategy::Create(const std::wstring& name)\r
+{\r
+       switch(name[0])\r
+       {\r
+               case TEXT('M'): return std::make_shared<MediaCommand>(this);\r
+               case TEXT('W'): return std::make_shared<WriteCommand>(this);\r
+               case TEXT('T'): return std::make_shared<ImagestoreCommand>(this);\r
+               case TEXT('V'): return std::make_shared<MiscellaneousCommand>(this);\r
+               case TEXT('Y'): return std::make_shared<KeydataCommand>(this);\r
+               default:                return nullptr;\r
+       }\r
+}\r
+\r
+void CIIProtocolStrategy::WriteTemplateData(const std::wstring& templateName, const std::wstring& titleName, const std::wstring& xmlData) \r
+{\r
+       std::wstring fullTemplateFilename = server::template_folder();\r
+       if(currentProfile_.size() > 0)\r
+       {\r
+               fullTemplateFilename += currentProfile_;\r
+               fullTemplateFilename += TEXT("\\");\r
+       }\r
+       fullTemplateFilename += templateName;\r
+       fullTemplateFilename = flash::flash_producer::find_template(fullTemplateFilename);\r
+       if(fullTemplateFilename.empty())\r
+       {\r
+               CASPAR_LOG(error) << "Failed to save instance of " << templateName << TEXT(" as ") << titleName << TEXT(", template ") << fullTemplateFilename << " not found";\r
+               return;\r
+       }\r
+       \r
+       std::vector<std::wstring> params;\r
+       params.push_back(server::template_folder()+TEXT("CG.fth"));\r
+       auto pFP = flash::create_flash_producer(params, GetChannel()->frame_format_desc());\r
+       if(pFP != 0)\r
+       {\r
+               //TODO: Initialize with valid FrameFactory\r
+//             pFP->Initialize(0, false);\r
+\r
+               std::wstringstream flashParam;\r
+               flashParam << TEXT("<invoke name=\"Add\" returntype=\"xml\"><arguments><number>1</number><string>") << currentProfile_ << '/' <<  templateName << TEXT("</string><number>0</number><true/><string> </string><string><![CDATA[ ") << xmlData << TEXT(" ]]></string></arguments></invoke>");\r
+               pFP->param(flashParam.str());\r
+\r
+               CASPAR_LOG(info) << "Saved an instance of " << templateName << TEXT(" as ") << titleName ;\r
+\r
+               PutPreparedTemplate(titleName, std::static_pointer_cast<frame_producer>(pFP));\r
+       }\r
+}\r
+\r
+void CIIProtocolStrategy::DisplayTemplate(const std::wstring& titleName)\r
+{\r
+       try\r
+       {\r
+               pChannel_->load(0, GetPreparedTemplate(titleName));\r
+               pChannel_->play(0);\r
+\r
+               CASPAR_LOG(info) << L"Displayed title " << titleName ;\r
+       }\r
+       catch(caspar_exception&)\r
+       {\r
+               CASPAR_LOG(error) << L"Failed to display title " << titleName;\r
+       }\r
+}\r
+\r
+void CIIProtocolStrategy::DisplayMediaFile(const std::wstring& filename) \r
+{\r
+       transition_info transition;\r
+       transition.type = transition_type::mix;\r
+       transition.duration = 12;\r
+\r
+       auto pFP = load_media(boost::assign::list_of(filename), pChannel_->frame_format_desc());\r
+       auto pTransition = std::make_shared<transition_producer>(pFP, transition, pChannel_->frame_format_desc());\r
+\r
+       try\r
+       {\r
+               pChannel_->load(0, pTransition);\r
+       }\r
+       catch(...)\r
+       {\r
+               CASPAR_LOG_CURRENT_EXCEPTION();\r
+               CASPAR_LOG(error) << L"Failed to display " << filename ;\r
+               return;\r
+       }\r
+\r
+       pChannel_->play(0);\r
+\r
+       CASPAR_LOG(info) << L"Displayed " << filename;\r
+}\r
+\r
+frame_producer_ptr CIIProtocolStrategy::GetPreparedTemplate(const std::wstring& titleName)\r
+{\r
+       frame_producer_ptr result;\r
+\r
+       TitleList::iterator it = std::find(titles_.begin(), titles_.end(), titleName);\r
+       if(it != titles_.end()) {\r
+               CASPAR_LOG(debug) << L"Found title with name " << it->titleName;\r
+               result = (*it).pframe_producer;\r
+       }\r
+       else \r
+               CASPAR_LOG(error) << L"Could not find title with name " << titleName;\r
+\r
+       return result;\r
+}\r
+\r
+void CIIProtocolStrategy::PutPreparedTemplate(const std::wstring& titleName, frame_producer_ptr& pFP)\r
+{\r
+       CASPAR_LOG(debug) << L"Saved title with name " << titleName;\r
+\r
+       TitleList::iterator it = std::find(titles_.begin(), titles_.end(), titleName);\r
+       if(it != titles_.end()) {\r
+               titles_.remove((*it));\r
+       }\r
+\r
+       titles_.push_front(TitleHolder(titleName, pFP));\r
+\r
+       if(titles_.size() >= 6)\r
+               titles_.resize(5);\r
+}\r
+\r
+bool operator==(const CIIProtocolStrategy::TitleHolder& lhs, const std::wstring& rhs) \r
+{\r
+       return lhs.titleName == rhs;\r
+}\r
+\r
+bool operator==(const std::wstring& lhs, const CIIProtocolStrategy::TitleHolder& rhs)\r
+{\r
+       return lhs == rhs.titleName;\r
+}\r
+\r
+}}\r
diff --git a/core/protocol/cii/CIIProtocolStrategy.h b/core/protocol/cii/CIIProtocolStrategy.h
new file mode 100644 (file)
index 0000000..860340d
--- /dev/null
@@ -0,0 +1,88 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#pragma once\r
+\r
+#include "../../../common/io/ProtocolStrategy.h"\r
+#include "CIICommand.h"\r
+#include "../../consumer/frame_consumer.h"\r
+#include "../../../common/concurrency/executor.h"\r
+#include "../../renderer/render_device.h"\r
+\r
+namespace caspar { namespace cii {\r
+\r
+class CIIProtocolStrategy : public caspar::IO::IProtocolStrategy\r
+{\r
+public:\r
+       CIIProtocolStrategy(const std::vector<renderer::render_device_ptr>& channels);\r
+\r
+       void Parse(const TCHAR* pData, int charCount, caspar::IO::ClientInfoPtr pClientInfo);\r
+       UINT GetCodepage() {return 28591;}      //ISO 8859-1\r
+\r
+       void SetProfile(const std::wstring& profile) {currentProfile_ = profile;}\r
+\r
+       renderer::render_device_ptr GetChannel() const{return this->pChannel_;}\r
+\r
+       void DisplayMediaFile(const std::wstring& filename);\r
+       void DisplayTemplate(const std::wstring& titleName);\r
+       void WriteTemplateData(const std::wstring& templateName, const std::wstring& titleName, const std::wstring& xmlData);\r
+\r
+public:\r
+       struct TitleHolder\r
+       {\r
+               TitleHolder() : titleName(TEXT(""))     {}\r
+               TitleHolder(const std::wstring& name, frame_producer_ptr pFP) : titleName(name), pframe_producer(pFP) {}\r
+               TitleHolder(const TitleHolder& th) : titleName(th.titleName), pframe_producer(th.pframe_producer) {}\r
+               const TitleHolder& operator=(const TitleHolder& th) \r
+               {\r
+                       titleName = th.titleName;\r
+                       pframe_producer = th.pframe_producer;\r
+               }\r
+               bool operator==(const TitleHolder& rhs) \r
+               {\r
+                       return pframe_producer == rhs.pframe_producer;\r
+               }\r
+\r
+               std::wstring titleName;\r
+               frame_producer_ptr pframe_producer;\r
+               friend CIIProtocolStrategy;\r
+       };\r
+private:\r
+\r
+       typedef std::list<TitleHolder> TitleList;\r
+       TitleList titles_;\r
+       frame_producer_ptr GetPreparedTemplate(const std::wstring& name);\r
+       void PutPreparedTemplate(const std::wstring& name, frame_producer_ptr& pframe_producer);\r
+\r
+       static const TCHAR TokenDelimiter;\r
+       static const std::wstring MessageDelimiter;\r
+\r
+       void ProcessMessage(const std::wstring& message);\r
+       int TokenizeMessage(const std::wstring& message, std::vector<std::wstring>* pTokenVector);\r
+       CIICommandPtr Create(const std::wstring& name);\r
+\r
+       common::executor executor_;\r
+       std::wstring currentMessage_;\r
+\r
+       std::wstring currentProfile_;\r
+       renderer::render_device_ptr pChannel_;\r
+};\r
+\r
+}}
\ No newline at end of file
diff --git a/core/protocol/clk/CLKCommand.cpp b/core/protocol/clk/CLKCommand.cpp
new file mode 100644 (file)
index 0000000..315b0b6
--- /dev/null
@@ -0,0 +1,94 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "..\..\stdafx.h"\r
+#include <algorithm>\r
+#include <locale>\r
+#include "CLKCommand.h"\r
+\r
+namespace caspar { namespace CLK {\r
+\r
+CLKCommand::CLKCommand() : clockID_(0), command_(CLKInvalidCommand) {}\r
+\r
+CLKCommand::~CLKCommand() {}\r
+\r
+const std::wstring& CLKCommand::GetData() \r
+{\r
+       std::wstringstream dataStream;\r
+\r
+       dataStream << TEXT("<templateData>");   \r
+       dataStream << TEXT("<componentData id=\"command\">");\r
+       dataStream << TEXT("<command id=\"") << commandString_ << TEXT("\" time=\"") << time_ << TEXT("\" clockID=\"") << clockID_ << TEXT("\">");\r
+\r
+       std::vector<std::wstring>::const_iterator it = parameters_.begin();\r
+       std::vector<std::wstring>::const_iterator end = parameters_.end();\r
+       for(; it != end; ++it) {\r
+               dataStream << TEXT("<parameter>") << (*it) << TEXT("</parameter>"); \r
+       }\r
+\r
+       dataStream << TEXT("</command>"); \r
+       dataStream << TEXT("</componentData>"); \r
+       dataStream << TEXT("</templateData>");\r
+\r
+       dataCache_ = dataStream.str();\r
+       return dataCache_;\r
+}\r
+\r
+bool CLKCommand::SetCommand() \r
+{\r
+       bool bResult = true;\r
+       std::transform(commandString_.begin(), commandString_.end(), commandString_.begin(), toupper);\r
+\r
+       if(commandString_ == TEXT("DUR"))\r
+               command_ = CLKDuration;\r
+       else if(commandString_ == TEXT("NEWDUR"))\r
+               command_ = CLKNewDuration;\r
+       else if(commandString_ == TEXT("NEXTEVENT"))\r
+               command_ = CLKNextEvent;\r
+       else if(commandString_ == TEXT("STOP"))\r
+               command_ = CLKStop;\r
+       else if(commandString_ == TEXT("UNTIL"))\r
+               command_ = CLKUntil;\r
+       else if(commandString_ == TEXT("ADD"))\r
+               command_ = CLKAdd;\r
+       else if(commandString_ == TEXT("SUB"))\r
+               command_ = CLKSub;\r
+       else if(commandString_ == TEXT("RESET"))\r
+               command_ = CLKReset;\r
+       else \r
+       {\r
+               command_ = CLKInvalidCommand;\r
+               bResult = false;\r
+       }\r
+\r
+       return bResult;\r
+}\r
+\r
+void CLKCommand::Clear() \r
+{\r
+       dataCache_.clear();\r
+       commandString_.clear();\r
+       time_.clear();\r
+       command_ = CLKDuration;\r
+       clockID_ = 0;\r
+       parameters_.clear();\r
+}\r
+\r
+}}
\ No newline at end of file
diff --git a/core/protocol/clk/CLKCommand.h b/core/protocol/clk/CLKCommand.h
new file mode 100644 (file)
index 0000000..79d5859
--- /dev/null
@@ -0,0 +1,61 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#pragma once\r
+\r
+namespace caspar{ namespace CLK {\r
+\r
+class CLKCommand\r
+{\r
+public:\r
+       enum CLKCommands \r
+       {\r
+               CLKDuration,\r
+               CLKNewDuration,\r
+               CLKNextEvent,\r
+               CLKStop,\r
+               CLKUntil,\r
+               CLKAdd,\r
+               CLKSub,\r
+               CLKReset,\r
+               CLKInvalidCommand\r
+       };\r
+\r
+       CLKCommand();\r
+       virtual ~CLKCommand();\r
+\r
+       bool SetCommand();\r
+       bool NeedsTime() const \r
+       {\r
+               return !(command_ == CLKNextEvent || command_ == CLKStop);\r
+       }\r
+\r
+       void Clear();\r
+       const std::wstring& GetData();\r
+\r
+       std::wstring dataCache_;\r
+       std::wstring commandString_;\r
+       CLKCommands command_;\r
+       int clockID_;\r
+       std::wstring time_;\r
+       std::vector<std::wstring> parameters_;\r
+};\r
+\r
+}}
\ No newline at end of file
diff --git a/core/protocol/clk/CLKProtocolStrategy.cpp b/core/protocol/clk/CLKProtocolStrategy.cpp
new file mode 100644 (file)
index 0000000..2166209
--- /dev/null
@@ -0,0 +1,151 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "..\..\StdAfx.h"\r
+\r
+#include "CLKProtocolStrategy.h"\r
+\r
+#include "..\..\producer\flash\cg_producer.h"\r
+#include "..\..\renderer\render_device.h"\r
+\r
+#include <string>\r
+#include <sstream>\r
+#include <algorithm>\r
+\r
+namespace caspar { namespace CLK {\r
+\r
+using namespace common;\r
+\r
+CLKProtocolStrategy::CLKProtocolStrategy(const std::vector<renderer::render_device_ptr>& channels) \r
+       : currentState_(ExpectingNewCommand), bClockLoaded_(false) \r
+{      \r
+       if(channels.empty())\r
+               BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("channels"));\r
+       pChannel_ = channels[0];\r
+}\r
+\r
+void CLKProtocolStrategy::Parse(const TCHAR* pData, int charCount, caspar::IO::ClientInfoPtr pClientInfo) \r
+{\r
+       for(int index = 0; index < charCount; ++index) \r
+       {\r
+               if(currentState_ == ExpectingNewCommand)\r
+                       currentCommandString_.str(TEXT(""));\r
+\r
+               TCHAR currentByte = pData[index];\r
+               if(currentByte < 32)\r
+                       currentCommandString_ << TEXT("<") << (int)currentByte << TEXT(">");\r
+               else\r
+                       currentCommandString_ << currentByte;\r
+\r
+               if(currentByte != 0)\r
+               {\r
+                       switch(currentState_)\r
+                       {\r
+                               case ExpectingNewCommand:\r
+                                       if(currentByte == 1) \r
+                                               currentState_ = ExpectingCommand;                                       \r
+                                       //just throw anything else away\r
+                                       break;\r
+\r
+                               case ExpectingCommand:\r
+                                       if(currentByte == 2) \r
+                                       {\r
+                                               if(!currentCommand_.SetCommand()) \r
+                                               {\r
+                                                       CASPAR_LOG(error) << "CLK: Failed to interpret command";\r
+                                                       currentState_ = ExpectingNewCommand;\r
+                                                       currentCommand_.Clear();\r
+                                               }\r
+                                               else \r
+                                                       currentState_ = ExpectingClockID;                                               \r
+                                       }\r
+                                       else\r
+                                               currentCommand_.commandString_ += currentByte;\r
+                                       break;\r
+\r
+                               case ExpectingClockID:\r
+                                       if(currentByte == 2)\r
+                                               currentState_ = currentCommand_.NeedsTime() ? ExpectingTime : ExpectingParameter;\r
+                                       else\r
+                                               currentCommand_.clockID_ = currentByte - TCHAR('0');\r
+                                       break;\r
+\r
+                               case ExpectingTime:\r
+                                       if(currentByte == 2)\r
+                                               currentState_ = ExpectingParameter;\r
+                                       else\r
+                                               currentCommand_.time_ += currentByte;\r
+                                       break;\r
+\r
+                               case ExpectingParameter:\r
+                                       //allocate new parameter\r
+                                       if(currentCommand_.parameters_.size() == 0 || currentByte == 2)\r
+                                               currentCommand_.parameters_.push_back(std::wstring());\r
+\r
+                                       //add the character to end end of the last parameter\r
+                                       if(currentByte == TEXT('<'))\r
+                                               currentCommand_.parameters_[currentCommand_.parameters_.size()-1] += TEXT("&lt;");\r
+                                       else if(currentByte == TEXT('>'))\r
+                                               currentCommand_.parameters_[currentCommand_.parameters_.size()-1] += TEXT("&gt;");\r
+                                       else if(currentByte == TEXT('\"'))\r
+                                               currentCommand_.parameters_[currentCommand_.parameters_.size()-1] += TEXT("&quot;");\r
+                                       else\r
+                                               currentCommand_.parameters_[currentCommand_.parameters_.size()-1] += currentByte;\r
+\r
+                                       break;\r
+                       }\r
+               }\r
+               else \r
+               {\r
+                       if(currentState_ == ExpectingCommand)\r
+                       {\r
+                               if(!currentCommand_.SetCommand())\r
+                                       CASPAR_LOG(error) << "CLK: Failed to interpret command";\r
+                       }\r
+\r
+                       if(currentCommand_.command_ == CLKCommand::CLKReset) \r
+                       {\r
+                               flash::get_default_cg_producer(pChannel_)->clear();\r
+                               bClockLoaded_ = false;\r
+                               \r
+                               CASPAR_LOG(info) << L"CLK: Recieved and executed reset-command";\r
+                       }\r
+                       else if(currentCommand_.command_ != CLKCommand::CLKInvalidCommand)\r
+                       {\r
+                               if(!bClockLoaded_) \r
+                               {\r
+                                       flash::get_default_cg_producer(pChannel_)->add(0, TEXT("hawrysklocka/clock"), true, TEXT(""), currentCommand_.GetData());\r
+                                       bClockLoaded_ = true;\r
+                               }\r
+                               else \r
+                                       flash::get_default_cg_producer(pChannel_)->update(0, currentCommand_.GetData());\r
+                               \r
+                               CASPAR_LOG(debug) << L"CLK: Clockdata sent: " << currentCommand_.GetData();\r
+                               CASPAR_LOG(debug) << L"CLK: Executed valid command: " << currentCommandString_.str();\r
+                       }\r
+\r
+                       currentState_ = ExpectingNewCommand;\r
+                       currentCommand_.Clear();\r
+               }\r
+       }\r
+}\r
+\r
+}      //namespace CLK\r
+}      //namespace caspar
\ No newline at end of file
diff --git a/core/protocol/clk/CLKProtocolStrategy.h b/core/protocol/clk/CLKProtocolStrategy.h
new file mode 100644 (file)
index 0000000..1a6d514
--- /dev/null
@@ -0,0 +1,56 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#pragma once\r
+\r
+#include "CLKCommand.h"\r
+#include "../../../common/io/ProtocolStrategy.h"\r
+#include "../../renderer/render_device.h"\r
+\r
+namespace caspar { namespace CLK {\r
+\r
+class CLKProtocolStrategy : public caspar::IO::IProtocolStrategy\r
+{\r
+public:\r
+       CLKProtocolStrategy(const std::vector<renderer::render_device_ptr>& channels);\r
+\r
+       void Parse(const TCHAR* pData, int charCount, caspar::IO::ClientInfoPtr pClientInfo);\r
+       UINT GetCodepage() { return 28591; }    //ISO 8859-1\r
+       \r
+private:\r
+       enum ParserState\r
+       {\r
+               ExpectingNewCommand,\r
+               ExpectingCommand,\r
+               ExpectingClockID,\r
+               ExpectingTime,\r
+               ExpectingParameter\r
+       };\r
+\r
+       ParserState     currentState_;\r
+       CLKCommand currentCommand_;\r
+       std::wstringstream currentCommandString_;\r
+\r
+       renderer::render_device_ptr pChannel_;\r
+\r
+       bool bClockLoaded_;\r
+};\r
+\r
+}}\r
diff --git a/core/protocol/media.cpp b/core/protocol/media.cpp
new file mode 100644 (file)
index 0000000..0a4a892
--- /dev/null
@@ -0,0 +1,53 @@
+#include "../StdAfx.h"\r
+\r
+#include "media.h"\r
+\r
+#include "../producer/color/color_producer.h"\r
+#include "../producer/ffmpeg/ffmpeg_producer.h"\r
+#include "../producer/flash/flash_producer.h"\r
+#include "../producer/flash/ct_producer.h"\r
+#include "../producer/image/image_producer.h"\r
+#include "../producer/image/image_scroll_producer.h"\r
+\r
+#include "../../common/exception/exceptions.h"\r
+\r
+#include <boost/assign.hpp>\r
+#include <boost/filesystem.hpp>\r
+\r
+using namespace boost::assign;\r
+\r
+namespace caspar { \r
+       \r
+frame_producer_ptr load_media(const std::vector<std::wstring>& params, const frame_format_desc& format_desc)\r
+{              \r
+       typedef std::function<frame_producer_ptr(const std::vector<std::wstring>&, const frame_format_desc&)> ProducerFactory;\r
+\r
+       const auto producerFactories = list_of<ProducerFactory>\r
+               (&flash::create_flash_producer)\r
+               (&flash::create_ct_producer)\r
+               (&caspar::image::create_image_producer)\r
+               (&caspar::image::create_image_scroll_producer)\r
+               (&ffmpeg::create_ffmpeg_producer)\r
+               (&create_color_producer);\r
+\r
+       if(params.empty())\r
+               BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("params") << arg_value_info(""));\r
+\r
+       frame_producer_ptr pProducer;\r
+       std::any_of(producerFactories.begin(), producerFactories.end(), [&](const ProducerFactory& producerFactory) -> bool\r
+               {\r
+                       try\r
+                       {\r
+                               pProducer = producerFactory(params, format_desc);\r
+                       }\r
+                       catch(...)\r
+                       {\r
+                               CASPAR_LOG_CURRENT_EXCEPTION();\r
+                       }\r
+                       return pProducer != nullptr;\r
+               });\r
+\r
+       return pProducer;\r
+}\r
+\r
+}\r
diff --git a/core/protocol/media.h b/core/protocol/media.h
new file mode 100644 (file)
index 0000000..8b6e292
--- /dev/null
@@ -0,0 +1,13 @@
+#pragma once\r
+\r
+#include "../frame/frame_fwd.h"\r
+#include "../producer/frame_producer.h"\r
+\r
+#include <string>\r
+#include <vector>\r
+\r
+namespace caspar { \r
+       \r
+frame_producer_ptr load_media(const std::vector<std::wstring>& params, const frame_format_desc& format_desc);\r
+\r
+}\r
diff --git a/core/protocol/monitor/Monitor.cpp b/core/protocol/monitor/Monitor.cpp
new file mode 100644 (file)
index 0000000..7be14e6
--- /dev/null
@@ -0,0 +1,182 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
\r
+#include "..\..\stdAfx.h"\r
+\r
+#if defined(_MSC_VER)\r
+#pragma warning (push, 1) // marked as __forceinline not inlined\r
+#endif\r
+\r
+#include "Monitor.h"\r
+#include "..\..\..\common\io\AsyncEventServer.h"\r
+#include "..\..\..\common\concurrency\function_task.h"\r
+\r
+namespace caspar {\r
+\r
+using namespace std;\r
+\r
+const int Monitor::ResponseCodeNoParam = 102;\r
+const int Monitor::ResponseCodeWithParam = 101;\r
+\r
+Monitor::MonitorList Monitor::monitors_;\r
+\r
+Monitor::Monitor(int channelIndex) : channelIndex_(channelIndex) \r
+{\r
+       monitors_.push_back(this);\r
+}\r
+\r
+Monitor::~Monitor() \r
+{\r
+       monitors_.remove(this);\r
+}\r
+\r
+void Monitor::ClearListener(const caspar::IO::ClientInfoPtr& pClient)\r
+{\r
+       std::for_each(monitors_.begin(), monitors_.end(), std::bind(&Monitor::RemoveListener, std::placeholders::_1, pClient));\r
+}\r
+\r
+void Monitor::Inform(MonitorEventType type, const std::wstring& parameter, MonitorParameterFormatter formatter) \r
+{\r
+       common::function_task::enqueue(std::bind(&Monitor::internal_Inform, this, type, parameter, formatter));\r
+}\r
+\r
+void Monitor::internal_Inform(MonitorEventType type, const std::wstring parameter, MonitorParameterFormatter formatter)\r
+{\r
+       //lock the list and make a local copy\r
+       ListenerList localListeners;\r
+       {\r
+               tbb::mutex::scoped_lock lock(mutex_);\r
+               localListeners = listeners_;\r
+       }\r
+\r
+       if(localListeners.empty())\r
+               return;\r
+\r
+       std::wstringstream msg;\r
+       int code = ResponseCodeNoParam;\r
+       if(!parameter.empty())\r
+               code = ResponseCodeWithParam;\r
+\r
+       msg << code << TEXT(' ');\r
+\r
+       FormatInfo(msg, type);\r
+\r
+       if(!parameter.empty()) \r
+       {\r
+               if(formatter)\r
+                       msg << formatter(parameter) << TEXT("\r\n");\r
+               else\r
+                       msg << parameter << TEXT("\r\n");\r
+       }\r
+\r
+       std::wstring message(msg.str());\r
+\r
+       std::for_each(localListeners.begin(), localListeners.end(), std::bind(&IO::ClientInfo::Send, std::placeholders::_1, message));\r
+       CASPAR_LOG(debug) << "Monitor:" << msg;\r
+}\r
+\r
+void Monitor::FormatInfo(std::wstringstream& msg, MonitorEventType type) \r
+{\r
+       switch(type) \r
+       {\r
+       case LOADBG:\r
+               msg << TEXT("LOADBG");\r
+               break;\r
+       case LOAD:\r
+               msg << TEXT("LOAD");\r
+               break;\r
+       case PLAY:\r
+               msg << TEXT("PLAY");\r
+               break;\r
+       case STOPPED:\r
+               msg << TEXT("STOP");\r
+               break;\r
+       case CLEAR:\r
+               msg << TEXT("CLEAR");\r
+               break;\r
+\r
+       case CG_ADD:\r
+       case CG_CLEAR:\r
+       case CG_PLAY:\r
+       case CG_STOP:\r
+       case CG_NEXT:\r
+       case CG_REMOVE:\r
+       case CG_UPDATE:\r
+       case CG_INVOKE:\r
+               msg << TEXT("CG");\r
+               break;\r
+\r
+       default:\r
+               break;\r
+       }\r
+\r
+       if(channelIndex_ > 0)\r
+               msg << TEXT(' ') << channelIndex_;\r
+\r
+       switch(type)\r
+       {\r
+       case CG_ADD:\r
+               msg << TEXT(" ADD");\r
+               break;\r
+       case CG_CLEAR:\r
+               msg << TEXT(" CLEAR");\r
+               break;\r
+       case CG_PLAY:\r
+               msg << TEXT(" PLAY");\r
+               break;\r
+       case CG_STOP:\r
+               msg << TEXT(" STOP");\r
+               break;\r
+       case CG_NEXT:\r
+               msg << TEXT(" NEXT");\r
+               break;\r
+       case CG_REMOVE:\r
+               msg << TEXT(" REMOVE");\r
+               break;\r
+       case CG_UPDATE:\r
+               msg << TEXT(" UPDATE");\r
+               break;\r
+       case CG_INVOKE:\r
+               msg << TEXT(" INVOKE");\r
+               break;\r
+       default:\r
+               break;\r
+       }\r
+       msg << TEXT("\r\n");\r
+}\r
+\r
+void Monitor::AddListener(caspar::IO::ClientInfoPtr& pClient) \r
+{\r
+       tbb::mutex::scoped_lock lock(mutex_);\r
+       ListenerList::iterator it = std::find(listeners_.begin(), listeners_.end(), pClient);\r
+       if(it == listeners_.end()) \r
+       {\r
+               CASPAR_LOG(debug) << "Added a client as listener";\r
+               listeners_.push_back(pClient);\r
+       }\r
+}\r
+\r
+void Monitor::RemoveListener(const caspar::IO::ClientInfoPtr& pClient) \r
+{\r
+       tbb::mutex::scoped_lock lock(mutex_);\r
+       listeners_.remove(pClient);\r
+}\r
+\r
+}      //namespace caspar
\ No newline at end of file
diff --git a/core/protocol/monitor/Monitor.h b/core/protocol/monitor/Monitor.h
new file mode 100644 (file)
index 0000000..146d118
--- /dev/null
@@ -0,0 +1,78 @@
+/*\r
+* copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
+*\r
+*  This file is part of CasparCG.\r
+*\r
+*    CasparCG is free software: you can redistribute it and/or modify\r
+*    it under the terms of the GNU General Public License as published by\r
+*    the Free Software Foundation, either version 3 of the License, or\r
+*    (at your option) any later version.\r
+*\r
+*    CasparCG is distributed in the hope that it will be useful,\r
+*    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+*    GNU General Public License for more details.\r
+\r
+*    You should have received a copy of the GNU General Public License\r
+*    along with CasparCG.  If not, see <http://www.gnu.org/licenses/>.\r
+*\r
+*/\r
+#pragma once\r
+\r
+#include "../../../common/io/ClientInfo.h"\r
+#include <tbb/mutex.h>\r
+\r
+namespace caspar {\r
+\r
+typedef std::function<std::wstring(const std::wstring&)> MonitorParameterFormatter;\r
+\r
+enum MonitorEventType\r
+{\r
+       LOADBG,\r
+       LOAD,\r
+       PLAY,\r
+       STOPPED,\r
+       CLEAR,\r
+\r
+       CG_ADD,\r
+       CG_CLEAR,\r
+       CG_PLAY,\r
+       CG_STOP,\r
+       CG_NEXT,\r
+       CG_REMOVE,\r
+       CG_UPDATE,\r
+       CG_INVOKE\r
+};\r
+\r
+class Monitor : boost::noncopyable\r
+{\r
+public:\r
+       static const int ResponseCodeNoParam;\r
+       static const int ResponseCodeWithParam;\r
+\r
+       //removes the client from all monitors\r
+       static void ClearListener(const caspar::IO::ClientInfoPtr& pClient);\r
+\r
+       explicit Monitor(int channelIndex);\r
+       virtual ~Monitor();\r
+\r
+       void Inform(MonitorEventType type, const std::wstring& parameter = TEXT(""), MonitorParameterFormatter formatter = 0);\r
+\r
+       void AddListener(caspar::IO::ClientInfoPtr& pClient);\r
+       void RemoveListener(const caspar::IO::ClientInfoPtr& pClient);\r
+\r
+private:\r
+       void internal_Inform(MonitorEventType type, const std::wstring parameter, MonitorParameterFormatter formatter);\r
+\r
+       void FormatInfo(std::wstringstream& sstream, MonitorEventType type);\r
+\r
+       int channelIndex_;\r
+       typedef std::list<caspar::IO::ClientInfoPtr> ListenerList;\r
+       typedef std::list<Monitor*> MonitorList;\r
+\r
+       ListenerList listeners_;\r
+       static MonitorList monitors_;\r
+       tbb::mutex mutex_;\r
+};\r
+\r
+}
\ No newline at end of file
diff --git a/core/renderer/layer.cpp b/core/renderer/layer.cpp
new file mode 100644 (file)
index 0000000..ab5b36f
--- /dev/null
@@ -0,0 +1,113 @@
+#include "../stdafx.h"\r
+\r
+#include "layer.h"\r
+\r
+#include "../producer/frame_producer.h"\r
+\r
+#include "../frame/system_frame.h"\r
+#include "../frame/frame_format.h"\r
+\r
+namespace caspar { namespace renderer {\r
+\r
+struct layer::implementation\r
+{              \r
+       implementation() : preview_frame_(nullptr), active_(nullptr), background_(nullptr) {}\r
+       \r
+       void load(const frame_producer_ptr& frame_producer, load_option option)\r
+       {\r
+               if(frame_producer == nullptr) \r
+                       BOOST_THROW_EXCEPTION(null_argument() << arg_name_info("frame_producer"));\r
+                       \r
+               if(option == load_option::preview)              \r
+               {\r
+                       preview_frame_ = frame_producer->get_frame();\r
+                       if(preview_frame_ != nullptr)\r
+                               preview_frame_->audio_data().clear(); // No audio\r
+                       active_ = nullptr;      \r
+                       background_ = frame_producer;\r
+               }\r
+               else if(option == load_option::auto_play)\r
+               {\r
+                       background_ = frame_producer;\r
+                       play();         \r
+               }\r
+               else\r
+                       background_ = frame_producer;\r
+       }\r
+       \r
+       void play()\r
+       {                       \r
+               if(background_ == nullptr)\r
+                       BOOST_THROW_EXCEPTION(invalid_operation() << msg_info("No background clip to play."));\r
+\r
+               background_->set_leading_producer(active_);\r
+               active_ = background_;\r
+               background_ = nullptr;\r
+               preview_frame_ = nullptr;\r
+       }\r
+\r
+       void stop()\r
+       {\r
+               active_ = nullptr;\r
+               preview_frame_ = nullptr;\r
+       }\r
+\r
+       void clear()\r
+       {\r
+               active_ = nullptr;\r
+               background_ = nullptr;\r
+       }\r
+       \r
+       frame_ptr get_frame()\r
+       {               \r
+               if(!active_)\r
+                       return preview_frame_;\r
+\r
+               frame_ptr frame;\r
+               try\r
+               {\r
+                       frame = active_->get_frame();\r
+               }\r
+               catch(...)\r
+               {\r
+                       CASPAR_LOG_CURRENT_EXCEPTION();\r
+                       active_ = nullptr;\r
+                       CASPAR_LOG(warning) << "Removed producer from layer.";\r
+               }\r
+\r
+               if(frame == nullptr)\r
+               {\r
+                       active_ = active_->get_following_producer();\r
+                       frame = get_frame();\r
+               }\r
+               return frame;\r
+       }       \r
+                       \r
+       frame_ptr preview_frame_;\r
+       frame_producer_ptr active_;\r
+       frame_producer_ptr background_;\r
+};\r
+\r
+layer::layer() : impl_(new implementation()){}\r
+layer::layer(layer&& other) : impl_(std::move(other.impl_)){other.impl_ = nullptr;}\r
+layer::layer(const layer& other) : impl_(new implementation(*other.impl_)) {}\r
+layer& layer::operator=(layer&& other)\r
+{\r
+       impl_ = std::move(other.impl_); \r
+       other.impl_ = nullptr;\r
+       return *this;\r
+}\r
+layer& layer::operator=(const layer& other)\r
+{\r
+       layer temp(other);\r
+       impl_.swap(temp.impl_);\r
+       return *this;\r
+}\r
+void layer::load(const frame_producer_ptr& frame_producer, load_option option){return impl_->load(frame_producer, option);}    \r
+void layer::play(){impl_->play();}\r
+void layer::stop(){impl_->stop();}\r
+void layer::clear(){impl_->clear();}\r
+frame_ptr layer::get_frame() {return impl_->get_frame();}\r
+frame_producer_ptr layer::active() const { return impl_->active_;}\r
+frame_producer_ptr layer::background() const { return impl_->background_;}\r
+}}
\ No newline at end of file
diff --git a/core/renderer/layer.h b/core/renderer/layer.h
new file mode 100644 (file)
index 0000000..a770cef
--- /dev/null
@@ -0,0 +1,39 @@
+#pragma once\r
+\r
+#include "../producer/frame_producer.h"\r
+\r
+namespace caspar { namespace renderer {\r
+\r
+enum load_option\r
+{\r
+       none,\r
+       preview,\r
+       auto_play\r
+};\r
+                       \r
+class layer\r
+{\r
+public:\r
+       layer();\r
+       layer(layer&& other);\r
+       layer(const layer& other);\r
+       layer& operator=(layer&& other);\r
+       layer& operator=(const layer& other);\r
+\r
+       void load(const frame_producer_ptr& pProducer, load_option option);     \r
+       void play();\r
+       void stop();\r
+       void clear();\r
+               \r
+       frame_producer_ptr active() const;\r
+       frame_producer_ptr background() const;\r
+\r
+       frame_ptr get_frame();\r
+private:\r
+       struct implementation;\r
+       std::shared_ptr<implementation> impl_;\r
+};\r
+typedef std::shared_ptr<layer> layer_ptr;\r
+typedef std::unique_ptr<layer> layer_uptr;\r
+\r
+}}
\ No newline at end of file
diff --git a/core/renderer/render_device.cpp b/core/renderer/render_device.cpp
new file mode 100644 (file)
index 0000000..dcecc61
--- /dev/null
@@ -0,0 +1,243 @@
+#include "..\StdAfx.h"\r
+\r
+#include "render_device.h"\r
+#include "layer.h"\r
+\r
+#include "../protocol/monitor/Monitor.h"\r
+#include "../consumer/frame_consumer.h"\r
+\r
+#include "../frame/system_frame.h"\r
+#include "../frame/frame_format.h"\r
+\r
+#include "../../common/utility/scope_exit.h"\r
+#include "../../common/image/image.h"\r
+\r
+#include <numeric>\r
+\r
+#include <boost/filesystem.hpp>\r
+#include <boost/thread.hpp>\r
+#include <boost/date_time/posix_time/posix_time.hpp>\r
+#include <boost/range/algorithm.hpp>\r
+#include <boost/range/algorithm_ext/erase.hpp>\r
+#include <boost/range/sub_range.hpp>\r
+#include <boost/range/adaptor/indirected.hpp>\r
+#include <boost/foreach.hpp>\r
+\r
+#include <tbb/parallel_for.h>\r
+#include <tbb/mutex.h>\r
+\r
+using namespace boost::assign;\r
+       \r
+namespace caspar{ namespace renderer{\r
+       \r
+std::vector<frame_ptr> render_frames(std::map<int, layer>& layers)\r
+{      \r
+       std::vector<frame_ptr> frames(layers.size(), nullptr);\r
+       tbb::parallel_for(tbb::blocked_range<size_t>(0, frames.size()), [&](const tbb::blocked_range<size_t>& r)\r
+       {\r
+               auto it = layers.begin();\r
+               std::advance(it, r.begin());\r
+               for(size_t i = r.begin(); i != r.end(); ++i, ++it)\r
+                       frames[i] = it->second.get_frame();\r
+       });                                     \r
+       boost::range::remove_erase(frames, nullptr);\r
+       boost::range::remove_erase_if(frames, [](const frame_const_ptr& frame) { return *frame == *frame::null();});\r
+       return frames;\r
+}\r
+\r
+struct render_device::implementation : boost::noncopyable\r
+{      \r
+       implementation(const caspar::frame_format_desc& format_desc, unsigned int index, const std::vector<frame_consumer_ptr>& consumers)  \r
+               : consumers_(consumers), monitor_(index), fmt_(format_desc)\r
+       {       \r
+               is_running_ = true;\r
+               if(consumers.empty())\r
+                       BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("consumer") \r
+                                                                                                               << msg_info("render_device requires atleast one consumer"));\r
+\r
+               if(std::any_of(consumers.begin(), consumers.end(), [&](const frame_consumer_ptr& pConsumer){ return pConsumer->get_frame_format_desc() != format_desc;}))\r
+                       BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("consumer") \r
+                                                                                                               << msg_info("All consumers must have same frameformat as renderdevice."));\r
+               \r
+               frame_buffer_.set_capacity(3);\r
+               display_thread_ = boost::thread([=]{display();});\r
+               render_thread_ = boost::thread([=]{render();});\r
+\r
+               CASPAR_LOG(info) << L"Initialized render_device with " << format_desc;\r
+       }\r
+                       \r
+       ~implementation()\r
+       {\r
+               is_running_ = false;\r
+               frame_buffer_.clear();\r
+               frame_buffer_.push(nullptr);\r
+               render_thread_.join();\r
+               display_thread_.join();\r
+       }\r
+               \r
+       void render()\r
+       {               \r
+               CASPAR_LOG(info) << L"Started render_device::render Thread";\r
+               win32_exception::install_handler();\r
+               \r
+               std::vector<frame_ptr> current_frames;\r
+\r
+               while(is_running_)\r
+               {\r
+                       try\r
+                       {       \r
+                               std::vector<frame_ptr> next_frames;\r
+                               frame_ptr composite_frame;              \r
+\r
+                               {\r
+                                       tbb::mutex::scoped_lock lock(layers_mutex_);    \r
+                                       tbb::parallel_invoke(\r
+                                               [&]{next_frames = render_frames(layers_);}, \r
+                                               [&]{composite_frame = compose_frames(current_frames.empty() ? std::make_shared<system_frame>(fmt_.size) : current_frames[0], current_frames);});\r
+                               }\r
+\r
+                               current_frames = std::move(next_frames);                \r
+                               frame_buffer_.push(std::move(composite_frame));\r
+                       }\r
+                       catch(...)\r
+                       {\r
+                               CASPAR_LOG_CURRENT_EXCEPTION();\r
+                               layers_.clear();\r
+                               CASPAR_LOG(error) << "Unexpected exception. Cleared layers in render-device";\r
+                       }\r
+               }\r
+\r
+               CASPAR_LOG(info) << L"Ended render_device::render Thread";\r
+       }\r
+       \r
+       void display()\r
+       {\r
+               CASPAR_LOG(info) << L"Started render_device::display Thread";\r
+               win32_exception::install_handler();\r
+                               \r
+               frame_ptr frame = clear_frame(std::make_shared<system_frame>(fmt_.size));\r
+               std::deque<frame_ptr> prepared(3, frame);\r
+                               \r
+               while(is_running_)\r
+               {\r
+                       if(!frame_buffer_.try_pop(frame))\r
+                       {\r
+                               CASPAR_LOG(trace) << "Display Buffer Underrun";\r
+                               frame_buffer_.pop(frame);\r
+                       }\r
+                       if(frame != nullptr)\r
+                       {\r
+                               send_frame(prepared.front(), frame);\r
+                               prepared.push_back(frame);\r
+                               prepared.pop_front();\r
+                       }\r
+               }\r
+               \r
+               CASPAR_LOG(info) << L"Ended render_device::display Thread";\r
+       }\r
+\r
+       void send_frame(const frame_ptr& pPreparedFrame, const frame_ptr& pNextFrame)\r
+       {\r
+               BOOST_FOREACH(const frame_consumer_ptr& consumer, consumers_)\r
+               {\r
+                       try\r
+                       {\r
+                               consumer->prepare(pNextFrame); // Could block\r
+                               consumer->display(pPreparedFrame); // Could block\r
+                       }\r
+                       catch(...)\r
+                       {\r
+                               CASPAR_LOG_CURRENT_EXCEPTION();\r
+                               boost::range::remove_erase(consumers_, consumer);\r
+                               CASPAR_LOG(warning) << "Removed consumer from render-device.";\r
+                               if(consumers_.empty())\r
+                               {\r
+                                       CASPAR_LOG(warning) << "No consumers available. Shutting down render-device.";\r
+                                       is_running_ = false;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+               \r
+       void load(int exLayer, const frame_producer_ptr& producer, load_option option)\r
+       {\r
+               if(producer->get_frame_format_desc() != fmt_)\r
+                       BOOST_THROW_EXCEPTION(invalid_argument() << arg_name_info("pProducer") << msg_info("Invalid frame format"));\r
+\r
+               tbb::mutex::scoped_lock lock(layers_mutex_);\r
+               layers_[exLayer].load(producer, option);\r
+       }\r
+                       \r
+       void play(int exLayer)\r
+       {               \r
+               tbb::mutex::scoped_lock lock(layers_mutex_);\r
+               auto it = layers_.find(exLayer);\r
+               if(it != layers_.end())\r
+                       it->second.play();              \r
+       }\r
+\r
+       void stop(int exLayer)\r
+       {               \r
+               tbb::mutex::scoped_lock lock(layers_mutex_);\r
+               auto it = layers_.find(exLayer);\r
+               if(it != layers_.end())\r
+                       it->second.stop();\r
+       }\r
+\r
+       void clear(int exLayer)\r
+       {\r
+               tbb::mutex::scoped_lock lock(layers_mutex_);\r
+               auto it = layers_.find(exLayer);\r
+               if(it != layers_.end())\r
+                       it->second.clear();             \r
+       }\r
+               \r
+       void clear()\r
+       {\r
+               tbb::mutex::scoped_lock lock(layers_mutex_);\r
+               layers_.clear();\r
+       }               \r
+\r
+       frame_producer_ptr active(int exLayer) const\r
+       {\r
+               tbb::mutex::scoped_lock lock(layers_mutex_);\r
+               auto it = layers_.find(exLayer);\r
+               return it != layers_.end() ? it->second.active() : nullptr;\r
+       }\r
+       \r
+       frame_producer_ptr background(int exLayer) const\r
+       {\r
+               tbb::mutex::scoped_lock lock(layers_mutex_);\r
+               auto it = layers_.find(exLayer);\r
+               return it != layers_.end() ? it->second.background() : nullptr;\r
+       }\r
+               \r
+       boost::thread render_thread_;\r
+       boost::thread display_thread_;\r
+               \r
+       caspar::frame_format_desc fmt_;\r
+       tbb::concurrent_bounded_queue<frame_ptr> frame_buffer_;\r
+       \r
+       std::vector<frame_consumer_ptr> consumers_;\r
+       \r
+       mutable tbb::mutex layers_mutex_;\r
+       std::map<int, layer> layers_;\r
+       \r
+       tbb::atomic<bool> is_running_;  \r
+\r
+       caspar::Monitor monitor_;\r
+};\r
+\r
+render_device::render_device(const caspar::frame_format_desc& format_desc, unsigned int index, const std::vector<frame_consumer_ptr>& consumers) \r
+       : impl_(new implementation(format_desc, index, consumers)){}\r
+void render_device::load(int exLayer, const frame_producer_ptr& pProducer, load_option option){impl_->load(exLayer, pProducer, option);}\r
+void render_device::play(int exLayer){impl_->play(exLayer);}\r
+void render_device::stop(int exLayer){impl_->stop(exLayer);}\r
+void render_device::clear(int exLayer){impl_->clear(exLayer);}\r
+void render_device::clear(){impl_->clear();}\r
+frame_producer_ptr render_device::active(int exLayer) const {return impl_->active(exLayer);}\r
+frame_producer_ptr render_device::background(int exLayer) const {return impl_->background(exLayer);}\r
+const frame_format_desc& render_device::frame_format_desc() const{return impl_->fmt_;}\r
+caspar::Monitor& render_device::monitor(){return impl_->monitor_;}\r
+}}\r
+\r
diff --git a/core/renderer/render_device.h b/core/renderer/render_device.h
new file mode 100644 (file)
index 0000000..60c7864
--- /dev/null
@@ -0,0 +1,37 @@
+#pragma once\r
+\r
+#include "../producer/frame_producer.h"\r
+#include "../consumer/frame_consumer.h"\r
+\r
+#include "layer.h"\r
+\r
+namespace caspar{\r
+       \r
+class Monitor;\r
+\r
+namespace renderer{\r
+       \r
+class render_device : boost::noncopyable\r
+{      \r
+public:\r
+       render_device(const frame_format_desc& format_desc, unsigned int index, const std::vector<frame_consumer_ptr>& consumers);\r
+       \r
+       void load(int exLayer, const frame_producer_ptr& pProducer, load_option option = load_option::none);    \r
+       void play(int exLayer);\r
+       void stop(int exLayer);\r
+       void clear(int exLayer);\r
+       void clear();\r
+\r
+       frame_producer_ptr active(int exLayer) const;\r
+       frame_producer_ptr background(int exLayer) const;\r
+\r
+       const frame_format_desc& frame_format_desc() const;                     \r
+       Monitor& monitor();\r
+private:\r
+       struct implementation;\r
+       std::shared_ptr<implementation> impl_;\r
+};\r
+typedef std::shared_ptr<render_device> render_device_ptr;\r
+typedef std::unique_ptr<render_device> render_device_uptr;\r
+\r
+}}\r
diff --git a/core/renderer/renderer_fwd.h b/core/renderer/renderer_fwd.h
new file mode 100644 (file)
index 0000000..6f8aa0c
--- /dev/null
@@ -0,0 +1,18 @@
+#pragma once\r
+\r
+#include <memory>\r
+\r
+namespace caspar {\r
+\r
+class Monitor;\r
+\r
+namespace renderer {\r
+\r
+class render_device;\r
+typedef std::shared_ptr<render_device> render_device_ptr;\r
+typedef std::unique_ptr<render_device> render_device_uptr;\r
+class layer;\r
+typedef std::shared_ptr<layer> layer_ptr;\r
+typedef std::unique_ptr<layer> layer_uptr;\r
+\r
+}}\r
diff --git a/core/server.cpp b/core/server.cpp
new file mode 100644 (file)
index 0000000..e0d4dcc
--- /dev/null
@@ -0,0 +1,231 @@
+#include "StdAfx.h"\r
+\r
+#include "server.h"\r
+\r
+#include "consumer/oal/oal_frame_consumer.h"\r
+#ifndef DISABLE_BLUEFISH\r
+#include "consumer/bluefish/BlueFishVideoConsumer.h"\r
+#endif\r
+#include "consumer/decklink/DecklinkVideoConsumer.h"\r
+#include "consumer/ogl/ogl_frame_consumer.h"\r
+\r
+#include <FreeImage.h>\r
+\r
+#include "protocol/amcp/AMCPProtocolStrategy.h"\r
+#include "protocol/cii/CIIProtocolStrategy.h"\r
+#include "protocol/CLK/CLKProtocolStrategy.h"\r
+#include "producer/flash/FlashAxContainer.h"\r
+#include "protocol/monitor/Monitor.h"\r
+\r
+#include "../common/io/AsyncEventServer.h"\r
+#include "../common/io/SerialPort.h"\r
+#include "../common/utility/string_convert.h"\r
+\r
+#include <boost/algorithm/string.hpp>\r
+#include <boost/lexical_cast.hpp>\r
+#include <boost/filesystem.hpp>\r
+#include <boost/foreach.hpp>\r
+#include <boost/property_tree/ptree.hpp>\r
+#include <boost/property_tree/xml_parser.hpp>\r
+\r
+namespace caspar{\r
+\r
+struct server::implementation : boost::noncopyable\r
+{\r
+       implementation()                                                                                                \r
+       {\r
+               FreeImage_Initialise(true);     \r
+                               \r
+               boost::property_tree::ptree pt;\r
+               boost::property_tree::read_xml(boost::filesystem::initial_path().file_string() + "\\caspar.config", pt);\r
+\r
+               setup_paths();\r
+               setup_channels(pt);\r
+               setup_controllers(pt);\r
+       \r
+               if(!flash::FlashAxContainer::CheckForFlashSupport())\r
+                       CASPAR_LOG(error) << "No flashplayer activex-control installed. Flash support will be disabled";\r
+       }\r
+\r
+       ~implementation()\r
+       {               \r
+               FreeImage_DeInitialise();\r
+               serial_ports_.clear();\r
+               async_servers_.clear();\r
+               channels_.clear();\r
+       }\r
+\r
+       static void setup_paths()\r
+       {\r
+               if(!media_folder_.empty())\r
+                       return;\r
+\r
+               std::string initialPath = boost::filesystem::initial_path().file_string();\r
+               boost::property_tree::ptree pt;\r
+               boost::property_tree::read_xml(initialPath + "\\caspar.config", pt);\r
+\r
+               auto paths = pt.get_child("configuration.paths");\r
+               media_folder_ = common::widen(paths.get("media-path", initialPath + "\\media\\"));\r
+               log_folder_ = common::widen(paths.get("log-path", initialPath + "\\log\\"));\r
+               template_folder_ = common::widen(paths.get("template-path", initialPath + "\\template\\"));\r
+               data_folder_ = common::widen(paths.get("data-path", initialPath + "\\data\\"));\r
+       }\r
+                       \r
+       void setup_channels(boost::property_tree::ptree& pt)\r
+       {   \r
+               using boost::property_tree::ptree;\r
+               BOOST_FOREACH(auto& xml_channel, pt.get_child("configuration.channels"))\r
+               {               \r
+                       auto format_desc = get_video_format_desc(common::widen(xml_channel.second.get("videomode", "PAL")));                    \r
+                       std::vector<frame_consumer_ptr> consumers;\r
+\r
+                       BOOST_FOREACH(auto& xml_consumer, xml_channel.second.get_child("consumers"))\r
+                       {\r
+                               try\r
+                               {\r
+                                       frame_consumer_ptr pConsumer;\r
+                                       std::string name = xml_consumer.first;\r
+                                       if(name == "ogl")\r
+                                       {                       \r
+                                               int device = xml_consumer.second.get("device", 0);\r
+                       \r
+                                               ogl::stretch stretch = ogl::stretch::fill;\r
+                                               std::string stretchStr = xml_consumer.second.get("stretch", "");\r
+                                               if(stretchStr == "none")\r
+                                                       stretch = ogl::stretch::none;\r
+                                               else if(stretchStr == "uniform")\r
+                                                       stretch = ogl::stretch::uniform;\r
+                                               else if(stretchStr == "uniformtofill")\r
+                                                       stretch = ogl::stretch::uniform_to_fill;\r
+\r
+                                               bool windowed = xml_consumer.second.get("windowed", false);\r
+                                               pConsumer = std::make_shared<ogl::ogl_frame_consumer>(format_desc, device, stretch, windowed);\r
+                                       }\r
+                               #ifndef DISABLE_BLUEFISH\r
+                                       else if(name == "bluefish")\r
+                                               pConsumer = caspar::bluefish::BlueFishVideoConsumer::Create(format_desc, xml_consumer.second.get("device", 0));\r
+                               #endif\r
+                                       else if(name == "decklink")\r
+                                               pConsumer = std::make_shared<decklink::DecklinkVideoConsumer>(format_desc, xml_consumer.second.get("internalkey", false));\r
+                                       else if(name == "audio")\r
+                                               pConsumer = std::make_shared<audio::oal_frame_consumer>(format_desc);\r
+\r
+                                       if(pConsumer)                                   \r
+                                               consumers.push_back(pConsumer);                                 \r
+                               }\r
+                               catch(...)\r
+                               {\r
+                                       CASPAR_LOG_CURRENT_EXCEPTION();\r
+                               }\r
+                       }\r
+                       \r
+                       channels_.push_back(std::make_shared<renderer::render_device>(format_desc, channels_.size() + 1, consumers));\r
+               }\r
+       }\r
+               \r
+       void setup_controllers(boost::property_tree::ptree& pt)\r
+       {               \r
+               using boost::property_tree::ptree;\r
+               BOOST_FOREACH(auto& xml_controller, pt.get_child("configuration.controllers"))\r
+               {\r
+                       try\r
+                       {\r
+                               std::string name = xml_controller.first;\r
+                               std::string protocol = xml_controller.second.get<std::string>("protocol");      \r
+\r
+                               if(name == "tcpcontroller")\r
+                               {                                       \r
+                                       unsigned int port = xml_controller.second.get<unsigned int>("port");\r
+                                       port = port != 0 ? port : 5250;\r
+                                       auto asyncserver = std::make_shared<caspar::IO::AsyncEventServer>(create_protocol(protocol), port);\r
+                                       asyncserver->SetClientDisconnectHandler(std::tr1::bind(&Monitor::ClearListener, std::tr1::placeholders::_1));\r
+                                       asyncserver->Start();\r
+                                       async_servers_.push_back(asyncserver);\r
+                               }\r
+                               else if(name == "serialcontroller")\r
+                               {\r
+                                       std::wstring portName = common::widen(xml_controller.second.get<std::string>("port-name"));                                             \r
+                                       unsigned int baudRate = xml_controller.second.get<unsigned int>("baud-rate");\r
+                                       unsigned int dataBits = xml_controller.second.get<unsigned int>("data-bits");\r
+                                       unsigned int parity = xml_controller.second.get<unsigned int>("parity");\r
+                                       unsigned int stopBits = xml_controller.second.get<unsigned int>("stop-bits");\r
+\r
+                                       baudRate =      baudRate        != 0 ? baudRate : 19200;\r
+                                       dataBits =      dataBits        != 0 ? dataBits : 8;\r
+                                       parity =        parity          != 0 ? parity   : NOPARITY;\r
+                                       stopBits =      stopBits        != 0 ? stopBits : ONESTOPBIT;\r
+                                       \r
+                                       auto serialPort = std::make_shared<IO::SerialPort>(create_protocol(protocol), baudRate, parity, dataBits, stopBits, portName, xml_controller.second.get("spy", false));\r
+                                       serialPort->Start();\r
+                                       serial_ports_.push_back(serialPort);\r
+                               }\r
+                               else\r
+                                       BOOST_THROW_EXCEPTION(invalid_configuration() << arg_name_info(name) << msg_info("Invalid controller"));\r
+                       }\r
+                       catch(...)\r
+                       {\r
+                               CASPAR_LOG_CURRENT_EXCEPTION();\r
+                               throw;\r
+                       }\r
+               }\r
+       }\r
+\r
+       IO::ProtocolStrategyPtr create_protocol(const std::string& name) const\r
+       {\r
+               if(name == "AMCP")\r
+                       return std::make_shared<amcp::AMCPProtocolStrategy>(channels_);\r
+               else if(name == "CII")\r
+                       return std::make_shared<cii::CIIProtocolStrategy>(channels_);\r
+               else if(name == "CLOCK")\r
+                       return std::make_shared<CLK::CLKProtocolStrategy>(channels_);\r
+               \r
+               BOOST_THROW_EXCEPTION(invalid_configuration() << arg_name_info("name") << arg_value_info(name) << msg_info("Invalid protocol"));\r
+       }\r
+\r
+       std::vector<IO::SerialPortPtr> serial_ports_;\r
+       std::vector<IO::AsyncEventServerPtr> async_servers_;\r
+\r
+       std::vector<renderer::render_device_ptr> channels_;\r
+\r
+       int logLevel_;\r
+\r
+       static std::wstring media_folder_;\r
+       static std::wstring log_folder_;\r
+       static std::wstring template_folder_;\r
+       static std::wstring data_folder_;\r
+};\r
+\r
+std::wstring server::implementation::media_folder_ = L"";\r
+std::wstring server::implementation::log_folder_ = L"";\r
+std::wstring server::implementation::template_folder_ = L"";\r
+std::wstring server::implementation::data_folder_ = L"";\r
+\r
+server::server() : impl_(new implementation()){}\r
+\r
+const std::wstring& server::media_folder()\r
+{\r
+       server::implementation::setup_paths();\r
+       return server::implementation::media_folder_;\r
+}\r
+\r
+const std::wstring& server::log_folder()\r
+{\r
+       server::implementation::setup_paths();\r
+       return server::implementation::log_folder_;\r
+}\r
+\r
+const std::wstring& server::template_folder()\r
+{\r
+       server::implementation::setup_paths();\r
+       return server::implementation::template_folder_;\r
+}\r
+\r
+const std::wstring& server::data_folder()\r
+{\r
+       server::implementation::setup_paths();\r
+       return server::implementation::data_folder_;\r
+}\r
+\r
+const std::vector<renderer::render_device_ptr>& server::get_channels() const{ return impl_->channels_; }\r
+\r
+}
\ No newline at end of file
diff --git a/core/server.h b/core/server.h
new file mode 100644 (file)
index 0000000..6085b0d
--- /dev/null
@@ -0,0 +1,25 @@
+#pragma once\r
+\r
+#include "renderer/renderer_fwd.h"\r
+\r
+namespace caspar { \r
+       \r
+struct invalid_configuration : virtual boost::exception, virtual std::exception {};\r
+\r
+class server : boost::noncopyable\r
+{\r
+public:\r
+       server();\r
+\r
+       static const std::wstring& media_folder();\r
+       static const std::wstring& log_folder();\r
+       static const std::wstring& template_folder();           \r
+       static const std::wstring& data_folder();       \r
+\r
+       const std::vector<renderer::render_device_ptr>& get_channels() const;\r
+private:\r
+       struct implementation;\r
+       std::shared_ptr<implementation> impl_;\r
+};\r
+\r
+}
\ No newline at end of file