subparse: check byte seekability
authorruble <just.nam@samsung.com>
Wed, 9 Jun 2021 04:54:45 +0000 (13:54 +0900)
committerruble <just.nam@samsung.com>
Wed, 9 Jun 2021 05:00:02 +0000 (14:00 +0900)
Change-Id: I9eacff2d1a7f2dcbfae32a4e5a96e9436efa3d70

gst/subparse/gstsubparse.c

index 5a2a7f2..4ab5d9b 100644 (file)
@@ -102,7 +102,9 @@ static GstStateChangeReturn gst_sub_parse_change_state (GstElement * element,
 
 static GstFlowReturn gst_sub_parse_chain (GstPad * sinkpad, GstObject * parent,
     GstBuffer * buf);
-
+#ifdef TIZEN_FEATURE_SUBPARSE_MODIFICATION
+static gboolean gst_sub_parse_check_byte_seekability (GstSubParse * subparse);
+#endif
 #define gst_sub_parse_parent_class parent_class
 G_DEFINE_TYPE (GstSubParse, gst_sub_parse, GST_TYPE_ELEMENT);
 
@@ -302,8 +304,13 @@ gst_sub_parse_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
         gst_event_unref (event);
         goto beach;
       }
-
 #ifdef TIZEN_FEATURE_SUBPARSE_MODIFICATION
+      if (!gst_sub_parse_check_byte_seekability(self)) {
+        ret = gst_pad_event_default (pad, parent, event);
+        gst_event_unref (event);
+        break;
+      }
+
       SUBPARSE_SEEK_LOCK (self);
 #endif
       /* Convert that seek to a seeking in bytes at position 0,
@@ -343,6 +350,29 @@ beach:
   return ret;
 }
 
+#ifdef TIZEN_FEATURE_SUBPARSE_MODIFICATION
+static gboolean
+gst_sub_parse_check_byte_seekability (GstSubParse * subparse)
+{
+  GstQuery *query;
+  gboolean seekable = FALSE;
+
+  query = gst_query_new_seeking (GST_FORMAT_BYTES);
+
+  if (gst_pad_peer_query (subparse->sinkpad, query)) {
+    gst_query_parse_seeking (query, NULL, &seekable, NULL, NULL);
+  }  else {
+    GST_DEBUG_OBJECT (subparse, "seeking query failed");
+  }
+
+  gst_query_unref (query);
+
+  GST_INFO_OBJECT (subparse, "byte seekable: %d", seekable);
+
+  return  seekable;
+}
+#endif
+
 static void
 gst_sub_parse_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec)