0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-20 04:42:18 +02:00

libobs: Add callback for main texture rendered

Useful for redirecting main texture to DeckLink output for example.
This commit is contained in:
jpark37 2022-09-10 11:29:54 -07:00 committed by Jim
parent feae65c472
commit e32c2c1427
5 changed files with 51 additions and 3 deletions

View File

@ -574,6 +574,14 @@ Video, Audio, and Graphics
---------------------
.. function:: void obs_add_main_rendered_callback(void (*rendered)(void *param), void *param)
void obs_remove_main_rendered_callback(void (*rendered)(void *param), void *param)
Adds/removes a main rendered callback. Allows using the result of
the main stream/recording output.
---------------------
.. function:: void obs_add_raw_video_callback(const struct video_scale_info *conversion, void (*callback)(void *param, struct video_data *frame), void *param)
void obs_remove_raw_video_callback(void (*callback)(void *param, struct video_data *frame), void *param)

View File

@ -67,6 +67,11 @@ struct draw_callback {
void *param;
};
struct rendered_callback {
void (*rendered)(void *param);
void *param;
};
/* ------------------------------------------------------------------------- */
/* validity checks */
@ -401,6 +406,7 @@ struct obs_core_data {
pthread_mutex_t audio_sources_mutex;
pthread_mutex_t draw_callbacks_mutex;
DARRAY(struct draw_callback) draw_callbacks;
DARRAY(struct rendered_callback) rendered_callbacks;
DARRAY(struct tick_callback) tick_callbacks;
struct obs_view main_view;

View File

@ -144,9 +144,8 @@ static inline void render_main_texture(struct obs_core_video_mix *video)
pthread_mutex_lock(&obs->data.draw_callbacks_mutex);
for (size_t i = obs->data.draw_callbacks.num; i > 0; i--) {
struct draw_callback *callback;
callback = obs->data.draw_callbacks.array + (i - 1);
struct draw_callback *const callback =
obs->data.draw_callbacks.array + (i - 1);
callback->draw(callback->param, base_width, base_height);
}
@ -156,6 +155,16 @@ static inline void render_main_texture(struct obs_core_video_mix *video)
video->texture_rendered = true;
pthread_mutex_lock(&obs->data.draw_callbacks_mutex);
for (size_t i = 0; i < obs->data.rendered_callbacks.num; ++i) {
struct rendered_callback *const callback =
&obs->data.rendered_callbacks.array[i];
callback->rendered(callback->param);
}
pthread_mutex_unlock(&obs->data.draw_callbacks_mutex);
GS_DEBUG_MARKER_END();
profile_end(render_main_texture_name);
}

View File

@ -1076,6 +1076,7 @@ static void obs_free_data(void)
pthread_mutex_destroy(&data->services_mutex);
pthread_mutex_destroy(&data->draw_callbacks_mutex);
da_free(data->draw_callbacks);
da_free(data->rendered_callbacks);
da_free(data->tick_callbacks);
obs_data_release(data->private_data);
@ -3069,6 +3070,25 @@ void obs_remove_main_render_callback(void (*draw)(void *param, uint32_t cx,
pthread_mutex_unlock(&obs->data.draw_callbacks_mutex);
}
void obs_add_main_rendered_callback(void (*rendered)(void *param), void *param)
{
struct rendered_callback data = {rendered, param};
pthread_mutex_lock(&obs->data.draw_callbacks_mutex);
da_insert(obs->data.rendered_callbacks, 0, &data);
pthread_mutex_unlock(&obs->data.draw_callbacks_mutex);
}
void obs_remove_main_rendered_callback(void (*rendered)(void *param),
void *param)
{
struct rendered_callback data = {rendered, param};
pthread_mutex_lock(&obs->data.draw_callbacks_mutex);
da_erase_item(obs->data.rendered_callbacks, &data);
pthread_mutex_unlock(&obs->data.draw_callbacks_mutex);
}
uint32_t obs_get_total_frames(void)
{
return obs->video.total_frames;

View File

@ -841,6 +841,11 @@ EXPORT void obs_add_main_render_callback(void (*draw)(void *param, uint32_t cx,
EXPORT void obs_remove_main_render_callback(
void (*draw)(void *param, uint32_t cx, uint32_t cy), void *param);
EXPORT void obs_add_main_rendered_callback(void (*rendered)(void *param),
void *param);
EXPORT void obs_remove_main_rendered_callback(void (*rendered)(void *param),
void *param);
EXPORT void obs_add_raw_video_callback(
const struct video_scale_info *conversion,
void (*callback)(void *param, struct video_data *frame), void *param);