提交 1b078f57 编写于 作者: P Palana

libobs: Add frame rate property

上级 0b3fcb8b
......@@ -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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册