]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts service: fix the pid weight updates for raw services
authorJaroslav Kysela <perex@perex.cz>
Sun, 4 Mar 2018 23:37:53 +0000 (00:37 +0100)
committerJaroslav Kysela <perex@perex.cz>
Sun, 4 Mar 2018 23:37:53 +0000 (00:37 +0100)
src/input/mpegts.h
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_service.c

index 9855d85eb643ec0fb5a3a6da76da8b0fc685c57e..3605251cc48a27cd7c7f25a82ada446540bb0a0b 100644 (file)
@@ -1017,6 +1017,10 @@ mpegts_pid_t * mpegts_input_open_pid
 int mpegts_input_close_pid
   ( mpegts_input_t *mi, mpegts_mux_t *mm, int pid, int type, void *owner );
 
+mpegts_pid_t * mpegts_input_update_pid_weight
+  ( mpegts_input_t *mi, mpegts_mux_t *mm, int pid, int type, int weight,
+    void *owner );
+
 void mpegts_input_close_pids
   ( mpegts_input_t *mi, mpegts_mux_t *mm, void *owner, int all );
 
index 24b0c8a93522cc793c15c96a0bceadde922a6dfa..fe09f3e4b07da484d19687dcefc55db1885827bd 100644 (file)
@@ -624,6 +624,39 @@ mpegts_input_close_pid
   return 0;
 }
 
+mpegts_pid_t *
+mpegts_input_update_pid_weight
+  ( mpegts_input_t *mi, mpegts_mux_t *mm, int pid, int type, int weight,
+    void *owner )
+{
+  mpegts_pid_sub_t *mps, skel;
+  mpegts_pid_t *mp;
+  assert(owner != NULL);
+  lock_assert(&mi->mi_output_lock);
+  if (!(mp = mpegts_mux_find_pid(mm, pid, 0)))
+    return NULL;
+  if (pid == MPEGTS_FULLMUX_PID || pid == MPEGTS_TABLES_PID) {
+    LIST_FOREACH(mps, &mm->mm_all_subs, mps_svcraw_link)
+      if (mps->mps_owner == owner) break;
+    if (mps == NULL) return NULL;
+    tvhdebug(LS_MPEGTS, "%s - update PID %s weight %d subscription [%04x/%p]",
+             mm->mm_nicename, pid == MPEGTS_TABLES_PID ? "tables" : "fullmux",
+             weight, type, owner);
+    mps->mps_weight = weight;
+  } else {
+    skel.mps_type   = type;
+    skel.mps_weight = -1;
+    skel.mps_owner  = owner;
+    mps = RB_FIND(&mp->mp_subs, &skel, mps_link, mpegts_mps_cmp);
+    if (mps == NULL) return NULL;
+    tvhdebug(LS_MPEGTS, "%s - update PID %04X (%d) weight %d [%d/%p]",
+             mm->mm_nicename, mp->mp_pid, mp->mp_pid, weight, type, owner);
+    mps->mps_weight = weight;
+    mm->mm_update_pids_flag = 1;
+  }
+  return mp;
+}
+
 elementary_stream_t *
 mpegts_input_open_service_pid
   ( mpegts_input_t *mi, mpegts_mux_t *mm,
index 37dfc4fea76acaf71a78f623dde190c563fab6aa..01ac0e2dbaa55ffdebf48e9af167366c0274c468 100644 (file)
@@ -993,6 +993,12 @@ mpegts_service_raw_update_pids(mpegts_service_t *t, mpegts_apids_t *pids)
           pi = &add.pids[i];
           mpegts_input_open_pid(mi, mm, pi->pid, MPS_RAW, pi->weight, t, 0);
         }
+        if (p) {
+          for (i = 0; i < p->count; i++) {
+            pi = &p->pids[i];
+            mpegts_input_update_pid_weight(mi, mm, pi->pid, MPS_RAW, pi->weight, t);
+          }
+        }
         mpegts_pid_done(&add);
         mpegts_pid_done(&del);
       }