vdr  2.4.0
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 4.5 2018/03/18 10:52:21 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:
25 static 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 
35 void cNitFilter::SetStatus(bool On)
36 {
39 }
40 
41 void 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] = "";
50  SI::Descriptor *d;
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  sectionSyncer.Repeat(); // let's not miss any section of the NIT
68  return;
69  }
70  bool ChannelsModified = false;
72  for (SI::Loop::Iterator it; nit.transportStreamLoop.getNext(ts, it); ) {
73  SI::Descriptor *d;
74 
77  int NumFrequencies = fld ? fld->frequencies.getCount() + 1 : 1;
78  int Frequencies[NumFrequencies];
79  if (fld) {
80  int ct = fld->getCodingType();
81  if (ct > 0) {
82  int n = 1;
83  for (SI::Loop::Iterator it3; fld->frequencies.hasNext(it3); ) {
84  int f = fld->frequencies.getNext(it3);
85  switch (ct) {
86  case 1: f = BCD2INT(f) / 100; break;
87  case 2: f = BCD2INT(f) / 10; break;
88  case 3: f = f * 10; break;
89  default: ;
90  }
91  Frequencies[n++] = f;
92  dbgnit(" Frequencies[%d] = %d\n", n - 1, f);
93  }
94  }
95  else
96  NumFrequencies = 1;
97  }
98  delete fld;
99 
100  for (SI::Loop::Iterator it2; (d = ts.transportStreamDescriptors.getNext(it2)); ) {
101  switch (d->getDescriptorTag()) {
106  int Frequency = Frequencies[0] = BCD2INT(sd->getFrequency()) / 100;
107  static char Polarizations[] = { 'H', 'V', 'L', 'R' };
108  dtp.SetPolarization(Polarizations[sd->getPolarization()]);
109  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 };
110  dtp.SetCoderateH(CodeRates[sd->getFecInner()]);
111  static int Modulations[] = { QAM_AUTO, QPSK, PSK_8, QAM_16 };
112  dtp.SetModulation(Modulations[sd->getModulationType()]);
114  static int RollOffs[] = { ROLLOFF_35, ROLLOFF_25, ROLLOFF_20, ROLLOFF_AUTO };
115  dtp.SetRollOff(sd->getModulationSystem() ? RollOffs[sd->getRollOff()] : ROLLOFF_AUTO);
116  int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
117  dbgnit(" %s %d %c %d %d\n", *cSource::ToString(Source), Frequency, dtp.Polarization(), SymbolRate, cChannel::Transponder(Frequency, dtp.Polarization()));
118  if (Setup.UpdateChannels >= 5) {
119  bool found = false;
120  bool forceTransponderUpdate = false;
121  for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
122  if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
123  // Preserve parameters set separately in S2SatelliteDeliverySystemDescriptor:
125  dtp.SetStreamId(dtpc.StreamId());
126  //
127  int transponder = Channel->Transponder();
128  found = true;
129  dtp.SetLcn(Channel->Lcn()); // lcn is set on another descriptor
130  if (!ISTRANSPONDER(cChannel::Transponder(Frequency, dtp.Polarization()), transponder)) {
131  for (int n = 0; n < NumFrequencies; n++) {
132  if (ISTRANSPONDER(cChannel::Transponder(Frequencies[n], dtp.Polarization()), transponder)) {
133  Frequency = Frequencies[n];
134  break;
135  }
136  }
137  }
138  if (ISTRANSPONDER(cChannel::Transponder(Frequency, dtp.Polarization()), Transponder())) // only modify channels if we're actually receiving this transponder
139  ChannelsModified |= Channel->SetTransponderData(Source, Frequency, SymbolRate, dtp.ToString('S'));
140  else if (Channel->Srate() != SymbolRate || strcmp(Channel->Parameters(), dtp.ToString('S')))
141  forceTransponderUpdate = true; // get us receiving this transponder
142  }
143  }
144  if (!found || forceTransponderUpdate) {
145  for (int n = 0; n < NumFrequencies; n++) {
146  cChannel *Channel = new cChannel;
147  Channel->SetId(NULL, ts.getOriginalNetworkId(), ts.getTransportStreamId(), 0, 0);
148  if (Channel->SetTransponderData(Source, Frequencies[n], SymbolRate, dtp.ToString('S')))
150  else
151  delete Channel;
152  }
153  }
154  }
157  }
158  break;
160  if (Setup.UpdateChannels >= 5) {
161  for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
166  dbgnit(" stream id = %d\n", dtp.StreamId());
167  ChannelsModified |= Channel->SetTransponderData(Channel->Source(), Channel->Frequency(), Channel->Srate(), dtp.ToString('S'));
168  break;
169  }
170  }
171  }
172  }
173  break;
178  int Frequency = Frequencies[0] = BCD2INT(sd->getFrequency()) / 10;
179  //XXX FEC_outer???
180  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 };
181  dtp.SetCoderateH(CodeRates[sd->getFecInner()]);
182  static int Modulations[] = { QPSK, QAM_16, QAM_32, QAM_64, QAM_128, QAM_256, QAM_AUTO };
183  dtp.SetModulation(Modulations[min(sd->getModulation(), 6)]);
184  int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
185  dbgnit(" %s %d %d %d %d\n", *cSource::ToString(Source), Frequency, dtp.CoderateH(), dtp.Modulation(), SymbolRate);
186  if (Setup.UpdateChannels >= 5) {
187  bool found = false;
188  bool forceTransponderUpdate = false;
189  for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
190  if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
191  int transponder = Channel->Transponder();
192  found = true;
193  dtp.SetLcn(Channel->Lcn()); // lcn is set on another descriptor
194  if (!ISTRANSPONDER(Frequency / 1000, transponder)) {
195  for (int n = 0; n < NumFrequencies; n++) {
196  if (ISTRANSPONDER(Frequencies[n] / 1000, transponder)) {
197  Frequency = Frequencies[n];
198  break;
199  }
200  }
201  }
202  if (ISTRANSPONDER(Frequency / 1000, Transponder())) // only modify channels if we're actually receiving this transponder
203  ChannelsModified |= Channel->SetTransponderData(Source, Frequency, SymbolRate, dtp.ToString('C'));
204  else if (Channel->Srate() != SymbolRate || strcmp(Channel->Parameters(), dtp.ToString('C')))
205  forceTransponderUpdate = true; // get us receiving this transponder
206  }
207  }
208  if (!found || forceTransponderUpdate) {
209  for (int n = 0; n < NumFrequencies; n++) {
210  cChannel *Channel = new cChannel;
211  Channel->SetId(NULL, ts.getOriginalNetworkId(), ts.getTransportStreamId(), 0, 0);
212  if (Channel->SetTransponderData(Source, Frequencies[n], SymbolRate, dtp.ToString('C')))
214  else
215  delete Channel;
216  }
217  }
218  }
219  if (ISTRANSPONDER(Frequency / 1000, Transponder()))
221  }
222  break;
227  int Frequency = Frequencies[0] = sd->getFrequency() * 10;
228  static int Bandwidths[] = { 8000000, 7000000, 6000000, 5000000, 0, 0, 0, 0 };
229  dtp.SetBandwidth(Bandwidths[sd->getBandwidth()]);
230  static int Constellations[] = { QPSK, QAM_16, QAM_64, QAM_AUTO };
231  dtp.SetModulation(Constellations[sd->getConstellation()]);
232  dtp.SetSystem(DVB_SYSTEM_1);
233  static int Hierarchies[] = { HIERARCHY_NONE, HIERARCHY_1, HIERARCHY_2, HIERARCHY_4, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO };
234  dtp.SetHierarchy(Hierarchies[sd->getHierarchy()]);
235  static int CodeRates[] = { FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO };
236  dtp.SetCoderateH(CodeRates[sd->getCodeRateHP()]);
237  dtp.SetCoderateL(CodeRates[sd->getCodeRateLP()]);
238  static int GuardIntervals[] = { GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_4 };
239  dtp.SetGuard(GuardIntervals[sd->getGuardInterval()]);
240  static int TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_4K, TRANSMISSION_MODE_AUTO };
241  dtp.SetTransmission(TransmissionModes[sd->getTransmissionMode()]);
242  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());
243  if (Setup.UpdateChannels >= 5) {
244  bool found = false;
245  bool forceTransponderUpdate = false;
246  for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
247  if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
248  // Preserve parameters set separately in T2DeliverySystemDescripto:
250  dtp.SetSystem(dtpc.System());
251  dtp.SetStreamId(dtpc.StreamId());
252  dtp.SetT2SystemId(dtp.T2SystemId());
253  dtp.SetSisoMiso(dtpc.SisoMiso());
254  dtp.SetBandwidth(dtpc.Bandwidth());
255  dtp.SetGuard(dtpc.Guard());
256  dtp.SetTransmission(dtpc.Transmission());
257  //
258  int transponder = Channel->Transponder();
259  found = true;
260  dtp.SetLcn(Channel->Lcn()); // lcn is set on another descriptor
261  if (!ISTRANSPONDER(Frequency / 1000000, transponder)) {
262  for (int n = 0; n < NumFrequencies; n++) {
263  if (ISTRANSPONDER(Frequencies[n] / 1000000, transponder)) {
264  Frequency = Frequencies[n];
265  break;
266  }
267  }
268  }
269  if (ISTRANSPONDER(Frequency / 1000000, Transponder())) // only modify channels if we're actually receiving this transponder
270  ChannelsModified |= Channel->SetTransponderData(Source, Frequency, 0, dtp.ToString('T'));
271  else if (strcmp(Channel->Parameters(), dtp.ToString('T')))
272  forceTransponderUpdate = true; // get us receiving this transponder
273  }
274  }
275  if (!found || forceTransponderUpdate) {
276  for (int n = 0; n < NumFrequencies; n++) {
277  cChannel *Channel = new cChannel;
278  Channel->SetId(NULL, ts.getOriginalNetworkId(), ts.getTransportStreamId(), 0, 0);
279  if (Channel->SetTransponderData(Source, Frequencies[n], 0, dtp.ToString('T')))
281  else
282  delete Channel;
283  }
284  }
285  }
286  if (ISTRANSPONDER(Frequency / 1000000, Transponder()))
288  }
289  break;
292  switch (sd->getExtensionDescriptorTag()) {
294  if (Setup.UpdateChannels >= 5) {
295  for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
297  if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
299  int Frequency = Channel->Frequency();
300  int SymbolRate = Channel->Srate();
302  dtp.SetSystem(DVB_SYSTEM_2);
303  dtp.SetStreamId(td->getPlpId());
304  dtp.SetT2SystemId(td->getT2SystemId());
305  if (td->getExtendedDataFlag()) {
306  dtp.SetSisoMiso(td->getSisoMiso());
307  static int T2Bandwidths[] = { 8000000, 7000000, 6000000, 5000000, 10000000, 1712000, 0, 0 };
308  dtp.SetBandwidth(T2Bandwidths[td->getBandwidth()]);
309  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 };
310  dtp.SetGuard(T2GuardIntervals[td->getGuardInterval()]);
311  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 };
312  dtp.SetTransmission(T2TransmissionModes[td->getTransmissionMode()]);
313  //TODO add parsing of frequencies
314  }
315  dbgnit(" stream id = %d\n", dtp.StreamId());
316  ChannelsModified |= Channel->SetTransponderData(Source, Frequency, SymbolRate, dtp.ToString('T'));
317  }
318  }
319  }
320  }
321  break;
322  default: ;
323  }
324  }
325  break;
330  for (SI::Loop::Iterator it4; lcd->logicalChannelLoop.getNext(LogicalChannel, it4); ) {
331  if (LogicalChannel.getVisibleServiceFlag()) {
332  int lcn = LogicalChannel.getLogicalChannelNumber();
333  int sid = LogicalChannel.getServiceId();
334  for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
335  if (!Channel->GroupSep() && Channel->Sid() == sid && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
337  dtp.SetLcn(lcn); // for storing lcn into channels.conf
338  ChannelsModified |= Channel->SetTransponderData(Channel->Source(), Channel->Frequency(), Channel->Srate(), dtp.ToString(cSource::ToChar(Channel->Source())));
339  ChannelsModified |= Channel->SetLcn(lcn);
340  break;
341  }
342  }
343  }
344  }
345  }
346  break;
351  for (SI::Loop::Iterator it4; lcd->hdSimulcastLogicalChannelLoop.getNext(HdSimulcastLogicalChannel, it4); ) {
352  if (HdSimulcastLogicalChannel.getVisibleServiceFlag()) {
353  int lcn = HdSimulcastLogicalChannel.getLogicalChannelNumber();
354  int sid = HdSimulcastLogicalChannel.getServiceId();
355  for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
356  if (!Channel->GroupSep() && Channel->Sid() == sid && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
358  dtp.SetLcn(lcn); // for storing lcn into channels.conf
359  ChannelsModified |= Channel->SetTransponderData(Channel->Source(), Channel->Frequency(), Channel->Srate(), dtp.ToString(cSource::ToChar(Channel->Source())));
360  ChannelsModified |= Channel->SetLcn(lcn);
361  break;
362  }
363  }
364  }
365  }
366  }
367  break;
368  default: ;
369  }
370  delete d;
371  }
372  }
373  StateKey.Remove(ChannelsModified);
374 }
static cString ToString(int Code)
Definition: sources.c:55
int CoderateH(void) const
Definition: dvbdevice.h:133
void SetTransmission(int Transmission)
Definition: dvbdevice.h:153
cSdtFilter * sdtFilter
Definition: nit.h:19
int getOriginalNetworkId() const
Definition: section.c:106
static char ToChar(int Code)
Definition: sources.h:51
void SetPolarization(char Polarization)
Definition: dvbdevice.h:146
int StandardCompliance
Definition: config.h:283
int getVersionNumber() const
Definition: si.c:84
char * getText()
Definition: si.c:222
int Modulation(void) const
Definition: dvbdevice.h:135
int Srate(void) const
Definition: channels.h:153
StructureLoop< LogicalChannel > logicalChannelLoop
Definition: descriptor.h:571
cEITScanner EITScanner
Definition: eitscan.c:90
Definition: sdt.h:16
cString ToString(char Type) const
Definition: dvbdevice.c:212
int Source(void) const
Definition: channels.h:152
void Remove(bool IncState=true)
Removes this key from the lock it was previously used with.
Definition: thread.c:859
const cChannel * Channel(void)
Returns the channel of the data delivered to this filter.
Definition: filter.c:124
int BCD2INT(int x)
Definition: tools.c:45
bool SetId(cChannels *Channels, int Nid, int Tid, int Sid, int Rid=0)
Definition: channels.c:227
int Nid(void) const
Definition: channels.h:174
cSectionSyncer sectionSyncer
Definition: nit.h:18
void SetSisoMiso(int SisoMiso)
Definition: dvbdevice.h:159
T min(T a, T b)
Definition: tools.h:59
int getExtensionDescriptorTag() const
Definition: descriptor.c:875
StructureLoop< HdSimulcastLogicalChannel > hdSimulcastLogicalChannelLoop
Definition: descriptor.h:589
void SetCoderateH(int CoderateH)
Definition: dvbdevice.h:149
void SetRollOff(int RollOff)
Definition: dvbdevice.h:156
DescriptorLoop transportStreamDescriptors
Definition: section.h:100
bool SetTransponderData(int Source, int Frequency, int Srate, const char *Parameters, bool Quiet=false)
Definition: channels.c:177
#define DVB_SYSTEM_2
Definition: nit.c:20
DescriptorLoop commonDescriptors
Definition: section.h:106
static cChannels * GetChannelsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of channels for write access.
Definition: channels.c:855
int Transponder(void) const
Returns the transponder frequency in MHz, plus the polarization in case of sat.
Definition: channels.c:147
bool Sync(uchar Version, int Number, int LastNumber)
Definition: filter.c:36
int Bandwidth(void) const
Definition: dvbdevice.h:132
void Trigger(int Source)
Definition: sdt.c:39
void SetT2SystemId(int T2SystemId)
Definition: dvbdevice.h:158
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
#define ISTRANSPONDER(f1, f2)
Definition: channels.h:18
static bool DebugNit
Definition: nit.c:25
#define STANDARD_NORDIG
Definition: config.h:72
int Hierarchy(void) const
Definition: dvbdevice.h:139
void SetLcn(int Lcn)
Definition: dvbdevice.h:161
void SetSystem(int System)
Definition: dvbdevice.h:152
int Sid(void) const
Definition: channels.h:176
int Source(void)
Returns the source of the data delivered to this filter.
Definition: filter.c:114
bool GroupSep(void) const
Definition: channels.h:181
StructureLoop< TransportStream > transportStreamLoop
Definition: section.h:107
char Polarization(void) const
Definition: dvbdevice.h:130
static bool IsSat(int Code)
Definition: sources.h:57
cSetup Setup
Definition: config.c:372
void Repeat(void)
Definition: filter.c:29
virtual void SetStatus(bool On)
Turns this filter on or off, depending on the value of On.
Definition: nit.c:35
int Guard(void) const
Definition: dvbdevice.h:138
int Tid(void) const
Definition: channels.h:175
int getTransportStreamId() const
Definition: section.c:102
bool SetLcn(int Lcn)
Definition: channels.c:247
const T * First(void) const
Returns the first element in this list, or NULL if the list is empty.
Definition: tools.h:606
int getSectionNumber() const
Definition: si.c:88
#define MAXNETWORKNAME
Definition: nit.c:22
bool CheckCRCAndParse()
Definition: si.c:65
bool hasNext(Iterator &it)
Definition: si.h:459
int CoderateL(void) const
Definition: dvbdevice.h:134
virtual void SetStatus(bool On)
Turns this filter on or off, depending on the value of On.
Definition: filter.c:129
#define dbgnit(a...)
Definition: nit.c:27
int T2SystemId(void) const
Definition: dvbdevice.h:142
int Frequency(void) const
Returns the actual frequency, as given in &#39;channels.conf&#39;.
Definition: channels.h:149
int getNetworkId() const
Definition: section.c:89
unsigned char u_char
Definition: headers.h:24
T getNext(Iterator &it) const
Definition: si.h:453
int UpdateChannels
Definition: config.h:318
void SetStreamId(int StreamId)
Definition: dvbdevice.h:157
void SetHierarchy(int Hierarchy)
Definition: dvbdevice.h:155
void SetGuard(int Guard)
Definition: dvbdevice.h:154
int Transmission(void) const
Definition: dvbdevice.h:137
DescriptorTag getDescriptorTag() const
Definition: si.c:100
int Transponder(void)
Returns the transponder of the data delivered to this filter.
Definition: filter.c:119
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:162
void SetCoderateL(int CoderateL)
Definition: dvbdevice.h:150
void AddTransponder(cChannel *Channel)
Definition: eitscan.c:106
cNitFilter(cSdtFilter *SdtFilter)
Definition: nit.c:29
#define DVB_SYSTEM_1
Definition: nit.c:19
static int FromData(eSourceType SourceType, int Position=0, bool East=false)
Definition: sources.c:104
void Reset(void)
Definition: filter.c:20
int Lcn(void) const
Definition: channels.h:178
const char * Parameters(void) const
Definition: channels.h:182
int getCount()
Definition: si.h:436
TypeLoop< ThirtyTwoBit > frequencies
Definition: descriptor.h:350
Descriptor * getNext(Iterator &it)
Definition: si.c:112
int getLastSectionNumber() const
Definition: si.c:92
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:613
void SetBandwidth(int Bandwidth)
Definition: dvbdevice.h:148
void SetModulation(int Modulation)
Definition: dvbdevice.h:151