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

0x01

VMAF

0 – 100

0x02

PSNR

dB (typically 30 – 60)

0x03

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

vmaf

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.

psnr

dB (decimal)

Peak Signal-to-Noise Ratio — full-reference, higher is better. Typical live stream values: 35 – 50 dB.

ssim

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

metric

String

One of: vmaf, psnr, ssim.

score

Number

The metric value.

rendition

String (optional)

Rendition identifier (e.g. 720p). Omit to target the default slot.

gop_index

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 or metric is 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-Dynamic on 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).