From 75dd0d6296753dea9f6817955ef975f8d543fd19 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 24 Nov 2021 09:53:49 +0800 Subject: [PATCH] loggerd: split loggerd.cc into three files --- release/files_common | 2 + selfdrive/loggerd/SConscript | 4 +- selfdrive/loggerd/loggerd.cc | 140 +---------------------------------- selfdrive/loggerd/loggerd.h | 118 +++++++++++++++++++++++++++++ selfdrive/loggerd/main.cc | 20 +++++ 5 files changed, 144 insertions(+), 140 deletions(-) create mode 100644 selfdrive/loggerd/loggerd.h create mode 100644 selfdrive/loggerd/main.cc diff --git a/release/files_common b/release/files_common index aeae351df..2ef34106c 100644 --- a/release/files_common +++ b/release/files_common @@ -306,6 +306,8 @@ selfdrive/loggerd/omx_encoder.h selfdrive/loggerd/logger.cc selfdrive/loggerd/logger.h selfdrive/loggerd/loggerd.cc +selfdrive/loggerd/loggerd.h +selfdrive/loggerd/main.cc selfdrive/loggerd/bootlog.cc selfdrive/loggerd/raw_logger.cc selfdrive/loggerd/raw_logger.h diff --git a/selfdrive/loggerd/SConscript b/selfdrive/loggerd/SConscript index 7e41c9d3e..0d3fe5504 100644 --- a/selfdrive/loggerd/SConscript +++ b/selfdrive/loggerd/SConscript @@ -7,7 +7,7 @@ libs = [logger_lib, common, cereal, messaging, visionipc, 'avformat', 'avcodec', 'swscale', 'avutil', 'yuv', 'bz2', 'OpenCL'] -src = ['loggerd.cc'] +src = ['main.cc', 'loggerd.cc'] if arch in ["aarch64", "larch64"]: src += ['omx_encoder.cc'] libs += ['OmxCore', 'gsl', 'CB'] + gpucommon @@ -24,7 +24,7 @@ if arch == "Darwin": del libs[libs.index('OpenCL')] env['FRAMEWORKS'] = ['OpenCL'] -env.Program(src, LIBS=libs) +env.Program('loggerd', src, LIBS=libs) env.Program('bootlog.cc', LIBS=libs) if GetOption('test'): diff --git a/selfdrive/loggerd/loggerd.cc b/selfdrive/loggerd/loggerd.cc index f6d89b809..0721e836b 100644 --- a/selfdrive/loggerd/loggerd.cc +++ b/selfdrive/loggerd/loggerd.cc @@ -1,128 +1,7 @@ -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "cereal/messaging/messaging.h" -#include "cereal/services.h" -#include "cereal/visionipc/visionipc.h" -#include "cereal/visionipc/visionipc_client.h" -#include "selfdrive/camerad/cameras/camera_common.h" -#include "selfdrive/common/params.h" -#include "selfdrive/common/swaglog.h" -#include "selfdrive/common/timing.h" -#include "selfdrive/common/util.h" -#include "selfdrive/hardware/hw.h" - -#include "selfdrive/loggerd/encoder.h" -#include "selfdrive/loggerd/logger.h" -#if defined(QCOM) || defined(QCOM2) -#include "selfdrive/loggerd/omx_encoder.h" -#define Encoder OmxEncoder -#else -#include "selfdrive/loggerd/raw_logger.h" -#define Encoder RawLogger -#endif - -namespace { - -constexpr int MAIN_FPS = 20; -const int MAIN_BITRATE = Hardware::TICI() ? 10000000 : 5000000; -const int DCAM_BITRATE = Hardware::TICI() ? MAIN_BITRATE : 2500000; - -#define NO_CAMERA_PATIENCE 500 // fall back to time-based rotation if all cameras are dead - -const bool LOGGERD_TEST = getenv("LOGGERD_TEST"); -const int SEGMENT_LENGTH = LOGGERD_TEST ? atoi(getenv("LOGGERD_SEGMENT_LENGTH")) : 60; +#include "selfdrive/loggerd/loggerd.h" ExitHandler do_exit; -const LogCameraInfo cameras_logged[] = { - { - .type = RoadCam, - .stream_type = VISION_STREAM_YUV_BACK, - .filename = "fcamera.hevc", - .frame_packet_name = "roadCameraState", - .fps = MAIN_FPS, - .bitrate = MAIN_BITRATE, - .is_h265 = true, - .downscale = false, - .has_qcamera = true, - .trigger_rotate = true, - .enable = true, - .record = true, - }, - { - .type = DriverCam, - .stream_type = VISION_STREAM_YUV_FRONT, - .filename = "dcamera.hevc", - .frame_packet_name = "driverCameraState", - .fps = MAIN_FPS, // on EONs, more compressed this way - .bitrate = DCAM_BITRATE, - .is_h265 = true, - .downscale = false, - .has_qcamera = false, - .trigger_rotate = Hardware::TICI(), - .enable = !Hardware::PC(), - .record = Params().getBool("RecordFront"), - }, - { - .type = WideRoadCam, - .stream_type = VISION_STREAM_YUV_WIDE, - .filename = "ecamera.hevc", - .frame_packet_name = "wideRoadCameraState", - .fps = MAIN_FPS, - .bitrate = MAIN_BITRATE, - .is_h265 = true, - .downscale = false, - .has_qcamera = false, - .trigger_rotate = true, - .enable = Hardware::TICI(), - .record = Hardware::TICI(), - }, -}; -const LogCameraInfo qcam_info = { - .filename = "qcamera.ts", - .fps = MAIN_FPS, - .bitrate = 256000, - .is_h265 = false, - .downscale = true, - .frame_width = Hardware::TICI() ? 526 : 480, - .frame_height = Hardware::TICI() ? 330 : 360 // keep pixel count the same? -}; - -struct LoggerdState { - Context *ctx; - LoggerState logger = {}; - char segment_path[4096]; - std::mutex rotate_lock; - std::condition_variable rotate_cv; - std::atomic rotate_segment; - std::atomic last_camera_seen_tms; - std::atomic ready_to_rotate; // count of encoders ready to rotate - int max_waiting = 0; - double last_rotate_tms = 0.; // last rotate time in ms - - // Sync logic for startup - std::atomic encoders_ready = 0; - std::atomic start_frame_id = 0; - bool camera_ready[WideRoadCam + 1] = {}; - bool camera_synced[WideRoadCam + 1] = {}; -}; LoggerdState s; // Handle initial encoder syncing by waiting for all encoders to reach the same frame id @@ -306,20 +185,7 @@ void rotate_if_needed() { } } -} // namespace - -int main(int argc, char** argv) { - if (Hardware::EON()) { - setpriority(PRIO_PROCESS, 0, -20); - } else if (Hardware::TICI()) { - int ret; - ret = set_core_affinity({0, 1, 2, 3}); - assert(ret == 0); - // TODO: why does this impact camerad timings? - //ret = set_realtime_priority(1); - //assert(ret == 0); - } - +void loggerd_thread() { clear_locks(); // setup messaging @@ -397,6 +263,4 @@ int main(int argc, char** argv) { for (auto &[sock, qs] : qlog_states) delete sock; delete poller; delete s.ctx; - - return 0; } diff --git a/selfdrive/loggerd/loggerd.h b/selfdrive/loggerd/loggerd.h new file mode 100644 index 000000000..59f4cb670 --- /dev/null +++ b/selfdrive/loggerd/loggerd.h @@ -0,0 +1,118 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cereal/messaging/messaging.h" +#include "cereal/services.h" +#include "cereal/visionipc/visionipc.h" +#include "cereal/visionipc/visionipc_client.h" +#include "selfdrive/camerad/cameras/camera_common.h" +#include "selfdrive/common/params.h" +#include "selfdrive/common/swaglog.h" +#include "selfdrive/common/timing.h" +#include "selfdrive/common/util.h" +#include "selfdrive/hardware/hw.h" + +#include "selfdrive/loggerd/encoder.h" +#include "selfdrive/loggerd/logger.h" +#if defined(QCOM) || defined(QCOM2) +#include "selfdrive/loggerd/omx_encoder.h" +#define Encoder OmxEncoder +#else +#include "selfdrive/loggerd/raw_logger.h" +#define Encoder RawLogger +#endif + +constexpr int MAIN_FPS = 20; +const int MAIN_BITRATE = Hardware::TICI() ? 10000000 : 5000000; +const int DCAM_BITRATE = Hardware::TICI() ? MAIN_BITRATE : 2500000; + +#define NO_CAMERA_PATIENCE 500 // fall back to time-based rotation if all cameras are dead + +const bool LOGGERD_TEST = getenv("LOGGERD_TEST"); +const int SEGMENT_LENGTH = LOGGERD_TEST ? atoi(getenv("LOGGERD_SEGMENT_LENGTH")) : 60; + +const LogCameraInfo cameras_logged[] = { + { + .type = RoadCam, + .stream_type = VISION_STREAM_YUV_BACK, + .filename = "fcamera.hevc", + .frame_packet_name = "roadCameraState", + .fps = MAIN_FPS, + .bitrate = MAIN_BITRATE, + .is_h265 = true, + .downscale = false, + .has_qcamera = true, + .trigger_rotate = true, + .enable = true, + .record = true, + }, + { + .type = DriverCam, + .stream_type = VISION_STREAM_YUV_FRONT, + .filename = "dcamera.hevc", + .frame_packet_name = "driverCameraState", + .fps = MAIN_FPS, // on EONs, more compressed this way + .bitrate = DCAM_BITRATE, + .is_h265 = true, + .downscale = false, + .has_qcamera = false, + .trigger_rotate = Hardware::TICI(), + .enable = !Hardware::PC(), + .record = Params().getBool("RecordFront"), + }, + { + .type = WideRoadCam, + .stream_type = VISION_STREAM_YUV_WIDE, + .filename = "ecamera.hevc", + .frame_packet_name = "wideRoadCameraState", + .fps = MAIN_FPS, + .bitrate = MAIN_BITRATE, + .is_h265 = true, + .downscale = false, + .has_qcamera = false, + .trigger_rotate = true, + .enable = Hardware::TICI(), + .record = Hardware::TICI(), + }, +}; +const LogCameraInfo qcam_info = { + .filename = "qcamera.ts", + .fps = MAIN_FPS, + .bitrate = 256000, + .is_h265 = false, + .downscale = true, + .frame_width = Hardware::TICI() ? 526 : 480, + .frame_height = Hardware::TICI() ? 330 : 360 // keep pixel count the same? +}; + +struct LoggerdState { + Context *ctx; + LoggerState logger = {}; + char segment_path[4096]; + std::mutex rotate_lock; + std::condition_variable rotate_cv; + std::atomic rotate_segment; + std::atomic last_camera_seen_tms; + std::atomic ready_to_rotate; // count of encoders ready to rotate + int max_waiting = 0; + double last_rotate_tms = 0.; // last rotate time in ms + + // Sync logic for startup + std::atomic encoders_ready = 0; + std::atomic start_frame_id = 0; + bool camera_ready[WideRoadCam + 1] = {}; + bool camera_synced[WideRoadCam + 1] = {}; +}; + +void loggerd_thread(); diff --git a/selfdrive/loggerd/main.cc b/selfdrive/loggerd/main.cc new file mode 100644 index 000000000..04da0f67e --- /dev/null +++ b/selfdrive/loggerd/main.cc @@ -0,0 +1,20 @@ +#include "selfdrive/loggerd/loggerd.h" + +#include + +int main(int argc, char** argv) { + if (Hardware::EON()) { + setpriority(PRIO_PROCESS, 0, -20); + } else if (Hardware::TICI()) { + int ret; + ret = set_core_affinity({0, 1, 2, 3}); + assert(ret == 0); + // TODO: why does this impact camerad timings? + //ret = set_realtime_priority(1); + //assert(ret == 0); + } + + loggerd_thread(); + + return 0; +}