subparse: Calcurate buffer pts using timestamp map for HLS webvtt
authorGilbok Lee <gilbok.lee@samsung.com>
Wed, 24 Nov 2021 10:28:03 +0000 (19:28 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Wed, 24 Nov 2021 10:49:28 +0000 (19:49 +0900)
- parsing error occurs due to out of segment

Change-Id: Ib7945d1d3e64ed2568df94c77436444117fb9ea5

gst/subparse/gstsubparse.c
gst/subparse/gstsubparse.h
packaging/gst-plugins-base.spec

index 3668d5d..38b1d2c 100644 (file)
@@ -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) {
index 59f6d75..893f16e 100644 (file)
@@ -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;
 
index ef82c51..a97d604 100644 (file)
@@ -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/