天天看點

OBS源碼解析一之obs_data

同僚提了個小需求,要求更改OBS的預設配置,并且每次修改完之後都不用儲存使用者的配置,就是定制化配置了,唯一預設配置。

開始探索OBS源碼,看了一下需要修改的配置檔案,主要是兩個,一個basic.ini,一個推流配置的json檔案。根據這兩個檔案以及log日志去分析源碼。

(一) .obs_data分析

官網文檔原話如下:

Settings (see libobs/obs-data.h) are used to get or set settings data typically associated with libobs objects, and can then be saved and loaded via Json text.

意思是配置是通過obs-data.h檔案與libobs objects進行關聯,以及儲存了json配置檔案,是以修改推流部分看的就是這裡的代碼。

obs_data結構體:

struct obs_data {
	volatile long ref;
	char *json;
	struct obs_data_item *first_item;//連結清單
};
           
struct obs_data_item {
	volatile long ref;
	struct obs_data *parent;
	struct obs_data_item *next;
	enum obs_data_type type;
	size_t name_len;
	size_t data_len;
	size_t data_size;
	size_t default_len;
	size_t default_size;
	size_t autoselect_size;
	size_t capacity;
};
           

上面兩個結構體是obs_data中的兩個基本結構體,可以通過調用obs_data_create()建立obs_data_t ,内部是配置設定堆上的空間,是以使用完之後要調用obs_data_release() 進行釋放。

/* Set functions */
EXPORT void obs_data_set_string(obs_data_t *data, const char *name, const char *val);
EXPORT void obs_data_set_int(obs_data_t *data, const char *name, long long val);
EXPORT void obs_data_set_double(obs_data_t *data, const char *name, double val);
EXPORT void obs_data_set_bool(obs_data_t *data, const char *name, bool val);
EXPORT void obs_data_set_obj(obs_data_t *data, const char *name, obs_data_t *obj);
EXPORT void obs_data_set_array(obs_data_t *data, const char *name, obs_data_array_t *array);
           

通過上述API設定obs_data資料,内部實作主要如下,主要是連結清單的操作。

static void set_item_data(struct obs_data *data, struct obs_data_item **item,
			  const char *name, const void *ptr, size_t size,
			  enum obs_data_type type, bool default_data,
			  bool autoselect_data)
{
	obs_data_item_t *new_item = NULL;

	if ((!item || (item && !*item)) && data) {
		new_item = obs_data_item_create(name, ptr, size, type,
						default_data, autoselect_data);

		obs_data_item_t *prev = obs_data_first(data);
		obs_data_item_t *next = obs_data_first(data);
		obs_data_item_next(&next);
		for (; prev && next;
		     obs_data_item_next(&prev), obs_data_item_next(&next)) {
			if (strcmp(get_item_name(next), name) > 0)
				break;
		}

		new_item->parent = data;
		if (prev && strcmp(get_item_name(prev), name) < 0) {
			prev->next = new_item;
			new_item->next = next;

		} else {
			data->first_item = new_item;
			new_item->next = prev;
		}

		if (!prev)
			data->first_item = new_item;

		obs_data_item_release(&prev);
		obs_data_item_release(&next);

	} else if (default_data) {
		obs_data_item_set_default_data(item, ptr, size, type);
	} else if (autoselect_data) {
		obs_data_item_set_autoselect_data(item, ptr, size, type);
	} else {
		obs_data_item_setdata(item, ptr, size, type);
	}
}
           

官網文檔位址:https://obsproject.com/docs/plugins.html#settings

同僚要求修改的設定部分推流的預設配置,是以根據這部分代碼,主要修改了推流對應的字段。

OBS