loggerd: split loggerd.cc into three files
parent
6462ced209
commit
75dd0d6296
|
@ -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
|
||||
|
|
|
@ -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'):
|
||||
|
|
|
@ -1,128 +1,7 @@
|
|||
#include <ftw.h>
|
||||
#include <pthread.h>
|
||||
#include <sys/resource.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <atomic>
|
||||
#include <cassert>
|
||||
#include <cerrno>
|
||||
#include <condition_variable>
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <mutex>
|
||||
#include <random>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <unordered_map>
|
||||
|
||||
#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<int> rotate_segment;
|
||||
std::atomic<double> last_camera_seen_tms;
|
||||
std::atomic<int> 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<int> encoders_ready = 0;
|
||||
std::atomic<uint32_t> 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;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,118 @@
|
|||
#pragma once
|
||||
|
||||
#include <ftw.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <atomic>
|
||||
#include <cassert>
|
||||
#include <cerrno>
|
||||
#include <condition_variable>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <unordered_map>
|
||||
|
||||
#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<int> rotate_segment;
|
||||
std::atomic<double> last_camera_seen_tms;
|
||||
std::atomic<int> 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<int> encoders_ready = 0;
|
||||
std::atomic<uint32_t> start_frame_id = 0;
|
||||
bool camera_ready[WideRoadCam + 1] = {};
|
||||
bool camera_synced[WideRoadCam + 1] = {};
|
||||
};
|
||||
|
||||
void loggerd_thread();
|
|
@ -0,0 +1,20 @@
|
|||
#include "selfdrive/loggerd/loggerd.h"
|
||||
|
||||
#include <sys/resource.h>
|
||||
|
||||
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;
|
||||
}
|
Loading…
Reference in New Issue