1 #include "../StdAfx.h"
\r
3 #include "blue_velvet.h"
\r
5 #include <common/utility/string.h>
\r
7 #include <core/video_format.h>
\r
11 CBlueVelvet4* (*BlueVelvetFactory4)() = nullptr;
\r
12 void (*BlueVelvetDestroy)(CBlueVelvet4* pObj) = nullptr;
\r
13 const char* (*BlueVelvetVersion)() = nullptr;
\r
14 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
15 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
17 void blue_velvet_initialize()
\r
20 auto module = LoadLibrary(L"BlueVelvet3_d.dll");
\r
22 auto module = LoadLibrary(L"BlueVelvet3.dll");
\r
25 BOOST_THROW_EXCEPTION(file_not_found() << msg_info("Could not find BlueVelvet3.dll. Required drivers are not installed."));
\r
26 static std::shared_ptr<void> lib(module, FreeLibrary);
\r
27 BlueVelvetFactory4 = reinterpret_cast<decltype(BlueVelvetFactory4)>(GetProcAddress(module, "BlueVelvetFactory4"));
\r
28 BlueVelvetDestroy = reinterpret_cast<decltype(BlueVelvetDestroy)>(GetProcAddress(module, "BlueVelvetDestroy"));
\r
29 BlueVelvetVersion = reinterpret_cast<decltype(BlueVelvetVersion)>(GetProcAddress(module, "BlueVelvetVersion"));
\r
32 void blue_hanc_initialize()
\r
35 auto module = LoadLibrary(L"BlueHancUtils_d.dll");
\r
37 auto module = LoadLibrary(L"BlueHancUtils.dll");
\r
40 BOOST_THROW_EXCEPTION(file_not_found() << msg_info("Could not find BlueHancUtils.dll. Required drivers are not installed."));
\r
41 static std::shared_ptr<void> lib(module, FreeLibrary);
\r
42 encode_hanc_frame = reinterpret_cast<decltype(encode_hanc_frame)>(GetProcAddress(module, "encode_hanc_frame"));
\r
43 encode_hanc_frame_ex = reinterpret_cast<decltype(encode_hanc_frame_ex)>(GetProcAddress(module, "encode_hanc_frame_ex"));
\r
46 void blue_initialize()
\r
48 blue_velvet_initialize();
\r
49 blue_hanc_initialize();
\r
52 EVideoMode vid_fmt_from_video_format(const core::video_format::type& fmt)
\r
56 case core::video_format::pal: return VID_FMT_PAL;
\r
57 case core::video_format::ntsc: return VID_FMT_NTSC;
\r
58 case core::video_format::x576p2500: return VID_FMT_INVALID; //not supported
\r
59 case core::video_format::x720p2500: return VID_FMT_720P_2500;
\r
60 case core::video_format::x720p5000: return VID_FMT_720P_5000;
\r
61 case core::video_format::x720p5994: return VID_FMT_720P_5994;
\r
62 case core::video_format::x720p6000: return VID_FMT_720P_6000;
\r
63 case core::video_format::x1080p2397: return VID_FMT_1080P_2397;
\r
64 case core::video_format::x1080p2400: return VID_FMT_1080P_2400;
\r
65 case core::video_format::x1080i5000: return VID_FMT_1080I_5000;
\r
66 case core::video_format::x1080i5994: return VID_FMT_1080I_5994;
\r
67 case core::video_format::x1080i6000: return VID_FMT_1080I_6000;
\r
68 case core::video_format::x1080p2500: return VID_FMT_1080P_2500;
\r
69 case core::video_format::x1080p2997: return VID_FMT_1080P_2997;
\r
70 case core::video_format::x1080p3000: return VID_FMT_1080P_3000;
\r
71 case core::video_format::x1080p5000: return VID_FMT_1080P_5000;
\r
72 default: return VID_FMT_INVALID;
\r
76 bool is_epoch_card(CBlueVelvet4& blue)
\r
78 switch(blue.has_video_cardtype())
\r
80 case CRD_BLUE_EPOCH_2K:
\r
81 case CRD_BLUE_EPOCH_HORIZON:
\r
82 case CRD_BLUE_EPOCH_2K_CORE:
\r
83 case CRD_BLUE_EPOCH_2K_ULTRA:
\r
84 case CRD_BLUE_EPOCH_CORE:
\r
85 case CRD_BLUE_EPOCH_ULTRA:
\r
92 std::wstring get_card_desc(CBlueVelvet4& blue)
\r
94 switch(blue.has_video_cardtype())
\r
96 case CRD_BLUEDEEP_LT: return L"Deepblue LT";// D64 Lite
\r
97 case CRD_BLUEDEEP_SD: return L"Iridium SD";// Iridium SD
\r
98 case CRD_BLUEDEEP_AV: return L"Iridium AV";// Iridium AV
\r
99 case CRD_BLUEDEEP_IO: return L"Deepblue IO";// D64 Full
\r
100 case CRD_BLUEWILD_AV: return L"Wildblue AV";// D64 AV
\r
101 case CRD_IRIDIUM_HD: return L"Iridium HD";// * Iridium HD
\r
102 case CRD_BLUEWILD_RT: return L"Wildblue RT";// D64 RT
\r
103 case CRD_BLUEWILD_HD: return L"Wildblue HD";// * BadAss G2
\r
104 case CRD_REDDEVIL: return L"Iridium Full";// Iridium Full
\r
105 case CRD_BLUEDEEP_HD:
\r
106 case CRD_BLUEDEEP_HDS: return L"Reserved for \"BasAss G2";// * BadAss G2 variant, proposed, reserved
\r
107 case CRD_BLUE_ENVY: return L"Blue Envy"; // Mini Din
\r
108 case CRD_BLUE_PRIDE: return L"Blue Pride";//Mini Din Output
\r
109 case CRD_BLUE_GREED: return L"Blue Greed";
\r
110 case CRD_BLUE_INGEST: return L"Blue Ingest";
\r
111 case CRD_BLUE_SD_DUALLINK: return L"Blue SD Duallink";
\r
112 case CRD_BLUE_CATALYST: return L"Blue Catalyst";
\r
113 case CRD_BLUE_SD_DUALLINK_PRO: return L"Blue SD Duallink Pro";
\r
114 case CRD_BLUE_SD_INGEST_PRO: return L"Blue SD Ingest pro";
\r
115 case CRD_BLUE_SD_DEEPBLUE_LITE_PRO: return L"Blue SD Deepblue lite Pro";
\r
116 case CRD_BLUE_SD_SINGLELINK_PRO: return L"Blue SD Singlelink Pro";
\r
117 case CRD_BLUE_SD_IRIDIUM_AV_PRO: return L"Blue SD Iridium AV Pro";
\r
118 case CRD_BLUE_SD_FIDELITY: return L"Blue SD Fidelity";
\r
119 case CRD_BLUE_SD_FOCUS: return L"Blue SD Focus";
\r
120 case CRD_BLUE_SD_PRIME: return L"Blue SD Prime";
\r
121 case CRD_BLUE_EPOCH_2K_CORE: return L"Blue Epoch 2K Core";
\r
122 case CRD_BLUE_EPOCH_2K_ULTRA: return L"Blue Epoch 2K Ultra";
\r
123 case CRD_BLUE_EPOCH_HORIZON: return L"Blue Epoch Horizon";
\r
124 case CRD_BLUE_EPOCH_CORE: return L"Blue Epoch Core";
\r
125 case CRD_BLUE_EPOCH_ULTRA: return L"Blue Epoch Ultra";
\r
126 case CRD_BLUE_CREATE_HD: return L"Blue Create HD";
\r
127 case CRD_BLUE_CREATE_2K: return L"Blue Create 2K";
\r
128 case CRD_BLUE_CREATE_2K_ULTRA: return L"Blue Create 2K Ultra";
\r
129 default: return L"Unknown";
\r
133 EVideoMode get_video_mode(CBlueVelvet4& blue, const core::video_format_desc& format_desc)
\r
135 EVideoMode vid_fmt = VID_FMT_INVALID;
\r
136 auto desiredVideoFormat = vid_fmt_from_video_format(format_desc.format);
\r
137 int videoModeCount = blue.count_video_mode();
\r
138 for(int videoModeIndex = 1; videoModeIndex <= videoModeCount; ++videoModeIndex)
\r
140 EVideoMode videoMode = blue.enum_video_mode(videoModeIndex);
\r
141 if(videoMode == desiredVideoFormat)
\r
142 vid_fmt = videoMode;
\r
144 if(vid_fmt == VID_FMT_INVALID)
\r
145 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("video-mode not supported.") << arg_value_info(narrow(format_desc.name)));
\r
150 safe_ptr<CBlueVelvet4> create_blue()
\r
152 if(!BlueVelvetFactory4 || !encode_hanc_frame || !encode_hanc_frame)
\r
153 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Bluefish drivers not found."));
\r
155 return safe_ptr<CBlueVelvet4>(BlueVelvetFactory4(), BlueVelvetDestroy);
\r
158 safe_ptr<CBlueVelvet4> create_blue(size_t device_index)
\r
160 auto blue = create_blue();
\r
162 if(BLUE_FAIL(blue->device_attach(device_index, FALSE)))
\r
163 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Failed to attach device."));
\r