浏览代码

libobs: Add get_defaults2 and get_properties2 for encoders

Adds optional alternate functions to allow passing the encoder type_data
to reduce code duplication.

Closes obsproject/obs-studio#1541
Michael Fabian 'Xaymar' Dirks 7 年之前
父节点
当前提交
93549ea17c
共有 2 个文件被更改,包括 37 次插入4 次删除
  1. 20 4
      libobs/obs-encoder.c
  2. 17 0
      libobs/obs-encoder.h

+ 20 - 4
libobs/obs-encoder.c

@@ -282,8 +282,11 @@ void obs_encoder_set_name(obs_encoder_t *encoder, const char *name)
 static inline obs_data_t *get_defaults(const struct obs_encoder_info *info)
 static inline obs_data_t *get_defaults(const struct obs_encoder_info *info)
 {
 {
 	obs_data_t *settings = obs_data_create();
 	obs_data_t *settings = obs_data_create();
-	if (info->get_defaults)
+	if (info->get_defaults2) {
+		info->get_defaults2(settings, info->type_data);
+	} else if (info->get_defaults) {
 		info->get_defaults(settings);
 		info->get_defaults(settings);
+	}
 	return settings;
 	return settings;
 }
 }
 
 
@@ -304,11 +307,16 @@ obs_data_t *obs_encoder_get_defaults(const obs_encoder_t *encoder)
 obs_properties_t *obs_get_encoder_properties(const char *id)
 obs_properties_t *obs_get_encoder_properties(const char *id)
 {
 {
 	const struct obs_encoder_info *ei = find_encoder(id);
 	const struct obs_encoder_info *ei = find_encoder(id);
-	if (ei && ei->get_properties) {
+	if (ei && (ei->get_properties || ei->get_properties2)) {
 		obs_data_t       *defaults = get_defaults(ei);
 		obs_data_t       *defaults = get_defaults(ei);
 		obs_properties_t *properties;
 		obs_properties_t *properties;
 
 
-		properties = ei->get_properties(NULL);
+		if (ei->get_properties2) {
+			properties = ei->get_properties2(NULL, ei->type_data);
+		} else if (ei->get_properties) {
+			properties = ei->get_properties(NULL);
+		}
+
 		obs_properties_apply_settings(properties, defaults);
 		obs_properties_apply_settings(properties, defaults);
 		obs_data_release(defaults);
 		obs_data_release(defaults);
 		return properties;
 		return properties;
@@ -321,12 +329,20 @@ obs_properties_t *obs_encoder_properties(const obs_encoder_t *encoder)
 	if (!obs_encoder_valid(encoder, "obs_encoder_properties"))
 	if (!obs_encoder_valid(encoder, "obs_encoder_properties"))
 		return NULL;
 		return NULL;
 
 
-	if (encoder->info.get_properties) {
+	if (encoder->info.get_properties2) {
+		obs_properties_t *props;
+		props = encoder->info.get_properties2(encoder->context.data,
+				encoder->info.type_data);
+		obs_properties_apply_settings(props, encoder->context.settings);
+		return props;
+
+	} else if (encoder->info.get_properties) {
 		obs_properties_t *props;
 		obs_properties_t *props;
 		props = encoder->info.get_properties(encoder->context.data);
 		props = encoder->info.get_properties(encoder->context.data);
 		obs_properties_apply_settings(props, encoder->context.settings);
 		obs_properties_apply_settings(props, encoder->context.settings);
 		return props;
 		return props;
 	}
 	}
+
 	return NULL;
 	return NULL;
 }
 }
 
 

+ 17 - 0
libobs/obs-encoder.h

@@ -234,6 +234,23 @@ struct obs_encoder_info {
 	void (*free_type_data)(void *type_data);
 	void (*free_type_data)(void *type_data);
 
 
 	uint32_t caps;
 	uint32_t caps;
+
+	/**
+	 * Gets the default settings for this encoder
+	 *
+	 * @param[out]  settings  Data to assign default settings to
+	 * @param[in]   typedata  Type Data
+	 */
+	void (*get_defaults2)(obs_data_t *settings, void *type_data);
+
+	/**
+	 * Gets the property information of this encoder
+	 *
+	 * @param[in]   data      Pointer from create (or null)
+	 * @param[in]   typedata  Type Data
+	 * @return                The properties data
+	 */
+	obs_properties_t *(*get_properties2)(void *data, void *type_data);
 };
 };
 
 
 EXPORT void obs_register_encoder_s(const struct obs_encoder_info *info,
 EXPORT void obs_register_encoder_s(const struct obs_encoder_info *info,