Element의 동작을 제어하는 가장 기본적이고 중요한 방법은 GObject 속성을 사용하는 것입니다. GObject 속성은 _class_init() 함수에서 정의됩니다. Element는 선택적으로 _get_property() 및 _set_property() 함수를 구현합니다. 이러한 함수는 애플리케이션이 속성 값을 변경하거나 요청하면 알림을 받고 값을 채우거나 해당 속성이 내부적으로 값을 변경하는 데 필요한 조치를 취할 수 있습니다.
get 및 set 함수를 통해 사용하는 속성의 현재 구성된 값으로 인스턴스 변수를 유지하고 싶을 수도 있습니다. GObject는 인스턴스 변수를 자동으로 기본값으로 설정하지 않으며 element의 _init() 함수에서 설정해야 합니다.
/* properties */
enum {
PROP_0,
PROP_SILENT
/* FILL ME */
};
static void gst_my_filter_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void gst_my_filter_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void
gst_my_filter_class_init (GstMyFilterClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
/* define virtual function pointers */
object_class->set_property = gst_my_filter_set_property;
object_class->get_property = gst_my_filter_get_property;
/* define properties */
g_object_class_install_property (object_class, PROP_SILENT,
g_param_spec_boolean ("silent", "Silent",
"Whether to be very verbose or not",
FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}
static void
gst_my_filter_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GstMyFilter *filter = GST_MY_FILTER (object);
switch (prop_id) {
case PROP_SILENT:
filter->silent = g_value_get_boolean (value);
g_print ("Silent argument was changed to %s\n",
filter->silent ? "true" : "false");
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gst_my_filter_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GstMyFilter *filter = GST_MY_FILTER (object);
switch (prop_id) {
case PROP_SILENT:
g_value_set_boolean (value, filter->silent);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
위의 내용은 속성이 어떻게 사용되는지에 대한 매우 간단한 예입니다. 그래픽 애플리케이션은 이러한 속성을 사용하고 이러한 속성을 변경할 수 있는 사용자 제어 가능한 위젯을 표시합니다. 즉, 속성을 최대한 사용자 친화적으로 만들려면 속성 정의에서 최대한 정확해야 합니다. 유효한 속성 값의 범위 (정수, 부동 소수점 등)를 정의할 때뿐만 아니라 속성 정의에서 매우 설명적인 (더 나은 방법으로는 국제화된) 문자열을 사용하고 가능하면 정수 대신 열거형과 플래그를 사용합니다. GObject 설명서에서는 이러한 내용을 매우 완벽하게 설명하지만 아래에서 이것이 유용한 경우에 대한 간단한 예를 들어보겠습니다. 여기서 정수를 사용하면 이 맥락에서 의미가 없기 때문에 사용자를 완전히 혼란스럽게 할 수 있습니다. 이 예는 videotestsrc에서 가져왔습니다.
typedef enum {
GST_VIDEOTESTSRC_SMPTE,
GST_VIDEOTESTSRC_SNOW,
GST_VIDEOTESTSRC_BLACK
} GstVideotestsrcPattern;
[..]
#define GST_TYPE_VIDEOTESTSRC_PATTERN (gst_videotestsrc_pattern_get_type ())
static GType
gst_videotestsrc_pattern_get_type (void)
{
static GType videotestsrc_pattern_type = 0;
if (!videotestsrc_pattern_type) {
static GEnumValue pattern_types[] = {
{ GST_VIDEOTESTSRC_SMPTE, "SMPTE 100% color bars", "smpte" },
{ GST_VIDEOTESTSRC_SNOW, "Random (television snow)", "snow" },
{ GST_VIDEOTESTSRC_BLACK, "0% Black", "black" },
{ 0, NULL, NULL },
};
videotestsrc_pattern_type =
g_enum_register_static ("GstVideotestsrcPattern",
pattern_types);
}
return videotestsrc_pattern_type;
}
[..]
static void
gst_videotestsrc_class_init (GstvideotestsrcClass *klass)
{
[..]
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PATTERN,
g_param_spec_enum ("pattern", "Pattern",
"Type of test pattern to generate",
GST_TYPE_VIDEOTESTSRC_PATTERN, GST_VIDEOTESTSRC_SMPTE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
[..]
}
원문: Adding Properties (gstreamer.freedesktop.org)
'IT와 개발 > GStreamer Study' 카테고리의 다른 글
Signals (1) | 2024.10.11 |
---|---|
Building a Test Application (7) | 2024.10.11 |
What are states? (4) | 2024.09.27 |
The query function (3) | 2024.09.20 |
The event function (0) | 2024.09.13 |