From 919848647a1bac2893d1f2f2802dc8315a5f284b Mon Sep 17 00:00:00 2001 From: "Andrew D.Laptev" Date: Sat, 26 Oct 2024 21:54:25 +0300 Subject: [PATCH] feat: setVideoSourceConfiguration --- src/media.ts | 73 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/src/media.ts b/src/media.ts index 06074ec..a4fd158 100644 --- a/src/media.ts +++ b/src/media.ts @@ -2,9 +2,9 @@ import { Onvif } from './onvif'; import { linerase } from './utils'; import { AudioEncoderConfiguration, MediaUri, - Profile, + Profile, VideoEncoder2Configuration, VideoEncoderConfiguration, - VideoSource, + VideoSource, VideoSourceConfiguration, } from './interfaces/onvif'; import { ReferenceToken } from './interfaces/common'; import { AnyURI } from './interfaces/basics'; @@ -17,7 +17,7 @@ import { GetVideoEncoderConfigurations, GetVideoEncoderConfigurationsResponse as GetVideoEncoder2ConfigurationsResponse, GetVideoSourceConfigurationOptions, GetVideoSourceConfigurationOptionsResponse, - GetVideoSourceConfigurations, MediaProfile, + GetVideoSourceConfigurations, MediaProfile, SetVideoSourceConfigurationResponse, } from './interfaces/media.2'; import { GetVideoSourceConfigurationsResponse, @@ -147,6 +147,73 @@ export class Media { return linerase(data, { array : ['videoSourceTokensAvailable'] }).getVideoSourceConfigurationOptionsResponse; } + /** Common setVideoSourceConfiguration for media and media2 profiles. It depends on media2support flag */ + async setVideoSourceConfiguration(configuration: VideoSourceConfiguration | VideoEncoder2Configuration, forcePersistence: boolean = true): + Promise { + const service = this.onvif.device.media2Support ? 'media2' : 'media'; + const xmlns = this.onvif.device.media2Support + ? 'http://www.onvif.org/ver20/media/wsdl' + : 'http://www.onvif.org/ver10/media/wsdl'; + const body = `` + + `${ + configuration.name ? `${configuration.name}` : '' + }${configuration.useCount ? `${configuration.useCount}` : '' + }${'encoding' in configuration && configuration.encoding + ? `${configuration.encoding}` : '' + }${'resolution' in configuration && configuration.resolution + ? `${ + configuration.resolution.width ? `${configuration.resolution.width}` : '' + }${configuration.resolution.height ? `${configuration.resolution.height}` : '' + }` : '' + }${'quality' in configuration ? `${configuration.quality}` : '' + }${'rateControl' in configuration && configuration.rateControl + ? `${ + configuration.rateControl.frameRateLimit}${configuration.rateControl.bitrateLimit + }` : '' + }${'multicast' in configuration && configuration.multicast + ? `${ + configuration.multicast.address + ? `
${ + configuration.multicast.address.type ? `${configuration.multicast.address.type}` : '' + }${configuration.multicast.address.IPv4Address ? `${configuration.multicast.address.IPv4Address}` : '' + }${configuration.multicast.address.IPv6Address ? `${configuration.multicast.address.IPv6Address}` : '' + }
` : '' + }${configuration.multicast.port !== undefined ? `${configuration.multicast.port}` : '' + }${configuration.multicast.TTL !== undefined ? `${configuration.multicast.TTL}` : '' + }${configuration.multicast.autoStart !== undefined ? `${configuration.multicast.autoStart}` : '' + }
` : '' + }${'quality' in configuration ? `${configuration.quality}` : '' + }${'sourceToken' in configuration ? `${configuration.sourceToken}` : '' + }${'bounds' in configuration + ? `` : '' + }${'extension' in configuration && configuration.extension + ? `${ + 'rotate' in configuration.extension && configuration.extension.rotate ? `${ + configuration.extension.rotate.mode}${ + configuration.extension.rotate.degree ? `${configuration.extension.rotate.degree}` : '' + }` : '' + }` : '' + }
${ + (!this.onvif.device.media2Support ? `${forcePersistence}` : '') + }` + + '
'; + return body; + } + /** * If device supports Media 2.0 returns an array of VideoEncoder2Configuration. Otherwise VideoEncoderConfiguration * @param configurationToken