]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
descrambler: do not allow to open new pids when flushed
authorJaroslav Kysela <perex@perex.cz>
Wed, 17 Sep 2014 09:53:21 +0000 (11:53 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 17 Sep 2014 09:53:21 +0000 (11:53 +0200)
src/descrambler/descrambler.c
src/input/mpegts.h

index eb5b7dff8945d9872f41d88ee8b8c9889338ecd5..664a384fd556738c2a07748f6c1e133afd2541b2 100755 (executable)
@@ -134,6 +134,7 @@ descrambler_service_start ( service_t *t )
     dr->dr_key_index = 0xff;
     dr->dr_last_descramble = dispatch_clock;
   }
+  ((mpegts_service_t *)t)->s_dvb_mux->mm_descrambler_flush = 0;
 }
 
 void
@@ -507,6 +508,8 @@ descrambler_open_pid_( mpegts_mux_t *mux, void *opaque, int pid,
 
   if (mux == NULL)
     return 0;
+  if (mux->mm_descrambler_flush)
+    return 0;
   flags  = pid >> 16;
   pid   &= 0x1fff;
   TAILQ_FOREACH(dt, &mux->mm_descrambler_tables, link) {
@@ -605,6 +608,7 @@ descrambler_flush_tables( mpegts_mux_t *mux )
   cwc_caid_update(mux, 0, 0, -1);
 #endif
   pthread_mutex_lock(&mux->mm_descrambler_lock);
+  mux->mm_descrambler_flush = 1;
   while ((dt = TAILQ_FIRST(&mux->mm_descrambler_tables)) != NULL) {
     while ((ds = TAILQ_FIRST(&dt->sections)) != NULL) {
       TAILQ_REMOVE(&dt->sections, ds, link);
@@ -703,8 +707,11 @@ descrambler_open_emm( mpegts_mux_t *mux, void *opaque, int caid,
   if (mux == NULL)
     return 0;
   pthread_mutex_lock(&mux->mm_descrambler_lock);
+  if (mux->mm_descrambler_flush)
+    goto unlock;
   TAILQ_FOREACH(emm, &mux->mm_descrambler_emms, link) {
     if (emm->caid == caid && emm->opaque == opaque) {
+unlock:
       pthread_mutex_unlock(&mux->mm_descrambler_lock);
       return 0;
     }
index 285d3683597f54a8c0ea21305a47b3c0d6ea093b..2bb75b4a94321c1bbfd6777dd2777d11868a3121 100644 (file)
@@ -388,6 +388,7 @@ struct mpegts_mux
   TAILQ_HEAD(, descrambler_table) mm_descrambler_tables;
   TAILQ_HEAD(, descrambler_emm) mm_descrambler_emms;
   pthread_mutex_t             mm_descrambler_lock;
+  int                         mm_descrambler_flush;
 
   /*
    * Functions