parent
							
								
									627c6260cf
								
							
						
					
					
						commit
						67677a4539
					
				
				 1 changed files with 0 additions and 92 deletions
			
			
		@ -1,92 +0,0 @@ | 
				
			|||||||
"""RouteFrameReader indexes and reads frames across routes, by frameId or segment indices.""" | 
					 | 
				
			||||||
from tools.lib.framereader import FrameReader | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class _FrameReaderDict(dict): | 
					 | 
				
			||||||
  def __init__(self, camera_paths, cache_paths, framereader_kwargs, *args, **kwargs): | 
					 | 
				
			||||||
    super(_FrameReaderDict, self).__init__(*args, **kwargs) | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if cache_paths is None: | 
					 | 
				
			||||||
      cache_paths = {} | 
					 | 
				
			||||||
    if not isinstance(cache_paths, dict): | 
					 | 
				
			||||||
      cache_paths = dict(enumerate(cache_paths)) | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    self._camera_paths = camera_paths | 
					 | 
				
			||||||
    self._cache_paths = cache_paths | 
					 | 
				
			||||||
    self._framereader_kwargs = framereader_kwargs | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def __missing__(self, key): | 
					 | 
				
			||||||
    if self._camera_paths.get(key, None) is not None: | 
					 | 
				
			||||||
      frame_reader = FrameReader(self._camera_paths[key], | 
					 | 
				
			||||||
                                 self._cache_paths.get(key), **self._framereader_kwargs) | 
					 | 
				
			||||||
      self[key] = frame_reader | 
					 | 
				
			||||||
      return frame_reader | 
					 | 
				
			||||||
    else: | 
					 | 
				
			||||||
      raise KeyError("Segment index out of bounds: {}".format(key)) | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class RouteFrameReader(object): | 
					 | 
				
			||||||
  """Reads frames across routes and route segments by frameId.""" | 
					 | 
				
			||||||
  def __init__(self, camera_paths, cache_paths, frame_id_lookup, **kwargs): | 
					 | 
				
			||||||
    """Create a route framereader. | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       Inputs: | 
					 | 
				
			||||||
        TODO | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        kwargs: Forwarded to the FrameReader function. If cache_prefix is included, that path | 
					 | 
				
			||||||
                will also be used for frame position indices. | 
					 | 
				
			||||||
    """ | 
					 | 
				
			||||||
    if not isinstance(camera_paths, dict): | 
					 | 
				
			||||||
      camera_paths = {int(k.split('?')[0].split('/')[-2]): k for k in camera_paths if k is not None} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    self._first_camera_idx = min(camera_paths.keys()) | 
					 | 
				
			||||||
    self._frame_readers = _FrameReaderDict(camera_paths, cache_paths, kwargs) | 
					 | 
				
			||||||
    self._frame_id_lookup = frame_id_lookup | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @property | 
					 | 
				
			||||||
  def w(self): | 
					 | 
				
			||||||
    """Width of each frame in pixels.""" | 
					 | 
				
			||||||
    return self._frame_readers[self._first_camera_idx].w | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @property | 
					 | 
				
			||||||
  def h(self): | 
					 | 
				
			||||||
    """Height of each frame in pixels.""" | 
					 | 
				
			||||||
    return self._frame_readers[self._first_camera_idx].h | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def get(self, frame_id, **kwargs): | 
					 | 
				
			||||||
    """Get a frame for a route based on frameId. | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       Inputs: | 
					 | 
				
			||||||
        frame_id: The frameId of the returned frame. | 
					 | 
				
			||||||
        kwargs: Forwarded to BaseFrameReader.get. "count" is not implemented. | 
					 | 
				
			||||||
    """ | 
					 | 
				
			||||||
    segment_num, segment_id = self._frame_id_lookup.get(frame_id, (None, None)) | 
					 | 
				
			||||||
    if segment_num is None or segment_num == -1 or segment_id == -1: | 
					 | 
				
			||||||
      return None | 
					 | 
				
			||||||
    else: | 
					 | 
				
			||||||
      return self.get_from_segment(segment_num, segment_id, **kwargs) | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def get_from_segment(self, segment_num, segment_id, **kwargs): | 
					 | 
				
			||||||
    """Get a frame from a specific segment with a specific index in that segment (segment_id). | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       Inputs: | 
					 | 
				
			||||||
        segment_num: The number of the segment. | 
					 | 
				
			||||||
        segment_id: The index of the return frame within that segment. | 
					 | 
				
			||||||
        kwargs: Forwarded to BaseFrameReader.get. "count" is not implemented. | 
					 | 
				
			||||||
    """ | 
					 | 
				
			||||||
    if "count" in kwargs: | 
					 | 
				
			||||||
      raise NotImplementedError("count") | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return self._frame_readers[segment_num].get(segment_id, **kwargs)[0] | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def close(self): | 
					 | 
				
			||||||
    frs = self._frame_readers | 
					 | 
				
			||||||
    self._frame_readers.clear() | 
					 | 
				
			||||||
    for fr in frs: | 
					 | 
				
			||||||
      fr.close() | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def __enter__(self): | 
					 | 
				
			||||||
    return self | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  def __exit__(self, exc_type, exc_value, traceback): | 
					 | 
				
			||||||
    self.close() | 
					 | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue