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);
}
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;
{
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;
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);
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)
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;
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);
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);
}
}
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);
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);
*(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;
}
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;
};
/*
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;
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) {
/* 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;
}
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);
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;
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);
update |= PMT_UPDATE_ANCILLARY_ID;
}
- if (st->es_pid == *pcr)
+ if (st->es_pid == set->set_pcr_pid)
pcr_shared = 1;
}
position++;
/* 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;
}
/* 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 */
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);
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
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);
}
}
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;
/* 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);
}
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);
}
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;
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
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);
}
}
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);
}
}
{
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;
}
.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,
( 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);
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;
}
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);
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;
}
}
/* 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,
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);
/* 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) {
/* 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;
{
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();
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)
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);
}
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;
}
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);
}
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;
}
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);
}
/*
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);
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;
}
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;
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 {
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;
-}
-
/**
*
*/
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);
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;
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");
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);
}
}
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);
// 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
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);
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;
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