From: leslie <unknown>
Date: Sun, 3 Jun 2012 12:57:02 +0000 (+0200)
Subject: sasc: add yacss's poll PMT patch
X-Git-Tag: upstream/620~7
X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=ca58762e977df539687a0bdd14d64e4647041a8d;p=sasc-ng.git

sasc: add yacss's poll PMT patch
---

diff --git a/contrib/sasc-ng/dvbloopback/src/plugin_getsid.c b/contrib/sasc-ng/dvbloopback/src/plugin_getsid.c
index ed3b63c..ca14054 100644
--- a/contrib/sasc-ng/dvbloopback/src/plugin_getsid.c
+++ b/contrib/sasc-ng/dvbloopback/src/plugin_getsid.c
@@ -55,6 +55,7 @@ struct filter {
   __u16 pid;
   int   fd;
   int used;
+  int pollretries;
   int parse_err;
 };
 
@@ -229,7 +230,7 @@ static int read_pat(unsigned char *pes, struct pat *pat, unsigned int size) {
       list_add(&sidnum->list, &filt->sids);
     } else {
       pat->has_nit = pid;
-      dprintf2("found NIT at PID: %d", pid);
+      dprintf2("found NIT at PID: %d\n", pid);
     }
   }
   return 0;
@@ -431,6 +432,7 @@ static int read_pmt(unsigned char *buf, struct filter *filt,
 static int start(char *dmxdev, struct sid_data *sid_data, int timeout) {
   unsigned char pes[4096];
   struct pollfd  pfd, pollfd[MAX_SIMULTANEOUS_PMT];
+  int pollretries[MAX_SIMULTANEOUS_PMT];
   int pat_restart = 0, done = 0, size, i;
   int ret;
 
@@ -577,14 +579,21 @@ static int start(char *dmxdev, struct sid_data *sid_data, int timeout) {
           pollfd[count].fd=filt->fd;
           pollfd[count].events = POLLIN;
           pollfd[count].revents = 0;
+          pollretries[count] = filt->pollretries++;
           count++;
         }
       }
       dprintf3("polling %d fds\n", count);
       poll(pollfd, count, timeout);
       for(i = 0; i < count; i++) {
-        if(! (pollfd[i].revents & POLLIN))
+        if(! (pollfd[i].revents & POLLIN)) {
+          // stop waiting if no data comes for too long..
+          if (pollretries[i] >= 10) {
+            dprintf0("start: giving up wait for pid on filter %d, no data found...\n",i);
+            found++;
+          }
           continue;
+        }
         // read pmt
         while((size = read(pollfd[i].fd, pes, sizeof(pes))) >= 3) {
           struct filter *filt;
@@ -745,6 +754,8 @@ static void *read_sid(void *arg)
       } else {
         dprintf0("Didn't find sid for pid: %d\n", dmxcmd->pid);
       }
+    } else {
+        dprintf0("Didn't find sid for pid: %d\n", dmxcmd->pid);
     }
   }
 }