|  |  | @ -12,7 +12,7 @@ import numpy as np | 
			
		
	
		
		
			
				
					
					|  |  |  | from lru import LRU |  |  |  | from lru import LRU | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | import _io |  |  |  | import _io | 
			
		
	
		
		
			
				
					
					|  |  |  | from openpilot.tools.lib.cache import cache_path_for_file_path |  |  |  | from openpilot.tools.lib.cache import cache_path_for_file_path, DEFAULT_CACHE_DIR | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | from openpilot.tools.lib.exceptions import DataUnreadableError |  |  |  | from openpilot.tools.lib.exceptions import DataUnreadableError | 
			
		
	
		
		
			
				
					
					|  |  |  | from openpilot.common.file_helpers import atomic_write_in_dir |  |  |  | from openpilot.common.file_helpers import atomic_write_in_dir | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -106,8 +106,8 @@ def cache_fn(func): | 
			
		
	
		
		
			
				
					
					|  |  |  |     if kwargs.pop('no_cache', None): |  |  |  |     if kwargs.pop('no_cache', None): | 
			
		
	
		
		
			
				
					
					|  |  |  |       cache_path = None |  |  |  |       cache_path = None | 
			
		
	
		
		
			
				
					
					|  |  |  |     else: |  |  |  |     else: | 
			
		
	
		
		
			
				
					
					|  |  |  |       cache_prefix = kwargs.pop('cache_prefix', None) |  |  |  |       cache_dir = kwargs.pop('cache_dir', DEFAULT_CACHE_DIR) | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |       cache_path = cache_path_for_file_path(fn, cache_prefix) |  |  |  |       cache_path = cache_path_for_file_path(fn, cache_dir) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     if cache_path and os.path.exists(cache_path): |  |  |  |     if cache_path and os.path.exists(cache_path): | 
			
		
	
		
		
			
				
					
					|  |  |  |       with open(cache_path, "rb") as cache_file: |  |  |  |       with open(cache_path, "rb") as cache_file: | 
			
		
	
	
		
		
			
				
					|  |  | @ -140,18 +140,18 @@ def index_stream(fn, typ): | 
			
		
	
		
		
			
				
					
					|  |  |  |   } |  |  |  |   } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def index_videos(camera_paths, cache_prefix=None): |  |  |  | def index_videos(camera_paths, cache_dir=DEFAULT_CACHE_DIR): | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   """Requires that paths in camera_paths are contiguous and of the same type.""" |  |  |  |   """Requires that paths in camera_paths are contiguous and of the same type.""" | 
			
		
	
		
		
			
				
					
					|  |  |  |   if len(camera_paths) < 1: |  |  |  |   if len(camera_paths) < 1: | 
			
		
	
		
		
			
				
					
					|  |  |  |     raise ValueError("must provide at least one video to index") |  |  |  |     raise ValueError("must provide at least one video to index") | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   frame_type = fingerprint_video(camera_paths[0]) |  |  |  |   frame_type = fingerprint_video(camera_paths[0]) | 
			
		
	
		
		
			
				
					
					|  |  |  |   for fn in camera_paths: |  |  |  |   for fn in camera_paths: | 
			
		
	
		
		
			
				
					
					|  |  |  |     index_video(fn, frame_type, cache_prefix) |  |  |  |     index_video(fn, frame_type, cache_dir) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def index_video(fn, frame_type=None, cache_prefix=None): |  |  |  | def index_video(fn, frame_type=None, cache_dir=DEFAULT_CACHE_DIR): | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   cache_path = cache_path_for_file_path(fn, cache_prefix) |  |  |  |   cache_path = cache_path_for_file_path(fn, cache_dir) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   if os.path.exists(cache_path): |  |  |  |   if os.path.exists(cache_path): | 
			
		
	
		
		
			
				
					
					|  |  |  |     return |  |  |  |     return | 
			
		
	
	
		
		
			
				
					|  |  | @ -160,16 +160,16 @@ def index_video(fn, frame_type=None, cache_prefix=None): | 
			
		
	
		
		
			
				
					
					|  |  |  |     frame_type = fingerprint_video(fn[0]) |  |  |  |     frame_type = fingerprint_video(fn[0]) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   if frame_type == FrameType.h265_stream: |  |  |  |   if frame_type == FrameType.h265_stream: | 
			
		
	
		
		
			
				
					
					|  |  |  |     index_stream(fn, "hevc", cache_prefix=cache_prefix) |  |  |  |     index_stream(fn, "hevc", cache_dir=cache_dir) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   else: |  |  |  |   else: | 
			
		
	
		
		
			
				
					
					|  |  |  |     raise NotImplementedError("Only h265 supported") |  |  |  |     raise NotImplementedError("Only h265 supported") | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def get_video_index(fn, frame_type, cache_prefix=None): |  |  |  | def get_video_index(fn, frame_type, cache_dir=DEFAULT_CACHE_DIR): | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   cache_path = cache_path_for_file_path(fn, cache_prefix) |  |  |  |   cache_path = cache_path_for_file_path(fn, cache_dir) | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   if not os.path.exists(cache_path): |  |  |  |   if not os.path.exists(cache_path): | 
			
		
	
		
		
			
				
					
					|  |  |  |     index_video(fn, frame_type, cache_prefix) |  |  |  |     index_video(fn, frame_type, cache_dir) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   if not os.path.exists(cache_path): |  |  |  |   if not os.path.exists(cache_path): | 
			
		
	
		
		
			
				
					
					|  |  |  |     return None |  |  |  |     return None | 
			
		
	
	
		
		
			
				
					|  |  | @ -284,13 +284,13 @@ class BaseFrameReader: | 
			
		
	
		
		
			
				
					
					|  |  |  |     raise NotImplementedError |  |  |  |     raise NotImplementedError | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def FrameReader(fn, cache_prefix=None, readahead=False, readbehind=False, index_data=None): |  |  |  | def FrameReader(fn, cache_dir=DEFAULT_CACHE_DIR, readahead=False, readbehind=False, index_data=None): | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |   frame_type = fingerprint_video(fn) |  |  |  |   frame_type = fingerprint_video(fn) | 
			
		
	
		
		
			
				
					
					|  |  |  |   if frame_type == FrameType.raw: |  |  |  |   if frame_type == FrameType.raw: | 
			
		
	
		
		
			
				
					
					|  |  |  |     return RawFrameReader(fn) |  |  |  |     return RawFrameReader(fn) | 
			
		
	
		
		
			
				
					
					|  |  |  |   elif frame_type in (FrameType.h265_stream,): |  |  |  |   elif frame_type in (FrameType.h265_stream,): | 
			
		
	
		
		
			
				
					
					|  |  |  |     if not index_data: |  |  |  |     if not index_data: | 
			
		
	
		
		
			
				
					
					|  |  |  |       index_data = get_video_index(fn, frame_type, cache_prefix) |  |  |  |       index_data = get_video_index(fn, frame_type, cache_dir) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     return StreamFrameReader(fn, frame_type, index_data, readahead=readahead, readbehind=readbehind) |  |  |  |     return StreamFrameReader(fn, frame_type, index_data, readahead=readahead, readbehind=readbehind) | 
			
		
	
		
		
			
				
					
					|  |  |  |   else: |  |  |  |   else: | 
			
		
	
		
		
			
				
					
					|  |  |  |     raise NotImplementedError(frame_type) |  |  |  |     raise NotImplementedError(frame_type) | 
			
		
	
	
		
		
			
				
					|  |  | 
 |