]> git.sesse.net Git - casparcg/blob - modules/bluefish/util/blue_velvet.cpp
ae938082fac4a7d9afc2dc445dffa9c17363b59d
[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         auto module = LoadLibrary(L"BlueVelvet3_d.dll");\r
21 #else\r
22         auto module = LoadLibrary(L"BlueVelvet3.dll");\r
23 #endif\r
24         if(!module)\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
30 }\r
31 \r
32 void blue_hanc_initialize()\r
33 {\r
34 #ifdef _DEBUG\r
35         auto module = LoadLibrary(L"BlueHancUtils_d.dll");\r
36 #else\r
37         auto module = LoadLibrary(L"BlueHancUtils.dll");\r
38 #endif\r
39         if(!module)\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
44 }\r
45 \r
46 void blue_initialize()\r
47 {\r
48         blue_velvet_initialize();\r
49         blue_hanc_initialize();\r
50 }\r
51 \r
52 EVideoMode vid_fmt_from_video_format(const core::video_format::type& fmt) \r
53 {\r
54         switch(fmt)\r
55         {\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
73         }\r
74 }\r
75 \r
76 bool is_epoch_card(CBlueVelvet4& blue)\r
77 {\r
78         switch(blue.has_video_cardtype())\r
79         {\r
80         case CRD_BLUE_EPOCH_HORIZON:\r
81         case CRD_BLUE_EPOCH_CORE:\r
82         case CRD_BLUE_EPOCH_ULTRA:\r
83         case CRD_BLUE_EPOCH_2K_HORIZON:\r
84         case CRD_BLUE_EPOCH_2K_CORE:\r
85         case CRD_BLUE_EPOCH_2K_ULTRA:\r
86         case CRD_BLUE_CREATE_HD:\r
87         case CRD_BLUE_CREATE_2K:\r
88         case CRD_BLUE_CREATE_2K_ULTRA:\r
89         case CRD_BLUE_SUPER_NOVA:\r
90                 return true;\r
91         default:\r
92                 return false;\r
93         }\r
94 }\r
95 \r
96 std::wstring get_card_desc(CBlueVelvet4& blue)\r
97 {\r
98         switch(blue.has_video_cardtype()) \r
99         {\r
100         case CRD_BLUEDEEP_LT:                           return L"Deepblue LT";// D64 Lite\r
101         case CRD_BLUEDEEP_SD:                           return L"Iridium SD";// Iridium SD\r
102         case CRD_BLUEDEEP_AV:                           return L"Iridium AV";// Iridium AV\r
103         case CRD_BLUEDEEP_IO:                           return L"Deepblue IO";// D64 Full\r
104         case CRD_BLUEWILD_AV:                           return L"Wildblue AV";// D64 AV\r
105         case CRD_IRIDIUM_HD:                            return L"Iridium HD";// * Iridium HD\r
106         case CRD_BLUEWILD_RT:                           return L"Wildblue RT";// D64 RT\r
107         case CRD_BLUEWILD_HD:                           return L"Wildblue HD";// * BadAss G2\r
108         case CRD_REDDEVIL:                                      return L"Iridium Full";// Iridium Full\r
109         case CRD_BLUEDEEP_HD:   \r
110         case CRD_BLUEDEEP_HDS:                          return L"Reserved for \"BasAss G2";// * BadAss G2 variant, proposed, reserved\r
111         case CRD_BLUE_ENVY:                                     return L"Blue Envy"; // Mini Din \r
112         case CRD_BLUE_PRIDE:                            return L"Blue Pride";//Mini Din Output \r
113         case CRD_BLUE_GREED:                            return L"Blue Greed";\r
114         case CRD_BLUE_INGEST:                           return L"Blue Ingest";\r
115         case CRD_BLUE_SD_DUALLINK:                      return L"Blue SD Duallink";\r
116         case CRD_BLUE_CATALYST:                         return L"Blue Catalyst";\r
117         case CRD_BLUE_SD_DUALLINK_PRO:          return L"Blue SD Duallink Pro";\r
118         case CRD_BLUE_SD_INGEST_PRO:            return L"Blue SD Ingest pro";\r
119         case CRD_BLUE_SD_DEEPBLUE_LITE_PRO:     return L"Blue SD Deepblue lite Pro";\r
120         case CRD_BLUE_SD_SINGLELINK_PRO:        return L"Blue SD Singlelink Pro";\r
121         case CRD_BLUE_SD_IRIDIUM_AV_PRO:        return L"Blue SD Iridium AV Pro";\r
122         case CRD_BLUE_SD_FIDELITY:                      return L"Blue SD Fidelity";\r
123         case CRD_BLUE_SD_FOCUS:                         return L"Blue SD Focus";\r
124         case CRD_BLUE_SD_PRIME:                         return L"Blue SD Prime";\r
125         case CRD_BLUE_EPOCH_2K_CORE:            return L"Blue Epoch 2K Core";\r
126         case CRD_BLUE_EPOCH_2K_ULTRA:           return L"Blue Epoch 2K Ultra";\r
127         case CRD_BLUE_EPOCH_HORIZON:            return L"Blue Epoch Horizon";\r
128         case CRD_BLUE_EPOCH_CORE:                       return L"Blue Epoch Core";\r
129         case CRD_BLUE_EPOCH_ULTRA:                      return L"Blue Epoch Ultra";\r
130         case CRD_BLUE_CREATE_HD:                        return L"Blue Create HD";\r
131         case CRD_BLUE_CREATE_2K:                        return L"Blue Create 2K";\r
132         case CRD_BLUE_CREATE_2K_ULTRA:          return L"Blue Create 2K Ultra";\r
133         default:                                                        return L"Unknown";\r
134         }\r
135 }\r
136 \r
137 EVideoMode get_video_mode(CBlueVelvet4& blue, const core::video_format_desc& format_desc)\r
138 {\r
139         EVideoMode vid_fmt = VID_FMT_INVALID;\r
140         auto desiredVideoFormat = vid_fmt_from_video_format(format_desc.format);\r
141         int videoModeCount = blue.count_video_mode();\r
142         for(int videoModeIndex = 1; videoModeIndex <= videoModeCount; ++videoModeIndex) \r
143         {\r
144                 EVideoMode videoMode = blue.enum_video_mode(videoModeIndex);\r
145                 if(videoMode == desiredVideoFormat) \r
146                         vid_fmt = videoMode;                    \r
147         }\r
148         if(vid_fmt == VID_FMT_INVALID)\r
149                 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("video-mode not supported.") << arg_value_info(narrow(format_desc.name)));\r
150 \r
151         return vid_fmt;\r
152 }\r
153 \r
154 safe_ptr<CBlueVelvet4> create_blue()\r
155 {\r
156         if(!BlueVelvetFactory4 || !encode_hanc_frame || !encode_hanc_frame)\r
157                 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Bluefish drivers not found."));\r
158 \r
159         return safe_ptr<CBlueVelvet4>(BlueVelvetFactory4(), BlueVelvetDestroy);\r
160 }\r
161 \r
162 safe_ptr<CBlueVelvet4> create_blue(size_t device_index)\r
163 {\r
164         auto blue = create_blue();\r
165         \r
166         if(BLUE_FAIL(blue->device_attach(device_index, FALSE))) \r
167                 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Failed to attach device."));\r
168 \r
169         return blue;\r
170 }\r
171 \r
172 }}