From: Jaroslav Kysela Date: Thu, 8 Mar 2018 17:31:44 +0000 (+0100) Subject: esstream: move pmt/pcr/service id from service_t to elementary_set_t X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6314d5b2ea4e32a864bcd4798f247e050eee143d;p=thirdparty%2Ftvheadend.git esstream: move pmt/pcr/service id from service_t to elementary_set_t --- diff --git a/src/api/api_service.c b/src/api/api_service.c index 36c262432..8d4d7e487 100644 --- a/src/api/api_service.c +++ b/src/api/api_service.c @@ -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); } diff --git a/src/descrambler/capmt.c b/src/descrambler/capmt.c index 40a50d358..b7661c141 100644 --- a/src/descrambler/capmt.c +++ b/src/descrambler/capmt.c @@ -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; diff --git a/src/descrambler/cccam.c b/src/descrambler/cccam.c index 52fc3d274..575925a01 100644 --- a/src/descrambler/cccam.c +++ b/src/descrambler/cccam.c @@ -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); diff --git a/src/descrambler/constcw.c b/src/descrambler/constcw.c index 2a5fa0865..dcd2e99bf 100644 --- a/src/descrambler/constcw.c +++ b/src/descrambler/constcw.c @@ -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) diff --git a/src/descrambler/cwc.c b/src/descrambler/cwc.c index 295538c32..0ac8f31bd 100644 --- a/src/descrambler/cwc.c +++ b/src/descrambler/cwc.c @@ -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); diff --git a/src/descrambler/descrambler.c b/src/descrambler/descrambler.c index 1810e6e1b..853a63279 100644 --- a/src/descrambler/descrambler.c +++ b/src/descrambler/descrambler.c @@ -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); } diff --git a/src/descrambler/dvbcam.c b/src/descrambler/dvbcam.c index e966468ee..8ba797080 100644 --- a/src/descrambler/dvbcam.c +++ b/src/descrambler/dvbcam.c @@ -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); diff --git a/src/esstream.c b/src/esstream.c index 157e7400b..c3269616b 100644 --- a/src/esstream.c +++ b/src/esstream.c @@ -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; } diff --git a/src/esstream.h b/src/esstream.h index 14643e62f..a344ce934 100644 --- a/src/esstream.h +++ b/src/esstream.h @@ -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; }; /* diff --git a/src/input/mpegts.h b/src/input/mpegts.h index e9fb8c070..3481aab69 100644 --- a/src/input/mpegts.h +++ b/src/input/mpegts.h @@ -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; diff --git a/src/input/mpegts/dvb_charset.c b/src/input/mpegts/dvb_charset.c index ff44da15e..b8ce2f7de 100644 --- a/src/input/mpegts/dvb_charset.c +++ b/src/input/mpegts/dvb_charset.c @@ -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) { diff --git a/src/input/mpegts/dvb_psi.c b/src/input/mpegts/dvb_psi.c index dd7007cef..e4d86f334 100644 --- a/src/input/mpegts/dvb_psi.c +++ b/src/input/mpegts/dvb_psi.c @@ -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); diff --git a/src/input/mpegts/dvb_psi_pmt.c b/src/input/mpegts/dvb_psi_pmt.c index 5211818cf..e498f6323 100644 --- a/src/input/mpegts/dvb_psi_pmt.c +++ b/src/input/mpegts/dvb_psi_pmt.c @@ -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); diff --git a/src/input/mpegts/dvb_psi_pmt.h b/src/input/mpegts/dvb_psi_pmt.h index e039d6baa..3651c7925 100644 --- a/src/input/mpegts/dvb_psi_pmt.h +++ b/src/input/mpegts/dvb_psi_pmt.h @@ -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 diff --git a/src/input/mpegts/iptv/iptv_mux.c b/src/input/mpegts/iptv/iptv_mux.c index 903dff11b..68e5ef08b 100644 --- a/src/input/mpegts/iptv/iptv_mux.c +++ b/src/input/mpegts/iptv/iptv_mux.c @@ -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); } } diff --git a/src/input/mpegts/mpegts_input.c b/src/input/mpegts/mpegts_input.c index c7e08cfc2..b5986c355 100644 --- a/src/input/mpegts/mpegts_input.c +++ b/src/input/mpegts/mpegts_input.c @@ -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); } } diff --git a/src/input/mpegts/mpegts_mux.c b/src/input/mpegts/mpegts_mux.c index 0171b8d65..a4a5bd61b 100644 --- a/src/input/mpegts/mpegts_mux.c +++ b/src/input/mpegts/mpegts_mux.c @@ -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 ?: "", s->s_dvb_service_id, s->s_dvb_service_id); + s->s_nicename ?: "", + 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; } diff --git a/src/input/mpegts/mpegts_service.c b/src/input/mpegts/mpegts_service.c index 06f63dc40..e48dfb336 100644 --- a/src/input/mpegts/mpegts_service.c +++ b/src/input/mpegts/mpegts_service.c @@ -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) diff --git a/src/input/mpegts/satip/satip_frontend.c b/src/input/mpegts/satip/satip_frontend.c index ab276be9f..9ab15ffeb 100644 --- a/src/input/mpegts/satip/satip_frontend.c +++ b/src/input/mpegts/satip/satip_frontend.c @@ -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); } diff --git a/src/input/mpegts/tsdemux.c b/src/input/mpegts/tsdemux.c index a6b7d647c..894a7d1f9 100644 --- a/src/input/mpegts/tsdemux.c +++ b/src/input/mpegts/tsdemux.c @@ -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; } diff --git a/src/input/mpegts/tsfile/tsfile_input.c b/src/input/mpegts/tsfile/tsfile_input.c index 5484831e4..b7cc980e0 100644 --- a/src/input/mpegts/tsfile/tsfile_input.c +++ b/src/input/mpegts/tsfile/tsfile_input.c @@ -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); } diff --git a/src/satip/rtsp.c b/src/satip/rtsp.c index 2a679ad53..89e40f4c1 100644 --- a/src/satip/rtsp.c +++ b/src/satip/rtsp.c @@ -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); diff --git a/src/service.c b/src/service.c index 7570e8eed..9a742f68f 100644 --- a/src/service.c +++ b/src/service.c @@ -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); diff --git a/src/service.h b/src/service.h index 5e645b0ce..b7b330be0 100644 --- a/src/service.h +++ b/src/service.h @@ -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); diff --git a/src/subscriptions.c b/src/subscriptions.c index b763f280f..4d33ada44 100644 --- a/src/subscriptions.c +++ b/src/subscriptions.c @@ -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