From 1b078f57d8973a1ee61cedd92b6191027737c729 Mon Sep 17 00:00:00 2001 From: Palana Date: Sun, 16 Aug 2015 08:47:53 +0200 Subject: [PATCH] libobs: Add frame rate property --- libobs/obs-properties.c | 197 ++++++++++++++++++++++++++++++++++++++++ libobs/obs-properties.h | 34 +++++++ 2 files changed, 231 insertions(+) diff --git a/libobs/obs-properties.c b/libobs/obs-properties.c index 86e71d535..a0e7cd356 100644 --- a/libobs/obs-properties.c +++ b/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}; +} diff --git a/libobs/obs-properties.h b/libobs/obs-properties.h index 35e637dcc..5528a2f5c 100644 --- a/libobs/obs-properties.h +++ b/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