Przeglądaj źródła

libobs: Add callback for main texture rendered

Useful for redirecting main texture to DeckLink output for example.
jpark37 3 lat temu
rodzic
commit
e32c2c1427
5 zmienionych plików z 51 dodań i 3 usunięć
  1. 8 0
      docs/sphinx/reference-core.rst
  2. 6 0
      libobs/obs-internal.h
  3. 12 3
      libobs/obs-video.c
  4. 20 0
      libobs/obs.c
  5. 5 0
      libobs/obs.h

+ 8 - 0
docs/sphinx/reference-core.rst

@@ -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)
 

+ 6 - 0
libobs/obs-internal.h

@@ -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;

+ 12 - 3
libobs/obs-video.c

@@ -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);
 }

+ 20 - 0
libobs/obs.c

@@ -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;

+ 5 - 0
libobs/obs.h

@@ -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);