5780f3f177
Summary: - Prefix all graphics subsystem names with gs_ or GS_ - Unsquish funciton names (for example _setfloat to _set_float) - Changed create functions to be more consistent with the rest of the API elsewhere. For exmaple, instead of gs_create_texture/gs_texture_destroy, it's now gs_texture_create/gs_texture_destroy - Renamed gs_stencil_op enum to gs_stencil_op_type From: To: ----------------------------------------------------------- tvertarray gs_tvertarray vb_data gs_vb_data vbdata_create gs_vbdata_create vbdata_destroy gs_vbdata_destroy shader_param gs_shader_param gs_effect gs_effect effect_technique gs_effect_technique effect_pass gs_effect_pass effect_param gs_effect_param texture_t gs_texture_t stagesurf_t gs_stagesurf_t zstencil_t gs_zstencil_t vertbuffer_t gs_vertbuffer_t indexbuffer_t gs_indexbuffer_t samplerstate_t gs_samplerstate_t swapchain_t gs_swapchain_t texrender_t gs_texrender_t shader_t gs_shader_t sparam_t gs_sparam_t effect_t gs_effect_t technique_t gs_technique_t eparam_t gs_eparam_t device_t gs_device_t graphics_t graphics_t shader_param_type gs_shader_param_type SHADER_PARAM_UNKNOWN GS_SHADER_PARAM_UNKNOWN SHADER_PARAM_BOOL GS_SHADER_PARAM_BOOL SHADER_PARAM_FLOAT GS_SHADER_PARAM_FLOAT SHADER_PARAM_INT GS_SHADER_PARAM_INT SHADER_PARAM_STRING GS_SHADER_PARAM_STRING SHADER_PARAM_VEC2 GS_SHADER_PARAM_VEC2 SHADER_PARAM_VEC3 GS_SHADER_PARAM_VEC3 SHADER_PARAM_VEC4 GS_SHADER_PARAM_VEC4 SHADER_PARAM_MATRIX4X4 GS_SHADER_PARAM_MATRIX4X4 SHADER_PARAM_TEXTURE GS_SHADER_PARAM_TEXTURE shader_param_info gs_shader_param_info shader_type gs_shader_type SHADER_VERTEX GS_SHADER_VERTEX SHADER_PIXEL GS_SHADER_PIXEL shader_destroy gs_shader_destroy shader_numparams gs_shader_get_num_params shader_getparambyidx gs_shader_get_param_by_idx shader_getparambyname gs_shader_get_param_by_name shader_getviewprojmatrix gs_shader_get_viewproj_matrix shader_getworldmatrix gs_shader_get_world_matrix shader_getparaminfo gs_shader_get_param_info shader_setbool gs_shader_set_bool shader_setfloat gs_shader_set_float shader_setint gs_shader_set_int shader_setmatrix3 gs_shader_setmatrix3 shader_setmatrix4 gs_shader_set_matrix4 shader_setvec2 gs_shader_set_vec2 shader_setvec3 gs_shader_set_vec3 shader_setvec4 gs_shader_set_vec4 shader_settexture gs_shader_set_texture shader_setval gs_shader_set_val shader_setdefault gs_shader_set_default effect_property_type gs_effect_property_type EFFECT_NONE GS_EFFECT_NONE EFFECT_BOOL GS_EFFECT_BOOL EFFECT_FLOAT GS_EFFECT_FLOAT EFFECT_COLOR GS_EFFECT_COLOR EFFECT_TEXTURE GS_EFFECT_TEXTURE effect_param_info gs_effect_param_info effect_destroy gs_effect_destroy effect_gettechnique gs_effect_get_technique technique_begin gs_technique_begin technique_end gs_technique_end technique_beginpass gs_technique_begin_pass technique_beginpassbyname gs_technique_begin_pass_by_name technique_endpass gs_technique_end_pass effect_numparams gs_effect_get_num_params effect_getparambyidx gs_effect_get_param_by_idx effect_getparambyname gs_effect_get_param_by_name effect_updateparams gs_effect_update_params effect_getviewprojmatrix gs_effect_get_viewproj_matrix effect_getworldmatrix gs_effect_get_world_matrix effect_getparaminfo gs_effect_get_param_info effect_setbool gs_effect_set_bool effect_setfloat gs_effect_set_float effect_setint gs_effect_set_int effect_setmatrix4 gs_effect_set_matrix4 effect_setvec2 gs_effect_set_vec2 effect_setvec3 gs_effect_set_vec3 effect_setvec4 gs_effect_set_vec4 effect_settexture gs_effect_set_texture effect_setval gs_effect_set_val effect_setdefault gs_effect_set_default texrender_create gs_texrender_create texrender_destroy gs_texrender_destroy texrender_begin gs_texrender_begin texrender_end gs_texrender_end texrender_reset gs_texrender_reset texrender_gettexture gs_texrender_get_texture GS_BUILDMIPMAPS GS_BUILD_MIPMAPS GS_RENDERTARGET GS_RENDER_TARGET gs_device_name gs_get_device_name gs_device_type gs_get_device_type gs_entercontext gs_enter_context gs_leavecontext gs_leave_context gs_getcontext gs_get_context gs_renderstart gs_render_start gs_renderstop gs_render_stop gs_rendersave gs_render_save gs_getinput gs_get_input gs_geteffect gs_get_effect gs_create_effect_from_file gs_effect_create_from_file gs_create_effect gs_effect_create gs_create_vertexshader_from_file gs_vertexshader_create_from_file gs_create_pixelshader_from_file gs_pixelshader_create_from_file gs_create_texture_from_file gs_texture_create_from_file gs_resetviewport gs_reset_viewport gs_set2dmode gs_set_2d_mode gs_set3dmode gs_set_3d_mode gs_create_swapchain gs_swapchain_create gs_getsize gs_get_size gs_getwidth gs_get_width gs_getheight gs_get_height gs_create_texture gs_texture_create gs_create_cubetexture gs_cubetexture_create gs_create_volumetexture gs_voltexture_create gs_create_zstencil gs_zstencil_create gs_create_stagesurface gs_stagesurface_create gs_create_samplerstate gs_samplerstate_create gs_create_vertexshader gs_vertexshader_create gs_create_pixelshader gs_pixelshader_create gs_create_vertexbuffer gs_vertexbuffer_create gs_create_indexbuffer gs_indexbuffer_create gs_gettexturetype gs_get_texture_type gs_load_defaultsamplerstate gs_load_default_samplerstate gs_getvertexshader gs_get_vertex_shader gs_getpixelshader gs_get_pixel_shader gs_getrendertarget gs_get_render_target gs_getzstenciltarget gs_get_zstencil_target gs_setrendertarget gs_set_render_target gs_setcuberendertarget gs_set_cube_render_target gs_beginscene gs_begin_scene gs_draw gs_draw gs_endscene gs_end_scene gs_setcullmode gs_set_cull_mode gs_getcullmode gs_get_cull_mode gs_enable_depthtest gs_enable_depth_test gs_enable_stenciltest gs_enable_stencil_test gs_enable_stencilwrite gs_enable_stencil_write gs_blendfunction gs_blend_function gs_depthfunction gs_depth_function gs_stencilfunction gs_stencil_function gs_stencilop gs_stencil_op gs_setviewport gs_set_viewport gs_getviewport gs_get_viewport gs_setscissorrect gs_set_scissor_rect gs_create_texture_from_iosurface gs_texture_create_from_iosurface gs_create_gdi_texture gs_texture_create_gdi gs_is_compressed_format gs_is_compressed_format gs_num_total_levels gs_get_total_levels texture_setimage gs_texture_set_image cubetexture_setimage gs_cubetexture_set_image swapchain_destroy gs_swapchain_destroy texture_destroy gs_texture_destroy texture_getwidth gs_texture_get_width texture_getheight gs_texture_get_height texture_getcolorformat gs_texture_get_color_format texture_map gs_texture_map texture_unmap gs_texture_unmap texture_isrect gs_texture_is_rect texture_getobj gs_texture_get_obj cubetexture_destroy gs_cubetexture_destroy cubetexture_getsize gs_cubetexture_get_size cubetexture_getcolorformat gs_cubetexture_get_color_format volumetexture_destroy gs_voltexture_destroy volumetexture_getwidth gs_voltexture_get_width volumetexture_getheight gs_voltexture_get_height volumetexture_getdepth gs_voltexture_getdepth volumetexture_getcolorformat gs_voltexture_get_color_format stagesurface_destroy gs_stagesurface_destroy stagesurface_getwidth gs_stagesurface_get_width stagesurface_getheight gs_stagesurface_get_height stagesurface_getcolorformat gs_stagesurface_get_color_format stagesurface_map gs_stagesurface_map stagesurface_unmap gs_stagesurface_unmap zstencil_destroy gs_zstencil_destroy samplerstate_destroy gs_samplerstate_destroy vertexbuffer_destroy gs_vertexbuffer_destroy vertexbuffer_flush gs_vertexbuffer_flush vertexbuffer_getdata gs_vertexbuffer_get_data indexbuffer_destroy gs_indexbuffer_destroy indexbuffer_flush gs_indexbuffer_flush indexbuffer_getdata gs_indexbuffer_get_data indexbuffer_numindices gs_indexbuffer_get_num_indices indexbuffer_gettype gs_indexbuffer_get_type texture_rebind_iosurface gs_texture_rebind_iosurface texture_get_dc gs_texture_get_dc texture_release_dc gs_texture_release_dc
519 lines
17 KiB
C
519 lines
17 KiB
C
/******************************************************************************
|
|
Copyright (C) 2013-2014 by Hugh Bailey <obs.jim@gmail.com>
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
******************************************************************************/
|
|
|
|
#pragma once
|
|
|
|
#include "util/c99defs.h"
|
|
#include "util/darray.h"
|
|
#include "util/circlebuf.h"
|
|
#include "util/dstr.h"
|
|
#include "util/threading.h"
|
|
#include "util/platform.h"
|
|
#include "callback/signal.h"
|
|
#include "callback/proc.h"
|
|
|
|
#include "graphics/graphics.h"
|
|
|
|
#include "media-io/audio-resampler.h"
|
|
#include "media-io/video-io.h"
|
|
#include "media-io/audio-io.h"
|
|
|
|
#include "obs.h"
|
|
|
|
#define NUM_TEXTURES 2
|
|
#define MICROSECOND_DEN 1000000
|
|
|
|
static inline int64_t packet_dts_usec(struct encoder_packet *packet)
|
|
{
|
|
return packet->dts * MICROSECOND_DEN / packet->timebase_den;
|
|
}
|
|
|
|
struct draw_callback {
|
|
void (*draw)(void *param, uint32_t cx, uint32_t cy);
|
|
void *param;
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
/* modules */
|
|
|
|
struct obs_module {
|
|
const char *file;
|
|
char *bin_path;
|
|
char *data_path;
|
|
void *module;
|
|
bool loaded;
|
|
|
|
bool (*load)(void);
|
|
void (*unload)(void);
|
|
void (*set_locale)(const char *locale);
|
|
void (*free_locale)(void);
|
|
uint32_t (*ver)(void);
|
|
void (*set_pointer)(obs_module_t module);
|
|
const char *(*name)(void);
|
|
const char *(*description)(void);
|
|
const char *(*author)(void);
|
|
|
|
struct obs_module *next;
|
|
};
|
|
|
|
extern void free_module(struct obs_module *mod);
|
|
|
|
struct obs_module_path {
|
|
char *bin;
|
|
char *data;
|
|
};
|
|
|
|
static inline void free_module_path(struct obs_module_path *omp)
|
|
{
|
|
if (omp) {
|
|
bfree(omp->bin);
|
|
bfree(omp->data);
|
|
}
|
|
}
|
|
|
|
static inline bool check_path(const char *data, const char *path,
|
|
struct dstr *output)
|
|
{
|
|
dstr_copy(output, path);
|
|
dstr_cat(output, data);
|
|
|
|
return os_file_exists(output->array);
|
|
}
|
|
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
/* views */
|
|
|
|
struct obs_view {
|
|
pthread_mutex_t channels_mutex;
|
|
obs_source_t channels[MAX_CHANNELS];
|
|
};
|
|
|
|
extern bool obs_view_init(struct obs_view *view);
|
|
extern void obs_view_free(struct obs_view *view);
|
|
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
/* displays */
|
|
|
|
struct obs_display {
|
|
bool size_changed;
|
|
uint32_t cx, cy;
|
|
gs_swapchain_t swap;
|
|
pthread_mutex_t draw_callbacks_mutex;
|
|
DARRAY(struct draw_callback) draw_callbacks;
|
|
|
|
struct obs_display *next;
|
|
struct obs_display **prev_next;
|
|
};
|
|
|
|
extern bool obs_display_init(struct obs_display *display,
|
|
struct gs_init_data *graphics_data);
|
|
extern void obs_display_free(struct obs_display *display);
|
|
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
/* core */
|
|
|
|
struct obs_core_video {
|
|
graphics_t graphics;
|
|
gs_stagesurf_t copy_surfaces[NUM_TEXTURES];
|
|
gs_texture_t render_textures[NUM_TEXTURES];
|
|
gs_texture_t output_textures[NUM_TEXTURES];
|
|
gs_texture_t convert_textures[NUM_TEXTURES];
|
|
bool textures_rendered[NUM_TEXTURES];
|
|
bool textures_output[NUM_TEXTURES];
|
|
bool textures_copied[NUM_TEXTURES];
|
|
bool textures_converted[NUM_TEXTURES];
|
|
struct obs_source_frame convert_frames[NUM_TEXTURES];
|
|
gs_effect_t default_effect;
|
|
gs_effect_t solid_effect;
|
|
gs_effect_t conversion_effect;
|
|
gs_stagesurf_t mapped_surface;
|
|
int cur_texture;
|
|
|
|
video_t video;
|
|
pthread_t video_thread;
|
|
bool thread_initialized;
|
|
|
|
bool gpu_conversion;
|
|
const char *conversion_tech;
|
|
uint32_t conversion_height;
|
|
uint32_t plane_offsets[3];
|
|
uint32_t plane_sizes[3];
|
|
uint32_t plane_linewidth[3];
|
|
|
|
uint32_t output_width;
|
|
uint32_t output_height;
|
|
uint32_t base_width;
|
|
uint32_t base_height;
|
|
|
|
struct obs_display main_display;
|
|
};
|
|
|
|
struct obs_core_audio {
|
|
/* TODO: sound output subsystem */
|
|
audio_t audio;
|
|
|
|
float user_volume;
|
|
float present_volume;
|
|
};
|
|
|
|
/* user sources, output channels, and displays */
|
|
struct obs_core_data {
|
|
pthread_mutex_t user_sources_mutex;
|
|
DARRAY(struct obs_source*) user_sources;
|
|
|
|
struct obs_source *first_source;
|
|
struct obs_display *first_display;
|
|
struct obs_output *first_output;
|
|
struct obs_encoder *first_encoder;
|
|
struct obs_service *first_service;
|
|
|
|
pthread_mutex_t sources_mutex;
|
|
pthread_mutex_t displays_mutex;
|
|
pthread_mutex_t outputs_mutex;
|
|
pthread_mutex_t encoders_mutex;
|
|
pthread_mutex_t services_mutex;
|
|
|
|
struct obs_view main_view;
|
|
|
|
long long unnamed_index;
|
|
|
|
volatile bool valid;
|
|
};
|
|
|
|
struct obs_core {
|
|
struct obs_module *first_module;
|
|
DARRAY(struct obs_module_path) module_paths;
|
|
|
|
DARRAY(struct obs_source_info) input_types;
|
|
DARRAY(struct obs_source_info) filter_types;
|
|
DARRAY(struct obs_source_info) transition_types;
|
|
DARRAY(struct obs_output_info) output_types;
|
|
DARRAY(struct obs_encoder_info) encoder_types;
|
|
DARRAY(struct obs_service_info) service_types;
|
|
DARRAY(struct obs_modal_ui) modal_ui_callbacks;
|
|
DARRAY(struct obs_modeless_ui) modeless_ui_callbacks;
|
|
|
|
signal_handler_t signals;
|
|
proc_handler_t procs;
|
|
|
|
char *locale;
|
|
|
|
/* segmented into multiple sub-structures to keep things a bit more
|
|
* clean and organized */
|
|
struct obs_core_video video;
|
|
struct obs_core_audio audio;
|
|
struct obs_core_data data;
|
|
};
|
|
|
|
extern struct obs_core *obs;
|
|
|
|
extern void *obs_video_thread(void *param);
|
|
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
/* obs shared context data */
|
|
|
|
struct obs_context_data {
|
|
char *name;
|
|
void *data;
|
|
obs_data_t settings;
|
|
signal_handler_t signals;
|
|
proc_handler_t procs;
|
|
|
|
DARRAY(char*) rename_cache;
|
|
pthread_mutex_t rename_cache_mutex;
|
|
|
|
pthread_mutex_t *mutex;
|
|
struct obs_context_data *next;
|
|
struct obs_context_data **prev_next;
|
|
};
|
|
|
|
extern bool obs_context_data_init(
|
|
struct obs_context_data *context,
|
|
obs_data_t settings,
|
|
const char *name);
|
|
extern void obs_context_data_free(struct obs_context_data *context);
|
|
|
|
extern void obs_context_data_insert(struct obs_context_data *context,
|
|
pthread_mutex_t *mutex, void *first);
|
|
extern void obs_context_data_remove(struct obs_context_data *context);
|
|
|
|
extern void obs_context_data_setname(struct obs_context_data *context,
|
|
const char *name);
|
|
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
/* sources */
|
|
|
|
struct obs_source {
|
|
struct obs_context_data context;
|
|
struct obs_source_info info;
|
|
volatile long refs;
|
|
|
|
/* indicates ownership of the info.id buffer */
|
|
bool owns_info_id;
|
|
|
|
/* signals to call the source update in the video thread */
|
|
bool defer_update;
|
|
|
|
/* ensures show/hide are only called once */
|
|
volatile long show_refs;
|
|
|
|
/* ensures activate/deactivate are only called once */
|
|
volatile long activate_refs;
|
|
|
|
/* prevents infinite recursion when enumerating sources */
|
|
volatile long enum_refs;
|
|
|
|
/* used to indicate that the source has been removed and all
|
|
* references to it should be released (not exactly how I would prefer
|
|
* to handle things but it's the best option) */
|
|
bool removed;
|
|
|
|
/* timing (if video is present, is based upon video) */
|
|
volatile bool timing_set;
|
|
volatile uint64_t timing_adjust;
|
|
uint64_t next_audio_ts_min;
|
|
uint64_t last_frame_ts;
|
|
uint64_t last_sys_timestamp;
|
|
|
|
/*
|
|
* audio/video timestamp synchronization reference counter
|
|
*
|
|
* if audio goes outside of expected timing bounds, this number will
|
|
* be deremented.
|
|
*
|
|
* if video goes outside of expecting timing bounds, this number will
|
|
* be incremented.
|
|
*
|
|
* when this reference counter is at 0, it means ths audio is
|
|
* synchronized with the video and it is safe to play. when it's not
|
|
* 0, it means that audio and video are desynchronized, and thus not
|
|
* safe to play. this just generally ensures synchronization between
|
|
* audio/video when timing somehow becomes 'reset'.
|
|
*
|
|
* XXX: may be an overly cautious check
|
|
*/
|
|
volatile long av_sync_ref;
|
|
|
|
/* audio */
|
|
bool audio_failed;
|
|
struct resample_info sample_info;
|
|
audio_resampler_t resampler;
|
|
audio_line_t audio_line;
|
|
pthread_mutex_t audio_mutex;
|
|
struct obs_audio_data audio_data;
|
|
size_t audio_storage_size;
|
|
float user_volume;
|
|
float present_volume;
|
|
int64_t sync_offset;
|
|
|
|
/* audio levels*/
|
|
float vol_mag;
|
|
float vol_max;
|
|
float vol_peak;
|
|
size_t vol_update_count;
|
|
|
|
/* transition volume is meant to store the sum of transitioning volumes
|
|
* of a source, i.e. if a source is within both the "to" and "from"
|
|
* targets of a transition, it would add both volumes to this variable,
|
|
* and then when the transition frame is complete, is applies the value
|
|
* to the presentation volume. */
|
|
float transition_volume;
|
|
|
|
/* async video data */
|
|
gs_texture_t async_texture;
|
|
gs_texrender_t async_convert_texrender;
|
|
bool async_gpu_conversion;
|
|
enum video_format async_format;
|
|
enum gs_color_format async_texture_format;
|
|
float async_color_matrix[16];
|
|
bool async_full_range;
|
|
float async_color_range_min[3];
|
|
float async_color_range_max[3];
|
|
int async_plane_offset[2];
|
|
bool async_flip;
|
|
DARRAY(struct obs_source_frame*)video_frames;
|
|
pthread_mutex_t video_mutex;
|
|
uint32_t async_width;
|
|
uint32_t async_height;
|
|
uint32_t async_convert_width;
|
|
uint32_t async_convert_height;
|
|
|
|
/* filters */
|
|
struct obs_source *filter_parent;
|
|
struct obs_source *filter_target;
|
|
DARRAY(struct obs_source*) filters;
|
|
pthread_mutex_t filter_mutex;
|
|
gs_texrender_t filter_texrender;
|
|
bool rendering_filter;
|
|
};
|
|
|
|
extern const struct obs_source_info *find_source(struct darray *list,
|
|
const char *id);
|
|
extern bool obs_source_init_context(struct obs_source *source,
|
|
obs_data_t settings, const char *name);
|
|
extern bool obs_source_init(struct obs_source *source,
|
|
const struct obs_source_info *info);
|
|
|
|
extern void obs_source_destroy(struct obs_source *source);
|
|
|
|
enum view_type {
|
|
MAIN_VIEW,
|
|
AUX_VIEW
|
|
};
|
|
|
|
extern void obs_source_activate(obs_source_t source, enum view_type type);
|
|
extern void obs_source_deactivate(obs_source_t source, enum view_type type);
|
|
extern void obs_source_video_tick(obs_source_t source, float seconds);
|
|
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
/* outputs */
|
|
|
|
struct obs_output {
|
|
struct obs_context_data context;
|
|
struct obs_output_info info;
|
|
|
|
bool received_video;
|
|
bool received_audio;
|
|
int64_t first_video_ts;
|
|
int64_t video_offset;
|
|
int64_t audio_offset;
|
|
int64_t highest_audio_ts;
|
|
int64_t highest_video_ts;
|
|
pthread_mutex_t interleaved_mutex;
|
|
DARRAY(struct encoder_packet) interleaved_packets;
|
|
|
|
int reconnect_retry_sec;
|
|
int reconnect_retry_max;
|
|
int reconnect_retries;
|
|
bool reconnecting;
|
|
pthread_t reconnect_thread;
|
|
os_event_t reconnect_stop_event;
|
|
volatile bool reconnect_thread_active;
|
|
|
|
int total_frames;
|
|
|
|
bool active;
|
|
video_t video;
|
|
audio_t audio;
|
|
obs_encoder_t video_encoder;
|
|
obs_encoder_t audio_encoder;
|
|
obs_service_t service;
|
|
|
|
bool video_conversion_set;
|
|
bool audio_conversion_set;
|
|
struct video_scale_info video_conversion;
|
|
struct audio_convert_info audio_conversion;
|
|
|
|
bool valid;
|
|
};
|
|
|
|
extern const struct obs_output_info *find_output(const char *id);
|
|
|
|
extern void obs_output_remove_encoder(struct obs_output *output,
|
|
struct obs_encoder *encoder);
|
|
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
/* encoders */
|
|
|
|
struct encoder_callback {
|
|
bool sent_first_packet;
|
|
void (*new_packet)(void *param, struct encoder_packet *packet);
|
|
void *param;
|
|
};
|
|
|
|
struct obs_encoder {
|
|
struct obs_context_data context;
|
|
struct obs_encoder_info info;
|
|
|
|
uint32_t samplerate;
|
|
size_t planes;
|
|
size_t blocksize;
|
|
size_t framesize;
|
|
size_t framesize_bytes;
|
|
|
|
bool active;
|
|
|
|
uint32_t timebase_num;
|
|
uint32_t timebase_den;
|
|
|
|
int64_t cur_pts;
|
|
|
|
struct circlebuf audio_input_buffer[MAX_AV_PLANES];
|
|
uint8_t *audio_output_buffer[MAX_AV_PLANES];
|
|
|
|
/* if a video encoder is paired with an audio encoder, make it start
|
|
* up at the specific timestamp. if this is the audio encoder,
|
|
* wait_for_video makes it wait until it's ready to sync up with
|
|
* video */
|
|
bool wait_for_video;
|
|
struct obs_encoder *paired_encoder;
|
|
uint64_t start_ts;
|
|
|
|
pthread_mutex_t outputs_mutex;
|
|
DARRAY(obs_output_t) outputs;
|
|
|
|
bool destroy_on_stop;
|
|
|
|
/* stores the video/audio media output pointer. video_t or audio_t */
|
|
void *media;
|
|
|
|
pthread_mutex_t callbacks_mutex;
|
|
DARRAY(struct encoder_callback) callbacks;
|
|
};
|
|
|
|
extern struct obs_encoder_info *find_encoder(const char *id);
|
|
|
|
extern bool obs_encoder_initialize(obs_encoder_t encoder);
|
|
|
|
extern void obs_encoder_start(obs_encoder_t encoder,
|
|
void (*new_packet)(void *param, struct encoder_packet *packet),
|
|
void *param);
|
|
extern void obs_encoder_stop(obs_encoder_t encoder,
|
|
void (*new_packet)(void *param, struct encoder_packet *packet),
|
|
void *param);
|
|
|
|
extern void obs_encoder_add_output(struct obs_encoder *encoder,
|
|
struct obs_output *output);
|
|
extern void obs_encoder_remove_output(struct obs_encoder *encoder,
|
|
struct obs_output *output);
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
/* services */
|
|
|
|
struct obs_service {
|
|
struct obs_context_data context;
|
|
struct obs_service_info info;
|
|
|
|
bool active;
|
|
bool destroy;
|
|
struct obs_output *output;
|
|
};
|
|
|
|
extern const struct obs_service_info *find_service(const char *id);
|
|
|
|
extern void obs_service_activate(struct obs_service *service);
|
|
extern void obs_service_deactivate(struct obs_service *service, bool remove);
|
|
extern bool obs_service_initialize(struct obs_service *service,
|
|
struct obs_output *output);
|