7.3.2 示例程序
本章简述D-Robotics 多媒体应用示例,所涉及源码可以通过 sudo apt install hobot-multimedia-samples 获得,安装在 /app/multimedia_samples 目录下。
get_sif_data 使用说明
程序功能
下图所示为X3M的视频数据通路框图,其中的专业名词解释请查看 多媒体开发概述-术语约定。
get_sif_data
完成 sensor
、MIPI CSI
和 SIF
模块的初始化,实现从SIF
模块获取视频帧数据的功能,支持从SIF
模块获取Raw
、YUV
两种格式的图像。
get_sif_data
可以有效帮助用户调试sensor
和X3M
的点亮调试,在打通sensor -> SIF
的数据通路后,再调试其他模块的功能。
程序开发
源码结构
源码位于 /app/multimedia_samples/get_sif_data
.
├── main.c # 主程序,完成sensor列表的加载,和命令控制
├── Makefile # 编译makefile
├── module.c
├── module.h
├── Readme.md
├── sensor_handle.c # sensor 初始化、从sif中获取图像的接口
├── sensor_handle.h
├── sensors # sensor参数配置,每个新sensor在本目录新增一个文件
│ ├── sensor_f37.c
│ └── sensor_imx415.c
└── sensors.lds
编译
当前代码通过一个Makefile文件配置编译
进入源码目录,执行以下命令进行编译生成get_sif_data
程序
$ cd sample/get_sif_data
$ make clean # 清理源码,保持干净的代码环境
$ make
... ... # 一大段编译打印
$ ls
get_sif_data main.c main.o Makefile module.c module.h module.o Readme.md sensor_handle.c sensor_handle.h sensor_handle.o sensors sensors.lds
添加新sensor
如果有新sensor需要调试,请参考 sensors 目录下的源码文件,对应添加一个新的sensor配置即可。
以F37为例说明关键代码:
/*
* 添加sensor、mipi、sif dev、isp的参数配置
* 各结构体中参数在代码中有已经有比较详细的注释说明
* 其中isp部分参数在本程序中无需关注
*/
static int set_sensor_param(void)
{
printf("set_sensor_param\n");
/*定义 sensor 初始化的属性信息 */
snsinfo = SENSOR_1LANE_F37_30FPS_10BIT_LINEAR_INFO;
/*定义 mipi 初始化参数信息 */
mipi_attr = MIPI_1LANE_SENSOR_F37_30FPS_10BIT_LINEAR_ATTR;
/*定义 dev 初始化的属性信息 */
devinfo = DEV_ATTR_F37_LINEAR_BASE;
/*定义 pipe 属性信息 */
pipeinfo = PIPE_ATTR_F37_LINEAR_BASE;
return sensor_sif_dev_init();
return 0;
}
/*
* 主程序遍历sensor模块时调用本函数完成sensor名和sensor参数配置接口的注册
*/
static int sensor_probe(void)
{
int i = 0;
/* 在sensor_lists里面找到一个空位置 */
for (i = 0; i < ARRAY_SIZE(sensor_lists); i++) {
if (0 == strlen(sensor_lists[i].sensor_tag)) break;
}
if (i >= ARRAY_SIZE(sensor_lists)) {
printf("sensor lists is full\n");
return -1;
}
strncpy(sensor_lists[i].sensor_tag, SENSOR_TAG, 31 > strlen(SENSOR_TAG) ? strlen(SENSOR_TAG) : 31);
sensor_lists[i].func = set_sensor_param;
return 0;
}
/* 注册sensor的模块入口,主程序在遍历sensor时会用到 */
SENSOR_MODULE_INSTALL(sensor_probe);