]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
For matroska we need a few pieces of info for each stream (sample rate, # channels...
authorAndreas Öman <andreas@lonelycoder.com>
Thu, 19 Aug 2010 18:58:02 +0000 (18:58 +0000)
committerAndreas Öman <andreas@lonelycoder.com>
Thu, 19 Aug 2010 18:58:02 +0000 (18:58 +0000)
If we are unable to extract this data from an elementary stream for 5 seconds, skip the stream in recorded file.

Hopefully fixes ticket #261 and #244

src/dvr/dvr_rec.c
src/dvr/mkmux.c
src/plumbing/globalheaders.c
src/streaming.h

index ec777996ae0090fab2bc7ec8f59f0f3ee0b07ec4..71167d957202a243d764d2d54272c494d1aae9ed 100644 (file)
@@ -362,13 +362,14 @@ dvr_rec_start(dvr_entry_t *de, const streaming_start_t *ss)
     }
 
     tvhlog(LOG_INFO, "dvr",
-          "%2d %-20s %-4s %-16s %-10s %-10s",
+          "%2d %-20s %-4s %-16s %-10s %-10s %s",
           ssc->ssc_index,
           streaming_component_type2txt(ssc->ssc_type),
           ssc->ssc_lang,
           res,
           sr,
-          ch);
+          ch,
+          ssc->ssc_disabled ? "<disabled, no valid input>" : "");
   }
 }
 
index 3fa77df9be29b7c0c48d040ce974709587a0e5c7..25bebde49012bc4a80235ba09dbeaa08a8e5723d 100644 (file)
@@ -45,6 +45,7 @@ typedef struct mk_track {
   int merge;
   int type;
   int tracknum;
+  int disabled;
   int64_t nextpts;
 } mk_track;
 
@@ -172,6 +173,11 @@ mk_build_tracks(mk_mux_t *mkm, const struct streaming_start *ss)
   for(i = 0; i < ss->ss_num_components; i++) {
     ssc = &ss->ss_components[i];
 
+    mkm->tracks[i].disabled = ssc->ssc_disabled;
+
+    if(ssc->ssc_disabled)
+      continue;
+
     mkm->tracks[i].index = ssc->ssc_index;
     mkm->tracks[i].type  = ssc->ssc_type;
     mkm->tracks[i].nextpts = PTS_UNSET;
@@ -670,7 +676,7 @@ mk_mux_write_pkt(mk_mux_t *mkm, struct th_pkt *pkt)
     }
   }
   
-  if(t != NULL) {
+  if(t != NULL && !t->disabled) {
     if(t->merge)
       pkt = pkt_merge_header(pkt);
     mk_write_frame_i(mkm, t, pkt);
index e4ac610f21f130d85bc0e6ceaee8a8168577b4b3..c35f8d8d396b5e5893f2ab58a2aa9e985c49b655 100644 (file)
@@ -34,6 +34,8 @@ typedef struct globalheaders {
 
 } globalheaders_t;
 
+#define MAX_SCAN_TIME 5000  // in ms
+
 
 /**
  *
@@ -85,9 +87,7 @@ apply_header(streaming_start_component_t *ssc, th_pkt_t *pkt)
       pktbuf_ref_inc(ssc->ssc_gh);
     }
     break;
-
   }
-
 }
 
 
@@ -95,7 +95,29 @@ apply_header(streaming_start_component_t *ssc, th_pkt_t *pkt)
  *
  */
 static int
-headers_complete(globalheaders_t *gh)
+header_complete(streaming_start_component_t *ssc)
+{
+  if((SCT_ISAUDIO(ssc->ssc_type) || SCT_ISVIDEO(ssc->ssc_type)) &&
+     ssc->ssc_frameduration == 0)
+    return 0;
+
+  if(SCT_ISAUDIO(ssc->ssc_type) &&
+     (ssc->ssc_sri == 0 || ssc->ssc_channels == 0))
+    return 0;
+  
+  if(ssc->ssc_gh == NULL &&
+     (ssc->ssc_type == SCT_H264 ||
+      ssc->ssc_type == SCT_MPEG2VIDEO ||
+      ssc->ssc_type == SCT_AAC))
+    return 0;
+  return 1;
+}
+
+/**
+ *
+ */
+static int
+headers_complete(globalheaders_t *gh, int64_t qd)
 {
   streaming_start_t *ss = gh->gh_ss;
   streaming_start_component_t *ssc;
@@ -106,19 +128,14 @@ headers_complete(globalheaders_t *gh)
   for(i = 0; i < ss->ss_num_components; i++) {
     ssc = &ss->ss_components[i];
 
-    if((SCT_ISAUDIO(ssc->ssc_type) || SCT_ISVIDEO(ssc->ssc_type)) &&
-       ssc->ssc_frameduration == 0)
-      return 0;
+    if(!header_complete(ssc)) {
 
-    if(SCT_ISAUDIO(ssc->ssc_type) &&
-       (ssc->ssc_sri == 0 || ssc->ssc_channels == 0))
-      return 0;
-  
-    if(ssc->ssc_gh == NULL &&
-       (ssc->ssc_type == SCT_H264 ||
-       ssc->ssc_type == SCT_MPEG2VIDEO ||
-       ssc->ssc_type == SCT_AAC))
-      return 0;
+      if(qd > (MAX_SCAN_TIME * 90)) {
+       ssc->ssc_disabled = 1;
+      } else {
+       return 0;
+      }
+    }
   }
 
   return 1;
@@ -142,6 +159,19 @@ convertpkt(streaming_start_component_t *ssc, th_pkt_t *pkt)
 }
 
 
+/**
+ *
+ */
+static int64_t 
+gh_queue_delay(globalheaders_t *gh)
+{
+  th_pktref_t *f = TAILQ_FIRST(&gh->gh_holdq);
+  th_pktref_t *l = TAILQ_LAST(&gh->gh_holdq, th_pktref_queue);
+
+  return l->pr_pkt->pkt_dts - f->pr_pkt->pkt_dts;
+}
+
+
 /**
  *
  */
@@ -168,7 +198,7 @@ gh_hold(globalheaders_t *gh, streaming_message_t *sm)
 
     free(sm);
 
-    if(!headers_complete(gh)) 
+    if(!headers_complete(gh, gh_queue_delay(gh))) 
       break;
 
     // Send our modified start
index 783b228a568c45cffef56d69287d03a553d34238..ac878e17242b1248dd1f61148981a17a5f4c7d8a 100644 (file)
@@ -35,6 +35,7 @@ typedef struct streaming_start_component {
   int16_t ssc_height;
   uint8_t ssc_sri;
   uint8_t ssc_channels;
+  uint8_t ssc_disabled;
 
   pktbuf_t *ssc_gh;