MythTV master
cardutil.h
Go to the documentation of this file.
1// -*- Mode: c++ -*-
2#ifndef CARDUTIL_H
3#define CARDUTIL_H
4
5// C++ headers
6#include <chrono>
7#include <cstdint>
8#include <vector>
9
10// Qt headers
11#include <QList>
12#include <QStringList>
13#include <QMap>
14#include <QMetaEnum>
15
16// MythTV headers
17#include "libmythbase/mythconfig.h"
18
19#include "mythtvexp.h"
21
22class InputInfo;
23class CardInput;
24using InputNames = QMap<int,QString>;
25
26MTV_PUBLIC QString get_on_input(const QString &to_get, uint inputid);
27
28MTV_PUBLIC bool set_on_input(const QString &to_set, uint inputid, const QString &value);
29
30enum dvb_dev_type_t : std::uint8_t
31{
38};
39
43class MTV_PUBLIC CardUtil : public QObject
44{
45 Q_OBJECT
46
47 public:
48 using InputTypes = QMap<QString, QString>;
49
51 enum class INPUT_TYPES : std::uint8_t
52 {
53 ERROR_OPEN = 0,
54 ERROR_UNKNOWN = 1,
55 ERROR_PROBE = 2,
56 QPSK = 3, DVBS = 3,
57 QAM = 4, DVBC = 4,
58 OFDM = 5, DVBT = 5,
59 ATSC = 6,
60 V4L = 7,
61 MPEG = 8,
62 FIREWIRE = 9,
63 HDHOMERUN = 10,
64 FREEBOX = 11,
65 HDPVR = 12,
66 DVBS2 = 13,
67 IMPORT = 14,
68 DEMO = 15,
69 ASI = 16,
70 CETON = 17,
71 EXTERNAL = 18,
72 VBOX = 19,
73 DVBT2 = 20,
74 V4L2ENC = 21,
75 SATIP = 22
76 };
77
78 Q_ENUM(INPUT_TYPES)
79
80 static INPUT_TYPES toInputType(const QString &name)
81 {
82 if ("ERROR_OPEN" == name)
83 return INPUT_TYPES::ERROR_OPEN;
84 if ("ERROR_UNKNOWN" == name)
85 return INPUT_TYPES::ERROR_UNKNOWN;
86 if ("ERROR_PROBE" == name)
87 return INPUT_TYPES::ERROR_PROBE;
88 if ("QPSK" == name)
89 return INPUT_TYPES::QPSK;
90 if ("DVBS" == name)
91 return INPUT_TYPES::DVBS;
92 if ("QAM" == name)
93 return INPUT_TYPES::QAM;
94 if ("DVBC" == name)
95 return INPUT_TYPES::DVBC;
96 if ("OFDM" == name)
97 return INPUT_TYPES::OFDM;
98 if ("DVBT" == name)
99 return INPUT_TYPES::DVBT;
100 if ("ATSC" == name)
101 return INPUT_TYPES::ATSC;
102 if ("V4L" == name)
103 return INPUT_TYPES::V4L;
104 if ("MPEG" == name)
105 return INPUT_TYPES::MPEG;
106 if ("FIREWIRE" == name)
107 return INPUT_TYPES::FIREWIRE;
108 if ("HDHOMERUN" == name)
109 return INPUT_TYPES::HDHOMERUN;
110 if ("FREEBOX" == name)
111 return INPUT_TYPES::FREEBOX;
112 if ("HDPVR" == name)
113 return INPUT_TYPES::HDPVR;
114 if ("DVB_S2" == name)
115 return INPUT_TYPES::DVBS2;
116 if ("IMPORT" == name)
117 return INPUT_TYPES::IMPORT;
118 if ("DEMO" == name)
119 return INPUT_TYPES::DEMO;
120 if ("ASI" == name)
121 return INPUT_TYPES::ASI;
122 if ("CETON" == name)
123 return INPUT_TYPES::CETON;
124 if ("EXTERNAL" == name)
125 return INPUT_TYPES::EXTERNAL;
126 if ("VBOX" == name)
127 return INPUT_TYPES::VBOX;
128 if ("DVB_T2" == name)
129 return INPUT_TYPES::DVBT2;
130 if ("V4L2ENC" == name)
131 return INPUT_TYPES::V4L2ENC;
132 if ("SATIP" == name)
133 return INPUT_TYPES::SATIP;
134 return INPUT_TYPES::ERROR_UNKNOWN;
135 }
136
137 static bool IsEncoder(const QString &rawtype)
138 {
139 return
140 (rawtype != "DVB") && (rawtype != "FIREWIRE") &&
141 (rawtype != "HDHOMERUN") && (rawtype != "FREEBOX") &&
142 (rawtype != "IMPORT") && (rawtype != "DEMO") &&
143 (rawtype != "ASI") && (rawtype != "CETON") &&
144 (rawtype != "VBOX") && (rawtype != "SATIP");
145 }
146
147 static bool IsV4L(const QString &rawtype)
148 {
149 return (rawtype == "V4L" || rawtype == "MPEG" ||
150 rawtype == "HDPVR" || rawtype == "GO7007" ||
151 rawtype == "MJPEG" || rawtype == "V4L2ENC");
152 }
153
154 static bool IsChannelChangeDiscontinuous(const QString &rawtype)
155 {
156 return (!IsEncoder(rawtype) || rawtype == "HDPVR" ||
157 rawtype == "EXTERNAL");
158 }
159
160 static bool IsUnscanable(const QString &rawtype)
161 {
162 return
163 (rawtype == "FIREWIRE") || (rawtype == "HDPVR") ||
164 (rawtype == "IMPORT") || (rawtype == "DEMO") ||
165 (rawtype == "GO7007") || (rawtype == "MJPEG");
166 }
167 static QString GetScanableInputTypes(void);
168
169 static bool IsCableCardPresent(uint inputid,
170 const QString &inputType);
171
172 static bool IsEITCapable(const QString &rawtype)
173 {
174 return
175 (rawtype == "DVB") || (rawtype == "HDHOMERUN") ||
176 (rawtype == "SATIP");
177 }
178
179 static bool IsTunerSharingCapable(const QString &rawtype)
180 {
181 return
182 (rawtype == "DVB") || (rawtype == "HDHOMERUN") ||
183 (rawtype == "ASI") || (rawtype == "FREEBOX") ||
184 (rawtype == "CETON") || (rawtype == "EXTERNAL") ||
185 (rawtype == "VBOX") || (rawtype == "V4L2ENC") ||
186 (rawtype == "SATIP");
187 }
188
189 static bool HasTuner(const QString &rawtype, const QString & device);
190 static bool IsTunerShared(uint inputidA, uint inputidB);
191
192 static bool IsTuningDigital(const QString &rawtype)
193 {
194 return
195 (rawtype == "DVB") || (rawtype == "HDHOMERUN") ||
196 (rawtype == "ASI") || (rawtype == "CETON") ||
197 (rawtype == "EXTERNAL") || (rawtype == "SATIP");
198 }
199
200 static bool IsTuningAnalog(const QString &rawtype)
201 {
202 return
203 (rawtype == "V4L") || (rawtype == "V4L2ENC" ||
204 rawtype == "MPEG");
205 }
206
207 static bool IsTuningVirtual(const QString &rawtype)
208 {
209 return
210 (rawtype == "FIREWIRE") || (rawtype == "HDPVR") ||
211 (rawtype == "EXTERNAL") || (rawtype == "V4L2ENC");
212 }
213
214 static bool IsSingleInputType(const QString &rawtype)
215 {
216 return
217 (rawtype == "FIREWIRE") || (rawtype == "HDHOMERUN") ||
218 (rawtype == "FREEBOX") || (rawtype == "ASI") ||
219 (rawtype == "IMPORT") || (rawtype == "DEMO") ||
220 (rawtype == "CETON") || (rawtype == "EXTERNAL") ||
221 (rawtype == "VBOX") || (rawtype == "SATIP");
222 }
223
224 static bool IsChannelReusable(const QString &rawtype)
225 {
226 return !(rawtype == "FREEBOX" || rawtype == "VBOX");
227 }
228
229#if CONFIG_VBOX
230 static bool IsVBoxPresent(uint inputid);
231#endif
232#if CONFIG_SATIP
233 static bool IsSatIPPresent(uint inputid);
234#endif
235
236 // Card creation and deletion
237
238 static int CreateCaptureCard(const QString &videodevice,
239 const QString &audiodevice,
240 const QString &vbidevice,
241 const QString &inputtype,
242 uint audioratelimit,
243 const QString &hostname,
244 uint dvb_swfilter,
245 uint dvb_sat_type,
246 bool dvb_wait_for_seqstart,
247 bool skipbtaudio,
248 bool dvb_on_demand,
249 uint dvb_diseqc_type,
250 uint firewire_speed,
251 const QString &firewire_model,
252 uint firewire_connection,
253 std::chrono::milliseconds signal_timeout,
254 std::chrono::milliseconds channel_timeout,
255 uint dvb_tuning_delay,
256 uint contrast,
257 uint brightness,
258 uint colour,
259 uint hue,
260 uint diseqcid,
261 bool dvb_eitscan);
262
263 static bool DeleteInput(uint inputid);
264 static bool DeleteAllInputs(void);
265 static std::vector<uint> GetInputList(void);
266 static std::vector<uint> GetSchedInputList(void);
267 static std::vector<uint> GetLiveTVInputList(void);
268
270 static uint GetFirstInputID(const QString &videodevice)
271 {
272 std::vector<uint> list = GetInputIDs(videodevice);
273 if (list.empty())
274 return 0;
275 return list[0];
276 }
277
278 static std::vector<uint> GetInputIDs(const QString& videodevice = QString(),
279 const QString& rawtype = QString(),
280 const QString& inputname = QString(),
281 QString hostname = QString());
282
283 static uint GetChildInputCount(uint inputid);
284 static std::vector<uint> GetChildInputIDs(uint inputid);
285
286 static bool IsInputTypePresent(const QString &rawtype,
287 QString hostname = QString());
288 static InputTypes GetInputTypes(void); // input types on ALL hosts
289 static QStringList GetInputTypeNames(uint sourceid); // input types for a given source id
290
291 static QStringList GetVideoDevices(const QString &rawtype,
292 QString hostname = QString());
293
294 static QString GetRawInputType(uint inputid)
295 { return get_on_input("cardtype", inputid).toUpper(); }
296 static QString GetVideoDevice(uint inputid)
297 { return get_on_input("videodevice", inputid); }
298 static QString GetAudioDevice(uint inputid)
299 { return get_on_input("audiodevice", inputid); }
300 static QString GetVBIDevice(uint inputid)
301 { return get_on_input("vbidevice", inputid); }
302 static QString GetDeliverySystemFromDB(uint inputid)
303 { return get_on_input("inputname", inputid); } // use capturecard/inputname for now
304 static QString GetDiSEqCPosition(uint inputid)
305 { return get_on_input("dvb_diseqc_type", inputid); } // use capturecard/dvb_diseqc_type for now
306
307 static QString GetHostname(uint inputid)
308 { return get_on_input("hostname", inputid); }
309
310 static int GetValueInt(const QString &col, uint inputid)
311 { return get_on_input(col, inputid).toInt(); }
312 static bool SetValue(const QString &col, uint inputid,
313 int val)
314 { return set_on_input(col, inputid, QString::number(val)); }
315 static bool SetValue(const QString &col, uint inputid,
316 const QString &val)
317 { return set_on_input(col, inputid, val); }
318
319 static bool SetStartChannel(uint inputid,
320 const QString &channum);
321
322 // Input creation and deletion
323 static int CreateCardInput(uint inputid,
324 uint sourceid,
325 const QString &inputname,
326 const QString &externalcommand,
327 const QString &changer_device,
328 const QString &changer_model,
329 const QString &hostname,
330 const QString &tunechan,
331 const QString &startchan,
332 const QString &displayname,
333 bool dishnet_eit,
334 uint recpriority,
335 uint quicktune,
336 uint schedorder,
337 uint livetvorder);
338
339 // Other input functions
340
341 static std::vector<uint> GetInputIDs(uint sourceid);
342 static bool GetInputInfo(InputInfo &input,
343 std::vector<uint> *groupids = nullptr);
344 static QList<InputInfo> GetAllInputInfo(bool virtTuners);
345 static QString GetInputName(uint inputid);
346 static QString GetStartChannel(uint inputid);
347 static QString GetDisplayName(uint inputid);
348 static bool IsUniqueDisplayName(const QString &name,
349 uint exclude_inputid);
350 static uint GetSourceID(uint inputid);
351
352 // Input Groups
353 static uint CreateInputGroup(const QString &name);
354 static uint CreateDeviceInputGroup(uint inputid,
355 const QString &type,
356 const QString &host,
357 const QString &device);
358 static uint GetDeviceInputGroup(uint inputid);
359 static bool LinkInputGroup(uint inputid, uint inputgroupid);
360 static bool UnlinkInputGroup(uint inputid, uint inputgroupid);
361 static std::vector<uint> GetInputGroups(uint inputid);
362 static std::vector<uint> GetGroupInputIDs(uint inputgroupid);
363 static std::vector<uint> GetConflictingInputs(uint inputid);
364
365 static QString GetDeviceLabel(const QString &inputtype,
366 const QString &videodevice);
367 static QString GetDeviceLabel(uint inputid);
368
369 static QString ProbeSubTypeName(uint inputid);
370
371 static QStringList ProbeVideoInputs(const QString& device,
372 const QString& inputtype = QString());
373 static QStringList ProbeAudioInputs(const QString& device,
374 const QString& inputtype = QString());
375 static void GetDeviceInputNames(const QString &device,
376 const QString &inputtype,
377 QStringList &inputs);
378
379 // General info from OS
380 static QStringList ProbeVideoDevices(const QString &rawtype);
381 static void ClearVideoDeviceCache();
382
383 // Other
384 static uint CloneCard(uint src_inputid, uint dst_inputid);
385 static bool InputSetMaxRecordings(uint parentid,
386 uint max_recordings);
387 static uint AddChildInput(uint parentid);
388 static QString GetFirewireChangerNode(uint inputid);
389 static QString GetFirewireChangerModel(uint inputid);
390
391 // DTV info
392 static bool GetTimeouts(uint inputid,
393 std::chrono::milliseconds &signal_timeout,
394 std::chrono::milliseconds &channel_timeout);
395 static bool IgnoreEncrypted(uint inputid,
396 const QString &inputname);
397 static bool TVOnly(uint inputid, const QString &inputname);
398 static bool IsInNeedOfExternalInputConf(uint inputid);
399 static uint GetQuickTuning(uint inputid, const QString &input_name);
400
401 // DVB info
403 static bool IsDVB(uint inputid)
404 { return "DVB" == GetRawInputType(inputid); }
405 static bool IsDVBInputType(const QString &inputType);
406 static QStringList ProbeDeliverySystems(const QString &device);
407 static QStringList ProbeDeliverySystems(int fd_frontend);
408 static QString ProbeDefaultDeliverySystem(const QString &device);
409 static QString ProbeDVBType(const QString &device);
410 static QString ProbeDVBFrontendName(const QString &device);
411 static bool HasDVBCRCBug(const QString &device);
412 static std::chrono::milliseconds GetMinSignalMonitoringDelay(const QString &device);
413 static DTVTunerType ConvertToTunerType(DTVModulationSystem delsys);
414 static DTVTunerType GetTunerType(uint inputid);
415 static DTVTunerType ProbeTunerType(int fd_frontend);
416 static DTVTunerType ProbeTunerType(const QString &device);
417 static DTVTunerType GetTunerTypeFromMultiplex(uint mplexid);
418 static DTVModulationSystem GetDeliverySystem(uint inputid);
419 static DTVModulationSystem ProbeCurrentDeliverySystem(const QString &device);
420 static DTVModulationSystem ProbeCurrentDeliverySystem(int fd_frontend);
421 static DTVModulationSystem ProbeBestDeliverySystem(int fd);
422 static DTVModulationSystem GetOrProbeDeliverySystem(uint inputid, int fd);
423 static int SetDefaultDeliverySystem(uint inputid, int fd);
424 static int SetDeliverySystem(uint inputid);
425 static int SetDeliverySystem(uint inputid, DTVModulationSystem delsys);
426 static int SetDeliverySystem(uint inputid, int fd);
427 static int SetDeliverySystem(uint inputid, DTVModulationSystem delsys, int fd);
428 static int OpenVideoDevice(int inputid);
429 static int OpenVideoDevice(const QString &device);
430 static QString GetDeviceName(dvb_dev_type_t type, const QString &device);
431 static InputNames GetConfiguredDVBInputs(const QString &device);
432 static QStringList CapabilitiesToString(uint64_t capabilities);
433
434 // V4L info
435 static bool hasV4L2(int videofd);
436 static bool GetV4LInfo(int videofd, QString &input, QString &driver,
437 uint32_t &version, uint32_t &capabilities);
438 static bool GetV4LInfo(int videofd, QString &input, QString &driver)
439 {
440 uint32_t d1 = 0;
441 uint32_t d2 = 0;
442 return GetV4LInfo(videofd, input, driver, d1, d2);
443 }
444 static InputNames ProbeV4LVideoInputs(int videofd, bool &ok);
445 static InputNames ProbeV4LAudioInputs(int videofd, bool &ok);
446
447 // HDHomeRun info
448 static bool HDHRdoesDVB(const QString &device);
449 static bool HDHRdoesDVBC(const QString &device);
450 static QString GetHDHRdesc(const QString &device);
451
452 // VBox info
453 static QString GetVBoxdesc(const QString &id, const QString &ip,
454 const QString &tunerNo, const QString &tunerType);
455
456 // ASI info
457 static int GetASIDeviceNumber(const QString &device,
458 QString *error = nullptr);
459
460 static uint GetASIBufferSize(uint device_num,
461 QString *error = nullptr);
462 static uint GetASINumBuffers(uint device_num,
463 QString *error = nullptr);
464 static int GetASIMode(uint device_num,
465 QString *error = nullptr);
466 static bool SetASIMode(uint device_num, uint mode,
467 QString *error = nullptr);
468
469 private:
470 static QStringList ProbeV4LVideoInputs(const QString& device);
471 static QStringList ProbeV4LAudioInputs(const QString& device);
472 static QStringList ProbeDVBInputs(const QString& device);
473 static QMap <QString,QStringList> s_videoDeviceCache;
474};
475
476#endif //CARDUTIL_H
MTV_PUBLIC bool set_on_input(const QString &to_set, uint inputid, const QString &value)
Definition: cardutil.cpp:1281
dvb_dev_type_t
Definition: cardutil.h:31
@ DVB_DEV_AUDIO
Definition: cardutil.h:36
@ DVB_DEV_VIDEO
Definition: cardutil.h:37
@ DVB_DEV_DEMUX
Definition: cardutil.h:34
@ DVB_DEV_DVR
Definition: cardutil.h:33
@ DVB_DEV_CA
Definition: cardutil.h:35
@ DVB_DEV_FRONTEND
Definition: cardutil.h:32
QMap< int, QString > InputNames
Definition: cardutil.h:24
MTV_PUBLIC QString get_on_input(const QString &to_get, uint inputid)
Definition: cardutil.cpp:1264
Collection of helper utilities for input DB use.
Definition: cardutil.h:44
static bool IsTunerSharingCapable(const QString &rawtype)
Definition: cardutil.h:179
static bool IsUnscanable(const QString &rawtype)
Definition: cardutil.h:160
static QString GetRawInputType(uint inputid)
Definition: cardutil.h:294
static QString GetAudioDevice(uint inputid)
Definition: cardutil.h:298
static bool IsTuningAnalog(const QString &rawtype)
Definition: cardutil.h:200
INPUT_TYPES
all the different inputs
Definition: cardutil.h:52
static bool IsTuningVirtual(const QString &rawtype)
Definition: cardutil.h:207
static QString GetDiSEqCPosition(uint inputid)
Definition: cardutil.h:304
static bool SetValue(const QString &col, uint inputid, int val)
Definition: cardutil.h:312
static int GetValueInt(const QString &col, uint inputid)
Definition: cardutil.h:310
static QMap< QString, QStringList > s_videoDeviceCache
Definition: cardutil.h:473
static bool IsChannelChangeDiscontinuous(const QString &rawtype)
Definition: cardutil.h:154
static uint GetFirstInputID(const QString &videodevice)
Convenience function for GetInputIDs()
Definition: cardutil.h:270
static bool IsEITCapable(const QString &rawtype)
Definition: cardutil.h:172
static QString GetDeliverySystemFromDB(uint inputid)
Definition: cardutil.h:302
static bool TVOnly(uint inputid, const QString &inputname)
static QString GetVideoDevice(uint inputid)
Definition: cardutil.h:296
static bool IsV4L(const QString &rawtype)
Definition: cardutil.h:147
static bool IgnoreEncrypted(uint inputid, const QString &inputname)
static bool IsEncoder(const QString &rawtype)
Definition: cardutil.h:137
static QString GetVBIDevice(uint inputid)
Definition: cardutil.h:300
static bool IsTuningDigital(const QString &rawtype)
Definition: cardutil.h:192
static QString GetHostname(uint inputid)
Definition: cardutil.h:307
static bool IsSingleInputType(const QString &rawtype)
Definition: cardutil.h:214
static bool IsDVB(uint inputid)
Returns true if the input is a DVB input.
Definition: cardutil.h:403
static bool GetV4LInfo(int videofd, QString &input, QString &driver)
Definition: cardutil.h:438
QMap< QString, QString > InputTypes
Definition: cardutil.h:48
static bool SetValue(const QString &col, uint inputid, const QString &val)
Definition: cardutil.h:315
static bool IsChannelReusable(const QString &rawtype)
Definition: cardutil.h:224
unsigned int uint
Definition: compat.h:60
#define MTV_PUBLIC
Definition: mythtvexp.h:8
string version
Definition: giantbomb.py:185
def error(message)
Definition: smolt.py:409
string hostname
Definition: caa.py:17