From: Jaroslav Kysela Date: Thu, 5 Nov 2015 18:01:17 +0000 (+0100) Subject: DVR/EPG: improve the running check conditions, fixes #3268 X-Git-Tag: v4.2.1~1663 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c266bcec6b811747c5db61663c6842669983405d;p=thirdparty%2Ftvheadend.git DVR/EPG: improve the running check conditions, fixes #3268 --- diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index aca2c547a..a7cdcf3c8 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -1624,12 +1624,13 @@ void dvr_event_running(epg_broadcast_t *e, epg_source_t esrc, int running) continue; } if (running && de->de_dvb_eid == e->dvb_eid) { - if (!de->de_running_start) + if (!de->de_running_start) { tvhdebug("dvr", "dvr entry %s event %s on %s - EPG marking start", idnode_uuid_as_sstr(&de->de_id), epg_broadcast_get_title(e, NULL), channel_get_name(e->channel)); - de->de_running_start = dispatch_clock; + de->de_running_start = dispatch_clock; + } if (dvr_entry_get_start_time(de) > dispatch_clock) { de->de_start = dispatch_clock; dvr_entry_set_timer(de); @@ -1639,6 +1640,14 @@ void dvr_event_running(epg_broadcast_t *e, epg_source_t esrc, int running) channel_get_name(e->channel)); } } else if ((!running && de->de_dvb_eid == e->dvb_eid) || running) { + /* + * make checking more robust + * sometimes, the running bits are parsed randomly for a few moments + * so don't expect that the broacasting has only 5 seconds + */ + if (de->de_running_start + 5 > dispatch_clock) + continue; + srcname = de->de_dvb_eid == e->dvb_eid ? "event" : "other running event"; if (!de->de_running_stop || de->de_running_start > de->de_running_stop) { @@ -1649,14 +1658,12 @@ void dvr_event_running(epg_broadcast_t *e, epg_source_t esrc, int running) } de->de_running_stop = dispatch_clock; if (de->de_sched_state == DVR_RECORDING && de->de_running_start) { - if (dvr_entry_get_stop_time(de) > dispatch_clock) { - de->de_dont_reschedule = 1; - dvr_stop_recording(de, SM_CODE_OK, 0, 0); - tvhdebug("dvr", "dvr entry %s %s %s on %s - EPG stop", + de->de_dont_reschedule = 1; + dvr_stop_recording(de, SM_CODE_OK, 0, 0); + tvhdebug("dvr", "dvr entry %s %s %s on %s - EPG stop", idnode_uuid_as_sstr(&de->de_id), srcname, epg_broadcast_get_title(e, NULL), channel_get_name(de->de_channel)); - } } } } diff --git a/src/epg.c b/src/epg.c index 409f7d09b..0a5f7c3c3 100644 --- a/src/epg.c +++ b/src/epg.c @@ -1689,16 +1689,18 @@ void epg_broadcast_notify_running { channel_t *ch; epg_broadcast_t *now; + int orunning = broadcast->running; broadcast->running = !!running; + ch = broadcast->channel; + now = ch ? ch->ch_epg_now : NULL; if (!running) { - broadcast->stop = dispatch_clock - 1; + if (now == broadcast && orunning == broadcast->running) + broadcast->stop = dispatch_clock - 1; } else { - ch = broadcast->channel; - now = ch ? ch->ch_epg_now : NULL; if (broadcast != now && now) { now->running = 0; - dvr_event_running(ch->ch_epg_now, esrc, 0); + dvr_event_running(now, esrc, 0); } } dvr_event_running(broadcast, esrc, running);