@mentra/acs-meeting 3.2.0-dev.223 → 3.2.0-dev.225
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.
- package/README.md +14 -3
- package/android/build.gradle +1 -0
- package/android/src/main/java/com/mentra/acsmeeting/AcsMeetingModule.kt +10 -10
- package/android/src/main/java/com/mentra/acsmeeting/AcsMeetingSession.kt +37 -37
- package/android/src/main/java/com/mentra/acsmeeting/audio/UplinkSender.kt +4 -4
- package/android/src/main/java/com/mentra/acsmeeting/source/MeetingVideoSourceSpec.kt +3 -0
- package/android/src/main/java/com/mentra/acsmeeting/video/AcsFrameSender.kt +12 -10
- package/android/src/main/java/com/mentra/acsmeeting/video/I420FormatSpec.kt +2 -0
- package/android/src/main/java/com/mentra/acsmeeting/video/Nv12Packer.kt +2 -0
- package/android/src/test/java/com/mentra/acsmeeting/source/{AcsInvestigationTest.kt → MediaDiagnosticsTest.kt} +10 -10
- package/android/src/test/java/com/mentra/acsmeeting/source/MeetingVideoSourceSpecTest.kt +3 -0
- package/android/src/test/java/com/mentra/acsmeeting/telemetry/VideoQualityTest.kt +2 -2
- package/android/src/test/java/com/mentra/acsmeeting/video/I420FormatSpecTest.kt +2 -0
- package/android/src/test/java/com/mentra/acsmeeting/video/VideoProfileTest.kt +2 -2
- package/build/AcsMeeting.types.d.ts +10 -1
- package/build/AcsMeeting.types.d.ts.map +1 -1
- package/build/AcsMeeting.types.js.map +1 -1
- package/build/AcsMeetingModule.d.ts +2 -2
- package/build/AcsMeetingModule.d.ts.map +1 -1
- package/build/AcsMeetingModule.js.map +1 -1
- package/ios/AcsMeeting.podspec +1 -1
- package/ios/AcsMeetingModule.swift +284 -148
- package/ios/PolicyKit/Package.swift +2 -1
- package/ios/PolicyKit/Sources/AcsAudioPolicy/CallbackOperation.swift +60 -0
- package/ios/PolicyKit/Sources/AcsAudioPolicy/CapturePolicy.swift +5 -0
- package/ios/PolicyKit/Tests/AcsAudioPolicyTests/AcsAudioPolicyTests.swift +1 -0
- package/ios/PolicyKit/Tests/AcsAudioPolicyTests/CallAgentRetirementTests.swift +113 -0
- package/package.json +3 -2
- package/src/AcsMeeting.types.ts +4 -1
- package/src/AcsMeetingModule.ts +2 -2
- package/android/src/androidTest/java/com/mentra/acsmeeting/network/SoftApFeasibilityGateTest.kt +0 -291
- package/android/src/main/java/com/mentra/acsmeeting/network/InternetHold.kt +0 -501
- package/android/src/main/java/com/mentra/acsmeeting/network/Ipv4Prefix.kt +0 -51
- package/android/src/main/java/com/mentra/acsmeeting/network/NetworkFacts.kt +0 -81
- package/android/src/main/java/com/mentra/acsmeeting/network/ScopedNetworkChangeDetector.kt +0 -355
- package/android/src/main/java/com/mentra/acsmeeting/network/ScopedNetworkError.kt +0 -109
- package/android/src/main/java/com/mentra/acsmeeting/network/ScopedNetworkObserver.kt +0 -160
- package/android/src/main/java/com/mentra/acsmeeting/network/ScopedNetworkReadiness.kt +0 -103
- package/android/src/main/java/com/mentra/acsmeeting/network/ScopedNetworkRequestSpec.kt +0 -53
- package/android/src/main/java/com/mentra/acsmeeting/network/ScopedNetworkState.kt +0 -127
- package/android/src/main/java/com/mentra/acsmeeting/network/ScopedSoftApNetwork.kt +0 -573
- package/android/src/main/java/com/mentra/acsmeeting/source/BitmapFont.kt +0 -99
- package/android/src/main/java/com/mentra/acsmeeting/source/CloudflareWhepSource.kt +0 -487
- package/android/src/main/java/com/mentra/acsmeeting/source/DecodedTrackRelay.kt +0 -147
- package/android/src/main/java/com/mentra/acsmeeting/source/FirstFrameGate.kt +0 -45
- package/android/src/main/java/com/mentra/acsmeeting/source/GlassesMediaSource.kt +0 -143
- package/android/src/main/java/com/mentra/acsmeeting/source/LocalWhipIngestSource.kt +0 -772
- package/android/src/main/java/com/mentra/acsmeeting/source/MediaListeners.kt +0 -57
- package/android/src/main/java/com/mentra/acsmeeting/source/SdpAdapter.kt +0 -17
- package/android/src/main/java/com/mentra/acsmeeting/source/SelectedIcePair.kt +0 -139
- package/android/src/main/java/com/mentra/acsmeeting/source/SoftApIceDiagnosis.kt +0 -144
- package/android/src/main/java/com/mentra/acsmeeting/source/SoftApIcePolicy.kt +0 -46
- package/android/src/main/java/com/mentra/acsmeeting/source/SoftApSdpGuard.kt +0 -160
- package/android/src/main/java/com/mentra/acsmeeting/source/SyntheticFrameFactory.kt +0 -205
- package/android/src/main/java/com/mentra/acsmeeting/source/SyntheticI420Source.kt +0 -214
- package/android/src/main/java/com/mentra/acsmeeting/source/TrackRegistry.kt +0 -33
- package/android/src/main/java/com/mentra/acsmeeting/source/VideoSourceArm.kt +0 -110
- package/android/src/main/java/com/mentra/acsmeeting/source/WhipIngestProtocol.kt +0 -207
- package/android/src/main/java/com/mentra/acsmeeting/source/WhipIngestServer.kt +0 -356
- package/android/src/main/java/com/mentra/acsmeeting/telemetry/AvSyncProbe.kt +0 -155
- package/android/src/main/java/com/mentra/acsmeeting/telemetry/ChromaProbe.kt +0 -78
- package/android/src/main/java/com/mentra/acsmeeting/telemetry/PipelineStats.kt +0 -372
- package/android/src/main/java/com/mentra/acsmeeting/telemetry/PipelineTicker.kt +0 -79
- package/android/src/main/java/com/mentra/acsmeeting/telemetry/ProcessCpu.kt +0 -15
- package/android/src/main/java/com/mentra/acsmeeting/telemetry/RingPercentile.kt +0 -48
- package/android/src/main/java/com/mentra/acsmeeting/telemetry/VideoQuality.kt +0 -178
- package/android/src/main/java/com/mentra/acsmeeting/telemetry/VideoRateVerdict.kt +0 -145
- package/android/src/main/java/com/mentra/acsmeeting/trace/SoftApTrace.kt +0 -143
- package/android/src/main/java/com/mentra/acsmeeting/video/FrameGeometry.kt +0 -22
- package/android/src/main/java/com/mentra/acsmeeting/video/I420Packer.kt +0 -72
- package/android/src/test/java/com/mentra/acsmeeting/network/InternetHoldLifecycleTest.kt +0 -102
- package/android/src/test/java/com/mentra/acsmeeting/network/InternetHoldTest.kt +0 -148
- package/android/src/test/java/com/mentra/acsmeeting/network/Ipv4PrefixTest.kt +0 -59
- package/android/src/test/java/com/mentra/acsmeeting/network/NetworkFactsTest.kt +0 -59
- package/android/src/test/java/com/mentra/acsmeeting/network/ScopedLocalNetworkPermissionTest.kt +0 -35
- package/android/src/test/java/com/mentra/acsmeeting/network/ScopedNetworkChangeDetectorTest.kt +0 -165
- package/android/src/test/java/com/mentra/acsmeeting/network/ScopedNetworkErrorTest.kt +0 -96
- package/android/src/test/java/com/mentra/acsmeeting/network/ScopedNetworkLifecycleTest.kt +0 -187
- package/android/src/test/java/com/mentra/acsmeeting/network/ScopedNetworkObserverTest.kt +0 -172
- package/android/src/test/java/com/mentra/acsmeeting/network/ScopedNetworkReadinessTest.kt +0 -141
- package/android/src/test/java/com/mentra/acsmeeting/network/ScopedNetworkRequestSpecTest.kt +0 -69
- package/android/src/test/java/com/mentra/acsmeeting/source/BitmapFontTest.kt +0 -22
- package/android/src/test/java/com/mentra/acsmeeting/source/DecodedTrackRelayTest.kt +0 -41
- package/android/src/test/java/com/mentra/acsmeeting/source/FirstFrameGateTest.kt +0 -60
- package/android/src/test/java/com/mentra/acsmeeting/source/GlassesMediaSourceTest.kt +0 -151
- package/android/src/test/java/com/mentra/acsmeeting/source/I420PlanesTest.kt +0 -67
- package/android/src/test/java/com/mentra/acsmeeting/source/SelectedIcePairTest.kt +0 -165
- package/android/src/test/java/com/mentra/acsmeeting/source/SoftApIceDiagnosisTest.kt +0 -148
- package/android/src/test/java/com/mentra/acsmeeting/source/SoftApIcePolicyTest.kt +0 -76
- package/android/src/test/java/com/mentra/acsmeeting/source/SoftApSdpGuardTest.kt +0 -275
- package/android/src/test/java/com/mentra/acsmeeting/source/SyntheticFrameFactoryTest.kt +0 -193
- package/android/src/test/java/com/mentra/acsmeeting/source/SyntheticI420SourceTest.kt +0 -176
- package/android/src/test/java/com/mentra/acsmeeting/source/TrackRegistryTest.kt +0 -45
- package/android/src/test/java/com/mentra/acsmeeting/source/WhipIngestProtocolTest.kt +0 -356
- package/android/src/test/java/com/mentra/acsmeeting/source/WhipIngestServerLoopbackTest.kt +0 -411
- package/android/src/test/java/com/mentra/acsmeeting/telemetry/AvSyncProbeTest.kt +0 -83
- package/android/src/test/java/com/mentra/acsmeeting/telemetry/ChromaProbeTest.kt +0 -61
- package/android/src/test/java/com/mentra/acsmeeting/telemetry/PipelineStatsTest.kt +0 -322
- package/android/src/test/java/com/mentra/acsmeeting/telemetry/ProcessCpuTest.kt +0 -18
- package/android/src/test/java/com/mentra/acsmeeting/telemetry/RingPercentileTest.kt +0 -49
- package/android/src/test/java/com/mentra/acsmeeting/telemetry/VideoRateVerdictTest.kt +0 -149
- package/android/src/test/java/com/mentra/acsmeeting/trace/SoftApTraceTest.kt +0 -97
- package/android/src/test/java/com/mentra/acsmeeting/video/FrameGeometryTest.kt +0 -33
- package/android/src/test/java/com/mentra/acsmeeting/video/I420PackerTest.kt +0 -126
- package/ios/PolicyKit/Sources/AcsAudioPolicy/GlassesMediaSource.swift +0 -68
- package/ios/WhepVideoSource.swift +0 -356
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
package com.mentra.acsmeeting.source
|
|
2
|
-
|
|
3
|
-
enum class SourceKind {
|
|
4
|
-
/** Subscribe to a Cloudflare WHEP endpoint. The phone is the offerer. */
|
|
5
|
-
WHEP,
|
|
6
|
-
DIRECT,
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Serve a WHIP endpoint on the glasses hotspot and let the glasses publish into it. The phone is
|
|
10
|
-
* the answerer, and no traffic leaves the local link. See [LocalWhipIngestSource].
|
|
11
|
-
*/
|
|
12
|
-
SOFTAP,
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
enum class SourceState { IDLE, CONNECTING, LIVE, FAILED }
|
|
16
|
-
|
|
17
|
-
data class SourceConfig(
|
|
18
|
-
/**
|
|
19
|
-
* WHEP: the endpoint to subscribe to. SOFTAP: unused, because the URL is not known until the
|
|
20
|
-
* listener has bound a port — the source reports it back through
|
|
21
|
-
* [GlassesMediaSource.ingestUrl] instead.
|
|
22
|
-
*/
|
|
23
|
-
val url: String,
|
|
24
|
-
val kind: SourceKind = SourceKind.WHEP,
|
|
25
|
-
/** SOFTAP only: the phone's own IPv4 address on the hotspot, to bind the listener to. */
|
|
26
|
-
val bindAddress: String? = null,
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
/** ACS-negotiated output size. One object so a frame cannot observe a torn width/height. */
|
|
30
|
-
data class TargetSize(val width: Int, val height: Int)
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Whether a subscriber already on [currentUrl] can serve [next] as-is instead of
|
|
34
|
-
* being rebuilt.
|
|
35
|
-
*
|
|
36
|
-
* Reuse is the whole point: a rebuild mints a new peer and restarts the wait for
|
|
37
|
-
* the first frame, which is the outage we are trying to shorten. `CONNECTING`
|
|
38
|
-
* counts as reusable, and since `LIVE` means "a frame reached the sink" that now
|
|
39
|
-
* spans the answer → first frame window too. It cannot strand a caller, because
|
|
40
|
-
* every `CONNECTING` is bounded: the offer post fails, or the answer's
|
|
41
|
-
* first-frame deadline expires into `FAILED` and this returns false.
|
|
42
|
-
*
|
|
43
|
-
* SoftAP never reuses: the listener, port and peer belong to one publish attempt,
|
|
44
|
-
* and the ingest URL is an output of binding, not an input that could stay valid.
|
|
45
|
-
*
|
|
46
|
-
* Owned by an object rather than a file-level function so Kotlin incremental
|
|
47
|
-
* compile cannot see two [GlassesMediaSourceKt] facades and report a phantom
|
|
48
|
-
* overload of the same signature.
|
|
49
|
-
*/
|
|
50
|
-
object SourceReusePolicy {
|
|
51
|
-
fun canReuse(currentUrl: String?, state: SourceState, next: SourceConfig): Boolean =
|
|
52
|
-
currentUrl == next.url && next.kind == SourceKind.WHEP && state != SourceState.FAILED
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Observes source health transitions. `FAILED` is the one that matters: ICE
|
|
57
|
-
* dropped, the WHEP endpoint went away, or an answered subscription never
|
|
58
|
-
* delivered a frame — and nothing downstream will notice on its own, because
|
|
59
|
-
* ACS keeps the call up with a frozen last frame.
|
|
60
|
-
*/
|
|
61
|
-
fun interface SourceStateListener {
|
|
62
|
-
fun onSourceState(state: SourceState, reason: String?)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Transports whatever the glasses already captured. Capture policy lives
|
|
67
|
-
* outside this interface so a Cloudflare hop can be replaced without touching ACS.
|
|
68
|
-
*/
|
|
69
|
-
interface GlassesMediaSource {
|
|
70
|
-
fun start(config: SourceConfig)
|
|
71
|
-
fun restart(config: SourceConfig)
|
|
72
|
-
/** Rebuild the transport for the current config even if it looks healthy. */
|
|
73
|
-
fun forceRestart() {}
|
|
74
|
-
fun stop()
|
|
75
|
-
val state: SourceState
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* SOFTAP only: the WHIP URL the glasses must POST their offer to, known only after [start] has
|
|
79
|
-
* bound a listener. Null for every other kind, where the URL is an input rather than an output.
|
|
80
|
-
*/
|
|
81
|
-
val ingestUrl: String? get() = null
|
|
82
|
-
|
|
83
|
-
fun setPcmDeliveryEnabled(enabled: Boolean)
|
|
84
|
-
fun setTargetSize(size: TargetSize?) {}
|
|
85
|
-
fun setStateListener(listener: SourceStateListener?) {}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Builds the transport for one attempt. Takes [SourceConfig] because the kind decides the class:
|
|
90
|
-
* a Cloudflare subscription and a SoftAP listener are different objects, not one object with a
|
|
91
|
-
* mode flag, and the session must not have to know which.
|
|
92
|
-
*/
|
|
93
|
-
fun interface GlassesMediaSourceFactory {
|
|
94
|
-
fun create(video: VideoFrameListener, pcm: PcmListener, config: SourceConfig): GlassesMediaSource
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
class GlassesMediaController(
|
|
98
|
-
private val factory: GlassesMediaSourceFactory,
|
|
99
|
-
) {
|
|
100
|
-
private var source: GlassesMediaSource? = null
|
|
101
|
-
private var stateListener: SourceStateListener? = null
|
|
102
|
-
|
|
103
|
-
val state: SourceState
|
|
104
|
-
get() = source?.state ?: SourceState.IDLE
|
|
105
|
-
|
|
106
|
-
/** SOFTAP only: the URL the glasses must publish to, once a listener has bound. */
|
|
107
|
-
val ingestUrl: String?
|
|
108
|
-
get() = source?.ingestUrl
|
|
109
|
-
|
|
110
|
-
fun attach(video: VideoFrameListener, pcm: PcmListener, config: SourceConfig) {
|
|
111
|
-
source?.stop()
|
|
112
|
-
source = factory.create(video, pcm, config).also {
|
|
113
|
-
it.setStateListener(stateListener)
|
|
114
|
-
it.start(config)
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
fun restart(config: SourceConfig) {
|
|
119
|
-
source?.restart(config)
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
fun forceRestart() {
|
|
123
|
-
source?.forceRestart()
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
fun setStateListener(listener: SourceStateListener?) {
|
|
127
|
-
stateListener = listener
|
|
128
|
-
source?.setStateListener(listener)
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
fun stop() {
|
|
132
|
-
source?.stop()
|
|
133
|
-
source = null
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
fun setPcmDeliveryEnabled(enabled: Boolean) {
|
|
137
|
-
source?.setPcmDeliveryEnabled(enabled)
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
fun setTargetSize(size: TargetSize?) {
|
|
141
|
-
source?.setTargetSize(size)
|
|
142
|
-
}
|
|
143
|
-
}
|