blob: 5daccf5ce8def4bfd9006fc2653b05a7f45400c6 [file] [log] [blame]
/*
*
* Copyright (c) 2025 Project CHIP Authors
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "camera-avstream-controller.h"
#include "media-controller.h"
#include <app/clusters/camera-av-settings-user-level-management-server/camera-av-settings-user-level-management-server.h>
#include <app/clusters/camera-av-stream-management-server/camera-av-stream-management-server.h>
#include <app/clusters/chime-server/chime-server.h>
#include <app/clusters/webrtc-transport-provider-server/webrtc-transport-provider-server.h>
#include <app/clusters/zone-management-server/zone-management-server.h>
using chip::app::Clusters::CameraAvStreamManagement::AudioCapabilitiesStruct;
using chip::app::Clusters::CameraAvStreamManagement::AudioStreamStruct;
using chip::app::Clusters::CameraAvStreamManagement::ImageSnapshot;
using chip::app::Clusters::CameraAvStreamManagement::RateDistortionTradeOffStruct;
using chip::app::Clusters::CameraAvStreamManagement::SnapshotCapabilitiesStruct;
using chip::app::Clusters::CameraAvStreamManagement::SnapshotStreamStruct;
using chip::app::Clusters::CameraAvStreamManagement::TriStateAutoEnum;
using chip::app::Clusters::CameraAvStreamManagement::VideoResolutionStruct;
using chip::app::Clusters::CameraAvStreamManagement::VideoSensorParamsStruct;
using chip::app::Clusters::CameraAvStreamManagement::VideoStreamStruct;
using chip::app::Clusters::Globals::StreamUsageEnum;
struct VideoStream
{
VideoStreamStruct videoStreamParams;
bool isAllocated; // Flag to indicate if the stream is allocated.
chip::app::Clusters::Globals::Structs::ViewportStruct::Type
viewport; // Stream specific viewport, defaults to the camera viewport
void * videoContext; // Platform-specific context object associated with
// video stream;
bool IsCompatible(const VideoStreamStruct & inputParams) const
{
return (videoStreamParams.videoCodec == inputParams.videoCodec &&
videoStreamParams.minFrameRate <= inputParams.minFrameRate &&
videoStreamParams.maxFrameRate >= inputParams.maxFrameRate &&
videoStreamParams.minResolution.width <= inputParams.minResolution.width &&
videoStreamParams.minResolution.height <= inputParams.minResolution.height &&
videoStreamParams.maxResolution.width >= inputParams.maxResolution.width &&
videoStreamParams.maxResolution.height >= inputParams.maxResolution.height);
}
};
struct AudioStream
{
AudioStreamStruct audioStreamParams;
bool isAllocated; // Flag to indicate if the stream is allocated.
void * audioContext; // Platform-specific context object associated with
// video stream;
bool IsCompatible(const AudioStreamStruct & inputParams) const
{
return (audioStreamParams.audioCodec == inputParams.audioCodec &&
audioStreamParams.channelCount == inputParams.channelCount &&
audioStreamParams.sampleRate == inputParams.sampleRate);
}
};
struct SnapshotStream
{
SnapshotStreamStruct snapshotStreamParams;
bool isAllocated; // Flag to indicate if the stream is allocated
void * snapshotContext; // Platform-specific context object associated with
// snapshot stream;
bool IsCompatible(const SnapshotStreamStruct & inputParams) const
{
return (snapshotStreamParams.imageCodec == inputParams.imageCodec && snapshotStreamParams.quality == inputParams.quality &&
snapshotStreamParams.frameRate <= inputParams.frameRate &&
snapshotStreamParams.minResolution.width <= inputParams.minResolution.width &&
snapshotStreamParams.minResolution.height <= inputParams.minResolution.height &&
snapshotStreamParams.maxResolution.width >= inputParams.maxResolution.width &&
snapshotStreamParams.maxResolution.height >= inputParams.maxResolution.height);
}
};
// Enumeration for common camera errors
enum class CameraError
{
SUCCESS,
ERROR_INIT_FAILED,
ERROR_VIDEO_STREAM_START_FAILED,
ERROR_VIDEO_STREAM_STOP_FAILED,
ERROR_AUDIO_STREAM_START_FAILED,
ERROR_AUDIO_STREAM_STOP_FAILED,
ERROR_SNAPSHOT_STREAM_START_FAILED,
ERROR_SNAPSHOT_STREAM_STOP_FAILED,
ERROR_CAPTURE_SNAPSHOT_FAILED,
ERROR_CONFIG_FAILED,
ERROR_RESOURCE_EXHAUSTED,
ERROR_NOT_IMPLEMENTED, // For features not supported on a platform
};
// Camera Device Interface defines all the clusters that need to be implemented for a Camera Device
class CameraDeviceInterface
{
public:
virtual ~CameraDeviceInterface() = default;
// Getter for Chime Delegate
virtual chip::app::Clusters::ChimeDelegate & GetChimeDelegate() = 0;
// Getter for WebRTCProvider Delegate
virtual chip::app::Clusters::WebRTCTransportProvider::Delegate & GetWebRTCProviderDelegate() = 0;
// Getter for CameraAVStreamManagement Delegate
virtual chip::app::Clusters::CameraAvStreamManagement::CameraAVStreamMgmtDelegate & GetCameraAVStreamMgmtDelegate() = 0;
// Getter for CameraAVStreamManagement Controller
virtual chip::app::Clusters::CameraAvStreamManagement::CameraAVStreamController & GetCameraAVStreamMgmtController() = 0;
// Getter for CameraAVSettingsUserLevelManagement Delegate
virtual chip::app::Clusters::CameraAvSettingsUserLevelManagement::Delegate & GetCameraAVSettingsUserLevelMgmtDelegate() = 0;
// Getter for ZoneManagement Delegate
virtual chip::app::Clusters::ZoneManagement::Delegate & GetZoneManagementDelegate() = 0;
// Getter for the Media Controller
virtual MediaController & GetMediaController() = 0;
// Class defining the Camera HAL interface
class CameraHALInterface
{
public:
// Virtual destructor
virtual ~CameraHALInterface() = default;
// Initialize the camera hardware
virtual CameraError InitializeCameraDevice() = 0;
virtual CameraError InitializeStreams() = 0;
// Configure camera settings (e.g., exposure, focus)
// virtual CameraError Configure(const std::string & setting, const std::string & value) = 0;
virtual std::vector<VideoStream> & GetAvailableVideoStreams() = 0;
virtual std::vector<AudioStream> & GetAvailableAudioStreams() = 0;
virtual std::vector<SnapshotStream> & GetAvailableSnapshotStreams() = 0;
// Capture a snapshot image
virtual CameraError CaptureSnapshot(const chip::app::DataModel::Nullable<uint16_t> streamID,
const VideoResolutionStruct & resolution, ImageSnapshot & outImageSnapshot) = 0;
// Start video stream
virtual CameraError StartVideoStream(uint16_t streamID) = 0;
// Stop video stream
virtual CameraError StopVideoStream(uint16_t streamID) = 0;
// Start audio stream
virtual CameraError StartAudioStream(uint16_t streamID) = 0;
// Stop audio stream
virtual CameraError StopAudioStream(uint16_t streamID) = 0;
// Start snapshot stream
virtual CameraError StartSnapshotStream(uint16_t streamID) = 0;
// Stop snapshot stream
virtual CameraError StopSnapshotStream(uint16_t streamID) = 0;
// Get the maximum number of concurrent encoders supported by camera.
virtual uint8_t GetMaxConcurrentEncoders() = 0;
// Get the maximum data rate in encoded pixels per second that the
// camera can produce given the hardware encoders it has.
virtual uint32_t GetMaxEncodedPixelRate() = 0;
// Get the Video sensor params(sensor dimensions, framerate, HDR
// capabilities)
virtual VideoSensorParamsStruct & GetVideoSensorParams() = 0;
// Get indication whether camera supports high dynamic range for video
virtual bool GetCameraSupportsHDR() = 0;
// Get indication whether camera supports night vision
virtual bool GetCameraSupportsNightVision() = 0;
// Get indication whether camera night vision using infrared
virtual bool GetNightVisionUsesInfrared() = 0;
// Get indication whether camera supports image control
virtual bool GetCameraSupportsImageControl() = 0;
// Get indication whether camera supports watermark for video and snapshot
virtual bool GetCameraSupportsWatermark() = 0;
// Get indication whether camera supports on-screen display for video and snapshot
virtual bool GetCameraSupportsOSD() = 0;
// Get indication whether camera suppots soft recording and livestream privacy modes
virtual bool GetCameraSupportsSoftPrivacy() = 0;
// Get indication of the min resolution(pixels) that camera allows for
// its viewport.
virtual VideoResolutionStruct & GetMinViewport() = 0;
// Get the rate distortion tradeoff points(min bitrate for resolutions) for video codecs.
virtual std::vector<RateDistortionTradeOffStruct> & GetRateDistortionTradeOffPoints() = 0;
// Get the maximum size of content buffer in bytes. This buffer holds
// compressed and/or raw audio/video content.
virtual uint32_t GetMaxContentBufferSize() = 0;
// Get microphone capabilities.
virtual AudioCapabilitiesStruct & GetMicrophoneCapabilities() = 0;
// Get speaker capabilities.
virtual AudioCapabilitiesStruct & GetSpeakerCapabilities() = 0;
// Get snapshot capabilities
virtual std::vector<SnapshotCapabilitiesStruct> & GetSnapshotCapabilities() = 0;
// Get the maximum network bandwidth(mbps) that the camera would consume
// for transmission of its media streams.
virtual uint32_t GetMaxNetworkBandwidth() = 0;
// Get the current frame rate of the camera sensor.
virtual uint16_t GetCurrentFrameRate() = 0;
// Enable/Disable High Dynamic Range mode.
virtual CameraError SetHDRMode(bool hdrMode) = 0;
// Get the current camera HDR mode.
virtual bool GetHDRMode() = 0;
// Get Supported Stream usages; Typically set by manudacturer.
// This also sets the default priority of the stream usages.
virtual std::vector<StreamUsageEnum> & GetSupportedStreamUsages() = 0;
// Get stream usage priorities as an ordered list. This is expected to
// be a subset of the SupportedStreamUsages.
virtual std::vector<StreamUsageEnum> & GetStreamUsagePriorities() = 0;
// Get/Set soft recording privacy mode
virtual CameraError SetSoftRecordingPrivacyModeEnabled(bool softRecordingPrivacyMode) = 0;
virtual bool GetSoftRecordingPrivacyModeEnabled() = 0;
// Get/Set soft livestream privacy mode
virtual CameraError SetSoftLivestreamPrivacyModeEnabled(bool softLivestreamPrivacyMode) = 0;
virtual bool GetSoftLivestreamPrivacyModeEnabled() = 0;
// Does camera have a hard privacy switch
virtual bool HasHardPrivacySwitch() = 0;
// Get whether hard privacy mode is on
virtual bool GetHardPrivacyMode() = 0;
// Get/Set night vision
virtual CameraError SetNightVision(TriStateAutoEnum nightVision) = 0;
virtual TriStateAutoEnum GetNightVision() = 0;
// Set the viewport for all streams
virtual CameraError SetViewport(const chip::app::Clusters::Globals::Structs::ViewportStruct::Type & viewPort) = 0;
// Get the current camera viewport.
virtual const chip::app::Clusters::Globals::Structs::ViewportStruct::Type & GetViewport() = 0;
// Set the viewport for a specific stream
virtual CameraError SetViewport(VideoStream & stream,
const chip::app::Clusters::Globals::Structs::ViewportStruct::Type & viewPort) = 0;
// Does camera have a speaker
virtual bool HasSpeaker() = 0;
// Mute/Unmute speaker.
virtual bool GetSpeakerMuted() = 0;
virtual CameraError SetSpeakerMuted(bool muteSpeaker) = 0;
// Get/Set speaker volume level.
virtual uint8_t GetSpeakerVolume() = 0;
virtual CameraError SetSpeakerVolume(uint8_t speakerVol) = 0;
// Get the speaker max and min levels.
virtual uint8_t GetSpeakerMaxLevel() = 0;
virtual uint8_t GetSpeakerMinLevel() = 0;
// Does camera have a microphone
virtual bool HasMicrophone() = 0;
// Mute/Unmute microphone.
virtual CameraError SetMicrophoneMuted(bool muteMicrophone) = 0;
virtual bool GetMicrophoneMuted() = 0;
// Set microphone volume level.
virtual CameraError SetMicrophoneVolume(uint8_t microphoneVol) = 0;
virtual uint8_t GetMicrophoneVolume() = 0;
// Get the microphone max and min levels.
virtual uint8_t GetMicrophoneMaxLevel() = 0;
virtual uint8_t GetMicrophoneMinLevel() = 0;
// Get/Set image control attributes
virtual CameraError SetImageRotation(uint16_t imageRotation) = 0;
virtual uint16_t GetImageRotation() = 0;
virtual CameraError SetImageFlipHorizontal(bool imageFlipHorizontal) = 0;
virtual bool GetImageFlipHorizontal() = 0;
virtual CameraError SetImageFlipVertical(bool imageFlipVertical) = 0;
virtual bool GetImageFlipVertical() = 0;
// Does camera have local storage
virtual bool HasLocalStorage() = 0;
virtual CameraError SetLocalVideoRecordingEnabled(bool localVideoRecordingEnabled) = 0;
virtual bool GetLocalVideoRecordingEnabled() = 0;
virtual CameraError SetLocalSnapshotRecordingEnabled(bool localSnapshotRecordingEnabled) = 0;
virtual bool GetLocalSnapshotRecordingEnabled() = 0;
// Does camera have a status light
virtual bool HasStatusLight() = 0;
virtual CameraError SetStatusLightEnabled(bool statusLightEnabled) = 0;
virtual bool GetStatusLightEnabled() = 0;
// Set Pan, Tilt, and Zoom
virtual CameraError SetPan(int16_t aPan) = 0;
virtual CameraError SetTilt(int16_t aTilt) = 0;
virtual CameraError SetZoom(uint8_t aZoom) = 0;
// Get device defined limits for Pan, Tilt, and Zoom
virtual int16_t GetPanMin() = 0;
virtual int16_t GetPanMax() = 0;
virtual int16_t GetTiltMin() = 0;
virtual int16_t GetTiltMax() = 0;
virtual uint8_t GetZoomMax() = 0;
// Get the maximum number of zones supported by camera.
virtual uint8_t GetMaxZones() = 0;
// Get the maximum number of user-defined zones supported by camera.
virtual uint8_t GetMaxUserDefinedZones() = 0;
// Get the maximum sensitivity level supported by camera.
virtual uint8_t GetSensitivityMax() = 0;
// Get/Set the Zone Detection sensitivity(1 to SensitivityMax)
virtual uint8_t GetDetectionSensitivity() = 0;
virtual CameraError SetDetectionSensitivity(uint8_t aSensitivity) = 0;
// Create a zone trigger
virtual CameraError
CreateZoneTrigger(const chip::app::Clusters::ZoneManagement::ZoneTriggerControlStruct & zoneTrigger) = 0;
// Update a zone trigger
virtual CameraError
UpdateZoneTrigger(const chip::app::Clusters::ZoneManagement::ZoneTriggerControlStruct & zoneTrigger) = 0;
// Remove a zone trigger
virtual CameraError RemoveZoneTrigger(uint16_t zoneID) = 0;
class ZoneEventCallback
{
public:
virtual ~ZoneEventCallback() = default;
/*
* Callback for ZoneTriggered event. This notification callback
* would be called by the camera-device to generate and Log a
* ZoneTriggered event.
*/
virtual void OnZoneTriggeredEvent(uint16_t zoneId,
chip::app::Clusters::ZoneManagement::ZoneEventTriggeredReasonEnum triggerReason)
{
return;
}
/*
* Callback for ZoneStopped event. This notification callback
* would be called by the camera-device to generate and Log a
* ZoneStopped event.
*/
virtual void OnZoneStoppedEvent(uint16_t zoneId,
chip::app::Clusters::ZoneManagement::ZoneEventStoppedReasonEnum stopReason)
{
return;
}
};
};
virtual CameraHALInterface & GetCameraHALInterface() = 0;
};