libobs: Add frame rate property
This commit is contained in:
parent
0b3fcb8b6e
commit
1b078f57d8
@ -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};
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user