summaryrefslogtreecommitdiff
path: root/eit.c
diff options
context:
space:
mode:
Diffstat (limited to 'eit.c')
-rw-r--r--eit.c80
1 files changed, 35 insertions, 45 deletions
diff --git a/eit.c b/eit.c
index b1fe9955..1b8c84c4 100644
--- a/eit.c
+++ b/eit.c
@@ -8,7 +8,7 @@
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
*
- * $Id: eit.c 2.14 2012/03/08 15:05:45 kls Exp $
+ * $Id: eit.c 2.15 2012/03/10 14:43:52 kls Exp $
*/
#include "eit.h"
@@ -36,12 +36,13 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
cChannel *channel = Channels.GetByChannelID(channelID, true);
if (!channel)
return; // only collect data for known channels
+ if (EpgHandlers.IgnoreChannel(channel))
+ return;
cSchedule *pSchedule = (cSchedule *)Schedules->GetSchedule(channel, true);
bool Empty = true;
bool Modified = false;
- bool HasExternalData = false;
time_t SegmentStart = 0;
time_t SegmentEnd = 0;
time_t Now = time(NULL);
@@ -53,7 +54,8 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
SI::EIT::Event SiEitEvent;
for (SI::Loop::Iterator it; eventLoop.getNext(SiEitEvent, it); ) {
- bool ExternalData = false;
+ if (EpgHandlers.HandleEitEvent(pSchedule, &SiEitEvent, Tid, getVersionNumber()))
+ continue; // an EPG handler has done all of the processing
time_t StartTime = SiEitEvent.getStartTime();
int Duration = SiEitEvent.getDuration();
// Drop bogus events - but keep NVOD reference events, where all bits of the start time field are set to 1, resulting in a negative number.
@@ -72,23 +74,17 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
// If we don't have that event yet, we create a new one.
// Otherwise we copy the information into the existing event anyway, because the data might have changed.
pEvent = newEvent = new cEvent(SiEitEvent.getEventId());
- if (!pEvent)
- continue;
+ newEvent->SetStartTime(StartTime);
+ newEvent->SetDuration(Duration);
+ pSchedule->AddEvent(newEvent);
}
else {
// We have found an existing event, either through its event ID or its start time.
pEvent->SetSeen();
- // If the existing event has a zero table ID it was defined externally and shall
- // not be overwritten.
- uchar TableID = pEvent->TableID();
- if (TableID == 0x00) {
- if (pEvent->Version() == getVersionNumber())
- continue;
- HasExternalData = ExternalData = true;
- }
+ uchar TableID = max(pEvent->TableID(), uchar(0x4E)); // for backwards compatibility, table ids less than 0x4E are treated as if they were "present"
// If the new event has a higher table ID, let's skip it.
// The lower the table ID, the more "current" the information.
- else if (Tid > TableID)
+ if (Tid > TableID)
continue;
// If the new event comes from the same table and has the same version number
// as the existing one, let's skip it to avoid unnecessary work.
@@ -98,21 +94,20 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
// to the Sat.1/Pro7 transponder, events will keep toggling because of the bogus version numbers.
else if (Tid == TableID && pEvent->Version() == getVersionNumber())
continue;
+ EpgHandlers.SetEventID(pEvent, SiEitEvent.getEventId()); // unfortunately some stations use different event ids for the same event in different tables :-(
+ EpgHandlers.SetStartTime(pEvent, StartTime);
+ EpgHandlers.SetDuration(pEvent, Duration);
}
- if (!ExternalData) {
- pEvent->SetEventID(SiEitEvent.getEventId()); // unfortunately some stations use different event ids for the same event in different tables :-(
+ if (pEvent->TableID() > 0x4E) // for backwards compatibility, table ids less than 0x4E are never overwritten
pEvent->SetTableID(Tid);
- pEvent->SetStartTime(StartTime);
- pEvent->SetDuration(Duration);
- }
- if (newEvent)
- pSchedule->AddEvent(newEvent);
if (Tid == 0x4E) { // we trust only the present/following info on the actual TS
if (SiEitEvent.getRunningStatus() >= SI::RunningStatusNotRunning)
pSchedule->SetRunningStatus(pEvent, SiEitEvent.getRunningStatus(), channel);
}
- if (OnlyRunningStatus)
+ if (OnlyRunningStatus) {
+ pEvent->SetVersion(0xFF); // we have already changed the table id above, so set the version to an invalid value to make sure the next full run will be executed
continue; // do this before setting the version, so that the full update can be done later
+ }
pEvent->SetVersion(getVersionNumber());
int LanguagePreferenceShort = -1;
@@ -124,10 +119,6 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
cLinkChannels *LinkChannels = NULL;
cComponents *Components = NULL;
for (SI::Loop::Iterator it2; (d = SiEitEvent.eventDescriptors.getNext(it2)); ) {
- if (ExternalData && d->getDescriptorTag() != SI::ComponentDescriptorTag) {
- delete d;
- continue;
- }
switch (d->getDescriptorTag()) {
case SI::ExtendedEventDescriptorTag: {
SI::ExtendedEventDescriptor *eed = (SI::ExtendedEventDescriptor *)d;
@@ -164,7 +155,7 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
NumContents++;
}
}
- pEvent->SetContents(Contents);
+ EpgHandlers.SetContents(pEvent, Contents);
}
break;
case SI::ParentalRatingDescriptorTag: {
@@ -183,7 +174,7 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
case 0x13: ParentalRating = 16; break;
default: ParentalRating = 0;
}
- pEvent->SetParentalRating(ParentalRating);
+ EpgHandlers.SetParentalRating(pEvent, ParentalRating);
}
}
}
@@ -202,7 +193,7 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
else if (month == 0 && t.tm_mon == 11) // current month is jan, but event is in dec
t.tm_year--;
time_t vps = mktime(&t);
- pEvent->SetVps(vps);
+ EpgHandlers.SetVps(pEvent, vps);
}
break;
case SI::TimeShiftedEventDescriptorTag: {
@@ -213,9 +204,9 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
rEvent = (cEvent *)rSchedule->GetEvent(tsed->getReferenceEventId());
if (!rEvent)
break;
- pEvent->SetTitle(rEvent->Title());
- pEvent->SetShortText(rEvent->ShortText());
- pEvent->SetDescription(rEvent->Description());
+ EpgHandlers.SetTitle(pEvent, rEvent->Title());
+ EpgHandlers.SetShortText(pEvent, rEvent->ShortText());
+ EpgHandlers.SetDescription(pEvent, rEvent->Description());
}
break;
case SI::LinkageDescriptorTag: {
@@ -273,30 +264,30 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
if (!rEvent) {
if (ShortEventDescriptor) {
char buffer[Utf8BufSize(256)];
- pEvent->SetTitle(ShortEventDescriptor->name.getText(buffer, sizeof(buffer)));
- pEvent->SetShortText(ShortEventDescriptor->text.getText(buffer, sizeof(buffer)));
+ EpgHandlers.SetTitle(pEvent, ShortEventDescriptor->name.getText(buffer, sizeof(buffer)));
+ EpgHandlers.SetShortText(pEvent, ShortEventDescriptor->text.getText(buffer, sizeof(buffer)));
}
- else if (!HasExternalData) {
- pEvent->SetTitle(NULL);
- pEvent->SetShortText(NULL);
+ else {
+ EpgHandlers.SetTitle(pEvent, NULL);
+ EpgHandlers.SetShortText(pEvent, NULL);
}
if (ExtendedEventDescriptors) {
char buffer[Utf8BufSize(ExtendedEventDescriptors->getMaximumTextLength(": ")) + 1];
- pEvent->SetDescription(ExtendedEventDescriptors->getText(buffer, sizeof(buffer), ": "));
+ EpgHandlers.SetDescription(pEvent, ExtendedEventDescriptors->getText(buffer, sizeof(buffer), ": "));
}
- else if (!HasExternalData)
- pEvent->SetDescription(NULL);
+ else
+ EpgHandlers.SetDescription(pEvent, NULL);
}
delete ExtendedEventDescriptors;
delete ShortEventDescriptor;
pEvent->SetComponents(Components);
- if (!HasExternalData)
- pEvent->FixEpgBugs();
+ EpgHandlers.FixEpgBugs(pEvent);
if (LinkChannels)
channel->SetLinkChannels(LinkChannels);
Modified = true;
+ EpgHandlers.HandleEvent(pEvent);
}
if (Tid == 0x4E) {
if (Empty && getSectionNumber() == 0)
@@ -307,9 +298,8 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
if (OnlyRunningStatus)
return;
if (Modified) {
- pSchedule->Sort();
- if (!HasExternalData)
- pSchedule->DropOutdated(SegmentStart, SegmentEnd, Tid, getVersionNumber());
+ EpgHandlers.SortSchedule(pSchedule);
+ EpgHandlers.DropOutdated(pSchedule, SegmentStart, SegmentEnd, Tid, getVersionNumber());
Schedules->SetModified(pSchedule);
}
}