Merge branch 'upstream/1.16' into tizen_gst_1.16.2
[platform/upstream/gstreamer.git] / libs / gst / base / gstbaseparse.c
index ce68956..2ddbcc4 100644 (file)
 
 #define GST_BASE_PARSE_FRAME_PRIVATE_FLAG_NOALLOC  (1 << 0)
 
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+#define MIN_FRAMES_TO_POST_BITRATE 1
+#else
 #define MIN_FRAMES_TO_POST_BITRATE 10
+#endif
 #define TARGET_DIFFERENCE          (20 * GST_SECOND)
 #define MAX_INDEX_ENTRIES          4096
 #define UPDATE_THRESHOLD           2
@@ -343,6 +347,16 @@ struct _GstBaseParsePrivate
 
   /* Current segment seqnum */
   guint32 segment_seqnum;
+
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+  /* to get pad mode early */
+  GstPadMode expected_pad_mode;
+  /* check first frame in base parser */
+  gboolean first_frame;
+  /* remove zero padding */
+  gint64 remove_from_total;
+  gboolean accurate_index_seek;
+#endif
 };
 
 typedef struct _GstBaseParseSeek
@@ -631,6 +645,10 @@ gst_base_parse_init (GstBaseParse * parse, GstBaseParseClass * bclass)
 
   parse->priv->pad_mode = GST_PAD_MODE_NONE;
 
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+  parse->priv->expected_pad_mode = GST_PAD_MODE_NONE;
+#endif
+
   g_mutex_init (&parse->priv->index_lock);
 
   /* init state */
@@ -862,6 +880,12 @@ gst_base_parse_reset (GstBaseParse * parse)
 
   parse->priv->skip = 0;
 
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+  parse->priv->first_frame = TRUE;
+  parse->priv->remove_from_total = 0;
+  parse->priv->accurate_index_seek = TRUE;
+#endif
+
   g_list_foreach (parse->priv->pending_events, (GFunc) gst_mini_object_unref,
       NULL);
   g_list_free (parse->priv->pending_events);
@@ -1732,7 +1756,11 @@ gst_base_parse_convert_default (GstBaseParse * parse,
   if (!parse->priv->framecount)
     goto no_framecount;
 
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+  duration = parse->priv->acc_duration / GST_USECOND;
+#else
   duration = parse->priv->acc_duration / GST_MSECOND;
+#endif
   bytes = parse->priv->bytecount;
 
   if (G_UNLIKELY (!duration || !bytes))
@@ -1742,7 +1770,13 @@ gst_base_parse_convert_default (GstBaseParse * parse,
     if (dest_format == GST_FORMAT_TIME) {
       /* BYTES -> TIME conversion */
       GST_DEBUG_OBJECT (parse, "converting bytes -> time");
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+      src_value = src_value - parse->priv->remove_from_total;
+#endif
       *dest_value = gst_util_uint64_scale (src_value, duration, bytes);
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+      *dest_value /= GST_USECOND;
+#endif
       *dest_value *= GST_MSECOND;
       GST_DEBUG_OBJECT (parse, "conversion result: %" G_GINT64_FORMAT " ms",
           *dest_value / GST_MSECOND);
@@ -1753,8 +1787,13 @@ gst_base_parse_convert_default (GstBaseParse * parse,
   } else if (src_format == GST_FORMAT_TIME) {
     if (dest_format == GST_FORMAT_BYTES) {
       GST_DEBUG_OBJECT (parse, "converting time -> bytes");
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+      *dest_value = gst_util_uint64_scale (src_value / GST_USECOND, bytes,
+          duration);
+#else
       *dest_value = gst_util_uint64_scale (src_value / GST_MSECOND, bytes,
           duration);
+#endif
       GST_DEBUG_OBJECT (parse,
           "time %" G_GINT64_FORMAT " ms in bytes = %" G_GINT64_FORMAT,
           src_value / GST_MSECOND, *dest_value);
@@ -2198,6 +2237,14 @@ gst_base_parse_handle_buffer (GstBaseParse * parse, GstBuffer * buffer,
     gst_adapter_push (parse->priv->adapter, buffer);
   }
 
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+  /* some one-time start-up */
+  if (G_UNLIKELY (parse->priv->framecount == 0)) {
+    gst_base_parse_check_seekability (parse);
+    gst_base_parse_check_upstream (parse);
+  }
+#endif
+
   frame = gst_base_parse_prepare_frame (parse, buffer);
   ret = klass->handle_frame (parse, frame, skip);
 
@@ -2358,6 +2405,15 @@ gst_base_parse_handle_and_push_frame (GstBaseParse * parse,
    * we may have new information on frame properties */
   gst_base_parse_parse_frame (parse, frame);
 
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+  if (parse->priv->first_frame) {
+    parse->priv->remove_from_total = GST_BUFFER_OFFSET (buffer);
+    GST_DEBUG_OBJECT (parse, "first frame has offset %" G_GINT64_FORMAT ". remove from total",
+        parse->priv->remove_from_total);
+    parse->priv->first_frame = FALSE;
+  }
+#endif
+
   parse->priv->next_pts = GST_CLOCK_TIME_NONE;
   if (GST_BUFFER_DTS_IS_VALID (buffer) && GST_BUFFER_DURATION_IS_VALID (buffer)) {
     parse->priv->next_dts =
@@ -2424,6 +2480,13 @@ gst_base_parse_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
 
   buffer = frame->buffer;
 
+#ifdef TIZEN_PROFILE_TV
+  if (!GST_CLOCK_TIME_IS_VALID (GST_BUFFER_PTS (buffer))) {
+    GST_LOG_OBJECT (parse, "invalid pts, set with dts");
+    GST_BUFFER_PTS (buffer) = GST_BUFFER_DTS (buffer);
+  }
+#endif
+
   GST_LOG_OBJECT (parse,
       "processing buffer of size %" G_GSIZE_FORMAT " with dts %" GST_TIME_FORMAT
       ", pts %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT,
@@ -2444,7 +2507,11 @@ gst_base_parse_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
   if (parse->priv->update_interval < 0)
     parse->priv->update_interval = 50;
   else if (parse->priv->update_interval > 0 &&
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+      ((parse->priv->framecount - 1) % parse->priv->update_interval) == 0)
+#else
       (parse->priv->framecount % parse->priv->update_interval) == 0)
+#endif
     gst_base_parse_update_duration (parse);
 
   if (GST_BUFFER_PTS_IS_VALID (buffer))
@@ -2521,6 +2588,9 @@ gst_base_parse_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
    * like tags added by pre_push_frame */
   if (parse->priv->tags_changed) {
     gst_base_parse_queue_tag_event_update (parse);
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+    gst_base_parse_push_pending_events (parse);
+#endif
     parse->priv->tags_changed = FALSE;
   }
   gst_base_parse_push_pending_events (parse);
@@ -3744,6 +3814,11 @@ gst_base_parse_sink_activate_mode (GstPad * pad, GstObject * parent,
   GST_DEBUG_OBJECT (parse, "sink %sactivate in %s mode",
       (active) ? "" : "de", gst_pad_mode_get_name (mode));
 
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+    /* to know early what is the mode */
+    parse->priv->expected_pad_mode = active ? mode : GST_PAD_MODE_NONE;
+#endif
+
   if (!gst_base_parse_activate (parse, active))
     goto activate_failed;
 
@@ -4573,10 +4648,22 @@ gst_base_parse_handle_seek (GstBaseParse * parse, GstEvent * event)
 
   /* maybe we can be accurate for (almost) free */
   gst_base_parse_find_offset (parse, seeksegment.position, TRUE, &start_ts);
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+  if (parse->priv->accurate_index_seek) {
+    if (seeksegment.position <= start_ts + TARGET_DIFFERENCE) {
+      GST_DEBUG_OBJECT (parse, "accurate seek possible");
+      accurate = TRUE;
+    }
+  } else {
+    GST_DEBUG_OBJECT (parse, "accurate seek NOT possible");
+    accurate = FALSE;
+  }
+#else
   if (seeksegment.position <= start_ts + TARGET_DIFFERENCE) {
     GST_DEBUG_OBJECT (parse, "accurate seek possible");
     accurate = TRUE;
   }
+#endif
 
   if (accurate) {
     GstClockTime startpos;
@@ -4980,3 +5067,62 @@ gst_base_parse_merge_tags (GstBaseParse * parse, GstTagList * tags,
 
   GST_OBJECT_UNLOCK (parse);
 }
+
+#ifdef TIZEN_FEATURE_BASEPARSE_MODIFICATION
+void
+gst_base_parse_get_upstream_size (GstBaseParse * parse,
+    gint64 * upstream_size)
+{
+  GST_BASE_PARSE_INDEX_LOCK (parse);
+  *upstream_size = parse->priv->upstream_size;
+  GST_INFO_OBJECT (parse, "get upstream_size for child parser : (%"G_GUINT64_FORMAT")",
+    parse->priv->upstream_size);
+  GST_BASE_PARSE_INDEX_UNLOCK (parse);
+}
+
+void
+gst_base_parse_get_index_last_offset (GstBaseParse * parse,
+    gint64 * index_last_offset)
+{
+  GST_BASE_PARSE_INDEX_LOCK (parse);
+  *index_last_offset = parse->priv->index_last_offset;
+  GST_INFO_OBJECT (parse, "get index_last_offset for child parser : (%"G_GUINT64_FORMAT")",
+    parse->priv->index_last_offset);
+  GST_BASE_PARSE_INDEX_UNLOCK (parse);
+}
+
+void
+gst_base_parse_get_index_last_ts (GstBaseParse * parse,
+    GstClockTime * index_last_ts)
+{
+  GST_BASE_PARSE_INDEX_LOCK (parse);
+  *index_last_ts = parse->priv->index_last_ts;
+  GST_INFO_OBJECT (parse, "get index_last_ts for child parser : (%"GST_TIME_FORMAT")",
+    GST_TIME_ARGS(parse->priv->index_last_ts));
+  GST_BASE_PARSE_INDEX_UNLOCK (parse);
+}
+
+void
+gst_base_parse_get_pad_mode (GstBaseParse * parse,
+    GstPadMode * pad_mode)
+{
+  GST_BASE_PARSE_INDEX_LOCK (parse);
+  *pad_mode = parse->priv->expected_pad_mode;
+  GST_INFO_OBJECT (parse, "get pad_mode for child parse: mode num (%d)",
+    parse->priv->expected_pad_mode);
+  GST_BASE_PARSE_INDEX_UNLOCK (parse);
+}
+/*
+ * Checks if accurate seek mode are avilable from sub-parse
+ */
+void
+gst_base_parse_set_seek_mode (GstBaseParse * parse, gboolean seek_mode)
+{
+  g_return_if_fail (parse != NULL);
+  parse->priv->accurate_index_seek = seek_mode;
+  if (seek_mode)
+    GST_INFO_OBJECT (parse, "accurate seek mode ON");
+  else
+    GST_INFO_OBJECT (parse, "accurate seek mode OFF - for HTTP SEEK");
+}
+#endif