python-aidot-cameras 1.0.0rc7__tar.gz → 1.0.0rc9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {python_aidot_cameras-1.0.0rc7/python_aidot_cameras.egg-info → python_aidot_cameras-1.0.0rc9}/PKG-INFO +2 -1
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/README.md +1 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/sdes_open.py +348 -103
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/webrtc_open.py +66 -5
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/pyproject.toml +1 -1
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9/python_aidot_cameras.egg-info}/PKG-INFO +2 -1
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/python_aidot_cameras.egg-info/SOURCES.txt +2 -1
- python_aidot_cameras-1.0.0rc9/tests/test_nominates_as_soon_as_the_answer_lands.py +404 -0
- python_aidot_cameras-1.0.0rc9/tests/test_sdes_echo_wait_is_not_dead_time.py +154 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_turn_create_permission.py +17 -11
- python_aidot_cameras-1.0.0rc7/tests/test_sdes_echo_wait_timeout.py +0 -20
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/LICENSE +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/MANIFEST.in +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/__init__.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/__main__.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_upstream.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/__init__.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/LICENSE +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/__init__.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/clock.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/codecs/__init__.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/codecs/base.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/codecs/g711.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/codecs/g722.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/codecs/h264.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/codecs/opus.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/codecs/vpx.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/contrib/__init__.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/contrib/media.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/contrib/signaling.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/events.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/exceptions.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/jitterbuffer.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/mediastreams.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/rate.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/rtcconfiguration.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/rtcdatachannel.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/rtcdtlstransport.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/rtcicetransport.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/rtcpeerconnection.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/rtcrtpparameters.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/rtcrtpreceiver.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/rtcrtpsender.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/rtcrtptransceiver.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/rtcsctptransport.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/rtcsessiondescription.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/rtp.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/sdp.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/stats.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/_vendor/aiortc/utils.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/ble_gateway.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/__init__.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/client.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/constants.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/controls.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/go2rtc.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/hwaccel.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/lan_control.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/models.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/playback.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/protocol.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/sd_events.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/sd_listing.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/sd_playback.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/sdes.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/tutk.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/camera/webrtc.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/client.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/cloud_auth.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/const.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/credentials.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/crypto.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/device_client.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/discover.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/exceptions.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/g711.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/lan_retry.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/aidot_cameras/py.typed +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/python_aidot_cameras.egg-info/dependency_links.txt +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/python_aidot_cameras.egg-info/entry_points.txt +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/python_aidot_cameras.egg-info/requires.txt +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/python_aidot_cameras.egg-info/top_level.txt +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/setup.cfg +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_aioice_compat.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_alarm_event.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_answer_pt_kinds.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_answer_sdp_video_pt.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_answer_section_selection.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_audio_mux_offline.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_avio_ctrl_uses_the_session_dseq.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_avio_request.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_avio_response_parse.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_avio_response_router.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_backoff.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_battery_detection.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_battery_evidence_corroboration.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_battery_skip_turn.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_battery_stale_offer_is_abandoned_early.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_battery_wake_gate_app_parity.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_bitrate_campaign_arms.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_ble_gateway.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_bridge_state_sentinels.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_busy_backoff.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_camera_properties.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_canary_log_names_the_camera.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_cloud_count.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_cloud_plan.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_constants_imports_resolve.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_control_verdicts.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_deferred_hardening.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_device_cmd_seq_match.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_device_login_guard.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_device_user_info_cache.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_direct_ts_keyframe_signal.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_direct_ts_serve.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_dormant_camera_cleanup.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_drain_is_cancellable.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_dtls_mux_terminal_write.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_dtls_not_ready_burst.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_dtls_pinning.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_dtls_resolution_ack.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_dtls_serve_decode_skip.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_dtls_serve_ice_wait.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_dtls_serve_open_timeout.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_dtls_skip_signaling_wait.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_dtls_slow_probe.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_dtls_stdout_producer.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_dtls_video_presence.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_egress_guard.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_env_seams.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_feature_probe_needs_a_live_session.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_ffmpeg_signal_exit_is_not_a_crash.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_futile_keepalive.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_gate_requires_a_decoded_frame.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_go2rtc.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_go2rtc_cli.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_h264_decode_rate_limit.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_highport_nomination.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_hwaccel_probe.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_ice_config_cache.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_ice_peer_reflexive.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_idle_release_both_loops.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_keepalive_renew.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_key_restart_sdp.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_keyframe_prompter.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_lan_control.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_lan_retry_reaches_the_storming_devices.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_late_repeats_are_dropped.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_light_active_color_mode.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_live_session_carries_talk.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_live_stream_param.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_live_validate_policy.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_live_video_canary.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_liveplay_echo_timeout.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_local_only_controls.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_logging_caps.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_login_connect_deadline.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_login_reconnect_backoff.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_media_counted_only_when_plaintext.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_media_path_is_reported.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_media_socket_rcvbuf.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_media_wait_floor.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_motion_poll.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_mqtt_client_id_is_exact.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_mqtt_credential_refetch.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_mqtt_credential_self_heal.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_mqtt_password_not_persisted.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_mqtt_session_reconnect.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_mqtt_thread_not_orphaned.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_nack.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_nack_cannot_add_load_in_a_burst.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_narrow_pc_ice.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_no_key_material_in_logs.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_no_self_referential_go2rtc.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_no_undefined_names.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_off_subnet_candidate.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_offer_bandwidth_line.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_offer_keeps_rtcp_feedback.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_offline_keepalive_pause.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_on_frame_is_an_av_frame.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_open_fail_logger.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_open_gate_delay.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_peer_id_client_type.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_peerid_reuse.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_persistent_mqtt.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_persistent_mqtt_robustness.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_playback_tls.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_post_merge_hardening.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_ptz_probe_reads_what_it_is_told.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_public_signature_matches_impl.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_publish_target_readiness.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_quality_campaign_in_session.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_reboot_action.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_recent_recordings.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_remb.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_remb_goes_out_the_relay_aware_sender.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_resent_frames_are_dropped.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_resolution_persists.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_restart_cycle.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_retry_policy.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_scripts_importable.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sctp_init_ack_tsn.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sctp_reassembly.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sctp_sack.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sd_card_presence.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sd_event_decode.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sd_event_probe_payloads.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sd_listing.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sd_playback.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_adaptive.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_avio_dispatch.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_bridge_break_gate.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_connection_mode.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_fast_liveplay.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_ffmpeg_stderr_log.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_first_media_stall_report.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_ice_teardown.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_idle_release.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_nack_bridge.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_offer_video_order.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_offer_video_pin.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_open_cleanup.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_sctp_abort.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_serve_audio.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_serve_cmd.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_serve_stderr_drain.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_session_cap.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_sprop.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_talk.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_teardown_exit_log.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_terminal_ack.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_terminal_ack_latency.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_tmmbr_bridge.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdes_watchdog.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdp_narrowing_properties.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sdp_payload_type_narrowing.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_security_hardening.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_self_peer_is_an_address_not_an_ip.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_serializable_login_info.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_serve_input_timeout.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_serve_loss_tolerance.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_serve_pt_respects_the_pin.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_serve_relay.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_serve_stderr_keeps_the_reason.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_session_stats.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_shared_house_seam.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_signalling_is_attributable_to_a_camera.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_snapshot_cancellation.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_speak.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sprop_capture_gate.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sprop_staleness.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sprop_unstable_public.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_sprop_write_is_reported_truthfully.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_srtp_rx_rekey.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_srtp_tx_key_note.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_stable_terminal_id.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_stall_nudge_policy.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_stall_report_says_what_the_answer_carried.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_stall_report_says_whether_the_trigger_was_answered.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_stall_report_separates_silence_from_undecryptable.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_stall_report_survives_a_caller_giving_up.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_stall_reports_reach_the_artifact.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_stream_cap.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_stream_drain_ownership.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_stream_idle.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_stream_slot_cap.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_stream_teardown.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_talk.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_talk_reports_a_speaker_that_never_opened.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_tap_to_mux_end_to_end.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_terminal_ack.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_tmmbr.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_token_file_robustness.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_token_refresh.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_tutk_path_is_out_of_reach.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_upstream_compat.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_validator_shares_one_token.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_video_profile_log.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_video_pts_dts.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_video_ts_unwrap.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_viewer_check_throttle.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_viewer_presence.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_viewer_present_push_mode.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_wait_or_event.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_wake_gate_camera_evidence.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_wake_readiness_retry.py +0 -0
- {python_aidot_cameras-1.0.0rc7 → python_aidot_cameras-1.0.0rc9}/tests/test_webrtc_answer_race.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-aidot-cameras
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.0rc9
|
|
4
4
|
Summary: Control AiDot/Leedarson WiFi lights and cameras (WebRTC streaming, two-way audio, PTZ, controls)
|
|
5
5
|
Author-email: cbrightly <chris.brightly@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -572,6 +572,7 @@ audio, idle release, the sprop cache path) are documented in
|
|
|
572
572
|
| `AIDOT_BATTERY_STALE_OFFER_GRACE_S` | Backstop for a **battery** attempt that stalls anyway, in seconds (`0` disables it). When the camera was silent as the first-media wait began, has since turned up, and has still sent no media after this long, the attempt is abandoned to the retry instead of holding the full 75 s window - a stalled camera answers and then sends nothing, while the retry's fresh offer is served in about 5 s. Measured from the camera's first sighting rather than its latest message, because a camera emitting an event every 5 s while its handshake goes nowhere would otherwise push the decision out until it had gone back to sleep. Sized clear of the slowest healthy open (10.7 s) so a merely slow attempt is never mistaken for a stalled one. | `15` |
|
|
573
573
|
| `AIDOT_SDES_SERVE_AUDIO` | Include the camera's audio in what an SDES camera serves, on both the RTSP-push and http-serve paths. **On by default** for parity with the official app; set to `0`/`false`/`no`/`off` for video only, which is what a consumer that cannot cope with the audio wants. The standalone CLI reads this; inside Home Assistant the per-camera **Camera audio** switch is the same setting and should be used instead. | enabled (on) |
|
|
574
574
|
| `AIDOT_SDES_NACK` | Ask the camera to resend video RTP packets that never arrived (RTCP Generic NACK). A camera losing packets on a weak link otherwise delivers truncated H.264 slices, which a browser's WebRTC decoder conceals but Media Source Extensions treats as fatal. Measured on an A001064 at ~1-2% loss: 98.4% of losses recovered against none at all without it. Costs nothing on a clean link, where no requests are generated. **On by default**; set to `0`/`false`/`no`/`off` to disable. | enabled (on) |
|
|
575
|
+
| `AIDOT_SDES_ECHO_WAIT_S` | How long to wait for the broker to echo our own `webrtcReq` back before carrying on, in seconds, for the role-reversal models that build a `webrtcResp` from that echo (A001513-class cameras never took this wait and are unaffected). Like `AIDOT_SDES_LIVEPLAY_ECHO_S` it was pure latency: across 18 h of one deployment, of 61 SDES opens the 17 that took the wait timed out 17 times out of 17 at a mean of 2.086 s, the `webrtcResp` it exists to build was never sent once, and all 17 streamed anyway. Measured on an A001064: time to first media 4195 ms -> 2489 ms. **This value is the wait for a camera never seen to echo.** An echo observed at any point, including after the wait has already expired, is remembered for that camera and every later open on it waits `2.0` s again - so a fleet whose echo band is not empty pays the miss once, says so in the log, and is never shortened again. Setting this explicitly overrides both. Read on every open and clamped at 0, so a malformed or negative value falls back to the default instead of raising. | `0.25` (`2.0` once an echo has been seen) |
|
|
575
576
|
| `AIDOT_SDES_VIDEO_PT` | Pin the SDES offer to ONE video codec by payload type, so the camera cannot choose. The offer advertises 96 (H264) and 97 (H265) and the camera decides which to send; on an A001064 that means the same request comes back h264 1280x720 most sessions and hevc 2560x1440 occasionally, at a third of the bitrate. Set to `96` for H264 only (measured h264 720p in 4 of 4 sessions). **Do not set it to `97`** - an H265-only offer returned no video at all in 3 of 3 rounds; narrowing to H265 removes the option rather than selecting it. | unset (both offered) |
|
|
576
577
|
| `AIDOT_SDES_VIDEO_PT_ORDER` | Reorder the SDES offer's video codec list without narrowing it, as a comma-separated preference list (`97,96`). RFC 3264 makes the `m=video` payload-type list a preference list, most-preferred first, and ours has always read `96 97` - not by decision, it has simply never been varied. Whatever is named leads and the rest is appended, so this can express a preference and can never produce a narrowed or empty video m-line. **Experimental and untested on hardware:** whether the camera acts on the order is the open question, so the default is deliberately unchanged. **Tested on hardware 2026-08-23 and it does not select the codec.** Eight sessions on an A001064 in blocks of two: H265 came back in 2 of 4 with the order reversed and 2 of 4 without it, receipts confirming the reordered list reached the SDP. The motive was real - an H265 session costs about half an H264 one (766-774 vs 1597-1685 Kbps) - but the camera picks the codec itself, roughly a coin flip, and RFC 3264 preference order does not move it. | unset (`96 97`) |
|
|
577
578
|
| `AIDOT_SDES_OFFER_BANDWIDTH_KBPS` | Add a `b=AS:<kbps>` receive-bandwidth ceiling (RFC 4566) to the video section of the SDES offer. **Measured to do nothing** on an A001064 over ten sessions; kept, off, alongside `AIDOT_REMB_TARGET_BPS` for the same reason. Run as a strict ABAB campaign it appeared to give a decisive 2.1x reduction - that was a codec split, not the knob. | unset (no `b=` line) |
|
|
@@ -532,6 +532,7 @@ audio, idle release, the sprop cache path) are documented in
|
|
|
532
532
|
| `AIDOT_BATTERY_STALE_OFFER_GRACE_S` | Backstop for a **battery** attempt that stalls anyway, in seconds (`0` disables it). When the camera was silent as the first-media wait began, has since turned up, and has still sent no media after this long, the attempt is abandoned to the retry instead of holding the full 75 s window - a stalled camera answers and then sends nothing, while the retry's fresh offer is served in about 5 s. Measured from the camera's first sighting rather than its latest message, because a camera emitting an event every 5 s while its handshake goes nowhere would otherwise push the decision out until it had gone back to sleep. Sized clear of the slowest healthy open (10.7 s) so a merely slow attempt is never mistaken for a stalled one. | `15` |
|
|
533
533
|
| `AIDOT_SDES_SERVE_AUDIO` | Include the camera's audio in what an SDES camera serves, on both the RTSP-push and http-serve paths. **On by default** for parity with the official app; set to `0`/`false`/`no`/`off` for video only, which is what a consumer that cannot cope with the audio wants. The standalone CLI reads this; inside Home Assistant the per-camera **Camera audio** switch is the same setting and should be used instead. | enabled (on) |
|
|
534
534
|
| `AIDOT_SDES_NACK` | Ask the camera to resend video RTP packets that never arrived (RTCP Generic NACK). A camera losing packets on a weak link otherwise delivers truncated H.264 slices, which a browser's WebRTC decoder conceals but Media Source Extensions treats as fatal. Measured on an A001064 at ~1-2% loss: 98.4% of losses recovered against none at all without it. Costs nothing on a clean link, where no requests are generated. **On by default**; set to `0`/`false`/`no`/`off` to disable. | enabled (on) |
|
|
535
|
+
| `AIDOT_SDES_ECHO_WAIT_S` | How long to wait for the broker to echo our own `webrtcReq` back before carrying on, in seconds, for the role-reversal models that build a `webrtcResp` from that echo (A001513-class cameras never took this wait and are unaffected). Like `AIDOT_SDES_LIVEPLAY_ECHO_S` it was pure latency: across 18 h of one deployment, of 61 SDES opens the 17 that took the wait timed out 17 times out of 17 at a mean of 2.086 s, the `webrtcResp` it exists to build was never sent once, and all 17 streamed anyway. Measured on an A001064: time to first media 4195 ms -> 2489 ms. **This value is the wait for a camera never seen to echo.** An echo observed at any point, including after the wait has already expired, is remembered for that camera and every later open on it waits `2.0` s again - so a fleet whose echo band is not empty pays the miss once, says so in the log, and is never shortened again. Setting this explicitly overrides both. Read on every open and clamped at 0, so a malformed or negative value falls back to the default instead of raising. | `0.25` (`2.0` once an echo has been seen) |
|
|
535
536
|
| `AIDOT_SDES_VIDEO_PT` | Pin the SDES offer to ONE video codec by payload type, so the camera cannot choose. The offer advertises 96 (H264) and 97 (H265) and the camera decides which to send; on an A001064 that means the same request comes back h264 1280x720 most sessions and hevc 2560x1440 occasionally, at a third of the bitrate. Set to `96` for H264 only (measured h264 720p in 4 of 4 sessions). **Do not set it to `97`** - an H265-only offer returned no video at all in 3 of 3 rounds; narrowing to H265 removes the option rather than selecting it. | unset (both offered) |
|
|
536
537
|
| `AIDOT_SDES_VIDEO_PT_ORDER` | Reorder the SDES offer's video codec list without narrowing it, as a comma-separated preference list (`97,96`). RFC 3264 makes the `m=video` payload-type list a preference list, most-preferred first, and ours has always read `96 97` - not by decision, it has simply never been varied. Whatever is named leads and the rest is appended, so this can express a preference and can never produce a narrowed or empty video m-line. **Experimental and untested on hardware:** whether the camera acts on the order is the open question, so the default is deliberately unchanged. **Tested on hardware 2026-08-23 and it does not select the codec.** Eight sessions on an A001064 in blocks of two: H265 came back in 2 of 4 with the order reversed and 2 of 4 without it, receipts confirming the reordered list reached the SDP. The motive was real - an H265 session costs about half an H264 one (766-774 vs 1597-1685 Kbps) - but the camera picks the codec itself, roughly a coin flip, and RFC 3264 preference order does not move it. | unset (`96 97`) |
|
|
537
538
|
| `AIDOT_SDES_OFFER_BANDWIDTH_KBPS` | Add a `b=AS:<kbps>` receive-bandwidth ceiling (RFC 4566) to the video section of the SDES offer. **Measured to do nothing** on an A001064 over ten sessions; kept, off, alongside `AIDOT_REMB_TARGET_BPS` for the same reason. Run as a strict ABAB campaign it appeared to give a decisive 2.1x reduction - that was a codec split, not the knob. | unset (no `b=` line) |
|