vdr 2.6.1
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.2 2021/12/14 21:15:02 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 = BCD2INT(f) / 100; break;
85 case 2: f = BCD2INT(f) / 10; 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] = BCD2INT(sd->getFrequency()) / 100;
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] = BCD2INT(sd->getFrequency()) / 10;
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
StructureLoop< HdSimulcastLogicalChannel > hdSimulcastLogicalChannelLoop
StructureLoop< LogicalChannel > logicalChannelLoop
int getOriginalNetworkId() const
Definition: section.c:106
int getTransportStreamId() const
Definition: section.c:102
DescriptorLoop transportStreamDescriptors
int getNetworkId() const
Definition: section.c:89
DescriptorLoop commonDescriptors
StructureLoop< TransportStream > transportStreamLoop
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
T getNext(Iterator &it) const
bool hasNext(Iterator &it)
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:214
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.
const T * Next(const T *Object) const
< Returns the element immediately before Object in this list, or NULL if Object is the first element ...
virtual void SetStatus(bool On)
Turns this filter on or off, depending on the value of On.
Definition: nit.c:35
cSdtFilter * sdtFilter
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
cNitFilter(cSdtFilter *SdtFilter)
Definition: nit.c:29
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)
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:859
cSetup Setup
Definition: config.c:372
#define STANDARD_NORDIG
Definition: config.h:79
@ 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
T min(T a, T b)
int BCD2INT(int x)
Definition: tools.c:45
@ TableIdNIT
@ NetworkNameDescriptorTag
@ CableDeliverySystemDescriptorTag
@ ExtensionDescriptorTag
@ TerrestrialDeliverySystemDescriptorTag
@ HdSimulcastLogicalChannelDescriptorTag
@ S2SatelliteDeliverySystemDescriptorTag
@ FrequencyListDescriptorTag
@ LogicalChannelDescriptorTag
@ T2DeliverySystemDescriptorTag
@ SatelliteDeliverySystemDescriptorTag
unsigned char u_char
#define MAXNETWORKNAME
Definition: nit.c:22
#define DVB_SYSTEM_1
Definition: nit.c:19
static bool DebugNit
Definition: nit.c:25
#define dbgnit(a...)
Definition: nit.c:27
#define DVB_SYSTEM_2
Definition: nit.c:20