| 
						
						
						
					 | 
					 | 
					@ -1,18 +1,19 @@ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include "tools/replay/logreader.h" | 
					 | 
					 | 
					 | 
					#include "tools/replay/logreader.h" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <algorithm> | 
					 | 
					 | 
					 | 
					#include <algorithm> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					#include <utility> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include "tools/replay/filereader.h" | 
					 | 
					 | 
					 | 
					#include "tools/replay/filereader.h" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include "tools/replay/util.h" | 
					 | 
					 | 
					 | 
					#include "tools/replay/util.h" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					bool LogReader::load(const std::string &url, std::atomic<bool> *abort, bool local_cache, int chunk_size, int retries) { | 
					 | 
					 | 
					 | 
					bool LogReader::load(const std::string &url, std::atomic<bool> *abort, bool local_cache, int chunk_size, int retries) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  raw_ = FileReader(local_cache, chunk_size, retries).read(url, abort); | 
					 | 
					 | 
					 | 
					  std::string data = FileReader(local_cache, chunk_size, retries).read(url, abort); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (raw_.empty()) return false; | 
					 | 
					 | 
					 | 
					  if (!data.empty() && url.find(".bz2") != std::string::npos) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    data = decompressBZ2(data, abort); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  if (url.find(".bz2") != std::string::npos) { | 
					 | 
					 | 
					 | 
					  bool success = !data.empty() && load(data.data(), data.size(), abort); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    raw_ = decompressBZ2(raw_, abort); | 
					 | 
					 | 
					 | 
					  if (filters_.empty()) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if (raw_.empty()) return false; | 
					 | 
					 | 
					 | 
					    raw_ = std::move(data); | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } | 
					 | 
					 | 
					 | 
					  return success; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  return load(raw_.data(), raw_.size(), abort); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					bool LogReader::load(const char *data, size_t size, std::atomic<bool> *abort) { | 
					 | 
					 | 
					 | 
					bool LogReader::load(const char *data, size_t size, std::atomic<bool> *abort) { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -23,9 +24,18 @@ bool LogReader::load(const char *data, size_t size, std::atomic<bool> *abort) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      capnp::FlatArrayMessageReader reader(words); | 
					 | 
					 | 
					 | 
					      capnp::FlatArrayMessageReader reader(words); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      auto event = reader.getRoot<cereal::Event>(); | 
					 | 
					 | 
					 | 
					      auto event = reader.getRoot<cereal::Event>(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      auto which = event.which(); | 
					 | 
					 | 
					 | 
					      auto which = event.which(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      uint64_t mono_time = event.getLogMonoTime(); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      auto event_data = kj::arrayPtr(words.begin(), reader.getEnd()); | 
					 | 
					 | 
					 | 
					      auto event_data = kj::arrayPtr(words.begin(), reader.getEnd()); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      words = kj::arrayPtr(reader.getEnd(), words.end()); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      if (!filters_.empty()) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (which >= filters_.size() || !filters_[which]) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					          continue; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        auto buf = buffer_.allocate(event_data.size() * sizeof(capnp::word)); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        memcpy(buf, event_data.begin(), event_data.size() * sizeof(capnp::word)); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					        event_data = kj::arrayPtr((const capnp::word *)buf, event_data.size()); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      uint64_t mono_time = event.getLogMonoTime(); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      const Event &evt = events.emplace_back(which, mono_time, event_data); | 
					 | 
					 | 
					 | 
					      const Event &evt = events.emplace_back(which, mono_time, event_data); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      // Add encodeIdx packet again as a frame packet for the video stream
 | 
					 | 
					 | 
					 | 
					      // Add encodeIdx packet again as a frame packet for the video stream
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if (evt.which == cereal::Event::ROAD_ENCODE_IDX || | 
					 | 
					 | 
					 | 
					      if (evt.which == cereal::Event::ROAD_ENCODE_IDX || | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -37,8 +47,6 @@ bool LogReader::load(const char *data, size_t size, std::atomic<bool> *abort) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        } | 
					 | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        events.emplace_back(which, mono_time, event_data, idx.getSegmentNum()); | 
					 | 
					 | 
					 | 
					        events.emplace_back(which, mono_time, event_data, idx.getSegmentNum()); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      } | 
					 | 
					 | 
					 | 
					      } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      words = kj::arrayPtr(reader.getEnd(), words.end()); | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    } | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  } catch (const kj::Exception &e) { | 
					 | 
					 | 
					 | 
					  } catch (const kj::Exception &e) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    rWarning("Failed to parse log : %s.\nRetrieved %zu events from corrupt log", e.getDescription().cStr(), events.size()); | 
					 | 
					 | 
					 | 
					    rWarning("Failed to parse log : %s.\nRetrieved %zu events from corrupt log", e.getDescription().cStr(), events.size()); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |