]> git.sesse.net Git - casparcg/blob - modules/decklink/util/util.h
2.0.0.2:
[casparcg] / modules / decklink / util / util.h
1 /*\r
2 * copyright (c) 2010 Sveriges Television AB <info@casparcg.com>\r
3 *\r
4 *  This file is part of CasparCG.\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 */\r
20 #pragma once\r
21 \r
22 #include <common/exception/exceptions.h>\r
23 #include <core/video_format.h>\r
24 \r
25 #include "../interop/DeckLinkAPI_h.h"\r
26 \r
27 #include <atlbase.h>\r
28 \r
29 namespace caspar { \r
30         \r
31 static BMDDisplayMode get_decklink_video_format(core::video_format::type fmt) \r
32 {\r
33         switch(fmt)\r
34         {\r
35         case core::video_format::pal:                   return bmdModePAL;\r
36         case core::video_format::ntsc:                  return bmdModeNTSC;\r
37         case core::video_format::x576p2500:             return (BMDDisplayMode)ULONG_MAX;\r
38         case core::video_format::x720p2500:             return (BMDDisplayMode)ULONG_MAX;\r
39         case core::video_format::x720p5000:             return bmdModeHD720p50;\r
40         case core::video_format::x720p5994:             return bmdModeHD720p5994;\r
41         case core::video_format::x720p6000:             return bmdModeHD720p60;\r
42         case core::video_format::x1080p2397:    return bmdModeHD1080p2398;\r
43         case core::video_format::x1080p2400:    return bmdModeHD1080p24;\r
44         case core::video_format::x1080i5000:    return bmdModeHD1080i50;\r
45         case core::video_format::x1080i5994:    return bmdModeHD1080i5994;\r
46         case core::video_format::x1080i6000:    return bmdModeHD1080i6000;\r
47         case core::video_format::x1080p2500:    return bmdModeHD1080p25;\r
48         case core::video_format::x1080p2997:    return bmdModeHD1080p2997;\r
49         case core::video_format::x1080p3000:    return bmdModeHD1080p30;\r
50         default:                                                                return (BMDDisplayMode)ULONG_MAX;\r
51         }\r
52 }\r
53         \r
54 template<typename T>\r
55 static CComPtr<IDeckLinkDisplayMode> get_display_mode(const T& device, BMDDisplayMode format)\r
56 {\r
57         CComPtr<IDeckLinkDisplayModeIterator> iterator;\r
58         CComPtr<IDeckLinkDisplayMode>             mode;\r
59         \r
60         if(FAILED(device->GetDisplayModeIterator(&iterator)))\r
61                 return nullptr;\r
62 \r
63         while(SUCCEEDED(iterator->Next(&mode)) && mode != nullptr)\r
64         {       \r
65                 if(mode->GetDisplayMode() == format)\r
66                         return mode;\r
67         }\r
68 \r
69         return nullptr;\r
70 }\r
71 \r
72 template<typename T>\r
73 static CComPtr<IDeckLinkDisplayMode> get_display_mode(const T& output, core::video_format::type fmt)\r
74 {       \r
75         return get_display_mode(output, get_decklink_video_format(fmt));\r
76 }\r
77 \r
78 template<typename T>\r
79 static std::wstring get_version(T& iterator)\r
80 {\r
81         CComQIPtr<IDeckLinkAPIInformation> info = iterator;\r
82         if (!info)\r
83                 return L"Unknown";\r
84         \r
85         BSTR ver;               \r
86         info->GetString(BMDDeckLinkAPIVersion, &ver);\r
87                 \r
88         return ver;                                     \r
89 }\r
90 \r
91 static CComPtr<IDeckLink> get_device(size_t device_index)\r
92 {\r
93         CComPtr<IDeckLinkIterator> pDecklinkIterator;\r
94         if(FAILED(pDecklinkIterator.CoCreateInstance(CLSID_CDeckLinkIterator)))\r
95                 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("No Decklink drivers installed."));\r
96                 \r
97         size_t n = 0;\r
98         CComPtr<IDeckLink> decklink;\r
99         while(n < device_index && pDecklinkIterator->Next(&decklink) == S_OK){++n;}     \r
100 \r
101         if(n != device_index || !decklink)\r
102                 BOOST_THROW_EXCEPTION(caspar_exception() << msg_info("Decklink card not found.") << arg_name_info("device_index") << arg_value_info(boost::lexical_cast<std::string>(device_index)));\r
103                 \r
104         return decklink;\r
105 }\r
106 \r
107 template <typename T>\r
108 static std::wstring get_model_name(const T& device)\r
109 {       \r
110         BSTR pModelName;\r
111         device->GetModelName(&pModelName);\r
112         return std::wstring(pModelName);\r
113 }\r
114 \r
115 }