@@ -424,6 +424,8 @@ def _set_detected_labels(self, cam: CameraSettings) -> None:
424424
425425 det_res = ns .get ("detected_resolution" )
426426 det_fps = ns .get ("detected_fps" )
427+ det_output_format = ns .get ("detected_output_format" )
428+ det_pixel_format = ns .get ("detected_pixel_format" )
427429
428430 if isinstance (det_res , (list , tuple )) and len (det_res ) == 2 :
429431 try :
@@ -439,6 +441,18 @@ def _set_detected_labels(self, cam: CameraSettings) -> None:
439441 else :
440442 self .detected_fps_label .setText ("—" )
441443
444+ self .detected_output_format_label .setText (str (det_output_format ) if det_output_format else "—" )
445+
446+ tooltip_parts = []
447+ if det_output_format :
448+ tooltip_parts .append (f"Backend output: { det_output_format } " )
449+ if det_pixel_format :
450+ tooltip_parts .append (f"Camera PixelFormat: { det_pixel_format } " )
451+
452+ self .detected_output_format_label .setToolTip (
453+ "\n " .join (tooltip_parts ) if tooltip_parts else "Backend-reported output frame format emitted to the app."
454+ )
455+
442456 def _refresh_camera_labels (self ) -> None :
443457 cam_list = getattr (self , "active_cameras_list" , None )
444458 if not cam_list :
@@ -467,11 +481,12 @@ def _format_camera_label(self, cam: CameraSettings, index: int = -1) -> str:
467481 status = "✓" if cam .enabled else "○"
468482 this_id = f"{ (cam .backend or '' ).lower ()} :{ cam .index } "
469483 dlc_indicator = " [DLC]" if this_id == self ._dlc_camera_id and cam .enabled else ""
484+ mono_indicator = " [Mono]" if getattr (cam , "preserve_mono" , False ) else ""
470485
471486 trigger_role = self ._trigger_role_for_label (cam )
472487 trigger_indicator = "" if trigger_role in {"off" , "disabled" } else f" [{ trigger_role } ]"
473488
474- return f"{ status } { cam .name } [{ cam .backend } :{ cam .index } ]{ trigger_indicator } { dlc_indicator } "
489+ return f"{ status } { cam .name } [{ cam .backend } :{ cam .index } ]{ trigger_indicator } { dlc_indicator } { mono_indicator } "
475490
476491 def _selected_detected_camera (self ) -> DetectedCamera | None :
477492 row = self .available_cameras_list .currentRow ()
@@ -1194,6 +1209,8 @@ def _clear_settings_form(self) -> None:
11941209 self .cam_backend_label .setText ("" )
11951210 self .detected_resolution_label .setText ("—" )
11961211 self .detected_fps_label .setText ("—" )
1212+ self .detected_output_format_label .setText ("—" )
1213+ self .detected_output_format_label .setToolTip ("Backend-reported output frame format emitted to the app." )
11971214 self .cam_width .setValue (0 )
11981215 self .cam_height .setValue (0 )
11991216 self .cam_fps .setValue (0.0 )
@@ -1301,6 +1318,8 @@ def _reset_selected_camera(self, *, clear_backend_cache: bool = False) -> None:
13011318 else :
13021319 ns .pop ("detected_resolution" , None )
13031320 ns .pop ("detected_fps" , None )
1321+ ns .pop ("detected_pixel_format" , None )
1322+ ns .pop ("detected_output_format" , None )
13041323 ns .pop ("last_applied_resolution" , None )
13051324
13061325 # Update UI immediately to show "Auto" while probing
@@ -1372,12 +1391,16 @@ def _start_probe_for_camera(self, cam: CameraSettings, *, apply_to_requested: bo
13721391 ns = props .get (backend , {}) if isinstance (props .get (backend , None ), dict ) else {}
13731392 if not apply_to_requested :
13741393 det_res = ns .get ("detected_resolution" )
1394+ det_output = ns .get ("detected_output_format" )
1395+ has_res = False
13751396 if isinstance (det_res , (list , tuple )) and len (det_res ) == 2 :
13761397 try :
1377- if int (det_res [0 ]) > 0 and int (det_res [1 ]) > 0 :
1378- return
1398+ has_res = int (det_res [0 ]) > 0 and int (det_res [1 ]) > 0
13791399 except Exception :
1380- pass
1400+ has_res = False
1401+
1402+ if has_res and det_output :
1403+ return
13811404
13821405 # Start probe worker (settings will be opened in GUI thread for safety)
13831406 self ._probe_worker = CameraProbeWorker (cam , self )
@@ -1404,6 +1427,7 @@ def _on_probe_success(self, payload) -> None:
14041427 actual_res = getattr (be , "actual_resolution" , None )
14051428 actual_fps = getattr (be , "actual_fps" , None )
14061429 actual_pixel_format = getattr (be , "actual_pixel_format" , None )
1430+ actual_output_format = getattr (be , "actual_output_format" , None )
14071431 recommended_preserve_mono = getattr (be , "recommended_preserve_mono" , None )
14081432
14091433 try :
@@ -1427,8 +1451,6 @@ def _on_probe_success(self, payload) -> None:
14271451 # Store regardless of "set_*" support. This is just "what device reports".
14281452 if actual_res and isinstance (actual_res , (list , tuple )) and len (actual_res ) == 2 :
14291453 ns ["detected_resolution" ] = [int (actual_res [0 ]), int (actual_res [1 ])]
1430- elif actual_res and isinstance (actual_res , tuple ) and len (actual_res ) == 2 :
1431- ns ["detected_resolution" ] = [int (actual_res [0 ]), int (actual_res [1 ])]
14321454
14331455 if isinstance (actual_fps , (int , float )) and float (actual_fps ) > 0 :
14341456 ns ["detected_fps" ] = float (actual_fps )
@@ -1437,6 +1459,10 @@ def _on_probe_success(self, payload) -> None:
14371459 ns ["detected_pixel_format" ] = str (actual_pixel_format )
14381460 self ._append_status (f"[Probe] PixelFormat={ actual_pixel_format } " )
14391461
1462+ if actual_output_format :
1463+ ns ["detected_output_format" ] = str (actual_output_format )
1464+ self ._append_status (f"[Probe] OutputFormat={ actual_output_format } " )
1465+
14401466 if recommended_preserve_mono is not None :
14411467 ns ["recommended_preserve_mono" ] = bool (recommended_preserve_mono )
14421468
@@ -1450,6 +1476,9 @@ def _on_probe_success(self, payload) -> None:
14501476 c .preserve_mono = True
14511477 self ._append_status ("[Probe] Mono pixel format detected; enabled Preserve mono frames." )
14521478
1479+ if actual_pixel_format and str (actual_pixel_format ).startswith ("Mono" ):
1480+ ns ["detected_output_format" ] = "Mono8"
1481+
14531482 # ---- Apply detected -> requested (Reset behavior) ----
14541483 if self ._probe_apply_to_requested and self ._probe_target_row == i :
14551484 # Only apply resolution if we actually got it
0 commit comments