3. 获取相机信息
任务说明
本案例实现HAL层get_camera_info接口,返回指定相机ID的静态能力信息,包括相机ID、朝向(前后置)、支持的最大分辨率列表。该接口是相机HAL对外暴露能力查询的基础入口,上层服务通过它获取设备静态特征,不涉及数据流或预览。
自洽实现
// camera_info.h
#ifndef CAMERA_INFO_H
#define CAMERA_INFO_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_CAMERAS 2
#define MAX_RESOLUTIONS 8
typedef enum {
CAMERA_FACING_BACK = 0,
CAMERA_FACING_FRONT = 1
} camera_facing_t;
typedef struct {
uint32_t width;
uint32_t height;
} camera_resolution_t;
typedef struct {
uint32_t camera_id;
camera_facing_t facing;
camera_resolution_t resolutions[MAX_RESOLUTIONS];
uint32_t resolution_count;
} camera_info_t;
// 获取相机静态信息
// 返回0表示成功,-1表示相机ID无效
int get_camera_info(uint32_t camera_id, camera_info_t* out_info);
#ifdef __cplusplus
}
#endif
#endif // CAMERA_INFO_H
// camera_info.c
#include "camera_info.h"
#include <string.h>
// 静态表:实际项目中此表由驱动或配置文件填充
static const camera_info_t kCameraInfoTable[MAX_CAMERAS] = {
{
.camera_id = 0,
.facing = CAMERA_FACING_BACK,
.resolutions = {
{1280, 720},
{1920, 1080},
{3264, 2448}
},
.resolution_count = 3
},
{
.camera_id = 1,
.facing = CAMERA_FACING_FRONT,
.resolutions = {
{640, 480},
{1280, 720}
},
.resolution_count = 2
}
};
int get_camera_info(uint32_t camera_id, camera_info_t* out_info) {
if (out_info == NULL) {
return -1;
}
if (camera_id >= MAX_CAMERAS) {
return -1;
}
memcpy(out_info, &kCameraInfoTable[camera_id], sizeof(camera_info_t));
return 0;
}
// main.c(验证入口)
#include <stdio.h>
#include "camera_info.h"
int main(void) {
camera_info_t info;
int ret;
// 查询后置相机(ID=0)
ret = get_camera_info(0, &info);
if (ret == 0) {
printf("Camera %u facing=%s resolutions=%u\n",
info.camera_id,
info.facing == CAMERA_FACING_BACK ? "BACK" : "FRONT",
info.resolution_count);
for (uint32_t i = 0; i < info.resolution_count; i++) {
printf(" %ux%u\n", info.resolutions[i].width, info.resolutions[i].height);
}
} else {
printf("Query camera 0 failed\n");
}
// 查询前置相机(ID=1)
ret = get_camera_info(1, &info);
if (ret == 0) {
printf("Camera %u facing=%s resolutions=%u\n",
info.camera_id,
info.facing == CAMERA_FACING_FRONT ? "FRONT" : "BACK",
info.resolution_count);
for (uint32_t i = 0; i < info.resolution_count; i++) {
printf(" %ux%u\n", info.resolutions[i].width, info.resolutions[i].height);
}
} else {
printf("Query camera 1 failed\n");
}
// 无效ID测试
ret = get_camera_info(5, &info);
printf("Invalid ID ret=%d (expected -1)\n", ret);
return 0;
}
编译与运行
gcc -o camera_info_test camera_info.c main.c
./camera_info_test
验证方法与判定标准
运行程序后,观察输出:
- ID=0输出
facing=BACK,包含3条分辨率(1280x720、1920x1080、3264x2448); - ID=1输出
facing=FRONT,包含2条分辨率(640x480、1280x720); - ID=5返回-1,打印
Invalid ID ret=-1。
以上输出由代码中静态表直接决定,属于确定性预期结果。若输出与上述一致,则接口实现正确;若不一致,检查静态表数据或memcpy逻辑。