diff --git a/release/files_common b/release/files_common index b9f5c5746d..e5384e614a 100644 --- a/release/files_common +++ b/release/files_common @@ -301,8 +301,6 @@ selfdrive/camerad/snapshot/* selfdrive/camerad/include/* selfdrive/camerad/cameras/camera_common.h selfdrive/camerad/cameras/camera_common.cc -selfdrive/camerad/cameras/camera_replay.cc -selfdrive/camerad/cameras/camera_replay.h selfdrive/camerad/cameras/sensor2_i2c.h selfdrive/camerad/transforms/rgb_to_yuv.cc diff --git a/selfdrive/camerad/SConscript b/selfdrive/camerad/SConscript index bb55c825d4..b181fbab75 100644 --- a/selfdrive/camerad/SConscript +++ b/selfdrive/camerad/SConscript @@ -2,39 +2,18 @@ Import('env', 'arch', 'cereal', 'messaging', 'common', 'gpucommon', 'visionipc', libs = ['m', 'pthread', common, 'jpeg', 'OpenCL', 'yuv', cereal, messaging, 'zmq', 'capnp', 'kj', visionipc, gpucommon] +cameras = [] if arch == "larch64": libs += ['atomic'] cameras = ['cameras/camera_qcom2.cc'] -else: - env['CXXFLAGS'] += ["-Wno-deprecated-declarations"] - if USE_WEBCAM: - libs += ['opencv_core', 'opencv_highgui', 'opencv_imgproc', 'opencv_videoio'] - cameras = ['cameras/camera_webcam.cc'] - env = env.Clone() - env.Append(CXXFLAGS = '-DWEBCAM') - env.Append(CFLAGS = '-DWEBCAM') - env.Append(CPPPATH = ['/usr/include/opencv4', '/usr/local/include/opencv4']) - else: - libs += ['avutil', 'avcodec', 'avformat', 'bz2', 'ssl', 'curl', 'crypto'] - # TODO: import replay_lib from root SConstruct - cameras = ['cameras/camera_replay.cc', - env.Object('camera-util', '#/selfdrive/ui/replay/util.cc'), - env.Object('camera-framereader', '#/selfdrive/ui/replay/framereader.cc'), - env.Object('camera-filereader', '#/selfdrive/ui/replay/filereader.cc')] - if arch == "Darwin": - del libs[libs.index('OpenCL')] - del libs[libs.index(gpucommon)][gpucommon.index('GL')] - env = env.Clone() - env['FRAMEWORKS'] = ['OpenCL', 'OpenGL'] - -env.Program('camerad', [ - 'main.cc', - 'cameras/camera_common.cc', - 'transforms/rgb_to_yuv.cc', - 'imgproc/utils.cc', - cameras, - ], LIBS=libs) + env.Program('camerad', [ + 'main.cc', + 'cameras/camera_common.cc', + 'transforms/rgb_to_yuv.cc', + 'imgproc/utils.cc', + cameras, + ], LIBS=libs) if GetOption("test"): env.Program('test/ae_gray_test', [ diff --git a/selfdrive/camerad/cameras/camera_common.cc b/selfdrive/camerad/cameras/camera_common.cc index e2ec10bcb0..d3fd34f6e4 100644 --- a/selfdrive/camerad/cameras/camera_common.cc +++ b/selfdrive/camerad/cameras/camera_common.cc @@ -17,13 +17,11 @@ #include "common/util.h" #include "selfdrive/hardware/hw.h" -#if QCOM2 +#ifdef QCOM2 #include "CL/cl_ext_qcom.h" #include "selfdrive/camerad/cameras/camera_qcom2.h" -#elif WEBCAM -#include "selfdrive/camerad/cameras/camera_webcam.h" #else -#include "selfdrive/camerad/cameras/camera_replay.h" +#include "selfdrive/camerad/test/camera_test.h" #endif ExitHandler do_exit; diff --git a/selfdrive/camerad/cameras/camera_replay.h b/selfdrive/camerad/cameras/camera_replay.h deleted file mode 100644 index 7c41af0ab4..0000000000 --- a/selfdrive/camerad/cameras/camera_replay.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "selfdrive/camerad/cameras/camera_common.h" -#include "selfdrive/ui/replay/framereader.h" - -#define FRAME_BUF_COUNT 16 - -typedef struct CameraState { - int camera_num; - CameraInfo ci; - - int fps; - float digital_gain = 0; - - CameraBuf buf; - FrameReader *frame = nullptr; -} CameraState; - -typedef struct MultiCameraState { - CameraState road_cam; - CameraState driver_cam; - - SubMaster *sm = nullptr; - PubMaster *pm = nullptr; -} MultiCameraState; diff --git a/selfdrive/camerad/cameras/camera_webcam.cc b/selfdrive/camerad/cameras/camera_webcam.cc deleted file mode 100644 index b0906ce887..0000000000 --- a/selfdrive/camerad/cameras/camera_webcam.cc +++ /dev/null @@ -1,197 +0,0 @@ -#include "selfdrive/camerad/cameras/camera_webcam.h" - -#include - -#include -#include - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wundefined-inline" -#include -#include -#include -#include -#pragma clang diagnostic pop - -#include "common/clutil.h" -#include "common/swaglog.h" -#include "common/timing.h" -#include "common/util.h" - -// id of the video capturing device -const int ROAD_CAMERA_ID = util::getenv("ROADCAM_ID", 1); -const int DRIVER_CAMERA_ID = util::getenv("DRIVERCAM_ID", 2); - -#define FRAME_WIDTH 1164 -#define FRAME_HEIGHT 874 -#define FRAME_WIDTH_FRONT 1152 -#define FRAME_HEIGHT_FRONT 864 - -extern ExitHandler do_exit; - -namespace { - -CameraInfo cameras_supported[CAMERA_ID_MAX] = { - // road facing - [CAMERA_ID_LGC920] = { - .frame_width = FRAME_WIDTH, - .frame_height = FRAME_HEIGHT, - .frame_stride = FRAME_WIDTH*3, - .bayer = false, - .bayer_flip = false, - }, - // driver facing - [CAMERA_ID_LGC615] = { - .frame_width = FRAME_WIDTH_FRONT, - .frame_height = FRAME_HEIGHT_FRONT, - .frame_stride = FRAME_WIDTH_FRONT*3, - .bayer = false, - .bayer_flip = false, - }, -}; - -void camera_open(CameraState *s, bool rear) { - // empty -} - -void camera_close(CameraState *s) { - // empty -} - -void camera_init(VisionIpcServer * v, CameraState *s, int camera_id, unsigned int fps, cl_device_id device_id, cl_context ctx, VisionStreamType rgb_type, VisionStreamType yuv_type) { - assert(camera_id < std::size(cameras_supported)); - s->ci = cameras_supported[camera_id]; - assert(s->ci.frame_width != 0); - - s->camera_num = camera_id; - s->fps = fps; - s->buf.init(device_id, ctx, s, v, FRAME_BUF_COUNT, rgb_type, yuv_type); -} - -void run_camera(CameraState *s, cv::VideoCapture &video_cap, float *ts) { - assert(video_cap.isOpened()); - - cv::Size size(s->ci.frame_width, s->ci.frame_height); - const cv::Mat transform = cv::Mat(3, 3, CV_32F, ts); - uint32_t frame_id = 0; - size_t buf_idx = 0; - - while (!do_exit) { - cv::Mat frame_mat, transformed_mat; - video_cap >> frame_mat; - if (frame_mat.empty()) continue; - - cv::warpPerspective(frame_mat, transformed_mat, transform, size, cv::INTER_LINEAR, cv::BORDER_CONSTANT, 0); - - s->buf.camera_bufs_metadata[buf_idx] = {.frame_id = frame_id}; - - auto &buf = s->buf.camera_bufs[buf_idx]; - int transformed_size = transformed_mat.total() * transformed_mat.elemSize(); - CL_CHECK(clEnqueueWriteBuffer(buf.copy_q, buf.buf_cl, CL_TRUE, 0, transformed_size, transformed_mat.data, 0, NULL, NULL)); - - s->buf.queue(buf_idx); - - ++frame_id; - buf_idx = (buf_idx + 1) % FRAME_BUF_COUNT; - } -} - -static void road_camera_thread(CameraState *s) { - util::set_thread_name("webcam_road_camera_thread"); - - cv::VideoCapture cap_road(ROAD_CAMERA_ID, cv::CAP_V4L2); // road - cap_road.set(cv::CAP_PROP_FRAME_WIDTH, 853); - cap_road.set(cv::CAP_PROP_FRAME_HEIGHT, 480); - cap_road.set(cv::CAP_PROP_FPS, s->fps); - cap_road.set(cv::CAP_PROP_AUTOFOCUS, 0); // off - cap_road.set(cv::CAP_PROP_FOCUS, 0); // 0 - 255? - // cv::Rect roi_rear(160, 0, 960, 720); - - // transforms calculation see tools/webcam/warp_vis.py - float ts[9] = {1.50330396, 0.0, -59.40969163, - 0.0, 1.50330396, 76.20704846, - 0.0, 0.0, 1.0}; - // if camera upside down: - // float ts[9] = {-1.50330396, 0.0, 1223.4, - // 0.0, -1.50330396, 797.8, - // 0.0, 0.0, 1.0}; - - run_camera(s, cap_road, ts); -} - -void driver_camera_thread(CameraState *s) { - cv::VideoCapture cap_driver(DRIVER_CAMERA_ID, cv::CAP_V4L2); // driver - cap_driver.set(cv::CAP_PROP_FRAME_WIDTH, 853); - cap_driver.set(cv::CAP_PROP_FRAME_HEIGHT, 480); - cap_driver.set(cv::CAP_PROP_FPS, s->fps); - // cv::Rect roi_front(320, 0, 960, 720); - - // transforms calculation see tools/webcam/warp_vis.py - float ts[9] = {1.42070485, 0.0, -30.16740088, - 0.0, 1.42070485, 91.030837, - 0.0, 0.0, 1.0}; - // if camera upside down: - // float ts[9] = {-1.42070485, 0.0, 1182.2, - // 0.0, -1.42070485, 773.0, - // 0.0, 0.0, 1.0}; - run_camera(s, cap_driver, ts); -} - -} // namespace - -void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_id, cl_context ctx) { - camera_init(v, &s->road_cam, CAMERA_ID_LGC920, 20, device_id, ctx, - VISION_STREAM_RGB_ROAD, VISION_STREAM_ROAD); - camera_init(v, &s->driver_cam, CAMERA_ID_LGC615, 10, device_id, ctx, - VISION_STREAM_RGB_DRIVER, VISION_STREAM_DRIVER); - s->pm = new PubMaster({"roadCameraState", "driverCameraState", "thumbnail"}); -} - -void camera_autoexposure(CameraState *s, float grey_frac) {} - -void cameras_open(MultiCameraState *s) { - // LOG("*** open driver camera ***"); - camera_open(&s->driver_cam, false); - // LOG("*** open road camera ***"); - camera_open(&s->road_cam, true); -} - -void cameras_close(MultiCameraState *s) { - camera_close(&s->road_cam); - camera_close(&s->driver_cam); - delete s->pm; -} - -void process_driver_camera(MultiCameraState *s, CameraState *c, int cnt) { - MessageBuilder msg; - auto framed = msg.initEvent().initDriverCameraState(); - framed.setFrameType(cereal::FrameData::FrameType::FRONT); - fill_frame_data(framed, c->buf.cur_frame_data); - s->pm->send("driverCameraState", msg); -} - -void process_road_camera(MultiCameraState *s, CameraState *c, int cnt) { - const CameraBuf *b = &c->buf; - MessageBuilder msg; - auto framed = msg.initEvent().initRoadCameraState(); - fill_frame_data(framed, b->cur_frame_data); - framed.setImage(kj::arrayPtr((const uint8_t *)b->cur_yuv_buf->addr, b->cur_yuv_buf->len)); - framed.setTransform(b->yuv_transform.v); - s->pm->send("roadCameraState", msg); -} - -void cameras_run(MultiCameraState *s) { - std::vector threads; - threads.push_back(start_process_thread(s, &s->road_cam, process_road_camera)); - threads.push_back(start_process_thread(s, &s->driver_cam, process_driver_camera)); - - std::thread t_rear = std::thread(road_camera_thread, &s->road_cam); - util::set_thread_name("webcam_thread"); - driver_camera_thread(&s->driver_cam); - - t_rear.join(); - - for (auto &t : threads) t.join(); - - cameras_close(s); -} diff --git a/selfdrive/camerad/cameras/camera_webcam.h b/selfdrive/camerad/cameras/camera_webcam.h deleted file mode 100644 index 819387f3d6..0000000000 --- a/selfdrive/camerad/cameras/camera_webcam.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - -#ifdef __APPLE__ -#include -#else -#include -#endif - -#include "selfdrive/camerad/cameras/camera_common.h" - -#define FRAME_BUF_COUNT 16 - -typedef struct CameraState { - CameraInfo ci; - int camera_num; - int fps; - float digital_gain; - CameraBuf buf; -} CameraState; - - -typedef struct MultiCameraState { - CameraState road_cam; - CameraState driver_cam; - - SubMaster *sm; - PubMaster *pm; -} MultiCameraState; diff --git a/selfdrive/camerad/test/ae_gray_test.cc b/selfdrive/camerad/test/ae_gray_test.cc index b7759d8e1a..69ef2ac6de 100644 --- a/selfdrive/camerad/test/ae_gray_test.cc +++ b/selfdrive/camerad/test/ae_gray_test.cc @@ -10,12 +10,6 @@ #include "common/util.h" #include "selfdrive/camerad/cameras/camera_common.h" -// needed by camera_common.cc -void camera_autoexposure(CameraState *s, float grey_frac) {} -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) {} - int main() { // set up fake camerabuf CameraBuf cb = {}; diff --git a/selfdrive/camerad/test/camera_test.h b/selfdrive/camerad/test/camera_test.h new file mode 100644 index 0000000000..cc521db397 --- /dev/null +++ b/selfdrive/camerad/test/camera_test.h @@ -0,0 +1,26 @@ +// TODO: cleanup AE tests +// needed by camera_common.cc +void camera_autoexposure(CameraState *s, float grey_frac) {} +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) {} + +typedef struct CameraState { + int camera_num; + CameraInfo ci; + + int fps; + float digital_gain = 0; + + CameraBuf buf; +} CameraState; + +typedef struct MultiCameraState { + CameraState road_cam; + CameraState driver_cam; + + SubMaster *sm = nullptr; + PubMaster *pm = nullptr; +} MultiCameraState; + +