天天看点

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