python-aidot-cameras 1.0.0b26__tar.gz → 1.0.0b27__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.
Files changed (259) hide show
  1. {python_aidot_cameras-1.0.0b26/python_aidot_cameras.egg-info → python_aidot_cameras-1.0.0b27}/PKG-INFO +1 -1
  2. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/sdes_open.py +12 -2
  3. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/pyproject.toml +1 -1
  4. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27/python_aidot_cameras.egg-info}/PKG-INFO +1 -1
  5. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/python_aidot_cameras.egg-info/SOURCES.txt +1 -0
  6. python_aidot_cameras-1.0.0b27/tests/test_avio_ctrl_uses_the_session_dseq.py +81 -0
  7. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/LICENSE +0 -0
  8. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/MANIFEST.in +0 -0
  9. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/README.md +0 -0
  10. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/__init__.py +0 -0
  11. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/__main__.py +0 -0
  12. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_upstream.py +0 -0
  13. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/__init__.py +0 -0
  14. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/LICENSE +0 -0
  15. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/__init__.py +0 -0
  16. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/clock.py +0 -0
  17. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/codecs/__init__.py +0 -0
  18. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/codecs/base.py +0 -0
  19. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/codecs/g711.py +0 -0
  20. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/codecs/g722.py +0 -0
  21. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/codecs/h264.py +0 -0
  22. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/codecs/opus.py +0 -0
  23. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/codecs/vpx.py +0 -0
  24. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/contrib/__init__.py +0 -0
  25. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/contrib/media.py +0 -0
  26. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/contrib/signaling.py +0 -0
  27. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/events.py +0 -0
  28. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/exceptions.py +0 -0
  29. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/jitterbuffer.py +0 -0
  30. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/mediastreams.py +0 -0
  31. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/rate.py +0 -0
  32. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/rtcconfiguration.py +0 -0
  33. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/rtcdatachannel.py +0 -0
  34. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/rtcdtlstransport.py +0 -0
  35. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/rtcicetransport.py +0 -0
  36. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/rtcpeerconnection.py +0 -0
  37. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/rtcrtpparameters.py +0 -0
  38. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/rtcrtpreceiver.py +0 -0
  39. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/rtcrtpsender.py +0 -0
  40. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/rtcrtptransceiver.py +0 -0
  41. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/rtcsctptransport.py +0 -0
  42. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/rtcsessiondescription.py +0 -0
  43. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/rtp.py +0 -0
  44. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/sdp.py +0 -0
  45. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/stats.py +0 -0
  46. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/_vendor/aiortc/utils.py +0 -0
  47. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/ble_gateway.py +0 -0
  48. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/__init__.py +0 -0
  49. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/client.py +0 -0
  50. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/constants.py +0 -0
  51. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/controls.py +0 -0
  52. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/go2rtc.py +0 -0
  53. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/hwaccel.py +0 -0
  54. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/lan_control.py +0 -0
  55. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/models.py +0 -0
  56. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/playback.py +0 -0
  57. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/protocol.py +0 -0
  58. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/sd_events.py +0 -0
  59. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/sd_listing.py +0 -0
  60. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/sd_playback.py +0 -0
  61. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/sdes.py +0 -0
  62. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/tutk.py +0 -0
  63. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/webrtc.py +0 -0
  64. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/camera/webrtc_open.py +0 -0
  65. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/client.py +0 -0
  66. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/const.py +0 -0
  67. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/credentials.py +0 -0
  68. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/crypto.py +0 -0
  69. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/device_client.py +0 -0
  70. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/discover.py +0 -0
  71. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/exceptions.py +0 -0
  72. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/g711.py +0 -0
  73. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/lan_retry.py +0 -0
  74. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/aidot_cameras/py.typed +0 -0
  75. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/python_aidot_cameras.egg-info/dependency_links.txt +0 -0
  76. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/python_aidot_cameras.egg-info/entry_points.txt +0 -0
  77. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/python_aidot_cameras.egg-info/requires.txt +0 -0
  78. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/python_aidot_cameras.egg-info/top_level.txt +0 -0
  79. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/setup.cfg +0 -0
  80. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_aioice_compat.py +0 -0
  81. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_alarm_event.py +0 -0
  82. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_answer_sdp_video_pt.py +0 -0
  83. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_answer_section_selection.py +0 -0
  84. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_audio_mux_offline.py +0 -0
  85. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_avio_request.py +0 -0
  86. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_avio_response_parse.py +0 -0
  87. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_avio_response_router.py +0 -0
  88. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_backoff.py +0 -0
  89. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_battery_detection.py +0 -0
  90. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_battery_evidence_corroboration.py +0 -0
  91. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_battery_skip_turn.py +0 -0
  92. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_bitrate_campaign_arms.py +0 -0
  93. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_ble_gateway.py +0 -0
  94. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_bridge_state_sentinels.py +0 -0
  95. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_busy_backoff.py +0 -0
  96. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_canary_log_names_the_camera.py +0 -0
  97. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_cloud_count.py +0 -0
  98. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_cloud_plan.py +0 -0
  99. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_constants_imports_resolve.py +0 -0
  100. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_control_verdicts.py +0 -0
  101. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_deferred_hardening.py +0 -0
  102. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_device_cmd_seq_match.py +0 -0
  103. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_device_login_guard.py +0 -0
  104. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_device_user_info_cache.py +0 -0
  105. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_direct_ts_serve.py +0 -0
  106. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_dormant_camera_cleanup.py +0 -0
  107. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_drain_is_cancellable.py +0 -0
  108. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_dtls_mux_terminal_write.py +0 -0
  109. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_dtls_not_ready_burst.py +0 -0
  110. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_dtls_pinning.py +0 -0
  111. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_dtls_resolution_ack.py +0 -0
  112. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_dtls_serve_decode_skip.py +0 -0
  113. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_dtls_serve_ice_wait.py +0 -0
  114. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_dtls_serve_open_timeout.py +0 -0
  115. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_dtls_skip_signaling_wait.py +0 -0
  116. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_dtls_slow_probe.py +0 -0
  117. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_dtls_stdout_producer.py +0 -0
  118. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_dtls_video_presence.py +0 -0
  119. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_egress_guard.py +0 -0
  120. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_env_seams.py +0 -0
  121. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_feature_probe_needs_a_live_session.py +0 -0
  122. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_ffmpeg_signal_exit_is_not_a_crash.py +0 -0
  123. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_futile_keepalive.py +0 -0
  124. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_gate_requires_a_decoded_frame.py +0 -0
  125. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_go2rtc.py +0 -0
  126. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_go2rtc_cli.py +0 -0
  127. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_h264_decode_rate_limit.py +0 -0
  128. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_highport_nomination.py +0 -0
  129. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_hwaccel_probe.py +0 -0
  130. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_ice_config_cache.py +0 -0
  131. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_ice_peer_reflexive.py +0 -0
  132. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_idle_release_both_loops.py +0 -0
  133. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_keepalive_renew.py +0 -0
  134. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_key_restart_sdp.py +0 -0
  135. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_keyframe_prompter.py +0 -0
  136. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_lan_control.py +0 -0
  137. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_lan_retry_reaches_the_storming_devices.py +0 -0
  138. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_late_repeats_are_dropped.py +0 -0
  139. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_light_active_color_mode.py +0 -0
  140. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_live_session_carries_talk.py +0 -0
  141. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_live_stream_param.py +0 -0
  142. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_live_validate_policy.py +0 -0
  143. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_live_video_canary.py +0 -0
  144. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_local_only_controls.py +0 -0
  145. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_logging_caps.py +0 -0
  146. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_login_connect_deadline.py +0 -0
  147. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_login_reconnect_backoff.py +0 -0
  148. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_media_counted_only_when_plaintext.py +0 -0
  149. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_media_socket_rcvbuf.py +0 -0
  150. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_media_wait_floor.py +0 -0
  151. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_motion_poll.py +0 -0
  152. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_mqtt_client_id_is_exact.py +0 -0
  153. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_mqtt_credential_refetch.py +0 -0
  154. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_mqtt_credential_self_heal.py +0 -0
  155. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_mqtt_password_not_persisted.py +0 -0
  156. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_mqtt_session_reconnect.py +0 -0
  157. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_mqtt_thread_not_orphaned.py +0 -0
  158. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_nack.py +0 -0
  159. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_nack_cannot_add_load_in_a_burst.py +0 -0
  160. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_narrow_pc_ice.py +0 -0
  161. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_no_key_material_in_logs.py +0 -0
  162. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_no_self_referential_go2rtc.py +0 -0
  163. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_no_undefined_names.py +0 -0
  164. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_offer_keeps_rtcp_feedback.py +0 -0
  165. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_offline_keepalive_pause.py +0 -0
  166. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_on_frame_is_an_av_frame.py +0 -0
  167. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_open_fail_logger.py +0 -0
  168. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_open_gate_delay.py +0 -0
  169. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_peerid_reuse.py +0 -0
  170. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_persistent_mqtt.py +0 -0
  171. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_persistent_mqtt_robustness.py +0 -0
  172. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_playback_tls.py +0 -0
  173. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_post_merge_hardening.py +0 -0
  174. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_ptz_probe_reads_what_it_is_told.py +0 -0
  175. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_public_signature_matches_impl.py +0 -0
  176. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_quality_campaign_in_session.py +0 -0
  177. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_recent_recordings.py +0 -0
  178. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_remb.py +0 -0
  179. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_resent_frames_are_dropped.py +0 -0
  180. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_resolution_persists.py +0 -0
  181. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_restart_cycle.py +0 -0
  182. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_retry_policy.py +0 -0
  183. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_scripts_importable.py +0 -0
  184. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sctp_init_ack_tsn.py +0 -0
  185. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sd_card_presence.py +0 -0
  186. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sd_event_decode.py +0 -0
  187. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sd_event_probe_payloads.py +0 -0
  188. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sd_listing.py +0 -0
  189. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sd_playback.py +0 -0
  190. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_adaptive.py +0 -0
  191. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_avio_dispatch.py +0 -0
  192. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_bridge_break_gate.py +0 -0
  193. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_echo_wait_timeout.py +0 -0
  194. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_fast_liveplay.py +0 -0
  195. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_ffmpeg_stderr_log.py +0 -0
  196. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_first_media_stall_report.py +0 -0
  197. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_idle_release.py +0 -0
  198. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_nack_bridge.py +0 -0
  199. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_offer_video_order.py +0 -0
  200. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_offer_video_pin.py +0 -0
  201. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_open_cleanup.py +0 -0
  202. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_sctp_abort.py +0 -0
  203. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_serve_audio.py +0 -0
  204. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_serve_cmd.py +0 -0
  205. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_serve_stderr_drain.py +0 -0
  206. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_sprop.py +0 -0
  207. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_talk.py +0 -0
  208. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_teardown_exit_log.py +0 -0
  209. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_terminal_ack.py +0 -0
  210. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_terminal_ack_latency.py +0 -0
  211. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdes_watchdog.py +0 -0
  212. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdp_narrowing_properties.py +0 -0
  213. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sdp_payload_type_narrowing.py +0 -0
  214. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_security_hardening.py +0 -0
  215. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_self_peer_is_an_address_not_an_ip.py +0 -0
  216. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_serializable_login_info.py +0 -0
  217. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_serve_loss_tolerance.py +0 -0
  218. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_serve_pt_respects_the_pin.py +0 -0
  219. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_serve_relay.py +0 -0
  220. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_serve_stderr_keeps_the_reason.py +0 -0
  221. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_session_stats.py +0 -0
  222. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_shared_house_seam.py +0 -0
  223. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_snapshot_cancellation.py +0 -0
  224. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_speak.py +0 -0
  225. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sprop_capture_gate.py +0 -0
  226. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sprop_staleness.py +0 -0
  227. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sprop_unstable_public.py +0 -0
  228. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_sprop_write_is_reported_truthfully.py +0 -0
  229. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_srtp_rx_rekey.py +0 -0
  230. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_srtp_tx_key_note.py +0 -0
  231. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_stall_report_says_what_the_answer_carried.py +0 -0
  232. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_stall_report_says_whether_the_trigger_was_answered.py +0 -0
  233. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_stall_report_separates_silence_from_undecryptable.py +0 -0
  234. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_stall_report_survives_a_caller_giving_up.py +0 -0
  235. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_stall_reports_reach_the_artifact.py +0 -0
  236. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_stream_cap.py +0 -0
  237. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_stream_drain_ownership.py +0 -0
  238. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_stream_idle.py +0 -0
  239. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_stream_slot_cap.py +0 -0
  240. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_stream_teardown.py +0 -0
  241. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_talk.py +0 -0
  242. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_talk_reports_a_speaker_that_never_opened.py +0 -0
  243. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_tap_to_mux_end_to_end.py +0 -0
  244. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_terminal_ack.py +0 -0
  245. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_token_file_robustness.py +0 -0
  246. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_token_refresh.py +0 -0
  247. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_turn_create_permission.py +0 -0
  248. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_tutk_path_is_out_of_reach.py +0 -0
  249. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_upstream_compat.py +0 -0
  250. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_video_profile_log.py +0 -0
  251. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_video_pts_dts.py +0 -0
  252. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_video_ts_unwrap.py +0 -0
  253. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_viewer_check_throttle.py +0 -0
  254. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_viewer_presence.py +0 -0
  255. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_viewer_present_push_mode.py +0 -0
  256. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_wait_or_event.py +0 -0
  257. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_wake_gate_camera_evidence.py +0 -0
  258. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/tests/test_wake_readiness_retry.py +0 -0
  259. {python_aidot_cameras-1.0.0b26 → python_aidot_cameras-1.0.0b27}/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.0b26
3
+ Version: 1.0.0b27
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
@@ -4208,10 +4208,20 @@ class _SdesOpenMixin:
4208
4208
  # pattern as the LIVING send above). dcep_sock/dcep_src are the
4209
4209
  # socket+addr the SCTP handshake (and LIVING) used.
4210
4210
  import struct as _st_pcmd
4211
- import random as _r_pcmd
4212
4211
 
4213
4212
  def _persistent_sdes_cmd(_cmd, _extra=b''):
4214
- _seq = _r_pcmd.randint(0, 0x7FFFFFFF)
4213
+ # dSeq, not a random number. The app's
4214
+ # sendCtrl() takes this from a per-client
4215
+ # counter that starts at 100 and increments
4216
+ # on every control command, and we keep the
4217
+ # same counter for livePlayReq already.
4218
+ # Filling the slot randomly was the only
4219
+ # field in the 28-byte header that differed
4220
+ # from the app's. Parity, not a fix: PTZ
4221
+ # (AVIO 0x1001) pans through this very
4222
+ # builder with a random dSeq, so the camera
4223
+ # is not validating it.
4224
+ _seq = self._next_dseq()
4215
4225
  _ts = int(_time_br.time() * 1000)
4216
4226
  _avio = _st_pcmd.pack('<IIqII4x', _seq, _cmd, _ts,
4217
4227
  len(_extra), 0) + _extra
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "python-aidot-cameras"
7
- version = "1.0.0b26"
7
+ version = "1.0.0b27"
8
8
  description = "Control AiDot/Leedarson WiFi lights and cameras (WebRTC streaming, two-way audio, PTZ, controls)"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-aidot-cameras
3
- Version: 1.0.0b26
3
+ Version: 1.0.0b27
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
@@ -79,6 +79,7 @@ tests/test_alarm_event.py
79
79
  tests/test_answer_sdp_video_pt.py
80
80
  tests/test_answer_section_selection.py
81
81
  tests/test_audio_mux_offline.py
82
+ tests/test_avio_ctrl_uses_the_session_dseq.py
82
83
  tests/test_avio_request.py
83
84
  tests/test_avio_response_parse.py
84
85
  tests/test_avio_response_router.py
@@ -0,0 +1,81 @@
1
+ """AVIO control commands carry the session dSeq, as the app's do.
2
+
3
+ Read out of the app (`KVSWebRTCChannel`, decompiled) 2026-08-23. Its control
4
+ header is 28 bytes little-endian and ours agrees on every field but one:
5
+
6
+ offset app ours (before this change)
7
+ 0 live-play dSeq random.randint(0, 0x7FFFFFFF)
8
+ 4 cmd cmd
9
+ 8 timestamp (long, ms) same
10
+ 16 payload length len(payload)
11
+ 20 0 0
12
+ 24 pad pad
13
+
14
+ `sendCtrl(cmd, bytes)` calls `generateLivePlayDSeq()` first: a per-client
15
+ counter that starts at 100 and increments on EVERY control command. The app
16
+ routes 16 of its 17 commands that way and only the heartbeat (0x1424 / 5156)
17
+ without one. We already keep that counter -- `_next_dseq`, commented "app
18
+ parity (Q0(): starts at 100, increments)" -- and used it for `livePlayReq`
19
+ only, filling the control frames with a random number instead.
20
+
21
+ **This is parity, not a fix.** It is explicitly NOT the reason SETSTREAMCTRL is
22
+ ignored: `button.*_ptz_*` is AVIO 0x1001 sent through the identical frame
23
+ builder with the same random dSeq, and it is class A on physical evidence --
24
+ "the camera pans. Mean frame difference across a 5 s pan: 25.2 at speed 4,
25
+ 38.6 at speed 200, against a no-command control of 2.6." A camera that pans on
26
+ a random dSeq is not validating it. Closing the gap removes the last known
27
+ framing difference from the app; it is not expected to change any behaviour,
28
+ and the PTZ pan must still work afterwards.
29
+ """
30
+ import pathlib
31
+ import re
32
+
33
+ _SRC = pathlib.Path(__file__).resolve().parents[1] / "aidot_cameras" / "camera"
34
+
35
+
36
+ def _client_cls():
37
+ import aidot_cameras.camera.client as cc
38
+ return next(v for v in vars(cc).values()
39
+ if isinstance(v, type) and "_next_dseq" in v.__dict__)
40
+
41
+
42
+ def test_the_counter_starts_at_100_and_increments():
43
+ cam = _client_cls().__new__(_client_cls())
44
+ cam._live_dseq = 100
45
+ assert [cam._next_dseq() for _ in range(4)] == [100, 101, 102, 103]
46
+
47
+
48
+ def test_control_commands_and_live_play_share_one_counter():
49
+ # The app keys its counter on the client id, not on the command, so a
50
+ # control command consumes a number from the same run as livePlayReq.
51
+ cam = _client_cls().__new__(_client_cls())
52
+ cam._live_dseq = 100
53
+ first = cam._next_dseq()
54
+ second = cam._next_dseq()
55
+ assert second == first + 1
56
+
57
+
58
+ def test_the_avio_control_frame_no_longer_uses_a_random_dseq():
59
+ """Binds the test to the real send site, which lives in a closure.
60
+
61
+ Without this the unit tests above would still pass with the production
62
+ frame builder untouched -- the same reason the media-counter gate has a
63
+ source guard.
64
+ """
65
+ src = (_SRC / "sdes_open.py").read_text()
66
+ m = re.search(r"def _persistent_sdes_cmd\(.*?\n(?P<body>(?:.*\n){0,12})", src)
67
+ assert m, "could not find the persistent AVIO command sender"
68
+ body = m.group("body")
69
+ assert "randint" not in body, (
70
+ "the AVIO control frame still fills the dSeq slot with a random number; "
71
+ "the app fills it with the live-play counter")
72
+ assert "_next_dseq" in body, (
73
+ "the AVIO control frame must take its dSeq from the session counter "
74
+ "(_next_dseq), the way livePlayReq already does")
75
+
76
+
77
+ def test_the_header_layout_is_unchanged():
78
+ # Only the VALUE in the dSeq slot changes. The layout is verified
79
+ # byte-for-byte against the app: 28 bytes, little-endian, dSeq/cmd/ts/len/0.
80
+ src = (_SRC / "sdes_open.py").read_text()
81
+ assert "'<IIqII4x'" in src, "the 28-byte little-endian AVIO header must not change"