浏览代码

libobs: Deprecate obs object addref functions

Deprecates:
obs_source_addref()
obs_output_addref()
obs_encoder_addref()
obs_service_addref()
obs_scene_addref()

These functions should be considered unsafe and not used. Instead, use:
obs_source_get_ref()
obs_output_get_ref()
obs_encoder_get_ref()
obs_service_get_ref()
obs_scene_get_ref()

These functions return a pointer to the incremented object only if the
object is still valid, otherwise they will return null, indicating that
the object is no longer valid or is unsafe to use.

The reason why this is being done is because certain third party plugins
seem to be using addref, and are somehow managing to call addref on
sources that have already been fully released. For the sake of safety,
almost all usage of these functions within OBS have also been replaced
as well.
Jim 3 年之前
父节点
当前提交
03d9bda387

+ 1 - 0
deps/obs-scripting/obslua/obslua.i

@@ -34,6 +34,7 @@
 
 
 #define DEPRECATED_START
 #define DEPRECATED_START
 #define DEPRECATED_END
 #define DEPRECATED_END
+#define OBS_EXTERNAL_DEPRECATED
 #define EXPORT
 #define EXPORT
 
 
 %rename(blog) wrap_blog;
 %rename(blog) wrap_blog;

+ 1 - 0
deps/obs-scripting/obspython/obspython.i

@@ -34,6 +34,7 @@
 
 
 #define DEPRECATED_START
 #define DEPRECATED_START
 #define DEPRECATED_END
 #define DEPRECATED_END
+#define OBS_EXTERNAL_DEPRECATED
 #define EXPORT
 #define EXPORT
 
 
 %rename(blog) wrap_blog;
 %rename(blog) wrap_blog;

+ 10 - 0
docs/sphinx/reference-encoders.rst

@@ -326,6 +326,16 @@ General Encoder Functions
    Adds/releases a reference to an encoder.  When the last reference is
    Adds/releases a reference to an encoder.  When the last reference is
    released, the encoder is destroyed.
    released, the encoder is destroyed.
 
 
+.. deprecated:: 27.2.0
+   Use :c:func:`obs_encoder_get_ref()` instead.
+
+---------------------
+
+.. function:: obs_encoder_t *obs_encoder_get_ref(obs_encoder_t *encoder)
+
+   Returns an incremented reference if still valid, otherwise returns
+   *NULL*.
+
 ---------------------
 ---------------------
 
 
 .. function:: obs_weak_encoder_t *obs_encoder_get_weak_encoder(obs_encoder_t *encoder)
 .. function:: obs_weak_encoder_t *obs_encoder_get_weak_encoder(obs_encoder_t *encoder)

+ 10 - 0
docs/sphinx/reference-outputs.rst

@@ -339,6 +339,16 @@ General Output Functions
    Adds/releases a reference to an output.  When the last reference is
    Adds/releases a reference to an output.  When the last reference is
    released, the output is destroyed.
    released, the output is destroyed.
 
 
+.. deprecated:: 27.2.0
+   Use :c:func:`obs_output_get_ref()` instead.
+
+---------------------
+
+.. function:: obs_output_t *obs_output_get_ref(obs_output_t *output)
+
+   Returns an incremented reference if still valid, otherwise returns
+   *NULL*.
+
 ---------------------
 ---------------------
 
 
 .. function:: obs_weak_output_t *obs_output_get_weak_output(obs_output_t *output)
 .. function:: obs_weak_output_t *obs_output_get_weak_output(obs_output_t *output)

+ 10 - 0
docs/sphinx/reference-scenes.rst

@@ -201,6 +201,16 @@ General Scene Functions
 
 
    Adds/releases a reference to a scene.
    Adds/releases a reference to a scene.
 
 
+.. deprecated:: 27.2.0
+   Use :c:func:`obs_scene_get_ref()` instead.
+
+---------------------
+
+.. function:: obs_scene_t *obs_scene_get_ref(obs_scene_t *scene)
+
+   Returns an incremented reference if still valid, otherwise returns
+   *NULL*.
+
 ---------------------
 ---------------------
 
 
 .. function:: obs_sceneitem_t *obs_scene_add(obs_scene_t *scene, obs_source_t *source)
 .. function:: obs_sceneitem_t *obs_scene_add(obs_scene_t *scene, obs_source_t *source)

+ 10 - 0
docs/sphinx/reference-services.rst

@@ -185,6 +185,16 @@ General Service Functions
    Adds/releases a reference to a service.  When the last reference is
    Adds/releases a reference to a service.  When the last reference is
    released, the service is destroyed.
    released, the service is destroyed.
 
 
+.. deprecated:: 27.2.0
+   Use :c:func:`obs_service_get_ref()` instead.
+
+---------------------
+
+.. function:: obs_service_t *obs_service_get_ref(obs_service_t *service)
+
+   Returns an incremented reference if still valid, otherwise returns
+   *NULL*.
+
 ---------------------
 ---------------------
 
 
 .. function:: obs_weak_service_t *obs_service_get_weak_service(obs_service_t *service)
 .. function:: obs_weak_service_t *obs_service_get_weak_service(obs_service_t *service)

+ 11 - 1
docs/sphinx/reference-sources.rst

@@ -165,7 +165,7 @@ Source Definition Structure (obs_source_info)
    - **OBS_SOURCE_SRGB** - Source understands SRGB rendering
    - **OBS_SOURCE_SRGB** - Source understands SRGB rendering
 
 
    - **OBS_SOURCE_CAP_DONT_SHOW_PROPERTIES** - Source type prefers not
    - **OBS_SOURCE_CAP_DONT_SHOW_PROPERTIES** - Source type prefers not
-     to have its properties shown on creation (prefers to rely on 
+     to have its properties shown on creation (prefers to rely on
      defaults first)
      defaults first)
 
 
 .. member:: const char *(*obs_source_info.get_name)(void *type_data)
 .. member:: const char *(*obs_source_info.get_name)(void *type_data)
@@ -737,6 +737,16 @@ General Source Functions
    Adds/releases a reference to a source.  When the last reference is
    Adds/releases a reference to a source.  When the last reference is
    released, the source is destroyed.
    released, the source is destroyed.
 
 
+.. deprecated:: 27.2.0
+   Use :c:func:`obs_source_get_ref()` instead.
+
+---------------------
+
+.. function:: obs_source_t *obs_source_get_ref(obs_source_t *source)
+
+   Returns an incremented reference if still valid, otherwise returns
+   *NULL*.
+
 ---------------------
 ---------------------
 
 
 .. function:: obs_weak_source_t *obs_source_get_weak_source(obs_source_t *source)
 .. function:: obs_weak_source_t *obs_source_get_weak_source(obs_source_t *source)

+ 2 - 0
libobs/CMakeLists.txt

@@ -11,6 +11,8 @@ if (NOT "${FFMPEG_AVCODEC_LIBRARIES}" STREQUAL "")
 	list(REMOVE_ITEM FFMPEG_LIBRARIES ${FFMPEG_AVCODEC_LIBRARIES})
 	list(REMOVE_ITEM FFMPEG_LIBRARIES ${FFMPEG_AVCODEC_LIBRARIES})
 endif()
 endif()
 
 
+add_definitions(-DIS_LIBOBS=1)
+
 if(DEBUG_FFMPEG_MUX)
 if(DEBUG_FFMPEG_MUX)
 	add_definitions(-DSHOW_SUBPROCESSES)
 	add_definitions(-DSHOW_SUBPROCESSES)
 endif()
 endif()

+ 5 - 5
libobs/obs.h

@@ -919,7 +919,7 @@ EXPORT obs_source_t *obs_source_duplicate(obs_source_t *source,
  * Adds/releases a reference to a source.  When the last reference is
  * Adds/releases a reference to a source.  When the last reference is
  * released, the source is destroyed.
  * released, the source is destroyed.
  */
  */
-EXPORT void obs_source_addref(obs_source_t *source);
+OBS_EXTERNAL_DEPRECATED EXPORT void obs_source_addref(obs_source_t *source);
 EXPORT void obs_source_release(obs_source_t *source);
 EXPORT void obs_source_release(obs_source_t *source);
 
 
 EXPORT void obs_weak_source_addref(obs_weak_source_t *weak);
 EXPORT void obs_weak_source_addref(obs_weak_source_t *weak);
@@ -1590,7 +1590,7 @@ enum obs_scene_duplicate_type {
 EXPORT obs_scene_t *obs_scene_duplicate(obs_scene_t *scene, const char *name,
 EXPORT obs_scene_t *obs_scene_duplicate(obs_scene_t *scene, const char *name,
 					enum obs_scene_duplicate_type type);
 					enum obs_scene_duplicate_type type);
 
 
-EXPORT void obs_scene_addref(obs_scene_t *scene);
+OBS_EXTERNAL_DEPRECATED EXPORT void obs_scene_addref(obs_scene_t *scene);
 EXPORT void obs_scene_release(obs_scene_t *scene);
 EXPORT void obs_scene_release(obs_scene_t *scene);
 
 
 EXPORT obs_scene_t *obs_scene_get_ref(obs_scene_t *scene);
 EXPORT obs_scene_t *obs_scene_get_ref(obs_scene_t *scene);
@@ -1869,7 +1869,7 @@ EXPORT obs_output_t *obs_output_create(const char *id, const char *name,
  * Adds/releases a reference to an output.  When the last reference is
  * Adds/releases a reference to an output.  When the last reference is
  * released, the output is destroyed.
  * released, the output is destroyed.
  */
  */
-EXPORT void obs_output_addref(obs_output_t *output);
+OBS_EXTERNAL_DEPRECATED EXPORT void obs_output_addref(obs_output_t *output);
 EXPORT void obs_output_release(obs_output_t *output);
 EXPORT void obs_output_release(obs_output_t *output);
 
 
 EXPORT void obs_weak_output_addref(obs_weak_output_t *weak);
 EXPORT void obs_weak_output_addref(obs_weak_output_t *weak);
@@ -2160,7 +2160,7 @@ EXPORT obs_encoder_t *obs_audio_encoder_create(const char *id, const char *name,
  * Adds/releases a reference to an encoder.  When the last reference is
  * Adds/releases a reference to an encoder.  When the last reference is
  * released, the encoder is destroyed.
  * released, the encoder is destroyed.
  */
  */
-EXPORT void obs_encoder_addref(obs_encoder_t *encoder);
+OBS_EXTERNAL_DEPRECATED EXPORT void obs_encoder_addref(obs_encoder_t *encoder);
 EXPORT void obs_encoder_release(obs_encoder_t *encoder);
 EXPORT void obs_encoder_release(obs_encoder_t *encoder);
 
 
 EXPORT void obs_weak_encoder_addref(obs_weak_encoder_t *weak);
 EXPORT void obs_weak_encoder_addref(obs_weak_encoder_t *weak);
@@ -2319,7 +2319,7 @@ EXPORT obs_service_t *obs_service_create_private(const char *id,
  * Adds/releases a reference to a service.  When the last reference is
  * Adds/releases a reference to a service.  When the last reference is
  * released, the service is destroyed.
  * released, the service is destroyed.
  */
  */
-EXPORT void obs_service_addref(obs_service_t *service);
+OBS_EXTERNAL_DEPRECATED EXPORT void obs_service_addref(obs_service_t *service);
 EXPORT void obs_service_release(obs_service_t *service);
 EXPORT void obs_service_release(obs_service_t *service);
 
 
 EXPORT void obs_weak_service_addref(obs_weak_service_t *weak);
 EXPORT void obs_weak_service_addref(obs_weak_service_t *weak);

+ 6 - 0
libobs/util/c99defs.h

@@ -33,6 +33,12 @@
 #define FORCE_INLINE inline __attribute__((always_inline))
 #define FORCE_INLINE inline __attribute__((always_inline))
 #endif
 #endif
 
 
+#if defined(IS_LIBOBS) || defined(SWIG)
+#define OBS_EXTERNAL_DEPRECATED
+#else
+#define OBS_EXTERNAL_DEPRECATED OBS_DEPRECATED
+#endif
+
 #ifdef _MSC_VER
 #ifdef _MSC_VER
 #define EXPORT __declspec(dllexport)
 #define EXPORT __declspec(dllexport)
 #else
 #else