|  |  | @ -57,7 +57,7 @@ TEST_CASE("FileReader") { | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | TEST_CASE("Segment") { |  |  |  | TEST_CASE("Segment") { | 
			
		
	
		
		
			
				
					
					|  |  |  |   auto flags = GENERATE(REPLAY_FLAG_NONE, REPLAY_FLAG_QCAMERA); |  |  |  |   auto flags = GENERATE(REPLAY_FLAG_DCAM | REPLAY_FLAG_ECAM, REPLAY_FLAG_QCAMERA); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   Route demo_route(DEMO_ROUTE); |  |  |  |   Route demo_route(DEMO_ROUTE); | 
			
		
	
		
		
			
				
					
					|  |  |  |   REQUIRE(demo_route.load()); |  |  |  |   REQUIRE(demo_route.load()); | 
			
		
	
		
		
			
				
					
					|  |  |  |   REQUIRE(demo_route.segments().size() == 11); |  |  |  |   REQUIRE(demo_route.segments().size() == 11); | 
			
		
	
	
		
		
			
				
					|  |  | @ -68,21 +68,32 @@ TEST_CASE("Segment") { | 
			
		
	
		
		
			
				
					
					|  |  |  |     REQUIRE(segment.isLoaded() == true); |  |  |  |     REQUIRE(segment.isLoaded() == true); | 
			
		
	
		
		
			
				
					
					|  |  |  |     REQUIRE(segment.log != nullptr); |  |  |  |     REQUIRE(segment.log != nullptr); | 
			
		
	
		
		
			
				
					
					|  |  |  |     REQUIRE(segment.frames[RoadCam] != nullptr); |  |  |  |     REQUIRE(segment.frames[RoadCam] != nullptr); | 
			
		
	
		
		
			
				
					
					|  |  |  |     REQUIRE(segment.frames[DriverCam] == nullptr); |  |  |  |     if (flags & REPLAY_FLAG_DCAM) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     REQUIRE(segment.frames[WideRoadCam] == nullptr); |  |  |  |       REQUIRE(segment.frames[DriverCam] != nullptr); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if (flags & REPLAY_FLAG_ECAM) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       REQUIRE(segment.frames[WideRoadCam] != nullptr); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     // LogReader & FrameReader
 |  |  |  |     // test LogReader & FrameReader
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     REQUIRE(segment.log->events.size() > 0); |  |  |  |     REQUIRE(segment.log->events.size() > 0); | 
			
		
	
		
		
			
				
					
					|  |  |  |     REQUIRE(std::is_sorted(segment.log->events.begin(), segment.log->events.end(), Event::lessThan())); |  |  |  |     REQUIRE(std::is_sorted(segment.log->events.begin(), segment.log->events.end(), Event::lessThan())); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     auto &fr = segment.frames[RoadCam]; |  |  |  |     for (auto cam : ALL_CAMERAS) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     REQUIRE(fr->getFrameCount() == 1200); |  |  |  |       auto &fr = segment.frames[cam]; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     std::unique_ptr<uint8_t[]> rgb_buf = std::make_unique<uint8_t[]>(fr->getRGBSize()); |  |  |  |       if (!fr) continue; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     std::unique_ptr<uint8_t[]> yuv_buf = std::make_unique<uint8_t[]>(fr->getYUVSize()); |  |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     // sequence get 50 frames
 |  |  |  |       if (cam == RoadCam || cam == WideRoadCam) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     for (int i = 0; i < 50; ++i) { |  |  |  |         REQUIRE(fr->getFrameCount() == 1200); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       REQUIRE(fr->get(i, rgb_buf.get(), yuv_buf.get())); |  |  |  |       } | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       std::unique_ptr<uint8_t[]> rgb_buf = std::make_unique<uint8_t[]>(fr->getRGBSize()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       std::unique_ptr<uint8_t[]> yuv_buf = std::make_unique<uint8_t[]>(fr->getYUVSize()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       // sequence get 50 frames
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       for (int i = 0; i < 50; ++i) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         REQUIRE(fr->get(i, rgb_buf.get(), yuv_buf.get())); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     loop.quit(); |  |  |  |     loop.quit(); | 
			
		
	
		
		
			
				
					
					|  |  |  |   }); |  |  |  |   }); | 
			
		
	
		
		
			
				
					
					|  |  |  |   loop.exec(); |  |  |  |   loop.exec(); | 
			
		
	
	
		
		
			
				
					|  |  | @ -134,7 +145,7 @@ void TestReplay::test_seek() { | 
			
		
	
		
		
			
				
					
					|  |  |  |   stream_thread_ = new QThread(this); |  |  |  |   stream_thread_ = new QThread(this); | 
			
		
	
		
		
			
				
					
					|  |  |  |   QEventLoop loop; |  |  |  |   QEventLoop loop; | 
			
		
	
		
		
			
				
					
					|  |  |  |   std::thread thread = std::thread([&]() { |  |  |  |   std::thread thread = std::thread([&]() { | 
			
		
	
		
		
			
				
					
					|  |  |  |     for (int i = 0; i < 100; ++i) { |  |  |  |     for (int i = 0; i < 50; ++i) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |       testSeekTo(random_int(0, 3 * 60)); |  |  |  |       testSeekTo(random_int(0, 3 * 60)); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |     loop.quit(); |  |  |  |     loop.quit(); | 
			
		
	
	
		
		
			
				
					|  |  | 
 |