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逻辑。