From 0b3fcb8b6e2ae41b311a46ca9cf340e27153acbc Mon Sep 17 00:00:00 2001 From: Palana Date: Sun, 16 Aug 2015 08:47:07 +0200 Subject: [PATCH] libobs: Add obs_data wrappers for media_frames_per_second --- libobs/obs-data.c | 165 ++++++++++++++++++++++++++++++++++++++++++++++ libobs/obs-data.h | 43 ++++++++++++ 2 files changed, 208 insertions(+) diff --git a/libobs/obs-data.c b/libobs/obs-data.c index 05f9fe659..6045d6f5c 100644 --- a/libobs/obs-data.c +++ b/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); +} diff --git a/libobs/obs-data.h b/libobs/obs-data.h index 29c79a57e..c07b110f8 100644 --- a/libobs/obs-data.h +++ b/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 */