package camera import ( "github.com/AlexxIT/go2rtc/pkg/hap" "github.com/AlexxIT/go2rtc/pkg/hap/tlv8" ) func NewAccessory(manuf, model, name, serial, firmware string) *hap.Accessory { acc := &hap.Accessory{ AID: hap.DeviceAID, Services: []*hap.Service{ hap.ServiceAccessoryInformation(manuf, model, name, serial, firmware), ServiceCameraRTPStreamManagement(), //hap.ServiceHAPProtocolInformation(), ServiceMicrophone(), }, } acc.InitIID() return acc } func ServiceMicrophone() *hap.Service { return &hap.Service{ Type: "112", // 'Microphone' Characters: []*hap.Character{ { Type: "11A", Format: hap.FormatBool, Value: 0, Perms: hap.EVPRPW, //Descr: "Mute", }, //{ // Type: "119", // Format: hap.FormatUInt8, // Value: 100, // Perms: hap.EVPRPW, // //Descr: "Volume", // //Unit: hap.UnitPercentage, // //MinValue: 0, // //MaxValue: 100, // //MinStep: 1, //}, }, } } func ServiceCameraRTPStreamManagement() *hap.Service { val120, _ := tlv8.MarshalBase64(StreamingStatus{ Status: StreamingStatusAvailable, }) val114, _ := tlv8.MarshalBase64(SupportedVideoStreamConfiguration{ Codecs: []VideoCodecConfiguration{ { CodecType: VideoCodecTypeH264, CodecParams: []VideoCodecParameters{ { ProfileID: []byte{VideoCodecProfileMain}, Level: []byte{VideoCodecLevel31, VideoCodecLevel40}, }, }, VideoAttrs: []VideoCodecAttributes{ {Width: 1920, Height: 1080, Framerate: 30}, {Width: 1280, Height: 720, Framerate: 30}, // important for iPhones {Width: 320, Height: 240, Framerate: 15}, // apple watch }, }, }, }) val115, _ := tlv8.MarshalBase64(SupportedAudioStreamConfiguration{ Codecs: []AudioCodecConfiguration{ { CodecType: AudioCodecTypeOpus, CodecParams: []AudioCodecParameters{ { Channels: 1, BitrateMode: AudioCodecBitrateVariable, SampleRate: []byte{AudioCodecSampleRate16Khz}, }, }, }, }, ComfortNoiseSupport: 0, }) val116, _ := tlv8.MarshalBase64(SupportedRTPConfiguration{ SRTPCryptoType: []byte{CryptoAES_CM_128_HMAC_SHA1_80}, }) service := &hap.Service{ Type: "110", // 'CameraRTPStreamManagement' Characters: []*hap.Character{ { Type: TypeStreamingStatus, Format: hap.FormatTLV8, Value: val120, Perms: hap.EVPR, //Descr: "Streaming Status", }, { Type: TypeSupportedVideoStreamConfiguration, Format: hap.FormatTLV8, Value: val114, Perms: hap.PR, //Descr: "Supported Video Stream Configuration", }, { Type: TypeSupportedAudioStreamConfiguration, Format: hap.FormatTLV8, Value: val115, Perms: hap.PR, //Descr: "Supported Audio Stream Configuration", }, { Type: TypeSupportedRTPConfiguration, Format: hap.FormatTLV8, Value: val116, Perms: hap.PR, //Descr: "Supported RTP Configuration", }, { Type: "B0", Format: hap.FormatUInt8, Value: 1, Perms: hap.EVPRPW, //Descr: "Active", //MinValue: 0, //MaxValue: 1, //MinStep: 1, //ValidVal: []any{0, 1}, }, { Type: TypeSelectedStreamConfiguration, Format: hap.FormatTLV8, Value: "", // important empty Perms: hap.PRPW, //Descr: "Selected RTP Stream Configuration", }, { Type: TypeSetupEndpoints, Format: hap.FormatTLV8, Value: "", // important empty Perms: hap.PRPW, //Descr: "Setup Endpoints", }, }, } return service }