From dcddcb9c8a8ac5a38917fddcfd75a254b2cef8c1 Mon Sep 17 00:00:00 2001
From: leslie <unknown>
Date: Tue, 14 Oct 2008 17:27:44 +0800
Subject: [PATCH] prevent TS buffer stall

---
 cam.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/cam.c b/cam.c
index 7bd3cfc..5ec3a4d 100644
--- a/cam.c
+++ b/cam.c
@@ -2406,7 +2406,7 @@ bool cDeCSA::Decrypt(unsigned char *data, int len, bool force)
 class cDeCsaTSBuffer : public cThread {
 private:
   int f;
-  int cardIndex;
+  int cardIndex, size;
   bool delivered;
   cRingBufferLinear *ringBuffer;
   //
@@ -2426,7 +2426,7 @@ public:
 cDeCsaTSBuffer::cDeCsaTSBuffer(int File, int Size, int CardIndex, cDeCSA *DeCsa, bool ScActive)
 {
   SetDescription("TS buffer on device %d", CardIndex);
-  f=File; cardIndex=CardIndex; decsa=DeCsa;
+  f=File; size=Size; cardIndex=CardIndex; decsa=DeCsa;
   delivered=false;
   lastP=0; lastCount=0;
   ringBuffer=new cRingBufferLinear(Size,TS_SIZE,true,"FFdecsa-TS");
@@ -2484,7 +2484,7 @@ uchar *cDeCsaTSBuffer::Get(void)
 
     if(scActive && (p[3]&0xC0)) {
       if(decsa) {
-        if(!decsa->Decrypt(p,Count,(lastP==p && lastCount==Count))) {
+        if(!decsa->Decrypt(p,Count,(lastP==p && (lastCount==Count || Count>size/5)))) {
           lastP=p; lastCount=Count;
           cCondWait::SleepMs(20);
           return NULL;
-- 
2.39.5