From 7e8836953a816801532694f60a709ef90936fe93 Mon Sep 17 00:00:00 2001 From: Gilbok Lee Date: Wed, 1 Dec 2021 09:34:36 +0900 Subject: [PATCH] subparse: Add drop-out-of-segment property - When property 'drop-out-of-segment' is set to false, subparser will not drop the buffer even the start time of the parsed buffer is out of the segment. Change-Id: Ia7d84ad26c2e93cda46778c86d35bd67442e907b --- gst/subparse/gstsubparse.c | 82 ++++++++++++++++++++++++++++++++++------- gst/subparse/gstsubparse.h | 3 ++ packaging/gst-plugins-base.spec | 3 +- 3 files changed, 74 insertions(+), 14 deletions(-) diff --git a/gst/subparse/gstsubparse.c b/gst/subparse/gstsubparse.c index 38b1d2c..b2e55d7 100644 --- a/gst/subparse/gstsubparse.c +++ b/gst/subparse/gstsubparse.c @@ -46,7 +46,6 @@ GST_DEBUG_CATEGORY (sub_parse_debug); #define SUBPARSE_SEEK_TRYLOCK(elem) g_mutex_trylock(SUBPARSE_SEEK_GET_LOCK(elem)) #define SUBPARSE_SEEK_UNLOCK(elem) g_mutex_unlock(SUBPARSE_SEEK_GET_LOCK(elem)) #endif - #define DEFAULT_ENCODING NULL #define ATTRIBUTE_REGEX "\\s?[a-zA-Z0-9\\. \t\\(\\)]*" static const gchar *allowed_srt_tags[] = { "i", "b", "u", NULL }; @@ -56,13 +55,19 @@ static const gchar *allowed_vtt_tags[] = #ifdef TIZEN_FEATURE_SUBPARSE_MODIFICATION #define DEFAULT_CURRENT_LANGUAGE NULL #endif +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT +#define DEFAULT_DROP_OUT_OF_SEGMENT TRUE +#endif enum { PROP_0, PROP_ENCODING, PROP_VIDEOFPS, #ifdef TIZEN_FEATURE_SUBPARSE_MODIFICATION - PROP_EXTSUB_CURRENT_LANGUAGE + PROP_EXTSUB_CURRENT_LANGUAGE, +#endif +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + PROP_DROP_OUT_OF_SEGMENT, #endif }; #ifdef TIZEN_FEATURE_HLS_WEBVTT @@ -188,6 +193,15 @@ gst_sub_parse_class_init (GstSubParseClass * klass) DEFAULT_CURRENT_LANGUAGE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); #endif + +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + g_object_class_install_property (object_class, PROP_DROP_OUT_OF_SEGMENT, + g_param_spec_boolean ("drop-out-of-segment", + "Drop out-of-segment buffers", + "Drop and don't send out-of-segment buffers", + DEFAULT_DROP_OUT_OF_SEGMENT, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +#endif } static void @@ -225,9 +239,11 @@ gst_sub_parse_init (GstSubParse * subparse) subparse->state.language_list = NULL; subparse->state.current_language = NULL; subparse->state.langlist_msg_posted = FALSE; - g_mutex_init (&subparse->seek_lock); #endif +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + subparse->state.drop_out_of_segment = DEFAULT_DROP_OUT_OF_SEGMENT; +#endif } /* @@ -413,6 +429,13 @@ gst_sub_parse_set_property (GObject * object, guint prop_id, sami_context_change_language (&subparse->state); break; #endif +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + case PROP_DROP_OUT_OF_SEGMENT: + subparse->state.drop_out_of_segment = g_value_get_boolean (value); + GST_DEBUG_OBJECT (object, "Drop out of segment set to %d", + subparse->state.drop_out_of_segment); + break; +#endif default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -439,6 +462,11 @@ gst_sub_parse_get_property (GObject * object, guint prop_id, g_value_set_string (value, subparse->state.current_language); break; #endif +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + case PROP_DROP_OUT_OF_SEGMENT: + g_value_set_boolean (value, subparse->state.drop_out_of_segment); + break; +#endif default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -685,6 +713,9 @@ parse_mdvdsub (ParserState * state, const gchar * line) state->fps_n); /* Check our segment start/stop */ +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + if (state->drop_out_of_segment) { +#endif in_seg = gst_segment_clip (state->segment, GST_FORMAT_TIME, state->start_time, state->start_time + state->duration, &clip_start, &clip_stop); @@ -696,6 +727,9 @@ parse_mdvdsub (ParserState * state, const gchar * line) } else { return NULL; } +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + } +#endif markup = g_string_new (NULL); while (1) { @@ -1187,9 +1221,17 @@ parse_subrip (ParserState * state, const gchar * line) if ((end_time = strstr (line, " --> ")) && parse_subrip_time (line, &ts_start) && parse_subrip_time (end_time + strlen (" --> "), &ts_end) && +#ifdef TIZEN_FEATURE_HLS_WEBVTT + state->start_time <= + ts_end + MPEGTIME_TO_GSTTIME (state->mpegts) - state->local) { +#else state->start_time <= ts_end) { +#endif 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; } else { GST_DEBUG ("error parsing subrip time line '%s'", line); @@ -1200,6 +1242,9 @@ parse_subrip (ParserState * state, const gchar * line) case 2: { /* No need to parse that text if it's out of segment */ +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + if (state->drop_out_of_segment) { +#endif guint64 clip_start = 0, clip_stop = 0; gboolean in_seg = FALSE; @@ -1215,6 +1260,9 @@ parse_subrip (ParserState * state, const gchar * line) state->state = 0; return NULL; } +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + } +#endif } /* looking for subtitle text; empty line ends this subtitle entry */ if (state->buf->len) @@ -1377,6 +1425,9 @@ parse_subviewer (ParserState * state, const gchar * line) case 1: { /* No need to parse that text if it's out of segment */ +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + if (state->drop_out_of_segment) { +#endif guint64 clip_start = 0, clip_stop = 0; gboolean in_seg = FALSE; @@ -1392,6 +1443,9 @@ parse_subviewer (ParserState * state, const gchar * line) state->state = 0; return NULL; } +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + } +#endif } /* looking for subtitle text; empty line ends this subtitle entry */ if (state->buf->len) @@ -1429,6 +1483,9 @@ parse_mpsub (ParserState * state, const gchar * line) return NULL; case 1: { /* No need to parse that text if it's out of segment */ +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + if (state->drop_out_of_segment) { +#endif guint64 clip_start = 0, clip_stop = 0; gboolean in_seg = FALSE; @@ -1444,6 +1501,9 @@ parse_mpsub (ParserState * state, const gchar * line) state->state = 0; return NULL; } +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + } +#endif } /* looking for subtitle text; empty line ends this * subtitle entry */ @@ -1506,7 +1566,9 @@ parse_dks (ParserState * state, const gchar * line) GST_WARNING ("Failed to parse subtitle end time"); return NULL; } - +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + if (state->drop_out_of_segment) { +#endif /* Check if this subtitle is out of the current segment */ in_seg = gst_segment_clip (state->segment, GST_FORMAT_TIME, state->start_time, state->start_time + state->duration, @@ -1515,6 +1577,9 @@ parse_dks (ParserState * state, const gchar * line) if (!in_seg) { return NULL; } +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + } +#endif state->start_time = clip_start; state->duration = clip_stop - clip_start; @@ -1550,15 +1615,6 @@ parser_state_init (ParserState * state) state->local = 0; state->mpegts = 0; #endif - -#ifdef TIZEN_FEATURE_SUBPARSE_MODIFICATION - state->language_list = NULL; - - g_free (state->current_language); - state->current_language = NULL; - - state->langlist_msg_posted = FALSE; -#endif } static void diff --git a/gst/subparse/gstsubparse.h b/gst/subparse/gstsubparse.h index 893f16e..7adb4f3 100644 --- a/gst/subparse/gstsubparse.h +++ b/gst/subparse/gstsubparse.h @@ -87,6 +87,9 @@ typedef struct { guint64 local; guint64 mpegts; #endif +#ifdef TIZEN_FEATURE_SUBPARSE_DROP_OUT_OF_SEGMENT + gboolean drop_out_of_segment; +#endif } ParserState; typedef gchar* (*Parser) (ParserState *state, const gchar *line); diff --git a/packaging/gst-plugins-base.spec b/packaging/gst-plugins-base.spec index a97d604..42643b9 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: 22 +Release: 23 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_SUBPARSE_DROP_OUT_OF_SEGMENT\ -DTIZEN_FEATURE_HLS_WEBVTT\ -DTIZEN_FEATURE_VOLUME_MODIFICATION\ -DTIZEN_FEATURE_FORCE_SW_DECODER\ -- 2.7.4