vdr 2.6.3
nit.c
Go to the documentation of this file.
1/*
2 * nit.c: NIT section filter
3 *
4 * See the main source file 'vdr.c' for copyright information and
5 * how to reach the author.
6 *
7 * $Id: nit.c 5.3 2022/11/30 12:02:00 kls Exp $
8 */
9
10#include "nit.h"
11#include <linux/dvb/frontend.h>
12#include "channels.h"
13#include "dvbdevice.h"
14#include "eitscan.h"
15#include "libsi/section.h"
16#include "libsi/descriptor.h"
17#include "tools.h"
18
19#define DVB_SYSTEM_1 0 // see also dvbdevice.c
20#define DVB_SYSTEM_2 1
21
22#define MAXNETWORKNAME Utf8BufSize(256)
23
24// Set to 'true' for debug output:
25static bool DebugNit = false;
26
27#define dbgnit(a...) if (DebugNit) fprintf(stderr, a)
28
30{
31 sdtFilter = SdtFilter;
32 Set(0x10, SI::TableIdNIT);
33}
34
36{
39}
40
41void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length)
42{
43 SI::NIT nit(Data, false);
44 if (!nit.CheckCRCAndParse())
45 return;
47 return;
48 if (DebugNit) {
49 char NetworkName[MAXNETWORKNAME] = "";
51 for (SI::Loop::Iterator it; (d = nit.commonDescriptors.getNext(it)); ) {
52 switch (d->getDescriptorTag()) {
55 nnd->name.getText(NetworkName, MAXNETWORKNAME);
56 }
57 break;
58 default: ;
59 }
60 delete d;
61 }
62 dbgnit("NIT: %02X %2d %2d %2d %s %d %d '%s'\n", Tid, nit.getVersionNumber(), nit.getSectionNumber(), nit.getLastSectionNumber(), *cSource::ToString(Source()), nit.getNetworkId(), Transponder(), NetworkName);
63 }
64 cStateKey StateKey;
65 cChannels *Channels = cChannels::GetChannelsWrite(StateKey, 10);
66 if (!Channels)
67 return;
68 bool ChannelsModified = false;
70 for (SI::Loop::Iterator it; nit.transportStreamLoop.getNext(ts, it); ) {
72
75 int NumFrequencies = fld ? fld->frequencies.getCount() + 1 : 1;
76 int Frequencies[NumFrequencies];
77 if (fld) {
78 int ct = fld->getCodingType();
79 if (ct > 0) {
80 int n = 1;
81 for (SI::Loop::Iterator it3; fld->frequencies.hasNext(it3); ) {
82 int f = fld->frequencies.getNext(it3);
83 switch (ct) {
84 case 1: f = round(BCD2INT(f) / 100.0); break;
85 case 2: f = round(BCD2INT(f) / 10.0); break;
86 case 3: f = f * 10; break;
87 default: ;
88 }
89 Frequencies[n++] = f;
90 dbgnit(" Frequencies[%d] = %d\n", n - 1, f);
91 }
92 }
93 else
94 NumFrequencies = 1;
95 }
96 delete fld;
97
98 // Necessary for "backwards compatibility mode" according to ETSI EN 300 468:
99 bool ForceDVBS2 = false;
100 for (SI::Loop::Iterator it2; (d = ts.transportStreamDescriptors.getNext(it2)); ) {
102 ForceDVBS2 = true;
103 delete d;
104 break;
105 }
106 delete d;
107 }
108
109 for (SI::Loop::Iterator it2; (d = ts.transportStreamDescriptors.getNext(it2)); ) {
110 switch (d->getDescriptorTag()) {
115 int Frequency = Frequencies[0] = round(BCD2INT(sd->getFrequency()) / 100.0);
116 static char Polarizations[] = { 'H', 'V', 'L', 'R' };
117 dtp.SetPolarization(Polarizations[sd->getPolarization()]);
118 static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_8_9, FEC_3_5, FEC_4_5, FEC_9_10, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE };
119 dtp.SetCoderateH(CodeRates[sd->getFecInner()]);
120 static int Modulations[] = { QAM_AUTO, QPSK, PSK_8, QAM_16 };
121 dtp.SetModulation(Modulations[sd->getModulationType()]);
122 bool System = sd->getModulationSystem() || ForceDVBS2;
123 dtp.SetSystem(System ? DVB_SYSTEM_2 : DVB_SYSTEM_1);
124 static int RollOffs[] = { ROLLOFF_35, ROLLOFF_25, ROLLOFF_20, ROLLOFF_AUTO };
125 dtp.SetRollOff(System ? RollOffs[sd->getRollOff()] : ROLLOFF_AUTO);
126 int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
127 dbgnit(" %s %d %c %d %d DVB-S%d\n", *cSource::ToString(Source), Frequency, dtp.Polarization(), SymbolRate, cChannel::Transponder(Frequency, dtp.Polarization()), System ? 2 : 1);
128 if (Setup.UpdateChannels >= 5) {
129 bool found = false;
130 bool forceTransponderUpdate = false;
131 for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
132 if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
133 // Preserve parameters set separately in S2SatelliteDeliverySystemDescriptor:
135 dtp.SetStreamId(dtpc.StreamId());
136 //
137 int transponder = Channel->Transponder();
138 if (!ISTRANSPONDER(cChannel::Transponder(Frequency, dtp.Polarization()), transponder)) {
139 for (int n = 0; n < NumFrequencies; n++) {
140 if (ISTRANSPONDER(cChannel::Transponder(Frequencies[n], dtp.Polarization()), transponder)) {
141 Frequency = Frequencies[n];
142 break;
143 }
144 }
145 }
146 if (!ISTRANSPONDER(cChannel::Transponder(Frequency, dtp.Polarization()), transponder))
147 continue; // a channel with obsolete/wrong/other(?) transponder
148 found = true;
149 if (ISTRANSPONDER(transponder, Transponder())) // only modify channels if we're actually receiving this transponder
150 ChannelsModified |= Channel->SetTransponderData(Source, Frequency, SymbolRate, dtp.ToString('S'));
151 else if (Channel->Srate() != SymbolRate || strcmp(Channel->Parameters(), dtp.ToString('S')))
152 forceTransponderUpdate = true; // get us receiving this transponder
153 }
154 }
155 if (!found || forceTransponderUpdate) {
156 for (int n = 0; n < NumFrequencies; n++) {
159 if (Channel->SetTransponderData(Source, Frequencies[n], SymbolRate, dtp.ToString('S')))
161 else
162 delete Channel;
163 }
164 }
165 }
166 }
167 break;
169 if (Setup.UpdateChannels >= 5) {
170 for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
175 dbgnit(" stream id = %d\n", dtp.StreamId());
176 ChannelsModified |= Channel->SetTransponderData(Channel->Source(), Channel->Frequency(), Channel->Srate(), dtp.ToString('S'));
177 break;
178 }
179 }
180 }
181 }
182 break;
187 int Frequency = Frequencies[0] = round(BCD2INT(sd->getFrequency()) / 10.0);
188 //XXX FEC_outer???
189 static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_8_9, FEC_3_5, FEC_4_5, FEC_9_10, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE };
190 dtp.SetCoderateH(CodeRates[sd->getFecInner()]);
191 static int Modulations[] = { QPSK, QAM_16, QAM_32, QAM_64, QAM_128, QAM_256, QAM_AUTO };
192 dtp.SetModulation(Modulations[min(sd->getModulation(), 6)]);
193 int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
194 dbgnit(" %s %d %d %d %d\n", *cSource::ToString(Source), Frequency, dtp.CoderateH(), dtp.Modulation(), SymbolRate);
195 if (Setup.UpdateChannels >= 5) {
196 bool found = false;
197 bool forceTransponderUpdate = false;
198 for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
199 if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
200 int transponder = Channel->Transponder();
201 if (!ISTRANSPONDER(Frequency / 1000, transponder)) {
202 for (int n = 0; n < NumFrequencies; n++) {
203 if (ISTRANSPONDER(Frequencies[n] / 1000, transponder)) {
204 Frequency = Frequencies[n];
205 break;
206 }
207 }
208 }
209 if (!ISTRANSPONDER(Frequency / 1000, transponder))
210 continue; // a channel with obsolete/wrong/other(?) transponder
211 found = true;
212 if (ISTRANSPONDER(transponder, Transponder())) // only modify channels if we're actually receiving this transponder
213 ChannelsModified |= Channel->SetTransponderData(Source, Frequency, SymbolRate, dtp.ToString('C'));
214 else if (Channel->Srate() != SymbolRate || strcmp(Channel->Parameters(), dtp.ToString('C')))
215 forceTransponderUpdate = true; // get us receiving this transponder
216 }
217 }
218 if (!found || forceTransponderUpdate) {
219 for (int n = 0; n < NumFrequencies; n++) {
222 if (Channel->SetTransponderData(Source, Frequencies[n], SymbolRate, dtp.ToString('C')))
224 else
225 delete Channel;
226 }
227 }
228 }
229 }
230 break;
235 int Frequency = Frequencies[0] = sd->getFrequency() * 10;
236 static int Bandwidths[] = { 8000000, 7000000, 6000000, 5000000, 0, 0, 0, 0 };
237 dtp.SetBandwidth(Bandwidths[sd->getBandwidth()]);
238 static int Constellations[] = { QPSK, QAM_16, QAM_64, QAM_AUTO };
239 dtp.SetModulation(Constellations[sd->getConstellation()]);
241 static int Hierarchies[] = { HIERARCHY_NONE, HIERARCHY_1, HIERARCHY_2, HIERARCHY_4, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO };
242 dtp.SetHierarchy(Hierarchies[sd->getHierarchy()]);
243 static int CodeRates[] = { FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO };
244 dtp.SetCoderateH(CodeRates[sd->getCodeRateHP()]);
245 dtp.SetCoderateL(CodeRates[sd->getCodeRateLP()]);
246 static int GuardIntervals[] = { GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_4 };
247 dtp.SetGuard(GuardIntervals[sd->getGuardInterval()]);
248 static int TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_4K, TRANSMISSION_MODE_AUTO };
249 dtp.SetTransmission(TransmissionModes[sd->getTransmissionMode()]);
250 dbgnit(" %s %d %d %d %d %d %d %d %d\n", *cSource::ToString(Source), Frequency, dtp.Bandwidth(), dtp.Modulation(), dtp.Hierarchy(), dtp.CoderateH(), dtp.CoderateL(), dtp.Guard(), dtp.Transmission());
251 if (Setup.UpdateChannels >= 5) {
252 bool found = false;
253 bool forceTransponderUpdate = false;
254 for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
255 if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
256 // Preserve parameters set separately in T2DeliverySystemDescripto:
258 dtp.SetSystem(dtpc.System());
259 dtp.SetStreamId(dtpc.StreamId());
260 dtp.SetT2SystemId(dtp.T2SystemId());
261 dtp.SetSisoMiso(dtpc.SisoMiso());
262 dtp.SetBandwidth(dtpc.Bandwidth());
263 dtp.SetGuard(dtpc.Guard());
264 dtp.SetTransmission(dtpc.Transmission());
265 //
266 int transponder = Channel->Transponder();
267 if (!ISTRANSPONDER(Frequency / 1000000, transponder)) {
268 for (int n = 0; n < NumFrequencies; n++) {
269 if (ISTRANSPONDER(Frequencies[n] / 1000000, transponder)) {
270 Frequency = Frequencies[n];
271 break;
272 }
273 }
274 }
275 if (!ISTRANSPONDER(Frequency / 1000000, transponder))
276 continue; // a channel with obsolete/wrong/other(?) transponder
277 found = true;
278 if (ISTRANSPONDER(transponder, Transponder())) // only modify channels if we're actually receiving this transponder
279 ChannelsModified |= Channel->SetTransponderData(Source, Frequency, 0, dtp.ToString('T'));
280 else if (strcmp(Channel->Parameters(), dtp.ToString('T')))
281 forceTransponderUpdate = true; // get us receiving this transponder
282 }
283 }
284 if (!found || forceTransponderUpdate) {
285 for (int n = 0; n < NumFrequencies; n++) {
288 if (Channel->SetTransponderData(Source, Frequencies[n], 0, dtp.ToString('T')))
290 else
291 delete Channel;
292 }
293 }
294 }
295 }
296 break;
299 switch (sd->getExtensionDescriptorTag()) {
301 if (Setup.UpdateChannels >= 5) {
302 for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
304 if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
306 int Frequency = Channel->Frequency();
307 int SymbolRate = Channel->Srate();
310 dtp.SetStreamId(td->getPlpId());
311 dtp.SetT2SystemId(td->getT2SystemId());
312 if (td->getExtendedDataFlag()) {
313 dtp.SetSisoMiso(td->getSisoMiso());
314 static int T2Bandwidths[] = { 8000000, 7000000, 6000000, 5000000, 10000000, 1712000, 0, 0 };
315 dtp.SetBandwidth(T2Bandwidths[td->getBandwidth()]);
316 static int T2GuardIntervals[] = { GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_4, GUARD_INTERVAL_1_128, GUARD_INTERVAL_19_128, GUARD_INTERVAL_19_256, 0 };
317 dtp.SetGuard(T2GuardIntervals[td->getGuardInterval()]);
318 static int T2TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_4K, TRANSMISSION_MODE_1K, TRANSMISSION_MODE_16K, TRANSMISSION_MODE_32K, TRANSMISSION_MODE_AUTO, TRANSMISSION_MODE_AUTO };
319 dtp.SetTransmission(T2TransmissionModes[td->getTransmissionMode()]);
320 //TODO add parsing of frequencies
321 }
322 dbgnit(" stream id = %d\n", dtp.StreamId());
323 ChannelsModified |= Channel->SetTransponderData(Source, Frequency, SymbolRate, dtp.ToString('T'));
324 }
325 }
326 }
327 }
328 break;
329 default: ;
330 }
331 }
332 break;
337 for (SI::Loop::Iterator it4; lcd->logicalChannelLoop.getNext(LogicalChannel, it4); ) {
338 if (LogicalChannel.getVisibleServiceFlag()) {
339 int lcn = LogicalChannel.getLogicalChannelNumber();
340 int sid = LogicalChannel.getServiceId();
341 for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
342 if (!Channel->GroupSep() && Channel->Sid() == sid && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
343 ChannelsModified |= Channel->SetLcn(lcn);
344 break;
345 }
346 }
347 }
348 }
349 }
350 break;
355 for (SI::Loop::Iterator it4; lcd->hdSimulcastLogicalChannelLoop.getNext(HdSimulcastLogicalChannel, it4); ) {
356 if (HdSimulcastLogicalChannel.getVisibleServiceFlag()) {
357 int lcn = HdSimulcastLogicalChannel.getLogicalChannelNumber();
358 int sid = HdSimulcastLogicalChannel.getServiceId();
359 for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
360 if (!Channel->GroupSep() && Channel->Sid() == sid && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
361 ChannelsModified |= Channel->SetLcn(lcn);
362 break;
363 }
364 }
365 }
366 }
367 }
368 break;
369 default: ;
370 }
371 delete d;
372 }
373 }
375 dbgnit(" trigger sdtFilter for current tp %d\n", Transponder());
377 }
378 StateKey.Remove(ChannelsModified);
379}
#define ISTRANSPONDER(f1, f2)
Definition: channels.h:18
bool CheckCRCAndParse()
Definition: si.c:65
Descriptor * getNext(Iterator &it)
Definition: si.c:112
DescriptorTag getDescriptorTag() const
Definition: si.c:100
int getExtensionDescriptorTag() const
Definition: descriptor.c:889
TypeLoop< ThirtyTwoBit > frequencies
Definition: descriptor.h:351
StructureLoop< HdSimulcastLogicalChannel > hdSimulcastLogicalChannelLoop
Definition: descriptor.h:592
StructureLoop< LogicalChannel > logicalChannelLoop
Definition: descriptor.h:574
int getOriginalNetworkId() const
Definition: section.c:106
int getTransportStreamId() const
Definition: section.c:102
DescriptorLoop transportStreamDescriptors
Definition: section.h:100
int getNetworkId() const
Definition: section.c:89
DescriptorLoop commonDescriptors
Definition: section.h:106
StructureLoop< TransportStream > transportStreamLoop
Definition: section.h:107
int getSectionNumber() const
Definition: si.c:88
int getLastSectionNumber() const
Definition: si.c:92
int getVersionNumber() const
Definition: si.c:84
char * getText()
Definition: si.c:222
int getCount()
Definition: si.h:436
T getNext(Iterator &it) const
Definition: si.h:453
bool hasNext(Iterator &it)
Definition: si.h:459
int Nid(void) const
Definition: channels.h:173
int Tid(void) const
Definition: channels.h:174
int Source(void) const
Definition: channels.h:151
bool GroupSep(void) const
Definition: channels.h:180
const char * Parameters(void) const
Definition: channels.h:181
bool SetLcn(int Lcn)
Definition: channels.c:251
int Frequency(void) const
Returns the actual frequency, as given in 'channels.conf'.
Definition: channels.h:148
bool SetTransponderData(int Source, int Frequency, int Srate, const char *Parameters, bool Quiet=false)
Definition: channels.c:180
bool SetId(cChannels *Channels, int Nid, int Tid, int Sid, int Rid=0)
Definition: channels.c:231
int Transponder(void) const
Returns the transponder frequency in MHz, plus the polarization in case of sat.
Definition: channels.c:146
int Srate(void) const
Definition: channels.h:152
int Sid(void) const
Definition: channels.h:175
static cChannels * GetChannelsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of channels for write access.
Definition: channels.c:860
void SetGuard(int Guard)
Definition: dvbdevice.h:150
int StreamId(void) const
Definition: dvbdevice.h:138
cString ToString(char Type) const
Definition: dvbdevice.c:217
char Polarization(void) const
Definition: dvbdevice.h:127
void SetSystem(int System)
Definition: dvbdevice.h:148
void SetSisoMiso(int SisoMiso)
Definition: dvbdevice.h:155
void SetModulation(int Modulation)
Definition: dvbdevice.h:147
int Guard(void) const
Definition: dvbdevice.h:135
int T2SystemId(void) const
Definition: dvbdevice.h:139
void SetRollOff(int RollOff)
Definition: dvbdevice.h:152
void SetCoderateL(int CoderateL)
Definition: dvbdevice.h:146
void SetCoderateH(int CoderateH)
Definition: dvbdevice.h:145
void SetT2SystemId(int T2SystemId)
Definition: dvbdevice.h:154
void SetBandwidth(int Bandwidth)
Definition: dvbdevice.h:144
int CoderateL(void) const
Definition: dvbdevice.h:131
void SetPolarization(char Polarization)
Definition: dvbdevice.h:142
int Transmission(void) const
Definition: dvbdevice.h:134
int SisoMiso(void) const
Definition: dvbdevice.h:140
int Bandwidth(void) const
Definition: dvbdevice.h:129
int System(void) const
Definition: dvbdevice.h:133
void SetTransmission(int Transmission)
Definition: dvbdevice.h:149
void SetHierarchy(int Hierarchy)
Definition: dvbdevice.h:151
int Modulation(void) const
Definition: dvbdevice.h:132
void SetStreamId(int StreamId)
Definition: dvbdevice.h:153
int Hierarchy(void) const
Definition: dvbdevice.h:136
int CoderateH(void) const
Definition: dvbdevice.h:130
void AddTransponder(cChannel *Channel)
Definition: eitscan.c:106
void Set(u_short Pid, u_char Tid, u_char Mask=0xFF)
Sets the given filter data by calling Add() with Sticky = true.
Definition: filter.c:211
int Transponder(void)
Returns the transponder of the data delivered to this filter.
Definition: filter.c:168
virtual void SetStatus(bool On)
Turns this filter on or off, depending on the value of On.
Definition: filter.c:178
int Source(void)
Returns the source of the data delivered to this filter.
Definition: filter.c:163
const cChannel * Channel(void)
Returns the channel of the data delivered to this filter.
Definition: filter.c:173
const T * First(void) const
Returns the first element in this list, or NULL if the list is empty.
Definition: tools.h:653
const T * Next(const T *Object) const
< Returns the element immediately before Object in this list, or NULL if Object is the first element ...
Definition: tools.h:660
virtual void SetStatus(bool On)
Turns this filter on or off, depending on the value of On.
Definition: nit.c:35
virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length)
Processes the data delivered to this filter.
Definition: nit.c:41
cSectionSyncer sectionSyncer
Definition: nit.h:18
cNitFilter(cSdtFilter *SdtFilter)
Definition: nit.c:29
cSdtFilter * sdtFilter
Definition: nit.h:19
Definition: sdt.h:16
void Trigger(int Source)
Definition: sdt.c:45
bool Check(uchar Version, int SectionNumber)
Returns true if Version is not the current version, or the given SectionNumber has not been marked as...
Definition: filter.c:31
bool Processed(int SectionNumber, int LastSectionNumber, int SegmentLastSectionNumber=-1)
Marks the given SectionNumber as processed.
Definition: filter.c:54
void Reset(void)
Definition: filter.c:21
int StandardCompliance
Definition: config.h:290
int UpdateChannels
Definition: config.h:325
static cString ToString(int Code)
Definition: sources.c:55
static bool IsSat(int Code)
Definition: sources.h:57
@ stCable
Definition: sources.h:20
@ stSat
Definition: sources.h:21
@ stTerr
Definition: sources.h:22
static int FromData(eSourceType SourceType, int Position=0, bool East=false)
Definition: sources.c:104
void Remove(bool IncState=true)
Removes this key from the lock it was previously used with.
Definition: thread.c:867
cSetup Setup
Definition: config.c:372
#define STANDARD_NORDIG
Definition: config.h:79
#define DVB_SYSTEM_1
Definition: dvbdevice.c:101
#define DVB_SYSTEM_2
Definition: dvbdevice.c:102
@ TRANSMISSION_MODE_16K
Definition: dvbdevice.h:43
@ TRANSMISSION_MODE_1K
Definition: dvbdevice.h:42
@ TRANSMISSION_MODE_32K
Definition: dvbdevice.h:44
@ GUARD_INTERVAL_19_128
Definition: dvbdevice.h:48
@ GUARD_INTERVAL_19_256
Definition: dvbdevice.h:49
@ GUARD_INTERVAL_1_128
Definition: dvbdevice.h:47
@ TRANSMISSION_MODE_4K
Definition: dvbdevice.h:30
cEITScanner EITScanner
Definition: eitscan.c:90
@ TableIdNIT
Definition: si.h:27
@ S2SatelliteDeliverySystemDescriptorTag
Definition: si.h:136
@ CableDeliverySystemDescriptorTag
Definition: si.h:82
@ ExtensionDescriptorTag
Definition: si.h:140
@ HdSimulcastLogicalChannelDescriptorTag
Definition: si.h:146
@ T2DeliverySystemDescriptorTag
Definition: si.h:152
@ NetworkNameDescriptorTag
Definition: si.h:78
@ SatelliteDeliverySystemDescriptorTag
Definition: si.h:81
@ FrequencyListDescriptorTag
Definition: si.h:112
@ TerrestrialDeliverySystemDescriptorTag
Definition: si.h:104
@ LogicalChannelDescriptorTag
Definition: si.h:142
#define MAXNETWORKNAME
Definition: nit.c:22
static bool DebugNit
Definition: nit.c:25
#define dbgnit(a...)
Definition: nit.c:27
int BCD2INT(int x)
Definition: tools.c:45
T min(T a, T b)
Definition: tools.h:63