Skip to content

Utils_Types

SweerItTer edited this page Feb 21, 2026 · 4 revisions

Types API 文档

概述

Types 是 utilsCore Utils 模块的核心头文件,提供项目常用的类型定义。

职责

  • 定义 FramePtr 智能指针类型
  • 定义 FrameQueue 队列类型

适用场景

  • 所有使用 Frame 的模块
  • 所有使用 FrameQueue 的模块

依赖关系

  • 依赖: concurrentqueue.h, v4l2/frame.h
  • 被依赖: VisionPipeline, RecordPipeline 等所有模块

类型定义

FramePtr - 帧智能指针

using FramePtr = std::shared_ptr<Frame>;

说明: Frame 的共享指针类型,用于跨线程传递帧数据

使用例程:

#include "types.h"

// 创建 FramePtr
FramePtr frame = std::make_shared<Frame>();

// 传递 FramePtr
void process_frame(FramePtr frame) {
    // 处理帧
}

FrameQueue - 帧队列

using FrameQueue = moodycamel::ConcurrentQueue<FramePtr>;

说明: 基于 moodycamel::ConcurrentQueue 的帧队列,支持无锁并发操作

使用例程:

#include "types.h"

// 创建帧队列
FrameQueue frame_queue;

// 入队
FramePtr frame = std::make_shared<Frame>();
frame_queue.enqueue(frame);

// 出队
FramePtr frame_out;
if (frame_queue.try_dequeue(frame_out)) {
    // 处理帧
}

完整代码

#ifndef TYPES_H
#define TYPES_H

#include "concurrentqueue.h"
#include "v4l2/frame.h"

using FramePtr = std::shared_ptr<Frame>;
using FrameQueue = moodycamel::ConcurrentQueue<FramePtr>;

#endif // TYPES_H

代码说明:

  1. 第10行:// #include "safeQueue.h", 第15行:// using FrameQueue = SafeQueue<FramePtr>; - 注释掉的备用定义,当前使用 moodycamel::ConcurrentQueue<FramePtr>
  2. 这些注释掉的代码行显示了历史演变和备用选项,实际使用的是第11行的 concurrentqueue.h 和第16行的 moodycamel::ConcurrentQueue<FramePtr>

典型使用场景

场景 1: 使用 FramePtr

#include "types.h"

// CameraController 回调
camera.setFrameCallback([](FramePtr frame) {
    printf("Frame: %dx%d\n", frame->meta.w, frame->meta.h);
    
    // 传递给其他模块
    process_frame(frame);
});

场景 2: 使用 FrameQueue

#include "types.h"

// 创建帧队列
FrameQueue frame_queue;

// 生产者:采集帧
std::thread producer([&]() {
    while (running) {
        FramePtr frame = capture_frame();
        frame_queue.enqueue(frame);
    }
});

// 消费者:处理帧
std::thread consumer([&]() {
    while (running) {
        FramePtr frame;
        if (frame_queue.try_dequeue(frame)) {
            process_frame(frame);
        }
    }
});

场景 3: VisionPipeline 使用

#include "types.h"

class VisionPipeline {
private:
    FrameQueue input_queue_;
    FrameQueue output_queue_;

public:
    void pushFrame(FramePtr frame) {
        input_queue_.enqueue(frame);
    }

    FramePtr popFrame() {
        FramePtr frame;
        if (output_queue_.try_dequeue(frame)) {
            return frame;
        }
        return nullptr;
    }
};

注意事项

  1. 智能指针: FramePtr 使用 std::shared_ptr,自动管理生命周期
  2. 无锁队列: FrameQueue 使用 moodycamel::ConcurrentQueue,支持高并发
  3. 线程安全: FrameQueue 是线程安全的,可以多生产者多消费者
  4. 性能: ConcurrentQueue 比带锁的队列性能更好
  5. 包含头文件: 使用 FramePtr 和 FrameQueue 需要包含 types.h

相关文档

主页

API 文档

DMA 模块

DRM 模块

NET 模块

V4L2 模块

V4L2Param 模块

RGA 模块

MPP 模块

Sys 模块

Mouse 模块

Utils 模块

Clone this wiki locally