以下几篇文章都将针对 音视频工作的各个模块 进行分析
整体流程图
再讲 FrameSource 视频源之前,先讲一个非常重要的部分 — GROUP与Channel。
Group 是一路数据输入的最小单位。一个 Device 可以有多个 Group,每个 Group
只能接收一路数据输入,Group 可以有多路输出。
两个 Group 经过 Bind 连接后,源 Group 的数据会自动发到目的 Group
Channel 通常指一个单一功能的单元,Channel 在 Create 时(实例化)时被指定具体
功能。也就是说在不同的模块中channel 有这不同的功能。
在 Encoder 模块中,channel 负责不同 格式(H264,JPEG) 的编码。
在IVS模块中,channel负责 某种 算法的实现。
以上两者,在整个工程中是很重要的存在。两者负责整个工程中的 数据传输与功能实现
接下来,进入本章主题,分析 FrameSource 视频源 模块。
FrameSource 是 ISP 出图功能的软件抽象,输出 ISP 处理后的原始视频。
FrameSource 的结构
如图,FrameSource 有三种码流(主码流(0)次码流(1,2)扩展码流(3,4))。三种输出均可用来编码。
Channel 0 一般作为高清视频流
Channel 1/2 一般作为标清视频流,或者 IVS 智能算法的数据源
Channel 3/4 是拓展通道,在特殊应用下使用,一般不建议使用
其中 扩展码流 是 主次码流的 copy , 然后 对拷贝过来的视频 进行其他操作的处理。来实现主 次码流不方便的功能。
FrameSource 代码编写流程
读取配置文件的sensor名字 (根据键值 从 字典文件中 获取对应 sensor名字)
获取镜头分辨率大小 (根据上面名字,查找对应参数值,获取其中的 宽高)
设置通道0的分辨率大小为镜头的分辨率大小(将通道设置成以上分辨率大小)
创建通道(根据通道号和通道属性结构体)
设置通道(根据通道号和通道属性结构体)
typedef struct {
int picWidth; /**< 图片宽度 */
int picHeight; /**< 图片高度 */
IMPPixelFormat pixFmt; /**< 图片格式 */
IMPFSChnCrop crop; /**< 图片裁剪属性 */
IMPFSChnScaler scaler; /**< 图片缩放属性 */
int outFrmRateNum; /**< 通道的输出帧率分子 */
int outFrmRateDen; /**< 通道的输出帧率分母 */
int nrVBs; /**< Video buffer数量 */
IMPFSChnType type; /**< 通道类型 */
IMPFSChnCrop fcrop; /**< 图片裁剪属性 */
} IMPFSChnAttr;
/* 通道0(主码流)视频源参数 */
.index = CH0_INDEX,
.enable = CHN0_EN,
.fsChnAttr =
{
.pixFmt = PIX_FMT_NV12,
.picWidth = SENSOR_WIDTH_DEFAULT,/*1920*/
.picHeight = SENSOR_HEIGHT_DEFAULT,/*1080*/
.outFrmRateNum = SENSOR_FRAME_RATE_NUM,
.outFrmRateDen = SENSOR_FRAME_RATE_DEN,
.nrVBs = 2,
.type = FS_PHY_CHANNEL,
},
使能framesource通道,开始处理数据
图像翻转设置, 根据涂鸦配置文件设置(根据宏定义 设置不同属性)
注:后面会对 FrameSource 两个通道 分别和 IVS OSD 进行绑定(bind)
原通道与目的通道绑定后,数据就会自动传输)
在使能Fsrc通道 处理完信息之后,输出主码流到 OSD 0,输出次码流到 IVS 0;
自此 我们完成了 图像的采集 与 部分处理。下篇将对 OSD 模块分析。