diff --git a/common/src/autoconfigure-codecs.ts b/common/src/autoconfigure-codecs.ts index abd73f8f2..d8d3a53a7 100644 --- a/common/src/autoconfigure-codecs.ts +++ b/common/src/autoconfigure-codecs.ts @@ -1,4 +1,4 @@ -import { AudioStreamOptions, MediaStreamConfiguration, MediaStreamDestination, MediaStreamOptions, Setting } from "@scrypted/sdk"; +import sdk, { AudioStreamOptions, MediaStreamConfiguration, MediaStreamDestination, MediaStreamOptions, ScryptedDeviceBase, Setting } from "@scrypted/sdk"; export const automaticallyConfigureSettings: Setting = { key: 'autoconfigure', @@ -24,6 +24,16 @@ function getBitrateForResolution(resolution: number) { return MEGABIT / 4; } +export async function checkPluginNeedsAutoConfigure(plugin: ScryptedDeviceBase, extraDevices = 0) { + if (plugin.storage.getItem('autoconfigure') === 'true') + return; + + plugin.storage.setItem('autoconfigure', 'true'); + if (sdk.deviceManager.getNativeIds().length <= 1 + extraDevices) + return; + plugin.log.a(`${plugin.name} now has support for automatic camera configuration for optimal performance. Cameras can be autoconfigured in their respective settings.`); +} + export async function autoconfigureCodecs( getCodecs: () => Promise, configureCodecs: (options: MediaStreamOptions) => Promise, diff --git a/plugins/amcrest/src/main.ts b/plugins/amcrest/src/main.ts index 37ef3a261..ba5116899 100644 --- a/plugins/amcrest/src/main.ts +++ b/plugins/amcrest/src/main.ts @@ -1,7 +1,7 @@ -import { automaticallyConfigureSettings } from "@scrypted/common/src/autoconfigure-codecs"; +import { automaticallyConfigureSettings, checkPluginNeedsAutoConfigure } from "@scrypted/common/src/autoconfigure-codecs"; import { ffmpegLogInitialOutput } from '@scrypted/common/src/media-helpers'; import { readLength } from "@scrypted/common/src/read-stream"; -import sdk, { Camera, DeviceCreatorSettings, DeviceInformation, FFmpegInput, Intercom, Lock, MediaObject, MediaStreamOptions, ObjectDetectionTypes, ObjectDetector, ObjectsDetected, Reboot, RequestPictureOptions, RequestRecordingStreamOptions, ResponseMediaStreamOptions, ScryptedDeviceType, ScryptedInterface, ScryptedMimeTypes, Setting, VideoCameraConfiguration, VideoRecorder } from "@scrypted/sdk"; +import sdk, { Camera, DeviceCreatorSettings, DeviceInformation, FFmpegInput, Intercom, Lock, MediaObject, MediaStreamOptions, ObjectDetectionTypes, ObjectDetector, ObjectsDetected, Reboot, RequestPictureOptions, RequestRecordingStreamOptions, ResponseMediaStreamOptions, ScryptedDeviceType, ScryptedInterface, ScryptedMimeTypes, ScryptedNativeId, Setting, VideoCameraConfiguration, VideoRecorder } from "@scrypted/sdk"; import child_process, { ChildProcess } from 'child_process'; import { PassThrough, Readable, Stream } from "stream"; import { OnvifIntercom } from "../../onvif/src/onvif-intercom"; @@ -338,7 +338,7 @@ class AmcrestCamera extends RtspSmartCamera implements VideoCameraConfiguration, }; ac.type = 'button'; ret.push(ac); - + return ret; } @@ -607,6 +607,11 @@ class AmcrestCamera extends RtspSmartCamera implements VideoCameraConfiguration, } class AmcrestProvider extends RtspProvider { + constructor(nativeId?: ScryptedNativeId) { + super(nativeId); + checkPluginNeedsAutoConfigure(this); + } + getAdditionalInterfaces() { return [ ScryptedInterface.Reboot, diff --git a/plugins/hikvision/src/main.ts b/plugins/hikvision/src/main.ts index c2f8630cd..a3fb74bb5 100644 --- a/plugins/hikvision/src/main.ts +++ b/plugins/hikvision/src/main.ts @@ -1,5 +1,5 @@ -import { automaticallyConfigureSettings } from "@scrypted/common/src/autoconfigure-codecs"; -import sdk, { Camera, DeviceCreatorSettings, DeviceInformation, FFmpegInput, Intercom, MediaObject, MediaStreamOptions, ObjectDetectionResult, ObjectDetectionTypes, ObjectDetector, ObjectsDetected, Reboot, RequestPictureOptions, ScryptedDeviceType, ScryptedInterface, ScryptedMimeTypes, Setting, VideoCameraConfiguration } from "@scrypted/sdk"; +import { automaticallyConfigureSettings, checkPluginNeedsAutoConfigure } from "@scrypted/common/src/autoconfigure-codecs"; +import sdk, { Camera, DeviceCreatorSettings, DeviceInformation, FFmpegInput, Intercom, MediaObject, MediaStreamOptions, ObjectDetectionResult, ObjectDetectionTypes, ObjectDetector, ObjectsDetected, Reboot, RequestPictureOptions, ScryptedDeviceType, ScryptedInterface, ScryptedMimeTypes, ScryptedNativeId, Setting, VideoCameraConfiguration } from "@scrypted/sdk"; import crypto from 'crypto'; import { PassThrough } from "stream"; import xml2js from 'xml2js'; @@ -610,8 +610,9 @@ export class HikvisionCamera extends RtspSmartCamera implements Camera, Intercom class HikvisionProvider extends RtspProvider { clients: Map; - constructor() { - super(); + constructor(nativeId?: ScryptedNativeId) { + super(nativeId); + checkPluginNeedsAutoConfigure(this); } getScryptedDeviceCreator(): string { diff --git a/plugins/onvif/src/main.ts b/plugins/onvif/src/main.ts index a3e93b689..d9ceb68eb 100644 --- a/plugins/onvif/src/main.ts +++ b/plugins/onvif/src/main.ts @@ -9,7 +9,7 @@ import { autoconfigureSettings, configureCodecs, getCodecs } from "./onvif-confi import { listenEvents } from "./onvif-events"; import { OnvifIntercom } from "./onvif-intercom"; import { OnvifPTZMixinProvider } from "./onvif-ptz"; -import { automaticallyConfigureSettings } from "@scrypted/common/src/autoconfigure-codecs"; +import { automaticallyConfigureSettings, checkPluginNeedsAutoConfigure } from "@scrypted/common/src/autoconfigure-codecs"; const { mediaManager, systemManager, deviceManager } = sdk; @@ -298,8 +298,10 @@ class OnvifProvider extends RtspProvider implements DeviceDiscovery { timeout: NodeJS.Timeout; }>(); - constructor(nativeId?: string) { + + constructor(nativeId?: ScryptedNativeId) { super(nativeId); + checkPluginNeedsAutoConfigure(this, 1); process.nextTick(() => { deviceManager.onDeviceDiscovered({