{"record":{"id":"b6329d0b271df3b8","repo":"commaai/openpilot","slug":"no-valid-camera-paths","errorCode":null,"errorMessage":"No valid camera paths","messagePattern":"No valid camera paths","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"openpilot/tools/clip/run.py","lineNumber":175,"sourceCode":"          result = subprocess.run([\"ffmpeg\", \"-v\", \"quiet\", \"-i\", \"-\", \"-f\", \"rawvideo\", \"-pix_fmt\", \"nv12\", \"-\"],\n                                  input=f.read(), capture_output=True)\n        if result.returncode != 0:\n          raise RuntimeError(f\"ffmpeg failed: {result.stderr.decode()}\")\n        seg_frames = np.frombuffer(result.stdout, dtype=np.uint8).reshape(-1, w * h * 3 // 2)\n        get_frame = seg_frames.__getitem__\n      else:\n        get_frame = FrameReader(path, pix_fmt=\"nv12\").get\n\n    assert get_frame is not None\n    yield global_idx, get_frame(local_idx)\n\n\nclass FrameQueue:\n  def __init__(self, camera_paths, start_time, end_time, fps=20, prefetch_count=60, use_qcam=False):\n    # Probe first valid camera file for dimensions\n    first_path = next((p for p in camera_paths if p), None)\n    if not first_path:\n      raise RuntimeError(\"No valid camera paths\")\n    self.frame_w, self.frame_h = get_frame_dimensions(first_path)\n\n    self._queue, self._stop, self._error = queue.Queue(maxsize=prefetch_count), threading.Event(), None\n    self._thread = threading.Thread(target=self._worker,\n                                    args=(camera_paths, start_time, end_time, fps, use_qcam, (self.frame_w, self.frame_h)), daemon=True)\n    self._thread.start()\n\n  def _worker(self, camera_paths, start_time, end_time, fps, use_qcam, frame_size):\n    try:\n      for idx, data in iter_segment_frames(camera_paths, start_time, end_time, fps, use_qcam, frame_size):\n        if self._stop.is_set():\n          break\n        self._queue.put((idx, data.tobytes()))\n    except Exception as e:\n      logger.exception(\"Decode error\")\n      self._error = e\n    finally:\n      self._queue.put(None)","sourceCodeStart":157,"sourceCodeEnd":193,"githubUrl":"https://github.com/commaai/openpilot/blob/516ec1e68203439a73f340f1d0b3b91eabc626ee/openpilot/tools/clip/run.py#L157-L193","documentation":"FrameQueue.__init__ probes the first non-empty entry of camera_paths to learn frame dimensions before starting its worker thread. If every entry is None/empty, there is nothing to probe and it raises. This is an upfront guard: the clip generator cannot even determine frame size, so no frames can be produced.","triggerScenarios":"Constructing FrameQueue with a camera_paths list containing only None or '' (route with no camera segments located); passing an empty list; route resolution logic upstream returned placeholders for missing files.","commonSituations":"Route name typo so segment lookup found nothing; fully un-uploaded route (only logs, no cameras); passing directory names instead of file paths.","solutions":["Verify the route has camera files: list the segments and check qcamera.ts/camera files exist on disk or remotely","Fix route resolution upstream - print camera_paths before constructing FrameQueue and ensure at least one real path","If using remote routes, make sure the tooling has downloaded/linked camera files first"],"exampleFix":"# before\nFrameQueue([None, None], 0, 10)\n\n# after\npaths = [p for p in camera_paths if p]\nassert paths, \"no camera files resolved for this route\"\nFrameQueue(camera_paths, 0, 10)","handlingStrategy":"validation","validationCode":"valid = [p for p in camera_paths if p]\nassert valid, 'camera_paths has no usable entries - resolve the route first'\nimport os\nassert any(os.path.isfile(p) for p in valid), 'no camera files exist on disk'","typeGuard":"def has_valid_camera_paths(camera_paths: list) -> bool:\n    \"\"\"True when at least one camera path is a non-empty string.\"\"\"\n    return any(isinstance(p, str) and p for p in camera_paths)","tryCatchPattern":null,"preventionTips":["Resolve and validate camera file paths before building a FrameQueue; print them for the operator","Treat an all-None path list as a route-resolution bug upstream, not a clip-generation error"],"tags":["clip-tool","route-data","validation","openpilot"],"backgroundTag":null,"analyzedSha":"516ec1e68203439a73f340f1d0b3b91eabc626ee","analyzedAt":"2026-08-15T00:17:37.461Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}