]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
DVR: use reference clock from VIDEO (or AUDIO) streams only, fixes #3296
authorJaroslav Kysela <perex@perex.cz>
Tue, 24 Nov 2015 11:03:57 +0000 (12:03 +0100)
committerJaroslav Kysela <perex@perex.cz>
Tue, 24 Nov 2015 11:03:57 +0000 (12:03 +0100)
src/dvr/dvr_rec.c

index 529d3b56d0804cb337474f1cb24371697bd43b81..3ba5278aa365540469e0f85255a01fe9d3656b63 100644 (file)
@@ -1169,6 +1169,30 @@ dts_pts_valid(th_pkt_t *pkt, int64_t dts_offset)
   return 1;
 }
 
+/**
+ *
+ */
+static int64_t
+get_dts_ref(th_pkt_t *pkt, streaming_start_t *ss)
+{
+  const streaming_start_component_t *ssc;
+  int64_t audio = PTS_UNSET;
+  int i;
+
+  if (pkt->pkt_dts == PTS_UNSET)
+    return PTS_UNSET;
+  for (i = 0; i < ss->ss_num_components; i++) {
+    ssc = &ss->ss_components[i];
+    if (ssc->ssc_index == pkt->pkt_componentindex) {
+      if (SCT_ISVIDEO(ssc->ssc_type))
+        return pkt->pkt_dts;
+      if (audio == PTS_UNSET && SCT_ISAUDIO(ssc->ssc_type))
+        audio = pkt->pkt_dts;
+    }
+  }
+  return audio;
+}
+
 /**
  *
  */
@@ -1276,7 +1300,7 @@ dvr_thread(void *aux)
         pkt2 = sm2->sm_data;
         if (pkt2->pkt_dts != PTS_UNSET) {
           if (dts_offset == PTS_UNSET)
-            dts_offset = pkt2->pkt_dts;
+            dts_offset = get_dts_ref(pkt2, ss);
           if (dts_pts_valid(pkt2, dts_offset)) {
             pkt3 = pkt_copy_shallow(pkt2);
             pkt3->pkt_dts -= dts_offset;
@@ -1290,8 +1314,8 @@ dvr_thread(void *aux)
         }
         streaming_msg_free(sm2);
       }
-      if (dts_offset == PTS_UNSET && pkt->pkt_dts != PTS_UNSET)
-        dts_offset = pkt->pkt_dts;
+      if (dts_offset == PTS_UNSET)
+        dts_offset = get_dts_ref(pkt, ss);
       if (dts_pts_valid(pkt, dts_offset)) {
         pkt3 = pkt_copy_shallow(pkt);
         pkt3->pkt_dts -= dts_offset;