MythTV master
channelutil.h
Go to the documentation of this file.
1// -*- Mode: c++ -*-
2#ifndef CHANUTIL_H
3#define CHANUTIL_H
4
5// C++ headers
6#include <cstdint>
7#include <deque>
8#include <vector>
9
10// Qt headers
11#include <QString>
12#include <QCoreApplication>
13
14// MythTV headers
15#include "mythtvexp.h"
16#include "dtvmultiplex.h"
17#include "channelinfo.h"
18#include "iptvtuningdata.h"
19#include "tv.h" // for CHANNEL_DIRECTION
20
22class TestEITFixups;
23
25{
26 public:
27 pid_cache_item_t() = default;
28 pid_cache_item_t(uint pid, uint sid_tid) :
29 m_pid(pid), m_sidTid(sid_tid) {}
30 uint GetPID(void) const { return m_pid; }
31 uint GetStreamID(void) const
32 { return (m_sidTid&0x100) ? GetID() : 0; }
33 uint GetTableID(void) const
34 { return (m_sidTid&0x100) ? 0 : GetID(); }
35 uint GetID(void) const { return m_sidTid & 0xff; }
36 bool IsPCRPID(void) const { return ( m_sidTid&0x200 ) != 0; }
37 bool IsPermanent(void) const { return ( m_sidTid&0x10000 ) != 0; }
38 uint GetComposite(void) const { return m_sidTid; }
39 private:
42};
43using pid_cache_t = std::vector<pid_cache_item_t>;
44
49{
50 friend class TestEITFixups;
51
53
54 public:
55 // Multiplex Stuff
56
57 static uint CreateMultiplex(
58 int sourceid, const QString& sistandard,
59 uint64_t frequency, const QString& modulation,
60 int transport_id = -1, int network_id = -1);
61
62 static uint CreateMultiplex(
63 int sourceid, const QString& sistandard,
64 uint64_t frequency, const QString& modulation,
65 // DVB specific
66 int transport_id, int network_id,
67 int symbol_rate, signed char bandwidth,
68 signed char polarity, signed char inversion,
69 signed char trans_mode,
70 const QString& inner_FEC, const QString& constellation,
71 signed char hierarchy, const QString& hp_code_rate,
72 const QString& lp_code_rate, const QString& guard_interval,
73 const QString& mod_sys, const QString& rolloff);
74
75 static uint CreateMultiplex(uint sourceid, const DTVMultiplex &mux,
76 int transport_id, int network_id);
77
78 static std::vector<uint> CreateMultiplexes(
79 int sourceid, const NetworkInformationTable *nit);
80
81 static uint GetMplexID(uint sourceid, const QString &channum);
82 static int GetMplexID(uint sourceid, uint64_t frequency);
83 static int GetMplexID(uint sourceid, uint64_t frequency,
84 uint transport_id, uint network_id);
85 static int GetMplexID(uint sourceid,
86 uint transport_id, uint network_id);
87 static uint GetMplexID(uint chanid);
88 static int GetBetterMplexID(int current_mplexid,
89 int transport_id, int network_id);
90
91 static bool GetTuningParams(uint mplexid,
92 QString &modulation,
93 uint64_t &frequency,
94 uint &dvb_transportid,
95 uint &dvb_networkid,
96 QString &si_std);
97
98 static bool GetATSCChannel(uint sourceid, const QString &channum,
99 uint &major, uint &minor);
100 static bool IsATSCChannel(uint sourceid, const QString &channum)
101 {
102 uint m1 = 0;
103 uint m2 = 0;
104 GetATSCChannel(sourceid, channum, m1,m2);
105 return m2 != 0U;
106 }
107
108 // Channel/Service Stuff
109 static int CreateChanID(uint sourceid, const QString &chan_num);
110
111 static bool CreateChannel(uint db_mplexid,
112 uint db_sourceid,
113 uint new_channel_id,
114 const QString &callsign,
115 const QString &service_name,
116 const QString &chan_num,
117 uint service_id,
118 uint atsc_major_channel,
119 uint atsc_minor_channel,
120 bool use_on_air_guide,
121 ChannelVisibleType visible,
122 const QString &freqid,
123 const QString& icon = QString(),
124 QString format = "Default",
125 const QString& xmltvid = QString(),
126 const QString& default_authority = QString(),
127 uint service_type = 0,
128 int recpriority = 0,
129 int tmOffset = 0,
130 int commMethod = -1);
131
132 static bool UpdateChannel(uint db_mplexid,
133 uint source_id,
134 uint channel_id,
135 const QString &callsign,
136 const QString &service_name,
137 const QString &chan_num,
138 uint service_id,
139 uint atsc_major_channel,
140 uint atsc_minor_channel,
141 bool use_on_air_guide,
142 ChannelVisibleType visible,
143 const QString& freqid = QString(),
144 const QString& icon = QString(),
145 QString format = QString(),
146 const QString& xmltvid = QString(),
147 const QString& default_authority = QString(),
148 uint service_type = 0,
149 // note INT_MIN is invalid for these fields
150 // to indicate that they are not to be updated
151 int recpriority = INT_MIN,
152 int tmOffset = INT_MIN,
153 int commMethod = INT_MIN);
154
156 uint channel_id, const IPTVTuningData &tuning)
157 {
158 return UpdateIPTVTuningData(channel_id, tuning);
159 }
160
161 static bool UpdateIPTVTuningData(
162 uint channel_id, const IPTVTuningData &tuning);
163
164 static void UpdateInsertInfoFromDB(ChannelInsertInfo &chan);
165 static void UpdateChannelNumberFromDB(ChannelInsertInfo &chan);
166
167 static bool DeleteChannel(uint channel_id);
168
169 static bool SetVisible(uint channel_id, ChannelVisibleType visible);
170
171 static bool SetServiceVersion(int mplexid, int version);
172
173 static int GetChanID(int db_mplexid, int service_transport_id,
174 int major_channel, int minor_channel,
175 int program_number);
176
177 static int GetServiceVersion(int mplexid);
178
179 // Misc gets
180 static QString GetDefaultAuthority(uint chanid);
181 static QString GetIcon(uint chanid);
182 static std::vector<uint> GetInputIDs(uint chanid);
183 static QString GetUnknownCallsign(void);
184 static uint FindChannel(uint sourceid, const QString &freqid);
185 static int GetChanID(uint sourceid, const QString &channum)
186 { return GetChannelValueInt("chanid", sourceid, channum); }
187 static bool GetChannelData(
188 uint sourceid,
189 uint &chanid, const QString &channum,
190 QString &tvformat, QString &modulation,
191 QString &freqtable, QString &freqid,
192 int &finetune, uint64_t &frequency,
193 QString &dtv_si_std, int &mpeg_prog_num,
194 uint &atsc_major, uint &atsc_minor,
195 uint &dvb_transportid, uint &dvb_networkid,
196 uint &mplexid, bool &commfree);
197 static int GetProgramNumber(uint sourceid, const QString &channum)
198 { return GetChannelValueInt("serviceid", sourceid, channum); }
199 static QString GetVideoFilters(uint sourceid, const QString &channum)
200 { return GetChannelValueStr("videofilters", sourceid, channum); }
201 static IPTVTuningData GetIPTVTuningData(uint chanid);
202
203 // Are there any other possibly useful sort orders?
204 // e.g. Sorting by sourceid would probably be better done by two distinct
205 // calls to LoadChannels specifying the sourceid
206 enum OrderBy : std::uint8_t
207 {
211 };
212
213 enum GroupBy : std::uint8_t
214 {
217 kChanGroupByChanid // Because of the nature of the query we always need to group
218 };
219
236 static ChannelInfoList LoadChannels(uint startIndex, uint count,
237 uint &totalAvailable,
238 bool ignoreHidden = true,
239 OrderBy orderBy = kChanOrderByChanNum,
240 GroupBy groupBy = kChanGroupByChanid,
241 uint sourceID = 0,
242 uint channelGroupID = 0,
243 bool liveTVOnly = false,
244 const QString& callsign = "",
245 const QString& channum = "",
246 bool ignoreUntunable = true);
247
252 uint sourceid, bool visible_only,
253 const QString &group_by = QString(), uint channel_groupid = 0)
254 {
255 return GetChannelsInternal(sourceid, visible_only, false,
256 group_by, channel_groupid);
257 }
258
261
265 {
266 return GetChannelsInternal(sourceid, false, true, QString(), 0);
267 }
268 static std::vector<uint> GetChanIDs(int sourceid = -1, bool onlyVisible = false);
269 static uint GetChannelCount(int sourceid = -1);
270 static void SortChannels(ChannelInfoList &list, const QString &order,
271 bool eliminate_duplicates = false);
272 static int GetNearestChannel(const ChannelInfoList &list,
273 const QString &channum);
274
275 static uint GetNextChannel(const ChannelInfoList &sorted,
276 uint old_chanid,
277 uint mplexid_restriction,
278 uint chanid_restriction,
279 ChannelChangeDirection direction,
280 bool skip_non_visible = true,
281 bool skip_same_channum_and_callsign = false,
282 bool skip_other_sources = false);
283
284 static QString GetChannelValueStr(const QString &channel_field,
285 uint sourceid,
286 const QString &channum);
287
288 static int GetChannelValueInt(const QString &channel_field,
289 uint sourceid,
290 const QString &channum);
291
292 static QString GetChannelNumber(uint sourceid,
293 const QString &channel_name);
294
295 static bool IsOnSameMultiplex(uint srcid,
296 const QString &new_channum,
297 const QString &old_channum);
298
299 static QStringList GetValidRecorderList(uint chanid,
300 const QString &channum);
301
302 static bool IsConflicting(const QString &channum,
303 uint sourceid = 0, uint excluded_chanid = 0)
304 {
305 std::vector<uint> chanids = GetConflicting(channum, sourceid);
306 return (chanids.size() > 1) ||
307 ((1 == chanids.size()) && (chanids[0] != excluded_chanid));
308 }
309
310 static std::vector<uint> GetConflicting(const QString &channum,
311 uint sourceid = 0);
312
317 static QString GetChanNum(int chan_id);
318
323 static std::chrono::minutes GetTimeOffset(int chan_id);
324 static int GetSourceID(int mplexid);
325 static uint GetSourceIDForChannel(uint chanid);
326
327 static QStringList GetInputTypes(uint chanid);
328
329 static bool GetCachedPids(uint chanid, pid_cache_t &pid_cache);
330
331 // Misc sets
332 static bool SetChannelValue(const QString &field_name,
333 const QString& value,
334 uint sourceid,
335 const QString &channum);
336
337 static bool SetChannelValue(const QString &field_name,
338 const QString& value,
339 int chanid);
340
341 static bool SaveCachedPids(uint chanid,
342 const pid_cache_t &_pid_cache,
343 bool delete_all = false);
344
345 static const QString kATSCSeparators;
346
347 private:
351 static ChannelInfoList GetChannelsInternal(
352 uint sourceid, bool visible_only, bool include_disconnected,
353 const QString &group_by, uint channel_groupid);
354 static QString GetChannelStringField(int chan_id, const QString &field);
355
356 static QReadWriteLock s_channelDefaultAuthorityMapLock;
357 static QMap<uint,QString> s_channelDefaultAuthorityMap;
359};
360
361#endif // CHANUTIL_H
ChannelVisibleType
Definition: channelinfo.h:21
std::vector< ChannelInfo > ChannelInfoList
Definition: channelinfo.h:131
std::vector< pid_cache_item_t > pid_cache_t
Definition: channelutil.h:43
Collection of helper utilities for channel DB use.
Definition: channelutil.h:49
static bool s_channelDefaultAuthority_runInit
Definition: channelutil.h:358
static QMap< uint, QString > s_channelDefaultAuthorityMap
Definition: channelutil.h:357
static QReadWriteLock s_channelDefaultAuthorityMapLock
Definition: channelutil.h:356
static bool CreateIPTVTuningData(uint channel_id, const IPTVTuningData &tuning)
Definition: channelutil.h:155
static int GetProgramNumber(uint sourceid, const QString &channum)
Definition: channelutil.h:197
static QString GetVideoFilters(uint sourceid, const QString &channum)
Definition: channelutil.h:199
static const QString kATSCSeparators
Definition: channelutil.h:345
static bool IsATSCChannel(uint sourceid, const QString &channum)
Definition: channelutil.h:100
@ kChanGroupByCallsignAndChannum
Definition: channelutil.h:216
@ kChanGroupByCallsign
Definition: channelutil.h:215
Q_DECLARE_TR_FUNCTIONS(ChannelUtil)
static ChannelInfoList GetAllChannels(uint sourceid)
Returns channels that are not connected to an input and channels that are not marked as visible.
Definition: channelutil.h:264
static std::vector< uint > GetInputIDs(uint chanid)
static int GetChanID(uint sourceid, const QString &channum)
Definition: channelutil.h:185
static ChannelInfoList GetChannels(uint sourceid, bool visible_only, const QString &group_by=QString(), uint channel_groupid=0)
Definition: channelutil.h:251
static bool IsConflicting(const QString &channum, uint sourceid=0, uint excluded_chanid=0)
Definition: channelutil.h:302
@ kChanOrderByChanNum
Definition: channelutil.h:208
@ kChanOrderByLiveTV
Definition: channelutil.h:210
This table tells the decoder on which PIDs to find other tables.
Definition: dvbtables.h:34
uint GetPID(void) const
Definition: channelutil.h:30
uint GetComposite(void) const
Definition: channelutil.h:38
uint GetStreamID(void) const
Definition: channelutil.h:31
pid_cache_item_t(uint pid, uint sid_tid)
Definition: channelutil.h:28
bool IsPCRPID(void) const
Definition: channelutil.h:36
bool IsPermanent(void) const
Definition: channelutil.h:37
pid_cache_item_t()=default
uint GetID(void) const
Definition: channelutil.h:35
uint GetTableID(void) const
Definition: channelutil.h:33
#define minor(X)
Definition: compat.h:74
unsigned int uint
Definition: freesurround.h:24
#define MTV_PUBLIC
Definition: mythtvexp.h:15
string version
Definition: giantbomb.py:185
ChannelChangeDirection
ChannelChangeDirection is an enumeration of possible channel changing directions.
Definition: tv.h:32