发帖
0 0 0

Cam-D200源码解析 获取图片分析

沈夜
论坛元老

66

主题

180

回帖

7615

积分

论坛元老

积分
7615
小安派·Cam-D200 21 0 昨天 15:31

主程序 man.c 一些声明文件

man.c创建了所有初始化

d200_camera.c 所有实现

d200_camera_run 实现了拍照

void d200_camera_run(void) {
uint8_t *pic; // 临时存储 JPEG 数据指针
uint32_t jpeg_len; // 临时存储 JPEG 数据长度

if (receive_status == 1) {  // 检查是否收到新帧
    receive_status = 0;     // 重置接收状态

    // 获取 JPEG 数据
    jpeg_len = bflb_mjpeg_get_frame_info(mjpeg, &pic);  // pic 指向 JPEG 数据
    bflb_mjpeg_pop_one_frame(mjpeg);  // 弹出当前帧(准备下一帧)
    bflb_l1c_dcache_invalidate_range(pic, jpeg_len);  // 缓存无效化(确保数据最新)

    // 加锁(防止多线程冲突)
    xSemaphoreTake(camera_muxsem_handle, portMAX_DELAY);
  
    // 将 JPEG 数据复制到 mjpeg_output_buffer
    for (int i = 0; i < jpeg_len; i++) {
        mjpeg_output_buffer[i] = pic[i];
    }
    pic_size = jpeg_len;  // 更新全局变量 pic_size

    xSemaphoreGive(camera_muxsem_handle);  // 解锁

    // 如果 camera_mode == 1,重新启动摄像头(准备下一帧)
    if (camera_mode == 1) {
        bflb_mjpeg_update_input_output_buff(mjpeg, dvp_buffer, NULL, mjpeg_buffer, sizeof(mjpeg_buffer));
        bflb_mjpeg_start(mjpeg);  // 重新启动 MJPEG 编码
        bflb_cam_start(cam0);    // 重新启动摄像头
    }
}

}

(2) 关键点分析

  1. receive_status 控制拍照触发
    • 只有当 receive_status == 1 时,才会拍照并处理数据。
    • 这个变量可能是由 中断外部代码 设置的(例如 DMA 传输完成时置 1)。
  2. camera_mode == 1 时自动重启摄像头
    • 如果 camera_mode 设为 1,拍照完成后会自动重启摄像头(bflb_cam_start(cam0)),实现持续拍照
    • 如果 camera_mode0,则 只拍一次,不会自动重启。
  3. 数据存储位置
    • JPEG 数据先存放在 pic(临时指针),然后复制到 mjpeg_output_buffer
    • pic_addr 没有被赋值,所以目前它没有存储有效数据(可能是你想优化掉 mjpeg_output_buffer 直接让 pic_addr = pic?)。
  4. 理论代码
    删除 ap_web,修复错误
    在man.c 就可以 获取
  5. extern uint8_t *pic_addr;
    extern uint32_t pic_size;
  6. 进行获取 图片 发送
  7. bl618_camera_task

b19bbf6dbe37be8294c872b1b41583d.png

634936ac0a8e3baab24d44da9175b45.png

deee7a4bb2e3101bb5dd7e44f9daa0d.png

91e9e9fa7a02723ac97ff78eb35cc97.png

2aef11c64a7537637454c8b6fc9a628.png

f286828d12f86f898b3a1e0d99b1f65.png

──── 0人觉得很赞 ────

使用道具 举报

您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28427 个
  • 话题数: 40507 篇