From 25d7e4d403fd0e66a7c5b6c698e02595222bec1c Mon Sep 17 00:00:00 2001 From: leslie Date: Wed, 22 Oct 2008 21:10:09 +0800 Subject: [PATCH] nagra: fix BEV with CAID 1801 --- cam.c | 2 +- system.c | 4 ++-- system.h | 2 +- systems/nagra/nagra2.c | 9 ++++++--- systems/sc-viaccess/sc-viaccess.c | 6 +++--- systems/viaccess/viaccess.c | 6 +++--- 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/cam.c b/cam.c index 5ec3a4d..2d8df90 100644 --- a/cam.c +++ b/cam.c @@ -1246,7 +1246,7 @@ void cEcmHandler::ParseCAInfo(int SysId) while((sys=cSystems::FindBySysId(sysId,!cam->IsSoftCSA(filterCwIndex==0),sysPri))) { sysPri=sys->Pri(); cSimpleList ecms; - sys->ParseCADescriptor(&ecms,sysId,&buff[index+2],buff[index+1]); + sys->ParseCADescriptor(&ecms,sysId,filterSource,&buff[index+2],buff[index+1]); delete sys; if(ecms.Count()) { cEcmInfo *n; diff --git a/system.c b/system.c index 36e83c6..c86f31a 100644 --- a/system.c +++ b/system.c @@ -126,7 +126,7 @@ void cSystem::StartLog(const cEcmInfo *ecm, int caid) } } -void cSystem::ParseCADescriptor(cSimpleList *ecms, unsigned short sysId, const unsigned char *data, int len) +void cSystem::ParseCADescriptor(cSimpleList *ecms, unsigned short sysId, int source, const unsigned char *data, int len) { const int pid=WORD(data,2,0x1FFF); switch(sysId>>8) { @@ -145,7 +145,7 @@ void cSystem::ParseCADescriptor(cSimpleList *ecms, unsigned short sysI default: // default style { cEcmInfo *n=new cEcmInfo(name,pid,sysId,0); - if(sysId==0x1234) { // BEV + if(sysId==0x1234 || (sysId==0x1801 && (source==0x8334 || source==0x838e))) { // BEV n->ecm_table=0x8e; n->emmCaId=0x1801; } diff --git a/system.h b/system.h index 03283e3..38b0fc5 100644 --- a/system.h +++ b/system.h @@ -117,7 +117,7 @@ public: virtual void CheckECMResult(const cEcmInfo *ecm, const unsigned char *data, bool result); virtual bool ProcessECM(const cEcmInfo *ecm, unsigned char *buffer)=0; virtual void ProcessEMM(int pid, int caid, unsigned char *buffer) {}; - virtual void ParseCADescriptor(cSimpleList *ecms, unsigned short sysId, const unsigned char *data, int len); + virtual void ParseCADescriptor(cSimpleList *ecms, unsigned short sysId, int source, const unsigned char *data, int len); virtual void ParseCAT(cPids *pids, const unsigned char *buffer); unsigned char *CW(void) { return cw; } void DoLog(bool Log) { doLog=Log; } diff --git a/systems/nagra/nagra2.c b/systems/nagra/nagra2.c index c1af024..71d4ca1 100644 --- a/systems/nagra/nagra2.c +++ b/systems/nagra/nagra2.c @@ -1157,9 +1157,12 @@ bool cSystemNagra2::ProcessECM(const cEcmInfo *ecm, unsigned char *data) memcpy(odata,data,sizeof(odata)); if(ecm->source>=NA_SOURCE_START && ecm->source<=NA_SOURCE_END) { if(ecm->caId==0x1234) data[5]=0x09; // NA rev 248 morph - else if(ecm->caId==0x1801 && ecm->source==0x83ca) data[5]=0xC1; // 97W - else data[5]=0x01; // I _HATE_ this provider - data[6]&=0x1F; // specific stuff :( + else { + if(ecm->source==0x83ca) data[5]=0xC1; // 97W + else if(ecm->source==0x8334 || ecm->source==0x838e) data[5]=0x09; // 82W 91W + else data[5]=0x01; + } + data[6]&=0x1F; data[7]=data[7]&0x10|0x86; data[8]=0; data[9]=data[9]&0x80|0x08; diff --git a/systems/sc-viaccess/sc-viaccess.c b/systems/sc-viaccess/sc-viaccess.c index c6298cf..5b0faf4 100644 --- a/systems/sc-viaccess/sc-viaccess.c +++ b/systems/sc-viaccess/sc-viaccess.c @@ -53,7 +53,7 @@ ADD_MODULE(L_SC,lm_sc) class cSystemScViaccess : public cSystemScCore { //, private cTPS { public: cSystemScViaccess(void); - virtual void ParseCADescriptor(cSimpleList *ecms, unsigned short sysId, const unsigned char *data, int len); + virtual void ParseCADescriptor(cSimpleList *ecms, unsigned short sysId, int source, const unsigned char *data, int len); }; cSystemScViaccess::cSystemScViaccess(void) @@ -62,14 +62,14 @@ cSystemScViaccess::cSystemScViaccess(void) hasLogger=true; } -void cSystemScViaccess::ParseCADescriptor(cSimpleList *ecms, unsigned short sysId, const unsigned char *data, int len) +void cSystemScViaccess::ParseCADescriptor(cSimpleList *ecms, unsigned short sysId, int source, const unsigned char *data, int len) { const int pid=WORD(data,2,0x1FFF); if(pid>=0xAA && pid<=0xCF) { PRINTF(L_CORE_ECMPROC,"sc-viaccess: dropped \"fake\" ecm pid 0x%04xn",pid); return; } - cSystem::ParseCADescriptor(ecms,sysId,data,len); + cSystem::ParseCADescriptor(ecms,sysId,source,data,len); } // -- cSystemLinkScViaccess -------------------------------------------------------------- diff --git a/systems/viaccess/viaccess.c b/systems/viaccess/viaccess.c index 76e98a1..305083a 100644 --- a/systems/viaccess/viaccess.c +++ b/systems/viaccess/viaccess.c @@ -354,7 +354,7 @@ public: cSystemViaccess(void); virtual bool ProcessECM(const cEcmInfo *ecm, unsigned char *data); virtual void ProcessEMM(int pid, int caid, unsigned char *data); - virtual void ParseCADescriptor(cSimpleList *ecms, unsigned short sysId, const unsigned char *data, int len); + virtual void ParseCADescriptor(cSimpleList *ecms, unsigned short sysId, int source, const unsigned char *data, int len); }; cSystemViaccess::cSystemViaccess(void) @@ -363,14 +363,14 @@ cSystemViaccess::cSystemViaccess(void) hasLogger=true; } -void cSystemViaccess::ParseCADescriptor(cSimpleList *ecms, unsigned short sysId, const unsigned char *data, int len) +void cSystemViaccess::ParseCADescriptor(cSimpleList *ecms, unsigned short sysId, int source, const unsigned char *data, int len) { const int pid=WORD(data,2,0x1FFF); if(pid>=0xAA && pid<=0xCF) { PRINTF(L_CORE_ECMPROC,"viaccess: dropped \"fake\" ecm pid 0x%04x",pid); return; } - cSystem::ParseCADescriptor(ecms,sysId,data,len); + cSystem::ParseCADescriptor(ecms,sysId,source,data,len); } bool cSystemViaccess::ProcessECM(const cEcmInfo *ecm, unsigned char *data) -- 2.39.5