mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
Add param spec flags for when a property can be changed
Adds GST_PARAM_MUTABLE* flags to indicate in which states a property can be changed and take effect. Fixes #571559
This commit is contained in:
parent
cf78781c6b
commit
1ecf114c0e
4 changed files with 91 additions and 5 deletions
|
@ -1537,6 +1537,11 @@ gst_static_caps_get_type
|
||||||
|
|
||||||
GST_PARAM_CONTROLLABLE
|
GST_PARAM_CONTROLLABLE
|
||||||
GST_PARAM_USER_SHIFT
|
GST_PARAM_USER_SHIFT
|
||||||
|
GST_PARAM_MUTABLE_PAUSED
|
||||||
|
GST_PARAM_MUTABLE_PLAYING
|
||||||
|
GST_PARAM_MUTABLE_READY
|
||||||
|
|
||||||
|
gst_param_spec_is_mutable
|
||||||
|
|
||||||
<SUBSECTION paramspecfraction>
|
<SUBSECTION paramspecfraction>
|
||||||
GstParamSpecFraction
|
GstParamSpecFraction
|
||||||
|
|
|
@ -205,3 +205,43 @@ gst_param_spec_fraction (const gchar * name, const gchar * nick,
|
||||||
|
|
||||||
return pspec;
|
return pspec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_param_spec_is_mutable
|
||||||
|
* @param_spec: a GParamSpec representing a property
|
||||||
|
* @element: the GstElement of the property to be modified
|
||||||
|
*
|
||||||
|
* Checks if an object property for the GstElement given in @element
|
||||||
|
* may be modified given the current state of @element.
|
||||||
|
*
|
||||||
|
* Returns: TRUE if the property may be modified
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_param_spec_is_mutable (GParamSpec * param_spec, GstElement * element)
|
||||||
|
{
|
||||||
|
gboolean ret = TRUE;
|
||||||
|
GstState state;
|
||||||
|
|
||||||
|
if (param_spec->flags & GST_PARAM_MUTABLE_PLAYING) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (element);
|
||||||
|
state = GST_STATE (element);
|
||||||
|
if (param_spec->flags & GST_PARAM_MUTABLE_PAUSED) {
|
||||||
|
if (state > GST_STATE_PAUSED) {
|
||||||
|
ret = FALSE;
|
||||||
|
}
|
||||||
|
} else if (param_spec->flags & GST_PARAM_MUTABLE_READY) {
|
||||||
|
if (state > GST_STATE_READY) {
|
||||||
|
ret = FALSE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (state > GST_STATE_NULL) {
|
||||||
|
ret = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GST_OBJECT_UNLOCK (element);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#ifndef __GST_PARAMSPECS_H__
|
#ifndef __GST_PARAMSPECS_H__
|
||||||
#define __GST_PARAMSPECS_H__
|
#define __GST_PARAMSPECS_H__
|
||||||
|
|
||||||
|
#include <gst/gstelement.h>
|
||||||
#include <gst/gstvalue.h>
|
#include <gst/gstvalue.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
@ -34,6 +35,32 @@ G_BEGIN_DECLS
|
||||||
*/
|
*/
|
||||||
#define GST_PARAM_CONTROLLABLE (1 << (G_PARAM_USER_SHIFT + 1))
|
#define GST_PARAM_CONTROLLABLE (1 << (G_PARAM_USER_SHIFT + 1))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_PARAM_MUTABLE_READY:
|
||||||
|
*
|
||||||
|
* Use this flag on GObject properties of GstElements to indicate that
|
||||||
|
* they can be changed when the element is in the READY or lower state.
|
||||||
|
*/
|
||||||
|
#define GST_PARAM_MUTABLE_READY (1 << (G_PARAM_USER_SHIFT + 2))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_PARAM_MUTABLE_PAUSED:
|
||||||
|
*
|
||||||
|
* Use this flag on GObject properties of GstElements to indicate that
|
||||||
|
* they can be changed when the element is in the PAUSED or lower state.
|
||||||
|
* This flag implies GST_PARAM_MUTABLE_READY.
|
||||||
|
*/
|
||||||
|
#define GST_PARAM_MUTABLE_PAUSED (1 << (G_PARAM_USER_SHIFT + 3))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_PARAM_MUTABLE_PLAYING:
|
||||||
|
*
|
||||||
|
* Use this flag on GObject properties of GstElements to indicate that
|
||||||
|
* they can be changed when the element is in the PLAYING or lower state.
|
||||||
|
* This flag implies GST_PARAM_MUTABLE_PAUSED.
|
||||||
|
*/
|
||||||
|
#define GST_PARAM_MUTABLE_PLAYING (1 << (G_PARAM_USER_SHIFT + 4))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GST_PARAM_USER_SHIFT:
|
* GST_PARAM_USER_SHIFT:
|
||||||
*
|
*
|
||||||
|
@ -90,6 +117,9 @@ GParamSpec * gst_param_spec_fraction (const gchar * name,
|
||||||
gint default_num, gint default_denom,
|
gint default_num, gint default_denom,
|
||||||
GParamFlags flags);
|
GParamFlags flags);
|
||||||
|
|
||||||
|
gboolean gst_param_spec_is_mutable (GParamSpec *param_spec,
|
||||||
|
GstElement *element);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GST_PARAMSPECS_H__ */
|
#endif /* __GST_PARAMSPECS_H__ */
|
||||||
|
|
|
@ -248,15 +248,19 @@ gst_file_src_class_init (GstFileSrcClass * klass)
|
||||||
g_object_class_install_property (gobject_class, ARG_LOCATION,
|
g_object_class_install_property (gobject_class, ARG_LOCATION,
|
||||||
g_param_spec_string ("location", "File Location",
|
g_param_spec_string ("location", "File Location",
|
||||||
"Location of the file to read", NULL,
|
"Location of the file to read", NULL,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
|
||||||
|
GST_PARAM_MUTABLE_READY));
|
||||||
g_object_class_install_property (gobject_class, ARG_MMAPSIZE,
|
g_object_class_install_property (gobject_class, ARG_MMAPSIZE,
|
||||||
g_param_spec_ulong ("mmapsize", "mmap() Block Size",
|
g_param_spec_ulong ("mmapsize", "mmap() Block Size",
|
||||||
"Size in bytes of mmap()d regions", 0, G_MAXULONG, DEFAULT_MMAPSIZE,
|
"Size in bytes of mmap()d regions", 0, G_MAXULONG, DEFAULT_MMAPSIZE,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
|
||||||
|
GST_PARAM_MUTABLE_PLAYING));
|
||||||
g_object_class_install_property (gobject_class, ARG_TOUCH,
|
g_object_class_install_property (gobject_class, ARG_TOUCH,
|
||||||
g_param_spec_boolean ("touch", "Touch mapped region read data",
|
g_param_spec_boolean ("touch", "Touch mapped region read data",
|
||||||
"Touch mmapped data regions to force them to be read from disk",
|
"Touch mmapped data regions to force them to be read from disk",
|
||||||
DEFAULT_TOUCH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
DEFAULT_TOUCH,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
|
||||||
|
GST_PARAM_MUTABLE_PLAYING));
|
||||||
/**
|
/**
|
||||||
* GstFileSrc:use-mmap
|
* GstFileSrc:use-mmap
|
||||||
*
|
*
|
||||||
|
@ -278,12 +282,14 @@ gst_file_src_class_init (GstFileSrcClass * klass)
|
||||||
g_object_class_install_property (gobject_class, ARG_USEMMAP,
|
g_object_class_install_property (gobject_class, ARG_USEMMAP,
|
||||||
g_param_spec_boolean ("use-mmap", "Use mmap to read data",
|
g_param_spec_boolean ("use-mmap", "Use mmap to read data",
|
||||||
"Whether to use mmap() instead of read()",
|
"Whether to use mmap() instead of read()",
|
||||||
DEFAULT_USEMMAP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
DEFAULT_USEMMAP, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
|
||||||
|
GST_PARAM_MUTABLE_READY));
|
||||||
g_object_class_install_property (gobject_class, ARG_SEQUENTIAL,
|
g_object_class_install_property (gobject_class, ARG_SEQUENTIAL,
|
||||||
g_param_spec_boolean ("sequential", "Optimise for sequential mmap access",
|
g_param_spec_boolean ("sequential", "Optimise for sequential mmap access",
|
||||||
"Whether to use madvise to hint to the kernel that access to "
|
"Whether to use madvise to hint to the kernel that access to "
|
||||||
"mmap pages will be sequential",
|
"mmap pages will be sequential",
|
||||||
DEFAULT_SEQUENTIAL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
DEFAULT_SEQUENTIAL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
|
||||||
|
GST_PARAM_MUTABLE_PLAYING));
|
||||||
|
|
||||||
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_file_src_finalize);
|
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_file_src_finalize);
|
||||||
|
|
||||||
|
@ -383,6 +389,11 @@ gst_file_src_set_property (GObject * object, guint prop_id,
|
||||||
|
|
||||||
src = GST_FILE_SRC (object);
|
src = GST_FILE_SRC (object);
|
||||||
|
|
||||||
|
if (!gst_param_spec_is_mutable (pspec, GST_ELEMENT (src))) {
|
||||||
|
GST_WARNING_OBJECT (src, "attempting to change property in wrong state");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case ARG_LOCATION:
|
case ARG_LOCATION:
|
||||||
gst_file_src_set_location (src, g_value_get_string (value));
|
gst_file_src_set_location (src, g_value_get_string (value));
|
||||||
|
|
Loading…
Reference in a new issue