subparse: Send timestamp map custom event for HLS webvtt
authorGilbok Lee <gilbok.lee@samsung.com>
Thu, 24 Jun 2021 23:41:16 +0000 (08:41 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Thu, 1 Jul 2021 07:26:15 +0000 (16:26 +0900)
Change-Id: I19efb35add97820252d4a0cb8bab60f9d58e5002

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

index fd83726..2115da8 100644 (file)
@@ -134,7 +134,6 @@ gst_sub_parse_dispose (GObject * object)
     g_string_free (subparse->textbuf, TRUE);
     subparse->textbuf = NULL;
   }
-
 #ifdef TIZEN_FEATURE_SUBPARSE_MODIFICATION
   g_free (subparse->state.current_language);
   subparse->state.current_language = NULL;
@@ -182,9 +181,9 @@ gst_sub_parse_class_init (GstSubParseClass * klass)
 #ifdef TIZEN_FEATURE_SUBPARSE_MODIFICATION
   g_object_class_install_property (object_class, PROP_EXTSUB_CURRENT_LANGUAGE,
       g_param_spec_string ("current-language", "Current language",
-            "Current language of the subtitle in external subtitle case.",
-            DEFAULT_CURRENT_LANGUAGE,
-            G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          "Current language of the subtitle in external subtitle case.",
+          DEFAULT_CURRENT_LANGUAGE,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 #endif
 }
 
@@ -402,11 +401,11 @@ gst_sub_parse_set_property (GObject * object, guint prop_id,
     }
 #ifdef TIZEN_FEATURE_SUBPARSE_MODIFICATION
     case PROP_EXTSUB_CURRENT_LANGUAGE:
-      g_free(subparse->state.current_language);
+      g_free (subparse->state.current_language);
       subparse->state.current_language = g_value_dup_string (value);
       GST_LOG_OBJECT (subparse, "subtitle current language set to %s",
-                      GST_STR_NULL (subparse->state.current_language));
-      sami_context_change_language(&subparse->state);
+          GST_STR_NULL (subparse->state.current_language));
+      sami_context_change_language (&subparse->state);
       break;
 #endif
     default:
@@ -1091,6 +1090,41 @@ parse_webvtt_cue_settings (ParserState * state, const gchar * settings)
   }
 }
 
+#ifdef TIZEN_FEATURE_HLS_WEBVTT
+static void
+send_timestamp_map_event (GstSubParse * self)
+{
+  GstClockTime local = 0;
+  guint64 mpegts = 0;
+  GstEvent *event = NULL;
+  gchar *local_start = NULL;
+  gchar *mpegts_start = NULL;
+
+  if (!self->state.timestamp_map)
+    return;
+
+  local_start = g_strrstr (self->state.timestamp_map, "LOCAL:");
+  if (local_start)
+    parse_subrip_time (local_start + strlen ("LOCAL:"), &local);
+
+  mpegts_start = g_strrstr (self->state.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);
+}
+#endif
+
 static gchar *
 parse_subrip (ParserState * state, const gchar * line)
 {
@@ -1226,6 +1260,13 @@ parse_webvtt (ParserState * state, const gchar * line)
       state->start_time = ts_start;
       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);
+      state->state = 0;
+#endif
     } else {
       GST_DEBUG ("error parsing subrip time line '%s'", line);
       state->state = 0;
@@ -1476,7 +1517,7 @@ parser_state_init (ParserState * state)
 #ifdef TIZEN_FEATURE_SUBPARSE_MODIFICATION
   state->language_list = NULL;
 
-  g_free(state->current_language);
+  g_free (state->current_language);
   state->current_language = NULL;
 
   state->langlist_msg_posted = FALSE;
@@ -1886,15 +1927,21 @@ 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) {
-      m = gst_message_new_element (GST_OBJECT_CAST (self), gst_structure_new("Ext_Sub_Language_List",
-                                 "lang_list", G_TYPE_POINTER, self->state.language_list, NULL));
+      m = gst_message_new_element (GST_OBJECT_CAST (self),
+          gst_structure_new ("Ext_Sub_Language_List", "lang_list",
+              G_TYPE_POINTER, self->state.language_list, NULL));
 
       gst_element_post_message (GST_ELEMENT_CAST (self), m);
       self->state.langlist_msg_posted = TRUE;
-      GST_DEBUG_OBJECT (self, "curr lang as : %s ", GST_STR_NULL(self->state.current_language));
+      GST_DEBUG_OBJECT (self, "curr lang as : %s ",
+          GST_STR_NULL (self->state.current_language));
     }
 #endif
     if (subtitle) {
index 78bf5fe..af7520e 100644 (file)
@@ -82,7 +82,10 @@ typedef struct {
   GList* language_list;
   gchar* current_language;
   gboolean langlist_msg_posted;
-#endif  
+#endif
+#ifdef TIZEN_FEATURE_HLS_WEBVTT
+  gchar* timestamp_map;
+#endif
 } ParserState;
 
 typedef gchar* (*Parser) (ParserState *state, const gchar *line);
index 4a05f4d..70c21a3 100644 (file)
@@ -5,7 +5,7 @@
 
 Name:           gst-plugins-base
 Version:        1.16.2
-Release:        14
+Release:        15
 License:        LGPL-2.0+
 Summary:        GStreamer Streaming-Media Framework Plug-Ins
 Url:            http://gstreamer.freedesktop.org/
@@ -91,6 +91,7 @@ export CFLAGS="%{optflags} -fno-strict-aliasing\
  -DTIZEN_FEATURE_DISABLE_MIME_TYPES\
  -DTIZEN_FEATURE_VIDEO_MODIFICATION\
  -DTIZEN_FEATURE_SUBPARSE_MODIFICATION\
+ -DTIZEN_FEATURE_HLS_WEBVTT\
  -DTIZEN_FEATURE_VOLUME_MODIFICATION\
  -DTIZEN_FEATURE_FORCE_SW_DECODER\
  -DTIZEN_FEATURE_U3_AVOID_DEADLOCK\