|
|
@@ -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);
|
|
|
+}
|