|
|
@ -58,15 +58,13 @@ struct RemoteEncoder { |
|
|
|
bool seen_first_packet = false; |
|
|
|
bool seen_first_packet = false; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
int handle_encoder_msg(LoggerdState *s, Message *msg, std::string &name, struct RemoteEncoder &re) { |
|
|
|
int handle_encoder_msg(LoggerdState *s, Message *msg, std::string &name, struct RemoteEncoder &re, EncoderInfo encoder_info) { |
|
|
|
const LogCameraInfo &cam_info = (name == "driverEncodeData") ? cameras_logged[1] : |
|
|
|
|
|
|
|
((name == "wideRoadEncodeData") ? cameras_logged[2] : |
|
|
|
|
|
|
|
((name == "qRoadEncodeData") ? qcam_info : cameras_logged[0])); |
|
|
|
|
|
|
|
int bytes_count = 0; |
|
|
|
int bytes_count = 0; |
|
|
|
|
|
|
|
|
|
|
|
// extract the message
|
|
|
|
// extract the message
|
|
|
|
capnp::FlatArrayMessageReader cmsg(kj::ArrayPtr<capnp::word>((capnp::word *)msg->getData(), msg->getSize() / sizeof(capnp::word))); |
|
|
|
capnp::FlatArrayMessageReader cmsg(kj::ArrayPtr<capnp::word>((capnp::word *)msg->getData(), msg->getSize() / sizeof(capnp::word))); |
|
|
|
auto event = cmsg.getRoot<cereal::Event>(); |
|
|
|
auto event = cmsg.getRoot<cereal::Event>(); |
|
|
|
|
|
|
|
// TODO this should be dealt with generically
|
|
|
|
auto edata = (name == "driverEncodeData") ? event.getDriverEncodeData() : |
|
|
|
auto edata = (name == "driverEncodeData") ? event.getDriverEncodeData() : |
|
|
|
((name == "wideRoadEncodeData") ? event.getWideRoadEncodeData() : |
|
|
|
((name == "wideRoadEncodeData") ? event.getWideRoadEncodeData() : |
|
|
|
((name == "qRoadEncodeData") ? event.getQRoadEncodeData() : event.getRoadEncodeData())); |
|
|
|
((name == "qRoadEncodeData") ? event.getQRoadEncodeData() : event.getRoadEncodeData())); |
|
|
@ -95,7 +93,7 @@ int handle_encoder_msg(LoggerdState *s, Message *msg, std::string &name, struct |
|
|
|
// we are in this segment now, process any queued messages before this one
|
|
|
|
// we are in this segment now, process any queued messages before this one
|
|
|
|
if (!re.q.empty()) { |
|
|
|
if (!re.q.empty()) { |
|
|
|
for (auto &qmsg: re.q) { |
|
|
|
for (auto &qmsg: re.q) { |
|
|
|
bytes_count += handle_encoder_msg(s, qmsg, name, re); |
|
|
|
bytes_count += handle_encoder_msg(s, qmsg, name, re, encoder_info); |
|
|
|
} |
|
|
|
} |
|
|
|
re.q.clear(); |
|
|
|
re.q.clear(); |
|
|
|
} |
|
|
|
} |
|
|
@ -111,10 +109,10 @@ int handle_encoder_msg(LoggerdState *s, Message *msg, std::string &name, struct |
|
|
|
re.dropped_frames = 0; |
|
|
|
re.dropped_frames = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
// if we aren't actually recording, don't create the writer
|
|
|
|
// if we aren't actually recording, don't create the writer
|
|
|
|
if (cam_info.record) { |
|
|
|
if (encoder_info.record) { |
|
|
|
re.writer.reset(new VideoWriter(s->segment_path, |
|
|
|
re.writer.reset(new VideoWriter(s->segment_path, |
|
|
|
cam_info.filename, idx.getType() != cereal::EncodeIndex::Type::FULL_H_E_V_C, |
|
|
|
encoder_info.filename, idx.getType() != cereal::EncodeIndex::Type::FULL_H_E_V_C, |
|
|
|
cam_info.frame_width, cam_info.frame_height, cam_info.fps, idx.getType())); |
|
|
|
encoder_info.frame_width, encoder_info.frame_height, encoder_info.fps, idx.getType())); |
|
|
|
// write the header
|
|
|
|
// write the header
|
|
|
|
auto header = edata.getHeader(); |
|
|
|
auto header = edata.getHeader(); |
|
|
|
re.writer->write((uint8_t *)header.begin(), header.size(), idx.getTimestampEof()/1000, true, false); |
|
|
|
re.writer->write((uint8_t *)header.begin(), header.size(), idx.getTimestampEof()/1000, true, false); |
|
|
@ -142,6 +140,7 @@ int handle_encoder_msg(LoggerdState *s, Message *msg, std::string &name, struct |
|
|
|
MessageBuilder bmsg; |
|
|
|
MessageBuilder bmsg; |
|
|
|
auto evt = bmsg.initEvent(event.getValid()); |
|
|
|
auto evt = bmsg.initEvent(event.getValid()); |
|
|
|
evt.setLogMonoTime(event.getLogMonoTime()); |
|
|
|
evt.setLogMonoTime(event.getLogMonoTime()); |
|
|
|
|
|
|
|
// TODO this should be dealt with generically
|
|
|
|
if (name == "driverEncodeData") { evt.setDriverEncodeIdx(idx); } |
|
|
|
if (name == "driverEncodeData") { evt.setDriverEncodeIdx(idx); } |
|
|
|
if (name == "wideRoadEncodeData") { evt.setWideRoadEncodeIdx(idx); } |
|
|
|
if (name == "wideRoadEncodeData") { evt.setWideRoadEncodeIdx(idx); } |
|
|
|
if (name == "qRoadEncodeData") { evt.setQRoadEncodeIdx(idx); } |
|
|
|
if (name == "qRoadEncodeData") { evt.setQRoadEncodeIdx(idx); } |
|
|
@ -211,11 +210,12 @@ void loggerd_thread() { |
|
|
|
logger_rotate(&s); |
|
|
|
logger_rotate(&s); |
|
|
|
Params().put("CurrentRoute", s.logger.route_name); |
|
|
|
Params().put("CurrentRoute", s.logger.route_name); |
|
|
|
|
|
|
|
|
|
|
|
// init encoders
|
|
|
|
std::map<std::string, EncoderInfo> encoder_infos_dict; |
|
|
|
s.last_camera_seen_tms = millis_since_boot(); |
|
|
|
|
|
|
|
for (const auto &cam : cameras_logged) { |
|
|
|
for (const auto &cam : cameras_logged) { |
|
|
|
s.max_waiting++; |
|
|
|
for (const auto &encoder_info: cam.encoder_infos) { |
|
|
|
if (cam.has_qcamera) { s.max_waiting++; } |
|
|
|
encoder_infos_dict[encoder_info.publish_name] = encoder_info; |
|
|
|
|
|
|
|
s.max_waiting++; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
uint64_t msg_count = 0, bytes_count = 0; |
|
|
|
uint64_t msg_count = 0, bytes_count = 0; |
|
|
@ -234,7 +234,7 @@ void loggerd_thread() { |
|
|
|
|
|
|
|
|
|
|
|
if (qs.encoder) { |
|
|
|
if (qs.encoder) { |
|
|
|
s.last_camera_seen_tms = millis_since_boot(); |
|
|
|
s.last_camera_seen_tms = millis_since_boot(); |
|
|
|
bytes_count += handle_encoder_msg(&s, msg, qs.name, remote_encoders[sock]); |
|
|
|
bytes_count += handle_encoder_msg(&s, msg, qs.name, remote_encoders[sock], encoder_infos_dict[qs.name]); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
logger_log(&s.logger, (uint8_t *)msg->getData(), msg->getSize(), in_qlog); |
|
|
|
logger_log(&s.logger, (uint8_t *)msg->getData(), msg->getSize(), in_qlog); |
|
|
|
bytes_count += msg->getSize(); |
|
|
|
bytes_count += msg->getSize(); |
|
|
|