From 1a7146692b7a089b1af77bcf6614080915e5de52 Mon Sep 17 00:00:00 2001 From: leslie Date: Thu, 21 May 2009 20:59:03 +0800 Subject: [PATCH] improved stall detect for FFdecsa pipeline --- cam.c | 64 +++++++++++++++++++++++++++++++++++++++--------------- log-core.h | 3 ++- sc.c | 2 +- 3 files changed, 50 insertions(+), 19 deletions(-) diff --git a/cam.c b/cam.c index ae385c4..a6e0b97 100644 --- a/cam.c +++ b/cam.c @@ -2268,18 +2268,18 @@ bool cScCiAdapter::Assign(cDevice *Device, bool Query) #define MAX_CSA_PIDS 8192 #define MAX_CSA_IDX 16 - -//#define DEBUG_CSA +#define MAX_STALL_MS 70 class cDeCSA { private: int cs; - unsigned char **range; + unsigned char **range, *lastData; unsigned char pidmap[MAX_CSA_PIDS]; void *keys[MAX_CSA_IDX]; unsigned int even_odd[MAX_CSA_IDX]; cMutex mutex; cCondVar wait; + cTimeMs stall; bool active; int cardindex; // @@ -2294,6 +2294,7 @@ public: }; cDeCSA::cDeCSA(int CardIndex) +:stall(MAX_STALL_MS) { cardindex=CardIndex; cs=get_suggested_cluster_size(); @@ -2302,6 +2303,7 @@ cDeCSA::cDeCSA(int CardIndex) memset(keys,0,sizeof(keys)); memset(even_odd,0,sizeof(even_odd)); memset(pidmap,0,sizeof(pidmap)); + lastData=0; } cDeCSA::~cDeCSA() @@ -2357,7 +2359,8 @@ bool cDeCSA::Decrypt(unsigned char *data, int len, bool force) bool newRange=true; range[0]=0; len-=(TS_SIZE-1); - for(int l=0; l=0 && ccs forced",cardindex); + force=true; + } + else if(stallP<=10 && scanTS>=cs) { + PRINTF(L_CORE_CSAVERB,"%d: flow factor stall -> forced",cardindex); + force=true; + } + } + lastData=data; + if(r>=0) { // we have some range if(ccs>=cs || force) { if(GetKeyStruct(currIdx)) { int n=decrypt_packets(keys[currIdx],range); -#ifdef DEBUG_CSA - PRINTF(L_CORE_CSA,"%d.%d: decrypting ccs=%3d cs=%3d %s -> %3d decrypted",cardindex,currIdx,ccs,cs,ccs>=cs?"OK ":"INC",n); -#endif - if(n>0) return true; + PRINTF(L_CORE_CSAVERB,"%d.%d: decrypting ccs=%3d cs=%3d %s -> %3d decrypted",cardindex,currIdx,ccs,cs,ccs>=cs?"OK ":"INC",n); + if(n>0) { + stall.Set(MAX_STALL_MS); + return true; + } } } -#ifdef DEBUG_CSA - else PRINTF(L_CORE_CSA,"%d.%d: incomplete cluster ccs=%3d cs=%3d",cardindex,currIdx,ccs,cs); -#endif + else PRINTF(L_CORE_CSAVERB,"%d.%d: incomplete ccs=%3d cs=%3d",cardindex,currIdx,ccs,cs); } return false; } @@ -2415,8 +2450,6 @@ private: // cDeCSA *decsa; bool scActive; - unsigned char *lastP; - int lastCount; // virtual void Action(void); public: @@ -2431,7 +2464,6 @@ cDeCsaTSBuffer::cDeCsaTSBuffer(int File, int Size, int CardIndex, cDeCSA *DeCsa, SetDescription("TS buffer on device %d", CardIndex); f=File; size=Size; cardIndex=CardIndex; decsa=DeCsa; delivered=false; - lastP=0; lastCount=0; ringBuffer=new cRingBufferLinear(Size,TS_SIZE,true,"FFdecsa-TS"); ringBuffer->SetTimeouts(100,100); if(decsa) decsa->SetActive(true); @@ -2487,12 +2519,10 @@ uchar *cDeCsaTSBuffer::Get(void) if(scActive && (p[3]&0xC0)) { if(decsa) { - if(!decsa->Decrypt(p,Count,(lastP==p && (lastCount==Count || Count>size/5)))) { - lastP=p; lastCount=Count; + if(!decsa->Decrypt(p,Count,false)) { cCondWait::SleepMs(20); return NULL; } - lastP=0; } else p[3]&=~0xC0; // FF hack } diff --git a/log-core.h b/log-core.h index 31fe10f..a8abe41 100644 --- a/log-core.h +++ b/log-core.h @@ -48,7 +48,8 @@ #define L_CORE_SC LCLASS(L_CORE,0x100000) #define L_CORE_HOOK LCLASS(L_CORE,0x200000) #define L_CORE_CIFULL LCLASS(L_CORE,0x400000) +#define L_CORE_CSAVERB LCLASS(L_CORE,0x800000) -#define L_CORE_ALL LALL(L_CORE_CIFULL) +#define L_CORE_ALL LALL(L_CORE_CSAVERB) #endif //___LOG_CORE_H diff --git a/sc.c b/sc.c index 21152cf..e0afaae 100644 --- a/sc.c +++ b/sc.c @@ -90,7 +90,7 @@ static const struct LogModule lm_core = { "core", { "load","action","ecm","ecmProc","pids","au","auStats","auExtra","auExtern", "caids","keys","dynamic","csa","ci","av7110","net","netData","msgcache", - "serial","smartcard","hook","ciFull" } + "serial","smartcard","hook","ciFull","csaVerb" } }; ADD_MODULE(L_CORE,lm_core) -- 2.39.5