esfilter: add logical stream index, enhance the CA type filtering
- add the logical stream index - see help - add the PID filtering for the CA type - fix the service info dialog (do not show some filtered CAIDs)
This commit is contained in:
parent
8ca95e9d79
commit
a1811747d2
5 changed files with 59 additions and 9 deletions
|
@ -67,9 +67,17 @@ The columns have the following functions:
|
||||||
<dt>CA Provider
|
<dt>CA Provider
|
||||||
<dd>The CA provider to compare. Empty field means any.
|
<dd>The CA provider to compare. Empty field means any.
|
||||||
|
|
||||||
|
<dt>Stream Index
|
||||||
|
<dd>The logical stream index to compare. Note that this index is computed
|
||||||
|
using all filters. Example: If filter is set to AC3 audio type and
|
||||||
|
the language to 'eng' and there are two AC3 'eng' streams in
|
||||||
|
the service, the first stream could be identified using number 1
|
||||||
|
and the second using number 2.
|
||||||
|
|
||||||
<dt>PID
|
<dt>PID
|
||||||
<dd>Program identification (PID) number to compare. Zero means any.
|
<dd>Program identification (PID) number to compare. Zero means any.
|
||||||
This comparison is processed only when service comparison is active.
|
This comparison is processed only when service comparison is active
|
||||||
|
and for the Conditional Access filter.
|
||||||
|
|
||||||
<dt>Action
|
<dt>Action
|
||||||
<dd>The rule action defines the operation when all comparisons succeeds.
|
<dd>The rule action defines the operation when all comparisons succeeds.
|
||||||
|
|
|
@ -93,7 +93,7 @@ api_service_mapper_notify ( void )
|
||||||
}
|
}
|
||||||
|
|
||||||
static htsmsg_t *
|
static htsmsg_t *
|
||||||
api_service_streams_get_one ( elementary_stream_t *es )
|
api_service_streams_get_one ( elementary_stream_t *es, int use_filter )
|
||||||
{
|
{
|
||||||
htsmsg_t *e = htsmsg_create_map();
|
htsmsg_t *e = htsmsg_create_map();
|
||||||
htsmsg_add_u32(e, "index", es->es_index);
|
htsmsg_add_u32(e, "index", es->es_index);
|
||||||
|
@ -115,6 +115,8 @@ api_service_streams_get_one ( elementary_stream_t *es )
|
||||||
caid_t *ca;
|
caid_t *ca;
|
||||||
htsmsg_t *e2, *l2 = htsmsg_create_list();
|
htsmsg_t *e2, *l2 = htsmsg_create_list();
|
||||||
LIST_FOREACH(ca, &es->es_caids, link) {
|
LIST_FOREACH(ca, &es->es_caids, link) {
|
||||||
|
if (use_filter && !ca->use)
|
||||||
|
continue;
|
||||||
e2 = htsmsg_create_map();
|
e2 = htsmsg_create_map();
|
||||||
htsmsg_add_u32(e2, "caid", ca->caid);
|
htsmsg_add_u32(e2, "caid", ca->caid);
|
||||||
htsmsg_add_u32(e2, "provider", ca->providerid);
|
htsmsg_add_u32(e2, "provider", ca->providerid);
|
||||||
|
@ -163,12 +165,12 @@ api_service_streams
|
||||||
htsmsg_add_msg(st, NULL, e);
|
htsmsg_add_msg(st, NULL, e);
|
||||||
}
|
}
|
||||||
TAILQ_FOREACH(es, &s->s_components, es_link)
|
TAILQ_FOREACH(es, &s->s_components, es_link)
|
||||||
htsmsg_add_msg(st, NULL, api_service_streams_get_one(es));
|
htsmsg_add_msg(st, NULL, api_service_streams_get_one(es, 0));
|
||||||
if (TAILQ_FIRST(&s->s_filt_components) == NULL ||
|
if (TAILQ_FIRST(&s->s_filt_components) == NULL ||
|
||||||
s->s_status == SERVICE_IDLE)
|
s->s_status == SERVICE_IDLE)
|
||||||
service_build_filter(s);
|
service_build_filter(s);
|
||||||
TAILQ_FOREACH(es, &s->s_filt_components, es_filt_link)
|
TAILQ_FOREACH(es, &s->s_filt_components, es_filt_link)
|
||||||
htsmsg_add_msg(stf, NULL, api_service_streams_get_one(es));
|
htsmsg_add_msg(stf, NULL, api_service_streams_get_one(es, 1));
|
||||||
*resp = htsmsg_create_map();
|
*resp = htsmsg_create_map();
|
||||||
htsmsg_add_str(*resp, "name", s->s_nicename);
|
htsmsg_add_str(*resp, "name", s->s_nicename);
|
||||||
htsmsg_add_msg(*resp, "streams", st);
|
htsmsg_add_msg(*resp, "streams", st);
|
||||||
|
|
|
@ -642,6 +642,12 @@ const idclass_t esfilter_class_video = {
|
||||||
.set = esfilter_class_service_set,
|
.set = esfilter_class_service_set,
|
||||||
.list = esfilter_class_service_enum,
|
.list = esfilter_class_service_enum,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.type = PT_INT,
|
||||||
|
.id = "sindex",
|
||||||
|
.name = "Stream Index",
|
||||||
|
.off = offsetof(esfilter_t, esf_sindex),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.type = PT_INT,
|
.type = PT_INT,
|
||||||
.id = "pid",
|
.id = "pid",
|
||||||
|
@ -703,6 +709,12 @@ const idclass_t esfilter_class_audio = {
|
||||||
.set = esfilter_class_service_set,
|
.set = esfilter_class_service_set,
|
||||||
.list = esfilter_class_service_enum,
|
.list = esfilter_class_service_enum,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.type = PT_INT,
|
||||||
|
.id = "sindex",
|
||||||
|
.name = "Stream Index",
|
||||||
|
.off = offsetof(esfilter_t, esf_sindex),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.type = PT_INT,
|
.type = PT_INT,
|
||||||
.id = "pid",
|
.id = "pid",
|
||||||
|
@ -764,6 +776,12 @@ const idclass_t esfilter_class_teletext = {
|
||||||
.set = esfilter_class_service_set,
|
.set = esfilter_class_service_set,
|
||||||
.list = esfilter_class_service_enum,
|
.list = esfilter_class_service_enum,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.type = PT_INT,
|
||||||
|
.id = "sindex",
|
||||||
|
.name = "Stream Index",
|
||||||
|
.off = offsetof(esfilter_t, esf_sindex),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.type = PT_INT,
|
.type = PT_INT,
|
||||||
.id = "pid",
|
.id = "pid",
|
||||||
|
@ -825,6 +843,12 @@ const idclass_t esfilter_class_subtit = {
|
||||||
.set = esfilter_class_service_set,
|
.set = esfilter_class_service_set,
|
||||||
.list = esfilter_class_service_enum,
|
.list = esfilter_class_service_enum,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.type = PT_INT,
|
||||||
|
.id = "sindex",
|
||||||
|
.name = "Stream Index",
|
||||||
|
.off = offsetof(esfilter_t, esf_sindex),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.type = PT_INT,
|
.type = PT_INT,
|
||||||
.id = "pid",
|
.id = "pid",
|
||||||
|
@ -894,6 +918,12 @@ const idclass_t esfilter_class_ca = {
|
||||||
.set = esfilter_class_service_set,
|
.set = esfilter_class_service_set,
|
||||||
.list = esfilter_class_service_enum,
|
.list = esfilter_class_service_enum,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.type = PT_INT,
|
||||||
|
.id = "sindex",
|
||||||
|
.name = "Stream Index",
|
||||||
|
.off = offsetof(esfilter_t, esf_sindex),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.type = PT_INT,
|
.type = PT_INT,
|
||||||
.id = "pid",
|
.id = "pid",
|
||||||
|
|
|
@ -91,6 +91,7 @@ typedef struct esfilter {
|
||||||
uint32_t esf_type;
|
uint32_t esf_type;
|
||||||
char esf_language[4];
|
char esf_language[4];
|
||||||
char esf_service[UUID_HEX_SIZE];
|
char esf_service[UUID_HEX_SIZE];
|
||||||
|
int esf_sindex;
|
||||||
int esf_pid;
|
int esf_pid;
|
||||||
uint16_t esf_caid;
|
uint16_t esf_caid;
|
||||||
uint32_t esf_caprovider;
|
uint32_t esf_caprovider;
|
||||||
|
|
|
@ -346,7 +346,7 @@ service_build_filter(service_t *t)
|
||||||
elementary_stream_t *st, *st2, **sta;
|
elementary_stream_t *st, *st2, **sta;
|
||||||
esfilter_t *esf;
|
esfilter_t *esf;
|
||||||
caid_t *ca, *ca2;
|
caid_t *ca, *ca2;
|
||||||
int i, n, p, o, exclusive;
|
int i, n, p, o, exclusive, sindex;
|
||||||
uint32_t mask;
|
uint32_t mask;
|
||||||
|
|
||||||
/* rebuild the filtered and ordered components */
|
/* rebuild the filtered and ordered components */
|
||||||
|
@ -387,6 +387,7 @@ filter:
|
||||||
TAILQ_FOREACH(esf, &esfilters[i], esf_link) {
|
TAILQ_FOREACH(esf, &esfilters[i], esf_link) {
|
||||||
if (!esf->esf_enabled)
|
if (!esf->esf_enabled)
|
||||||
continue;
|
continue;
|
||||||
|
sindex = 0;
|
||||||
TAILQ_FOREACH(st, &t->s_components, es_link) {
|
TAILQ_FOREACH(st, &t->s_components, es_link) {
|
||||||
if ((mask & SCT_MASK(st->es_type)) == 0)
|
if ((mask & SCT_MASK(st->es_type)) == 0)
|
||||||
continue;
|
continue;
|
||||||
|
@ -402,6 +403,8 @@ filter:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (i == ESF_CLASS_CA) {
|
if (i == ESF_CLASS_CA) {
|
||||||
|
if (esf->esf_pid && esf->esf_pid != st->es_pid)
|
||||||
|
continue;
|
||||||
ca = NULL;
|
ca = NULL;
|
||||||
if ((esf->esf_caid != (uint16_t)-1 || esf->esf_caprovider != -1)) {
|
if ((esf->esf_caid != (uint16_t)-1 || esf->esf_caprovider != -1)) {
|
||||||
LIST_FOREACH(ca, &st->es_caids, link) {
|
LIST_FOREACH(ca, &st->es_caids, link) {
|
||||||
|
@ -414,9 +417,12 @@ filter:
|
||||||
if (ca == NULL)
|
if (ca == NULL)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
sindex++;
|
||||||
|
if (esf->esf_sindex && esf->esf_sindex != sindex)
|
||||||
|
continue;
|
||||||
if (esf->esf_log)
|
if (esf->esf_log)
|
||||||
tvhlog(LOG_INFO, "service", "esfilter: %s %03d %05d %04x %06x \"%s\" %s",
|
tvhlog(LOG_INFO, "service", "esfilter: %s %03d %03d %05d %04x %06x \"%s\" %s",
|
||||||
esfilter_class2txt(i), esf->esf_index, st->es_pid,
|
esfilter_class2txt(i), st->es_index, esf->esf_index, st->es_pid,
|
||||||
esf->esf_caid, esf->esf_caprovider, t->s_nicename,
|
esf->esf_caid, esf->esf_caprovider, t->s_nicename,
|
||||||
esfilter_action2txt(esf->esf_action));
|
esfilter_action2txt(esf->esf_action));
|
||||||
switch (esf->esf_action) {
|
switch (esf->esf_action) {
|
||||||
|
@ -464,9 +470,12 @@ ca_ignore:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
sindex++;
|
||||||
|
if (esf->esf_sindex && esf->esf_sindex != sindex)
|
||||||
|
continue;
|
||||||
if (esf->esf_log)
|
if (esf->esf_log)
|
||||||
tvhlog(LOG_INFO, "service", "esfilter: %s %03d %05d %s %s \"%s\" %s",
|
tvhlog(LOG_INFO, "service", "esfilter: %s %03d %03d %05d %s %s \"%s\" %s",
|
||||||
esfilter_class2txt(i), esf->esf_index,
|
esfilter_class2txt(i), st->es_index, esf->esf_index,
|
||||||
st->es_pid, streaming_component_type2txt(st->es_type),
|
st->es_pid, streaming_component_type2txt(st->es_type),
|
||||||
lang_code_get(st->es_lang), t->s_nicename,
|
lang_code_get(st->es_lang), t->s_nicename,
|
||||||
esfilter_action2txt(esf->esf_action));
|
esfilter_action2txt(esf->esf_action));
|
||||||
|
|
Loading…
Add table
Reference in a new issue