2 * Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>
\r
4 * This file is part of CasparCG (www.casparcg.com).
\r
6 * CasparCG is free software: you can redistribute it and/or modify
\r
7 * it under the terms of the GNU General Public License as published by
\r
8 * the Free Software Foundation, either version 3 of the License, or
\r
9 * (at your option) any later version.
\r
11 * CasparCG is distributed in the hope that it will be useful,
\r
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
14 * GNU General Public License for more details.
\r
16 * You should have received a copy of the GNU General Public License
\r
17 * along with CasparCG. If not, see <http://www.gnu.org/licenses/>.
\r
19 * Author: Robert Nagy, ronag89@gmail.com
\r
22 #include "../StdAfx.h"
\r
24 #include "blue_velvet.h"
\r
26 #include <common/utility/string.h>
\r
28 #include <core/video_format.h>
\r
30 namespace caspar { namespace bluefish {
\r
32 CBlueVelvet4* (*BlueVelvetFactory4)() = nullptr;
\r
33 void (*BlueVelvetDestroy)(CBlueVelvet4* pObj) = nullptr;
\r
34 const char* (*BlueVelvetVersion)() = nullptr;
\r
35 BLUE_UINT32 (*encode_hanc_frame)(struct hanc_stream_info_struct * hanc_stream_ptr, void * audio_pcm_ptr,BLUE_UINT32 no_audio_ch,BLUE_UINT32 no_audio_samples,BLUE_UINT32 nTypeOfSample,BLUE_UINT32 emb_audio_flag) = nullptr;
\r
36 BLUE_UINT32 (*encode_hanc_frame_ex)(BLUE_UINT32 card_type, struct hanc_stream_info_struct * hanc_stream_ptr, void * audio_pcm_ptr, BLUE_UINT32 no_audio_ch, BLUE_UINT32 no_audio_samples, BLUE_UINT32 nTypeOfSample, BLUE_UINT32 emb_audio_flag) = nullptr;
\r
38 void blue_velvet_initialize()
\r
41 std::string module_str = "BlueVelvet3_d.dll";
\r
43 std::string module_str = "BlueVelvet3.dll";
\r
46 auto module = LoadLibrary(widen(module_str).c_str());
\r
48 LoadLibrary(widen(std::string(getenv("SystemDrive")) + "\\Program Files\\Bluefish444\\Driver\\" + module_str).c_str());
\r
50 LoadLibrary(widen(std::string(getenv("SystemDrive")) + "\\Program Files (x86)\\BlueFish444\\Driver\\" + module_str).c_str());
\r
52 BOOST_THROW_EXCEPTION(file_not_found() << msg_info("Could not find BlueVelvet3.dll. Required drivers are not installed."));
\r
53 static std::shared_ptr<void> lib(module, FreeLibrary);
\r
54 BlueVelvetFactory4 = reinterpret_cast<decltype(BlueVelvetFactory4)>(GetProcAddress(module, "BlueVelvetFactory4"));
\r
55 BlueVelvetDestroy = reinterpret_cast<decltype(BlueVelvetDestroy)>(GetProcAddress(module, "BlueVelvetDestroy"));
\r
56 BlueVelvetVersion = reinterpret_cast<decltype(BlueVelvetVersion)>(GetProcAddress(module, "BlueVelvetVersion"));
\r
59 void blue_hanc_initialize()
\r
62 std::string module_str = "BlueHancUtils_d.dll";
\r
64 std::string module_str = "BlueHancUtils.dll";
\r
67 auto module = LoadLibrary(widen(module_str).c_str());
\r
69 LoadLibrary(widen(std::string(getenv("SystemDrive")) + "\\Program Files\\Bluefish444\\Driver\\" + module_str).c_str());
\r
71 LoadLibrary(widen(std::string(getenv("SystemDrive")) + "\\Program Files (x86)\\BlueFish444\\Driver\\" + module_str).c_str());
\r
73 BOOST_THROW_EXCEPTION(file_not_found() << msg_info("Could not find BlueHancUtils.dll. Required drivers are not installed."));
\r
74 static std::shared_ptr<void> lib(module, FreeLibrary);
\r
75 encode_hanc_frame = reinterpret_cast<decltype(encode_hanc_frame)>(GetProcAddress(module, "encode_hanc_frame"));
\r
76 encode_hanc_frame_ex = reinterpret_cast<decltype(encode_hanc_frame_ex)>(GetProcAddress(module, "encode_hanc_frame_ex"));
\r
79 void blue_initialize()
\r
81 blue_hanc_initialize();
\r
82 blue_velvet_initialize();
\r
85 EVideoMode vid_fmt_from_video_format(const core::video_format::type& fmt)
\r
89 case core::video_format::pal: return VID_FMT_PAL;
\r
90 case core::video_format::ntsc: return VID_FMT_NTSC;
\r
91 case core::video_format::x576p2500: return VID_FMT_INVALID; //not supported
\r
92 case core::video_format::x720p2500: return VID_FMT_720P_2500;
\r
93 case core::video_format::x720p5000: return VID_FMT_720P_5000;
\r
94 case core::video_format::x720p5994: return VID_FMT_720P_5994;
\r
95 case core::video_format::x720p6000: return VID_FMT_720P_6000;
\r
96 case core::video_format::x1080p2397: return VID_FMT_1080P_2397;
\r
97 case core::video_format::x1080p2400: return VID_FMT_1080P_2400;
\r
98 case core::video_format::x1080i5000: return VID_FMT_1080I_5000;
\r
99 case core::video_format::x1080i5994: return VID_FMT_1080I_5994;
\r
100 case core::video_format::x1080i6000: return VID_FMT_1080I_6000;
\r
101 case core::video_format::x1080p2500: return VID_FMT_1080P_2500;
\r
102 case core::video_format::x1080p2997: return VID_FMT_1080P_2997;
\r
103 case core::video_format::x1080p3000: return VID_FMT_1080P_3000;
\r
104 case core::video_format::x1080p5000: return VID_FMT_1080P_5000;
\r
105 default: return VID_FMT_INVALID;
\r
109 bool is_epoch_card(CBlueVelvet4& blue)
\r
111 switch(blue.has_video_cardtype())
\r
113 case CRD_BLUE_EPOCH_HORIZON:
\r
114 case CRD_BLUE_EPOCH_CORE:
\r
115 case CRD_BLUE_EPOCH_ULTRA:
\r
116 case CRD_BLUE_EPOCH_2K_HORIZON:
\r
117 case CRD_BLUE_EPOCH_2K_CORE:
\r
118 case CRD_BLUE_EPOCH_2K_ULTRA:
\r
119 case CRD_BLUE_CREATE_HD:
\r
120 case CRD_BLUE_CREATE_2K:
\r
121 case CRD_BLUE_CREATE_2K_ULTRA:
\r
122 case CRD_BLUE_SUPER_NOVA:
\r
129 std::wstring get_card_desc(CBlueVelvet4& blue)
\r
131 switch(blue.has_video_cardtype())
\r
133 case CRD_BLUEDEEP_LT: return L"Deepblue LT";// D64 Lite
\r
134 case CRD_BLUEDEEP_SD: return L"Iridium SD";// Iridium SD
\r
135 case CRD_BLUEDEEP_AV: return L"Iridium AV";// Iridium AV
\r
136 case CRD_BLUEDEEP_IO: return L"Deepblue IO";// D64 Full
\r
137 case CRD_BLUEWILD_AV: return L"Wildblue AV";// D64 AV
\r
138 case CRD_IRIDIUM_HD: return L"Iridium HD";// * Iridium HD
\r
139 case CRD_BLUEWILD_RT: return L"Wildblue RT";// D64 RT
\r
140 case CRD_BLUEWILD_HD: return L"Wildblue HD";// * BadAss G2
\r
141 case CRD_REDDEVIL: return L"Iridium Full";// Iridium Full
\r
142 case CRD_BLUEDEEP_HD:
\r
143 case CRD_BLUEDEEP_HDS: return L"Reserved for \"BasAss G2";// * BadAss G2 variant, proposed, reserved
\r
144 case CRD_BLUE_ENVY: return L"Blue Envy"; // Mini Din
\r
145 case CRD_BLUE_PRIDE: return L"Blue Pride";//Mini Din Output
\r
146 case CRD_BLUE_GREED: return L"Blue Greed";
\r
147 case CRD_BLUE_INGEST: return L"Blue Ingest";
\r
148 case CRD_BLUE_SD_DUALLINK: return L"Blue SD Duallink";
\r
149 case CRD_BLUE_CATALYST: return L"Blue Catalyst";
\r
150 case CRD_BLUE_SD_DUALLINK_PRO: return L"Blue SD Duallink Pro";
\r
151 case CRD_BLUE_SD_INGEST_PRO: return L"Blue SD Ingest pro";
\r
152 case CRD_BLUE_SD_DEEPBLUE_LITE_PRO: return L"Blue SD Deepblue lite Pro";
\r
153 case CRD_BLUE_SD_SINGLELINK_PRO: return L"Blue SD Singlelink Pro";
\r
154 case CRD_BLUE_SD_IRIDIUM_AV_PRO: return L"Blue SD Iridium AV Pro";
\r
155 case CRD_BLUE_SD_FIDELITY: return L"Blue SD Fidelity";
\r
156 case CRD_BLUE_SD_FOCUS: return L"Blue SD Focus";
\r
157 case CRD_BLUE_SD_PRIME: return L"Blue SD Prime";
\r
158 case CRD_BLUE_EPOCH_2K_CORE: return L"Blue Epoch 2K Core";
\r
159 case CRD_BLUE_EPOCH_2K_ULTRA: return L"Blue Epoch 2K Ultra";
\r
160 case CRD_BLUE_EPOCH_HORIZON: return L"Blue Epoch Horizon";
\r
161 case CRD_BLUE_EPOCH_CORE: return L"Blue Epoch Core";
\r
162 case CRD_BLUE_EPOCH_ULTRA: return L"Blue Epoch Ultra";
\r
163 case CRD_BLUE_CREATE_HD: return L"Blue Create HD";
\r
164 case CRD_BLUE_CREATE_2K: return L"Blue Create 2K";
\r
165 case CRD_BLUE_CREATE_2K_ULTRA: return L"Blue Create 2K Ultra";
\r
166 default: return L"Unknown";
\r
170 EVideoMode get_video_mode(CBlueVelvet4& blue, const core::video_format_desc& format_desc)
\r
172 EVideoMode vid_fmt = VID_FMT_INVALID;
\r
173 auto desiredVideoFormat = vid_fmt_from_video_format(format_desc.format);
\r
174 int videoModeCount = blue.count_video_mode();
\r
175 for(int videoModeIndex = 1; videoModeIndex <= videoModeCount; ++videoModeIndex)
\r
177 EVideoMode videoMode = blue.enum_video_mode(videoModeIndex);
\r
178 if(videoMode == desiredVideoFormat)
\r
179 vid_fmt = videoMode;
\r
181 if(vid_fmt == VID_FMT_INVALID)
\r
182 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("video-mode not supported.") << arg_value_info(narrow(format_desc.name)));
\r
187 safe_ptr<CBlueVelvet4> create_blue()
\r
189 if(!BlueVelvetFactory4 || !encode_hanc_frame || !encode_hanc_frame)
\r
190 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Bluefish drivers not found."));
\r
192 return safe_ptr<CBlueVelvet4>(BlueVelvetFactory4(), BlueVelvetDestroy);
\r
195 safe_ptr<CBlueVelvet4> create_blue(size_t device_index)
\r
197 auto blue = create_blue();
\r
199 if(BLUE_FAIL(blue->device_attach(device_index, FALSE)))
\r
200 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Failed to attach device."));
\r