]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
detect commercials on swedish TV4 and skip them while recording
authorJohn Törnblom <john.tornblom@gmail.com>
Sun, 6 Jan 2013 21:31:08 +0000 (22:31 +0100)
committerJohn Törnblom <john.tornblom@gmail.com>
Mon, 7 Jan 2013 10:49:37 +0000 (11:49 +0100)
src/dvr/dvr_rec.c
src/plumbing/tsfix.c
src/plumbing/tsfix.h

index 092b8762ba56bfe552ed764ce1f500eaa3163561..0efe1223ed82cc4e8dc9a74811f045556901bc45 100755 (executable)
@@ -400,6 +400,7 @@ dvr_thread(void *aux)
   dvr_entry_t *de = aux;
   streaming_queue_t *sq = &de->de_sq;
   streaming_message_t *sm;
+  th_pkt_t *pkt;
   int run = 1;
   int started = 0;
 
@@ -417,8 +418,25 @@ dvr_thread(void *aux)
     pthread_mutex_unlock(&sq->sq_mutex);
 
     switch(sm->sm_type) {
-    case SMT_MPEGTS:
+
     case SMT_PACKET:
+       pkt = sm->sm_data;
+       if(pkt->pkt_commercial == COMMERCIAL_YES) {
+         dvr_rec_set_state(de, DVR_RS_COMMERCIAL, 0);
+         tsfix_set_comm_skip(de->de_tsfix, 1);
+         break;
+       }
+
+       dvr_rec_set_state(de, DVR_RS_RUNNING, 0);
+       tsfix_set_comm_skip(de->de_tsfix, 0);
+
+       if(started) {
+         muxer_write_pkt(de->de_mux, sm->sm_type, sm->sm_data);
+         sm->sm_data = NULL;
+       }
+       break;
+
+    case SMT_MPEGTS:
       if(started) {
        dvr_rec_set_state(de, DVR_RS_RUNNING, 0);
        muxer_write_pkt(de->de_mux, sm->sm_type, sm->sm_data);
index 5fb1febf8e36b86be90ca197fe0b3b59381f8d9c..4fea875173823c35e8bce65a71e6f9a27fd36514 100644 (file)
@@ -40,6 +40,7 @@ typedef struct tfstream {
   int64_t tfs_dts_epoch;
 
   int64_t tfs_last_dts_in;
+  int64_t tfs_drops;
 
 } tfstream_t;
 
@@ -56,6 +57,7 @@ typedef struct tsfix {
   int tf_hasvideo;
   int64_t tf_tsref;
   time_t tf_start_time;
+  int tf_comm_skip;
 
   struct th_pktref_queue tf_ptsq;
 
@@ -160,6 +162,9 @@ normalize_ts(tsfix_t *tf, tfstream_t *tfs, th_pkt_t *pkt)
   /* Subtract the transport wide start offset */
   dts = pkt->pkt_dts - tf->tf_tsref;
 
+  /* Subtract dropped packets due to commercial breaks */
+  dts -= tfs->tfs_drops;
+
   if(tfs->tfs_last_dts_norm == PTS_UNSET) {
     if(dts < 0) {
       /* Early packet with negative time stamp, drop those */
@@ -322,11 +327,11 @@ tsfix_input_packet(tsfix_t *tf, streaming_message_t *sm)
       tsfixprintf("reference clock set to %"PRId64"\n", tf->tf_tsref);
   }
 
-  if(pkt->pkt_dts == PTS_UNSET) {
-
-    int pdur = pkt->pkt_duration >> pkt->pkt_field;
+  int pdur = pkt->pkt_duration >> pkt->pkt_field;
 
+  if(pkt->pkt_dts == PTS_UNSET) {
     if(tfs->tfs_last_dts_in == PTS_UNSET) {
+      tfs->tfs_drops += pdur;
       pkt_ref_dec(pkt);
       return;
     }
@@ -337,6 +342,13 @@ tsfix_input_packet(tsfix_t *tf, streaming_message_t *sm)
                streaming_component_type2txt(tfs->tfs_type),
                tfs->tfs_last_dts_in, pdur, pkt->pkt_dts);
   }
+
+  if(tf->tf_comm_skip && pkt->pkt_commercial == COMMERCIAL_YES) {
+    tfs->tfs_drops += pdur;
+    pkt_ref_dec(pkt);
+    return;
+  }
+
   tfs->tfs_last_dts_in = pkt->pkt_dts;
 
   compute_pts(tf, tfs, pkt);
@@ -404,6 +416,17 @@ void tsfix_set_start_time(streaming_target_t *pad, time_t start)
 }
 
 
+/**
+ *
+ */
+void
+tsfix_set_comm_skip(streaming_target_t *pad, int bool) {
+  tsfix_t *tf = (tsfix_t *)pad;
+
+  tf->tf_comm_skip = !!bool;
+}
+
+
 /**
  *
  */
index 156284fe8a799c9d7f03f5c9bdd067918b58f425..210bc88cd67c6754ccaeea4234cc61c623d4d385 100644 (file)
@@ -25,6 +25,8 @@ streaming_target_t *tsfix_create(streaming_target_t *output);
 
 void tsfix_set_start_time(streaming_target_t *pad, time_t start);
 
+void tsfix_set_comm_skip(streaming_target_t *pad, int bool);
+
 void tsfix_destroy(streaming_target_t *gh);