From 080b34a47868b466869990b5ee33ccc6676a08c7 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Wed, 24 Nov 2021 19:28:03 +0900 Subject: [PATCH] subparse: Calcurate buffer pts using timestamp map for HLS webvtt - parsing error occurs due to out of segment Change-Id: Ib7945d1d3e64ed2568df94c77436444117fb9ea5 --- gst/subparse/gstsubparse.c | 41 +++++++++++++++++++---------------------- gst/subparse/gstsubparse.h | 3 ++- packaging/gst-plugins-base.spec | 2 +- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/gst/subparse/gstsubparse.c b/gst/subparse/gstsubparse.c index 3668d5d..38b1d2c 100644 --- a/gst/subparse/gstsubparse.c +++ b/gst/subparse/gstsubparse.c @@ -65,6 +65,9 @@ enum PROP_EXTSUB_CURRENT_LANGUAGE #endif }; +#ifdef TIZEN_FEATURE_HLS_WEBVTT +#define MPEGTIME_TO_GSTTIME(t) ((t) * (guint64)100000 / 9) +#endif static void gst_sub_parse_set_property (GObject * object, guint prop_id, @@ -1109,36 +1112,29 @@ parse_webvtt_cue_settings (ParserState * state, const gchar * settings) #ifdef TIZEN_FEATURE_HLS_WEBVTT static void -send_timestamp_map_event (GstSubParse * self) +parse_timestamp_map (ParserState * state, const gchar * timestamp_map) { GstClockTime local = 0; guint64 mpegts = 0; - GstEvent *event = NULL; gchar *local_start = NULL; gchar *mpegts_start = NULL; - if (!self->state.timestamp_map) + if (!timestamp_map) return; - local_start = g_strrstr (self->state.timestamp_map, "LOCAL:"); + local_start = g_strrstr (timestamp_map, "LOCAL:"); if (local_start) parse_subrip_time (local_start + strlen ("LOCAL:"), &local); - mpegts_start = g_strrstr (self->state.timestamp_map, "MPEGTS:"); + mpegts_start = g_strrstr (timestamp_map, "MPEGTS:"); if (mpegts_start) mpegts = g_ascii_strtoull (mpegts_start + strlen ("MPEGTS:"), NULL, 10); - g_free (self->state.timestamp_map); - self->state.timestamp_map = NULL; - GST_LOG ("parsed local time %" GST_TIME_FORMAT " MPEGTS: %" G_GUINT64_FORMAT, GST_TIME_ARGS (local), mpegts); - event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, - gst_structure_new ("timestamp_map", - "local", G_TYPE_UINT64, local, - "mpegts", G_TYPE_UINT64, mpegts, NULL)); - gst_pad_push_event (self->srcpad, event); + state->local = local; + state->mpegts = mpegts; } static void @@ -1146,10 +1142,10 @@ send_fragment_timestamp_event (GstSubParse * self, GstClockTime timestamp) { GstEvent *event = NULL; - if (!GST_CLOCK_TIME_IS_VALID(timestamp)) + if (!GST_CLOCK_TIME_IS_VALID (timestamp)) return; - GST_LOG ("send fragment_timestamp %" GST_TIME_FORMAT , + GST_LOG ("send fragment_timestamp %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, @@ -1293,13 +1289,15 @@ parse_webvtt (ParserState * state, const gchar * line) state->start_time <= ts_end) { state->state = 2; state->start_time = ts_start; +#ifdef TIZEN_FEATURE_HLS_WEBVTT + state->start_time += MPEGTIME_TO_GSTTIME (state->mpegts) - state->local; +#endif state->duration = ts_end - ts_start; cue_settings = strstr (end_time + strlen (" --> "), " "); #ifdef TIZEN_FEATURE_HLS_WEBVTT } else if (strstr (line, "X-TIMESTAMP-MAP")) { - g_free (state->timestamp_map); - state->timestamp_map = g_strdup (line); GST_DEBUG ("got X-TIMESTAMP-MAP '%s'", line); + parse_timestamp_map (state, line); state->state = 0; #endif } else { @@ -1548,6 +1546,10 @@ parser_state_init (ParserState * state) state->max_duration = 0; /* no limit */ state->state = 0; state->segment = NULL; +#ifdef TIZEN_FEATURE_HLS_WEBVTT + state->local = 0; + state->mpegts = 0; +#endif #ifdef TIZEN_FEATURE_SUBPARSE_MODIFICATION state->language_list = NULL; @@ -2014,7 +2016,6 @@ handle_buffer (GstSubParse * self, GstBuffer * buf) self->state.fps_n = self->fps_n; self->state.fps_d = self->fps_d; } - #ifdef TIZEN_FEATURE_HLS_WEBVTT if (GST_BUFFER_IS_DISCONT (buf) && GST_BUFFER_PTS_IS_VALID (buf)) fragment_timestamp = GST_BUFFER_PTS (buf); @@ -2083,10 +2084,6 @@ handle_buffer (GstSubParse * self, GstBuffer * buf) GST_LOG_OBJECT (self, "State %d. Parsing line '%s'", self->state.state, line + offset); subtitle = self->parse_line (&self->state, line + offset); -#ifdef TIZEN_FEATURE_HLS_WEBVTT - if (self->parser_type == GST_SUB_PARSE_FORMAT_VTT) - send_timestamp_map_event (self); -#endif g_free (line); #ifdef TIZEN_FEATURE_SUBPARSE_MODIFICATION if (!self->state.langlist_msg_posted && self->state.language_list) { diff --git a/gst/subparse/gstsubparse.h b/gst/subparse/gstsubparse.h index 59f6d75..893f16e 100644 --- a/gst/subparse/gstsubparse.h +++ b/gst/subparse/gstsubparse.h @@ -84,7 +84,8 @@ typedef struct { gboolean langlist_msg_posted; #endif #ifdef TIZEN_FEATURE_HLS_WEBVTT - gchar* timestamp_map; + guint64 local; + guint64 mpegts; #endif } ParserState; diff --git a/packaging/gst-plugins-base.spec b/packaging/gst-plugins-base.spec index ef82c51..a97d604 100644 --- a/packaging/gst-plugins-base.spec +++ b/packaging/gst-plugins-base.spec @@ -5,7 +5,7 @@ Name: gst-plugins-base Version: 1.16.2 -Release: 21 +Release: 22 License: LGPL-2.0+ Summary: GStreamer Streaming-Media Framework Plug-Ins Url: http://gstreamer.freedesktop.org/ -- 2.7.4