You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							84 lines
						
					
					
						
							1.8 KiB
						
					
					
				
			
		
		
	
	
							84 lines
						
					
					
						
							1.8 KiB
						
					
					
				#pragma once
 | 
						|
 | 
						|
#include <unordered_map>
 | 
						|
#include <vector>
 | 
						|
 | 
						|
#include <QElapsedTimer>
 | 
						|
#include <QMultiMap>
 | 
						|
#include <QNetworkAccessManager>
 | 
						|
#include <QString>
 | 
						|
#include <QThread>
 | 
						|
 | 
						|
#include <capnp/serialize.h>
 | 
						|
 | 
						|
#include "cereal/gen/cpp/log.capnp.h"
 | 
						|
 | 
						|
#include "selfdrive/camerad/cameras/camera_common.h"
 | 
						|
 | 
						|
class FileReader : public QObject {
 | 
						|
  Q_OBJECT
 | 
						|
 | 
						|
public:
 | 
						|
  FileReader(const QString &fn, QObject *parent = nullptr);
 | 
						|
  void read();
 | 
						|
  void abort();
 | 
						|
 | 
						|
signals:
 | 
						|
  void finished(const QByteArray &dat);
 | 
						|
  void failed(const QString &err);
 | 
						|
 | 
						|
private:
 | 
						|
  void startHttpRequest();
 | 
						|
  QNetworkReply *reply_ = nullptr;
 | 
						|
  QUrl url_;
 | 
						|
};
 | 
						|
 | 
						|
const CameraType ALL_CAMERAS[] = {RoadCam, DriverCam, WideRoadCam};
 | 
						|
const int MAX_CAMERAS = std::size(ALL_CAMERAS);
 | 
						|
 | 
						|
struct EncodeIdx {
 | 
						|
  int segmentNum;
 | 
						|
  uint32_t frameEncodeId;
 | 
						|
};
 | 
						|
 | 
						|
class Event {
 | 
						|
public:
 | 
						|
  Event(const kj::ArrayPtr<const capnp::word> &amsg) : reader(amsg) {
 | 
						|
    words = kj::ArrayPtr<const capnp::word>(amsg.begin(), reader.getEnd());
 | 
						|
    event = reader.getRoot<cereal::Event>();
 | 
						|
    which = event.which();
 | 
						|
    mono_time = event.getLogMonoTime();
 | 
						|
  }
 | 
						|
  inline kj::ArrayPtr<const capnp::byte> bytes() const { return words.asBytes(); }
 | 
						|
 | 
						|
  uint64_t mono_time;
 | 
						|
  cereal::Event::Which which;
 | 
						|
  cereal::Event::Reader event;
 | 
						|
  capnp::FlatArrayMessageReader reader;
 | 
						|
  kj::ArrayPtr<const capnp::word> words;
 | 
						|
};
 | 
						|
 | 
						|
class LogReader : public QObject {
 | 
						|
  Q_OBJECT
 | 
						|
 | 
						|
public:
 | 
						|
  LogReader(const QString &file, QObject *parent = nullptr);
 | 
						|
  ~LogReader();
 | 
						|
  inline bool valid() const { return valid_; }
 | 
						|
 | 
						|
  QMultiMap<uint64_t, Event*> events;
 | 
						|
  std::unordered_map<uint32_t, EncodeIdx> eidx[MAX_CAMERAS] = {};
 | 
						|
 | 
						|
signals:
 | 
						|
  void finished(bool success);
 | 
						|
 | 
						|
private:
 | 
						|
  void parseEvents(const QByteArray &dat);
 | 
						|
 | 
						|
  std::atomic<bool> exit_ = false;
 | 
						|
  std::atomic<bool> valid_ = false;
 | 
						|
  std::vector<uint8_t> raw_;
 | 
						|
 | 
						|
  FileReader *file_reader_ = nullptr;
 | 
						|
  QThread thread_;
 | 
						|
};
 | 
						|
 |