From cedd06468dbcdf3e53a448788a077c437b4c835d Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Sun, 3 Feb 2013 13:50:46 +0000 Subject: [PATCH] dvb: ensure that we only create radio/tv services from SDT --- src/dvb/dvb_tables.c | 13 +++++++------ src/service.c | 38 ++++++++++++++++++++++++-------------- src/service.h | 4 ++++ 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/dvb/dvb_tables.c b/src/dvb/dvb_tables.c index f3ddb560..186af745 100644 --- a/src/dvb/dvb_tables.c +++ b/src/dvb/dvb_tables.c @@ -387,12 +387,6 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, if(dllen > len) break; - if (!(t = dvb_service_find(tdmi, service_id, 0, NULL))) { - len -= dllen; - ptr += dllen; - continue; - } - stype = 0; chname = NULL; *crid = 0; @@ -436,7 +430,14 @@ dvb_sdt_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, } len -= dlen; ptr += dlen; dllen -= dlen; } + + if (!servicetype_is_tv(stype) && + !servicetype_is_radio(stype)) + continue; + if (!(t = dvb_service_find(tdmi, service_id, 0, NULL))) + continue; + if(t->s_servicetype != stype || t->s_scrambled != free_ca_mode) { t->s_servicetype = stype; diff --git a/src/service.c b/src/service.c index a22eec77..2bf84aa2 100644 --- a/src/service.c +++ b/src/service.c @@ -777,30 +777,40 @@ service_servicetype_txt(service_t *t) * */ int -service_is_tv(service_t *t) +servicetype_is_tv(int servicetype) { return - t->s_servicetype == ST_SDTV || - t->s_servicetype == ST_HDTV || - t->s_servicetype == ST_EX_HDTV || - t->s_servicetype == ST_EX_SDTV || - t->s_servicetype == ST_EP_HDTV || - t->s_servicetype == ST_ET_HDTV || - t->s_servicetype == ST_DN_SDTV || - t->s_servicetype == ST_DN_HDTV || - t->s_servicetype == ST_SK_SDTV || - t->s_servicetype == ST_NE_SDTV || - t->s_servicetype == ST_AC_SDTV || - t->s_servicetype == ST_AC_HDTV; + servicetype == ST_SDTV || + servicetype == ST_HDTV || + servicetype == ST_EX_HDTV || + servicetype == ST_EX_SDTV || + servicetype == ST_EP_HDTV || + servicetype == ST_ET_HDTV || + servicetype == ST_DN_SDTV || + servicetype == ST_DN_HDTV || + servicetype == ST_SK_SDTV || + servicetype == ST_NE_SDTV || + servicetype == ST_AC_SDTV || + servicetype == ST_AC_HDTV; +} +int +service_is_tv(service_t *t) +{ + return servicetype_is_tv(t->s_servicetype); } /** * */ int +servicetype_is_radio(int servicetype) +{ + return servicetype == ST_RADIO; +} +int service_is_radio(service_t *t) { - return t->s_servicetype == ST_RADIO; + return servicetype_is_radio(t->s_servicetype); } /** diff --git a/src/service.h b/src/service.h index 05321cde..d2f8b03b 100644 --- a/src/service.h +++ b/src/service.h @@ -551,6 +551,10 @@ int service_is_tv(service_t *t); int service_is_radio(service_t *t); +int servicetype_is_tv(int st); + +int servicetype_is_radio(int st); + void service_destroy(service_t *t); void service_remove_subscriber(service_t *t, struct th_subscription *s,