UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
deltacast_common.hpp
Go to the documentation of this file.
1
5/*
6 * Copyright (c) 2014-2020 CESNET, z. s. p. o.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, is permitted provided that the following conditions
11 * are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 *
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 *
20 * 3. Neither the name of CESNET nor the names of its contributors may be
21 * used to endorse or promote products derived from this software without
22 * specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS
25 * "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
26 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
27 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
28 * EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
29 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
34 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
35 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#ifndef DELTACAST_COMMON_H
39#define DELTACAST_COMMON_H
40
41#include <iostream>
42#include <map>
43#include <string>
44#include <unordered_map>
45#ifdef __APPLE__
46#include <VideoMasterHD/VideoMasterHD_Core.h>
47#ifdef ENUMBASE_DV
48#include <VideoMasterHD/VideoMasterHD_Dv.h>
49#else
50#include <VideoMasterHD/VideoMasterHD_Dvi.h>
51#endif
52#include <VideoMasterHD/VideoMasterHD_Sdi.h>
53#include <VideoMasterHD_Audio/VideoMasterHD_Sdi_Audio.h>
54#else
55#include <VideoMasterHD_Core.h>
56#ifdef ENUMBASE_DV
57#include <VideoMasterHD_Dv.h>
58#else
59#include <VideoMasterHD_Dvi.h>
60#endif
61#include <VideoMasterHD_Sdi.h>
62#include <VideoMasterHD_Sdi_Audio.h>
63#endif
64
65#ifdef _WIN32
66#define PRIu_ULONG "lu"
67#define PRIX_ULONG "lX"
68#else
69#include <cinttypes>
70#define PRIu_ULONG PRIu32
71#define PRIX_ULONG PRIX32
72#endif
73
74#include "debug.h"
75#include "types.h"
76#include "utils/color_out.h"
77
78#if defined VHD_DV_SP_INPUT_CS // (VideoMasterHD 6.14)
79#define DELTA_DVI_DEPRECATED 1
80#endif
81
82#ifdef __APPLE__
83#include <VideoMasterHD/VideoMasterHD_Ip_Board.h>
84#else
85#include <VideoMasterHD_Ip_Board.h>
86#endif
87#if defined VHD_IP_FILTER_UDP_PORT_DEST
88#define VHD_MIN_6_19 1
89#endif
90
91// compat
92#ifdef DELTA_DVI_DEPRECATED
93#define VHD_BOARDTYPE_DVI VHD_BOARDTYPE_DVI_DEPRECATED
94#define VHD_BOARDTYPE_HDKEY VHD_BOARDTYPE_HDKEY_DEPRECATED
95#endif
96// Following items have been actually deprecated in 6.20. But 6.20 doesn't
97// bring any new define and thus it is undistinguishable from 6.19. As a
98// consequence, it won't compile with 6.19.
99#if defined VHD_MIN_6_19
100#define VHD_BOARDTYPE_SD VHD_BOARDTYPE_SD_DEPRECATED
101#define VHD_BOARDTYPE_SDKEY VHD_BOARDTYPE_SDKEY_DEPRECATED
102#define VHD_CHNTYPE_SDSDI VHD_CHNTYPE_SDSDI_DEPRECATED
103#ifndef VHD_CORE_BP_BYPASS_RELAY_0 // not defined in 6.20
104// VHD_BOARDTYPE_HDMI is not deprecated anymore in 6.21
105#define VHD_BOARDTYPE_HDMI VHD_BOARDTYPE_HDMI_DEPRECATED
106#endif
107#endif
108
110 int mode;
111 const char * name;
112 unsigned int width;
113 unsigned int height;
114 double fps;
116 unsigned long int iface;
117};
118
120 {VHD_VIDEOSTD_S274M_1080p_25Hz, "SMPTE 274M 1080p 25 Hz",
121 1920u, 1080u, 25.0, PROGRESSIVE, VHD_INTERFACE_AUTO},
122 {VHD_VIDEOSTD_S274M_1080p_30Hz, "SMPTE 274M 1080p 29.97 Hz",
123 1920u, 1080u, 29.97, PROGRESSIVE, VHD_INTERFACE_AUTO},
124 {VHD_VIDEOSTD_S274M_1080p_30Hz, "SMPTE 274M 1080p 30 Hz",
125 1920u, 1080u, 30.0, PROGRESSIVE, VHD_INTERFACE_AUTO},
126 {VHD_VIDEOSTD_S274M_1080i_50Hz, "SMPTE 274M 1080i 50 Hz",
127 1920u, 1080u, 25.0, UPPER_FIELD_FIRST, VHD_INTERFACE_AUTO},
128 {VHD_VIDEOSTD_S274M_1080i_60Hz, "SMPTE 274M 1080i 59.94 Hz",
129 1920u, 1080u, 29.97, UPPER_FIELD_FIRST, VHD_INTERFACE_AUTO},
130 {VHD_VIDEOSTD_S274M_1080i_60Hz, "SMPTE 274M 1080i 60 Hz",
131 1920u, 1080u, 30.0, UPPER_FIELD_FIRST, VHD_INTERFACE_AUTO},
132 {VHD_VIDEOSTD_S296M_720p_50Hz, "SMPTE 296M 720p 50 Hz",
133 1280u, 720u, 50.0, PROGRESSIVE, VHD_INTERFACE_AUTO},
134 {VHD_VIDEOSTD_S296M_720p_60Hz, "SMPTE 296M 720p 59.94 Hz",
135 1280u, 720u, 59.94, PROGRESSIVE, VHD_INTERFACE_AUTO},
136 {VHD_VIDEOSTD_S296M_720p_60Hz, "SMPTE 296M 720p 60 Hz",
137 1280u, 720u, 60.0, PROGRESSIVE, VHD_INTERFACE_AUTO},
138 {VHD_VIDEOSTD_S259M_PAL, "SMPTE 259M PAL",
139 720u, 576u, 25.0, UPPER_FIELD_FIRST, VHD_INTERFACE_AUTO},
140 {VHD_VIDEOSTD_S259M_NTSC, "SMPTE 259M NTSC",
141 720u, 487u, 29.97, UPPER_FIELD_FIRST, VHD_INTERFACE_AUTO},
142 {VHD_VIDEOSTD_S274M_1080p_24Hz, "SMPTE 274M 1080p 23.98 Hz",
143 1920u, 1080u, 23.98, PROGRESSIVE, VHD_INTERFACE_AUTO},
144 {VHD_VIDEOSTD_S274M_1080p_24Hz, "SMPTE 274M 1080p 24 Hz",
145 1920u, 1080u, 24.0, PROGRESSIVE, VHD_INTERFACE_AUTO},
146 {VHD_VIDEOSTD_S274M_1080p_60Hz, "SMPTE 274M 1080p 59.94 Hz",
147 1920u, 1080u, 59.94, PROGRESSIVE, VHD_INTERFACE_AUTO},
148 {VHD_VIDEOSTD_S274M_1080p_60Hz, "SMPTE 274M 1080p 60 Hz",
149 1920u, 1080u, 60.0, PROGRESSIVE, VHD_INTERFACE_AUTO},
150 {VHD_VIDEOSTD_S274M_1080p_24Hz, "SMPTE 274M 1080p 50 Hz",
151 1920u, 1080u, 50.0, PROGRESSIVE, VHD_INTERFACE_AUTO},
152 {VHD_VIDEOSTD_S274M_1080psf_24Hz, "SMPTE 274M 1080psf 23.98 Hz",
153 1920u, 1080u, 23.98, SEGMENTED_FRAME, VHD_INTERFACE_AUTO},
154 {VHD_VIDEOSTD_S274M_1080psf_24Hz, "SMPTE 274M 1080psf 24 Hz",
155 1920u, 1080u, 24.0, SEGMENTED_FRAME, VHD_INTERFACE_AUTO},
156 {VHD_VIDEOSTD_S274M_1080psf_25Hz, "SMPTE 274M 1080psf 25 Hz",
157 1920u, 1080u, 25.0, SEGMENTED_FRAME, VHD_INTERFACE_AUTO},
158 {VHD_VIDEOSTD_S274M_1080psf_30Hz, "SMPTE 274M 1080psf 29.97 Hz",
159 1920u, 1080u, 29.97, SEGMENTED_FRAME, VHD_INTERFACE_AUTO},
160 {VHD_VIDEOSTD_S274M_1080psf_30Hz, "SMPTE 274M 1080psf 30 Hz",
161 1920u, 1080u, 30.0, SEGMENTED_FRAME, VHD_INTERFACE_AUTO},
162 // UHD modes
163 {VHD_VIDEOSTD_3840x2160p_24Hz, "3840x2160 24 Hz",
164 3840u, 2160u, 24.0, PROGRESSIVE, VHD_INTERFACE_4XHD},
165 {VHD_VIDEOSTD_3840x2160p_25Hz, "3840x2160 25 Hz",
166 3840u, 2160u, 25.0, PROGRESSIVE, VHD_INTERFACE_4XHD},
167 {VHD_VIDEOSTD_3840x2160p_30Hz, "3840x2160 30 Hz",
168 3840u, 2160u, 30.0, PROGRESSIVE, VHD_INTERFACE_4XHD},
169 {VHD_VIDEOSTD_3840x2160p_50Hz, "3840x2160 50 Hz",
170 3840u, 2160u, 50.0, PROGRESSIVE, VHD_INTERFACE_4X3G_A},
171 {VHD_VIDEOSTD_3840x2160p_60Hz, "3840x2160 60 Hz",
172 3840u, 2160u, 60.0, PROGRESSIVE, VHD_INTERFACE_4X3G_A},
173 {VHD_VIDEOSTD_4096x2160p_24Hz, "4096x2160 24 Hz",
174 4096u, 2160u, 24.0, PROGRESSIVE, VHD_INTERFACE_4XHD},
175 {VHD_VIDEOSTD_4096x2160p_25Hz, "4096x2160 25 Hz",
176 4096u, 2160u, 25.0, PROGRESSIVE, VHD_INTERFACE_4XHD},
177 {VHD_VIDEOSTD_4096x2160p_25Hz, "4096x2160 25 Hz",
178 4096u, 2160u, 25.0, PROGRESSIVE, VHD_INTERFACE_4XHD},
179 {VHD_VIDEOSTD_4096x2160p_48Hz, "4096x2160 48 Hz",
180 4096u, 2160u, 48.0, PROGRESSIVE, VHD_INTERFACE_4X3G_A},
181 {VHD_VIDEOSTD_4096x2160p_50Hz, "4096x2160 50 Hz",
182 4096u, 2160u, 50.0, PROGRESSIVE, VHD_INTERFACE_4X3G_A},
183 {VHD_VIDEOSTD_4096x2160p_60Hz, "4096x2160 60 Hz",
184 4096u, 2160u, 60.0, PROGRESSIVE, VHD_INTERFACE_4X3G_A},
185};
186
188
189static std::unordered_map<ULONG, std::string> board_type_map = {
190 { VHD_BOARDTYPE_HD, "HD board type" },
191 { VHD_BOARDTYPE_HDKEY, "HD key board type" },
192 { VHD_BOARDTYPE_SD, "SD board type"},
193 { VHD_BOARDTYPE_SDKEY, "SD key board type"},
194 { VHD_BOARDTYPE_DVI, "DVI board type"},
195 { VHD_BOARDTYPE_CODEC, "CODEC board type"},
196 { VHD_BOARDTYPE_3G, "3G board type"},
197 { VHD_BOARDTYPE_3GKEY, "3G key board type"},
198 { VHD_BOARDTYPE_HDMI, "HDMI board type"},
199};
200
204static const char *delta_get_error_description(ULONG CodeError) __attribute__((unused));
205static const char *delta_get_error_description(ULONG CodeError)
206{
207 switch (CodeError)
208 {
209 case VHDERR_NOERROR: return "No error";
210 case VHDERR_FATALERROR: return "Fatal error occurred (should re-install)";
211 case VHDERR_OPERATIONFAILED: return "Operation failed (undefined error)";
212 case VHDERR_NOTENOUGHRESOURCE: return "Not enough resource to complete the operation";
213 case VHDERR_NOTIMPLEMENTED: return "Not implemented yet";
214 case VHDERR_NOTFOUND: return "Required element was not found";
215 case VHDERR_BADARG: return "Bad argument value";
216 case VHDERR_INVALIDPOINTER: return "Invalid pointer";
217 case VHDERR_INVALIDHANDLE: return "Invalid handle";
218 case VHDERR_INVALIDPROPERTY: return "Invalid property index";
219 case VHDERR_INVALIDSTREAM: return "Invalid stream or invalid stream type";
220 case VHDERR_RESOURCELOCKED: return "Resource is currently locked";
221 case VHDERR_BOARDNOTPRESENT: return "Board is not available";
222 case VHDERR_INCOHERENTBOARDSTATE: return "Incoherent board state or register value";
223 case VHDERR_INCOHERENTDRIVERSTATE: return "Incoherent driver state";
224 case VHDERR_INCOHERENTLIBSTATE: return "Incoherent library state";
225 case VHDERR_SETUPLOCKED: return "Configuration is locked";
226 case VHDERR_CHANNELUSED: return "Requested channel is already used or doesn't exist";
227 case VHDERR_STREAMUSED: return "Requested stream is already used";
228 case VHDERR_READONLYPROPERTY: return "Property is read-only";
229 case VHDERR_OFFLINEPROPERTY: return "Property is off-line only";
230 case VHDERR_TXPROPERTY: return "Property is of TX streams";
231 case VHDERR_TIMEOUT: return "Time-out occurred";
232 case VHDERR_STREAMNOTRUNNING: return "Stream is not running";
233 case VHDERR_BADINPUTSIGNAL: return "Bad input signal, or unsupported standard";
234 case VHDERR_BADREFERENCESIGNAL: return "Bad genlock signal or unsupported standard";
235 case VHDERR_FRAMELOCKED: return "Frame already locked";
236 case VHDERR_FRAMEUNLOCKED: return "Frame already unlocked";
237 case VHDERR_INCOMPATIBLESYSTEM: return "Selected video standard is incompatible with running clock system";
238 case VHDERR_ANCLINEISEMPTY: return "ANC line is empty";
239 case VHDERR_ANCLINEISFULL: return "ANC line is full";
240 case VHDERR_BUFFERTOOSMALL: return "Buffer too small";
241 case VHDERR_BADANC: return "Received ANC aren't standard";
242 case VHDERR_BADCONFIG: return "Invalid configuration";
243 case VHDERR_FIRMWAREMISMATCH: return "The loaded firmware is not compatible with the installed driver";
244 case VHDERR_LIBRARYMISMATCH: return "The loaded VideomasterHD library is not compatible with the installed driver";
245 case VHDERR_FAILSAFE: return "The fail safe firmware is loaded. You need to upgrade your firmware";
246 case VHDERR_RXPROPERTY: return "Property is of RX streams";
247 case VHDERR_ALREADYINITIALIZED: return "Already initialized";
248 case VHDERR_NOTINITIALIZED: return "Not initialized";
249 case VHDERR_CROSSTHREAD: return "Cross-thread";
250 case VHDERR_INCOHERENTDATA: return "Incoherent data";
251 case VHDERR_BADSIZE: return "Bad size";
252 case VHDERR_WAKEUP: return "Wake up";
253 case VHDERR_DEVICE_REMOVED: return "Device removed";
254 case VHDERR_LTCSOURCEUNLOCKED: return "LTC source unlocked";
255 case VHDERR_INVALIDACCESSRIGHT: return "Invalid access right";
256 case VHDERR_INVALIDCAPABILITY: return "Invalid capability index";
257#ifdef DELTA_DVI_DEPRECATED
258 case VHDERR_DEPRECATED: return "Symbol is deprecated";
259#endif
260 default: return "Unknown code error";
261 }
262}
263
264static auto delta_format_version(uint32_t version, bool long_out) -> std::string
265{
266 using namespace std::string_literals;
267 std::string out = std::to_string(version >> 24U) + "."s + std::to_string((version >> 16U) & 0xFFU);
268 if (long_out) {
269 out += std::to_string((version >> 8U) & 0xFFU) + "."s + std::to_string(version & 0xFFU);
270 }
271 return out;
272}
273
275 ULONG Result,DllVersion,NbBoards;
276 Result = VHD_GetApiInfo(&DllVersion,&NbBoards);
277 if (Result != VHDERR_NOERROR) {
278 log_msg(LOG_LEVEL_ERROR, "[DELTACAST] ERROR : Cannot query VideoMasterHD"
279 " information. Result = 0x%08" PRIX_ULONG "\n",
280 Result);
281 return;
282 }
283 std::cout << "\t\tAPI version: " << delta_format_version(DllVersion, false) << "\n";
284 if (NbBoards == 0) {
285 log_msg(LOG_LEVEL_ERROR, "[DELTACAST] No DELTA board detected, exiting...\n");
286 return;
287 }
288
289 std::cout << "\n\t\tAvailable cards:\n";
290 /* Query DELTA boards information */
291 for (ULONG i = 0; i < NbBoards; i++)
292 {
293 ULONG BoardType = 0U;
294 ULONG DriverVersion = 0U;
295 HANDLE BoardHandle = NULL;
296 ULONG Result = VHD_OpenBoardHandle(i,&BoardHandle,NULL,0);
297 if (Result != VHDERR_NOERROR) {
298 LOG(LOG_LEVEL_ERROR) << "[DELTACAST] Unable to open board " << i << ": " << delta_get_error_description(Result) << "\n";
299 continue;
300 }
301 Result = VHD_GetBoardProperty(BoardHandle, VHD_CORE_BP_BOARD_TYPE, &BoardType);
302 if (Result != VHDERR_NOERROR) {
303 LOG(LOG_LEVEL_ERROR) << "[DELTACAST] Unable to get board " << i << " type: " << delta_get_error_description(Result) << "\n";
304 continue;
305 }
306 Result = VHD_GetBoardProperty(BoardHandle, VHD_CORE_BP_DRIVER_VERSION, &DriverVersion);
307 if (Result != VHDERR_NOERROR) {
308 LOG(LOG_LEVEL_ERROR) << "[DELTACAST] Unable to get board " << i << " version: " << delta_get_error_description(Result) << "\n";
309 }
310
311 std::string board{"Unknown board type"};
312 auto it = board_type_map.find(BoardType);
313 if (it != board_type_map.end()) {
314 board = it->second;
315 }
316 col() << "\t\t\tBoard " << SBOLD(i) << ": " << SBOLD(board) << " (driver: " << delta_format_version(DriverVersion, false) << ")\n";
317 if ((DllVersion >> 16U) != (DriverVersion >> 16U)) {
318 LOG(LOG_LEVEL_WARNING) << "[DELTACAST] API and driver version mismatch: " << delta_format_version(DllVersion, true) << " vs " << delta_format_version(DriverVersion, true) << "\n";
319 }
320 VHD_CloseBoardHandle(BoardHandle);
321 }
322 std::cout << "\n";
323}
324
325[[gnu::unused]] static bool delta_set_nb_channels(ULONG BrdId, HANDLE BoardHandle, ULONG RequestedRx, ULONG RequestedTx) {
326 ULONG Result;
327 ULONG NbRxOnBoard = 0;
328 ULONG NbTxOnBoard = 0;
329 ULONG NbChanOnBoard;
330 BOOL32 IsBiDir = FALSE;
331
332 Result = VHD_GetBoardProperty(BoardHandle, VHD_CORE_BP_NB_RXCHANNELS, &NbRxOnBoard);
333 if (Result != VHDERR_NOERROR) {
334 log_msg(LOG_LEVEL_ERROR, "[DELTACAST] ERROR: Cannot get number of RX channels. Result = 0x%08" PRIX_ULONG "\n", Result);
335 return false;
336 }
337
338 Result = VHD_GetBoardProperty(BoardHandle, VHD_CORE_BP_NB_TXCHANNELS, &NbTxOnBoard);
339 if (Result != VHDERR_NOERROR) {
340 log_msg(LOG_LEVEL_ERROR, "[DELTACAST] ERROR: Cannot get number of TX channels. Result = 0x%08" PRIX_ULONG "\n", Result);
341 return false;
342 }
343
344 if (NbRxOnBoard >= RequestedRx && NbTxOnBoard >= RequestedTx) {
345 return true;
346 }
347
348 Result = VHD_GetBoardProperty(BoardHandle, VHD_CORE_BP_IS_BIDIR, (ULONG*)&IsBiDir);
349 if (Result != VHDERR_NOERROR) {
350 log_msg(LOG_LEVEL_ERROR, "[DELTACAST] ERROR: Cannot check whether board channels are bidirectional. Result = 0x%08" PRIX_ULONG "\n", Result);
351 return false;
352 }
353
354 NbChanOnBoard = NbRxOnBoard + NbTxOnBoard;
355
356 if (IsBiDir && NbChanOnBoard >= (RequestedRx + RequestedTx)) {
357 std::map<std::pair<ULONG, ULONG>, ULONG> mapping = { // key - (NbChanOnBoard, RequestedRX), value - member of VHD_BIDIRCFG_2C, VHD_BIDIRCFG_4C or VHD_BIDIRCFG_8C
358 //{{2, 0}, VHD_BIDIR_02},
359 //{{2, 1}, VHD_BIDIR_11},
360 //{{2, 2}, VHD_BIDIR_20},
361
362 {{4, 0}, VHD_BIDIR_04},
363 {{4, 1}, VHD_BIDIR_13},
364 {{4, 2}, VHD_BIDIR_22},
365 {{4, 3}, VHD_BIDIR_31},
366 {{4, 4}, VHD_BIDIR_40},
367
368 {{8, 0}, VHD_BIDIR_08},
369 {{8, 1}, VHD_BIDIR_17},
370 {{8, 2}, VHD_BIDIR_26},
371 {{8, 3}, VHD_BIDIR_35},
372 {{8, 4}, VHD_BIDIR_44},
373 {{8, 5}, VHD_BIDIR_53},
374 {{8, 6}, VHD_BIDIR_62},
375 {{8, 7}, VHD_BIDIR_71},
376 {{8, 8}, VHD_BIDIR_80}
377 };
378 auto it = mapping.find({NbChanOnBoard, RequestedRx});
379 if (it != mapping.end()) {
380 Result = VHD_SetBiDirCfg(BrdId, it->second);
381 if (Result != VHDERR_NOERROR) {
382 log_msg(LOG_LEVEL_ERROR, "[DELTACAST] ERROR: Cannot bidirectional set bidirectional channels. Result = 0x%08" PRIX_ULONG "\n", Result);
383 return false;
384 } else {
385 log_msg(LOG_LEVEL_VERBOSE, "[DELTACAST] Successfully bidirectional channels.\n");
386 return true;
387 }
388 }
389 }
390
391 log_msg(LOG_LEVEL_ERROR, "[DELTACAST] ERROR: Insufficient number of channels - requested %" PRIu_ULONG " RX + %" PRIu_ULONG " TX, got %" PRIu_ULONG " RX + %" PRIu_ULONG " TX. %s. Result = 0x%08" PRIX_ULONG "\n", RequestedRx, RequestedTx, NbRxOnBoard, NbTxOnBoard, IsBiDir ? "Bidirectional" : "Non-bidirectional", Result);
392 return false;
393}
394
395#endif // defined DELTACAST_COMMON_H
396
static const struct codec_param mapping[AC_COUNT]
Definition libavcodec.c:87
#define SBOLD(x)
Definition color_out.h:80
#define FALSE
void log_msg(int level, const char *format,...)
Definition debug.cpp:130
#define LOG_LEVEL_ERROR
general errors
Definition debug.h:59
#define LOG_LEVEL_VERBOSE
Definition debug.h:63
#define LOG(level)
Definition debug.h:313
#define LOG_LEVEL_WARNING
less severe errors
Definition debug.h:60
static void print_available_delta_boards()
static const int deltacast_frame_modes_count
static bool delta_set_nb_channels(ULONG BrdId, HANDLE BoardHandle, ULONG RequestedRx, ULONG RequestedTx)
#define PRIX_ULONG
static const char * delta_get_error_description(ULONG CodeError) __attribute__((unused))
static std::unordered_map< ULONG, std::string > board_type_map
static const struct deltacast_frame_mode_t deltacast_frame_modes[]
static auto delta_format_version(uint32_t version, bool long_out) -> std::string
#define PRIu_ULONG
struct __attribute__((packed))
Definition rtp.h:88
enum interlacing_t interlacing
This file contains some common data types.
interlacing_t
Definition types.h:163
@ UPPER_FIELD_FIRST
First stored field is top, followed by bottom.
Definition types.h:165
@ PROGRESSIVE
progressive frame
Definition types.h:164
@ SEGMENTED_FRAME
Segmented frame. Contains the same data as progressive frame.
Definition types.h:168