]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Add support for commercial break detection using teletext rundown pages
authorAndreas Öman <andreas@lonelycoder.com>
Fri, 10 Aug 2007 08:13:53 +0000 (08:13 +0000)
committerAndreas Öman <andreas@lonelycoder.com>
Fri, 10 Aug 2007 08:13:53 +0000 (08:13 +0000)
Makefile
pvr_rec.c
teletext.c
transports.c

index e2903930f298dc7507b0dcb9f6331d2461869e0d..e59765a394d8ff7ce9eb8be436e56903c0575cc9 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 include ../config.mak
 
-SRCS = main.c dispatch.c channels.c transports.c
+SRCS = main.c dispatch.c channels.c transports.c teletext.c
 
 SRCS += pvr.c pvr_rec.c
 
index a4f9b3b18fb1018aa9f2a8bffb0b4e890fb2f5d7..caca26c934e4a797d81d6e3ebc5736bb263480cd 100644 (file)
--- a/pvr_rec.c
+++ b/pvr_rec.c
@@ -103,8 +103,8 @@ pvr_recorder_thread(void *aux)
   ts_pid_t *tsp;
   void *opaque = NULL;
   th_subscription_t *s;
-  char txt[50];
-
+  char txt[50], txt2[50], *t;
+  
   LIST_INIT(&pids);
   
   pthread_mutex_lock(&pvr_mutex);
@@ -172,8 +172,13 @@ pvr_recorder_thread(void *aux)
     txt[0] = 0;
   }
   
-  syslog(LOG_INFO, "pvr: \"%s\" - Recording started%s",
-        pvrr->pvrr_printname, txt);
+  ctime_r(&pvrr->pvrr_stop, txt2);
+  t = strchr(txt2, '\n');
+  if(t != NULL)
+    *t = 0;
+
+  syslog(LOG_INFO, "pvr: \"%s\" - Recording started%s, ends at %s",
+        pvrr->pvrr_printname, txt, txt2);
 
   pvrr->pvrr_status = HTSTV_PVR_STATUS_PAUSED_WAIT_FOR_START;
   pvr_inform_status_change(pvrr);
@@ -373,12 +378,18 @@ pvr_generate_filename(pvr_rec_t *pvrr)
           config_get_str("pvrdir", "."), chname, out);
 
   while(1) {
-    if(stat(fullname, &st) == -1)
+    if(stat(fullname, &st) == -1) {
+      syslog(LOG_DEBUG, "pvr: File \"%s\" -- %s -- Using for recording",
+            fullname, strerror(errno));
       break;
-    
+    }
+
     tally++;
     snprintf(fullname, sizeof(fullname), "%s/%s-%s-%d",
             config_get_str("pvrdir", "."), chname, out, tally);
+
+    syslog(LOG_DEBUG, "pvr: Testing filename \"%s\"", fullname);
+
   }
 
   pvrr->pvrr_filename = strdup(fullname);
@@ -680,6 +691,7 @@ pwo_writepkt(pvr_rec_t *pvrr, th_subscription_t *s, uint32_t startcode,
             tv_streamtype_t type)
 {
   pwo_ffmpeg_t *pf = pvrr->pvrr_opaque;
+  th_transport_t *th = s->ths_transport;
   uint8_t flags, hlen, x;
   int64_t dts = AV_NOPTS_VALUE, pts = AV_NOPTS_VALUE;
   int r, rlen, i, g, fs;
@@ -826,7 +838,7 @@ pwo_writepkt(pvr_rec_t *pvrr, th_subscription_t *s, uint32_t startcode,
     switch(pvrr->pvrr_status) {
     case HTSTV_PVR_STATUS_PAUSED_WAIT_FOR_START:
     case HTSTV_PVR_STATUS_PAUSED_COMMERCIAL:
-      break;
+      return 0;
       
     case HTSTV_PVR_STATUS_WAIT_KEY_FRAME:
       if(st->codec->codec_type == CODEC_TYPE_VIDEO && 
@@ -836,6 +848,13 @@ pwo_writepkt(pvr_rec_t *pvrr, th_subscription_t *s, uint32_t startcode,
        return 0;
       }
       break;
+
+    case HTSTV_PVR_STATUS_RECORDING:
+      if(th != NULL && th->tht_tt_commercial_advice == COMMERCIAL_YES) {
+       pvrr->pvrr_status = HTSTV_PVR_STATUS_PAUSED_COMMERCIAL;
+       return 0;
+      }
+
     default:
       break;
     }
index baad8d4d9c2cfa89eadb7ddcf6d91493f9c1fd35..003447af006adc16bcf7dd2f5bba9a843631ea9b 100644 (file)
@@ -31,9 +31,9 @@
 
 #include "tvhead.h"
 #include "teletext.h"
-#include "client.h"
 
-static void teletext_rundown(th_transport_t *t, tt_page_t *ttp);
+static void teletext_rundown(th_transport_t *t, th_channel_t *ch, 
+                            tt_page_t *ttp);
 
 #define bitreverse(b) \
 (((b) * 0x0202020202ULL & 0x010884422010ULL) % 1023)
@@ -181,7 +181,7 @@ tt_decode_line(th_transport_t *t, uint8_t *buf)
   int page, magidx, i;
   tt_mag_t *mag;
   th_channel_t *ch = t->tht_channel;
-  tt_decoder_t *ttd = &ch->thc_tt;
+  tt_decoder_t *ttd = &ch->ch_tt;
   tt_page_t *ttp;
 
   mpag = ham_decode(buf[0], buf[1]);
@@ -223,9 +223,9 @@ tt_decode_line(th_transport_t *t, uint8_t *buf)
     }
 
     if(update_tt_clock(t, (char *)buf + 34)) {
-      if(ch->thc_teletext_rundown != 0) {
-       ttp = tt_get_page(ttd, ch->thc_teletext_rundown);
-       teletext_rundown(t, ttp);
+      if(ch->ch_teletext_rundown != 0) {
+       ttp = tt_get_page(ttd, ch->ch_teletext_rundown);
+       teletext_rundown(t, ch, ttp);
       }
     }
 
@@ -255,8 +255,8 @@ tt_decode_line(th_transport_t *t, uint8_t *buf)
       break;
     }
 
-    if(ttp->ttp_page == ch->thc_teletext_rundown)
-      teletext_rundown(t, ttp);
+    if(ttp->ttp_page == ch->ch_teletext_rundown)
+      teletext_rundown(t, ch, ttp);
   }
 }
 
@@ -308,17 +308,23 @@ tt_time_to_len(const char *buf)
   return l;
 }
 
+/*
+ * Decode the Swedish TV4 teletext rundown page to figure out if we are 
+ * currently in a commercial break
+ */
 
 static void
-teletext_rundown(th_transport_t *t, tt_page_t *ttp)
+teletext_rundown(th_transport_t *t, th_channel_t *ch, tt_page_t *ttp)
 {
   char r[50];
   int i;
   time_t ti, d, l;
   int curlen = -1;
+  th_commercial_advice_t prev;
+
 #if 0
   printf("%c", 0x0c);
-  printf("%-20s %s", 
+  printf("%-20s %s\n", 
         t->tht_tt_rundown_content_length > 400 ? "real stuff" : "commercial",
         ctime(&t->tht_tt_clock));
 #endif
@@ -337,12 +343,30 @@ teletext_rundown(th_transport_t *t, tt_page_t *ttp)
       /* Currently playing show */
       curlen = l;
     }
-    //    printf("%02d|%s|\t(%5lds) : %ld, %d\n", i, r, l, d, curlen);
+    //  printf("%02d|%s|\t(%5lds) : %ld, %d\n", i, r, l, d, curlen);
   }
 
   t->tht_tt_rundown_content_length = curlen;
+
+  prev = t->tht_tt_commercial_advice;
+
+  if(curlen < 0) {
+    t->tht_tt_commercial_advice = COMMERCIAL_UNKNOWN;
+    return;
+  }
+
   if(curlen < 400)
     t->tht_tt_commercial_advice = COMMERCIAL_YES;
   else
     t->tht_tt_commercial_advice = COMMERCIAL_NO;
+
+  if(prev != t->tht_tt_commercial_advice) {
+
+    syslog(LOG_DEBUG, 
+          "teletext-rundown: \"%s\" on \"%s\": "
+          "%s commercial break (chunk %ds)",
+          ch->ch_name, t->tht_name, 
+          t->tht_tt_commercial_advice == COMMERCIAL_YES ? "In" : "Not in",
+          curlen);
+  }
 }
index e90e33cfc2fcf0639e132968de03d469adef5802..316dfa69f08ca8e9c1d5e4e6647ad1505b765fb8 100644 (file)
@@ -39,7 +39,7 @@
 #include "input_dvb.h"
 #include "input_v4l.h"
 #include "input_iptv.h"
-
+#include "teletext.h"
 #include "transports.h"
 
 /*
@@ -94,6 +94,8 @@ transport_purge(th_transport_t *t)
   default:
     break;
   }
+
+  t->tht_tt_commercial_advice = COMMERCIAL_UNKNOWN;
 }
 
 
@@ -346,7 +348,7 @@ transport_recv_tsb(th_transport_t *t, int pid, uint8_t *tsb)
 
     if(pi->type == HTSTV_TELETEXT) {
       /* teletext */
-      //         teletext_input(t, tsb);
+      teletext_input(t, tsb);
       continue;
     }