Media Quality Assessment (MQA)
What is MQA?
Media Quality Assessment is an emerging extension to the CMSD specification (CTA-5006) being developed within the SVTA Measurement/QoE Working Group. The core idea: the encoder already computes perceptual quality metrics as a by-product of compression. MQA makes those metrics available in CMSD headers so they travel with the content through the delivery chain — from the encoder, through CDN caches, to the player and analytics systems — without requiring separate hardware probes or post-encode analysis passes. CDN routing, ABR decisions, and monitoring dashboards can all act on quality signals that are intrinsic to the stream.
Scout for Wowza does not compute MQA scores on-device. Instead, it receives scores from two external sources: H.264 SEI messages embedded in the live bitstream, and scores pushed via a REST endpoint by an external encoder or quality-assessment tool. Both sources feed the same per-stream metrics store, and the CMSD-Dynamic header is populated from that store.
Both ingest methods are opt-in and have no compute overhead when not in use.
H.264 SEI ingest
Scout can extract SVTA2128 MQA quality scores that have been embedded in the H.264 bitstream
by the live encoder. The scores are carried in user_data_unregistered SEI NAL units.
This is the zero-infrastructure option: the encoder is the source of truth and quality data
flows automatically with the stream — no separate side-channel is required.
Enabling SEI ingest
SEI parsing is enabled by default. To disable it, set:
<Property>
<Name>cmsdMqa.input.seiParsing</Name>
<Value>false</Value>
<Type>Boolean</Type>
</Property>
H.265 (HEVC) streams are not supported for SEI MQA extraction. Only H.264 streams are inspected; non-H.264 streams are silently skipped.
Encoder requirements
The encoder must embed SVTA2128-compliant SEI user data in the H.264 bitstream. The SEI payload must conform to the following layout:
16 bytes: SVTA2128 UUID
{9a21f10c-3a38-4b4e-a9d5-95c5b4e0e3f7}1 byte: metric type code
4 bytes: IEEE 754 single-precision float (big-endian), the metric value
Remaining bytes: reserved / ignored
Metric type codes:
Code |
Metric |
Value range |
|---|---|---|
|
VMAF |
0 – 100 |
|
PSNR |
dB (typically 30 – 60) |
|
SSIM |
0 – 1 |
The minimum valid payload length is 25 bytes (16 UUID + 1 type + 4 value + 4 reserved). Payloads shorter than 25 bytes are discarded silently.
CMSD-Dynamic header
When quality scores are available for a stream (from either SEI ingest or REST ingest),
Scout injects a CMSD-Dynamic header on HLS and DASH segment responses. The header is
absent on manifest responses and on streams for which no scores have been received.
Header format (RFC 8941 Dictionary):
CMSD-Dynamic: vmaf=87.3, psnr=42.1, ssim=0.975
Fields:
Field |
Range |
Description |
|---|---|---|
|
0 – 100 (decimal) |
Video Multimethod Assessment Fusion — perceptual quality, higher is better. Present only when a VMAF score has been received for this stream/rendition. |
|
dB (decimal) |
Peak Signal-to-Noise Ratio — full-reference, higher is better. Typical live stream values: 35 – 50 dB. |
|
0 – 1 (decimal) |
Structural Similarity Index — full-reference, higher is better. |
Only fields for which a current score exists are included; the header is omitted entirely if no scores are available for the stream at the time of the request.
Scores are keyed per stream and per rendition. The rendition is identified from the
rendition= query parameter on the segment request. Requests without a rendition=
parameter use a default rendition slot.
Note
CMSD-Dynamic header injection requires cmsdMqa.output.includeDynamic=true (the
default) and cmsdMqa.output.cmsdHeaders=true (the default).
MQA via REST ingest
In addition to SEI parsing, Scout can accept quality scores pushed by an external encoder or quality-assessment tool via an embedded HTTP endpoint. This is useful when:
The encoder does not support SVTA2128 SEI embedding.
A GPU-accelerated or specialised analyser computes VMAF externally.
You want scores aligned to specific GOP indexes for accurate segment attribution.
The ingest endpoint is compatible with the AntMedia Scout module’s MQA receiver API, so the same score-pusher tool works with both server types.
Enabling REST ingest
REST ingest is disabled by default. Enable it in Application.xml (requires a
Standard or higher license):
<Property>
<Name>cmsdMqa.input.restApi</Name>
<Value>true</Value>
<Type>Boolean</Type>
</Property>
<Property>
<Name>cmsdMqa.input.restApiPort</Name>
<Value>8090</Value>
<Type>Integer</Type>
</Property>
The endpoint starts automatically when the module loads with a valid Standard+ license.
Push a score
POST /mqa/{streamName}
Content-Type: application/json
The {streamName} path segment is the WSE stream name (e.g. myStream).
Accepted body fields:
Field |
Type |
Description |
|---|---|---|
|
String |
One of: |
|
Number |
The metric value. |
|
String (optional) |
Rendition identifier (e.g. |
|
Integer (optional) |
GOP sequence number for the measured segment. Informational — stored but not used for score selection. |
Examples:
# Push a VMAF score for the default rendition
curl -X POST http://localhost:8090/mqa/myStream \
-H "Content-Type: application/json" \
-d '{"metric":"vmaf","score":87.3}'
# Push a PSNR score for a specific rendition
curl -X POST http://localhost:8090/mqa/myStream \
-H "Content-Type: application/json" \
-d '{"metric":"psnr","score":43.1,"rendition":"720p","gop_index":42}'
Responses:
200 OK— score recorded.405 Method Not Allowed— only POST is accepted.422 Unprocessable Entity— body is missing required fields ormetricis not a recognised value.
How injected scores are used
Injected scores are stored in the per-stream metrics store and are immediately available to:
The CMSD-Dynamic header — injected scores appear in
CMSD-Dynamicon the next segment request for that stream and rendition.The Prometheus endpoint (see Telemetry) — injected scores are published alongside scores received via SEI ingest.
Quality alerting (see Quality Alerting) — injected VMAF is evaluated alongside SEI-derived VMAF.
When both SEI and REST ingest have a score for the same stream, rendition, and metric, the most recently updated score is used (whichever arrived last).