]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
EPG: improve overlap removal (handle grabber priorities)
authorJaroslav Kysela <perex@perex.cz>
Wed, 4 May 2016 13:36:24 +0000 (15:36 +0200)
committerJaroslav Kysela <perex@perex.cz>
Wed, 4 May 2016 13:38:57 +0000 (15:38 +0200)
src/epg.c

index 4689cbd46bac490791807112f4f22231783c6c8c..f3dc7fe529acb0f31dc31992ab033925cee205dc 100644 (file)
--- a/src/epg.c
+++ b/src/epg.c
@@ -186,16 +186,26 @@ static void _epg_object_set_updated ( void *o )
   }
 }
 
-static int _epg_object_set_grabber ( void *o, epggrab_module_t *grab )
+static int _epg_object_can_remove ( void *_old, void *_new )
+{
+  epggrab_module_t *ograb, *ngrab;
+  ngrab = ((epg_object_t *)_new)->grabber;
+  if (ngrab == NULL) return 0;
+  ograb = ((epg_object_t *)_old)->grabber;
+  if (ograb == NULL || ograb == ngrab) return 1;
+  if (ngrab->priority > ograb->priority) return 1;
+  return 0;
+}
+
+static int _epg_object_set_grabber ( void *o, epggrab_module_t *ngrab )
 {
-  epg_object_t *eo = o;
-  if (!grab) return 1; // grab=NULL is override
-  if (!eo->grabber ||
-      ((eo->grabber != grab) && (grab->priority > eo->grabber->priority))) {
-    eo->grabber = grab;
-    return 1;
-  }
-  return grab == eo->grabber;
+  epggrab_module_t *ograb;
+  if (!ngrab) return 1; // grab=NULL is override
+  ograb = ((epg_object_t *)o)->grabber;
+  if (ograb == ngrab) return 1;
+  if (ograb && ograb->priority >= ngrab->priority) return 0;
+  ((epg_object_t *)o)->grabber = ngrab;
+  return 1;
 }
 
 static void _epg_object_create ( void *o )
@@ -1662,6 +1672,11 @@ static epg_broadcast_t *_epg_channel_add_broadcast
   /* Remove overlapping (before) */
   while ((ebc = RB_PREV(ret, sched_link)) != NULL) {
     if (ebc->stop <= ret->start) break;
+    if (!_epg_object_can_remove(ebc, ret)) {
+      tvhtrace("epg", "grabber for event %u has lower priority than overlap (b), removing", ebc->id);
+      _epg_channel_rem_broadcast(ch, ret, NULL);
+      return NULL;
+    }
     tvhtrace("epg", "remove overlap (b) event %u (%s) on %s @ %"PRItime_t " to %"PRItime_t,
              ebc->id, epg_broadcast_get_title(ebc, NULL),
              channel_get_name(ch), ebc->start, ebc->stop);
@@ -1671,6 +1686,11 @@ static epg_broadcast_t *_epg_channel_add_broadcast
   /* Remove overlapping (after) */
   while ((ebc = RB_NEXT(ret, sched_link)) != NULL) {
     if (ebc->start >= ret->stop) break;
+    if (!_epg_object_can_remove(ebc, ret)) {
+      tvhtrace("epg", "grabber for event %u has lower priority than overlap (a), removing", ebc->id);
+      _epg_channel_rem_broadcast(ch, ret, NULL);
+      return NULL;
+    }
     tvhtrace("epg", "remove overlap (a) event %u (%s) on %s @ %"PRItime_t " to %"PRItime_t,
              ebc->id, epg_broadcast_get_title(ebc, NULL),
              channel_get_name(ch), ebc->start, ebc->stop);