]> git.sesse.net Git - casparcg/blob - modules/bluefish/util/blue_velvet.cpp
2.0.2: Updated file info headers.
[casparcg] / modules / bluefish / util / blue_velvet.cpp
1 /*\r
2 * Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>\r
3 *\r
4 * This file is part of CasparCG (www.casparcg.com).\r
5 *\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
10 *\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
15 *\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
18 *\r
19 * Author: Robert Nagy, ronag89@gmail.com\r
20 */\r
21 \r
22 #include "../StdAfx.h"\r
23 \r
24 #include "blue_velvet.h"\r
25 \r
26 #include <common/utility/string.h>\r
27 \r
28 #include <core/video_format.h>\r
29 \r
30 namespace caspar { namespace bluefish {\r
31         \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
37 \r
38 void blue_velvet_initialize()\r
39 {\r
40 #ifdef _DEBUG\r
41         std::string module_str = "BlueVelvet3_d.dll";\r
42 #else\r
43         std::string module_str = "BlueVelvet3.dll";\r
44 #endif\r
45 \r
46         auto module = LoadLibrary(widen(module_str).c_str());\r
47         if(!module)\r
48                 LoadLibrary(widen(std::string(getenv("SystemDrive")) + "\\Program Files\\Bluefish444\\Driver\\" + module_str).c_str());\r
49         if(!module)\r
50                 LoadLibrary(widen(std::string(getenv("SystemDrive")) + "\\Program Files (x86)\\BlueFish444\\Driver\\" + module_str).c_str());\r
51         if(!module)\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
57 }\r
58 \r
59 void blue_hanc_initialize()\r
60 {\r
61 #ifdef _DEBUG\r
62         std::string module_str = "BlueHancUtils_d.dll";\r
63 #else\r
64         std::string module_str = "BlueHancUtils.dll";\r
65 #endif\r
66         \r
67         auto module = LoadLibrary(widen(module_str).c_str());\r
68         if(!module)\r
69                 LoadLibrary(widen(std::string(getenv("SystemDrive")) + "\\Program Files\\Bluefish444\\Driver\\" + module_str).c_str());\r
70         if(!module)\r
71                 LoadLibrary(widen(std::string(getenv("SystemDrive")) + "\\Program Files (x86)\\BlueFish444\\Driver\\" + module_str).c_str());\r
72         if(!module)\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
77 }\r
78 \r
79 void blue_initialize()\r
80 {\r
81         blue_hanc_initialize();\r
82         blue_velvet_initialize();\r
83 }\r
84 \r
85 EVideoMode vid_fmt_from_video_format(const core::video_format::type& fmt) \r
86 {\r
87         switch(fmt)\r
88         {\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
106         }\r
107 }\r
108 \r
109 bool is_epoch_card(CBlueVelvet4& blue)\r
110 {\r
111         switch(blue.has_video_cardtype())\r
112         {\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
123                 return true;\r
124         default:\r
125                 return false;\r
126         }\r
127 }\r
128 \r
129 std::wstring get_card_desc(CBlueVelvet4& blue)\r
130 {\r
131         switch(blue.has_video_cardtype()) \r
132         {\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
167         }\r
168 }\r
169 \r
170 EVideoMode get_video_mode(CBlueVelvet4& blue, const core::video_format_desc& format_desc)\r
171 {\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
176         {\r
177                 EVideoMode videoMode = blue.enum_video_mode(videoModeIndex);\r
178                 if(videoMode == desiredVideoFormat) \r
179                         vid_fmt = videoMode;                    \r
180         }\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
183 \r
184         return vid_fmt;\r
185 }\r
186 \r
187 safe_ptr<CBlueVelvet4> create_blue()\r
188 {\r
189         if(!BlueVelvetFactory4 || !encode_hanc_frame || !encode_hanc_frame)\r
190                 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Bluefish drivers not found."));\r
191 \r
192         return safe_ptr<CBlueVelvet4>(BlueVelvetFactory4(), BlueVelvetDestroy);\r
193 }\r
194 \r
195 safe_ptr<CBlueVelvet4> create_blue(size_t device_index)\r
196 {\r
197         auto blue = create_blue();\r
198         \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
201 \r
202         return blue;\r
203 }\r
204 \r
205 }}