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,
#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
{
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,
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 {
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;
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);
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) {