浏览代码

libobs: Add frame rate property

Palana 10 年之前
父节点
当前提交
1b078f57d8
共有 2 个文件被更改,包括 231 次插入0 次删除
  1. 197 0
      libobs/obs-properties.c
  2. 34 0
      libobs/obs-properties.h

+ 197 - 0
libobs/obs-properties.c

@@ -71,6 +71,21 @@ struct button_data {
 	obs_property_clicked_t callback;
 };
 
+struct frame_rate_option {
+	char *name;
+	char *description;
+};
+
+struct frame_rate_range {
+	struct media_frames_per_second min_time;
+	struct media_frames_per_second max_time;
+};
+
+struct frame_rate_data {
+	DARRAY(struct frame_rate_option) extra_options;
+	DARRAY(struct frame_rate_range)  ranges;
+};
+
 static inline void path_data_free(struct path_data *data)
 {
 	bfree(data->default_path);
@@ -100,6 +115,31 @@ static inline void list_data_free(struct list_data *data)
 	da_free(data->items);
 }
 
+static inline void frame_rate_data_options_free(struct frame_rate_data *data)
+{
+	for (size_t i = 0; i < data->extra_options.num; i++) {
+		struct frame_rate_option *opt = &data->extra_options.array[i];
+		bfree(opt->name);
+		bfree(opt->description);
+	}
+
+	da_resize(data->extra_options, 0);
+}
+
+static inline void frame_rate_data_ranges_free(struct frame_rate_data *data)
+{
+	da_resize(data->ranges, 0);
+}
+
+static inline void frame_rate_data_free(struct frame_rate_data *data)
+{
+	frame_rate_data_options_free(data);
+	frame_rate_data_ranges_free(data);
+
+	da_free(data->extra_options);
+	da_free(data->ranges);
+}
+
 struct obs_properties;
 
 struct obs_property {
@@ -178,6 +218,8 @@ static void obs_property_destroy(struct obs_property *property)
 		path_data_free(get_property_data(property));
 	else if (property->type == OBS_PROPERTY_EDITABLE_LIST)
 		editable_list_data_free(get_property_data(property));
+	else if (property->type == OBS_PROPERTY_FRAME_RATE)
+		frame_rate_data_free(get_property_data(property));
 
 	bfree(property);
 }
@@ -262,6 +304,7 @@ static inline size_t get_property_size(enum obs_property_type type)
 	case OBS_PROPERTY_FONT:      return 0;
 	case OBS_PROPERTY_EDITABLE_LIST:
 		return sizeof(struct editable_list_data);
+	case OBS_PROPERTY_FRAME_RATE:return sizeof(struct frame_rate_data);
 	}
 
 	return 0;
@@ -474,6 +517,20 @@ obs_property_t *obs_properties_add_editable_list(obs_properties_t *props,
 	return p;
 }
 
+obs_property_t *obs_properties_add_frame_rate(obs_properties_t *props,
+		const char *name, const char *desc)
+{
+	if (!props || has_prop(props, name)) return NULL;
+
+	struct obs_property *p = new_prop(props, name, desc,
+			OBS_PROPERTY_FRAME_RATE);
+
+	struct frame_rate_data *data = get_property_data(p);
+	da_init(data->extra_options);
+	da_init(data->ranges);
+	return p;
+}
+
 /* ------------------------------------------------------------------------- */
 
 static inline bool is_combo(struct obs_property *p)
@@ -826,3 +883,143 @@ const char *obs_property_editable_list_default_path(obs_property_t *p)
 			OBS_PROPERTY_EDITABLE_LIST);
 	return data ? data->default_path : NULL;
 }
+
+/* ------------------------------------------------------------------------- */
+/* OBS_PROPERTY_FRAME_RATE */
+
+void obs_property_frame_rate_clear(obs_property_t *p)
+{
+	struct frame_rate_data *data =
+		get_type_data(p, OBS_PROPERTY_FRAME_RATE);
+	if (!data) return;
+
+	frame_rate_data_options_free(data);
+	frame_rate_data_ranges_free(data);
+}
+
+void obs_property_frame_rate_options_clear(obs_property_t *p)
+{
+	struct frame_rate_data *data =
+		get_type_data(p, OBS_PROPERTY_FRAME_RATE);
+	if (!data) return;
+
+	frame_rate_data_options_free(data);
+}
+
+void obs_property_frame_rate_fps_ranges_clear(obs_property_t *p)
+{
+	struct frame_rate_data *data =
+		get_type_data(p, OBS_PROPERTY_FRAME_RATE);
+	if (!data) return;
+
+	frame_rate_data_ranges_free(data);
+}
+
+size_t obs_property_frame_rate_option_add(obs_property_t *p,
+		const char *name, const char *description)
+{
+	struct frame_rate_data *data =
+		get_type_data(p, OBS_PROPERTY_FRAME_RATE);
+	if (!data) return DARRAY_INVALID;
+
+	struct frame_rate_option *opt = da_push_back_new(data->extra_options);
+
+	opt->name        = bstrdup(name);
+	opt->description = bstrdup(description);
+
+	return data->extra_options.num - 1;
+}
+
+size_t obs_property_frame_rate_fps_range_add(obs_property_t *p,
+		struct media_frames_per_second min,
+		struct media_frames_per_second max)
+{
+	struct frame_rate_data *data =
+		get_type_data(p, OBS_PROPERTY_FRAME_RATE);
+	if (!data) return DARRAY_INVALID;
+
+	struct frame_rate_range *rng = da_push_back_new(data->ranges);
+
+	rng->min_time = min;
+	rng->max_time = max;
+
+	return data->ranges.num - 1;
+}
+
+void obs_property_frame_rate_option_insert(obs_property_t *p, size_t idx,
+		const char *name, const char *description)
+{
+	struct frame_rate_data *data =
+		get_type_data(p, OBS_PROPERTY_FRAME_RATE);
+	if (!data) return;
+
+	struct frame_rate_option *opt = da_insert_new(data->extra_options, idx);
+
+	opt->name        = bstrdup(name);
+	opt->description = bstrdup(description);
+}
+
+void obs_property_frame_rate_fps_range_insert(obs_property_t *p, size_t idx,
+		struct media_frames_per_second min,
+		struct media_frames_per_second max)
+{
+	struct frame_rate_data *data =
+		get_type_data(p, OBS_PROPERTY_FRAME_RATE);
+	if (!data) return;
+
+	struct frame_rate_range *rng = da_insert_new(data->ranges, idx);
+
+	rng->min_time = min;
+	rng->max_time = max;
+}
+
+size_t obs_property_frame_rate_options_count(obs_property_t *p)
+{
+	struct frame_rate_data *data =
+		get_type_data(p, OBS_PROPERTY_FRAME_RATE);
+	return data ? data->extra_options.num : 0;
+}
+
+const char *obs_property_frame_rate_option_name(obs_property_t *p,
+		size_t idx)
+{
+	struct frame_rate_data *data =
+		get_type_data(p, OBS_PROPERTY_FRAME_RATE);
+	return data && data->extra_options.num > idx ?
+		data->extra_options.array[idx].name : NULL;
+}
+
+const char *obs_property_frame_rate_option_description(
+		obs_property_t *p, size_t idx)
+{
+	struct frame_rate_data *data =
+		get_type_data(p, OBS_PROPERTY_FRAME_RATE);
+	return data && data->extra_options.num > idx ?
+		data->extra_options.array[idx].description : NULL;
+}
+
+size_t obs_property_frame_rate_fps_ranges_count(obs_property_t *p)
+{
+	struct frame_rate_data *data =
+		get_type_data(p, OBS_PROPERTY_FRAME_RATE);
+	return data ? data->ranges.num : 0;
+}
+
+struct media_frames_per_second obs_property_frame_rate_fps_range_min(
+		obs_property_t *p, size_t idx)
+{
+	struct frame_rate_data *data =
+		get_type_data(p, OBS_PROPERTY_FRAME_RATE);
+	return data && data->ranges.num > idx ?
+		data->ranges.array[idx].min_time :
+		(struct media_frames_per_second){0};
+}
+struct media_frames_per_second obs_property_frame_rate_fps_range_max(
+		obs_property_t *p, size_t idx)
+{
+	struct frame_rate_data *data =
+		get_type_data(p, OBS_PROPERTY_FRAME_RATE);
+	return data && data->ranges.num > idx ?
+		data->ranges.array[idx].max_time :
+		(struct media_frames_per_second){0};
+}

+ 34 - 0
libobs/obs-properties.h

@@ -19,6 +19,7 @@
 
 #include "util/c99defs.h"
 #include "obs-data.h"
+#include "media-io/frame-rate.h"
 
 /**
  * @file
@@ -53,6 +54,7 @@ enum obs_property_type {
 	OBS_PROPERTY_BUTTON,
 	OBS_PROPERTY_FONT,
 	OBS_PROPERTY_EDITABLE_LIST,
+	OBS_PROPERTY_FRAME_RATE,
 };
 
 enum obs_combo_format {
@@ -202,6 +204,9 @@ EXPORT obs_property_t *obs_properties_add_editable_list(obs_properties_t *props,
 		bool allow_files, const char *filter,
 		const char *default_path);
 
+EXPORT obs_property_t *obs_properties_add_frame_rate(obs_properties_t *props,
+		const char *name, const char *description);
+
 /* ------------------------------------------------------------------------- */
 
 /**
@@ -279,6 +284,35 @@ EXPORT bool        obs_property_editable_list_allow_files(obs_property_t *p);
 EXPORT const char *obs_property_editable_list_filter(obs_property_t *p);
 EXPORT const char *obs_property_editable_list_default_path(obs_property_t *p);
 
+EXPORT void obs_property_frame_rate_clear(obs_property_t *p);
+EXPORT void obs_property_frame_rate_options_clear(obs_property_t *p);
+EXPORT void obs_property_frame_rate_fps_ranges_clear(obs_property_t *p);
+
+EXPORT size_t obs_property_frame_rate_option_add(obs_property_t *p,
+		const char *name, const char *description);
+EXPORT size_t obs_property_frame_rate_fps_range_add(obs_property_t *p,
+		struct media_frames_per_second min,
+		struct media_frames_per_second max);
+
+EXPORT void obs_property_frame_rate_option_insert(obs_property_t *p, size_t idx,
+		const char *name, const char *description);
+EXPORT void obs_property_frame_rate_fps_range_insert(obs_property_t *p,
+		size_t idx,
+		struct media_frames_per_second min,
+		struct media_frames_per_second max);
+
+EXPORT size_t      obs_property_frame_rate_options_count(obs_property_t *p);
+EXPORT const char *obs_property_frame_rate_option_name(obs_property_t *p,
+		size_t idx);
+EXPORT const char *obs_property_frame_rate_option_description(
+		obs_property_t *p, size_t idx);
+
+EXPORT size_t      obs_property_frame_rate_fps_ranges_count(obs_property_t *p);
+EXPORT struct media_frames_per_second obs_property_frame_rate_fps_range_min(
+		obs_property_t *p, size_t idx);
+EXPORT struct media_frames_per_second obs_property_frame_rate_fps_range_max(
+		obs_property_t *p, size_t idx);
+
 #ifdef __cplusplus
 }
 #endif