tvhdebug(mt->mt_subsys, "%s: caid %04X (%s) provider %08X pid %04X",
mt->mt_name, caid, caid2name(caid), provid, pid);
- if((st = service_stream_find((service_t*)t, pid)) == NULL) {
+ st = service_stream_find((service_t*)t, pid);
+ if (st == NULL || st->es_type != SCT_CA) {
st = service_stream_create((service_t*)t, pid, SCT_CA);
r |= PMT_UPDATE_NEW_CA_STREAM;
}
// higher than normal MPEG TS (0x2000 ++)
int pid = DVB_TELETEXT_BASE + page;
- if((st = service_stream_find((service_t*)t, pid)) == NULL) {
+ st = service_stream_find((service_t*)t, pid);
+ if (st == NULL || st->es_type != SCT_TEXTSUB) {
r |= PMT_UPDATE_NEW_STREAM;
st = service_stream_create((service_t*)t, pid, SCT_TEXTSUB);
- st->es_delete_me = 1;
}
-
lang = lang_code_get2((const char*)ptr, 3);
if(memcmp(st->es_lang,lang,3)) {
r |= PMT_UPDATE_LANGUAGE;
len -= dlen; ptr += dlen; dllen -= dlen;
}
- if(hts_stream_type != SCT_UNKNOWN) {
+ if (hts_stream_type != SCT_UNKNOWN) {
- if((st = service_stream_find((service_t*)t, pid)) == NULL) {
+ st = service_stream_find((service_t*)t, pid);
+ if (st == NULL || st->es_type != hts_stream_type) {
update |= PMT_UPDATE_NEW_STREAM;
st = service_stream_create((service_t*)t, pid, hts_stream_type);
}
/* Handle PCR 'elementary stream' */
if (!pcr_shared) {
- st = service_stream_type_find((service_t *)t, SCT_PCR);
- if (st)
- st->es_pid = t->s_pcr_pid;
- else
- st = service_stream_create((service_t*)t, t->s_pcr_pid, SCT_PCR);
+ st = service_stream_type_modify((service_t *)t, t->s_pcr_pid, SCT_PCR);
st->es_delete_me = 0;
}
/* 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 (service_create0((service_t*)s, STYPE_STD, class, uuid,
S_MPEG_TS, conf) == NULL)
/* Create */
sbuf_init(&s->s_tsbuf);
- if (!conf) {
- if (sid) s->s_dvb_service_id = sid;
- if (pmt_pid) s->s_pmt_pid = pmt_pid;
- } else {
+ if (conf) {
if (s->s_dvb_last_seen > gclk()) /* sanity check */
s->s_dvb_last_seen = gclk();
}
const idclass_t *class, const char *uuid,
int source_type, htsmsg_t *conf )
{
+ lock_assert(&global_lock);
+
if (idnode_insert(&t->s_id, uuid, class, 0)) {
if (uuid)
tvherror(LS_SERVICE, "invalid uuid '%s'", uuid);
return NULL;
}
- lock_assert(&global_lock);
-
if (service_type == STYPE_RAW)
TAILQ_INSERT_TAIL(&service_raw_all, t, s_all_link);
else
service_stream_make_nicename(t, st);
}
-
/**
* Add a new stream to a service
*/
return st;
}
-
-
/**
* Find an elementary stream in a service
*/
return NULL;
}
+/**
+ *
+ */
+elementary_stream_t *
+service_stream_type_modify(service_t *t, int pid,
+ streaming_component_type_t type)
+{
+ elementary_stream_t *es = service_stream_type_find(t, type);
+ if (!es)
+ return service_stream_create(t, pid, type);
+ if (es->es_pid != pid)
+ es->es_pid = pid;
+ return es;
+}
+
+/**
+ *
+ */
+void
+service_stream_type_destroy(service_t *t, streaming_component_type_t type)
+{
+ elementary_stream_t *es = service_stream_type_find(t, type);
+ if (es)
+ service_stream_destroy(t, es);
+}
+
/**
*
*/
idnode_load(&t->s_id, c);
+ pthread_mutex_lock(&t->s_stream_mutex);
if(!htsmsg_get_s32(c, "verified", &s32))
t->s_verified = s32;
else
}
}
- pthread_mutex_lock(&t->s_stream_mutex);
m = htsmsg_get_list(c, "stream");
if (m) {
HTSMSG_FOREACH(f, m) {
}
}
if (!shared_pcr)
- service_stream_create(t, t->s_pcr_pid, SCT_PCR);
+ service_stream_type_modify(t, t->s_pcr_pid, SCT_PCR);
+ else
+ service_stream_type_destroy(t, SCT_PCR);
sort_elementary_streams(t);
pthread_mutex_unlock(&t->s_stream_mutex);
}
elementary_stream_t *service_stream_create(service_t *t, int pid,
streaming_component_type_t type);
+elementary_stream_t *
+service_stream_type_modify(service_t *t, int pid,
+ streaming_component_type_t type);
+
void service_settings_write(service_t *t);
const char *service_servicetype_txt(service_t *t);
void service_stream_destroy(service_t *t, elementary_stream_t *st);
+void service_stream_type_destroy(service_t *t, streaming_component_type_t type);
+
void service_request_save(service_t *t, int restart);
void service_source_info_free(source_info_t *si);
SCT_NONE = -1,
SCT_UNKNOWN = 0,
SCT_RAW = 1,
- SCT_PCR,
+ SCT_PCR, /* MPEG-TS PCR data */
+ SCT_CAT, /* MPEG-TS CAT (EMM) data */
+ SCT_CA, /* MPEG-TS ECM data */
+ SCT_HBBTV, /* HBBTV info */
+ /* standard codecs */
SCT_MPEG2VIDEO,
SCT_MPEG2AUDIO,
SCT_H264,
SCT_AC3,
SCT_TELETEXT,
SCT_DVBSUB,
- SCT_CA,
SCT_AAC, /* AAC-LATM in MPEG-TS, ADTS + AAC in packet form */
SCT_MPEGTS,
SCT_TEXTSUB,
SCT_VORBIS,
SCT_HEVC,
SCT_VP9,
- SCT_HBBTV,
SCT_THEORA,
SCT_OPUS,
- SCT_CAT, /* MPEG-TS CAT (EMM) data */
- SCT_LAST = SCT_CAT
+ SCT_LAST = SCT_OPUS
} streaming_component_type_t;
#define SCT_MASK(t) (1 << (t))