Taking the Sid into account when detecting version changes in processing the PMT

This commit is contained in:
Klaus Schmidinger 2004-03-13 10:35:38 +01:00
parent 9c1f56ec71
commit 4f6f05161e
4 changed files with 19 additions and 12 deletions

View File

@ -945,6 +945,8 @@ St
for fixing a typo in libsi/si.h
for fixing some descriptor handling in 'libsi'
for pointing out a problem with "itemized" texts in EPG data
for pointing out a problem with taking the Sid into account when detecting version
changes in processing the PMT
Marc Hoppe <MarcHoppe@gmx.de>
for fixing handling the current menu item

View File

@ -2714,7 +2714,7 @@ Video Disk Recorder Revision History
whether an event is currently running (see MANUAL under "The "Schedule" Menu"
for details).
2004-03-07: Version 1.3.6
2004-03-13: Version 1.3.6
- Completed the Finnish OSD texts (thanks to Rolf Ahrenberg).
- Fixed some descriptor handling in 'libsi' (thanks to Stéphane Esté-Gracias).
@ -2730,3 +2730,5 @@ Video Disk Recorder Revision History
- Fixed handling VPS times at year boundaries.
- Avoiding too many consecutive "ring buffer overflow" messages (which only
slowed down performance even more).
- Taking the Sid into account when detecting version changes in processing the
PMT (thanks to Stéphane Esté-Gracias for pointing out this problem).

18
pat.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: pat.c 1.7 2004/01/25 15:12:53 kls Exp $
* $Id: pat.c 1.8 2004/03/07 16:59:00 kls Exp $
*/
#include "pat.h"
@ -250,19 +250,21 @@ void cPatFilter::Trigger(void)
numPmtEntries = 0;
}
bool cPatFilter::PmtVersionChanged(int PmtPid, int Version)
bool cPatFilter::PmtVersionChanged(int PmtPid, int Sid, int Version)
{
Version <<= 16;
uint64_t v = Version;
v <<= 32;
uint64_t id = (PmtPid | (Sid << 16)) & 0x00000000FFFFFFFFLL;
for (int i = 0; i < numPmtEntries; i++) {
if ((pmtVersion[i] & 0x0000FFFF) == PmtPid) {
bool Changed = (pmtVersion[i] & 0x00FF0000) != Version;
if ((pmtVersion[i] & 0x00000000FFFFFFFFLL) == id) {
bool Changed = (pmtVersion[i] & 0x000000FF00000000LL) != v;
if (Changed)
pmtVersion[i] = PmtPid | Version;
pmtVersion[i] = id | v;
return Changed;
}
}
if (numPmtEntries < MAXPMTENTRIES)
pmtVersion[numPmtEntries++] = PmtPid | Version;
pmtVersion[numPmtEntries++] = id | v;
return true;
}
@ -301,7 +303,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
SI::PMT pmt(Data, false);
if (!pmt.CheckCRCAndParse())
return;
if (!PmtVersionChanged(pmtPid, pmt.getVersionNumber())) {
if (!PmtVersionChanged(pmtPid, pmt.getTableIdExtension(), pmt.getVersionNumber())) {
lastPmtScan = 0; // this triggers the next scan
return;
}

7
pat.h
View File

@ -4,13 +4,14 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: pat.h 1.3 2004/01/03 13:47:54 kls Exp $
* $Id: pat.h 1.4 2004/03/07 16:22:01 kls Exp $
*/
#ifndef __PAT_H
#define __PAT_H
#include "filter.h"
#include <stdint.h>
#define MAXPMTENTRIES 64
@ -19,9 +20,9 @@ private:
time_t lastPmtScan;
int pmtIndex;
int pmtPid;
int pmtVersion[MAXPMTENTRIES];
uint64_t pmtVersion[MAXPMTENTRIES];
int numPmtEntries;
bool PmtVersionChanged(int PmtPid, int Version);
bool PmtVersionChanged(int PmtPid, int Sid, int Version);
protected:
virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length);
public: