viam-sdk 0.3.0__py3-none-linux_armv6l.whl → 0.66.0__py3-none-linux_armv6l.whl
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.
Potentially problematic release.
This version of viam-sdk might be problematic. Click here for more details.
- viam/__init__.py +29 -2
- viam/app/_logs.py +34 -0
- viam/app/app_client.py +2696 -0
- viam/app/billing_client.py +185 -0
- viam/app/data_client.py +2231 -0
- viam/app/ml_training_client.py +249 -0
- viam/app/provisioning_client.py +93 -0
- viam/app/viam_client.py +275 -0
- viam/components/arm/__init__.py +3 -26
- viam/components/arm/arm.py +123 -8
- viam/components/arm/client.py +37 -24
- viam/components/arm/service.py +35 -32
- viam/components/audio_in/__init__.py +24 -0
- viam/components/audio_in/audio_in.py +74 -0
- viam/components/audio_in/client.py +76 -0
- viam/components/audio_in/service.py +83 -0
- viam/components/audio_out/__init__.py +21 -0
- viam/components/audio_out/audio_out.py +72 -0
- viam/components/audio_out/client.py +67 -0
- viam/components/audio_out/service.py +63 -0
- viam/components/base/__init__.py +6 -11
- viam/components/base/base.py +134 -8
- viam/components/base/client.py +51 -23
- viam/components/base/service.py +33 -30
- viam/components/board/__init__.py +3 -12
- viam/components/board/board.py +247 -91
- viam/components/board/client.py +149 -83
- viam/components/board/service.py +63 -33
- viam/components/button/__init__.py +10 -0
- viam/components/button/button.py +41 -0
- viam/components/button/client.py +52 -0
- viam/components/button/service.py +46 -0
- viam/components/camera/__init__.py +3 -3
- viam/components/camera/camera.py +62 -27
- viam/components/camera/client.py +59 -27
- viam/components/camera/service.py +42 -65
- viam/components/component_base.py +28 -5
- viam/components/encoder/__init__.py +1 -1
- viam/components/encoder/client.py +25 -14
- viam/components/encoder/encoder.py +48 -10
- viam/components/encoder/service.py +14 -18
- viam/components/gantry/__init__.py +1 -13
- viam/components/gantry/client.py +80 -25
- viam/components/gantry/gantry.py +123 -9
- viam/components/gantry/service.py +51 -29
- viam/components/generic/__init__.py +1 -1
- viam/components/generic/client.py +21 -8
- viam/components/generic/generic.py +10 -2
- viam/components/generic/service.py +12 -7
- viam/components/gripper/__init__.py +3 -13
- viam/components/gripper/client.py +69 -21
- viam/components/gripper/gripper.py +123 -3
- viam/components/gripper/service.py +44 -22
- viam/components/input/__init__.py +1 -14
- viam/components/input/client.py +55 -23
- viam/components/input/input.py +106 -3
- viam/components/input/service.py +16 -21
- viam/components/motor/__init__.py +1 -21
- viam/components/motor/client.py +56 -33
- viam/components/motor/motor.py +127 -4
- viam/components/motor/service.py +33 -44
- viam/components/movement_sensor/__init__.py +1 -1
- viam/components/movement_sensor/client.py +102 -45
- viam/components/movement_sensor/movement_sensor.py +130 -61
- viam/components/movement_sensor/service.py +38 -41
- viam/components/pose_tracker/__init__.py +1 -1
- viam/components/pose_tracker/client.py +18 -7
- viam/components/pose_tracker/pose_tracker.py +4 -2
- viam/components/pose_tracker/service.py +12 -10
- viam/components/power_sensor/__init__.py +17 -0
- viam/components/power_sensor/client.py +86 -0
- viam/components/power_sensor/power_sensor.py +104 -0
- viam/components/power_sensor/service.py +72 -0
- viam/components/sensor/__init__.py +2 -1
- viam/components/sensor/client.py +26 -10
- viam/components/sensor/sensor.py +22 -4
- viam/components/sensor/service.py +20 -11
- viam/components/servo/__init__.py +1 -13
- viam/components/servo/client.py +47 -21
- viam/components/servo/service.py +15 -22
- viam/components/servo/servo.py +61 -2
- viam/components/switch/__init__.py +10 -0
- viam/components/switch/client.py +83 -0
- viam/components/switch/service.py +72 -0
- viam/components/switch/switch.py +98 -0
- viam/errors.py +10 -0
- viam/gen/app/agent/v1/agent_grpc.py +29 -0
- viam/gen/app/agent/v1/agent_pb2.py +47 -0
- viam/gen/app/agent/v1/agent_pb2.pyi +280 -0
- viam/gen/app/cloudslam/v1/__init__.py +0 -0
- viam/gen/app/cloudslam/v1/cloud_slam_grpc.py +70 -0
- viam/gen/app/cloudslam/v1/cloud_slam_pb2.py +54 -0
- viam/gen/app/cloudslam/v1/cloud_slam_pb2.pyi +384 -0
- viam/gen/app/data/v1/data_grpc.py +197 -8
- viam/gen/app/data/v1/data_pb2.py +238 -99
- viam/gen/app/data/v1/data_pb2.pyi +1222 -259
- viam/gen/app/datapipelines/__init__.py +0 -0
- viam/gen/app/datapipelines/v1/__init__.py +0 -0
- viam/gen/app/datapipelines/v1/data_pipelines_grpc.py +84 -0
- viam/gen/app/datapipelines/v1/data_pipelines_pb2.py +57 -0
- viam/gen/app/datapipelines/v1/data_pipelines_pb2.pyi +387 -0
- viam/gen/app/dataset/__init__.py +0 -0
- viam/gen/app/dataset/v1/__init__.py +0 -0
- viam/gen/app/dataset/v1/dataset_grpc.py +68 -0
- viam/gen/app/dataset/v1/dataset_pb2.py +44 -0
- viam/gen/app/dataset/v1/dataset_pb2.pyi +214 -0
- viam/gen/app/datasync/v1/data_sync_grpc.py +21 -4
- viam/gen/app/datasync/v1/data_sync_pb2.py +62 -128
- viam/gen/app/datasync/v1/data_sync_pb2.pyi +156 -199
- viam/gen/app/mlinference/__init__.py +0 -0
- viam/gen/app/mlinference/v1/__init__.py +0 -0
- viam/gen/app/mlinference/v1/ml_inference_grpc.py +28 -0
- viam/gen/app/mlinference/v1/ml_inference_pb2.py +23 -0
- viam/gen/app/mlinference/v1/ml_inference_pb2.pyi +63 -0
- viam/gen/app/mltraining/v1/ml_training_grpc.py +51 -3
- viam/gen/app/mltraining/v1/ml_training_pb2.py +135 -58
- viam/gen/app/mltraining/v1/ml_training_pb2.pyi +328 -39
- viam/gen/app/packages/v1/packages_grpc.py +15 -1
- viam/gen/app/packages/v1/packages_pb2.py +44 -64
- viam/gen/app/packages/v1/packages_pb2.pyi +75 -85
- viam/gen/app/v1/app_grpc.py +644 -3
- viam/gen/app/v1/app_pb2.py +695 -295
- viam/gen/app/v1/app_pb2.pyi +4488 -635
- viam/gen/app/v1/billing_grpc.py +53 -11
- viam/gen/app/v1/billing_pb2.py +94 -39
- viam/gen/app/v1/billing_pb2.pyi +391 -191
- viam/gen/app/v1/end_user_grpc.py +59 -0
- viam/gen/app/v1/end_user_pb2.py +55 -0
- viam/gen/app/v1/end_user_pb2.pyi +181 -0
- viam/gen/app/v1/robot_grpc.py +16 -1
- viam/gen/app/v1/robot_pb2.py +122 -94
- viam/gen/app/v1/robot_pb2.pyi +463 -123
- viam/gen/common/v1/common_pb2.py +87 -58
- viam/gen/common/v1/common_pb2.pyi +456 -149
- viam/gen/component/arm/v1/arm_grpc.py +58 -2
- viam/gen/component/arm/v1/arm_pb2.py +68 -51
- viam/gen/component/arm/v1/arm_pb2.pyi +108 -42
- viam/gen/component/audioin/__init__.py +0 -0
- viam/gen/component/audioin/v1/__init__.py +0 -0
- viam/gen/component/audioin/v1/audioin_grpc.py +54 -0
- viam/gen/component/audioin/v1/audioin_pb2.py +34 -0
- viam/gen/component/audioin/v1/audioin_pb2.pyi +94 -0
- viam/gen/component/audioinput/v1/audioinput_grpc.py +25 -2
- viam/gen/component/audioinput/v1/audioinput_pb2.py +36 -31
- viam/gen/component/audioinput/v1/audioinput_pb2.pyi +22 -22
- viam/gen/component/audioout/__init__.py +0 -0
- viam/gen/component/audioout/v1/__init__.py +0 -0
- viam/gen/component/audioout/v1/audioout_grpc.py +54 -0
- viam/gen/component/audioout/v1/audioout_pb2.py +32 -0
- viam/gen/component/audioout/v1/audioout_pb2.pyi +47 -0
- viam/gen/component/base/v1/base_grpc.py +42 -2
- viam/gen/component/base/v1/base_pb2.py +58 -47
- viam/gen/component/base/v1/base_pb2.pyi +65 -30
- viam/gen/component/board/v1/board_grpc.py +59 -7
- viam/gen/component/board/v1/board_pb2.py +94 -73
- viam/gen/component/board/v1/board_pb2.pyi +165 -68
- viam/gen/component/button/__init__.py +0 -0
- viam/gen/component/button/v1/__init__.py +0 -0
- viam/gen/component/button/v1/button_grpc.py +38 -0
- viam/gen/component/button/v1/button_pb2.py +28 -0
- viam/gen/component/button/v1/button_pb2.pyi +39 -0
- viam/gen/component/camera/v1/camera_grpc.py +38 -2
- viam/gen/component/camera/v1/camera_pb2.py +60 -43
- viam/gen/component/camera/v1/camera_pb2.pyi +191 -37
- viam/gen/component/encoder/v1/encoder_grpc.py +25 -2
- viam/gen/component/encoder/v1/encoder_pb2.py +36 -31
- viam/gen/component/encoder/v1/encoder_pb2.pyi +15 -15
- viam/gen/component/gantry/v1/gantry_grpc.py +47 -2
- viam/gen/component/gantry/v1/gantry_pb2.py +56 -43
- viam/gen/component/gantry/v1/gantry_pb2.pyi +67 -31
- viam/gen/component/generic/v1/generic_grpc.py +16 -2
- viam/gen/component/generic/v1/generic_pb2.py +16 -11
- viam/gen/component/gripper/v1/gripper_grpc.py +44 -2
- viam/gen/component/gripper/v1/gripper_pb2.py +48 -35
- viam/gen/component/gripper/v1/gripper_pb2.pyi +62 -24
- viam/gen/component/inputcontroller/v1/input_controller_grpc.py +28 -2
- viam/gen/component/inputcontroller/v1/input_controller_pb2.py +46 -41
- viam/gen/component/inputcontroller/v1/input_controller_pb2.pyi +32 -36
- viam/gen/component/motor/v1/motor_grpc.py +51 -2
- viam/gen/component/motor/v1/motor_pb2.py +78 -67
- viam/gen/component/motor/v1/motor_pb2.pyi +75 -46
- viam/gen/component/movementsensor/v1/movementsensor_grpc.py +48 -2
- viam/gen/component/movementsensor/v1/movementsensor_pb2.py +70 -63
- viam/gen/component/movementsensor/v1/movementsensor_pb2.pyi +84 -57
- viam/gen/component/posetracker/v1/pose_tracker_grpc.py +19 -2
- viam/gen/component/posetracker/v1/pose_tracker_pb2.py +26 -21
- viam/gen/component/posetracker/v1/pose_tracker_pb2.pyi +9 -13
- viam/gen/component/powersensor/__init__.py +0 -0
- viam/gen/component/powersensor/v1/__init__.py +0 -0
- viam/gen/component/powersensor/v1/powersensor_grpc.py +62 -0
- viam/gen/component/powersensor/v1/powersensor_pb2.py +42 -0
- viam/gen/component/powersensor/v1/powersensor_pb2.pyi +124 -0
- viam/gen/component/sensor/v1/sensor_grpc.py +21 -5
- viam/gen/component/sensor/v1/sensor_pb2.py +18 -22
- viam/gen/component/sensor/v1/sensor_pb2.pyi +1 -69
- viam/gen/component/servo/v1/servo_grpc.py +28 -2
- viam/gen/component/servo/v1/servo_pb2.py +42 -37
- viam/gen/component/servo/v1/servo_pb2.pyi +22 -26
- viam/gen/component/switch/__init__.py +0 -0
- viam/gen/component/switch/v1/__init__.py +0 -0
- viam/gen/component/switch/v1/switch_grpc.py +54 -0
- viam/gen/component/switch/v1/switch_pb2.py +40 -0
- viam/gen/component/switch/v1/switch_pb2.pyi +116 -0
- viam/gen/component/testecho/v1/testecho_grpc.py +15 -0
- viam/gen/component/testecho/v1/testecho_pb2.py +29 -26
- viam/gen/component/testecho/v1/testecho_pb2.pyi +16 -20
- viam/gen/module/v1/module_grpc.py +18 -0
- viam/gen/module/v1/module_pb2.py +36 -33
- viam/gen/module/v1/module_pb2.pyi +39 -34
- viam/gen/opentelemetry/__init__.py +0 -0
- viam/gen/opentelemetry/proto/__init__.py +0 -0
- viam/gen/opentelemetry/proto/common/__init__.py +0 -0
- viam/gen/opentelemetry/proto/common/v1/__init__.py +0 -0
- viam/gen/opentelemetry/proto/common/v1/common_grpc.py +0 -0
- viam/gen/opentelemetry/proto/common/v1/common_pb2.py +27 -0
- viam/gen/opentelemetry/proto/common/v1/common_pb2.pyi +208 -0
- viam/gen/opentelemetry/proto/resource/__init__.py +0 -0
- viam/gen/opentelemetry/proto/resource/v1/__init__.py +0 -0
- viam/gen/opentelemetry/proto/resource/v1/resource_grpc.py +0 -0
- viam/gen/opentelemetry/proto/resource/v1/resource_pb2.py +18 -0
- viam/gen/opentelemetry/proto/resource/v1/resource_pb2.pyi +59 -0
- viam/gen/opentelemetry/proto/trace/__init__.py +0 -0
- viam/gen/opentelemetry/proto/trace/v1/__init__.py +0 -0
- viam/gen/opentelemetry/proto/trace/v1/trace_grpc.py +0 -0
- viam/gen/opentelemetry/proto/trace/v1/trace_pb2.py +37 -0
- viam/gen/opentelemetry/proto/trace/v1/trace_pb2.pyi +402 -0
- viam/gen/proto/rpc/examples/echo/v1/echo_grpc.py +12 -0
- viam/gen/proto/rpc/examples/echo/v1/echo_pb2.py +25 -22
- viam/gen/proto/rpc/examples/echo/v1/echo_pb2.pyi +13 -17
- viam/gen/proto/rpc/examples/echoresource/v1/echoresource_grpc.py +12 -0
- viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.py +23 -20
- viam/gen/proto/rpc/examples/echoresource/v1/echoresource_pb2.pyi +13 -17
- viam/gen/proto/rpc/v1/auth_grpc.py +11 -0
- viam/gen/proto/rpc/v1/auth_pb2.py +27 -24
- viam/gen/proto/rpc/v1/auth_pb2.pyi +12 -16
- viam/gen/proto/rpc/webrtc/v1/grpc_pb2.py +35 -32
- viam/gen/proto/rpc/webrtc/v1/grpc_pb2.pyi +37 -41
- viam/gen/proto/rpc/webrtc/v1/signaling_grpc.py +15 -0
- viam/gen/proto/rpc/webrtc/v1/signaling_pb2.py +62 -57
- viam/gen/proto/rpc/webrtc/v1/signaling_pb2.pyi +78 -69
- viam/gen/provisioning/__init__.py +0 -0
- viam/gen/provisioning/v1/__init__.py +0 -0
- viam/gen/provisioning/v1/provisioning_grpc.py +59 -0
- viam/gen/provisioning/v1/provisioning_pb2.py +45 -0
- viam/gen/provisioning/v1/provisioning_pb2.pyi +229 -0
- viam/gen/robot/v1/robot_grpc.py +144 -15
- viam/gen/robot/v1/robot_pb2.py +193 -119
- viam/gen/robot/v1/robot_pb2.pyi +565 -137
- viam/gen/service/datamanager/v1/data_manager_grpc.py +20 -2
- viam/gen/service/datamanager/v1/data_manager_pb2.py +27 -17
- viam/gen/service/datamanager/v1/data_manager_pb2.pyi +52 -10
- viam/gen/service/discovery/__init__.py +0 -0
- viam/gen/service/discovery/v1/__init__.py +0 -0
- viam/gen/service/discovery/v1/discovery_grpc.py +39 -0
- viam/gen/service/discovery/v1/discovery_pb2.py +29 -0
- viam/gen/service/discovery/v1/discovery_pb2.pyi +51 -0
- viam/gen/service/generic/__init__.py +0 -0
- viam/gen/service/generic/v1/__init__.py +0 -0
- viam/gen/service/generic/v1/generic_grpc.py +29 -0
- viam/gen/service/generic/v1/generic_pb2.py +21 -0
- viam/gen/service/generic/v1/generic_pb2.pyi +6 -0
- viam/gen/service/mlmodel/v1/mlmodel_grpc.py +9 -0
- viam/gen/service/mlmodel/v1/mlmodel_pb2.py +76 -29
- viam/gen/service/mlmodel/v1/mlmodel_pb2.pyi +307 -28
- viam/gen/service/motion/v1/motion_grpc.py +42 -4
- viam/gen/service/motion/v1/motion_pb2.py +119 -51
- viam/gen/service/motion/v1/motion_pb2.pyi +595 -120
- viam/gen/service/navigation/v1/navigation_grpc.py +49 -1
- viam/gen/service/navigation/v1/navigation_pb2.py +76 -51
- viam/gen/service/navigation/v1/navigation_pb2.pyi +188 -33
- viam/gen/service/sensors/v1/sensors_grpc.py +12 -0
- viam/gen/service/sensors/v1/sensors_pb2.py +60 -29
- viam/gen/service/sensors/v1/sensors_pb2.pyi +18 -21
- viam/gen/service/shell/v1/shell_grpc.py +27 -1
- viam/gen/service/shell/v1/shell_pb2.py +37 -15
- viam/gen/service/shell/v1/shell_pb2.pyi +260 -7
- viam/gen/service/slam/v1/slam_grpc.py +24 -2
- viam/gen/service/slam/v1/slam_pb2.py +44 -30
- viam/gen/service/slam/v1/slam_pb2.pyi +128 -27
- viam/gen/service/video/__init__.py +0 -0
- viam/gen/service/video/v1/__init__.py +0 -0
- viam/gen/service/video/v1/video_grpc.py +39 -0
- viam/gen/service/video/v1/video_pb2.py +29 -0
- viam/gen/service/video/v1/video_pb2.pyi +72 -0
- viam/gen/service/vision/v1/vision_grpc.py +39 -1
- viam/gen/service/vision/v1/vision_pb2.py +61 -45
- viam/gen/service/vision/v1/vision_pb2.pyi +180 -41
- viam/gen/service/worldstatestore/__init__.py +0 -0
- viam/gen/service/worldstatestore/v1/__init__.py +0 -0
- viam/gen/service/worldstatestore/v1/world_state_store_grpc.py +55 -0
- viam/gen/service/worldstatestore/v1/world_state_store_pb2.py +39 -0
- viam/gen/service/worldstatestore/v1/world_state_store_pb2.pyi +171 -0
- viam/gen/stream/__init__.py +0 -0
- viam/gen/stream/v1/__init__.py +0 -0
- viam/gen/stream/v1/stream_grpc.py +59 -0
- viam/gen/stream/v1/stream_pb2.py +39 -0
- viam/gen/stream/v1/stream_pb2.pyi +161 -0
- viam/gen/tagger/v1/tagger_pb2.py +9 -8
- viam/logging.py +160 -17
- viam/media/__init__.py +0 -9
- viam/media/audio.py +22 -10
- viam/media/utils/__init__.py +0 -0
- viam/media/utils/pil/__init__.py +55 -0
- viam/media/{viam_rgba_plugin.py → utils/pil/viam_rgba_plugin.py} +10 -16
- viam/media/viam_rgba.py +10 -0
- viam/media/video.py +197 -73
- viam/module/module.py +191 -44
- viam/module/resource_data_consumer.py +41 -0
- viam/module/service.py +9 -1
- viam/module/types.py +4 -5
- viam/operations.py +4 -3
- viam/proto/app/__init__.py +361 -5
- viam/proto/app/agent/__init__.py +28 -0
- viam/proto/app/billing.py +51 -27
- viam/proto/app/cloudslam/__init__.py +48 -0
- viam/proto/app/data/__init__.py +103 -17
- viam/proto/app/datapipelines/__init__.py +56 -0
- viam/proto/app/dataset/__init__.py +40 -0
- viam/proto/app/datasync/__init__.py +11 -5
- viam/proto/app/end_user.py +34 -0
- viam/proto/app/mlinference/__init__.py +15 -0
- viam/proto/app/mltraining/__init__.py +25 -1
- viam/proto/app/packages/__init__.py +3 -3
- viam/proto/app/robot.py +19 -1
- viam/proto/common/__init__.py +35 -8
- viam/proto/component/arm/__init__.py +9 -1
- viam/proto/component/audioin/__init__.py +16 -0
- viam/proto/component/audioinput/__init__.py +3 -1
- viam/proto/component/audioout/__init__.py +15 -0
- viam/proto/component/base/__init__.py +7 -1
- viam/proto/component/board/__init__.py +13 -5
- viam/proto/component/button/__init__.py +15 -0
- viam/proto/component/camera/__init__.py +9 -1
- viam/proto/component/encoder/__init__.py +3 -1
- viam/proto/component/gantry/__init__.py +7 -1
- viam/proto/component/generic/__init__.py +3 -1
- viam/proto/component/gripper/__init__.py +7 -1
- viam/proto/component/inputcontroller/__init__.py +7 -1
- viam/proto/component/motor/__init__.py +7 -1
- viam/proto/component/movementsensor/__init__.py +7 -1
- viam/proto/component/posetracker/__init__.py +7 -1
- viam/proto/component/powersensor/__init__.py +30 -0
- viam/proto/component/sensor/__init__.py +3 -4
- viam/proto/component/servo/__init__.py +3 -1
- viam/proto/component/switch/__init__.py +26 -0
- viam/proto/component/testecho/__init__.py +3 -1
- viam/proto/module/__init__.py +3 -1
- viam/proto/opentelemetry/__init__.py +0 -0
- viam/proto/opentelemetry/proto/__init__.py +0 -0
- viam/proto/opentelemetry/proto/common/__init__.py +15 -0
- viam/proto/opentelemetry/proto/resource/__init__.py +10 -0
- viam/proto/opentelemetry/proto/trace/__init__.py +15 -0
- viam/proto/provisioning/__init__.py +42 -0
- viam/proto/robot/__init__.py +57 -9
- viam/proto/rpc/auth.py +11 -1
- viam/proto/rpc/examples/echo/__init__.py +3 -1
- viam/proto/rpc/examples/echoresource/__init__.py +7 -1
- viam/proto/rpc/webrtc/grpc.py +3 -1
- viam/proto/rpc/webrtc/signaling.py +5 -1
- viam/proto/service/datamanager/__init__.py +15 -2
- viam/proto/service/discovery/__init__.py +15 -0
- viam/proto/service/generic/__init__.py +12 -0
- viam/proto/service/mlmodel/__init__.py +27 -1
- viam/proto/service/motion/__init__.py +35 -5
- viam/proto/service/navigation/__init__.py +19 -1
- viam/proto/service/sensors/__init__.py +3 -1
- viam/proto/service/shell/__init__.py +25 -2
- viam/proto/service/slam/__init__.py +13 -1
- viam/proto/service/video/__init__.py +15 -0
- viam/proto/service/vision/__init__.py +11 -1
- viam/proto/service/worldstatestore/__init__.py +32 -0
- viam/proto/stream/__init__.py +36 -0
- viam/py.typed +0 -0
- viam/resource/base.py +45 -8
- viam/resource/easy_resource.py +149 -0
- viam/resource/manager.py +35 -14
- viam/resource/registry.py +40 -52
- viam/resource/rpc_client_base.py +33 -1
- viam/resource/rpc_service_base.py +15 -8
- viam/resource/types.py +39 -26
- viam/robot/client.py +458 -91
- viam/robot/service.py +13 -107
- viam/rpc/dial.py +133 -15
- viam/rpc/libviam_rust_utils.so +0 -0
- viam/rpc/server.py +59 -15
- viam/rpc/types.py +2 -4
- viam/services/discovery/__init__.py +12 -0
- viam/services/discovery/client.py +55 -0
- viam/services/discovery/discovery.py +52 -0
- viam/services/discovery/service.py +43 -0
- viam/services/generic/__init__.py +18 -0
- viam/services/generic/client.py +58 -0
- viam/services/generic/generic.py +58 -0
- viam/services/generic/service.py +29 -0
- viam/services/mlmodel/__init__.py +15 -1
- viam/services/mlmodel/client.py +20 -15
- viam/services/mlmodel/mlmodel.py +44 -7
- viam/services/mlmodel/service.py +9 -13
- viam/services/mlmodel/utils.py +101 -0
- viam/services/motion/__init__.py +15 -3
- viam/services/motion/client.py +109 -150
- viam/services/motion/motion.py +380 -0
- viam/services/motion/service.py +132 -0
- viam/services/navigation/__init__.py +11 -0
- viam/services/navigation/client.py +99 -0
- viam/services/navigation/navigation.py +250 -0
- viam/services/navigation/service.py +137 -0
- viam/services/service_base.py +43 -4
- viam/services/service_client_base.py +4 -4
- viam/services/slam/__init__.py +4 -1
- viam/services/slam/client.py +21 -11
- viam/services/slam/service.py +16 -19
- viam/services/slam/slam.py +66 -5
- viam/services/vision/__init__.py +8 -0
- viam/services/vision/client.py +115 -111
- viam/services/vision/service.py +143 -0
- viam/services/vision/vision.py +317 -0
- viam/services/worldstatestore/__init__.py +18 -0
- viam/services/worldstatestore/client.py +94 -0
- viam/services/worldstatestore/service.py +55 -0
- viam/services/worldstatestore/worldstatestore.py +90 -0
- viam/sessions_client.py +254 -0
- viam/streams.py +44 -0
- viam/utils.py +143 -15
- viam/version_metadata.py +4 -0
- viam_sdk-0.66.0.dist-info/METADATA +157 -0
- viam_sdk-0.66.0.dist-info/RECORD +531 -0
- {viam_sdk-0.3.0.dist-info → viam_sdk-0.66.0.dist-info}/WHEEL +1 -1
- viam/components/audio_input/__init__.py +0 -18
- viam/components/audio_input/audio_input.py +0 -79
- viam/components/audio_input/client.py +0 -60
- viam/components/audio_input/service.py +0 -118
- viam/components/types.py +0 -5
- viam/gen/app/model/v1/model_grpc.py +0 -39
- viam/gen/app/model/v1/model_pb2.py +0 -71
- viam/gen/app/model/v1/model_pb2.pyi +0 -285
- viam/gen/proto/rpc/examples/fileupload/v1/fileupload_grpc.py +0 -21
- viam/gen/proto/rpc/examples/fileupload/v1/fileupload_pb2.py +0 -18
- viam/gen/proto/rpc/examples/fileupload/v1/fileupload_pb2.pyi +0 -49
- viam/media/media.py +0 -53
- viam/proto/app/model/__init__.py +0 -40
- viam/proto/rpc/examples/fileupload/__init__.py +0 -13
- viam/services/sensors/__init__.py +0 -5
- viam/services/sensors/client.py +0 -63
- viam_sdk-0.3.0.dist-info/LICENSE +0 -202
- viam_sdk-0.3.0.dist-info/METADATA +0 -122
- viam_sdk-0.3.0.dist-info/RECORD +0 -372
- /viam/{gen/app/model → app}/__init__.py +0 -0
- /viam/gen/app/{model/v1 → agent}/__init__.py +0 -0
- /viam/gen/{proto/rpc/examples/fileupload → app/agent/v1}/__init__.py +0 -0
- /viam/gen/{proto/rpc/examples/fileupload/v1 → app/cloudslam}/__init__.py +0 -0
- /LICENSE → /viam_sdk-0.66.0.dist-info/licenses/LICENSE +0 -0
viam/logging.py
CHANGED
|
@@ -1,14 +1,120 @@
|
|
|
1
|
+
import asyncio
|
|
1
2
|
import logging
|
|
2
3
|
import sys
|
|
3
4
|
from copy import copy
|
|
5
|
+
from datetime import datetime
|
|
4
6
|
from logging import DEBUG, ERROR, FATAL, INFO, WARN, WARNING # noqa: F401
|
|
5
|
-
from
|
|
7
|
+
from threading import Event, Lock, Thread
|
|
8
|
+
from typing import TYPE_CHECKING, Dict, Iterable, List, Optional, Union
|
|
6
9
|
|
|
7
|
-
|
|
8
|
-
|
|
10
|
+
from grpclib.exceptions import StreamTerminatedError
|
|
11
|
+
|
|
12
|
+
import viam
|
|
9
13
|
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from .robot.client import RobotClient
|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
|
|
18
|
+
LOG_LEVEL = INFO
|
|
19
|
+
LOGGERS: Dict[str, logging.Logger] = {}
|
|
20
|
+
_MODULE_PARENT: Optional["RobotClient"] = None
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class _SingletonEventLoopThread:
|
|
24
|
+
_instance = None
|
|
25
|
+
_lock = Lock()
|
|
26
|
+
# We use a threading.Event instead of an asyncio.Event because the latter are not thread safe,
|
|
27
|
+
# and this is set in a separate thread than it is waited on.
|
|
28
|
+
_ready_event = Event()
|
|
29
|
+
_loop: asyncio.AbstractEventLoop
|
|
30
|
+
_thread: Thread
|
|
31
|
+
|
|
32
|
+
def __new__(cls):
|
|
33
|
+
# Ensure singleton precondition
|
|
34
|
+
if cls._instance is None:
|
|
35
|
+
with cls._lock:
|
|
36
|
+
if cls._instance is None:
|
|
37
|
+
cls._instance = super(_SingletonEventLoopThread, cls).__new__(cls)
|
|
38
|
+
cls._instance._loop = asyncio.new_event_loop()
|
|
39
|
+
cls._instance._thread = Thread(target=cls._instance._run)
|
|
40
|
+
cls._instance._thread.start()
|
|
41
|
+
return cls._instance
|
|
42
|
+
|
|
43
|
+
def _run(self):
|
|
44
|
+
asyncio.set_event_loop(self._loop)
|
|
45
|
+
self._ready_event.set()
|
|
46
|
+
self._loop.run_forever()
|
|
47
|
+
|
|
48
|
+
def stop(self):
|
|
49
|
+
if self._loop is not None:
|
|
50
|
+
self._loop.call_soon_threadsafe(self._loop.stop)
|
|
51
|
+
self._thread.join()
|
|
52
|
+
|
|
53
|
+
def get_loop(self):
|
|
54
|
+
if self._loop is None:
|
|
55
|
+
raise RuntimeError("Event loop is None. Did you call .start() and .wait_until_ready()?")
|
|
56
|
+
return self._loop
|
|
57
|
+
|
|
58
|
+
def wait_until_ready(self):
|
|
59
|
+
self._ready_event.wait()
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class _ModuleHandler(logging.Handler):
|
|
63
|
+
_parent: "RobotClient"
|
|
64
|
+
_logger: logging.Logger
|
|
65
|
+
_worker: _SingletonEventLoopThread
|
|
66
|
+
|
|
67
|
+
def __init__(self, parent: "RobotClient"):
|
|
68
|
+
super().__init__()
|
|
69
|
+
self._parent = parent
|
|
70
|
+
self._logger = logging.getLogger("ModuleLogger")
|
|
71
|
+
addHandlers(self._logger, True)
|
|
72
|
+
self._logger.setLevel(self.level)
|
|
73
|
+
self._worker = _SingletonEventLoopThread()
|
|
74
|
+
|
|
75
|
+
def setLevel(self, level: Union[int, str]) -> None:
|
|
76
|
+
self._logger.setLevel(level)
|
|
77
|
+
return super().setLevel(level)
|
|
78
|
+
|
|
79
|
+
async def handle_task_result(self, task: asyncio.Task):
|
|
80
|
+
try:
|
|
81
|
+
_ = task.result()
|
|
82
|
+
except (asyncio.CancelledError, asyncio.InvalidStateError, StreamTerminatedError):
|
|
83
|
+
pass
|
|
84
|
+
|
|
85
|
+
def emit(self, record: logging.LogRecord):
|
|
86
|
+
assert isinstance(record, logging.LogRecord)
|
|
87
|
+
# Fully qualified name of form "{API triplet}/{name}", e.g. "rdk:component:arm/myarm"
|
|
88
|
+
name = record.name.replace(".", "/")
|
|
89
|
+
message = f"{record.filename}:{record.lineno}\t{record.getMessage()}"
|
|
90
|
+
stack = f"exc_info: {record.exc_info}, exc_text: {record.exc_text}, stack_info: {record.stack_info}"
|
|
91
|
+
time = datetime.fromtimestamp(record.created)
|
|
92
|
+
|
|
93
|
+
try:
|
|
94
|
+
loop = self._worker.get_loop()
|
|
95
|
+
asyncio.run_coroutine_threadsafe(
|
|
96
|
+
self._asynchronously_emit(record, name, message, stack, time),
|
|
97
|
+
loop,
|
|
98
|
+
)
|
|
99
|
+
except Exception as err:
|
|
100
|
+
# If the module log fails, log using stdout/stderr handlers
|
|
101
|
+
self._logger.error(f"ModuleLogger failed for {record.name} - {err}")
|
|
102
|
+
self._logger.log(record.levelno, message)
|
|
103
|
+
|
|
104
|
+
async def _asynchronously_emit(self, record: logging.LogRecord, name: str, message: str, stack: str, time: datetime):
|
|
105
|
+
self._worker.wait_until_ready()
|
|
106
|
+
task = self._worker.get_loop().create_task(
|
|
107
|
+
self._parent.log(name, record.levelname, time, message, stack),
|
|
108
|
+
name=f"{viam._TASK_PREFIX}-LOG-{record.created}",
|
|
109
|
+
)
|
|
110
|
+
task.add_done_callback(lambda t: asyncio.run_coroutine_threadsafe(self.handle_task_result(t), self._worker.get_loop()))
|
|
111
|
+
|
|
112
|
+
def close(self):
|
|
113
|
+
self._worker.stop()
|
|
114
|
+
super().close()
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class _ColorFormatter(logging.Formatter):
|
|
12
118
|
MAPPING = {
|
|
13
119
|
"DEBUG": 37, # white
|
|
14
120
|
"INFO": 36, # cyan
|
|
@@ -17,8 +123,8 @@ class ColorFormatter(logging.Formatter):
|
|
|
17
123
|
"CRITICAL": 41, # white on red bg
|
|
18
124
|
}
|
|
19
125
|
|
|
20
|
-
def __init__(self,
|
|
21
|
-
logging.Formatter.__init__(self,
|
|
126
|
+
def __init__(self, pattern):
|
|
127
|
+
logging.Formatter.__init__(self, pattern)
|
|
22
128
|
|
|
23
129
|
def format(self, record):
|
|
24
130
|
colored_record = copy(record)
|
|
@@ -43,21 +149,56 @@ def getLogger(name: str) -> logging.Logger:
|
|
|
43
149
|
return logger
|
|
44
150
|
|
|
45
151
|
|
|
46
|
-
def addHandlers(logger: logging.Logger):
|
|
47
|
-
|
|
152
|
+
def addHandlers(logger: logging.Logger, use_default_handlers=False):
|
|
153
|
+
_addHandlers([logger], use_default_handlers)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def update_log_level(logger: logging.Logger, level: Union[int, str]):
|
|
157
|
+
if level == "":
|
|
158
|
+
level = LOG_LEVEL
|
|
159
|
+
logger.setLevel(level)
|
|
160
|
+
for handler in logger.handlers:
|
|
161
|
+
handler.setLevel(level)
|
|
162
|
+
|
|
48
163
|
|
|
49
|
-
|
|
50
|
-
|
|
164
|
+
def _addHandlers(loggers: Iterable[logging.Logger], use_default_handlers=False):
|
|
165
|
+
format = _ColorFormatter("%(asctime)s\t\t" + "%(levelname)s\t" + "%(name)s (%(filename)s:%(lineno)d)\t" + "%(message)s\t")
|
|
166
|
+
|
|
167
|
+
handlers: List[logging.Handler] = []
|
|
168
|
+
|
|
169
|
+
std_handler = logging.StreamHandler(stream=sys.stdout)
|
|
170
|
+
std_handler.setFormatter(format)
|
|
51
171
|
# filter out logs at error level or above
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
logger.addHandler(handler)
|
|
172
|
+
std_handler.setLevel(LOG_LEVEL)
|
|
173
|
+
std_handler.addFilter(filter=lambda record: (record.levelno < ERROR))
|
|
55
174
|
|
|
56
175
|
err_handler = logging.StreamHandler(stream=sys.stderr)
|
|
57
176
|
err_handler.setFormatter(format)
|
|
58
177
|
# filter out logs below error level
|
|
59
178
|
err_handler.setLevel(max(ERROR, LOG_LEVEL))
|
|
60
|
-
|
|
179
|
+
|
|
180
|
+
if _MODULE_PARENT is not None and not use_default_handlers:
|
|
181
|
+
mod_handler = _ModuleHandler(_MODULE_PARENT)
|
|
182
|
+
mod_handler.setFormatter(format)
|
|
183
|
+
mod_handler.setLevel(LOG_LEVEL)
|
|
184
|
+
handlers = [mod_handler]
|
|
185
|
+
else:
|
|
186
|
+
handlers = [std_handler, err_handler]
|
|
187
|
+
|
|
188
|
+
for logger in loggers:
|
|
189
|
+
logger.handlers.clear()
|
|
190
|
+
if "viam.sessions_client" in LOGGERS and LOGGERS["viam.sessions_client"] == logger:
|
|
191
|
+
logger.addHandler(std_handler)
|
|
192
|
+
logger.addHandler(err_handler)
|
|
193
|
+
else:
|
|
194
|
+
for h in handlers:
|
|
195
|
+
logger.addHandler(h)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def setParent(parent: "RobotClient"):
|
|
199
|
+
global _MODULE_PARENT
|
|
200
|
+
_MODULE_PARENT = parent
|
|
201
|
+
_addHandlers(LOGGERS.values())
|
|
61
202
|
|
|
62
203
|
|
|
63
204
|
def setLevel(level: int):
|
|
@@ -65,10 +206,12 @@ def setLevel(level: int):
|
|
|
65
206
|
LOG_LEVEL = level
|
|
66
207
|
for logger in LOGGERS.values():
|
|
67
208
|
logger.setLevel(LOG_LEVEL)
|
|
68
|
-
|
|
69
|
-
logger.removeHandler(handler)
|
|
70
|
-
addHandlers(logger)
|
|
209
|
+
_addHandlers(LOGGERS.values())
|
|
71
210
|
|
|
72
211
|
|
|
73
212
|
def silence():
|
|
74
213
|
setLevel(FATAL + 1)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def shutdown():
|
|
217
|
+
logging.shutdown()
|
viam/media/__init__.py
CHANGED
viam/media/audio.py
CHANGED
|
@@ -1,16 +1,28 @@
|
|
|
1
|
-
from
|
|
1
|
+
from enum import Enum
|
|
2
2
|
|
|
3
|
-
from viam.media.media import MediaReader, MediaStream
|
|
4
|
-
from viam.proto.component.audioinput import AudioChunk, AudioChunkInfo
|
|
5
3
|
|
|
4
|
+
class AudioCodec(str, Enum):
|
|
5
|
+
"""Common audio codec identifiers.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"""A block of audio data containing information about the block and the audio data"""
|
|
7
|
+
These constants represent commonly supported audio codecs
|
|
8
|
+
for audioin and audioout components.
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
chunk: AudioChunk
|
|
10
|
+
Example::
|
|
13
11
|
|
|
12
|
+
from viam.components.codecs import AudioCodec
|
|
13
|
+
from viam.proto.common import AudioInfo
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
audio_info = AudioInfo(
|
|
16
|
+
codec=AudioCodec.PCM16,
|
|
17
|
+
sample_rate_hz=44100,
|
|
18
|
+
num_channels=2
|
|
19
|
+
)
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
PCM16 = "pcm16"
|
|
23
|
+
PCM32 = "pcm32"
|
|
24
|
+
PCM32_FLOAT = "pcm32_float"
|
|
25
|
+
MP3 = "mp3"
|
|
26
|
+
AAC = "aac"
|
|
27
|
+
OPUS = "opus"
|
|
28
|
+
FLAC = "flac"
|
|
File without changes
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
from io import BytesIO
|
|
2
|
+
|
|
3
|
+
from PIL import Image
|
|
4
|
+
|
|
5
|
+
from ....media.video import CameraMimeType, ViamImage
|
|
6
|
+
from .viam_rgba_plugin import RGBA_FORMAT_LABEL
|
|
7
|
+
|
|
8
|
+
# Formats that are supported by PIL
|
|
9
|
+
LIBRARY_SUPPORTED_FORMATS = ["JPEG", "PNG", RGBA_FORMAT_LABEL]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def viam_to_pil_image(image: ViamImage) -> Image.Image:
|
|
13
|
+
"""
|
|
14
|
+
Convert a ViamImage to a PIL.Image.
|
|
15
|
+
|
|
16
|
+
In order to use this function, Pillow must be installed.
|
|
17
|
+
https://pillow.readthedocs.io/
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
image (ViamImage): The image to convert.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
Image.Image: The resulting PIL.Image
|
|
24
|
+
"""
|
|
25
|
+
return Image.open(BytesIO(image.data), formats=LIBRARY_SUPPORTED_FORMATS)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def pil_to_viam_image(image: Image.Image, mime_type: CameraMimeType) -> ViamImage:
|
|
29
|
+
"""
|
|
30
|
+
Convert a PIL.Image to a ViamImage.
|
|
31
|
+
|
|
32
|
+
In order to use this function, Pillow must be installed.
|
|
33
|
+
https://pillow.readthedocs.io/
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
image (Image.Image): The image to convert.
|
|
37
|
+
mime_type (CameraMimeType): The mime type to convert the image to.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
ViamImage: The resulting ViamImage
|
|
41
|
+
"""
|
|
42
|
+
# Make sure at runtime the mime_type string is actually a CameraMimeType
|
|
43
|
+
if not isinstance(mime_type, CameraMimeType):
|
|
44
|
+
raise ValueError(f"Cannot encode to unsupported mimetype: {mime_type}")
|
|
45
|
+
|
|
46
|
+
if mime_type.name in LIBRARY_SUPPORTED_FORMATS:
|
|
47
|
+
buf = BytesIO()
|
|
48
|
+
if image.mode == "RGBA" and mime_type == CameraMimeType.JPEG:
|
|
49
|
+
image = image.convert("RGB")
|
|
50
|
+
image.save(buf, format=mime_type.name)
|
|
51
|
+
data = buf.getvalue()
|
|
52
|
+
else:
|
|
53
|
+
raise ValueError(f"Cannot encode to unsupported mimetype: {mime_type}")
|
|
54
|
+
|
|
55
|
+
return ViamImage(data, mime_type)
|
|
@@ -1,19 +1,10 @@
|
|
|
1
|
-
from typing import Tuple
|
|
1
|
+
from typing import ClassVar, Tuple
|
|
2
2
|
|
|
3
3
|
from PIL import Image
|
|
4
|
-
from PIL.ImageFile import ImageFile, PyDecoder, PyEncoder, _safe_read
|
|
5
|
-
from PIL.ImageFile import _save as image_save
|
|
4
|
+
from PIL.ImageFile import ImageFile, PyDecoder, PyEncoder, _safe_read # type: ignore -- (njooma) this exists, manually checked
|
|
5
|
+
from PIL.ImageFile import _save as image_save # type: ignore -- (njooma) this exists, manually checked
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
# 4-byte magic number followed by a 4-byte line of the width as a uint32 number
|
|
9
|
-
# and another for the height. Credit to Ben Zotto for inventing this formulation
|
|
10
|
-
# https://bzotto.medium.com/introducing-the-rgba-bitmap-file-format-4a8a94329e2c
|
|
11
|
-
|
|
12
|
-
RGBA_MAGIC_NUMBER = bytes("RGBA", "utf-8")
|
|
13
|
-
|
|
14
|
-
RGBA_FORMAT_LABEL = "VIAM_RGBA"
|
|
15
|
-
|
|
16
|
-
RGBA_HEADER_LENGTH = 12
|
|
7
|
+
from ...viam_rgba import RGBA_FORMAT_LABEL, RGBA_HEADER_LENGTH, RGBA_MAGIC_NUMBER
|
|
17
8
|
|
|
18
9
|
|
|
19
10
|
def _accept(prefix: str):
|
|
@@ -25,7 +16,7 @@ class RGBAEncoder(PyEncoder):
|
|
|
25
16
|
|
|
26
17
|
_pushes_fd = True
|
|
27
18
|
|
|
28
|
-
def encode(self, bufsize):
|
|
19
|
+
def encode(self, bufsize): # pyright: ignore [reportIncompatibleMethodOverride]
|
|
29
20
|
data_arr = bytearray()
|
|
30
21
|
width, height = self.im.size
|
|
31
22
|
for y in range(height):
|
|
@@ -46,7 +37,7 @@ def _save_rgba(img, fp, filename):
|
|
|
46
37
|
|
|
47
38
|
|
|
48
39
|
class RGBAImage(ImageFile):
|
|
49
|
-
format: str = RGBA_FORMAT_LABEL
|
|
40
|
+
format: ClassVar[str] = RGBA_FORMAT_LABEL # pyright: ignore [reportIncompatibleVariableOverride]
|
|
50
41
|
format_description = "Viam's Raw RGBA Format"
|
|
51
42
|
|
|
52
43
|
def _open(self):
|
|
@@ -55,7 +46,10 @@ class RGBAImage(ImageFile):
|
|
|
55
46
|
width = int.from_bytes(header[4:8], "big")
|
|
56
47
|
height = int.from_bytes(header[8:12], "big")
|
|
57
48
|
self._size = width, height
|
|
58
|
-
self
|
|
49
|
+
if hasattr(self, "_mode"):
|
|
50
|
+
self._mode = "RGBA"
|
|
51
|
+
else:
|
|
52
|
+
self.mode = "RGBA" # type: ignore -- (njooma) newer versions of PIL hide this behind _mode, which is why we check
|
|
59
53
|
|
|
60
54
|
# data descriptor
|
|
61
55
|
self.tile = [(RGBAEncoder.ENCODER_NAME, (0, 0, width, height), RGBA_HEADER_LENGTH, (self.mode, 0, 1))]
|
viam/media/viam_rgba.py
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Viam uses a special header prepended to raw RGBA data. The header is composed of a
|
|
2
|
+
# 4-byte magic number followed by a 4-byte line of the width as a uint32 number
|
|
3
|
+
# and another for the height. Credit to Ben Zotto for inventing this formulation
|
|
4
|
+
# https://bzotto.medium.com/introducing-the-rgba-bitmap-file-format-4a8a94329e2c
|
|
5
|
+
|
|
6
|
+
RGBA_MAGIC_NUMBER = bytes("RGBA", "utf-8")
|
|
7
|
+
|
|
8
|
+
RGBA_FORMAT_LABEL = "VIAM_RGBA"
|
|
9
|
+
|
|
10
|
+
RGBA_HEADER_LENGTH = 12
|