obs-output module: Fill out more functions
- Add start/stop code to obs-output module - Use a circular buffer for the buffered encoder packets instead of a dynamic array - Add pthreads.lib as a dependency to obs-output module on windows in visual studio project files - Fix an windows export bug for avc parsing functions on windows. Also, rename those functions to be more consistent with each other. - Make outputs use a single function for encoded data rather than multiple functions - Add the ability to make 'text' properties be passworded
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
******************************************************************************/
|
||||
|
||||
#include "obs.h"
|
||||
#include "obs-avc.h"
|
||||
#include "util/array-serializer.h"
|
||||
|
||||
enum {
|
||||
@@ -127,8 +128,8 @@ static void serialize_avc_data(struct serializer *s, const uint8_t *data,
|
||||
}
|
||||
}
|
||||
|
||||
void obs_create_avc_packet(struct encoder_packet *avc_packet,
|
||||
struct encoder_packet *src)
|
||||
void obs_parse_avc_packet(struct encoder_packet *avc_packet,
|
||||
const struct encoder_packet *src)
|
||||
{
|
||||
struct array_output_data output;
|
||||
struct serializer s;
|
||||
@@ -182,7 +183,7 @@ static void get_sps_pps(const uint8_t *data, size_t size,
|
||||
}
|
||||
}
|
||||
|
||||
size_t obs_create_avc_header(uint8_t **header, const uint8_t *data, size_t size)
|
||||
size_t obs_parse_avc_header(uint8_t **header, const uint8_t *data, size_t size)
|
||||
{
|
||||
struct array_output_data output;
|
||||
struct serializer s;
|
||||
|
@@ -17,13 +17,23 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "util/c99defs.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct encoder_packet;
|
||||
|
||||
/* Helpers for parsing AVC NAL units. */
|
||||
|
||||
const uint8_t *obs_avc_find_startcode(const uint8_t *p, const uint8_t *end);
|
||||
|
||||
EXPORT void obs_create_avc_packet(struct encoder_packet *avc_packet,
|
||||
struct encoder_packet *src);
|
||||
EXPORT size_t obs_create_avc_header(uint8_t **header, const uint8_t *data,
|
||||
EXPORT const uint8_t *obs_avc_find_startcode(const uint8_t *p,
|
||||
const uint8_t *end);
|
||||
EXPORT void obs_parse_avc_packet(struct encoder_packet *avc_packet,
|
||||
const struct encoder_packet *src);
|
||||
EXPORT size_t obs_parse_avc_header(uint8_t **header, const uint8_t *data,
|
||||
size_t size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@@ -30,3 +30,4 @@
|
||||
#define OBS_OUTPUT_BAD_PATH -1
|
||||
#define OBS_OUTPUT_CONNECT_FAILED -2
|
||||
#define OBS_OUTPUT_INVALID_STREAM -3
|
||||
#define OBS_OUTPUT_FAIL -4
|
||||
|
@@ -200,13 +200,7 @@ void obs_register_output(const struct obs_output_info *info)
|
||||
CHECK_REQUIRED_VAL(info, stop, obs_register_output);
|
||||
|
||||
if (info->flags & OBS_OUTPUT_ENCODED) {
|
||||
if (info->flags & OBS_OUTPUT_VIDEO)
|
||||
CHECK_REQUIRED_VAL(info, encoded_video,
|
||||
obs_register_output);
|
||||
|
||||
if (info->flags & OBS_OUTPUT_AUDIO)
|
||||
CHECK_REQUIRED_VAL(info, encoded_audio,
|
||||
obs_register_output);
|
||||
CHECK_REQUIRED_VAL(info, encoded_data, obs_register_output);
|
||||
} else {
|
||||
if (info->flags & OBS_OUTPUT_VIDEO)
|
||||
CHECK_REQUIRED_VAL(info, raw_video,
|
||||
|
@@ -322,11 +322,11 @@ static void hook_data_capture(struct obs_output *output, bool encoded,
|
||||
if (encoded) {
|
||||
if (has_video)
|
||||
obs_encoder_start(output->video_encoder,
|
||||
output->info.encoded_video,
|
||||
output->info.encoded_data,
|
||||
output->data);
|
||||
if (has_audio)
|
||||
obs_encoder_start(output->audio_encoder,
|
||||
output->info.encoded_audio,
|
||||
output->info.encoded_data,
|
||||
output->data);
|
||||
} else {
|
||||
if (has_video)
|
||||
@@ -414,11 +414,11 @@ void obs_output_end_data_capture(obs_output_t output)
|
||||
if (encoded) {
|
||||
if (has_video)
|
||||
obs_encoder_stop(output->video_encoder,
|
||||
output->info.encoded_video,
|
||||
output->info.encoded_data,
|
||||
output->data);
|
||||
if (has_audio)
|
||||
obs_encoder_stop(output->audio_encoder,
|
||||
output->info.encoded_audio,
|
||||
output->info.encoded_data,
|
||||
output->data);
|
||||
} else {
|
||||
if (has_video)
|
||||
|
@@ -42,8 +42,7 @@ struct obs_output_info {
|
||||
void (*raw_video)(void *data, struct video_data *frame);
|
||||
void (*raw_audio)(void *data, struct audio_data *frames);
|
||||
|
||||
void (*encoded_video)(void *data, struct encoder_packet *packet);
|
||||
void (*encoded_audio)(void *data, struct encoder_packet *packet);
|
||||
void (*encoded_data)(void *data, struct encoder_packet *packet);
|
||||
|
||||
/* optional */
|
||||
void (*update)(void *data, obs_data_t settings);
|
||||
|
@@ -36,6 +36,10 @@ struct list_item {
|
||||
char *value;
|
||||
};
|
||||
|
||||
struct text_data {
|
||||
enum obs_text_type type;
|
||||
};
|
||||
|
||||
struct list_data {
|
||||
DARRAY(struct list_item) items;
|
||||
enum obs_combo_type type;
|
||||
@@ -136,7 +140,7 @@ static inline size_t get_property_size(enum obs_property_type type)
|
||||
case OBS_PROPERTY_BOOL: return 0;
|
||||
case OBS_PROPERTY_INT: return sizeof(struct int_data);
|
||||
case OBS_PROPERTY_FLOAT: return sizeof(struct float_data);
|
||||
case OBS_PROPERTY_TEXT: return 0;
|
||||
case OBS_PROPERTY_TEXT: return sizeof(struct text_data);
|
||||
case OBS_PROPERTY_PATH: return 0;
|
||||
case OBS_PROPERTY_LIST: return sizeof(struct list_data);
|
||||
case OBS_PROPERTY_COLOR: return 0;
|
||||
@@ -224,10 +228,13 @@ void obs_properties_add_float(obs_properties_t props, const char *name,
|
||||
}
|
||||
|
||||
void obs_properties_add_text(obs_properties_t props, const char *name,
|
||||
const char *desc)
|
||||
const char *desc, enum obs_text_type type)
|
||||
{
|
||||
if (!props || has_prop(props, name)) return;
|
||||
new_prop(props, name, desc, OBS_PROPERTY_TEXT);
|
||||
|
||||
struct obs_property *p = new_prop(props, name, desc, OBS_PROPERTY_TEXT);
|
||||
struct text_data *data = get_property_data(p);
|
||||
data->type = type;
|
||||
}
|
||||
|
||||
void obs_properties_add_path(obs_properties_t props, const char *name,
|
||||
@@ -356,6 +363,12 @@ double obs_property_float_step(obs_property_t p)
|
||||
return data ? data->step : 0;
|
||||
}
|
||||
|
||||
enum obs_text_type obs_proprety_text_type(obs_property_t p)
|
||||
{
|
||||
struct text_data *data = get_type_data(p, OBS_PROPERTY_TEXT);
|
||||
return data ? data->type : OBS_TEXT_DEFAULT;
|
||||
}
|
||||
|
||||
enum obs_combo_type obs_property_list_type(obs_property_t p)
|
||||
{
|
||||
struct list_data *data = get_list_data(p);
|
||||
|
@@ -47,6 +47,11 @@ enum obs_combo_type {
|
||||
OBS_COMBO_TYPE_LIST,
|
||||
};
|
||||
|
||||
enum obs_text_type {
|
||||
OBS_TEXT_DEFAULT,
|
||||
OBS_TEXT_PASSWORD,
|
||||
};
|
||||
|
||||
struct obs_properties;
|
||||
struct obs_property;
|
||||
typedef struct obs_properties *obs_properties_t;
|
||||
@@ -71,7 +76,7 @@ EXPORT void obs_properties_add_int(obs_properties_t props, const char *name,
|
||||
EXPORT void obs_properties_add_float(obs_properties_t props, const char *name,
|
||||
const char *description, double min, double max, double step);
|
||||
EXPORT void obs_properties_add_text(obs_properties_t props, const char *name,
|
||||
const char *description);
|
||||
const char *description, enum obs_text_type type);
|
||||
EXPORT void obs_properties_add_path(obs_properties_t props, const char *name,
|
||||
const char *description);
|
||||
EXPORT obs_property_t obs_properties_add_list(obs_properties_t props,
|
||||
@@ -97,6 +102,7 @@ EXPORT int obs_property_int_step(obs_property_t p);
|
||||
EXPORT double obs_property_float_min(obs_property_t p);
|
||||
EXPORT double obs_property_float_max(obs_property_t p);
|
||||
EXPORT double obs_property_float_step(obs_property_t p);
|
||||
EXPORT enum obs_text_type obs_proprety_text_type(obs_property_t p);
|
||||
EXPORT enum obs_combo_type obs_property_list_type(obs_property_t p);
|
||||
EXPORT enum obs_combo_format obs_property_list_format(obs_property_t p);
|
||||
|
||||
|
Reference in New Issue
Block a user