From a30859cf12d69c6c7f99ebef372a24e8a3773637 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 19 Jan 2021 14:40:47 -0800 Subject: [PATCH] camera frame stream cleanup (#19741) * clean up * more clean up first old-commit-hash: eae7a6ed22a96f792a5b6ca187a309505c3f249c --- selfdrive/camerad/cameras/camera_common.cc | 2 +- selfdrive/camerad/cameras/camera_common.h | 2 +- .../camerad/cameras/camera_frame_stream.cc | 82 ++++++------------- 3 files changed, 28 insertions(+), 58 deletions(-) diff --git a/selfdrive/camerad/cameras/camera_common.cc b/selfdrive/camerad/cameras/camera_common.cc index 1fd311d42d..6533dc0f3b 100644 --- a/selfdrive/camerad/cameras/camera_common.cc +++ b/selfdrive/camerad/cameras/camera_common.cc @@ -339,7 +339,7 @@ void set_exposure_target(CameraState *c, const uint8_t *pix_ptr, int x_start, in extern ExitHandler do_exit; void *processing_thread(MultiCameraState *cameras, const char *tname, - CameraState *cs, process_thread_cb callback) { + CameraState *cs, process_thread_cb callback) { set_thread_name(tname); for (int cnt = 0; !do_exit; cnt++) { diff --git a/selfdrive/camerad/cameras/camera_common.h b/selfdrive/camerad/cameras/camera_common.h index 6d8080041d..3ea8ddaa2f 100644 --- a/selfdrive/camerad/cameras/camera_common.h +++ b/selfdrive/camerad/cameras/camera_common.h @@ -135,5 +135,5 @@ void fill_frame_data(cereal::FrameData::Builder &framed, const FrameMetadata &fr void fill_frame_image(cereal::FrameData::Builder &framed, const CameraBuf *b); 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); + CameraState *cs, process_thread_cb callback); void common_camera_process_front(SubMaster *sm, PubMaster *pm, CameraState *c, int cnt); diff --git a/selfdrive/camerad/cameras/camera_frame_stream.cc b/selfdrive/camerad/cameras/camera_frame_stream.cc index dfde414bb6..4536f82759 100644 --- a/selfdrive/camerad/cameras/camera_frame_stream.cc +++ b/selfdrive/camerad/cameras/camera_frame_stream.cc @@ -2,31 +2,18 @@ #include #include -#include -#include -#include "messaging.hpp" +#include +#include "messaging.hpp" #include "common/util.h" -#include "common/timing.h" -#include "common/swaglog.h" - -extern "C" { -#include -} - -extern ExitHandler do_exit; #define FRAME_WIDTH 1164 #define FRAME_HEIGHT 874 -namespace { -void camera_open(CameraState *s, bool rear) { -} +extern ExitHandler do_exit; -void camera_close(CameraState *s) { - // empty -} +namespace { 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 < ARRAYSIZE(cameras_supported)); @@ -37,38 +24,36 @@ void camera_init(VisionIpcServer * v, CameraState *s, int camera_id, unsigned in s->buf.init(device_id, ctx, s, v, FRAME_BUF_COUNT, rgb_type, yuv_type); } -void run_frame_stream(MultiCameraState *s) { - s->sm = new SubMaster({"frame"}); - - CameraState *const rear_camera = &s->rear; - +void run_frame_stream(CameraState &camera, const char* frame_pkt) { + SubMaster sm({frame_pkt}); size_t buf_idx = 0; while (!do_exit) { - if (s->sm->update(1000) == 0) continue; - - auto frame = (*(s->sm))["frame"].getFrame(); - rear_camera->buf.camera_bufs_metadata[buf_idx] = { - .frame_id = frame.getFrameId(), - .timestamp_eof = frame.getTimestampEof(), - .frame_length = static_cast(frame.getFrameLength()), - .integ_lines = static_cast(frame.getIntegLines()), - .global_gain = static_cast(frame.getGlobalGain()), + if (sm.update(1000) == 0) continue; + + auto msg = static_cast(sm[frame_pkt]); + auto frame = msg.get(frame_pkt).as(); + camera.buf.camera_bufs_metadata[buf_idx] = { + .frame_id = frame.get("frameId").as(), + .timestamp_eof = frame.get("timestampEof").as(), + .frame_length = frame.get("frameLength").as(), + .integ_lines = frame.get("integLines").as(), + .global_gain = frame.get("globalGain").as(), }; - cl_command_queue q = rear_camera->buf.camera_bufs[buf_idx].copy_q; - cl_mem yuv_cl = rear_camera->buf.camera_bufs[buf_idx].buf_cl; + cl_command_queue q = camera.buf.camera_bufs[buf_idx].copy_q; + cl_mem yuv_cl = camera.buf.camera_bufs[buf_idx].buf_cl; - clEnqueueWriteBuffer(q, yuv_cl, CL_TRUE, 0, frame.getImage().size(), frame.getImage().begin(), 0, NULL, NULL); - rear_camera->buf.queue(buf_idx); + auto image = frame.get("image").as(); + clEnqueueWriteBuffer(q, yuv_cl, CL_TRUE, 0, image.size(), image.begin(), 0, NULL, NULL); + camera.buf.queue(buf_idx); buf_idx = (buf_idx + 1) % FRAME_BUF_COUNT; } - - delete s->sm; } } // namespace +// TODO: make this more generic CameraInfo cameras_supported[CAMERA_ID_MAX] = { [CAMERA_ID_IMX298] = { .frame_width = FRAME_WIDTH, @@ -94,29 +79,14 @@ void cameras_init(VisionIpcServer *v, MultiCameraState *s, cl_device_id device_i VISION_STREAM_RGB_FRONT, VISION_STREAM_YUV_FRONT); } +void cameras_open(MultiCameraState *s) {} +void cameras_close(MultiCameraState *s) {} void camera_autoexposure(CameraState *s, float grey_frac) {} - -void cameras_open(MultiCameraState *s) { - // LOG("*** open front ***"); - camera_open(&s->front, false); - - // LOG("*** open rear ***"); - camera_open(&s->rear, true); -} - -void cameras_close(MultiCameraState *s) { - camera_close(&s->rear); -} - -// called by processing_thread -void camera_process_rear(MultiCameraState *s, CameraState *c, int cnt) { - // empty -} +void camera_process_rear(MultiCameraState *s, CameraState *c, int cnt) {} void cameras_run(MultiCameraState *s) { std::thread t = start_process_thread(s, "processing", &s->rear, camera_process_rear); set_thread_name("frame_streaming"); - run_frame_stream(s); + run_frame_stream(s->rear, "frame"); t.join(); - cameras_close(s); }