docs(millicast): document enableUTCInsertion publishing parameter - #783
docs(millicast): document enableUTCInsertion publishing parameter#783bcostdolby wants to merge 10 commits into
Conversation
Co-Authored-By: Brendon Costa <brendon.costa@dolby.com>
🤖 Devin AI EngineerI'll be helping with this pull request! Here's what you should know: ✅ I will automatically:
Note: I can only respond to comments from users who have write access to this repository. ⚙️ Control Options:
|
Co-Authored-By: Brendon Costa <brendon.costa@dolby.com>
| | Parameter name | Type | Description | | ||
| | :------------------ | :------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ||
| | audioOnly | Boolean | Indicates whether the platform should broadcast only audio. | | ||
| | enableUTCInsertion | Boolean | Inserts an unregistered SEI timestamp carrying the server's UTC receive time (Unix epoch milliseconds) into H.264 video, for both passthrough and transcoded layers, without re-encoding the passthrough media. It is only applied when the ingest does not already provide a sender time (`onFi`/AMF); existing timestamps are never overwritten. Supported for RTMP and SRT H.264 ingest (not WebRTC ingest passthrough, and not H.265). The timestamp is delivered to players as [frame metadata](/millicast/playback/players-sdks/web/player/frame-metadata.mdx). When `seiKeyFrameOnly` is also set, the timestamp is inserted on keyframes only. The default is `false`. | |
There was a problem hiding this comment.
The default of what is false? enableUTCInsertion or seiKeyFrameOnly?
Are there docs for the seiKeyFrameOnly already we can link to or should we add some for that here too?
There was a problem hiding this comment.
Good catches — both addressed in the latest push:
-
Which default is
false? It'senableUTCInsertion(this row's parameter). Reworded toenableUTCInsertiondefaults tofalse. to remove the ambiguity. -
seiKeyFrameOnlydocs. There's no dedicated page for it — it's only documented as its own row in this same table (it predates this PR). So I've changed the reference to "theseiKeyFrameOnlyparameter (also in this table)" rather than link to a non-existent page. Docusaurus doesn't generate anchors for individual table rows, so an in-page link to a specific row isn't possible without adding markup. If you'd like, I can promoteseiKeyFrameOnly(andenableUTCInsertion) to short dedicated sub-sections under this page so they get linkable anchors — happy to do that as a follow-up if you think it's worth it.
…ly reference Co-Authored-By: Brendon Costa <brendon.costa@dolby.com>
…sertion Co-Authored-By: Brendon Costa <brendon.costa@dolby.com>
|
@bcostdolby can we also add a detail on how this is applied at the publishing token? |
|
Happy to add this. The row currently notes only that a token-level setting takes precedence over the URL param. Before documenting how it's applied at the token, we should confirm the customer-facing mechanism, since the @bcostdolby — is enabling |
…rtion) on frame-metadata page Co-Authored-By: Brendon Costa <brendon.costa@dolby.com>
…data link, align config surfaces/precedence Co-Authored-By: Brendon Costa <brendon.costa@dolby.com>
…nsertion Co-Authored-By: Brendon Costa <brendon.costa@dolby.com>
…page Co-Authored-By: Brendon Costa <brendon.costa@dolby.com>
| On a publish token `enableUTCInsertion` is a **tri-state** boolean, so an individual token can override the account-level default: | ||
|
|
||
| | Value | Behavior | | ||
| | :------ | :--------------------------------------------------------------------------------- | | ||
| | `true` | Always insert the UTC timestamp for streams published with this token. | | ||
| | `false` | Never insert it — even when the account-level default is on. | | ||
| | `null` | Inherit the account-level default. This is the behavior when the field is omitted. | |
There was a problem hiding this comment.
🔍 Tri-state token behavior vs. documented boolean type in the parameters table
The frame-metadata page documents enableUTCInsertion on a publish token as tri-state (true/false/null to inherit the account default), while the publishing-parameters table lists the type as Boolean with default false. These are consistent for the URL parameter (which is boolean-only), but readers may conflate them; verifying that the Token API schema actually accepts null (and that omission means inherit rather than false) would be worthwhile before publishing, since the API reference pages are generated from OpenAPI and could contradict this.
Was this helpful? React with 👍 or 👎 to provide feedback.
There was a problem hiding this comment.
Verified against the Customer API implementation (millicast/Millicast.DashApi #1582): on a publish token enableUTCInsertion is persisted as a nullable bool (bool? / enable_utc_insertion tinyint(1) NULL DEFAULT NULL). Create treats null/omitted as inherit; update uses the repo's PropertyValue<bool?>/IsSet idiom so an explicit null clears the value back to inherit while an omitted key means "no change". So the tri-state described here is correct.
You're right that the two pages describe different surfaces: the publishing-parameters table row is the URL parameter, which is boolean-only (present/1/true → on), whereas the tri-state applies only to the token setting. That's intentional and now called out on both pages.
Note the API reference pages are generated from an OpenAPI spec that is not in this repo, so it's out of scope for this docs PR — I've flagged separately that the publish-token create/update spec should be updated to include enableUTCInsertion (nullable) so the generated reference stays consistent with this guide.
|
|
||
| The platform only inserts a UTC timestamp on frames that do **not** already carry a sender time. An existing `onFi`/AMF timestamp is never overwritten. | ||
|
|
||
| When more than one of these is set, the URL parameter takes precedence over the publishing-token setting, which in turn overrides the account-level default. |
There was a problem hiding this comment.
The word "these" in this context sounds like it is talking about the onFi/AMF timecodes as that is what was just mentioned.
Please make this more explicit something like, when more than one method is used to configure the enableUTCInsertion flag, ...
Feel free to change the wording of what I just entered there to fit the document.
There was a problem hiding this comment.
Fixed — reworded to remove the ambiguous "these" (which did read as onFi/AMF). It now says: "When more than one method is used to configure the enableUTCInsertion flag, the URL parameter takes precedence over the publishing-token setting, which in turn overrides the account-level default." (commit 6420abd)
|
|
||
| The platform only inserts a UTC timestamp on frames that do **not** already carry a sender time. An existing `onFi`/AMF timestamp is never overwritten. | ||
|
|
||
| When more than one of these is set, the URL parameter takes precedence over the publishing-token setting, which in turn overrides the account-level default. |
There was a problem hiding this comment.
Also mention it is typically recommended that customers use the token or account level setting and only use the URL param for quick testing but not permanent ingest. This allows control and visibility through the dashboard.
There was a problem hiding this comment.
Added a recommendation right after the precedence line: "It is generally recommended to configure the flag at the publishing-token or account level rather than via the URL parameter. This keeps the setting controllable and visible through the dashboard. The URL parameter is best reserved for quick testing, not for permanent ingest configurations." (commit 6420abd)
… over URL param Co-Authored-By: Brendon Costa <brendon.costa@dolby.com>
|
|
||
| ##### Set it on a publishing token with the Token API | ||
|
|
||
| On a publish token `enableUTCInsertion` is a **tri-state** boolean, so an individual token can override the account-level default: |
There was a problem hiding this comment.
Also mention that the token specific value can be easily updated in the dasboard GUI as well if you are manually creating tokens.
There was a problem hiding this comment.
Added a note at the top of the token subsection: "If you create and manage tokens manually, you can also set this per-token value directly in the dashboard — open the token's details and use the Insert UTC timestamp control (Default / On / Off), which maps to the same tri-state described below." (commit 0967e60)
… dashboard GUI Co-Authored-By: Brendon Costa <brendon.costa@dolby.com>
Summary
Documents the new
enableUTCInsertioningest option (media-server OPTI-3526) in the public Millicast docs. The feature stamps H.264 media with an unregistered SEI carrying the server's UTC receive time (Unix epoch ms), for RTMP/SRT passthrough and transcoded H.264 layers, without re-encoding, and only when the ingest doesn't already provide anonFi/AMF sender time.Two files change:
1.
millicast/broadcast/publishing-parameters.md— newenableUTCInsertionrow in the parameters table (alphabetical, afteraudioOnly). Covers: what it does, H.264-only + RTMP/SRT scope (not WebRTC ingest passthrough, not H.265), theonFi/AMF preservation + mixed-clock caveat,seiKeyFrameOnlyinteraction (passthrough limited to keyframes; transcoded layers always per-frame), and configuration surfaces/precedence (URL param > publishing-token setting > account-level default). Links to the frame-metadata page for the consumer/verification path.2.
millicast/playback/frame-metadata.md— new "Server-Inserted UTC Timecode" section under Timecode Metadata. Explains that the SEI reuses the same UUID asonFi(9a21f3be-…) so players parse it identically (no player-side change), and documents behavior across the three processing modes:seiKeyFrameOnly=false)seiKeyFrameOnly=trueAlso covers transcode-with-a-passthrough-layer (mix of the two), the per-frame fresh timestamp value, and the
onFi/AMF non-overwrite guarantee.The parameters-table column padding was re-flowed by
prettier(repo version) because the new row is the widest cell — hence whitespace-only churn on surrounding rows.prettier --checkpasses.Notes for reviewers
RtmpValidator.js,H264Packetizer.cpp,rtmppacketizer.cpp,h264encoder.cpp). The admin feature flag (highest priority in the media server) is internal-only and intentionally omitted from customer docs.Link to Devin session: https://dolby.devinenterprise.com/sessions/b635c9bf3add4fd393c2280136e1c01f
Requested by: @bcostdolby