You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							142 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
	
	
							142 lines
						
					
					
						
							3.7 KiB
						
					
					
				| #pragma once
 | |
| 
 | |
| #include <stdlib.h>
 | |
| #include <stdbool.h>
 | |
| #include <stdint.h>
 | |
| #include <memory>
 | |
| #include <thread>
 | |
| #include "common/buffering.h"
 | |
| #include "common/mat.h"
 | |
| #include "common/swaglog.h"
 | |
| #include "common/visionbuf.h"
 | |
| #include "common/visionimg.h"
 | |
| #include "imgproc/utils.h"
 | |
| #include "messaging.hpp"
 | |
| #include "transforms/rgb_to_yuv.h"
 | |
| 
 | |
| #include "common/visionipc.h"
 | |
| 
 | |
| #define CAMERA_ID_IMX298 0
 | |
| #define CAMERA_ID_IMX179 1
 | |
| #define CAMERA_ID_S5K3P8SP 2
 | |
| #define CAMERA_ID_OV8865 3
 | |
| #define CAMERA_ID_IMX298_FLIPPED 4
 | |
| #define CAMERA_ID_OV10640 5
 | |
| #define CAMERA_ID_LGC920 6
 | |
| #define CAMERA_ID_LGC615 7
 | |
| #define CAMERA_ID_AR0231 8
 | |
| #define CAMERA_ID_MAX 9
 | |
| 
 | |
| #define UI_BUF_COUNT 4
 | |
| #define YUV_COUNT 40
 | |
| #define LOG_CAMERA_ID_FCAMERA 0
 | |
| #define LOG_CAMERA_ID_DCAMERA 1
 | |
| #define LOG_CAMERA_ID_ECAMERA 2
 | |
| #define LOG_CAMERA_ID_QCAMERA 3
 | |
| #define LOG_CAMERA_ID_MAX 4
 | |
| 
 | |
| const bool env_send_front = getenv("SEND_FRONT") != NULL;
 | |
| const bool env_send_rear = getenv("SEND_REAR") != NULL;
 | |
| const bool env_send_wide = getenv("SEND_WIDE") != NULL;
 | |
| 
 | |
| typedef struct CameraInfo {
 | |
|   const char* name;
 | |
|   int frame_width, frame_height;
 | |
|   int frame_stride;
 | |
|   bool bayer;
 | |
|   int bayer_flip;
 | |
|   bool hdr;
 | |
| } CameraInfo;
 | |
| 
 | |
| typedef struct LogCameraInfo {
 | |
|   const char* filename;
 | |
|   const char* frame_packet_name;
 | |
|   const char* encode_idx_name;
 | |
|   VisionStreamType stream_type;
 | |
|   int frame_width, frame_height;
 | |
|   int fps;
 | |
|   int bitrate;
 | |
|   bool is_h265;
 | |
|   bool downscale;
 | |
|   bool has_qcamera;
 | |
| } LogCameraInfo;
 | |
| 
 | |
| typedef struct FrameMetadata {
 | |
|   uint32_t frame_id;
 | |
|   uint64_t timestamp_sof; // only set on tici
 | |
|   uint64_t timestamp_eof;
 | |
|   unsigned int frame_length;
 | |
|   unsigned int integ_lines;
 | |
|   unsigned int global_gain;
 | |
|   unsigned int lens_pos;
 | |
|   float lens_sag;
 | |
|   float lens_err;
 | |
|   float lens_true_pos;
 | |
|   float gain_frac;
 | |
| } FrameMetadata;
 | |
| 
 | |
| typedef struct CameraExpInfo {
 | |
|   int op_id;
 | |
|   float grey_frac;
 | |
| } CameraExpInfo;
 | |
| 
 | |
| extern CameraInfo cameras_supported[CAMERA_ID_MAX];
 | |
| 
 | |
| typedef struct {
 | |
|   uint8_t *y, *u, *v;
 | |
| } YUVBuf;
 | |
| 
 | |
| struct MultiCameraState;
 | |
| struct CameraState;
 | |
| typedef void (*release_cb)(void *cookie, int buf_idx);
 | |
| 
 | |
| class CameraBuf {
 | |
| public:
 | |
| 
 | |
|   CameraState *camera_state;
 | |
|   cl_kernel krnl_debayer;
 | |
|   cl_command_queue q;
 | |
| 
 | |
|   Pool yuv_pool;
 | |
|   VisionBuf yuv_ion[YUV_COUNT];
 | |
|   YUVBuf yuv_bufs[YUV_COUNT];
 | |
|   FrameMetadata yuv_metas[YUV_COUNT];
 | |
|   size_t yuv_buf_size;
 | |
|   int yuv_width, yuv_height;
 | |
|   RGBToYUVState rgb_to_yuv_state;
 | |
| 
 | |
|   int rgb_width, rgb_height, rgb_stride;
 | |
|   VisionBuf rgb_bufs[UI_BUF_COUNT];
 | |
| 
 | |
|   mat3 yuv_transform;
 | |
| 
 | |
|   int cur_yuv_idx, cur_rgb_idx;
 | |
|   FrameMetadata cur_frame_data;
 | |
|   VisionBuf *cur_rgb_buf;
 | |
| 
 | |
| 
 | |
|   std::unique_ptr<VisionBuf[]> camera_bufs;
 | |
|   std::unique_ptr<FrameMetadata[]> camera_bufs_metadata;
 | |
|   TBuffer camera_tb, ui_tb;
 | |
|   TBuffer *yuv_tb; // only for visionserver
 | |
| 
 | |
|   CameraBuf() = default;
 | |
|   ~CameraBuf();
 | |
|   void init(cl_device_id device_id, cl_context context, CameraState *s, int frame_cnt,
 | |
|             const char *name = "frame", release_cb relase_callback = nullptr);
 | |
|   bool acquire();
 | |
|   void release();
 | |
|   void stop();
 | |
|   int frame_buf_count;
 | |
|   int frame_size;
 | |
| };
 | |
| 
 | |
| typedef void (*process_thread_cb)(MultiCameraState *s, CameraState *c, int cnt);
 | |
| 
 | |
| void fill_frame_data(cereal::FrameData::Builder &framed, const FrameMetadata &frame_data, uint32_t cnt);
 | |
| void fill_frame_image(cereal::FrameData::Builder &framed, uint8_t *dat, int w, int h, int stride);
 | |
| void create_thumbnail(MultiCameraState *s, CameraState *c, uint8_t *bgr_ptr);
 | |
| void set_exposure_target(CameraState *c, const uint8_t *pix_ptr, int x_start, int x_end, int x_skip, int y_start, int y_end, int y_skip);
 | |
| std::thread start_process_thread(MultiCameraState *cameras, const char *tname,
 | |
|                                     CameraState *cs, process_thread_cb callback);
 | |
| void common_camera_process_front(SubMaster *sm, PubMaster *pm, CameraState *c, int cnt);
 | |
| 
 |