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;
#endifuint32_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-studio 源码学习 obs.h
obs.h 引用头文件介绍 c99defs.h:这个头文件提供了一些 C99 标准的定义和声明,包括一些常用的宏定义和类型定义,用于提高代码的可移植性和兼容性。 bmem.h:这个头文件提供了对内存分配和管理的功能,包括一些内存分配…...

C语言-指针的基本知识(上)
一、关于内存 存储器:存储数据器件 外存 外存又叫外部存储器,长期存放数据,掉电不丢失数据 常见的外存设备:硬盘、flash、rom、u盘、光盘、磁带 内存 内存又叫内部存储器,暂时存放数据,掉电数据…...

4核16G幻兽帕鲁服务器优惠价格表,阿里云和腾讯云报价
幻兽帕鲁服务器价格多少钱?4核16G服务器Palworld官方推荐配置,阿里云4核16G服务器32元1个月、96元3个月,腾讯云幻兽帕鲁服务器服务器4核16G14M带宽66元一个月、277元3个月,8核32G22M配置115元1个月、345元3个月,16核64…...

GitHub 上传文件夹到远程仓库、再次上传修改文件、如何使用lfs上传大文件、github报错一些问题
按照大家的做法,把自己遇到的问题及解决方案写出来(注意:Error里面有些方法有时候我用可以成功,有时候我用也不能成功,写出来仅供参考,实在不行重头再clone,add,commit,p…...

一些es的基本操作
目录 给索引增加字段:给索引删除字段[^1]:创建索引:插入document删除document(应该是按ID) : 给索引增加字段: 用postMan: 给名为population_portrait_hash_seven的索引增加了一个text类型的字段。 用chrome插件Elasticvue 的Re…...

酒鬼酒2024年展望:稳发展动能,迈入恢复性增长轨道
文 | 琥珀酒研社 作者 | 渡过 最近几个月来,白酒估值回落到近十年来低位,反映出了整个白酒行业的市场低迷和虚弱现状。不管是头部企业五粮液、泸州老窖,还是区域酒企口子窖、金种子酒等,最近都通过“回购”或“增持”࿰…...

1002. HarmonyOS 开发问题:鸿蒙 OS 技术特性是什么?
1002. HarmonyOS 开发问题:鸿蒙 OS 技术特性是什么? 硬件互助,资源共享 分布式软总线 分布式软总线是多种终端设备的统一基座,为设备之间的互联互通提供了统一的分布式通信能力,能够快速发现并连接设备,高效地分发…...

vue-cli 无法安装问题解决
在macOS上安装vue-cli,但一直都失败,最后终于解决。 先后报错了2个问题。 报错无法安装 其实原因是源被切断,默认的源是官方的,但在CN是无法正常访问,各种问题。直接将源修改才可以。但可能需要试多次。 npm config…...

spring-bus消息总线的使用
文章目录 依赖bus应用接口用到的封装参数类 接收的应用监听器定义的事件类 使用bus定义bus远程调用A应用数据更新后通过bus数据同步给B应用 依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp…...

isctf---re
crackme 解压得到crackme.exe 运行得到flag babyRe 先猜e65537的rsa 先用Z3强行求出p、q,算出常规rsa中的phi,然后套用公式求出m exp #babyre wp from z3 import * import libnum from Crypto.Util.number import * p,q,cInts(p q c) S Solver() S…...

C语言第十二弹--扫雷
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 扫雷 1、扫雷游戏分析和设计 1.1、扫雷游戏的功能说明 1.2 游戏的分析和设计 1.2.1、数据结构的分析 1.2.2、文件结构设计 2、扫雷游戏的结构分析 2.1、用…...

网路服务器——线程池技术
文章目录 一、线程池技术二、使用原理三、优点总结 一、线程池技术 预创建原则,线程池内部准备线程备用, 不宜过多。线程应该重用性,可以一对多处理任务或服务不同的客户端。处理单元(线程)数量并不固定,动态扩容与缩减(任务量)。…...

探索设计模式的魅力:深入了解适配器模式-优雅地解决接口不匹配问题
设计模式专栏:http://t.csdnimg.cn/nolNS 目录 一、引言 1. 概述 2. 为什么需要适配器模式 3. 本文的目的和结构 二、简价 1. 适配器模式的定义和特点 定义 特点 2. 适配器模式的作用和适用场景 作用 适用场景 3. 适配器模式与其他设计模式的比较 三、适配…...

matlab窗函数-hann窗和hamming窗函数
窗函数的作用 在时域上,窗函数可以看作是对原始信号进行截断或调制的加权函数。这些窗函数通常在时域上是有限的宽度,并且具有对称性,如矩形窗、汉宁窗、汉明窗和布莱克曼窗等。例如,汉明窗是一种对称窗函数,它可以用…...

Java项目实战--瑞吉外卖DAY03
目录 P22新增员工_编写全局异常处理器 P23新增员工_完善全局异常处理器并测试 p24新增员工_小结 P27员工分页查询_代码开发1 P28员工分页查询_代码开发2 P22新增员工_编写全局异常处理器 在COMMON新增全局异常捕获的类,其实就是代理我们这些controlle。通过aop把…...
docker 里使用vcs 2018 verdi等eda 图形界面
书接上文。之前借用别人的docker,使用EDA工具,苦于没有图形界面。如果只是编码,编译可能问题不大,但是如果要看波形之类的,就没法实现了。 docker 使用 vcs/2018 Verdi等 eda 软件-CSDN博客https://blog.csdn.net/guy…...

OpenHarmony—不支持解构赋值
规则:arkts-no-destruct-assignment 级别:错误 ArkTS不支持解构赋值。可使用其他替代方法,例如,使用临时变量。 TypeScript let [one, two] [1, 2]; // 此处需要分号 [one, two] [two, one];let head, tail [head, ...tail]…...

让AI帮你说话--GPT-SoVITS教程
有时候我们在录制视频的时候,由于周边环境嘈杂或者录音设备问题需要后期配音,这样就比较麻烦。一个比较直观的想法就是能不能将写好的视频脚本直接转换成我们的声音,让AI帮我们完成配音呢?在语音合成领域已经有很多这类工作了&…...

线性回归需要满足的几个假设
线性回归模型是基于一些假设构建的,这些假设有助于确保模型的有效性和可解释性。以下是线性回归需要满足的几个主要假设: 线性关系假设(Linearity): 线性回归假设因变量(目标变量)与自变量(特征…...

go语言(十八)---- goroutine
一、goroutine package mainimport ("fmt""time" )func main() {//用go创建承载一个形参为空,返回值为空的一个函数go func() {defer fmt.Println("A.defer")func() {defer fmt.Println("B.defer")//退出当前goroutinefmt…...

城市开发区视频系统建设方案:打造视频基座、加强图像数据治理
一、背景需求 随着城市建设的步伐日益加快,开发区已经成为了我国工业化、城镇化和对外开放的重要载体。自贸区、开发区和产业园的管理工作自然也变得至关重要。在城市经开区的展览展示馆、进出口商品展示交易中心等地,数千路监控摄像头遍布各角落&#…...

宏景eHRSmsAcceptGSTXServle存在XXE漏洞
指纹特征 app"HJSOFT-HCM"漏洞复现 POST /servlet/sms/SmsAcceptGSTXServlet HTTP/1.1 Host: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Content-Length: 137 Content…...

LLVM实战之模块化设计
目录 1. llvm基础理念 2. 准备工作 3. 详细步骤 3.1 指令合并优化 3.2 无用参数消除优化 4. Pass管理器(Pass Manager)...

可以运行在浏览器的Windows 2000
Windows 2000 可以在浏览器里跑了,缺点就是速度慢。 JSLinux JSLinux 在浏览器中运行 Linux 或其他操作系统! 可以使用以下仿真系统: 中央处理器操作系统用户 界面VF同步 访问启动 链接TEMU 配置评论x86阿尔派Linux 3.12.0安慰是的点击这…...

CUDA笔记
CUDA笔记 nvidia-smi 命令使用 nvidiasmi -q:查询GPU详细信息; nvidia-smi -q -l 0:查询特定GPU详细信息; nvidia-smi -q -l 0 -d MEMORY:显示GPU特定信息; nvidia-smi -h:英伟达的帮助命令。…...

Open CASCADE学习| 提取曲面的PCurve
PCurve这个概念,字面上来理解就是参数曲线(Parametric Curve)。参数空间曲线是在参数曲面的双参数空间中的二维样条曲线。 二维曲线定义的目的只有一个:pCurve,参数曲线。OCC采用参数法构建几何结构,所有的…...

GMS测试BTSfail-CVE-2022-20451
描述: 项目需要过GMS兼容性测试,BTS这块我们环境没有,送检之后出现了一个BTS的Alert,这个是必须要解决的。下面的warning可以不考虑。 这个是patch问题,根据代理提供的pdf文件找到一个id:为A-235098883的补丁…...

Vue学习笔记12--Vue3之setup/ref函数/reactive函数/Vue3响应式原理/reactive对比ref
一、拉开序幕的setup 理解:Vue3中一个新的配置项,值为一个函数。setup是所有Composition API(组合API)表演的舞台。组件中所用到的:数据、方法等,均要配置在setup中。setup函数的两种返回值: 若返回一个对…...

座位预约|座位预约小程序|基于微信小程序的图书馆自习室座位预约管理系统设计与实现(源码+数据库+文档)
座位预约小程序目录 目录 基于微信小程序的图书馆自习室座位预约管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员服务端功能模块 2、学生微信端功能模块 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …...

03 Redis之命令(基本命令+Key命令+String型Value命令与应用场景)
Redis 根据命令所操作对象的不同,可以分为三大类:对 Redis 进行基础性操作的命令,对 Key 的操作命令,对 Value 的操作命令。 3.1 Redis 基本命令 一些可选项对大小写敏感, 所以应尽量将redis的所有命令大写输入 首先通过 redis-…...