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;