]> git.sesse.net Git - casparcg/blob - modules/bluefish/util/blue_velvet.cpp
2.0. Updated namespaces.
[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_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
86                 return true;\r
87         default:\r
88                 return false;\r
89         }\r
90 }\r
91 \r
92 std::wstring get_card_desc(CBlueVelvet4& blue)\r
93 {\r
94         switch(blue.has_video_cardtype()) \r
95         {\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
130         }\r
131 }\r
132 \r
133 EVideoMode get_video_mode(CBlueVelvet4& blue, const core::video_format_desc& format_desc)\r
134 {\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
139         {\r
140                 EVideoMode videoMode = blue.enum_video_mode(videoModeIndex);\r
141                 if(videoMode == desiredVideoFormat) \r
142                         vid_fmt = videoMode;                    \r
143         }\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
146 \r
147         return vid_fmt;\r
148 }\r
149 \r
150 safe_ptr<CBlueVelvet4> create_blue()\r
151 {\r
152         if(!BlueVelvetFactory4 || !encode_hanc_frame || !encode_hanc_frame)\r
153                 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Bluefish drivers not found."));\r
154 \r
155         return safe_ptr<CBlueVelvet4>(BlueVelvetFactory4(), BlueVelvetDestroy);\r
156 }\r
157 \r
158 safe_ptr<CBlueVelvet4> create_blue(size_t device_index)\r
159 {\r
160         auto blue = create_blue();\r
161         \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
164 \r
165         return blue;\r
166 }\r
167 \r
168 }}