From 653f9020d06c69e75a6f58860e3f787a3f802034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Tue, 16 Mar 2010 21:55:10 +0000 Subject: [PATCH] Combine updates to EPG so autorec does not need to scan that much --- src/dvb/dvb_tables.c | 16 +++++++---- src/epg.c | 67 ++++++++++++++++++++++++-------------------- src/epg.h | 34 +++++++++++++++++----- src/xmltv.c | 15 ++++++++-- 4 files changed, 85 insertions(+), 47 deletions(-) diff --git a/src/dvb/dvb_tables.c b/src/dvb/dvb_tables.c index 86cd055c..00aa6865 100644 --- a/src/dvb/dvb_tables.c +++ b/src/dvb/dvb_tables.c @@ -573,6 +573,7 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, ptr += dllen; continue; } + int changed = 0; ect = NULL; *title = 0; @@ -591,8 +592,8 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, if(!dvb_desc_short_event(ptr, dlen, title, sizeof(title), desc, sizeof(desc))) { - epg_event_set_title(e, title); - epg_event_set_desc(e, desc); + changed |= epg_event_set_title(e, title); + changed |= epg_event_set_desc(e, desc); } break; @@ -600,7 +601,7 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, if(dlen >= 2) { /* We only support one content type per event atm. */ ect = epg_content_type_find_by_dvbcode(*ptr); - epg_event_set_content_type(e, ect); + changed |= epg_event_set_content_type(e, ect); } break; case DVB_DESC_EXT_EVENT: @@ -616,11 +617,11 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, //int desc_last = (ptr[0] & 0x0F); if (strlen(extdesc)) - epg_event_set_ext_desc(e, desc_number, extdesc); + changed |= epg_event_set_ext_desc(e, desc_number, extdesc); if (strlen(extitem)) - epg_event_set_ext_item(e, desc_number, extitem); + changed |= epg_event_set_ext_item(e, desc_number, extitem); if (strlen(exttext)) - epg_event_set_ext_text(e, desc_number, exttext); + changed |= epg_event_set_ext_text(e, desc_number, exttext); } break; default: @@ -629,6 +630,9 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len, len -= dlen; ptr += dlen; dllen -= dlen; } + + if(changed) + epg_event_updated(e); } return 0; } diff --git a/src/epg.c b/src/epg.c index fbe5b688..f51691ed 100644 --- a/src/epg.c +++ b/src/epg.c @@ -108,8 +108,8 @@ epg_ch_check_current_event(void *aux) /** * */ -static void -epg_event_changed(event_t *e) +void +epg_event_updated(event_t *e) { dvr_autorec_check_event(e); } @@ -118,21 +118,21 @@ epg_event_changed(event_t *e) /** * */ -void +int epg_event_set_title(event_t *e, const char *title) { if(e->e_title != NULL && !strcmp(e->e_title, title)) - return; + return 0; free(e->e_title); e->e_title = strdup(title); - epg_event_changed(e); + return 1; } /** * */ -void +int epg_event_set_desc(event_t *e, const char *desc) { if(e->e_desc != NULL && strlen(e->e_desc) >= strlen(desc)) { @@ -141,48 +141,48 @@ epg_event_set_desc(event_t *e, const char *desc) * so we just bail out. * Typically happens when the XMLTV and DVB EPG feed differs. */ - return; + return 0; } free(e->e_desc); e->e_desc = strdup(desc); - epg_event_changed(e); + return 1; } /** * */ -void epg_event_set_ext_desc(event_t *e, int ext_dn, const char *desc) +int +epg_event_set_ext_desc(event_t *e, int ext_dn, const char *desc) { if(e->e_ext_desc == NULL && ext_dn != 0) - return; + return 0; if(e->e_ext_desc != NULL && strstr(e->e_ext_desc, desc)) - return; + return 0; int len = strlen(desc) + ( e->e_ext_desc ? strlen(e->e_ext_desc) : 0) + 1; char *tmp = (char*)malloc(len); - if(e->e_ext_desc) - { + if(e->e_ext_desc) { strcpy(tmp, e->e_ext_desc); strcat(tmp, desc); free(e->e_ext_desc); - } - else + } else strcpy(tmp, desc); e->e_ext_desc = tmp; - epg_event_changed(e); + return 1; } /** * */ -void epg_event_set_ext_item(event_t *e, int ext_dn, const char *item) +int +epg_event_set_ext_item(event_t *e, int ext_dn, const char *item) { if(e->e_ext_item == NULL && ext_dn != 0) - return; + return 0; if(e->e_ext_item != NULL && strstr(e->e_ext_item, item)) - return; + return 0; int len = strlen(item) + ( e->e_ext_item ? strlen(e->e_ext_item) : 0) + 1; char *tmp = (char*)malloc(len); @@ -195,18 +195,19 @@ void epg_event_set_ext_item(event_t *e, int ext_dn, const char *item) strcpy(tmp, item); e->e_ext_item = tmp; - epg_event_changed(e); + return 1; } /** * */ -void epg_event_set_ext_text(event_t *e, int ext_dn, const char *text) +int +epg_event_set_ext_text(event_t *e, int ext_dn, const char *text) { if(e->e_ext_text == NULL && ext_dn != 0) - return; + return 0; if(e->e_ext_text != NULL && strstr(e->e_ext_text, text)) - return; + return 0; int len = strlen(text) + ( e->e_ext_text ? strlen(e->e_ext_text) : 0) + 1; char *tmp = (char*)malloc(len); @@ -219,17 +220,17 @@ void epg_event_set_ext_text(event_t *e, int ext_dn, const char *text) strcpy(tmp, text); e->e_ext_text = tmp; - epg_event_changed(e); + return 1; } /** * */ -void +int epg_event_set_content_type(event_t *e, epg_content_type_t *ect) { if(e->e_content_type == ect) - return; + return 0; if(e->e_content_type != NULL) LIST_REMOVE(e, e_content_type_link); @@ -237,22 +238,28 @@ epg_event_set_content_type(event_t *e, epg_content_type_t *ect) e->e_content_type = ect; if(ect != NULL) LIST_INSERT_HEAD(&ect->ect_events, e, e_content_type_link); - - epg_event_changed(e); + return 1; } /** * */ -void +int epg_event_set_episode(event_t *e, epg_episode_t *ee) { + if(e->e_episode.ee_season == ee->ee_season && + e->e_episode.ee_episode == ee->ee_episode && + e->e_episode.ee_part == ee->ee_part && + !strcmp(e->e_episode.ee_onscreen ?: "", ee->ee_onscreen ?: "")) + return 0; + e->e_episode.ee_season = ee->ee_season; e->e_episode.ee_episode = ee->ee_episode; e->e_episode.ee_part = ee->ee_part; tvh_str_set(&e->e_episode.ee_onscreen, ee->ee_onscreen); + return 1; } @@ -362,7 +369,6 @@ epg_event_create(channel_t *ch, time_t start, time_t stop, int dvb_id, e->e_refcount = 1; e->e_channel = ch; - epg_event_changed(e); if(e == RB_FIRST(&ch->ch_epg_events)) { /* First in temporal order, arm expiration timer */ @@ -391,7 +397,6 @@ epg_event_create(channel_t *ch, time_t start, time_t stop, int dvb_id, printf(" New %s", ctime(&stop)); #endif e->e_stop = stop; - epg_event_changed(e); if(e == ch->ch_epg_current) { gtimer_arm_abs(&ch->ch_epg_timer_current, epg_ch_check_current_event, diff --git a/src/epg.h b/src/epg.h index e87de220..d07cf1fb 100644 --- a/src/epg.h +++ b/src/epg.h @@ -87,19 +87,39 @@ typedef struct event { */ void epg_init(void); -void epg_event_set_title(event_t *e, const char *title); +/** + * All the epg_event_set_ function return 1 if it actually changed + * the EPG records. otherwise it returns 0. + * + * If the caller detects that something has changed, it should call + * epg_event_updated(). + * + * There reason to put the burden on the caller is that the caller + * can combine multiple set()'s into one update + * + */ +int epg_event_set_title(event_t *e, const char *title) + __attribute__ ((warn_unused_result)); -void epg_event_set_desc(event_t *e, const char *desc); +int epg_event_set_desc(event_t *e, const char *desc) + __attribute__ ((warn_unused_result)); -void epg_event_set_ext_desc(event_t *e, int ext_dn, const char *desc); +int epg_event_set_ext_desc(event_t *e, int ext_dn, const char *desc) + __attribute__ ((warn_unused_result)); -void epg_event_set_ext_item(event_t *e, int ext_dn, const char *item); +int epg_event_set_ext_item(event_t *e, int ext_dn, const char *item) + __attribute__ ((warn_unused_result)); -void epg_event_set_ext_text(event_t *e, int ext_dn, const char *text); +int epg_event_set_ext_text(event_t *e, int ext_dn, const char *text) + __attribute__ ((warn_unused_result)); -void epg_event_set_content_type(event_t *e, epg_content_type_t *ect); +int epg_event_set_content_type(event_t *e, epg_content_type_t *ect) + __attribute__ ((warn_unused_result)); -void epg_event_set_episode(event_t *e, epg_episode_t *ee); +int epg_event_set_episode(event_t *e, epg_episode_t *ee) + __attribute__ ((warn_unused_result)); + +void epg_event_updated(event_t *e); event_t *epg_event_create(channel_t *ch, time_t start, time_t stop, int dvb_id, int *created); diff --git a/src/xmltv.c b/src/xmltv.c index 8825e0fb..1b3cad15 100644 --- a/src/xmltv.c +++ b/src/xmltv.c @@ -494,9 +494,18 @@ xmltv_parse_programme_tags(xmltv_channel_t *xc, htsmsg_t *tags, if(created) ps->ps_events_created++; - if(title != NULL) epg_event_set_title(e, title); - if(desc != NULL) epg_event_set_desc(e, desc); - epg_event_set_episode(e, &episode); + int changed = 0; + + if(title != NULL) + changed |= epg_event_set_title(e, title); + + if(desc != NULL) + changed |= epg_event_set_desc(e, desc); + + changed |= epg_event_set_episode(e, &episode); + + if(changed) + epg_event_updated(e); } free(episode.ee_onscreen);