]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
mpegts input: add tspos per mux instance
authorJaroslav Kysela <perex@perex.cz>
Wed, 28 Mar 2018 09:59:10 +0000 (11:59 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 28 Mar 2018 09:59:10 +0000 (11:59 +0200)
src/input/mpegts.h
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_mux.c
src/input/mpegts/tsdemux.c
src/input/mpegts/tsdemux.h

index 518d1258d01702c9f1aa28c274090a77717bc3e0..777a9cfc942c1f37b2be5ddc6029c57a4bd70fff 100644 (file)
@@ -495,6 +495,7 @@ struct mpegts_mux
    * Data processing
    */
 
+  uint64_t                    mm_input_pos;
   RB_HEAD(, mpegts_pid)       mm_pids;
   LIST_HEAD(, mpegts_pid_sub) mm_all_subs;
   int                         mm_last_pid;
index 94924ad5d4ed27a5e60f9e244d1ff88bbdd02a91..96ed0a6cd14143cdd5c1c1c120339dba8af65d65 100644 (file)
@@ -1367,6 +1367,7 @@ mpegts_input_process
   int table_wakeup = 0;
   mpegts_mux_t *mm = mpkt->mp_mux;
   mpegts_mux_instance_t *mmi;
+  uint64_t tspos;
 
   if (mm == NULL || (mmi = mm->mm_active) == NULL)
     return 0;
@@ -1374,6 +1375,7 @@ mpegts_input_process
   assert(mm == mmi->mmi_mux);
 
   /* Process */
+  tspos = mm->mm_input_pos;
   assert((len % 188) == 0);
   while (len > 0) {
 
@@ -1427,12 +1429,12 @@ mpegts_input_process
       /* Stream all PIDs */
       LIST_FOREACH(mps, &mm->mm_all_subs, mps_svcraw_link)
         if ((mps->mps_type & MPS_ALL) || (type & (MPS_TABLE|MPS_FTABLE)))
-          ts_recv_raw((mpegts_service_t *)mps->mps_owner, tsb, llen);
+          ts_recv_raw((mpegts_service_t *)mps->mps_owner, tspos, tsb, llen);
 
       /* Stream raw PIDs */
       if (type & MPS_RAW) {
         LIST_FOREACH(mps, &mp->mp_raw_subs, mps_raw_link)
-          ts_recv_raw((mpegts_service_t *)mps->mps_owner, tsb, llen);
+          ts_recv_raw((mpegts_service_t *)mps->mps_owner, tspos, tsb, llen);
       }
 
       /* Stream service data */
@@ -1442,7 +1444,7 @@ mpegts_input_process
           f = (type & (MPS_TABLE|MPS_FTABLE)) ||
               (pid == s->s_components.set_pmt_pid) ||
               (pid == s->s_components.set_pcr_pid);
-          ts_recv_packet1((mpegts_service_t*)s, pid, tsb, llen, f);
+          ts_recv_packet1((mpegts_service_t*)s, tspos, pid, tsb, llen, f);
         }
       } else
       /* Stream table data */
@@ -1452,7 +1454,7 @@ mpegts_input_process
           f = (type & (MPS_TABLE|MPS_FTABLE)) ||
               (pid == s->s_components.set_pmt_pid) ||
               (pid == s->s_components.set_pcr_pid);
-          ts_recv_packet1((mpegts_service_t*)s, pid, tsb, llen, f);
+          ts_recv_packet1((mpegts_service_t*)s, tspos, pid, tsb, llen, f);
         }
       }
 
@@ -1505,13 +1507,14 @@ mpegts_input_process
 
       /* Stream to all fullmux subscribers */
       LIST_FOREACH(mps, &mm->mm_all_subs, mps_svcraw_link)
-        ts_recv_raw((mpegts_service_t *)mps->mps_owner, tsb, llen);
+        ts_recv_raw((mpegts_service_t *)mps->mps_owner, tspos, tsb, llen);
 
     }
 
 done:
     tsb += llen;
     len -= llen;
+    tspos += llen;
   }
 
   /* Raw stream */
@@ -1540,6 +1543,7 @@ done:
   /* Bandwidth monitoring */
   llen = tsb - mpkt->mp_data;
   atomic_add(&mmi->tii_stats.bps, llen);
+  mm->mm_input_pos += llen;
   return llen;
 }
 
index 6acfb348f033d3824ac45ca723ea2fe680e24f78..bf45899e29cc6da4e5a9669ef27293d6350284de 100644 (file)
@@ -260,6 +260,7 @@ mpegts_mux_instance_start
 
   r = mi->mi_warm_mux(mi, mmi);
   if (r) return r;
+  mm->mm_input_pos = 0;
   r = mi->mi_start_mux(mi, mmi, weight);
   if (r) return r;
 
index bb2ac8e1555ec7ad2ee7a0e33bbb7d1aae0ec63b..a8ac3d86db9916a4df0da4952464107fa91a6463 100644 (file)
@@ -145,7 +145,8 @@ skip_cc:
  */
 int
 ts_recv_packet1
-  (mpegts_service_t *t, uint16_t pid, const uint8_t *tsb, int len, int table)
+  (mpegts_service_t *t, uint64_t tspos, uint16_t pid,
+   const uint8_t *tsb, int len, int table)
 {
   elementary_stream_t *st;
   uint_fast8_t scrambled, error = 0;
@@ -257,7 +258,7 @@ ts_skip_packet2(mpegts_service_t *t, const uint8_t *tsb, int len)
  *
  */
 void
-ts_recv_raw(mpegts_service_t *t, const uint8_t *tsb, int len)
+ts_recv_raw(mpegts_service_t *t, uint64_t tspos, const uint8_t *tsb, int len)
 {
   int pid, parent = 0;
 
index 2089f4b8d6a043756bedae1c235b2b3bb00dc0f7..e62bb070fe0bbe45f842bbf0f9f565962756b4e3 100644 (file)
@@ -25,12 +25,14 @@ void ts_recv_packet0
   (struct mpegts_service *t, elementary_stream_t *st, const uint8_t *tsb, int len);
 
 int ts_recv_packet1
-  (struct mpegts_service *t, uint16_t pid, const uint8_t *tsb, int len, int table);
+  (struct mpegts_service *t, uint64_t tspos, uint16_t pid,
+   const uint8_t *tsb, int len, int table);
 
 void ts_recv_packet2(struct mpegts_service *t, const uint8_t *tsb, int len);
 
 void ts_skip_packet2(struct mpegts_service *t, const uint8_t *tsb, int len);
 
-void ts_recv_raw(struct mpegts_service *t, const uint8_t *tsb, int len);
+void ts_recv_raw
+  (struct mpegts_service *t, uint64_t tspos, const uint8_t *tsb, int len);
 
 #endif /* TSDEMUX_H */