]> git.sesse.net Git - casparcg/blob - modules/bluefish/util/blue_velvet.cpp
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
[casparcg] / modules / bluefish / util / blue_velvet.cpp
1 #include "../StdAfx.h"\r
2 \r
3 #include "blue_velvet.h"\r
4 \r
5 #include <common/utility/string.h>\r
6 \r
7 #include <core/video_format.h>\r
8 \r
9 namespace caspar { namespace bluefish {\r
10         \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
16 \r
17 void blue_velvet_initialize()\r
18 {\r
19 #ifdef _DEBUG\r
20         std::string module_str = "BlueVelvet3_d.dll";\r
21 #else\r
22         std::string module_str = "BlueVelvet3.dll";\r
23 #endif\r
24         std::string sys_drive = getenv("SystemDrive");\r
25 \r
26         auto module = LoadLibraryA(module_str.c_str());\r
27         if(!module)\r
28                 LoadLibraryA((sys_drive + "\\Program Files\\Bluefish444\\Driver\\" + module_str).c_str());\r
29         if(!module)\r
30                 LoadLibraryA((sys_drive + "\\Program Files (x86)\\BlueFish444\\Driver\\" + module_str).c_str());\r
31         if(!module)\r
32                 BOOST_THROW_EXCEPTION(file_not_found() << msg_info("Could not find BlueVelvet3.dll. Required drivers are not installed."));\r
33         static std::shared_ptr<void> lib(module, FreeLibrary);\r
34         BlueVelvetFactory4 = reinterpret_cast<decltype(BlueVelvetFactory4)>(GetProcAddress(module, "BlueVelvetFactory4"));\r
35         BlueVelvetDestroy  = reinterpret_cast<decltype(BlueVelvetDestroy)>(GetProcAddress(module, "BlueVelvetDestroy"));\r
36         BlueVelvetVersion  = reinterpret_cast<decltype(BlueVelvetVersion)>(GetProcAddress(module, "BlueVelvetVersion"));\r
37 }\r
38 \r
39 void blue_hanc_initialize()\r
40 {\r
41 #ifdef _DEBUG\r
42         std::string module_str = "BlueHancUtils_d.dll";\r
43 #else\r
44         std::string module_str = "BlueHancUtils.dll";\r
45 #endif\r
46 \r
47         std::string sys_drive = getenv("SystemDrive");\r
48 \r
49         auto module = LoadLibraryA(module_str.c_str());\r
50         if(!module)\r
51                 LoadLibraryA((sys_drive + "\\Program Files\\Bluefish444\\Driver\\" + module_str).c_str());\r
52         if(!module)\r
53                 LoadLibraryA((sys_drive + "\\Program Files (x86)\\BlueFish444\\Driver\\" + module_str).c_str());\r
54         if(!module)\r
55                 BOOST_THROW_EXCEPTION(file_not_found() << msg_info("Could not find BlueHancUtils.dll. Required drivers are not installed."));\r
56         static std::shared_ptr<void> lib(module, FreeLibrary);\r
57         encode_hanc_frame        = reinterpret_cast<decltype(encode_hanc_frame)>(GetProcAddress(module, "encode_hanc_frame"));\r
58         encode_hanc_frame_ex = reinterpret_cast<decltype(encode_hanc_frame_ex)>(GetProcAddress(module, "encode_hanc_frame_ex"));\r
59 }\r
60 \r
61 void blue_initialize()\r
62 {\r
63         blue_hanc_initialize();\r
64         blue_velvet_initialize();\r
65 }\r
66 \r
67 EVideoMode vid_fmt_from_video_format(const core::video_format::type& fmt) \r
68 {\r
69         switch(fmt)\r
70         {\r
71         case core::video_format::pal:                   return VID_FMT_PAL;\r
72         case core::video_format::ntsc:                  return VID_FMT_NTSC;\r
73         case core::video_format::x576p2500:             return VID_FMT_INVALID; //not supported\r
74         case core::video_format::x720p2500:             return VID_FMT_720P_2500;\r
75         case core::video_format::x720p5000:             return VID_FMT_720P_5000;\r
76         case core::video_format::x720p5994:             return VID_FMT_720P_5994;\r
77         case core::video_format::x720p6000:             return VID_FMT_720P_6000;\r
78         case core::video_format::x1080p2397:    return VID_FMT_1080P_2397;\r
79         case core::video_format::x1080p2400:    return VID_FMT_1080P_2400;\r
80         case core::video_format::x1080i5000:    return VID_FMT_1080I_5000;\r
81         case core::video_format::x1080i5994:    return VID_FMT_1080I_5994;\r
82         case core::video_format::x1080i6000:    return VID_FMT_1080I_6000;\r
83         case core::video_format::x1080p2500:    return VID_FMT_1080P_2500;\r
84         case core::video_format::x1080p2997:    return VID_FMT_1080P_2997;\r
85         case core::video_format::x1080p3000:    return VID_FMT_1080P_3000;\r
86         case core::video_format::x1080p5000:    return VID_FMT_1080P_5000;\r
87         default:                                                                return VID_FMT_INVALID;\r
88         }\r
89 }\r
90 \r
91 bool is_epoch_card(CBlueVelvet4& blue)\r
92 {\r
93         switch(blue.has_video_cardtype())\r
94         {\r
95         case CRD_BLUE_EPOCH_HORIZON:\r
96         case CRD_BLUE_EPOCH_CORE:\r
97         case CRD_BLUE_EPOCH_ULTRA:\r
98         case CRD_BLUE_EPOCH_2K_HORIZON:\r
99         case CRD_BLUE_EPOCH_2K_CORE:\r
100         case CRD_BLUE_EPOCH_2K_ULTRA:\r
101         case CRD_BLUE_CREATE_HD:\r
102         case CRD_BLUE_CREATE_2K:\r
103         case CRD_BLUE_CREATE_2K_ULTRA:\r
104         case CRD_BLUE_SUPER_NOVA:\r
105                 return true;\r
106         default:\r
107                 return false;\r
108         }\r
109 }\r
110 \r
111 std::wstring get_card_desc(CBlueVelvet4& blue)\r
112 {\r
113         switch(blue.has_video_cardtype()) \r
114         {\r
115         case CRD_BLUEDEEP_LT:                           return L"Deepblue LT";// D64 Lite\r
116         case CRD_BLUEDEEP_SD:                           return L"Iridium SD";// Iridium SD\r
117         case CRD_BLUEDEEP_AV:                           return L"Iridium AV";// Iridium AV\r
118         case CRD_BLUEDEEP_IO:                           return L"Deepblue IO";// D64 Full\r
119         case CRD_BLUEWILD_AV:                           return L"Wildblue AV";// D64 AV\r
120         case CRD_IRIDIUM_HD:                            return L"Iridium HD";// * Iridium HD\r
121         case CRD_BLUEWILD_RT:                           return L"Wildblue RT";// D64 RT\r
122         case CRD_BLUEWILD_HD:                           return L"Wildblue HD";// * BadAss G2\r
123         case CRD_REDDEVIL:                                      return L"Iridium Full";// Iridium Full\r
124         case CRD_BLUEDEEP_HD:   \r
125         case CRD_BLUEDEEP_HDS:                          return L"Reserved for \"BasAss G2";// * BadAss G2 variant, proposed, reserved\r
126         case CRD_BLUE_ENVY:                                     return L"Blue Envy"; // Mini Din \r
127         case CRD_BLUE_PRIDE:                            return L"Blue Pride";//Mini Din Output \r
128         case CRD_BLUE_GREED:                            return L"Blue Greed";\r
129         case CRD_BLUE_INGEST:                           return L"Blue Ingest";\r
130         case CRD_BLUE_SD_DUALLINK:                      return L"Blue SD Duallink";\r
131         case CRD_BLUE_CATALYST:                         return L"Blue Catalyst";\r
132         case CRD_BLUE_SD_DUALLINK_PRO:          return L"Blue SD Duallink Pro";\r
133         case CRD_BLUE_SD_INGEST_PRO:            return L"Blue SD Ingest pro";\r
134         case CRD_BLUE_SD_DEEPBLUE_LITE_PRO:     return L"Blue SD Deepblue lite Pro";\r
135         case CRD_BLUE_SD_SINGLELINK_PRO:        return L"Blue SD Singlelink Pro";\r
136         case CRD_BLUE_SD_IRIDIUM_AV_PRO:        return L"Blue SD Iridium AV Pro";\r
137         case CRD_BLUE_SD_FIDELITY:                      return L"Blue SD Fidelity";\r
138         case CRD_BLUE_SD_FOCUS:                         return L"Blue SD Focus";\r
139         case CRD_BLUE_SD_PRIME:                         return L"Blue SD Prime";\r
140         case CRD_BLUE_EPOCH_2K_CORE:            return L"Blue Epoch 2K Core";\r
141         case CRD_BLUE_EPOCH_2K_ULTRA:           return L"Blue Epoch 2K Ultra";\r
142         case CRD_BLUE_EPOCH_HORIZON:            return L"Blue Epoch Horizon";\r
143         case CRD_BLUE_EPOCH_CORE:                       return L"Blue Epoch Core";\r
144         case CRD_BLUE_EPOCH_ULTRA:                      return L"Blue Epoch Ultra";\r
145         case CRD_BLUE_CREATE_HD:                        return L"Blue Create HD";\r
146         case CRD_BLUE_CREATE_2K:                        return L"Blue Create 2K";\r
147         case CRD_BLUE_CREATE_2K_ULTRA:          return L"Blue Create 2K Ultra";\r
148         default:                                                        return L"Unknown";\r
149         }\r
150 }\r
151 \r
152 EVideoMode get_video_mode(CBlueVelvet4& blue, const core::video_format_desc& format_desc)\r
153 {\r
154         EVideoMode vid_fmt = VID_FMT_INVALID;\r
155         auto desiredVideoFormat = vid_fmt_from_video_format(format_desc.format);\r
156         int videoModeCount = blue.count_video_mode();\r
157         for(int videoModeIndex = 1; videoModeIndex <= videoModeCount; ++videoModeIndex) \r
158         {\r
159                 EVideoMode videoMode = blue.enum_video_mode(videoModeIndex);\r
160                 if(videoMode == desiredVideoFormat) \r
161                         vid_fmt = videoMode;                    \r
162         }\r
163         if(vid_fmt == VID_FMT_INVALID)\r
164                 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("video-mode not supported.") << arg_value_info(narrow(format_desc.name)));\r
165 \r
166         return vid_fmt;\r
167 }\r
168 \r
169 safe_ptr<CBlueVelvet4> create_blue()\r
170 {\r
171         if(!BlueVelvetFactory4 || !encode_hanc_frame || !encode_hanc_frame)\r
172                 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Bluefish drivers not found."));\r
173 \r
174         return safe_ptr<CBlueVelvet4>(BlueVelvetFactory4(), BlueVelvetDestroy);\r
175 }\r
176 \r
177 safe_ptr<CBlueVelvet4> create_blue(size_t device_index)\r
178 {\r
179         auto blue = create_blue();\r
180         \r
181         if(BLUE_FAIL(blue->device_attach(device_index, FALSE))) \r
182                 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Failed to attach device."));\r
183 \r
184         return blue;\r
185 }\r
186 \r
187 }}