amldemux: CB1 support-hls-discontinuity [1/1]

PD#SWPL-101568

Problem:
support hls discontinuity

Solution:
00036-SWPL-101568-support-hls-discontinuity.patch

Verify:
AH212

Signed-off-by: zengliang.li <zengliang.li@amlogic.com>
Change-Id: I7e737392b6d2091286bca8582c5e652aa2b0acfc
diff --git a/aml-qtdemux/qtdemux.c b/aml-qtdemux/qtdemux.c
index 62a4719..80fa798 100644
--- a/aml-qtdemux/qtdemux.c
+++ b/aml-qtdemux/qtdemux.c
@@ -450,6 +450,8 @@
   GST_OBJECT_FLAG_SET (qtdemux, GST_ELEMENT_FLAG_INDEXABLE);
 
   gst_qtdemux_reset (qtdemux, TRUE);
+  qtdemux->cal_discontinuity_pos = FALSE;
+  qtdemux->discontinuity_base_pos = 0;
 }
 
 static void
@@ -2377,6 +2379,19 @@
 
       goto drop;
     }
+    case GST_EVENT_CUSTOM_DOWNSTREAM_STICKY:
+    {
+      if (gst_event_has_name(event, "AML-DISCONTINUITY-BASE-POS"))
+      {
+        GST_DEBUG_OBJECT (demux, "Handle event AML-DISCONTINUITY-BASE-POS");
+        demux->cal_discontinuity_pos = TRUE;
+
+        res = TRUE;
+        gst_event_unref(event);
+        goto drop;
+      }
+      break;
+    }
     default:
       break;
   }
@@ -5878,12 +5893,18 @@
     GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DISCONT);
   }
 
+  if (qtdemux->discontinuity_base_pos != 0 && GST_BUFFER_PTS (buf) < qtdemux->discontinuity_base_pos)
+  {
+    GST_BUFFER_PTS (buf) = GST_BUFFER_PTS (buf) + qtdemux->discontinuity_base_pos;
+    GST_BUFFER_DTS (buf) = GST_BUFFER_DTS (buf) + qtdemux->discontinuity_base_pos;
+  }
+
   GST_LOG_OBJECT (qtdemux,
       "Pushing buffer with dts %" GST_TIME_FORMAT ", pts %" GST_TIME_FORMAT
-      ", duration %" GST_TIME_FORMAT " on pad %s",
+      ", duration %" GST_TIME_FORMAT " on pad %s" ", discontinuity_base_pos %" GST_TIME_FORMAT,
       GST_TIME_ARGS (GST_BUFFER_DTS (buf)),
       GST_TIME_ARGS (GST_BUFFER_PTS (buf)),
-      GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_PAD_NAME (stream->pad));
+      GST_TIME_ARGS (GST_BUFFER_DURATION (buf)), GST_PAD_NAME (stream->pad), GST_TIME_ARGS (qtdemux->discontinuity_base_pos));
 
   if (stream->protected && stream->protection_scheme_type == FOURCC_aavd) {
     GstStructure *crypto_info;
@@ -7321,6 +7342,11 @@
                 || prev_offset > demux->fragment_start_offset) {
               demux->fragment_start_offset = prev_offset;
               demux->fragment_start = prev_pts;
+              if (demux->cal_discontinuity_pos)
+              {
+                demux->discontinuity_base_pos = demux->fragment_start;
+              }
+
               GST_DEBUG_OBJECT (demux,
                   "New fragment start found at: %" G_GUINT64_FORMAT " : %"
                   GST_TIME_FORMAT, demux->fragment_start_offset,
diff --git a/aml-qtdemux/qtdemux.h b/aml-qtdemux/qtdemux.h
index 02df262..0dab898 100644
--- a/aml-qtdemux/qtdemux.h
+++ b/aml-qtdemux/qtdemux.h
@@ -139,6 +139,9 @@
   /* configured playback region */
   GstSegment segment;
 
+  gboolean cal_discontinuity_pos;
+  GstClockTime discontinuity_base_pos;
+
   /* State for key_units trickmode */
   GstClockTime trickmode_interval;