appsrc: Add "current-level-bytes" property
authorChangbok Chea <changbok.chea@lge.com>
Fri, 26 Jul 2013 06:00:44 +0000 (15:00 +0900)
committerSebastian Dröge <slomo@circular-chaos.org>
Fri, 26 Jul 2013 09:03:08 +0000 (11:03 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=704774

gst-libs/gst/app/gstappsrc.c
win32/common/libgstapp.def

index e8aa4f0e755e41ca36c99f51cdf40ba9fd341c09..b843e6c890ec4cf02605c03eda81d8d2659e4cc1 100644 (file)
@@ -159,6 +159,7 @@ enum
 #define DEFAULT_PROP_MAX_LATENCY   -1
 #define DEFAULT_PROP_EMIT_SIGNALS  TRUE
 #define DEFAULT_PROP_MIN_PERCENT   0
+#define DEFAULT_PROP_CURRENT_LEVEL_BYTE   0
 
 enum
 {
@@ -174,6 +175,7 @@ enum
   PROP_MAX_LATENCY,
   PROP_EMIT_SIGNALS,
   PROP_MIN_PERCENT,
+  PROP_CURRENT_LEVEL_BYTE,
   PROP_LAST
 };
 
@@ -231,6 +233,7 @@ static gboolean gst_app_src_is_seekable (GstBaseSrc * src);
 static gboolean gst_app_src_do_get_size (GstBaseSrc * src, guint64 * size);
 static gboolean gst_app_src_query (GstBaseSrc * src, GstQuery * query);
 
+static guint64 gst_app_src_get_queued_bytes (GstAppSrc * appsrc);
 static GstFlowReturn gst_app_src_push_buffer_action (GstAppSrc * appsrc,
     GstBuffer * buffer);
 
@@ -379,6 +382,20 @@ gst_app_src_class_init (GstAppSrcClass * klass)
           0, 100, DEFAULT_PROP_MIN_PERCENT,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+  /**
+   * GstAppSrc::current-level-bytes:
+   *
+   * The remained size of appsrc element buffer.
+   * Make appsrc emit the "push-buffer" signal when data is pushed buffer.
+   * "current-level-bytes" preperty get this accumulated data size in appsrc buffer.
+   */
+  g_object_class_install_property (gobject_class, PROP_CURRENT_LEVEL_BYTE,
+      g_param_spec_uint64 ("current-level-bytes", "Current Level Bytes",
+          "The remained size of appsrc element buffer",
+           0, G_MAXUINT64, DEFAULT_PROP_CURRENT_LEVEL_BYTE,
+          G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+
   /**
    * GstAppSrc::need-data:
    * @appsrc: the appsrc element that emitted the signal
@@ -505,6 +522,7 @@ gst_app_src_init (GstAppSrc * appsrc)
   priv->max_latency = DEFAULT_PROP_MAX_LATENCY;
   priv->emit_signals = DEFAULT_PROP_EMIT_SIGNALS;
   priv->min_percent = DEFAULT_PROP_MIN_PERCENT;
+  priv->queued_bytes = DEFAULT_PROP_CURRENT_LEVEL_BYTE;
 
   gst_base_src_set_live (GST_BASE_SRC (appsrc), DEFAULT_PROP_IS_LIVE);
 }
@@ -677,6 +695,9 @@ gst_app_src_get_property (GObject * object, guint prop_id, GValue * value,
     case PROP_MIN_PERCENT:
       g_value_set_uint (value, priv->min_percent);
       break;
+    case PROP_CURRENT_LEVEL_BYTE:
+      g_value_set_uint64 (value, gst_app_src_get_queued_bytes (appsrc));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -1531,6 +1552,33 @@ gst_app_src_push_buffer_action (GstAppSrc * appsrc, GstBuffer * buffer)
   return gst_app_src_push_buffer_full (appsrc, buffer, FALSE);
 }
 
+/**
+ * gst_app_src_get_queued_bytes:
+ * @appsrc: a #GstAppSrc
+ *
+ * Get the queued byptes of the buffer
+ *
+ * Returns: the size of queued bytes
+ *
+ * This is used for the "current-level-byte" property. */
+static guint64
+gst_app_src_get_queued_bytes (GstAppSrc * appsrc)
+{
+  gint64 size;
+  GstAppSrcPrivate *priv;
+
+  g_return_val_if_fail (GST_IS_APP_SRC (appsrc), -1);
+
+  priv = appsrc->priv;
+
+  GST_OBJECT_LOCK (appsrc);
+  size = priv->queued_bytes;
+  GST_DEBUG_OBJECT (appsrc, "getting queued bytes is %" G_GUINT64_FORMAT, size);
+  GST_OBJECT_UNLOCK (appsrc);
+
+  return size;
+}
+
 /**
  * gst_app_src_end_of_stream:
  * @appsrc: a #GstAppSrc
index c63ad9c6c6d25e536150249acb93f1c853921272..32b3cd1bba93f40ec1bc712271263b185b3eb679 100644 (file)
@@ -14,6 +14,7 @@ EXPORTS
        gst_app_sink_set_max_buffers
        gst_app_src_end_of_stream
        gst_app_src_get_caps
+       gst_app_src_get_current_level_bytes
        gst_app_src_get_emit_signals
        gst_app_src_get_latency
        gst_app_src_get_max_bytes