]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
dvr: write marks (mkv chapters) for EITp/f, fixes #3993
authorJaroslav Kysela <perex@perex.cz>
Fri, 30 Sep 2016 13:30:51 +0000 (15:30 +0200)
committerJaroslav Kysela <perex@perex.cz>
Fri, 30 Sep 2016 13:33:28 +0000 (15:33 +0200)
src/dvr/dvr.h
src/dvr/dvr_db.c
src/dvr/dvr_rec.c

index de43e00058682621c91411a54b9343818c8f5df5..8f120af46ac5d4c3829eb98db9150d8a2aa2acc3 100644 (file)
@@ -187,6 +187,7 @@ typedef struct dvr_entry {
   time_t de_running_start;
   time_t de_running_stop;
   time_t de_running_pause;
+  int    de_running_change;
 
   char *de_owner;
   char *de_creator;
index 38785c7f92d1811875fff9ffc568a12daf11255e..78524861e606aeb8a83217d7dab7076397380434 100644 (file)
@@ -1883,12 +1883,6 @@ void dvr_event_running(epg_broadcast_t *e, epg_source_t esrc, epg_running_t runn
            channel_get_name(e->channel),
            running);
   LIST_FOREACH(de, &e->channel->ch_dvrs, de_channel_link) {
-    if (!dvr_entry_get_epg_running(de)) {
-      atomic_set_time_t(&de->de_running_start, 0);
-      atomic_set_time_t(&de->de_running_stop, 0);
-      atomic_set_time_t(&de->de_running_pause, 0);
-      continue;
-    }
     if (running == EPG_RUNNING_NOW && de->de_dvb_eid == e->dvb_eid) {
       if (de->de_running_pause) {
         tvhdebug(LS_DVR, "dvr entry %s event %s on %s - EPG unpause",
@@ -1896,6 +1890,7 @@ void dvr_event_running(epg_broadcast_t *e, epg_source_t esrc, epg_running_t runn
                  epg_broadcast_get_title(e, NULL),
                  channel_get_name(e->channel));
         atomic_set_time_t(&de->de_running_pause, 0);
+        atomic_add(&de->de_running_change, 1);
       }
       if (!de->de_running_start) {
         tvhdebug(LS_DVR, "dvr entry %s event %s on %s - EPG marking start",
@@ -1903,9 +1898,11 @@ void dvr_event_running(epg_broadcast_t *e, epg_source_t esrc, epg_running_t runn
                  epg_broadcast_get_title(e, NULL),
                  channel_get_name(e->channel));
         atomic_set_time_t(&de->de_running_start, gclk());
+        atomic_add(&de->de_running_change, 1);
       }
       if (dvr_entry_get_start_time(de, 1) > gclk()) {
         atomic_set_time_t(&de->de_start, gclk());
+        atomic_add(&de->de_running_change, 1);
         dvr_entry_set_timer(de);
         tvhdebug(LS_DVR, "dvr entry %s event %s on %s - EPG start",
                  idnode_uuid_as_str(&de->de_id, ubuf),
@@ -1925,6 +1922,7 @@ void dvr_event_running(epg_broadcast_t *e, epg_source_t esrc, epg_running_t runn
       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) {
+        atomic_add(&de->de_running_change, 1);
         tvhdebug(LS_DVR, "dvr entry %s %s %s on %s - EPG marking stop",
                  idnode_uuid_as_str(&de->de_id, ubuf), srcname,
                  epg_broadcast_get_title(e, NULL),
@@ -1946,6 +1944,7 @@ void dvr_event_running(epg_broadcast_t *e, epg_source_t esrc, epg_running_t runn
                  epg_broadcast_get_title(e, NULL),
                  channel_get_name(e->channel));
         atomic_set_time_t(&de->de_running_pause, gclk());
+        atomic_add(&de->de_running_change, 1);
       }
     }
   }
index b3cd2f2ed48d6f5fcc8c7319798821460d39887c..f21d0ab608210258a9769c4f5b1e798d10dcfdea 100644 (file)
@@ -1319,13 +1319,14 @@ dvr_thread(void *aux)
 
       if (epg_pause != (epg_running == 2)) {
         epg_pause = epg_running == 2;
-       muxer_add_marker(prch->prch_muxer);
+       if (muxing) muxer_add_marker(prch->prch_muxer);
       } else if (commercial != pkt->pkt_commercial) {
-        muxer_add_marker(prch->prch_muxer);
+        commercial = pkt->pkt_commercial;
+        if (muxing) muxer_add_marker(prch->prch_muxer);
+      } else if (atomic_exchange(&de->de_running_change, 0)) {
+        if (muxing) muxer_add_marker(prch->prch_muxer);
       }
 
-      commercial = pkt->pkt_commercial;
-
       if (ss == NULL)
         break;
 
@@ -1389,6 +1390,13 @@ dvr_thread(void *aux)
         break;
       }
 
+      if (epg_pause != (epg_running == 2)) {
+        epg_pause = epg_running == 2;
+       if (muxing) muxer_add_marker(prch->prch_muxer);
+      } else if (atomic_exchange(&de->de_running_change, 0)) {
+        if (muxing) muxer_add_marker(prch->prch_muxer);
+      }
+
       if (muxing == 0 &&
           !dvr_thread_rec_start(&de, ss, &run, &started, &dts_offset, postproc))
         break;