]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
esstream: move pmt/pcr/service id from service_t to elementary_set_t
authorJaroslav Kysela <perex@perex.cz>
Thu, 8 Mar 2018 17:31:44 +0000 (18:31 +0100)
committerJaroslav Kysela <perex@perex.cz>
Fri, 23 Mar 2018 17:05:29 +0000 (18:05 +0100)
25 files changed:
src/api/api_service.c
src/descrambler/capmt.c
src/descrambler/cccam.c
src/descrambler/constcw.c
src/descrambler/cwc.c
src/descrambler/descrambler.c
src/descrambler/dvbcam.c
src/esstream.c
src/esstream.h
src/input/mpegts.h
src/input/mpegts/dvb_charset.c
src/input/mpegts/dvb_psi.c
src/input/mpegts/dvb_psi_pmt.c
src/input/mpegts/dvb_psi_pmt.h
src/input/mpegts/iptv/iptv_mux.c
src/input/mpegts/mpegts_input.c
src/input/mpegts/mpegts_mux.c
src/input/mpegts/mpegts_service.c
src/input/mpegts/satip/satip_frontend.c
src/input/mpegts/tsdemux.c
src/input/mpegts/tsfile/tsfile_input.c
src/satip/rtsp.c
src/service.c
src/service.h
src/subscriptions.c

index 36c262432601e5015f587a4f55ed09eba3b04ef6..8d4d7e487bd4a1d3fe232977dd6a515880b9cc9a 100644 (file)
@@ -131,15 +131,15 @@ api_service_streams
   pthread_mutex_lock(&s->s_stream_mutex);
   st = htsmsg_create_list();
   stf = htsmsg_create_list();
-  if (s->s_pcr_pid) {
+  if (s->s_components.set_pcr_pid) {
     e = htsmsg_create_map();
-    htsmsg_add_u32(e, "pid", s->s_pcr_pid);
+    htsmsg_add_u32(e, "pid", s->s_components.set_pcr_pid);
     htsmsg_add_str(e, "type", "PCR");
     htsmsg_add_msg(st, NULL, e);
   }
-  if (s->s_pmt_pid) {
+  if (s->s_components.set_pmt_pid) {
     e = htsmsg_create_map();
-    htsmsg_add_u32(e, "pid", s->s_pmt_pid);
+    htsmsg_add_u32(e, "pid", s->s_components.set_pmt_pid);
     htsmsg_add_str(e, "type", "PMT");
     htsmsg_add_msg(st, NULL, e);
   }
index 40a50d358bd7bd6dda920c26b70a740020a72ff1..b7661c141e873584f1cd5a6ae4283bff7a3a3610 100644 (file)
@@ -1271,7 +1271,7 @@ capmt_process_notify(capmt_t *capmt, uint8_t adapter,
   LIST_FOREACH(ct, &capmt->capmt_services, ct_link) {
     t = (mpegts_service_t *)ct->td_service;
 
-    if (sid != t->s_dvb_service_id)
+    if (sid != t->s_components.set_service_id)
       continue;
     if (adapter != ct->ct_adapter)
       continue;
@@ -2228,8 +2228,8 @@ capmt_send_request(capmt_service_t *ct, int lm)
 {
   capmt_t *capmt = ct->ct_capmt;
   mpegts_service_t *t = (mpegts_service_t *)ct->td_service;
-  uint16_t sid = t->s_dvb_service_id;
-  uint16_t pmtpid = t->s_pmt_pid;
+  uint16_t sid = t->s_components.set_service_id;
+  uint16_t pmtpid = t->s_components.set_pmt_pid;
   uint16_t transponder = t->s_dvb_mux->mm_tsid;
   uint16_t onid = t->s_dvb_mux->mm_onid;
   const int adapter_num = ct->ct_adapter;
index 52fc3d27431eaec3964ccbd75dc6e2f8ac9decf6..575925a01d118cbfa6d399e5bf4576f017ea1ede 100644 (file)
@@ -775,7 +775,7 @@ cccam_send_ecm(void *cc, cc_service_t *ct, cc_ecm_section_t *es,
   provid = es->es_provid;
   card_id = pcard->cs_id;
   es->es_card_id = card_id;
-  sid = t->s_dvb_service_id;
+  sid = t->s_components.set_service_id;
   es->es_seq = seq & 0xff;
 
   buf = alloca(len + 13);
index 2a5fa08655ed1463876dbdd374b1e975f0862fb3..dcd2e99bf02a0e8f2a08cba67396ff64bc7ce4fe 100644 (file)
@@ -133,7 +133,7 @@ constcw_service_start(caclient_t *cac, service_t *t)
   if (mt->s_dvb_forcecaid && mt->s_dvb_forcecaid != ccw->ccw_caid)
     return;
 
-  if (mt->s_dvb_service_id != ccw->ccw_sid)
+  if (mt->s_components.set_service_id != ccw->ccw_sid)
     return;
 
   if (mt->s_dvb_mux->mm_tsid != ccw->ccw_tsid)
index 295538c3281a48284549dc3ca20a5bff6845bd5c..0ac8f31bd3197a56524ee0c6f07e4849c8e4dfe4 100644 (file)
@@ -634,7 +634,7 @@ cwc_send_ecm(void *cc, cc_service_t *ct, cc_ecm_section_t *es,
              cc_card_data_t *pcard, const uint8_t *data, int len)
 {
   mpegts_service_t *t = (mpegts_service_t *)ct->td_service;
-  uint16_t sid = t->s_dvb_service_id;
+  uint16_t sid = t->s_components.set_service_id;
   uint16_t seq;
   int r;
 
@@ -657,7 +657,7 @@ cwc_send_emm(void *cc, cc_service_t *ct,
 
   if (ct) {
     t = (mpegts_service_t *)ct->td_service;
-    sid = t->s_dvb_service_id;
+    sid = t->s_components.set_service_id;
   }
 
   cwc_send_msg(cc, data, len, sid, 1, pcard->cs_ra.caid, provid, NULL);
index 1810e6e1b9c6a0637f8a92590bdc7a7bae48f1be..853a6327942c224f89f093a177da5f120e1478fd 100644 (file)
@@ -498,7 +498,7 @@ descrambler_notify_nokey( th_descrambler_runtime_t *dr )
   tvhdebug(LS_DESCRAMBLER, "no key for service='%s'", t->s_dvb_svcname);
 
   di = calloc(1, sizeof(*di));
-  di->pid = t->s_pmt_pid;
+  di->pid = t->s_components.set_pmt_pid;
 
   descrambler_notify_deliver(t, di);
 }
index e966468ee5a478df1cfa3c2bafed8d4f2f5c3d73..8ba7970802ad9245975d9d40f896899c120c1341 100644 (file)
@@ -332,7 +332,7 @@ dvbcam_pmt_data(mpegts_service_t *s, const uint8_t *ptr, int len)
   }
 
   r = en50221_capmt_build(s, bcmd,
-                          s->s_dvb_service_id,
+                          s->s_components.set_service_id,
                           ac->caids, ac->caids_count,
                           as->last_pmt, as->last_pmt_len,
                           &capmt, &capmt_len);
@@ -363,7 +363,7 @@ dvbcam_service_destroy(th_descrambler_t *td)
     if (ac) {
       s = (mpegts_service_t *)td->td_service;
       r = en50221_capmt_build(s, EN50221_CAPMT_BUILD_DELETE,
-                              s->s_dvb_service_id,
+                              s->s_components.set_service_id,
                               ac->caids, ac->caids_count,
                               as->last_pmt, as->last_pmt_len,
                               &capmt, &capmt_len);
index 157e7400b64c1f229714bb1ce030555c1d5eb4fd..c3269616b334da6df5fd60db6da1629c331b62df 100644 (file)
@@ -642,6 +642,10 @@ elementary_stream_build_start(elementary_set_t *set)
     *(elementary_info_t *)ssc = *(elementary_info_t *)st;
   }
 
+  ss->ss_pcr_pid = set->set_pcr_pid;
+  ss->ss_pmt_pid = set->set_pmt_pid;
+  ss->ss_service_id = set->set_service_id;
+
   ss->ss_refcount = 1;
   return ss;
 }
index 14643e62ff0a7837f3f906c35d4a9a6a43c7ffba..a344ce934e953d2842ec8503c8d62d09928b9b74 100644 (file)
@@ -144,11 +144,18 @@ struct elementary_stream {
 struct elementary_set {
   TAILQ_HEAD(, elementary_stream) set_all;
   TAILQ_HEAD(, elementary_stream) set_filter;
+
+  uint16_t set_pmt_pid;      /* PMT PID number */
+  uint16_t set_pcr_pid;      /* PCR PID number */
+  uint16_t set_service_id;   /* MPEG-TS DVB service ID number */
+
   int set_subsys;
   char *set_nicename;
+  service_t *set_service;
+
+  /* Cache lookups */
   uint16_t set_last_pid;
   elementary_stream_t *set_last_es;
-  service_t *set_service;
 };
 
 /*
index e9fb8c0703e00d31b695bbc02de2f20322952dc6..3481aab698ba173d9078749a4d6682d89b45669d 100644 (file)
@@ -584,7 +584,6 @@ struct mpegts_service
   uint32_t s_dvb_channel_num;
   uint16_t s_dvb_channel_minor;
   uint8_t  s_dvb_channel_dtag;
-  uint16_t s_dvb_service_id;
   char    *s_dvb_svcname;
   char    *s_dvb_provider;
   char    *s_dvb_cridauth;
index ff44da15e883e38a17ef9e114b3b2fd22aa6ce20..b8ce2f7de7252577f5684cf6dba22da1794905ae 100644 (file)
@@ -115,7 +115,7 @@ const char *dvb_charset_find
   if (mm) {
     LIST_FOREACH(enc, &dvb_charset_list, link) {
       if (mm->mm_onid == enc->onid && mm->mm_tsid == enc->tsid) {
-        if (s && (s->s_dvb_service_id == enc->sid)) {
+        if (s && (s->s_components.set_service_id == enc->sid)) {
           ret = enc;
           break;
         } else if (!enc->sid) {
index dd7007cef56ed4cf80f875e89abb8296536b5f9b..e4d86f3346f6efcf586b1b05ea2132c2235ffb94 100644 (file)
@@ -749,7 +749,7 @@ dvb_freesat_completed
   /* Find all "fallback" services and region specific */
   TAILQ_FOREACH(bs, &bi->services, link) {
     total++;
-    sid = bs->svc->s_dvb_service_id;
+    sid = bs->svc->s_components.set_service_id;
     TAILQ_FOREACH(fs, &bi->fservices, link)
       if (fs->sid == sid) {
         fs->svc = bs->svc;
@@ -933,7 +933,7 @@ dvb_bskyb_local_channels
     }
 
     TAILQ_FOREACH(bs, &bi->services, link)
-      if (bs->svc->s_dvb_service_id == sid)
+      if (bs->svc->s_components.set_service_id == sid)
         break;
     if (mm && !bs) {
       s = mpegts_service_find(mm, sid, 0, 0, NULL);
index 5211818cfa68fc04cb8bc45f831e7c7f68a9a2ba..e498f6323887588d3d26cc1a79a9e97e06a22f5f 100644 (file)
@@ -227,7 +227,7 @@ psi_desc_teletext(elementary_set_t *set, const uint8_t *ptr, int size,
 uint32_t
 dvb_psi_parse_pmt
   (mpegts_table_t *mt, const char *nicename, elementary_set_t *set,
-   const uint8_t *ptr, int len, uint16_t *pcr, int running)
+   const uint8_t *ptr, int len, int running)
 {
   uint16_t pcr_pid, pid;
   uint8_t estype;
@@ -252,8 +252,8 @@ dvb_psi_parse_pmt
   pcr_pid = extract_pid(ptr + 5);
   dllen   = (ptr[7] & 0xf) << 8 | ptr[8];
   
-  if(*pcr != pcr_pid) {
-    *pcr = pcr_pid;
+  if(set->set_pcr_pid != pcr_pid) {
+    set->set_pcr_pid = pcr_pid;
     update |= PMT_UPDATE_PCR;
   }
   tvhdebug(mt->mt_subsys, "%s:  pcr_pid %04X", mt->mt_name, pcr_pid);
@@ -488,7 +488,7 @@ dvb_psi_parse_pmt
         update |= PMT_UPDATE_ANCILLARY_ID;
       }
 
-      if (st->es_pid == *pcr)
+      if (st->es_pid == set->set_pcr_pid)
         pcr_shared = 1;
     }
     position++;
@@ -496,7 +496,7 @@ dvb_psi_parse_pmt
 
   /* Handle PCR 'elementary stream' */
   if (!pcr_shared) {
-    st = elementary_stream_type_modify(set, *pcr, SCT_PCR, running);
+    st = elementary_stream_type_modify(set, set->set_pcr_pid, SCT_PCR, running);
     st->es_delete_me = 0;
   }
 
@@ -571,7 +571,7 @@ dvb_pmt_callback
 
   /* Find service */
   LIST_FOREACH(s, &mm->mm_services, s_dvb_mux_link)
-    if (s->s_dvb_service_id == sid) break;
+    if (s->s_components.set_service_id == sid) break;
   if (!s) return -1;
 
   /* Process */
@@ -579,7 +579,7 @@ dvb_pmt_callback
   update = 0;
   pthread_mutex_lock(&s->s_stream_mutex);
   update = dvb_psi_parse_pmt(mt, service_nicename((service_t *)s),
-                             &s->s_components, ptr, len, &s->s_pcr_pid,
+                             &s->s_components, ptr, len,
                              s->s_status == SERVICE_RUNNING);
   if (update)
     service_request_save((service_t*)s);
index e039d6baa1536da3cc7bbff1848fcde1beafd5ec..3651c7925d1486be546ad4a425f56921cf4c2ac5 100644 (file)
@@ -44,6 +44,6 @@
 
 uint32_t dvb_psi_parse_pmt
   (mpegts_table_t *mt, const char *nicename, elementary_set_t *set,
-   const uint8_t *ptr, int len, uint16_t *pcr, int running);
+   const uint8_t *ptr, int len, int running);
 
 #endif
index 903dff11baa5d8b344166147ccb6af4ca20f955f..68e5ef08b32516ffe7cad1744e38b7c86e65dc45 100644 (file)
@@ -391,7 +391,7 @@ iptv_mux_create0 ( iptv_network_t *in, const char *uuid, htsmsg_t *conf )
     ms = iptv_service_create0(im, 0, 0, NULL, conf);
     htsmsg_destroy(conf);
     if (ms) {
-      ms->s_pmt_pid = SERVICE_PMT_AUTO;
+      ms->s_components.set_pmt_pid = SERVICE_PMT_AUTO;
       mpegts_network_bouquet_trigger((mpegts_network_t *)in, 0);
     }
   }
index c7e08cfc2d4c3fe858db81870296ed9319468995..b5986c3557c6b96463f8cfe006e8c7707160b9a0 100644 (file)
@@ -837,11 +837,13 @@ mpegts_input_open_service
   pthread_mutex_lock(&s->s_stream_mutex);
   if (s->s_type == STYPE_STD) {
 
-    if (s->s_pmt_pid == SERVICE_PMT_AUTO)
+    if (s->s_components.set_pmt_pid == SERVICE_PMT_AUTO)
       goto no_pids;
 
-    mpegts_input_open_pid(mi, mm, s->s_pmt_pid, MPS_SERVICE, MPS_WEIGHT_PMT, s, reopen);
-    mpegts_input_open_pid(mi, mm, s->s_pcr_pid, MPS_SERVICE, MPS_WEIGHT_PCR, s, reopen);
+    mpegts_input_open_pid(mi, mm, s->s_components.set_pmt_pid,
+                          MPS_SERVICE, MPS_WEIGHT_PMT, s, reopen);
+    mpegts_input_open_pid(mi, mm, s->s_components.set_pcr_pid,
+                          MPS_SERVICE, MPS_WEIGHT_PCR, s, reopen);
     if (s->s_scrambled_pass) {
       mpegts_input_open_pid(mi, mm, DVB_CAT_PID, MPS_SERVICE, MPS_WEIGHT_CAT, s, reopen);
       s->s_cat_opened = 1;
@@ -849,7 +851,8 @@ mpegts_input_open_service
     /* Open only filtered components here */
     TAILQ_FOREACH(st, &s->s_components.set_filter, es_filter_link)
       if ((s->s_scrambled_pass || st->es_type != SCT_CA) &&
-          st->es_pid != s->s_pmt_pid && st->es_pid != s->s_pcr_pid) {
+          st->es_pid != s->s_components.set_pmt_pid &&
+          st->es_pid != s->s_components.set_pcr_pid) {
         st->es_pid_opened = 1;
         mpegts_input_open_pid(mi, mm, st->es_pid, MPS_SERVICE, mpegts_mps_weight(st), s, reopen);
       }
@@ -882,7 +885,7 @@ no_pids:
     s->s_pmt_mon =
       mpegts_table_add(mm, DVB_PMT_BASE, DVB_PMT_MASK,
                        dvb_pmt_callback, s, "pmt", LS_TBL_BASE,
-                       MT_CRC, s->s_pmt_pid, MPS_WEIGHT_PMT);
+                       MT_CRC, s->s_components.set_pmt_pid, MPS_WEIGHT_PMT);
     if (s->s_scrambled_pass && (flags & SUBSCRIPTION_EMM) != 0)
       mpegts_input_open_cat_monitor(mm, s);
   }
@@ -916,11 +919,11 @@ mpegts_input_close_service ( mpegts_input_t *mi, mpegts_service_t *s )
   pthread_mutex_lock(&s->s_stream_mutex);
   if (s->s_type == STYPE_STD) {
 
-    if (s->s_pmt_pid == SERVICE_PMT_AUTO)
+    if (s->s_components.set_pmt_pid == SERVICE_PMT_AUTO)
       goto no_pids;
 
-    mpegts_input_close_pid(mi, mm, s->s_pmt_pid, MPS_SERVICE, s);
-    mpegts_input_close_pid(mi, mm, s->s_pcr_pid, MPS_SERVICE, s);
+    mpegts_input_close_pid(mi, mm, s->s_components.set_pmt_pid, MPS_SERVICE, s);
+    mpegts_input_close_pid(mi, mm, s->s_components.set_pcr_pid, MPS_SERVICE, s);
     if (s->s_cat_opened) {
       mpegts_input_close_pid(mi, mm, DVB_CAT_PID, MPS_SERVICE, s);
       s->s_cat_opened = 0;
@@ -1450,7 +1453,8 @@ mpegts_input_process
         LIST_FOREACH(mps, &mp->mp_svc_subs, mps_svcraw_link) {
           s = mps->mps_owner;
           f = (type & (MPS_TABLE|MPS_FTABLE)) ||
-              (pid == s->s_pmt_pid) || (pid == s->s_pcr_pid);
+              (pid == s->s_components.set_pmt_pid) ||
+              (pid == s->s_components.set_pcr_pid);
           ts_recv_packet1((mpegts_service_t*)s, tsb, llen, f);
         }
       } else
@@ -1459,7 +1463,8 @@ mpegts_input_process
         LIST_FOREACH(s, &mm->mm_transports, s_active_link) {
           if (s->s_type != STYPE_STD) continue;
           f = (type & (MPS_TABLE|MPS_FTABLE)) ||
-              (pid == s->s_pmt_pid) || (pid == s->s_pcr_pid);
+              (pid == s->s_components.set_pmt_pid) ||
+              (pid == s->s_components.set_pcr_pid);
           ts_recv_packet1((mpegts_service_t*)s, tsb, llen, f);
         }
       }
index 0171b8d65ac662fe58879615527153e3e8830648..a4a5bd61bcf09c37f84d687c2678127c2ba04f86 100644 (file)
@@ -1078,7 +1078,9 @@ mpegts_mux_scan_service_check ( mpegts_mux_t *mm )
     if (s->s_enabled && s->s_auto != SERVICE_AUTO_OFF &&
         s->s_dvb_check_seen + 24 * 3600 < last_seen) {
       tvhinfo(LS_MPEGTS, "disabling service %s [sid %04X/%d] (missing in PAT/SDT)",
-              s->s_nicename ?: "<unknown>", s->s_dvb_service_id, s->s_dvb_service_id);
+              s->s_nicename ?: "<unknown>",
+              s->s_components.set_service_id,
+              s->s_components.set_service_id);
       service_set_enabled((service_t *)s, 0, SERVICE_AUTO_PAT_MISSING);
     }
   }
@@ -1456,7 +1458,7 @@ mpegts_mux_find_service ( mpegts_mux_t *mm, uint16_t sid )
 {
   mpegts_service_t *ms;
   LIST_FOREACH(ms, &mm->mm_services, s_dvb_mux_link)
-    if (ms->s_dvb_service_id == sid && ms->s_enabled)
+    if (ms->s_components.set_service_id == sid && ms->s_enabled)
       break;
   return ms;
 }
index 06f63dc401b98356b274bac9a59641558aa0eec1..e48dfb336b2c1cac86b0c3260dad95f25e5b115d 100644 (file)
@@ -122,7 +122,7 @@ const idclass_t mpegts_service_class =
       .name     = N_("Service ID"),
       .desc     = N_("The service ID as set by the provider."),
       .opts     = PO_RDONLY | PO_ADVANCED,
-      .off      = offsetof(mpegts_service_t, s_dvb_service_id),
+      .off      = offsetof(mpegts_service_t, s_components.set_service_id),
     },
     {
       .type     = PT_U16,
@@ -365,9 +365,10 @@ mpegts_service_enlist
   ( service_t *t, tvh_input_t *ti, struct service_instance_list *sil,
     int flags, int weight )
 {
+  const uint16_t pid = t->s_components.set_pmt_pid;
+
   /* invalid PMT */
-  if (t->s_pmt_pid != SERVICE_PMT_AUTO &&
-      (t->s_pmt_pid <= 0 || t->s_pmt_pid >= 8191))
+  if (pid != SERVICE_PMT_AUTO && (pid <= 0 || pid >= 8191))
     return SM_CODE_INVALID_SERVICE;
 
   return mpegts_service_enlist_raw(t, ti, sil, flags, weight);
@@ -534,7 +535,7 @@ mpegts_service_channel_number ( service_t *s )
       r = ms->s_dvb_opentv_chnum * CHANNEL_SPLIT;
   }
   if (r <= 0 && ms->s_dvb_mux->mm_network->mn_sid_chnum)
-    r = ms->s_dvb_service_id * CHANNEL_SPLIT;
+    r = ms->s_components.set_service_id * CHANNEL_SPLIT;
   return r;
 }
 
@@ -629,7 +630,7 @@ mpegts_service_channel_icon ( service_t *s )
     snprintf(prop_sbuf, PROP_SBUF_LEN,
              "picon://1_0_%X_%X_%X_%X_%X_0_0_0.png",
              config.picon_scheme == PICON_ISVCTYPE ? 1 : ms->s_dvb_servicetype,
-             ms->s_dvb_service_id,
+             ms->s_components.set_service_id,
              ms->s_dvb_mux->mm_tsid,
              ms->s_dvb_mux->mm_onid,
              hash);
@@ -700,7 +701,7 @@ mpegts_service_find_e2(uint32_t stype, uint32_t sid, uint32_t tsid,
       if (mm->mm_tsid != tsid || mm->mm_onid != onid) continue;
       if (!mpegts_service_match_mux((dvb_mux_t *)mm, hash, idc)) continue;
       LIST_FOREACH(s, &mm->mm_services, s_dvb_mux_link)
-        if (s->s_dvb_service_id == sid)
+        if (s->s_components.set_service_id == sid)
           return (service_t *)s;
     }
   }
@@ -803,8 +804,8 @@ mpegts_service_create0
   /* defaults for older version */
   s->s_dvb_created = dispatch_clock;
   if (!conf) {
-    if (sid)     s->s_dvb_service_id = sid;
-    if (pmt_pid) s->s_pmt_pid = pmt_pid;
+    if (sid)     s->s_components.set_service_id = sid;
+    if (pmt_pid) s->s_components.set_pmt_pid = pmt_pid;
   }
 
   if (service_create0((service_t*)s, STYPE_STD, class, uuid,
@@ -846,7 +847,10 @@ mpegts_service_create0
   service_make_nicename((service_t*)s);
   pthread_mutex_unlock(&s->s_stream_mutex);
 
-  tvhdebug(LS_MPEGTS, "%s - add service %04X %s", mm->mm_nicename, s->s_dvb_service_id, s->s_dvb_svcname);
+  tvhdebug(LS_MPEGTS, "%s - add service %04X %s",
+           mm->mm_nicename,
+           s->s_components.set_service_id,
+           s->s_dvb_svcname);
 
   /* Bouquet */
   mpegts_network_bouquet_trigger(mn, 1);
@@ -880,9 +884,9 @@ mpegts_service_find
 
   /* Find existing service */
   LIST_FOREACH(s, &mm->mm_services, s_dvb_mux_link) {
-    if (s->s_dvb_service_id == sid) {
-      if (pmt_pid && pmt_pid != s->s_pmt_pid) {
-        s->s_pmt_pid = pmt_pid;
+    if (s->s_components.set_service_id == sid) {
+      if (pmt_pid && pmt_pid != s->s_components.set_pmt_pid) {
+        s->s_components.set_pmt_pid = pmt_pid;
         if (save) *save = 1;
       }
       if (create) {
@@ -918,7 +922,8 @@ mpegts_service_find_by_pid ( mpegts_mux_t *mm, int pid )
   /* Find existing service */
   LIST_FOREACH(s, &mm->mm_services, s_dvb_mux_link) {
     pthread_mutex_lock(&s->s_stream_mutex);
-    if (pid == s->s_pmt_pid || pid == s->s_pcr_pid)
+    if (pid == s->s_components.set_pmt_pid ||
+        pid == s->s_components.set_pcr_pid)
       goto ok;
     if (elementary_stream_find(&s->s_components, pid))
       goto ok;
@@ -938,7 +943,10 @@ mpegts_service_autoenable( mpegts_service_t *s, const char *where )
 {
   if (!s->s_enabled && s->s_auto == SERVICE_AUTO_PAT_MISSING) {
     tvhinfo(LS_MPEGTS, "enabling service %s [sid %04X/%d] (found in %s)",
-            s->s_nicename, s->s_dvb_service_id, s->s_dvb_service_id, where);
+            s->s_nicename,
+            s->s_components.set_service_id,
+            s->s_components.set_service_id,
+            where);
     service_set_enabled((service_t *)s, 1, SERVICE_AUTO_NORMAL);
   }
   s->s_dvb_check_seen = gclk();
@@ -1046,13 +1054,13 @@ mpegts_service_update_slave_pids
 
   lock_assert(&s->s_stream_mutex);
 
-  if (s->s_pmt_pid == SERVICE_PMT_AUTO)
+  if (s->s_components.set_pmt_pid == SERVICE_PMT_AUTO)
     return;
 
   pids = mpegts_pid_alloc();
 
-  mpegts_pid_add(pids, s->s_pmt_pid, MPS_WEIGHT_PMT);
-  mpegts_pid_add(pids, s->s_pcr_pid, MPS_WEIGHT_PCR);
+  mpegts_pid_add(pids, s->s_components.set_pmt_pid, MPS_WEIGHT_PMT);
+  mpegts_pid_add(pids, s->s_components.set_pcr_pid, MPS_WEIGHT_PCR);
 
   /* Ensure that filtered PIDs are not send in ts_recv_raw */
   TAILQ_FOREACH(st, &s->s_components.set_filter, es_filter_link)
index ab276be9f05e7b734723a73dafe9ebdbf3c402c7..9ab15ffebff377700ec156b2fea60ec633d584bd 100644 (file)
@@ -858,8 +858,8 @@ satip_frontend_update_pids
           RB_FOREACH(mps, &mp->mp_subs, mps_link)
             w = MAX(w, mps->mps_weight);
           LIST_FOREACH(s, &mm->mm_services, s_dvb_mux_link) {
-            mpegts_pid_add(&tr->sf_pids, s->s_pmt_pid, w);
-            mpegts_pid_add(&tr->sf_pids, s->s_pcr_pid, w);
+            mpegts_pid_add(&tr->sf_pids, s->s_components.set_pmt_pid, w);
+            mpegts_pid_add(&tr->sf_pids, s->s_components.set_pcr_pid, w);
             TAILQ_FOREACH(st, &s->s_components.set_all, es_link)
               mpegts_pid_add(&tr->sf_pids, st->es_pid, w);
           }
index a6b7d647cf887b5ec9f5cdfc0fb3c477711467a9..894a7d1f9dc88117ad2479492819b87cc36fb4cc 100644 (file)
@@ -187,7 +187,7 @@ ts_recv_packet1
 
   st = elementary_stream_find(&t->s_components, pid);
 
-  if((st == NULL) && (pid != t->s_pcr_pid) && !table) {
+  if((st == NULL) && (pid != t->s_components.set_pcr_pid) && !table) {
     pthread_mutex_unlock(&t->s_stream_mutex);
     return 0;
   }
index 5484831e4e7f0ddc57bf720bd14b6247ef5641f6..b7cc980e08b42aa710b96b87118e0d39b0123200 100644 (file)
@@ -96,8 +96,8 @@ tsfile_input_thread ( void *aux )
       mpegts_service_t *s;
       pthread_mutex_lock(&tsfile_lock);
       LIST_FOREACH(s, &tmi->mmi_mux->mm_services, s_dvb_mux_link) {
-        if (s->s_pcr_pid)
-          tmi->mmi_tsfile_pcr_pid = s->s_pcr_pid;
+        if (s->s_components.set_pcr_pid)
+          tmi->mmi_tsfile_pcr_pid = s->s_components.set_pcr_pid;
       }
       pthread_mutex_unlock(&tsfile_lock);
     }
index 2a679ad537e9213a15b3106093a689bc2bf91308..89e40f4c1be5d0ae1cb232596f5455930e6ee48b 100644 (file)
@@ -489,7 +489,7 @@ rtsp_validate_service(mpegts_service_t *s, mpegts_apids_t *pids)
   elementary_stream_t *st;
 
   pthread_mutex_lock(&s->s_stream_mutex);
-  if (s->s_pmt_pid <= 0 || s->s_pcr_pid <= 0) {
+  if (s->s_components.set_pmt_pid <= 0 || s->s_components.set_pcr_pid <= 0) {
     pthread_mutex_unlock(&s->s_stream_mutex);
     return 0;
   }
@@ -504,7 +504,8 @@ rtsp_validate_service(mpegts_service_t *s, mpegts_apids_t *pids)
   pthread_mutex_unlock(&s->s_stream_mutex);
   if (enc == 0 || av == 0)
     return 0;
-  return pids == NULL || mpegts_pid_wexists(pids, s->s_pmt_pid, MPS_WEIGHT_RAW);
+  return pids == NULL ||
+         mpegts_pid_wexists(pids, s->s_components.set_pmt_pid, MPS_WEIGHT_RAW);
 }
 
 /*
@@ -573,8 +574,9 @@ end:
     mpegts_pid_init(&pmt_pids);
     LIST_FOREACH(sub, &rs->slaves, link) {
       if ((s = sub->service) == NULL) continue;
-      if (s->s_pmt_pid <= 0 || s->s_pmt_pid >= 8191) continue;
-      mpegts_pid_add(&pmt_pids, s->s_pmt_pid, MPS_WEIGHT_PMT);
+      if (s->s_components.set_pmt_pid <= 0 ||
+          s->s_components.set_pmt_pid >= 8191) continue;
+      mpegts_pid_add(&pmt_pids, s->s_components.set_pmt_pid, MPS_WEIGHT_PMT);
     }
     satip_rtp_update_pmt_pids(rs->rtp_handle, &pmt_pids);
     mpegts_pid_done(&pmt_pids);
index 7570e8eedec6ebca6a3f913763d3d4fb71aada12..9a742f68f788cb8e9b9cfcb901bf313a81aa7f01 100644 (file)
@@ -746,7 +746,7 @@ service_make_nicename0(service_t *t, char *buf, size_t len, int adapter)
 
   service_name = si.si_service;
   if (service_name == NULL || si.si_service[0] == '0') {
-    snprintf(buf2, sizeof(buf2), "{PMT:%d}", t->s_pmt_pid);
+    snprintf(buf2, sizeof(buf2), "{PMT:%d}", t->s_components.set_pmt_pid);
     service_name = buf2;
   }
 
@@ -983,6 +983,7 @@ void
 service_restart_streams(service_t *t)
 {
   streaming_message_t *sm;
+  streaming_start_t *ss;
   const int had_streams = elementary_set_has_streams(&t->s_components, 1);
   const int had_components = had_streams && t->s_running;
 
@@ -993,7 +994,8 @@ service_restart_streams(service_t *t)
       sm = streaming_msg_create_code(SMT_STOP, SM_CODE_SOURCE_RECONFIGURED);
       streaming_service_deliver(t, sm);
     }
-    sm = streaming_msg_create_data(SMT_START, service_build_stream_start(t));
+    ss = elementary_stream_build_start(&t->s_components);
+    sm = streaming_msg_create_data(SMT_START, ss);
     streaming_pad_deliver(&t->s_streaming_pad, sm);
     t->s_running = 1;
   } else {
@@ -1027,25 +1029,6 @@ service_restart(service_t *t)
   descrambler_service_start(t);
 }
 
-/**
- * Generate a message containing info about all components
- */
-streaming_start_t *
-service_build_stream_start(service_t *t)
-{
-  extern const idclass_t mpegts_service_class;
-  streaming_start_t *ss;
-
-  ss = elementary_stream_build_start(&t->s_components);
-  ss->ss_pcr_pid = t->s_pcr_pid;
-  ss->ss_pmt_pid = t->s_pmt_pid;
-  if (idnode_is_instance(&t->s_id, &mpegts_service_class)) {
-    mpegts_service_t *ts = (mpegts_service_t*)t;
-    ss->ss_service_id = ts->s_dvb_service_id;
-  }
-  return ss;
-}
-
 /**
  *
  */
@@ -1516,8 +1499,8 @@ void service_save ( service_t *t, htsmsg_t *m )
   idnode_save(&t->s_id, m);
 
   htsmsg_add_s32(m, "verified", t->s_verified);
-  htsmsg_add_u32(m, "pcr", t->s_pcr_pid);
-  htsmsg_add_u32(m, "pmt", t->s_pmt_pid);
+  htsmsg_add_u32(m, "pcr", t->s_components.set_pcr_pid);
+  htsmsg_add_u32(m, "pmt", t->s_components.set_pmt_pid);
 
   pthread_mutex_lock(&t->s_stream_mutex);
 
@@ -1674,7 +1657,7 @@ void service_load ( service_t *t, htsmsg_t *c )
   htsmsg_t *m, *hbbtv;
   htsmsg_field_t *f;
   int32_t s32;
-  uint32_t u32, pid;
+  uint32_t u32, pid, pid2;
   elementary_stream_t *st;
   streaming_component_type_t type;
   const char *v;
@@ -1688,9 +1671,9 @@ void service_load ( service_t *t, htsmsg_t *c )
   else
     t->s_verified = 1;
   if(!htsmsg_get_u32(c, "pcr", &u32))
-    t->s_pcr_pid = u32;
+    t->s_components.set_pcr_pid = u32;
   if(!htsmsg_get_u32(c, "pmt", &u32))
-    t->s_pmt_pid = u32;
+    t->s_components.set_pmt_pid = u32;
 
   if (config.hbbtv) {
     hbbtv = htsmsg_get_map(c, "hbbtv");
@@ -1718,7 +1701,8 @@ void service_load ( service_t *t, htsmsg_t *c )
       if(htsmsg_get_u32(c, "pid", &pid))
         continue;
 
-      if(pid > 0 && t->s_pcr_pid > 0 && pid == t->s_pcr_pid)
+      pid2 = t->s_components.set_pcr_pid;
+      if(pid > 0 && pid2 > 0 && pid == pid2)
         shared_pcr = 1;
 
       st = elementary_stream_create(&t->s_components, pid, type, 0);
@@ -1765,7 +1749,8 @@ void service_load ( service_t *t, htsmsg_t *c )
     }
   }
   if (!shared_pcr)
-    elementary_stream_type_modify(&t->s_components, t->s_pcr_pid, SCT_PCR, 0);
+    elementary_stream_type_modify(&t->s_components,
+                                   t->s_components.set_pcr_pid, SCT_PCR, 0);
   else
     elementary_stream_type_destroy(&t->s_components, SCT_PCR);
   elementary_set_sort_streams(&t->s_components);
index 5e645b0cedce47b4ce4a89b93dc61b5c77dc8158..b7b330be09dd2ecff965ebc060ff8ad37f9da85b 100644 (file)
@@ -188,18 +188,6 @@ typedef struct service {
 
 // TODO: should this really be here?
 
-  /**
-   * PID carrying the programs PCR.
-   * XXX: We don't support transports that does not carry
-   * the PCR in one of the content streams.
-   */
-  uint16_t s_pcr_pid;
-
-  /**
-   * PID for the PMT of this MPEG-TS stream.
-   */
-  uint16_t s_pmt_pid;
-
   /**
    * Set if transport is enabled (the default).  If disabled it should
    * not be considered when chasing for available transports during
@@ -478,9 +466,6 @@ service_reset_streaming_status_flags(service_t *t, int flag)
     service_set_streaming_status_flags_(t, n & ~flag);
 }
 
-struct streaming_start;
-struct streaming_start *service_build_stream_start(service_t *t);
-
 void service_restart(service_t *t);
 
 void service_restart_streams(service_t *t);
index b763f280f5dbaee87ae36a4ccf7de4355e142749..4d33ada4494cacfb69d9719f8a743e2aefc58f1a 100644 (file)
@@ -88,6 +88,8 @@ static void
 subscription_link_service(th_subscription_t *s, service_t *t)
 {
   streaming_message_t *sm;
+  streaming_start_t *ss;
+
   subsetstate(s, SUBSCRIPTION_TESTING_SERVICE);
  
   s->ths_service = t;
@@ -99,11 +101,9 @@ subscription_link_service(th_subscription_t *s, service_t *t)
   pthread_mutex_lock(&t->s_stream_mutex);
 
   if(elementary_set_has_streams(&t->s_components, 1) || t->s_type != STYPE_STD) {
-
     streaming_msg_free(s->ths_start_message);
-
-    s->ths_start_message =
-      streaming_msg_create_data(SMT_START, service_build_stream_start(t));
+    ss = elementary_stream_build_start(&t->s_components);
+    s->ths_start_message = streaming_msg_create_data(SMT_START, ss);
   }
 
   // Link to service output