obs-studio 源码学习 obs.h

obs.h 引用头文件介绍

c99defs.h:这个头文件提供了一些 C99 标准的定义和声明,包括一些常用的宏定义和类型定义,用于提高代码的可移植性和兼容性。

bmem.h:这个头文件提供了对内存分配和管理的功能,包括一些内存分配和释放的函数和宏定义,用于方便地进行内存操作。

profiler.h:这个头文件提供了性能分析和调试的功能,包括一些性能分析和调试的函数和宏定义,用于分析和优化程序的性能。

text-lookup.h:这个头文件提供了对文本查找和处理的功能,包括一些文本查找和处理的函数和宏定义,用于方便地处理文本数据。

graphics.h:这个头文件提供了对图形处理的功能,包括一些图形处理的函数和宏定义,用于处理图形数据和图形显示。

vec2.h 和 vec3.h:这两个头文件提供了对二维向量和三维向量的定义和操作,包括向量的创建、计算、转换等功能。

audio-io.h 和 video-io.h:这两个头文件提供了对音频和视频输入输出的功能,包括音频和视频的采集、处理、编码、解码等功能。

signal.h 和 proc.h:这两个头文件提供了对回调函数和信号处理的功能,包括对信号的发送、接收和处理等功能。

obs-config.h 和 obs-defs.h:这两个头文件提供了对 OBS Studio 配置和定义的功能,包括对配置文件的读取、写入和管理等功能。

obs-data.h 和 obs-properties.h:这两个头文件提供了对 OBS Studio 数据和属性的功能,包括对数据的读取、写入和管理,以及对属性的定义和操作等功能。

obs-interaction.h:这个头文件提供了对 OBS Studio 交互的功能,包括对交互的定义和操作,用于实现用户与程序的交互。

obs-missing-files.h:这个头文件可能包含了一些缺失的文件或者需要特别处理的文件。它通常用于处理一些特殊情况或者缺失的文件。

obs-source.h:这个头文件包含了对源(Source)的定义和声明,包括对源的创建、销毁、配置、显示等操作的声明。通过这个头文件,可以实现对视频和音频源的管理和控制。

obs-encoder.h:这个头文件包含了对编码器(Encoder)的定义和声明,包括对编码器的创建、销毁、配置、编码等操作的声明。通过这个头文件,可以实现对视频和音频的编码和处理。

obs-output.h:这个头文件包含了对输出(Output)的定义和声明,包括对输出的创建、销毁、配置、发送等操作的声明。通过这个头文件,可以实现对输出的管理和控制。

obs-service.h:这个头文件包含了对服务(Service)的定义和声明,包括对服务的创建、销毁、配置、连接等操作的声明。通过这个头文件,可以实现对服务的管理和控制。

obs-audio-controls.h:这个头文件包含了对音频控制的定义和声明,包括对音频的采集、处理、控制等操作的声明。通过这个头文件,可以实现对音频的管理和控制。

obs-hotkey.h:这个头文件包含了对热键(Hotkey)的定义和声明,包括对热键的创建、销毁、绑定等操作的声明。通过这个头文件,可以实现对热键的管理和控制。

结构体

/** 用于改变项目的顺序(例如,源中的滤镜或场景中的项目)的枚举类型 */
enum obs_order_movement {
	OBS_ORDER_MOVE_UP,        /**< 将项目向上移动 */
	OBS_ORDER_MOVE_DOWN,      /**< 将项目向下移动 */
	OBS_ORDER_MOVE_TOP,       /**< 将项目移动到顶部 */
	OBS_ORDER_MOVE_BOTTOM,    /**< 将项目移动到底部 */
};

/**
 * 与 obs_source_process_filter 一起使用,用于指定滤镜应该直接使用指定效果渲染源,
 * 还是应该将其渲染到纹理上
 */
enum obs_allow_direct_render {
	OBS_NO_DIRECT_RENDERING,   /**< 不允许直接渲染 */
	OBS_ALLOW_DIRECT_RENDERING /**< 允许直接渲染 */
};

/** 用于指定缩放类型的枚举类型 */
enum obs_scale_type {
	OBS_SCALE_DISABLE,    /**< 禁用缩放 */
	OBS_SCALE_POINT,      /**< 最近邻插值 */
	OBS_SCALE_BICUBIC,    /**< 双三次插值 */
	OBS_SCALE_BILINEAR,   /**< 双线性插值 */
	OBS_SCALE_LANCZOS,    /**< Lanczos 插值 */
	OBS_SCALE_AREA        /**< 区域插值 */
};

/** 用于指定混合方法的枚举类型 */
enum obs_blending_method {
	OBS_BLEND_METHOD_DEFAULT,   /**< 默认混合方法 */
	OBS_BLEND_METHOD_SRGB_OFF   /**< 关闭 sRGB */
};

/** 用于指定混合类型的枚举类型 */
enum obs_blending_type {
	OBS_BLEND_NORMAL,     /**< 正常混合 */
	OBS_BLEND_ADDITIVE,   /**< 加法混合 */
	OBS_BLEND_SUBTRACT,   /**< 减法混合 */
	OBS_BLEND_SCREEN,     /**< 屏幕混合 */
	OBS_BLEND_MULTIPLY,   /**< 乘法混合 */
	OBS_BLEND_LIGHTEN,    /**< 变亮混合 */
	OBS_BLEND_DARKEN      /**< 变暗混合 */
};

/**
 * 用于指示场景项使用的边界类型的枚举类型。主要确定图像在这些边界内如何缩放,或者是否使用边界。
 */
enum obs_bounds_type {
	OBS_BOUNDS_NONE,            /**< 没有边界 */
	OBS_BOUNDS_STRETCH,         /**< 拉伸(忽略基本比例) */
	OBS_BOUNDS_SCALE_INNER,     /**< 缩放到内部矩形 */
	OBS_BOUNDS_SCALE_OUTER,     /**< 缩放到外部矩形 */
	OBS_BOUNDS_SCALE_TO_WIDTH,  /**< 缩放到宽度 */
	OBS_BOUNDS_SCALE_TO_HEIGHT, /**< 缩放到高度 */
	OBS_BOUNDS_MAX_ONLY,        /**< 无缩放,仅最大尺寸 */
};

/**
 * 视频转换信息结构体
 */
struct obs_transform_info {
	struct vec2 pos;       /**< 位置 */
	float rot;             /**< 旋转角度 */
	struct vec2 scale;     /**< 缩放比例 */
	uint32_t alignment;    /**< 对齐方式 */

	enum obs_bounds_type bounds_type;   /**< 边界类型 */
	uint32_t bounds_alignment;          /**< 边界对齐方式 */
	struct vec2 bounds;                 /**< 边界尺寸 */
};

/**
 * 视频初始化结构体
 */
struct obs_video_info {
#ifndef SWIG
	/**
	 * 要使用的图形模块(通常为 "libobs-opengl" 或 "libobs-d3d11")
	 */
	const char *graphics_module;
#endif

	uint32_t fps_num;                   /**< 输出帧率的分子 */
	uint32_t fps_den;                   /**< 输出帧率的分母 */

	uint32_t base_width;                /**< 基本合成宽度 */
	uint32_t base_height;               /**< 基本合成高度 */

	uint32_t output_width;              /**< 输出宽度 */
	uint32_t output_height;             /**< 输出高度 */
	enum video_format output_format;    /**< 输出格式 */

	/** 要使用的视频适配器索引(注意:避免在优化型笔记本电脑上使用) */
	uint32_t adapter;

	/** 使用着色器将颜色转换为不同的颜色格式 */
	bool gpu_conversion;

	enum video_colorspace colorspace;   /**< YUV 类型(如果是 YUV) */
	enum video_range_type range;        /**< YUV 范围(如果是 YUV) */

	enum obs_scale_type scale_type;     /**< 缩放类型 */
};

/**
 * 音频初始化结构体
 */
struct obs_audio_info {
	uint32_t samples_per_sec;   /**< 每秒采样数 */
	enum speaker_layout speakers;   /**< 扬声器布局 */
};

struct obs_audio_info2 {
	uint32_t samples_per_sec;   /**< 每秒采样数 */
	enum speaker_layout speakers;   /**< 扬声器布局 */

	uint32_t max_buffering_ms;   /**< 最大缓冲时间(毫秒) */
	bool fixed_buffering;   /**< 是否固定缓冲 */
};

/**
 * 通过 filter_audio 回调发送给源滤镜,允许对音频数据进行过滤
 */
struct obs_audio_data {
	uint8_t *data[MAX_AV_PLANES];   /**< 音频数据 */
	uint32_t frames;   /**< 帧数 */
	uint64_t timestamp;   /**< 时间戳 */
};

/**
 * 源音频输出结构体。用于 obs_source_output_audio 输出源音频。
 * 音频会根据需要进行自动重新采样和混音。
 */
struct obs_source_audio {
	const uint8_t *data[MAX_AV_PLANES];   /**< 音频数据 */
	uint32_t frames;   /**< 帧数 */

	enum speaker_layout speakers;   /**< 扬声器布局 */
	enum audio_format format;   /**< 音频格式 */
	uint32_t samples_per_sec;   /**< 每秒采样数 */

	uint64_t timestamp;   /**< 时间戳 */
};

struct obs_source_cea_708 {
	const uint8_t *data;   /**< 数据 */
	uint32_t packets;   /**< 数据包数量 */
	uint64_t timestamp;   /**< 时间戳 */
};

#define OBS_SOURCE_FRAME_LINEAR_ALPHA (1 << 0)   /**< 线性 Alpha 帧 */

/**
 * 用于指定源异步视频输出的结构体。与 obs_source_output_video 一起用于输出异步视频。
 * 视频根据时间戳进行必要的缓冲以按照时间戳播放。当与音频输出一起使用时,音频将与视频同步播放。
 *
 * 如果指定了 YUV 格式,它将自动在图形处理器上通过着色器进行上采样和转换为 RGB。
 *
 * 注意:对于非 YUV 格式,此结构体将始终被视为全范围!
 * 如果要对非 YUV 视频格式进行部分范围支持,请使用 obs_source_frame2 和 obs_source_output_video2。
 */
struct obs_source_frame {
	uint8_t *data[MAX_AV_PLANES];   /**< 视频数据 */
	uint32_t linesize[MAX_AV_PLANES];   /**< 每行的大小 */
	uint32_t width;   /**< 宽度 */
	uint32_t height;   /**< 高度 */
	uint64_t timestamp;   /**< 时间戳 */

	enum video_format format;   /**< 视频格式 */
	float color_matrix[16];   /**< 颜色矩阵 */
	bool full_range;   /**< 是否全范围 */
	uint16_t max_luminance;   /**< 最大亮度 */
	float color_range_min[3];   /**< 颜色范围的最小值 */
	float color_range_max[3];   /**< 颜色范围的最大值 */
	bool flip;   /**< 是否翻转 */
	uint8_t flags;   /**< 标志位 */
	uint8_t trc; /**< 视频 TRC(电荷重组时间)的枚举类型 */

	/* libobs 内部使用 */
	volatile long refs;   /**< 引用计数 */
	bool prev_frame;   /**< 上一帧 */
};

/**
 * 源帧结构体,用于 obs_source_output_video2 输出源视频。
 * 视频根据时间戳进行必要的缓冲以按照时间戳播放。
 *
 * 注意:对于非 YUV 格式,此结构体将始终被视为全范围!
 * 如果要对非 YUV 视频格式进行部分范围支持,请使用 obs_source_frame2 和 obs_source_output_video2。
 */
struct obs_source_frame2 {
	uint8_t *data[MAX_AV_PLANES];   /**< 视频数据 */
	uint32_t linesize[MAX_AV_PLANES];   /**< 每行的大小 */
	uint32_t width;   /**< 宽度 */
	uint32_t height;   /**< 高度 */
	uint64_t timestamp;   /**< 时间戳 */

	enum video_format format;   /**< 视频格式 */
	enum video_range_type range;   /**< 视频范围类型 */
	float color_matrix[16];   /**< 颜色矩阵 */
	float color_range_min[3];   /**< 颜色范围的最小值 */
	float color_range_max[3];   /**< 颜色范围的最大值 */
	bool flip;   /**< 是否翻转 */
	uint8_t flags;   /**< 标志位 */
	uint8_t trc; /**< 视频 TRC(电荷重组时间)的枚举类型 */
};

/** 获取用于启动 OBS 的 argc/argv。 */
struct obs_cmdline_args {
	int argc;   /**< 参数数量 */
	char **argv;   /**< 参数列表 */
};

未完待续

你可能感兴趣的:(obs,源码解读,学习)