summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2014-03-11 09:32:48 +0100
committerKlaus Schmidinger <vdr@tvdr.de>2014-03-11 09:32:48 +0100
commitba9651e86348d56f3b7e937652f78fc0fe9e86fa (patch)
treed1d2ff808c9155ebac6545e9499367cebdfdc4ea
parentda404e00c0c95978bd2b126b6e2a6b01556630ec (diff)
downloadvdr-ba9651e86348d56f3b7e937652f78fc0fe9e86fa.tar.gz
vdr-ba9651e86348d56f3b7e937652f78fc0fe9e86fa.tar.bz2
The SDT is now only parsed *after* the NIT has been read
-rw-r--r--HISTORY5
-rw-r--r--device.c4
-rw-r--r--nit.c8
-rw-r--r--nit.h6
-rw-r--r--sdt.c23
-rw-r--r--sdt.h5
6 files changed, 37 insertions, 14 deletions
diff --git a/HISTORY b/HISTORY
index 3f062fc9..53abf68c 100644
--- a/HISTORY
+++ b/HISTORY
@@ -7870,7 +7870,7 @@ Video Disk Recorder Revision History
and also to use the correct directory with --edit (the latter reported by Marko
Mäkelä).
-2014-03-10: Version 2.0.6
+2014-03-11: Version 2.0.6
- Updated 'sources.conf' (thanks to Antti Hartikainen).
- cFont::CreateFont() now returns a dummy font in case there are no fonts installed.
@@ -7907,3 +7907,6 @@ Video Disk Recorder Revision History
- Fixed adding new source types in case they are already registered (reported by Rolf
Ahrenberg).
- Fixed drawing the live indicator in the LCARS skin in case there are no devices.
+- The SDT is now only parsed *after* the NIT has been read, and it explicitly uses
+ the source value derived from the NIT. This should prevent new channels from being
+ created with the wrong source.
diff --git a/device.c b/device.c
index 5e7d4751..6154b6dc 100644
--- a/device.c
+++ b/device.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: device.c 2.74.1.3 2014/02/18 14:12:08 kls Exp $
+ * $Id: device.c 2.74.1.4 2014/03/11 09:29:52 kls Exp $
*/
#include "device.h"
@@ -574,7 +574,7 @@ void cDevice::StartSectionHandler(void)
AttachFilter(eitFilter = new cEitFilter);
AttachFilter(patFilter = new cPatFilter);
AttachFilter(sdtFilter = new cSdtFilter(patFilter));
- AttachFilter(nitFilter = new cNitFilter);
+ AttachFilter(nitFilter = new cNitFilter(sdtFilter));
}
}
diff --git a/nit.c b/nit.c
index 89988618..8265f50e 100644
--- a/nit.c
+++ b/nit.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: nit.c 2.10 2013/03/07 09:42:29 kls Exp $
+ * $Id: nit.c 2.10.1.1 2014/03/11 09:29:59 kls Exp $
*/
#include "nit.h"
@@ -19,8 +19,9 @@
#define DVB_SYSTEM_1 0 // see also dvbdevice.c
#define DVB_SYSTEM_2 1
-cNitFilter::cNitFilter(void)
+cNitFilter::cNitFilter(cSdtFilter *SdtFilter)
{
+ sdtFilter = SdtFilter;
numNits = 0;
networkId = 0;
Set(0x10, 0x40); // NIT
@@ -183,6 +184,7 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
}
}
}
+ sdtFilter->Trigger(Source);
}
break;
case SI::S2SatelliteDeliverySystemDescriptorTag: {
@@ -253,6 +255,7 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
}
}
}
+ sdtFilter->Trigger(Source);
}
break;
case SI::TerrestrialDeliverySystemDescriptorTag: {
@@ -316,6 +319,7 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
}
}
}
+ sdtFilter->Trigger(Source);
}
break;
case SI::ExtensionDescriptorTag: {
diff --git a/nit.h b/nit.h
index c4ac82b5..2411e0f2 100644
--- a/nit.h
+++ b/nit.h
@@ -4,13 +4,14 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: nit.h 1.3 2007/06/10 08:50:21 kls Exp $
+ * $Id: nit.h 2.0.1.1 2014/03/11 09:30:05 kls Exp $
*/
#ifndef __NIT_H
#define __NIT_H
#include "filter.h"
+#include "sdt.h"
#define MAXNITS 16
#define MAXNETWORKNAME Utf8BufSize(256)
@@ -26,13 +27,14 @@ private:
};
cSectionSyncer sectionSyncer;
+ cSdtFilter *sdtFilter;
cNit nits[MAXNITS];
u_short networkId;
int numNits;
protected:
virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length);
public:
- cNitFilter(void);
+ cNitFilter(cSdtFilter *SdtFilter);
virtual void SetStatus(bool On);
};
diff --git a/sdt.c b/sdt.c
index 8eeebc40..18efcbc2 100644
--- a/sdt.c
+++ b/sdt.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: sdt.c 2.5.1.1 2014/02/18 14:12:33 kls Exp $
+ * $Id: sdt.c 2.5.1.2 2014/03/11 09:30:59 kls Exp $
*/
#include "sdt.h"
@@ -17,19 +17,30 @@
cSdtFilter::cSdtFilter(cPatFilter *PatFilter)
{
+ source = cSource::stNone;
patFilter = PatFilter;
Set(0x11, 0x42); // SDT
}
void cSdtFilter::SetStatus(bool On)
{
+ cMutexLock MutexLock(&mutex);
cFilter::SetStatus(On);
sectionSyncer.Reset();
+ if (!On)
+ source = cSource::stNone;
+}
+
+void cSdtFilter::Trigger(int Source)
+{
+ cMutexLock MutexLock(&mutex);
+ source = Source;
}
void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length)
{
- if (!(Source() && Transponder()))
+ cMutexLock MutexLock(&mutex);
+ if (!(source && Transponder()))
return;
SI::SDT sdt(Data, false);
if (!sdt.CheckCRCAndParse())
@@ -40,9 +51,9 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
return;
SI::SDT::Service SiSdtService;
for (SI::Loop::Iterator it; sdt.serviceLoop.getNext(SiSdtService, it); ) {
- cChannel *channel = Channels.GetByChannelID(tChannelID(Source(), sdt.getOriginalNetworkId(), sdt.getTransportStreamId(), SiSdtService.getServiceId()));
+ cChannel *channel = Channels.GetByChannelID(tChannelID(source, sdt.getOriginalNetworkId(), sdt.getTransportStreamId(), SiSdtService.getServiceId()));
if (!channel)
- channel = Channels.GetByChannelID(tChannelID(Source(), 0, Transponder(), SiSdtService.getServiceId()));
+ channel = Channels.GetByChannelID(tChannelID(source, 0, Transponder(), SiSdtService.getServiceId()));
cLinkChannels *LinkChannels = NULL;
SI::Descriptor *d;
@@ -64,7 +75,7 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
sd->serviceName.getText(NameBuf, ShortNameBuf, sizeof(NameBuf), sizeof(ShortNameBuf));
char *pn = compactspace(NameBuf);
char *ps = compactspace(ShortNameBuf);
- if (!*ps && cSource::IsCable(Source())) {
+ if (!*ps && cSource::IsCable(source)) {
// Some cable providers don't mark short channel names according to the
// standard, but rather go their own way and use "name>short name":
char *p = strchr(pn, '>'); // fix for UPC Wien
@@ -115,7 +126,7 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
SI::NVODReferenceDescriptor *nrd = (SI::NVODReferenceDescriptor *)d;
SI::NVODReferenceDescriptor::Service Service;
for (SI::Loop::Iterator it; nrd->serviceLoop.getNext(Service, it); ) {
- cChannel *link = Channels.GetByChannelID(tChannelID(Source(), Service.getOriginalNetworkId(), Service.getTransportStream(), Service.getServiceId()));
+ cChannel *link = Channels.GetByChannelID(tChannelID(source, Service.getOriginalNetworkId(), Service.getTransportStream(), Service.getServiceId()));
if (!link && Setup.UpdateChannels >= 4) {
link = Channels.NewChannel(Channel(), "NVOD", "", "", Service.getOriginalNetworkId(), Service.getTransportStream(), Service.getServiceId());
patFilter->Trigger(Service.getServiceId());
diff --git a/sdt.h b/sdt.h
index a427119c..3b6d0032 100644
--- a/sdt.h
+++ b/sdt.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: sdt.h 1.2 2004/01/05 14:30:14 kls Exp $
+ * $Id: sdt.h 2.0.1.1 2014/03/11 09:31:08 kls Exp $
*/
#ifndef __SDT_H
@@ -15,13 +15,16 @@
class cSdtFilter : public cFilter {
private:
+ cMutex mutex;
cSectionSyncer sectionSyncer;
+ int source;
cPatFilter *patFilter;
protected:
virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length);
public:
cSdtFilter(cPatFilter *PatFilter);
virtual void SetStatus(bool On);
+ void Trigger(int Source);
};
#endif //__SDT_H