diff options
author | Dimitar Petrovski <dimeptr@gmail.com> | 2014-04-14 09:40:50 +0200 |
---|---|---|
committer | Dimitar Petrovski <dimeptr@gmail.com> | 2014-04-14 09:40:50 +0200 |
commit | d7dc6141c91b48c410e9cc5734ca9a2adecc278e (patch) | |
tree | 4f3453ec0402557730fb67d1a65795a8c8a79333 | |
parent | 69b47ba4bf0195fd6820beb2cf4f7c7ea31f4011 (diff) | |
download | vdr-plugin-eepg-d7dc6141c91b48c410e9cc5734ca9a2adecc278e.tar.gz vdr-plugin-eepg-d7dc6141c91b48c410e9cc5734ca9a2adecc278e.tar.bz2 |
Move Format out of global scope, fixes #1634 and other problems with multiple devices. Thanks to cheesemonster
-rw-r--r-- | README | 1 | ||||
-rw-r--r-- | eepg.c | 19 | ||||
-rw-r--r-- | eit2.c | 7 | ||||
-rw-r--r-- | eit2.h | 8 | ||||
-rw-r--r-- | epghandler.c | 4 | ||||
-rw-r--r-- | util.c | 1 | ||||
-rw-r--r-- | util.h | 4 |
7 files changed, 28 insertions, 16 deletions
@@ -113,6 +113,7 @@ This code is based on: * cAddEventThread from EPGFixer plugin by Matti Lehtimaki matti.lehtimaki /at/ gmail.com Thanks to mrgandalf, and the others who helped map NA eit. Thanks to VDR User for testing and providing makequiv.sh script for S72.7W channels. +Thanks to cheesemonster for providing a patch to fix multipe device problems We wish to thank all authors for the great work they have been doing, decoding this EEPG data; this plugin tries to combine the best of all worlds. @@ -175,7 +175,7 @@ private: bool EndChannels, EndThemes; //only used for ?? int MHWStartTime; //only used for MHW1 bool ChannelsOk; - //int Format; //the format that this filter currently is processing + EFormat Format; //the format that this filter currently is processing std::map < int, int >ChannelSeq; // ChannelSeq[ChannelId] returns the recordnumber of the channel Summary_t *Summaries[MAX_TITLES]; @@ -194,6 +194,8 @@ private: void NextPmt (void); void ProccessContinuous(u_short Pid, u_char Tid, int Length, const u_char *Data); + bool load_sky_file (const char *filename); + int sky_huffman_decode (const u_char * Data, int Length, unsigned char *DecodeText); protected: virtual void Process (u_short Pid, u_char Tid, const u_char * Data, int Length); virtual void AddFilter (u_short Pid, u_char Tid); @@ -258,7 +260,7 @@ void cFilterEEPG::SetStatus (bool On) if (!On) { FreeSummaries (); FreeTitles (); - //Format = 0; + Format = MHW1; ChannelsOk = false; NumberOfTables = 0; } else { @@ -422,7 +424,7 @@ static bool load_freesat_file (int tableid, const char *filename) * \param filename - Filename to load * \return Success of operation */ -static bool load_sky_file (const char *filename) +bool cFilterEEPG::load_sky_file (const char *filename) { FILE *FileDict; char *Line; @@ -646,7 +648,7 @@ char *freesat_huffman_decode (const unsigned char *src, size_t size) return NULL; } -int sky_huffman_decode (const u_char * Data, int Length, unsigned char *DecodeText) +int cFilterEEPG::sky_huffman_decode (const u_char * Data, int Length, unsigned char *DecodeText) { sNodeH *nH, H=(Format==SKY_IT)?*sky_tables[0]:*sky_tables[1]; int i; @@ -793,8 +795,13 @@ bool cFilterEEPG::GetThemesSKYBOX (void) //TODO can't we read this from the DVB * \brief Initialize the Huffman dictionaries if they are not already initialized. * */ +static cMutex InitDictionary_mutex; + bool cFilterEEPG::InitDictionary (void) { + // This function must be serialised because it updates sky_tables and tables + // which are both globals. + cMutexLock MutexLock(&InitDictionary_mutex); string FileName = cSetupEEPG::getInstance()->getConfDir(); switch (Format) { case SKY_IT: @@ -2729,7 +2736,7 @@ void cFilterEEPG::ProccessContinuous(u_short Pid, u_char Tid, int Length, const cSchedules *Schedules = (cSchedules*)(cSchedules::Schedules(SchedulesLock)); //Look for other satelite positions only if Dish/Bell ExpressVU for the moment hardcoded pid check if(Schedules) - SI::cEIT2 EIT(Schedules, Source(), Tid, Data, Pid == EIT_PID); + SI::cEIT2 EIT(Schedules, Source(), Tid, Data, Format, Pid == EIT_PID); else//cEIT EIT (Schedules, Source (), Tid, Data); { @@ -2740,7 +2747,7 @@ void cFilterEEPG::ProccessContinuous(u_short Pid, u_char Tid, int Length, const cSchedulesLock SchedulesLock; cSchedules *Schedules = (cSchedules*)(cSchedules::Schedules(SchedulesLock)); if(Schedules) - SI::cEIT2 EIT(Schedules, Source(), Tid, Data, Pid == EIT_PID, true); + SI::cEIT2 EIT(Schedules, Source(), Tid, Data, Format, Pid == EIT_PID, true); //cEIT EIT (Schedules, Source (), Tid, Data, true); } @@ -9,7 +9,6 @@ #include <string> #include <vdr/config.h> #include "log.h" -#include "util.h" #include "dish.h" #include "equivhandler.h" @@ -435,10 +434,11 @@ void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, channel->SetLinkChannels (LinkChannels); } -cEIT2::cEIT2 (cSchedules * Schedules, int Source, u_char Tid, const u_char * Data, bool isEITPid, bool OnlyRunningStatus) +cEIT2::cEIT2 (cSchedules * Schedules, int Source, u_char Tid, const u_char * Data, EFormat format, bool isEITPid, bool OnlyRunningStatus) : SI::EIT (Data, false) , OnlyRunningStatus(OnlyRunningStatus) , Schedules(Schedules) +, Format(format) { //LogD(2, prep("cEIT2::cEIT2")); @@ -563,13 +563,14 @@ cEIT2::cEIT2 (cSchedules * Schedules, int Source, u_char Tid, const u_char * Dat } //end of cEIT2 -cEIT2::cEIT2 (cSchedule * Schedule) +cEIT2::cEIT2 (cSchedule * Schedule, EFormat format) : Empty(true) , Modified(false) , OnlyRunningStatus(false) , SegmentStart(0) , SegmentEnd(0) , Schedules(NULL) +, Format(format) { //LogD(2, prep("cEIT2::cEIT2")); // if (Tid > 0 && (Format == DISH_BEV || (SetupPE->ProcessEIT && isEITPid))) Tid--; @@ -4,7 +4,9 @@ #include <libsi/descriptor.h> #include <libsi/si.h> #include <vdr/epg.h> +#include "util.h" +using namespace util; namespace SI { enum DescriptorTagExt { @@ -22,9 +24,10 @@ extern bool SystemCharacterTableIsSingleByte;*/ class cEIT2:public SI::EIT { public: - cEIT2(cSchedules * Schedules, int Source, u_char Tid, const u_char * Data, bool isEITPid = false, + cEIT2(cSchedules * Schedules, int Source, u_char Tid, const u_char * Data, + EFormat format, bool isEITPid = false, bool OnlyRunningStatus = false); - cEIT2 (cSchedule * Schedule); + cEIT2 (cSchedule * Schedule, EFormat format); //protected: // void updateEquivalent(cSchedules * Schedules, tChannelID channelID, cEvent *pEvent); cEvent* ProcessEitEvent(cSchedule *Schedule, const SI::EIT::Event *EitEvent, uchar TableID, uchar Version); @@ -42,6 +45,7 @@ private: time_t SegmentStart; time_t SegmentEnd; cSchedules* Schedules; + EFormat Format; cChannel* channel; }; diff --git a/epghandler.c b/epghandler.c index 49c89e4..4b67fe3 100644 --- a/epghandler.c +++ b/epghandler.c @@ -34,9 +34,9 @@ bool cEEpgHandler::HandleEitEvent(cSchedule* Schedule, int nid = Schedule->ChannelID().Nid(); if ((nid >= 0x1001 && nid <= 0x100B) || nid == 0x101 || nid == 0x100) { //Set the Format for Eit events so that the new lines are not erased with FixEpgBugs - if (Format != DISH_BEV) Format = DISH_BEV; + EFormat Format = DISH_BEV; - SI::cEIT2 eit2(Schedule); + SI::cEIT2 eit2(Schedule, Format); eit2.ProcessEitEvent(Schedule, EitEvent, TableID, Version); return true; } @@ -26,7 +26,6 @@ int YesterdayEpochUTC; struct hufftab *tables[2][128]; int table_size[2][128]; -EFormat Format; cEquivHandler* EquivHandler; cChannel *GetChannelByID(tChannelID & channelID, bool searchOtherPos) @@ -32,7 +32,7 @@ extern int Yesterday; extern int YesterdayEpoch; extern int YesterdayEpochUTC; -extern enum EFormat +enum EFormat { //First all batchmode, load ONCE protocols: MHW1 = 0, @@ -47,7 +47,7 @@ extern enum EFormat EIT, //the highest number of EPG-formats that is supported by this plugin HIGHEST_FORMAT = EIT -} Format; +}; extern cEquivHandler* EquivHandler; |