#pragma once #include #include #include #include "cereal/messaging/messaging.h" #include "msgq/visionipc/visionipc_server.h" #include "common/queue.h" #include "common/util.h" const int YUV_BUFFER_COUNT = 20; enum CameraType { RoadCam = 0, DriverCam, WideRoadCam }; // for debugging const bool env_disable_road = getenv("DISABLE_ROAD") != NULL; const bool env_disable_wide_road = getenv("DISABLE_WIDE_ROAD") != NULL; const bool env_disable_driver = getenv("DISABLE_DRIVER") != NULL; const bool env_debug_frames = getenv("DEBUG_FRAMES") != NULL; const bool env_log_raw_frames = getenv("LOG_RAW_FRAMES") != NULL; const bool env_ctrl_exp_from_params = getenv("CTRL_EXP_FROM_PARAMS") != NULL; typedef struct FrameMetadata { uint32_t frame_id; uint32_t request_id; // Timestamps uint64_t timestamp_sof; uint64_t timestamp_eof; // Exposure unsigned int integ_lines; bool high_conversion_gain; float gain; float measured_grey_fraction; float target_grey_fraction; float processing_time; } FrameMetadata; struct MultiCameraState; class CameraState; class ImgProc; class CameraBuf { private: VisionIpcServer *vipc_server; ImgProc *imgproc = nullptr; VisionStreamType stream_type; int cur_buf_idx; SafeQueue safe_queue; int frame_buf_count; public: cl_command_queue q; FrameMetadata cur_frame_data; VisionBuf *cur_yuv_buf; VisionBuf *cur_camera_buf; std::unique_ptr camera_bufs; std::unique_ptr camera_bufs_metadata; int rgb_width, rgb_height; CameraBuf() = default; ~CameraBuf(); void init(cl_device_id device_id, cl_context context, CameraState *s, VisionIpcServer * v, int frame_cnt, VisionStreamType type); bool acquire(); void queue(size_t buf_idx); }; typedef void (*process_thread_cb)(MultiCameraState *s, CameraState *c, int cnt); void fill_frame_data(cereal::FrameData::Builder &framed, const FrameMetadata &frame_data, CameraState *c); kj::Array get_raw_frame_image(const CameraBuf *b); float set_exposure_target(const CameraBuf *b, Rect ae_xywh, int x_skip, int y_skip); std::thread start_process_thread(MultiCameraState *cameras, CameraState *cs, process_thread_cb callback); void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx); void cameras_open(MultiCameraState *s); void cameras_run(MultiCameraState *s); void cameras_close(MultiCameraState *s); void camerad_thread(); int open_v4l_by_name_and_index(const char name[], int index = 0, int flags = O_RDWR | O_NONBLOCK);