Browse Source

libobs: Add obs_data wrappers for media_frames_per_second

Palana 10 years ago
parent
commit
0b3fcb8b6e
2 changed files with 208 additions and 0 deletions
  1. 165 0
      libobs/obs-data.c
  2. 43 0
      libobs/obs-data.h

+ 165 - 0
libobs/obs-data.c

@@ -1052,6 +1052,14 @@ static inline void obs_set_array(obs_data_t *data, obs_data_item_t **item,
 	set_item_(data, item, name, &array, sizeof(obs_data_t*), OBS_DATA_ARRAY);
 }
 
+static inline void obs_take_obj(obs_data_t *data, obs_data_item_t **item,
+		const char *name,
+		obs_data_t *obj, set_item_t set_item_)
+{
+	obs_set_obj(data, item, name, obj, set_item_);
+	obs_data_release(obj);
+}
+
 void obs_data_set_string(obs_data_t *data, const char *name, const char *val)
 {
 	obs_set_string(data, NULL, name, val, set_item);
@@ -1980,3 +1988,160 @@ void obs_data_get_autoselect_quat(obs_data_t *data, const char *name,
 {
 	get_quat(obs_data_get_autoselect_obj(data, name), val);
 }
+
+/* ------------------------------------------------------------------------- */
+/* Helper functions for media_frames_per_seconds */
+
+static inline obs_data_t *make_frames_per_second(
+		struct media_frames_per_second fps,
+		const char *option)
+{
+	obs_data_t *obj = obs_data_create();
+
+	if (!option) {
+		obs_data_set_double(obj, "numerator", fps.numerator);
+		obs_data_set_double(obj, "denominator", fps.denominator);
+
+	} else {
+		obs_data_set_string(obj, "option", option);
+	}
+
+	return obj;
+}
+
+void obs_data_set_frames_per_second(obs_data_t *data, const char *name,
+		struct media_frames_per_second fps, const char *option)
+{
+	obs_take_obj(data, NULL, name, make_frames_per_second(fps, option),
+			set_item);
+}
+
+void obs_data_set_default_frames_per_second(obs_data_t *data, const char *name,
+		struct media_frames_per_second fps, const char *option)
+{
+	obs_take_obj(data, NULL, name, make_frames_per_second(fps, option),
+			set_item_def);
+}
+
+void obs_data_set_autoselect_frames_per_second(obs_data_t *data,
+		const char *name, struct media_frames_per_second fps,
+		const char *option)
+{
+	obs_take_obj(data, NULL, name, make_frames_per_second(fps, option),
+			set_item_auto);
+}
+
+static inline bool get_option(obs_data_t *data, const char **option)
+{
+	if (!option) return false;
+
+	struct obs_data_item *opt = obs_data_item_byname(data, "option");
+	if (!opt) return false;
+
+	*option = obs_data_item_get_string(opt);
+	obs_data_item_release(&opt);
+
+	obs_data_release(data);
+
+	return true;
+}
+
+#define CLAMP(x, min, max) ((x) < min ? min : ((x) > max ? max : (x)))
+
+static inline bool get_frames_per_second(obs_data_t *data,
+		struct media_frames_per_second *fps,
+		const char **option)
+{
+	if (!data) return false;
+
+	if (get_option(data, option)) return true;
+
+	if (!fps) goto free;
+
+	struct obs_data_item *num = obs_data_item_byname(data, "numerator");
+	struct obs_data_item *den = obs_data_item_byname(data, "denominator");
+	if (!num || !den) {
+		obs_data_item_release(&num);
+		obs_data_item_release(&den);
+		goto free;
+	}
+
+	fps->numerator   =
+		CLAMP(obs_data_item_get_int(num), 0, UINT32_MAX);
+	fps->denominator =
+		CLAMP(obs_data_item_get_int(den), 0, UINT32_MAX);
+
+	obs_data_item_release(&num);
+	obs_data_item_release(&den);
+
+	obs_data_release(data);
+
+	return media_frames_per_second_is_valid(*fps);
+
+free:
+	obs_data_release(data);
+	return false;
+}
+
+bool obs_data_get_frames_per_second(obs_data_t *data, const char *name,
+		struct media_frames_per_second *fps, const char **option)
+{
+	return get_frames_per_second(obs_data_get_obj(data, name), fps, option);
+}
+
+bool obs_data_get_default_frames_per_second(obs_data_t *data, const char *name,
+		struct media_frames_per_second *fps, const char **option)
+{
+	return get_frames_per_second(obs_data_get_default_obj(data, name),
+			fps, option);
+}
+
+bool obs_data_get_autoselect_frames_per_second(obs_data_t *data,
+		const char *name, struct media_frames_per_second *fps,
+		const char **option)
+{
+	return get_frames_per_second(obs_data_get_autoselect_obj(data, name),
+			fps, option);
+}
+
+void obs_data_item_set_frames_per_second(obs_data_item_t **item,
+		struct media_frames_per_second fps, const char *option)
+{
+	obs_take_obj(NULL, item, NULL, make_frames_per_second(fps, option),
+			set_item);
+}
+
+void obs_data_item_set_default_frames_per_second(obs_data_item_t **item,
+		struct media_frames_per_second fps, const char *option)
+{
+	obs_take_obj(NULL, item, NULL, make_frames_per_second(fps, option),
+			set_item_def);
+}
+
+void obs_data_item_set_autoselect_frames_per_second(obs_data_item_t **item,
+		struct media_frames_per_second fps, const char *option)
+{
+	obs_take_obj(NULL, item, NULL, make_frames_per_second(fps, option),
+			set_item_auto);
+}
+
+bool obs_data_item_get_frames_per_second(obs_data_item_t *item,
+		struct media_frames_per_second *fps, const char **option)
+{
+	return get_frames_per_second(obs_data_item_get_obj(item),
+			fps, option);
+}
+
+bool obs_data_item_get_default_frames_per_second(obs_data_item_t *item,
+		struct media_frames_per_second *fps, const char **option)
+{
+	return get_frames_per_second(obs_data_item_get_default_obj(item),
+			fps, option);
+}
+
+bool obs_data_item_get_autoselect_frames_per_second(obs_data_item_t *item,
+		struct media_frames_per_second *fps, const char **option)
+{
+	return get_frames_per_second(obs_data_item_get_autoselect_obj(item),
+			fps, option);
+}

+ 43 - 0
libobs/obs-data.h

@@ -18,6 +18,7 @@
 #pragma once
 
 #include "util/c99defs.h"
+#include "media-io/frame-rate.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -305,6 +306,48 @@ EXPORT void obs_data_get_autoselect_vec4(obs_data_t *data, const char *name,
 EXPORT void obs_data_get_autoselect_quat(obs_data_t *data, const char *name,
 		struct quat *val);
 
+/* ------------------------------------------------------------------------- */
+/* Helper functions for media_frames_per_second/OBS_PROPERTY_FRAME_RATE */
+EXPORT void obs_data_set_frames_per_second(obs_data_t *data,
+		const char *name,
+		struct media_frames_per_second fps, const char *option);
+EXPORT void obs_data_set_default_frames_per_second(obs_data_t *data,
+		const char *name,
+		struct media_frames_per_second fps, const char *option);
+EXPORT void obs_data_set_autoselect_frames_per_second(obs_data_t *data,
+		const char *name,
+		struct media_frames_per_second fps, const char *option);
+
+EXPORT bool obs_data_get_frames_per_second(obs_data_t *data,
+		const char *name,
+		struct media_frames_per_second *fps, const char **option);
+EXPORT bool obs_data_get_default_frames_per_second(obs_data_t *data,
+		const char *name,
+		struct media_frames_per_second *fps, const char **option);
+EXPORT bool obs_data_get_autoselect_frames_per_second(obs_data_t *data,
+		const char *name,
+		struct media_frames_per_second *fps, const char **option);
+
+EXPORT void obs_data_item_set_frames_per_second(
+		obs_data_item_t **item,
+		struct media_frames_per_second fps, const char *option);
+EXPORT void obs_data_item_set_default_frames_per_second(
+		obs_data_item_t **item,
+		struct media_frames_per_second fps, const char *option);
+EXPORT void obs_data_item_set_autoselect_frames_per_second(
+		obs_data_item_t **item,
+		struct media_frames_per_second fps, const char *option);
+
+EXPORT bool obs_data_item_get_frames_per_second(
+		obs_data_item_t *item,
+		struct media_frames_per_second *fps, const char **option);
+EXPORT bool obs_data_item_get_default_frames_per_second(
+		obs_data_item_t *item,
+		struct media_frames_per_second *fps, const char **option);
+EXPORT bool obs_data_item_get_autoselect_frames_per_second(
+		obs_data_item_t *item,
+		struct media_frames_per_second *fps, const char **option);
+
 /* ------------------------------------------------------------------------- */
 /* OBS-specific functions */