Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 69 additions & 20 deletions draft-ietf-moq-cmsf.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ author:
email: wilaw@akamai.com

normative:
MoQTransport: I-D.draft-ietf-moq-transport-10
MSF: I-D.draft-ietf-moq-warp
MoQTransport: I-D.draft-ietf-moq-transport-18
MSF: I-D.draft-ietf-moq-msf-01
CMAF:
author:
- name: International Organization for Standardization
Expand Down Expand Up @@ -85,7 +85,7 @@ It specifies the syntax and semantics for adding CMAF-packaged media [CMAF] to M
CMAF compliant MOQT Streaming Format (CMSF) is a media format designed to deliver CMAF [CMAF] and
LOC [LOC] compliant media content over MOQ Transport (MOQT) [MoQTransport]. CMSF extends
MSF and retains all the scope, capabilities and features of MSF including the catalog
format, timeline, ABR switching and LOC support. MSF is targeted at real-time and
format, timeline, ABR switching and LOC support. CMSF is targeted at real-time and
interactive levels of live latency, as well as VOD content.

This document describes version 1 of the CMSF streaming format.
Expand All @@ -96,14 +96,15 @@ implementations of this extension unless explicitly noted otherwise in this docu

# CMAF Packaging

## Initialization headers
## Initialization headers {#initheaders}
A CMAF header is a sequence of CMAF constrained ISO BMFF boxes that do not reference any
media samples, but are associated with a CMAF track and are necessary for initializing
the decoding of the subsequent CMAF fragments.

The header for a given MOQT Track MUST be packaged by encoding the header using [BASE64]
and then inserting that payload as the value of the Initialization data "initData" field
in the catalog entry for that Track.
The header for a given MOQT Track MUST be added to the catalog by generating an initDataList
entry with a "type" of "inline", a "data" value of the header encoded using [BASE64] and an
"id" which is unique across the initDataList items. That "id" value is then inserted as the
value of an "initRef" property in all tracks which use that header for initialization.

## Switching sets and tracks
This specification defines a direct mapping between CMAF Tracks ( [CMAF] Sect 3.2.1) and
Expand Down Expand Up @@ -238,7 +239,7 @@ by reusing the signaling model established by DASH [DASH] and the DASH-IF
Encryption and Content Protection (ECCP) guidelines [DASHIF-ECCP].

Content protection in CMSF differs from the encryption scheme defined in
[MSF] Section 3.7. While MSF defines an end-to-end encryption mechanism
[MSF] Section 4.3. While MSF defines an end-to-end encryption mechanism
using MoQ Secure Objects for LOC-packaged content, CMSF uses ISO Common
Encryption [CENC] applied at the CMAF media layer. In CMSF, the media
samples within CMAF chunks are encrypted as specified by [CENC], and the
Expand Down Expand Up @@ -382,7 +383,7 @@ Encryption.
## Initialization data for protected tracks

For protected CMAF tracks, the initialization data (carried in the catalog
`initData` field as defined in Section 3.1) MUST include the Protection
`initDataList` array (as defined in {{initheaders}}) MUST include the Protection
Scheme Information Box ('sinf') containing the Scheme Type Box ('schm')
and Scheme Information Box ('schi') with the Track Encryption Box ('tenc')
as specified in [CENC] Section 6. This enables the subscriber to determine
Expand Down Expand Up @@ -419,15 +420,16 @@ definition video qualities, along with an audio track.

~~~json
{
"version": 1,
"version": "1",
"generatedAt": 1746104606044,
"tracks":[
{
"name": "hd",
"renderGroup": 1,
"packaging": "cmaf",
"isLive": true,
"initData": "AAAAIGZ0eXBpc281AAA...AAAAAAAAAAAAA",
"targetLatency": 2000,
"initRef": "init-hd",
Comment thread
wilaw marked this conversation as resolved.
Resolved
"role": "video",
"codec":"avc1.640028",
"width":1920,
Expand All @@ -441,7 +443,8 @@ definition video qualities, along with an audio track.
"renderGroup": 1,
"packaging": "cmaf",
"isLive": true,
"initData": "AAAAHGZ0eXBpc281AAA...AAAAAAAAAAAAAA",
"targetLatency": 2000,
"initRef": "init-md",
"role": "video",
"codec":"avc1.64001e",
"width":720,
Expand All @@ -455,7 +458,8 @@ definition video qualities, along with an audio track.
"renderGroup": 1,
"packaging": "cmaf",
"isLive": true,
"initData": "AAAAHGZ0eXBpc281AAA...AAAAAAAAAAAAAA",
"targetLatency": 2000,
"initRef": "init-sd",
"role": "video",
"codec":"avc1.64000d",
"width":192,
Expand All @@ -469,14 +473,37 @@ definition video qualities, along with an audio track.
"renderGroup": 1,
"packaging": "cmaf",
"isLive": true,
"initData": "AAAAHGZ0eXBpc281AAA...AAAAAAAAAAAAAA",
"targetLatency": 2000,
"initRef": "init-audio",
"role": "audio",
"codec":"mp4a.40.5",
"samplerate":48000,
"channelConfig":"2",
"bitrate":67071
}
]
],
"initDataList": [
{
"id": "init-hd",
"type": "inline",
"data": "AAAAHGZ0eXBjbWYyAAAAAGNtZjJpc282bXA0MQ..."
},
Comment thread
wilaw marked this conversation as resolved.
Resolved
{
"id": "init-md",
"type": "inline",
"data": "AAAAHGZ0eXBjbWYyAAAAAGNtZjJpc282bXA0MQ..."
},
{
"id": "init-sd",
"type": "inline",
"data": "AAAAHGZ0eXBjbWYyAAAAAGNtZjJpc282bXA0MQ..."
},
{
"id": "init-audio",
"type": "inline",
"data": "AAAAHGZ0eXBjbWYyAAAAAGNtZjJpc282bXA0MQ..."
}
]
}
~~~

Expand All @@ -490,7 +517,7 @@ FairPlay.

~~~json
{
"version": 1,
"version": "1",
"generatedAt": 1746104606044,
"contentProtections": [
{
Expand Down Expand Up @@ -543,10 +570,11 @@ FairPlay.
"name": "video_protected",
"packaging": "cmaf",
"isLive": true,
"buffers": {"target":1500},
"role": "video",
Comment thread
wilaw marked this conversation as resolved.
Resolved
"renderGroup": 1,
"altGroup": 1,
"initData": "AAAAGGZ0eXBjbWZjAAAA...",
"initRef": "1",
"codec": "avc3.4D401F",
"framerate": 25,
"bitrate": 581905,
Expand All @@ -558,14 +586,27 @@ FairPlay.
"name": "audio",
"packaging": "cmaf",
"isLive": true,
"buffers": {"target":1500},
"role": "audio",
"renderGroup": 1,
"initData": "AAAAHGZ0eXBpc281AAA...",
"initRef": "2",
"codec": "mp4a.40.5",
"samplerate": 48000,
"channelConfig": "2",
"bitrate": 67071
}
],
"initDataList": [
{
"id": "1",
"type": "inline",
"data": "AAAAHGZ0eXBjbWYyAAAAAGNtZjJpc282bXA0MQAA..."
},
{
"id": "2",
"type": "inline",
"data": "AAAAHGZ0eXBjbWYyAAAAAGNtZjJpc282bXA0MQAA..."
}
]
}
~~~
Expand All @@ -577,7 +618,7 @@ the ECCP model, suitable for testing and development.

~~~json
{
"version": 1,
"version": "1",
"generatedAt": 1746104606044,
"contentProtections": [
{
Expand All @@ -601,16 +642,24 @@ the ECCP model, suitable for testing and development.
"name": "video",
"packaging": "cmaf",
"isLive": true,
"buffers": {"target":1500},
"role": "video",
"renderGroup": 1,
"initData": "AAAAGGZ0eXBjbWZjAAAA...",
"initRef": "init-video",
"codec": "avc1.640028",
"framerate": 30,
"bitrate": 5000000,
"width": 1920,
"height": 1080,
"contentProtectionRefIDs": ["1"]
}
],
"initDataList": [
{
"id": "init-video",
"type": "inline",
"data": "AAAAHGZ0eXBjbWYyAAAAAGNtZjJpc282bXA0MQAA..."
}
]
}
~~~
Expand Down
Loading