|  |  | @ -27,6 +27,7 @@ from openpilot.selfdrive.test.process_replay.vision_meta import meta_from_camera | 
			
		
	
		
		
			
				
					
					|  |  |  | from openpilot.selfdrive.test.process_replay.migration import migrate_all |  |  |  | from openpilot.selfdrive.test.process_replay.migration import migrate_all | 
			
		
	
		
		
			
				
					
					|  |  |  | from openpilot.selfdrive.test.process_replay.capture import ProcessOutputCapture |  |  |  | from openpilot.selfdrive.test.process_replay.capture import ProcessOutputCapture | 
			
		
	
		
		
			
				
					
					|  |  |  | from openpilot.tools.lib.logreader import LogIterable |  |  |  | from openpilot.tools.lib.logreader import LogIterable | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | from openpilot.tools.lib.framereader import BaseFrameReader | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | # Numpy gives different results based on CPU features after version 19 |  |  |  | # Numpy gives different results based on CPU features after version 19 | 
			
		
	
		
		
			
				
					
					|  |  |  | NUMPY_TOLERANCE = 1e-7 |  |  |  | NUMPY_TOLERANCE = 1e-7 | 
			
		
	
	
		
		
			
				
					|  |  | @ -201,16 +202,15 @@ class ProcessContainer: | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     self.environ_config = environ_config |  |  |  |     self.environ_config = environ_config | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def _setup_vision_ipc(self, all_msgs): |  |  |  |   def _setup_vision_ipc(self, all_msgs: LogIterable, frs: Dict[str, Any]): | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     assert len(self.cfg.vision_pubs) != 0 |  |  |  |     assert len(self.cfg.vision_pubs) != 0 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     device_type = next(str(msg.initData.deviceType) for msg in all_msgs if msg.which() == "initData") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     vipc_server = VisionIpcServer("camerad") |  |  |  |     vipc_server = VisionIpcServer("camerad") | 
			
		
	
		
		
			
				
					
					|  |  |  |     streams_metas = available_streams(all_msgs) |  |  |  |     streams_metas = available_streams(all_msgs) | 
			
		
	
		
		
			
				
					
					|  |  |  |     for meta in streams_metas: |  |  |  |     for meta in streams_metas: | 
			
		
	
		
		
			
				
					
					|  |  |  |       if meta.camera_state in self.cfg.vision_pubs: |  |  |  |       if meta.camera_state in self.cfg.vision_pubs: | 
			
		
	
		
		
			
				
					
					|  |  |  |         vipc_server.create_buffers(meta.stream, 2, False, *meta.frame_sizes[device_type]) |  |  |  |         frame_size = (frs[meta.camera_state].w, frs[meta.camera_state].h) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         vipc_server.create_buffers(meta.stream, 2, False, *frame_size) | 
			
		
	
		
		
			
				
					
					|  |  |  |     vipc_server.start_listener() |  |  |  |     vipc_server.start_listener() | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     self.vipc_server = vipc_server |  |  |  |     self.vipc_server = vipc_server | 
			
		
	
	
		
		
			
				
					|  |  | @ -224,7 +224,7 @@ class ProcessContainer: | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def start( |  |  |  |   def start( | 
			
		
	
		
		
			
				
					
					|  |  |  |     self, params_config: Dict[str, Any], environ_config: Dict[str, Any], |  |  |  |     self, params_config: Dict[str, Any], environ_config: Dict[str, Any], | 
			
		
	
		
		
			
				
					
					|  |  |  |     all_msgs: LogIterable, |  |  |  |     all_msgs: LogIterable, frs: Optional[Dict[str, BaseFrameReader]], | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     fingerprint: Optional[str], capture_output: bool |  |  |  |     fingerprint: Optional[str], capture_output: bool | 
			
		
	
		
		
			
				
					
					|  |  |  |   ): |  |  |  |   ): | 
			
		
	
		
		
			
				
					
					|  |  |  |     with self.prefix as p: |  |  |  |     with self.prefix as p: | 
			
		
	
	
		
		
			
				
					|  |  | @ -241,7 +241,8 @@ class ProcessContainer: | 
			
		
	
		
		
			
				
					
					|  |  |  |       self.sockets = [messaging.sub_sock(s, timeout=100) for s in self.cfg.subs] |  |  |  |       self.sockets = [messaging.sub_sock(s, timeout=100) for s in self.cfg.subs] | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       if len(self.cfg.vision_pubs) != 0: |  |  |  |       if len(self.cfg.vision_pubs) != 0: | 
			
		
	
		
		
			
				
					
					|  |  |  |         self._setup_vision_ipc(all_msgs) |  |  |  |         assert frs is not None | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         self._setup_vision_ipc(all_msgs, frs) | 
			
		
	
		
		
			
				
					
					|  |  |  |         assert self.vipc_server is not None |  |  |  |         assert self.vipc_server is not None | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       if capture_output: |  |  |  |       if capture_output: | 
			
		
	
	
		
		
			
				
					|  |  | @ -265,7 +266,7 @@ class ProcessContainer: | 
			
		
	
		
		
			
				
					
					|  |  |  |       self.prefix.clean_dirs() |  |  |  |       self.prefix.clean_dirs() | 
			
		
	
		
		
			
				
					
					|  |  |  |       self._clean_env() |  |  |  |       self._clean_env() | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def run_step(self, msg: capnp._DynamicStructReader, frs: Optional[Dict[str, Any]]) -> List[capnp._DynamicStructReader]: |  |  |  |   def run_step(self, msg: capnp._DynamicStructReader, frs: Optional[Dict[str, BaseFrameReader]]) -> List[capnp._DynamicStructReader]: | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     assert self.rc and self.pm and self.sockets and self.process.proc |  |  |  |     assert self.rc and self.pm and self.sockets and self.process.proc | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     output_msgs = [] |  |  |  |     output_msgs = [] | 
			
		
	
	
		
		
			
				
					|  |  | @ -622,7 +623,7 @@ def replay_process_with_name(name: Union[str, Iterable[str]], lr: LogIterable, * | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def replay_process( |  |  |  | def replay_process( | 
			
		
	
		
		
			
				
					
					|  |  |  |   cfg: Union[ProcessConfig, Iterable[ProcessConfig]], lr: LogIterable, frs: Optional[Dict[str, Any]] = None, |  |  |  |   cfg: Union[ProcessConfig, Iterable[ProcessConfig]], lr: LogIterable, frs: Optional[Dict[str, BaseFrameReader]] = None, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   fingerprint: Optional[str] = None, return_all_logs: bool = False, custom_params: Optional[Dict[str, Any]] = None, |  |  |  |   fingerprint: Optional[str] = None, return_all_logs: bool = False, custom_params: Optional[Dict[str, Any]] = None, | 
			
		
	
		
		
			
				
					
					|  |  |  |   captured_output_store: Optional[Dict[str, Dict[str, str]]] = None, disable_progress: bool = False |  |  |  |   captured_output_store: Optional[Dict[str, Dict[str, str]]] = None, disable_progress: bool = False | 
			
		
	
		
		
			
				
					
					|  |  |  | ) -> List[capnp._DynamicStructReader]: |  |  |  | ) -> List[capnp._DynamicStructReader]: | 
			
		
	
	
		
		
			
				
					|  |  | @ -650,7 +651,7 @@ def replay_process( | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def _replay_multi_process( |  |  |  | def _replay_multi_process( | 
			
		
	
		
		
			
				
					
					|  |  |  |   cfgs: List[ProcessConfig], lr: LogIterable, frs: Optional[Dict[str, Any]], fingerprint: Optional[str], |  |  |  |   cfgs: List[ProcessConfig], lr: LogIterable, frs: Optional[Dict[str, BaseFrameReader]], fingerprint: Optional[str], | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   custom_params: Optional[Dict[str, Any]], captured_output_store: Optional[Dict[str, Dict[str, str]]], disable_progress: bool |  |  |  |   custom_params: Optional[Dict[str, Any]], captured_output_store: Optional[Dict[str, Dict[str, str]]], disable_progress: bool | 
			
		
	
		
		
			
				
					
					|  |  |  | ) -> List[capnp._DynamicStructReader]: |  |  |  | ) -> List[capnp._DynamicStructReader]: | 
			
		
	
		
		
			
				
					
					|  |  |  |   if fingerprint is not None: |  |  |  |   if fingerprint is not None: | 
			
		
	
	
		
		
			
				
					|  |  | @ -677,7 +678,7 @@ def _replay_multi_process( | 
			
		
	
		
		
			
				
					
					|  |  |  |     for cfg in cfgs: |  |  |  |     for cfg in cfgs: | 
			
		
	
		
		
			
				
					
					|  |  |  |       container = ProcessContainer(cfg) |  |  |  |       container = ProcessContainer(cfg) | 
			
		
	
		
		
			
				
					
					|  |  |  |       containers.append(container) |  |  |  |       containers.append(container) | 
			
		
	
		
		
			
				
					
					|  |  |  |       container.start(params_config, env_config, all_msgs, fingerprint, captured_output_store is not None) |  |  |  |       container.start(params_config, env_config, all_msgs, frs, fingerprint, captured_output_store is not None) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     all_pubs = {pub for container in containers for pub in container.pubs} |  |  |  |     all_pubs = {pub for container in containers for pub in container.pubs} | 
			
		
	
		
		
			
				
					
					|  |  |  |     all_subs = {sub for container in containers for sub in container.subs} |  |  |  |     all_subs = {sub for container in containers for sub in container.subs} | 
			
		
	
	
		
		
			
				
					|  |  | 
 |