From 36c9c8811de7ee0c5a208627dcecf92445b051b4 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Thu, 25 Dec 2003 12:50:22 +0100 Subject: Now using the 'version number' of EPG events to avoid unnecessary work --- HISTORY | 1 + eit.c | 31 ++++++++++++++++++++++++++----- epg.c | 13 ++++++++++++- epg.h | 8 ++++++-- 4 files changed, 45 insertions(+), 8 deletions(-) diff --git a/HISTORY b/HISTORY index fbf27cf9..ad2701bd 100644 --- a/HISTORY +++ b/HISTORY @@ -2511,3 +2511,4 @@ Video Disk Recorder Revision History - Now the CA descriptors are sent to the CAM in the 'program' or 'ES level' sections, depending on where they are found in the PMT (thanks to Hans-Peter Raschke for reporting this one). This should make SkyCrypt CAMs work. +- Now using the 'version number' of EPG events to avoid unnecessary work. diff --git a/eit.c b/eit.c index 3ac1d40d..f1071826 100644 --- a/eit.c +++ b/eit.c @@ -8,7 +8,7 @@ * Robert Schneider and Rolf Hakenes . * Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg . * - * $Id: eit.c 1.82 2003/12/22 10:57:09 kls Exp $ + * $Id: eit.c 1.83 2003/12/25 12:48:47 kls Exp $ */ #include "eit.h" @@ -64,10 +64,31 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data) if (pEvent->TableID() == 0x00) continue; // If the new event comes from a table that belongs to an "other TS" and the existing - // one comes from an "actual TS" table, lets skip it. - if ((!isActualTS()) && (pEvent->TableID() == 0x4E || pEvent->TableID() == 0x50 || pEvent->TableID() == 0x51)) + // one comes from an "actual TS" table, let's skip it. + #define ISACTUALTS(tid) (tid == 0x4E || (tid & 0x50) == 0x50) + if (!ISACTUALTS(Tid) && ISACTUALTS(pEvent->TableID())) + continue; + // If the new event comes from a "schedule" table and the existing one comes from + // a "present/following" table, let's skip it (the p/f table usually contains more + // information, like e.g. a description). + if ((Tid & 0x50) == 0x50 && pEvent->TableID() == 0x4E || (Tid & 0x60) == 0x60 && pEvent->TableID() == 0x4F) + continue; + // If both events come from the same "schedule" table and the new event's table id is larger than the + // existing one's, let's skip it (higher tids mean "farther in the future" and usually have less information). + if (((Tid & 0x50) == 0x50 || (Tid & 0x60) == 0x60) && (pEvent->TableID() & 0xF0) == (Tid & 0xF0) && (Tid > pEvent->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. + // Unfortunately some stations (like, e.g. "Premiere") broadcast their EPG data on several transponders (like + // the actual Premiere transponder and the Sat.1/Pro7 transponder), but use different version numbers on + // each of them :-( So if one DVB card is tuned to the Premiere transponder, while an other one is tuned + // to the Sat.1/Pro7 transponder, events will keep toggling because ot the bogus version numbers. + if (Tid == pEvent->TableID() && pEvent->Version() == getVersionNumber()) continue; } + pEvent->SetVersion(getVersionNumber()); + pEvent->SetTableID(Tid); + pEvent->SetEventID(SiEitEvent.getEventId()); // unfortunately some stations use different event ids for the same event in different tables :-( SI::Descriptor *d; SI::ExtendedEventDescriptors exGroup; @@ -158,8 +179,8 @@ cTDT::cTDT(const u_char *Data) cEitFilter::cEitFilter(void) { Set(0x12, 0x4E, 0xFE); // event info, actual(0x4E)/other(0x4F) TS, present/following - Set(0x12, 0x50, 0xFE); // event info, actual TS, schedule(0x50)/schedule for another 4 days(0x51) - Set(0x12, 0x60, 0xFE); // event info, other TS, schedule(0x60)/schedule for another 4 days(0x61) + Set(0x12, 0x50, 0xF0); // event info, actual TS, schedule(0x50)/schedule for future days(0x5X) + Set(0x12, 0x60, 0xF0); // event info, other TS, schedule(0x60)/schedule for future days(0x6X) Set(0x14, 0x70); // TDT } diff --git a/epg.c b/epg.c index eb7a53a2..6469708e 100644 --- a/epg.c +++ b/epg.c @@ -7,7 +7,7 @@ * Original version (as used in VDR before 1.3.0) written by * Robert Schneider and Rolf Hakenes . * - * $Id: epg.c 1.1 2003/12/22 13:07:32 kls Exp $ + * $Id: epg.c 1.2 2003/12/25 12:47:26 kls Exp $ */ #include "epg.h" @@ -21,6 +21,7 @@ cEvent::cEvent(tChannelID ChannelID, u_int16_t EventID) channelID = ChannelID; eventID = EventID; tableID = 0; + version = 0xFF; // actual version numbers are 0..31 isPresent = isFollowing = false; title = NULL; shortText = NULL; @@ -37,11 +38,21 @@ cEvent::~cEvent() free(description); } +void cEvent::SetEventID(u_int16_t EventID) +{ + eventID = EventID; +} + void cEvent::SetTableID(uchar TableID) { tableID = TableID; } +void cEvent::SetVersion(uchar Version) +{ + version = Version; +} + void cEvent::SetIsPresent(bool IsPresent) { isPresent = IsPresent; diff --git a/epg.h b/epg.h index 4a999d12..84667848 100644 --- a/epg.h +++ b/epg.h @@ -7,7 +7,7 @@ * Original version (as used in VDR before 1.3.0) written by * Robert Schneider and Rolf Hakenes . * - * $Id: epg.h 1.1 2003/12/22 13:03:10 kls Exp $ + * $Id: epg.h 1.2 2003/12/24 13:20:35 kls Exp $ */ #ifndef __EPG_H @@ -26,6 +26,7 @@ private: tChannelID channelID; // Channel ID of program for this event u_int16_t eventID; // Event ID of this event uchar tableID; // Table ID this event came from + uchar version; // Version number of section this event came from //XXX present/following obsolete??? bool isPresent; // true if this is the present event running bool isFollowing; // true if this is the next event on this channel @@ -41,7 +42,8 @@ public: ~cEvent(); tChannelID ChannelID(void) const { return channelID; } u_int16_t EventID(void) const { return eventID; } - const uchar TableID(void) const { return tableID; } + uchar TableID(void) const { return tableID; } + uchar Version(void) const { return version; } bool IsPresent(void) const { return isPresent; } bool IsFollowing(void) const { return isFollowing; } const char *Title(void) const { return title; } @@ -53,7 +55,9 @@ public: const char *GetDateString(void) const; const char *GetTimeString(void) const; const char *GetEndTimeString(void) const; + void SetEventID(u_int16_t EventID); void SetTableID(uchar TableID); + void SetVersion(uchar Version); void SetIsPresent(bool IsPresent); void SetIsFollowing(bool IsFollowing); void SetTitle(const char *Title); -- cgit v1.2.3