# Perceived quality detectors

Visible and audible degradation, including synchronization.

Version coverage: /docs/reference/versions/


{{< detector-table >}}
{{< detector-row name="PixelatedVideoDetector" description="Detects heavy video compression associated with visible pixelation." trigger="normalized QP≥0.62 for 8000 ms" recovery="QP<0.52; no QP/unknown codec/pause/end/screenshare stand down; **not `bitPerPixel`**" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/PixelatedVideoDetector.ts#L75" displayName="Pixelated Video" collects="Normalized quantization measurements and codec/track eligibility." example="Normalized QP stays high long enough to indicate heavy video compression." >}}
{{< detector-row name="InboundVideoFlowStateDetector" description="Distinguishes moving, choppy and frozen incoming video." trigger="shared flow slice: continuous/longest freeze≥2000 ms => frozen; ≥2 freezes => choppy" recovery="frozen clears on moving picture; choppy needs freeze-free recovery slice; mutually exclusive payload state" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/InboundVideoFlowStateDetector.ts#L92" displayName="Inbound Video Flow State" collects="Continuous and repeated freezes across flow detection and recovery windows." example="A long freeze marks video frozen; repeated short freezes can mark it choppy." >}}
{{< detector-row name="InventedSpeechDetector" description="Detects excessive synthesized speech used to conceal missing audio." trigger="bucket `clamp(bucket+(inventedRatio−0.05)×dtMs,0,400)`; full opens invented-speech" recovery="empty closes; pause/end discard; missing input marks unavailable" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/InventedSpeechDetector.ts#L55" displayName="Invented Speech" collects="Invented-speech ratio, elapsed time and an accumulated evidence bucket." example="Repeated audio concealment fills the evidence bucket and raises the issue." >}}
{{< detector-row name="AudioPlayoutSynthesisDetector" description="Detects excessive synthesized audio during playout." trigger="synthesized duration / played duration>0.05 over track window" recovery="recovery ratio≤threshold; needs media-playout measurements; currently raises synthesized-audio" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/AudioPlayoutSynthesisDetector.ts#L115" displayName="Audio Playout Synthesis" collects="Synthesized audio duration relative to played duration." example="Synthesized audio exceeds five percent of played duration over the track window." >}}
{{< detector-row name="JitterBufferStressDetector" description="Detects a jitter buffer compensating heavily for uneven delivery." trigger="target delay>200 ms AND stretch share>0.02 for 2 ticks" recovery="conjunction clears, track stand-downs; severity scales against 1000 ms and 0.15" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/JitterBufferStressDetector.ts#L71" displayName="Jitter Buffer Stress" collects="Jitter-buffer target delay and audio stretch share." example="High buffer delay and substantial time stretching occur together." >}}
{{< detector-row name="AVDesyncPlayoutDetector" description="Detects a timing mismatch between paired audio and video." trigger="explicitly paired audio/video playout timestamps; ahead≥90 ms or behind≥185 ms for 3000 ms" recovery="ahead<45 or behind<125; direction-aware hysteresis; missing pairing is unavailable" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/AVDesyncPlayoutDetector.ts#L60" displayName="AV Desync Playout" collects="Playout timestamps of explicitly paired audio and video tracks." example="Paired audio remains sufficiently ahead of video for three seconds." >}}
{{< /detector-table >}}

Sources: [client-monitor-js/src/detectors/PixelatedVideoDetector.ts](https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/PixelatedVideoDetector.ts), [client-monitor-js/src/detectors/AudioPlayoutSynthesisDetector.ts](https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/AudioPlayoutSynthesisDetector.ts), [client-monitor-js/src/detectors/InventedSpeechDetector.ts](https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/InventedSpeechDetector.ts).

