loggerd: create encoder threads from cameras_logged (#21875)
parent
603ad435be
commit
d9baaf7eb9
|
@ -28,11 +28,11 @@
|
|||
|
||||
#define UI_BUF_COUNT 4
|
||||
|
||||
#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
|
||||
enum CameraType {
|
||||
RoadCam = 0,
|
||||
DriverCam,
|
||||
WideRoadCam
|
||||
};
|
||||
|
||||
const bool env_send_driver = getenv("SEND_DRIVER") != NULL;
|
||||
const bool env_send_road = getenv("SEND_ROAD") != NULL;
|
||||
|
@ -49,6 +49,7 @@ typedef struct CameraInfo {
|
|||
} CameraInfo;
|
||||
|
||||
typedef struct LogCameraInfo {
|
||||
CameraType type;
|
||||
const char* filename;
|
||||
const char* frame_packet_name;
|
||||
const char* encode_idx_name;
|
||||
|
@ -60,6 +61,7 @@ typedef struct LogCameraInfo {
|
|||
bool downscale;
|
||||
bool has_qcamera;
|
||||
bool trigger_rotate;
|
||||
bool enable;
|
||||
} LogCameraInfo;
|
||||
|
||||
typedef struct FrameMetadata {
|
||||
|
|
|
@ -42,7 +42,6 @@ namespace {
|
|||
|
||||
constexpr int MAIN_FPS = 20;
|
||||
const int MAIN_BITRATE = Hardware::TICI() ? 10000000 : 5000000;
|
||||
const int MAX_CAM_IDX = Hardware::TICI() ? LOG_CAMERA_ID_ECAMERA : LOG_CAMERA_ID_DCAMERA;
|
||||
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
|
||||
|
@ -51,8 +50,9 @@ const int SEGMENT_LENGTH = getenv("LOGGERD_TEST") ? atoi(getenv("LOGGERD_SEGMENT
|
|||
|
||||
ExitHandler do_exit;
|
||||
|
||||
LogCameraInfo cameras_logged[LOG_CAMERA_ID_MAX] = {
|
||||
[LOG_CAMERA_ID_FCAMERA] = {
|
||||
const LogCameraInfo cameras_logged[] = {
|
||||
{
|
||||
.type = RoadCam,
|
||||
.stream_type = VISION_STREAM_YUV_BACK,
|
||||
.filename = "fcamera.hevc",
|
||||
.frame_packet_name = "roadCameraState",
|
||||
|
@ -61,9 +61,11 @@ LogCameraInfo cameras_logged[LOG_CAMERA_ID_MAX] = {
|
|||
.is_h265 = true,
|
||||
.downscale = false,
|
||||
.has_qcamera = true,
|
||||
.trigger_rotate = true
|
||||
.trigger_rotate = true,
|
||||
.enable = true,
|
||||
},
|
||||
[LOG_CAMERA_ID_DCAMERA] = {
|
||||
{
|
||||
.type = DriverCam,
|
||||
.stream_type = VISION_STREAM_YUV_FRONT,
|
||||
.filename = "dcamera.hevc",
|
||||
.frame_packet_name = "driverCameraState",
|
||||
|
@ -73,8 +75,10 @@ LogCameraInfo cameras_logged[LOG_CAMERA_ID_MAX] = {
|
|||
.downscale = false,
|
||||
.has_qcamera = false,
|
||||
.trigger_rotate = Hardware::TICI(),
|
||||
.enable = !Hardware::PC() && Params().getBool("RecordFront"),
|
||||
},
|
||||
[LOG_CAMERA_ID_ECAMERA] = {
|
||||
{
|
||||
.type = WideRoadCam,
|
||||
.stream_type = VISION_STREAM_YUV_WIDE,
|
||||
.filename = "ecamera.hevc",
|
||||
.frame_packet_name = "wideRoadCameraState",
|
||||
|
@ -83,18 +87,19 @@ LogCameraInfo cameras_logged[LOG_CAMERA_ID_MAX] = {
|
|||
.is_h265 = true,
|
||||
.downscale = false,
|
||||
.has_qcamera = false,
|
||||
.trigger_rotate = true
|
||||
},
|
||||
[LOG_CAMERA_ID_QCAMERA] = {
|
||||
.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?
|
||||
.trigger_rotate = true,
|
||||
.enable = 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;
|
||||
|
@ -110,9 +115,7 @@ struct LoggerdState {
|
|||
};
|
||||
LoggerdState s;
|
||||
|
||||
void encoder_thread(int cam_idx) {
|
||||
assert(cam_idx < LOG_CAMERA_ID_MAX-1);
|
||||
const LogCameraInfo &cam_info = cameras_logged[cam_idx];
|
||||
void encoder_thread(const LogCameraInfo &cam_info) {
|
||||
set_thread_name(cam_info.filename);
|
||||
|
||||
int cnt = 0, cur_seg = -1;
|
||||
|
@ -135,12 +138,9 @@ void encoder_thread(int cam_idx) {
|
|||
// main encoder
|
||||
encoders.push_back(new Encoder(cam_info.filename, buf_info.width, buf_info.height,
|
||||
cam_info.fps, cam_info.bitrate, cam_info.is_h265, cam_info.downscale));
|
||||
|
||||
// qcamera encoder
|
||||
if (cam_info.has_qcamera) {
|
||||
LogCameraInfo &qcam_info = cameras_logged[LOG_CAMERA_ID_QCAMERA];
|
||||
encoders.push_back(new Encoder(qcam_info.filename,
|
||||
qcam_info.frame_width, qcam_info.frame_height,
|
||||
encoders.push_back(new Encoder(qcam_info.filename, qcam_info.frame_width, qcam_info.frame_height,
|
||||
qcam_info.fps, qcam_info.bitrate, qcam_info.is_h265, qcam_info.downscale));
|
||||
}
|
||||
}
|
||||
|
@ -167,7 +167,7 @@ void encoder_thread(int cam_idx) {
|
|||
cur_seg = s.rotate_segment;
|
||||
cnt = 0;
|
||||
|
||||
LOGW("camera %d rotate encoder to %s", cam_idx, s.segment_path);
|
||||
LOGW("camera %d rotate encoder to %s", cam_info.type, s.segment_path);
|
||||
for (auto &e : encoders) {
|
||||
e->encoder_close();
|
||||
e->encoder_open(s.segment_path);
|
||||
|
@ -191,15 +191,15 @@ void encoder_thread(int cam_idx) {
|
|||
if (i == 0 && out_id != -1) {
|
||||
MessageBuilder msg;
|
||||
// this is really ugly
|
||||
auto eidx = cam_idx == LOG_CAMERA_ID_DCAMERA ? msg.initEvent().initDriverEncodeIdx() :
|
||||
(cam_idx == LOG_CAMERA_ID_ECAMERA ? msg.initEvent().initWideRoadEncodeIdx() : msg.initEvent().initRoadEncodeIdx());
|
||||
auto eidx = cam_info.type == DriverCam ? msg.initEvent().initDriverEncodeIdx() :
|
||||
(cam_info.type == WideRoadCam ? msg.initEvent().initWideRoadEncodeIdx() : msg.initEvent().initRoadEncodeIdx());
|
||||
eidx.setFrameId(extra.frame_id);
|
||||
eidx.setTimestampSof(extra.timestamp_sof);
|
||||
eidx.setTimestampEof(extra.timestamp_eof);
|
||||
if (Hardware::TICI()) {
|
||||
eidx.setType(cereal::EncodeIndex::Type::FULL_H_E_V_C);
|
||||
} else {
|
||||
eidx.setType(cam_idx == LOG_CAMERA_ID_DCAMERA ? cereal::EncodeIndex::Type::FRONT : cereal::EncodeIndex::Type::FULL_H_E_V_C);
|
||||
eidx.setType(cam_info.type == DriverCam ? cereal::EncodeIndex::Type::FRONT : cereal::EncodeIndex::Type::FULL_H_E_V_C);
|
||||
}
|
||||
eidx.setEncodeId(encode_idx);
|
||||
eidx.setSegmentNum(cur_seg);
|
||||
|
@ -294,32 +294,18 @@ int main(int argc, char** argv) {
|
|||
qlog_states[sock] = {.counter = 0, .freq = it.decimation};
|
||||
}
|
||||
|
||||
Params params;
|
||||
|
||||
// init logger
|
||||
logger_init(&s.logger, "rlog", true);
|
||||
logger_rotate();
|
||||
params.put("CurrentRoute", s.logger.route_name);
|
||||
Params().put("CurrentRoute", s.logger.route_name);
|
||||
|
||||
// init encoders
|
||||
s.last_camera_seen_tms = millis_since_boot();
|
||||
// TODO: create these threads dynamically on frame packet presence
|
||||
std::vector<std::thread> encoder_threads;
|
||||
encoder_threads.push_back(std::thread(encoder_thread, LOG_CAMERA_ID_FCAMERA));
|
||||
if (cameras_logged[LOG_CAMERA_ID_FCAMERA].trigger_rotate) {
|
||||
s.max_waiting += 1;
|
||||
}
|
||||
|
||||
if (!Hardware::PC() && params.getBool("RecordFront")) {
|
||||
encoder_threads.push_back(std::thread(encoder_thread, LOG_CAMERA_ID_DCAMERA));
|
||||
if (cameras_logged[LOG_CAMERA_ID_DCAMERA].trigger_rotate) {
|
||||
s.max_waiting += 1;
|
||||
}
|
||||
}
|
||||
if (Hardware::TICI()) {
|
||||
encoder_threads.push_back(std::thread(encoder_thread, LOG_CAMERA_ID_ECAMERA));
|
||||
if (cameras_logged[LOG_CAMERA_ID_ECAMERA].trigger_rotate) {
|
||||
s.max_waiting += 1;
|
||||
for (const auto &ci : cameras_logged) {
|
||||
if (ci.enable) {
|
||||
encoder_threads.push_back(std::thread(encoder_thread, ci));
|
||||
if (ci.trigger_rotate) s.max_waiting++;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
|
||||
#include "cereal/gen/cpp/log.capnp.h"
|
||||
|
||||
#include "selfdrive/camerad/cameras/camera_common.h"
|
||||
|
||||
class FileReader : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
|
@ -31,11 +33,6 @@ private:
|
|||
QUrl url_;
|
||||
};
|
||||
|
||||
enum CameraType {
|
||||
RoadCam = 0,
|
||||
DriverCam,
|
||||
WideRoadCam
|
||||
};
|
||||
const CameraType ALL_CAMERAS[] = {RoadCam, DriverCam, WideRoadCam};
|
||||
const int MAX_CAMERAS = std::size(ALL_CAMERAS);
|
||||
|
||||
|
|
Loading…
Reference in New Issue