camerad: cleanup syncFirstFrame (#34626)

* cleanup syncFirstFrame

* handle disabled camera
pull/34628/head
Dean Lee 2 months ago committed by GitHub
parent 4674d0ae53
commit 0f5f3c4cb2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 22
      system/camerad/cameras/spectra.cc
  2. 2
      system/camerad/cameras/spectra.h

@ -1425,27 +1425,21 @@ void SpectraCamera::handle_camera_event(const cam_req_mgr_message *event_data) {
} }
bool SpectraCamera::syncFirstFrame(int camera_id, uint64_t raw_id, uint64_t timestamp) { bool SpectraCamera::syncFirstFrame(int camera_id, uint64_t raw_id, uint64_t timestamp) {
std::lock_guard lk(frame_sync_mutex);
if (first_frame_synced) return true; if (first_frame_synced) return true;
// Store the frame data for this camera // Store the frame data for this camera
camera_sync_data[camera_id] = SyncData{raw_id, timestamp, raw_id + 1}; camera_sync_data[camera_id] = SyncData{timestamp, raw_id + 1};
// Ensure all cameras are up // Ensure all cameras are up
bool all_cams_up = true; int enabled_camera_count = std::count_if(std::begin(ALL_CAMERA_CONFIGS), std::end(ALL_CAMERA_CONFIGS),
for (const auto& config : ALL_CAMERA_CONFIGS) { [](const auto &config) { return config.enabled; });
if (camera_sync_data.find(config.camera_num) == camera_sync_data.end()) { bool all_cams_up = camera_sync_data.size() == enabled_camera_count;
all_cams_up = false;
}
}
// Wait until the timestamps line up // Wait until the timestamps line up
bool all_cams_synced = true; bool all_cams_synced = true;
uint64_t reference_timestamp = camera_sync_data.begin()->second.timestamp;
for (const auto &[_, sync_data] : camera_sync_data) { for (const auto &[_, sync_data] : camera_sync_data) {
uint64_t diff = std::max(reference_timestamp, sync_data.timestamp) - uint64_t diff = std::max(timestamp, sync_data.timestamp) -
std::min(reference_timestamp, sync_data.timestamp); std::min(timestamp, sync_data.timestamp);
if (diff > 2*1e6) { // within 2ms if (diff > 2*1e6) { // within 2ms
all_cams_synced = false; all_cams_synced = false;
} }
@ -1453,8 +1447,8 @@ bool SpectraCamera::syncFirstFrame(int camera_id, uint64_t raw_id, uint64_t time
if (all_cams_up && all_cams_synced) { if (all_cams_up && all_cams_synced) {
first_frame_synced = true; first_frame_synced = true;
for (auto &[cam, sync_data] : camera_sync_data) { for (const auto&[cam, sync_data] : camera_sync_data) {
LOGW("camera %d synced on frame_id_offset %ld timestamp %lu", cam, camera_sync_data[cam].frame_id_offset, camera_sync_data[cam].timestamp); LOGW("camera %d synced on frame_id_offset %ld timestamp %lu", cam, sync_data.frame_id_offset, sync_data.timestamp);
} }
} }

@ -202,11 +202,9 @@ public:
private: private:
static bool syncFirstFrame(int camera_id, uint64_t raw_id, uint64_t timestamp); static bool syncFirstFrame(int camera_id, uint64_t raw_id, uint64_t timestamp);
struct SyncData { struct SyncData {
uint64_t raw_id;
uint64_t timestamp; uint64_t timestamp;
uint64_t frame_id_offset = 0; uint64_t frame_id_offset = 0;
}; };
inline static std::map<int, SyncData> camera_sync_data; inline static std::map<int, SyncData> camera_sync_data;
inline static bool first_frame_synced = false; inline static bool first_frame_synced = false;
inline static std::mutex frame_sync_mutex;
}; };

Loading…
Cancel
Save