@blockcast/mmt-container 0.5.0 → 1.0.0-main.3cb7359ea316

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/README.md +21 -16
  2. package/dist/browser-runtime.js +1024 -1078
  3. package/dist/browser-runtime.js.map +4 -4
  4. package/dist/carp-catalog.d.ts +33 -87
  5. package/dist/carp-catalog.d.ts.map +1 -1
  6. package/dist/carp-catalog.js +12 -434
  7. package/dist/carp-catalog.js.map +4 -4
  8. package/dist/catalog-fec-params.d.ts +48 -161
  9. package/dist/catalog-fec-params.d.ts.map +1 -1
  10. package/dist/catalog-fec-params.js +567 -592
  11. package/dist/catalog-fec-params.js.map +4 -4
  12. package/dist/catalog-network-source.js +6 -2
  13. package/dist/catalog-network-source.js.map +3 -3
  14. package/dist/delivery-catalog.js +12 -4
  15. package/dist/delivery-catalog.js.map +4 -4
  16. package/dist/delta-fallback-config.d.ts +21 -26
  17. package/dist/delta-fallback-config.d.ts.map +1 -1
  18. package/dist/delta-fallback-config.js +582 -24
  19. package/dist/delta-fallback-config.js.map +4 -4
  20. package/dist/fec-manager.js +6 -2
  21. package/dist/fec-manager.js.map +3 -3
  22. package/dist/fec-state.d.ts +5 -43
  23. package/dist/fec-state.d.ts.map +1 -1
  24. package/dist/fec-state.js +529 -34
  25. package/dist/fec-state.js.map +4 -4
  26. package/dist/fec-worker-setup.js +6 -2
  27. package/dist/fec-worker-setup.js.map +3 -3
  28. package/dist/held-layer-admission.js +6 -2
  29. package/dist/held-layer-admission.js.map +3 -3
  30. package/dist/index.d.ts +3 -3
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +5 -39
  33. package/dist/index.js.map +2 -2
  34. package/dist/iso-block-locator.js +6 -2
  35. package/dist/iso-block-locator.js.map +3 -3
  36. package/dist/mfu-reassembler.js +6 -2
  37. package/dist/mfu-reassembler.js.map +3 -3
  38. package/dist/mmtp-container-parser.js +6 -2
  39. package/dist/mmtp-container-parser.js.map +3 -3
  40. package/dist/mmtp-container-parser.no-modules.js +551 -452
  41. package/dist/mmtp-container-parser.no-modules.js.map +4 -4
  42. package/dist/mmtp-decode-pipeline.js +6 -2
  43. package/dist/mmtp-decode-pipeline.js.map +3 -3
  44. package/dist/mmtp-fec-session.d.ts +7 -6
  45. package/dist/mmtp-fec-session.d.ts.map +1 -1
  46. package/dist/mmtp-fec-session.js +13 -9
  47. package/dist/mmtp-fec-session.js.map +3 -3
  48. package/dist/mmtp-router.d.ts +7 -16
  49. package/dist/mmtp-router.d.ts.map +1 -1
  50. package/dist/mmtp-router.js +19 -29
  51. package/dist/mmtp-router.js.map +3 -3
  52. package/dist/multicast-auth-catalog.js +7 -3
  53. package/dist/multicast-auth-catalog.js.map +3 -3
  54. package/dist/multicast-input.js +7 -3
  55. package/dist/multicast-input.js.map +3 -3
  56. package/dist/multicast-manager.d.ts +29 -32
  57. package/dist/multicast-manager.d.ts.map +1 -1
  58. package/dist/multicast-manager.js +682 -253
  59. package/dist/multicast-manager.js.map +4 -4
  60. package/dist/multicast-transport.d.ts +23 -2
  61. package/dist/multicast-transport.d.ts.map +1 -1
  62. package/dist/multicast-transport.js +57 -16
  63. package/dist/multicast-transport.js.map +4 -4
  64. package/dist/multicast-unwrap.js +6 -2
  65. package/dist/multicast-unwrap.js.map +3 -3
  66. package/dist/no-modules.js +551 -452
  67. package/dist/no-modules.js.map +4 -4
  68. package/dist/phase14-catalog-override.d.ts +10 -5
  69. package/dist/phase14-catalog-override.d.ts.map +1 -1
  70. package/dist/phase14-catalog-override.js +35 -11
  71. package/dist/phase14-catalog-override.js.map +2 -2
  72. package/dist/repair-fetch.d.ts +3 -1
  73. package/dist/repair-fetch.d.ts.map +1 -1
  74. package/dist/repair-fetch.js +16 -3
  75. package/dist/repair-fetch.js.map +3 -3
  76. package/dist/repair-layers.d.ts +0 -123
  77. package/dist/repair-layers.d.ts.map +1 -1
  78. package/dist/repair-layers.js +1 -349
  79. package/dist/repair-layers.js.map +3 -3
  80. package/dist/signaling.js +6 -2
  81. package/dist/signaling.js.map +3 -3
  82. package/dist/timestamp-codec.js +6 -2
  83. package/dist/timestamp-codec.js.map +3 -3
  84. package/dist/wasm-mfu-reassembler.js +6 -2
  85. package/dist/wasm-mfu-reassembler.js.map +3 -3
  86. package/dist/wasm-mmtp-container-parser.js +6 -2
  87. package/dist/wasm-mmtp-container-parser.js.map +3 -3
  88. package/package.json +9 -5
  89. package/schemas/catalog.schema.json +53 -58
  90. package/src/carp-catalog.ts +39 -229
  91. package/src/catalog-fec-params.ts +130 -493
  92. package/src/delta-fallback-config.ts +63 -50
  93. package/src/fec-state.ts +7 -62
  94. package/src/index.ts +10 -30
  95. package/src/mmtp-fec-session.ts +11 -10
  96. package/src/mmtp-router.ts +14 -29
  97. package/src/multicast-manager.ts +89 -121
  98. package/src/multicast-transport.ts +65 -12
  99. package/src/phase14-catalog-override.ts +67 -16
  100. package/src/repair-fetch.ts +27 -3
  101. package/src/repair-layers.ts +7 -520
  102. package/test-vectors/catalog/README.md +39 -67
  103. package/test-vectors/catalog/fec-01-runtime/README.md +15 -0
  104. package/test-vectors/catalog/{negative/fec-block-profile-retired.json → fec-01-runtime/fec-iso-ssbg1.json} +1 -1
  105. package/test-vectors/catalog/fec-01-runtime/fec-layered-repair.json +106 -0
  106. package/test-vectors/catalog/{negative/fec-block-profile-unknown.json → fec-01-runtime/fec-multicast.json} +2 -1
  107. package/test-vectors/catalog/fec-01-runtime/multicast-native-ssm-no-network-source.json +44 -0
  108. package/test-vectors/catalog/negative/fec-block-profile-missing.json +24 -11
  109. package/test-vectors/catalog/negative/fec-iso-symbol-size-below-floor.json +13 -8
  110. package/test-vectors/catalog/negative/fec-reed-solomon-iso-symbol-size-13.json +13 -8
  111. package/test-vectors/catalog/negative/fec-repair-layer-geometry.json +20 -10
  112. package/test-vectors/catalog/negative/fec-repair-layer-missing-symbols.json +20 -10
  113. package/test-vectors/catalog/negative/fec-repair-overlay-source-symbols-zero.json +25 -17
  114. package/test-vectors/catalog/negative/fec-repair-symbols-zero.json +13 -8
  115. package/test-vectors/catalog/negative/fec-source-symbols-zero.json +13 -8
  116. package/test-vectors/catalog/negative/fec-symbol-size-zero.json +13 -8
  117. package/test-vectors/catalog/negative/raptorq-source-symbols-over-max.json +18 -9
  118. package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +13 -8
  119. package/test-vectors/catalog/positive/fec-algorithm-unimplemented.json +14 -9
  120. package/test-vectors/catalog/positive/fec-iso-ssbg1.json +25 -12
  121. package/test-vectors/catalog/positive/fec-layered-repair.json +79 -35
  122. package/test-vectors/catalog/positive/fec-multicast.json +26 -13
  123. package/test-vectors/catalog/positive/fec-reed-solomon-layered.json +29 -18
  124. package/test-vectors/catalog/positive/multicast-draft01-4-1-example.json +28 -20
  125. package/test-vectors/catalog/positive/multicast-draft01-7-2-6-example.json +14 -10
  126. package/test-vectors/catalog/positive/multicast-native-ssm-no-network-source.json +22 -12
  127. package/test-vectors/catalog/section-codes.json +13 -22
  128. package/test-vectors/catalog-timing.json +2 -2
  129. package/test-vectors/catalog-validation.json +30 -243
  130. package/test-vectors/catalog/negative/fec-enhancement-repair-removed.json +0 -28
  131. package/test-vectors/catalog/negative/fec-reed-solomon-k-plus-p-over-255.json +0 -39
  132. package/test-vectors/catalog/negative/fec-reed-solomon-overlay-over-255.json +0 -40
  133. package/test-vectors/catalog/negative/fec-repair-multiple-depends.json +0 -32
  134. package/test-vectors/catalog/negative/fec-repair-overlay-with-layer.json +0 -34
  135. package/test-vectors/catalog/negative/fec-repair-priority-out-of-band.json +0 -24
  136. package/test-vectors/catalog/negative/fec-repair-source-symbols-without-scope.json +0 -33
@@ -12,7 +12,16 @@ Negative fixtures are the migration worklist and MUST fail.
12
12
  `section-codes.json` lists every negative once: the code and path the
13
13
  TypeScript runtime validator and the Rust catalog section (`mmt_fec::catalog`)
14
14
  both reject it with, or `outOfSection` when the section does not own the field.
15
- The Rust section owns only the track MMTP/FEC/repair/timing fields.
15
+ The Rust section owns only the track MMTP and timing fields.
16
+
17
+ FEC is the draft-ramadan-moq-fec-catalog-00 `fec` **array** of instance
18
+ objects; repair (`fec-repair`) and symbol (`fec-source`) tracks name their
19
+ instance by `source` + `instanceId` (BLO-50171). The schema states what a
20
+ publisher emits. A receiver binds FEC through `validateFecCatalog`, which fails
21
+ closed per instance against `vectors/fec-catalog-00/`;
22
+ `validateCmsfMmtpCatalog` never throws on `fec` or on a repair or symbol track,
23
+ so a fec-01 single object costs only that track's FEC. The fec-01 catalogs the
24
+ runtime resolver still reads live in `fec-01-runtime/`.
16
25
 
17
26
  The negatives:
18
27
 
@@ -41,36 +50,21 @@ The negatives:
41
50
  - `multicast-network-source-empty.json`: `networkSource` is optional, but an
42
51
  empty array is not a way to say "absent" — omit the key instead.
43
52
  - `repair-track-legacy-shape.json`: repair tracks use `packaging: "fec-repair"`.
44
- - `fec-enhancement-repair-removed.json`: `fec.enhancementRepair` does not exist;
45
- repair layers are self-describing `fec-repair` tracks.
46
- - `fec-repair-*.json`: a repair layer or overlay declares `depends` (exactly one
47
- source), `repairSymbols`, and a `priority` in 192..255; an overlay declares
48
- `scope: "keyframe"` plus `sourceSymbols` and never a `repairLayer`; a repair
49
- track carries no block geometry.
50
- - `media-track-repair-layer.json`: `repairLayer`, `repairSymbols`, `sourceSymbols`,
51
- and `scope` are `fec-repair` track fields only.
52
- - `raptorq-source-symbols-over-max.json`: RaptorQ K is at most 56403 (RFC 6330).
53
- - `fec-iso-symbol-size-below-floor.json` (RaptorQ T=8, aligned) and
54
- `fec-reed-solomon-iso-symbol-size-13.json`: under `iso-ssbg1-v1`
55
- `symbolSize` is at least 14, whatever the algorithm; a shorter symbol carries
56
- no protected MMTP packet (draft-ramadan-moq-fec-01 6.3.4 rule 13, 7.3).
57
- - `fec-symbol-size-zero.json`, `fec-source-symbols-zero.json`,
58
- `fec-repair-symbols-zero.json` (with a named repair track) and
59
- `fec-repair-overlay-source-symbols-zero.json` (`track_fec_bounds` at the
60
- overlay's `sourceSymbols`): the rule 13 / 5.1.1 lower bounds of 1.
61
- - `fec-reed-solomon-k-plus-p-over-255.json` (base K + totalP = 256 across
62
- layers 0 and 1) and `fec-reed-solomon-overlay-over-255.json` (overlay
63
- K + P = 256): under `reed-solomon` every FEC instance holds at most 255
64
- symbols (`track_fec_bounds`, draft-ramadan-moq-fec-01 6.3.4 rule 12, 4.5).
65
- The schema cannot state a sum and accepts both.
66
- - `fec-block-profile-missing.json`: an FEC instance must name its block
67
- profile; there is no default (`track_fec_block_profile`).
68
- - `fec-block-profile-unknown.json`: `fec.blockProfile` is `"iso-ssbg1-v1"`; a
69
- near-miss such as `"iso-ssbg1"` is rejected, not normalized
70
- (`track_fec_block_profile_unimplemented`).
71
- - `fec-block-profile-retired.json`: the retired Blockcast-private
72
- `"k-padded-v1"` is not a block profile
73
- (`track_fec_block_profile_unimplemented`).
53
+ - The FEC negatives are schema-only (`outOfSection` in `section-codes.json`):
54
+ the publisher schema refuses them, while a receiver fails the one instance
55
+ closed (`vectors/fec-catalog-00/`, where `recut-*` carry the fec-01 rule-13
56
+ set's outcomes). `fec-symbol-size-zero.json`, `fec-source-symbols-zero.json`,
57
+ `fec-repair-symbols-zero.json` and `fec-repair-overlay-source-symbols-zero.json`
58
+ (the overlay instance's `sourceSymbols`): lower bounds of 1.
59
+ `fec-iso-symbol-size-below-floor.json` (RaptorQ T=8, aligned) and
60
+ `fec-reed-solomon-iso-symbol-size-13.json`: under `iso-ssbg1-v1` `symbolSize`
61
+ is at least 14 (draft-ramadan-moq-mmt-02 7.1). `raptorq-unaligned-symbol.json`
62
+ and `raptorq-source-symbols-over-max.json`: RaptorQ T is a multiple of 8 and
63
+ K at most 56403. `fec-block-profile-missing.json`: an instance names its block
64
+ profile; there is no default. `fec-repair-layer-geometry.json`: a repair track
65
+ carries no block geometry. `fec-repair-layer-missing-symbols.json`: a layer
66
+ 1..n declares `repairSymbols`. `media-track-repair-layer.json`: `repairLayer`
67
+ is a `fec-repair` track field only.
74
68
  - `archive-origin-with-path.json`: `archive.origin` is scheme and authority
75
69
  only. A path would make the derived object URL ambiguous above a codec that
76
70
  refuses percent-encoding precisely so each identity has one URL path.
@@ -88,43 +82,20 @@ on the other, so both arms of the `/v1/{ns}/{track}/{group}` derivation stay
88
82
  exercised: `{ns}` is the track's own `namespace`, or the MoQ subscription's
89
83
  Track Namespace tuple when the track declares none.
90
84
 
91
- Every `fec` object that declares an FEC instance (any `algorithm` other than
92
- `"none"`) carries `fec.blockProfile` (BLO-35597, ISO/IEC 23008-1 Annex C).
93
- draft-ramadan-moq-fec §5.1 defines exactly one value, `"iso-ssbg1-v1"`
94
- (ssbg_mode1, `K' = SSB_length`, consecutive SS_IDs), and it is never defaulted
95
- and never inferred from the wire. Any other token, the retired
96
- Blockcast-private `"k-padded-v1"` included, fails validation with
97
- `track_fec_block_profile_unimplemented`; an absent token on an FEC instance
98
- fails with `track_fec_block_profile`. A receiver consumes such a track without
99
- FEC and joins none of its repair tracks, without failing the session or any
100
- other track's FEC.
101
-
102
- `"iso-ssbg1-v1"` bounds a block's location by its span, so a receiver applies
103
- FEC only when `fec.interleaveDepthMs` is at least 33 ms; without it the track
104
- resolves to no FEC (`track_fec_block_span` on `interleaveDepthMs`; a declared
105
- span below the floor is `track_fec`). The schema and the
106
- CMSF validator do not require the field. Every fixture that carried
107
- `"k-padded-v1"` now names `"iso-ssbg1-v1"`. The FEC-carrying positives that
108
- omitted the span (`fec-multicast.json`,
109
- `multicast-native-ssm-no-network-source.json`) now declare the one-group span
110
- their omitted field used to mean (`interleaveDepthMs` equal to
111
- `groupDurationMs`, 1000). `fec-iso-ssbg1.json` is `fec-multicast.json` without
112
- that span: a valid catalog whose FEC a receiver cannot apply.
113
-
114
- On `algorithm: "none"` the field is optional, but a present token must still be
115
- implemented. Repair tracks carry no `fec`, so they carry no profile; a repair
116
- layer or overlay inherits its source's. Every negative fixture with an FEC
117
- source names `"iso-ssbg1-v1"` unless the profile is what it tests, so each still
118
- fails for exactly the reason listed above.
85
+ Every FEC instance names its `scheme` and `blockProfile`; neither is defaulted
86
+ or inferred from the wire. A scheme or profile the receiver does not implement
87
+ leaves that instance unavailable, never the catalog (draft-ramadan-moq-fec-core-00
88
+ 10.3 rule 1); `"none"` is reserved and an absent or empty array is how a track
89
+ declares no FEC. `fec-iso-ssbg1.json` is `fec-multicast.json` without the
90
+ instance's `interleaveDepthMs`.
119
91
 
120
- `fec-layered-repair.json` carries base layers 0..2 and a keyframe overlay for one
121
- source (draft-ramadan-moq-fec 6.3): layer 0 is `fec.repairTrack`, every further
122
- repair track names its source in `depends`, and the second endpoint carries only
123
- repair tracks. Priority is on the MoQT scale (lower first); `audio-repair`
124
- declares none and so is layer 0 at the default 240.
92
+ `fec-layered-repair.json` carries, for one source, instance 0 with base layers
93
+ 0..2 (layer 0 is the instance's `repairTrack`; layers 1..2 name `source` and
94
+ `instanceId` and declare `repairSymbols`) and instance 1, a keyframe overlay
95
+ (`scope: "keyframe"`) with its own repair track; the second endpoint carries
96
+ only repair tracks. Priority is on the MoQT scale (lower first); `audio-repair`
97
+ declares none.
125
98
 
126
- An omitted `fec.interleaveDepthMs` is valid catalog shape, but under
127
- `"iso-ssbg1-v1"` it leaves the track without FEC at a receiver (see above).
128
99
  When present, `groupDurationTicks` overrides the integer millisecond field.
129
100
  Switching sets compare `ticks / timescale`, so equal wall-clock durations at
130
101
  different timescales are valid. One exception: an intra-only member (group
@@ -173,7 +144,8 @@ digest, and compares the extracted catalog bytes to the committed fixture. The
173
144
  fixture is retained byte-identical as the record of what v1 shipped and is now
174
145
  expected to **fail** validation: its two repair tracks declare the retired
175
146
  `packaging: "condensed"`, which is not a catalog packaging value, and its two
176
- FEC sources predate the required `fec.blockProfile`. The condensed
147
+ FEC sources carry the fec-01 single `fec` object, which the array-only schema
148
+ refuses by type. The condensed
177
149
  FEC repair format itself is unaffected — a catalog declares it as
178
150
  `packaging: "fec-repair"` plus `fec.repairContainer`.
179
151
 
@@ -0,0 +1,15 @@
1
+ # fec-01 single-object catalogs (compatibility inputs)
2
+
3
+ These are the draft-ramadan-moq-fec-01 `fec` object shape, kept byte-identical
4
+ to the `positive/` fixtures they were before the array-only re-cut (BLO-50171).
5
+ They are **not** catalog-contract fixtures: the contract is the
6
+ draft-ramadan-moq-fec-catalog-00 array (`positive/`, `vectors/fec-catalog-00/`).
7
+
8
+ They exist for one rule: a fec-01 publisher costs only the FEC of the track
9
+ carrying the object. `validateCmsfMmtpCatalog` must not throw on one,
10
+ `validateFecCatalog` gives that track no instance, and the runtime resolver
11
+ (`resolveRepairLayers`, `catalogTrackFecUnavailable`) gives it no FEC with
12
+ `fec_member` at its `fec` (`catalog-schema.test.ts`). That last test is also
13
+ the mutation guard: restoring a fec-01 read in the resolver turns it red.
14
+
15
+ Delete this directory once no publisher emits the fec-01 object (BLO-50172).
@@ -12,7 +12,7 @@
12
12
  "groupDurationMs": 1000,
13
13
  "fec": {
14
14
  "algorithm": "raptorq",
15
- "blockProfile": "k-padded-v1",
15
+ "blockProfile": "iso-ssbg1-v1",
16
16
  "sourceSymbols": 768,
17
17
  "repairSymbols": 384,
18
18
  "symbolSize": 1312,
@@ -0,0 +1,106 @@
1
+ {
2
+ "version": 1,
3
+ "streamingFormat": "mmtp",
4
+ "streamingFormatVersion": "draft-ramadan-moq-mmt-00",
5
+ "tracks": [
6
+ {
7
+ "name": "video",
8
+ "packaging": "mmtp",
9
+ "codec": "avc1.640028",
10
+ "mmtpMode": "mfu",
11
+ "timescale": 90000,
12
+ "groupDurationMs": 1000,
13
+ "fec": {
14
+ "algorithm": "raptorq",
15
+ "blockProfile": "iso-ssbg1-v1",
16
+ "sourceSymbols": 64,
17
+ "repairSymbols": 8,
18
+ "symbolSize": 1312,
19
+ "interleaveDepthMs": 1000,
20
+ "reorderToleranceMs": 40,
21
+ "repairTrack": "video/repair"
22
+ }
23
+ },
24
+ {
25
+ "name": "video/repair",
26
+ "packaging": "fec-repair",
27
+ "depends": ["video"],
28
+ "repairLayer": 0,
29
+ "priority": 240
30
+ },
31
+ {
32
+ "name": "video/repair/1",
33
+ "packaging": "fec-repair",
34
+ "depends": ["video"],
35
+ "repairLayer": 1,
36
+ "repairSymbols": 16,
37
+ "priority": 244
38
+ },
39
+ {
40
+ "name": "video/repair/2",
41
+ "packaging": "fec-repair",
42
+ "depends": ["video"],
43
+ "repairLayer": 2,
44
+ "repairSymbols": 32,
45
+ "priority": 248
46
+ },
47
+ {
48
+ "name": "video/keyframe-repair",
49
+ "packaging": "fec-repair",
50
+ "depends": ["video"],
51
+ "scope": "keyframe",
52
+ "sourceSymbols": 256,
53
+ "repairSymbols": 32,
54
+ "priority": 242
55
+ },
56
+ {
57
+ "name": "audio",
58
+ "packaging": "mmtp",
59
+ "codec": "mp4a.40.2",
60
+ "mmtpMode": "mfu",
61
+ "timescale": 48000,
62
+ "groupDurationMs": 1000,
63
+ "fec": {
64
+ "algorithm": "raptorq",
65
+ "blockProfile": "iso-ssbg1-v1",
66
+ "sourceSymbols": 47,
67
+ "repairSymbols": 4,
68
+ "symbolSize": 1312,
69
+ "interleaveDepthMs": 1000,
70
+ "repairTrack": "audio-repair"
71
+ }
72
+ },
73
+ {
74
+ "name": "audio-repair",
75
+ "packaging": "fec-repair"
76
+ }
77
+ ],
78
+ "multicast": {
79
+ "endpoints": [
80
+ {
81
+ "sourceAddress": "192.0.2.10",
82
+ "groupAddress": "232.1.1.1",
83
+ "port": 5000,
84
+ "tracks": [
85
+ { "name": "video", "packetId": 1 },
86
+ { "name": "audio", "packetId": 2 },
87
+ { "name": "video/repair", "packetId": 3 },
88
+ { "name": "audio-repair", "packetId": 4 }
89
+ ]
90
+ },
91
+ {
92
+ "sourceAddress": "192.0.2.10",
93
+ "groupAddress": "232.1.1.2",
94
+ "port": 5000,
95
+ "tracks": [
96
+ { "name": "video/repair/1", "packetId": 5 },
97
+ { "name": "video/repair/2", "packetId": 6 },
98
+ { "name": "video/keyframe-repair", "packetId": 7 }
99
+ ]
100
+ }
101
+ ],
102
+ "networkSource": [
103
+ { "type": "amt", "discovery": "driad" }
104
+ ]
105
+ }
106
+ }
@@ -12,10 +12,11 @@
12
12
  "groupDurationMs": 1000,
13
13
  "fec": {
14
14
  "algorithm": "raptorq",
15
- "blockProfile": "iso-ssbg1",
15
+ "blockProfile": "iso-ssbg1-v1",
16
16
  "sourceSymbols": 768,
17
17
  "repairSymbols": 384,
18
18
  "symbolSize": 1312,
19
+ "interleaveDepthMs": 1000,
19
20
  "repairTrack": "video-repair",
20
21
  "mode": "interleaved"
21
22
  }
@@ -0,0 +1,44 @@
1
+ {
2
+ "version": 1,
3
+ "streamingFormat": "mmtp",
4
+ "streamingFormatVersion": "draft-ramadan-moq-mmt-00",
5
+ "tracks": [
6
+ {
7
+ "name": "video",
8
+ "packaging": "mmtp",
9
+ "codec": "avc1.640028",
10
+ "mmtpMode": "mfu",
11
+ "timescale": 90000,
12
+ "groupDurationMs": 1000,
13
+ "fec": {
14
+ "algorithm": "raptorq",
15
+ "blockProfile": "iso-ssbg1-v1",
16
+ "sourceSymbols": 768,
17
+ "repairSymbols": 384,
18
+ "symbolSize": 1312,
19
+ "interleaveDepthMs": 1000,
20
+ "repairTrack": "video-repair",
21
+ "mode": "interleaved"
22
+ }
23
+ },
24
+ {
25
+ "name": "video-repair",
26
+ "packaging": "fec-repair",
27
+ "priority": 240
28
+ }
29
+ ],
30
+ "multicast": {
31
+ "endpoints": [
32
+ {
33
+ "protocol": "ssm",
34
+ "sourceAddress": "192.0.2.10",
35
+ "groupAddress": "232.1.1.1",
36
+ "port": 5000,
37
+ "tracks": [
38
+ { "name": "video", "packetId": 1 },
39
+ { "name": "video-repair", "packetId": 2 }
40
+ ]
41
+ }
42
+ ]
43
+ }
44
+ }
@@ -10,18 +10,22 @@
10
10
  "mmtpMode": "mfu",
11
11
  "timescale": 90000,
12
12
  "groupDurationMs": 1000,
13
- "fec": {
14
- "algorithm": "raptorq",
15
- "sourceSymbols": 768,
16
- "repairSymbols": 384,
17
- "symbolSize": 1312,
18
- "repairTrack": "video-repair",
19
- "mode": "interleaved"
20
- }
13
+ "fec": [
14
+ {
15
+ "instanceId": 0,
16
+ "scheme": "raptorq",
17
+ "sourceSymbols": 768,
18
+ "repairSymbols": 384,
19
+ "symbolSize": 1312,
20
+ "repairTrack": "video-repair"
21
+ }
22
+ ]
21
23
  },
22
24
  {
23
25
  "name": "video-repair",
24
26
  "packaging": "fec-repair",
27
+ "source": "video",
28
+ "instanceId": 0,
25
29
  "priority": 240
26
30
  }
27
31
  ],
@@ -32,13 +36,22 @@
32
36
  "groupAddress": "232.1.1.1",
33
37
  "port": 5000,
34
38
  "tracks": [
35
- { "name": "video", "packetId": 1 },
36
- { "name": "video-repair", "packetId": 2 }
39
+ {
40
+ "name": "video",
41
+ "packetId": 1
42
+ },
43
+ {
44
+ "name": "video-repair",
45
+ "packetId": 2
46
+ }
37
47
  ]
38
48
  }
39
49
  ],
40
50
  "networkSource": [
41
- { "type": "amt", "discovery": "driad" },
51
+ {
52
+ "type": "amt",
53
+ "discovery": "driad"
54
+ },
42
55
  {
43
56
  "type": "atsc3",
44
57
  "frequency": 587000,
@@ -10,18 +10,23 @@
10
10
  "mmtpMode": "mfu",
11
11
  "timescale": 90000,
12
12
  "groupDurationMs": 1000,
13
- "fec": {
14
- "algorithm": "raptorq",
15
- "blockProfile": "iso-ssbg1-v1",
16
- "sourceSymbols": 32,
17
- "repairSymbols": 8,
18
- "symbolSize": 8,
19
- "repairTrack": "video-repair"
20
- }
13
+ "fec": [
14
+ {
15
+ "instanceId": 0,
16
+ "scheme": "raptorq",
17
+ "blockProfile": "iso-ssbg1-v1",
18
+ "sourceSymbols": 32,
19
+ "repairSymbols": 8,
20
+ "symbolSize": 8,
21
+ "repairTrack": "video-repair"
22
+ }
23
+ ]
21
24
  },
22
25
  {
23
26
  "name": "video-repair",
24
27
  "packaging": "fec-repair",
28
+ "source": "video",
29
+ "instanceId": 0,
25
30
  "priority": 240
26
31
  }
27
32
  ]
@@ -10,18 +10,23 @@
10
10
  "mmtpMode": "mfu",
11
11
  "timescale": 90000,
12
12
  "groupDurationMs": 1000,
13
- "fec": {
14
- "algorithm": "reed-solomon",
15
- "blockProfile": "iso-ssbg1-v1",
16
- "sourceSymbols": 32,
17
- "repairSymbols": 8,
18
- "symbolSize": 13,
19
- "repairTrack": "video-repair"
20
- }
13
+ "fec": [
14
+ {
15
+ "instanceId": 0,
16
+ "scheme": "reed-solomon",
17
+ "blockProfile": "iso-ssbg1-v1",
18
+ "sourceSymbols": 32,
19
+ "repairSymbols": 8,
20
+ "symbolSize": 13,
21
+ "repairTrack": "video-repair"
22
+ }
23
+ ]
21
24
  },
22
25
  {
23
26
  "name": "video-repair",
24
27
  "packaging": "fec-repair",
28
+ "source": "video",
29
+ "instanceId": 0,
25
30
  "priority": 240
26
31
  }
27
32
  ]
@@ -10,20 +10,30 @@
10
10
  "mmtpMode": "mfu",
11
11
  "timescale": 90000,
12
12
  "groupDurationMs": 1000,
13
- "fec": {
14
- "algorithm": "raptorq",
15
- "blockProfile": "iso-ssbg1-v1",
16
- "sourceSymbols": 64,
17
- "repairSymbols": 8,
18
- "symbolSize": 1312,
19
- "repairTrack": "video/repair"
20
- }
13
+ "fec": [
14
+ {
15
+ "instanceId": 0,
16
+ "scheme": "raptorq",
17
+ "blockProfile": "iso-ssbg1-v1",
18
+ "sourceSymbols": 64,
19
+ "repairSymbols": 8,
20
+ "symbolSize": 1312,
21
+ "repairTrack": "video/repair"
22
+ }
23
+ ]
24
+ },
25
+ {
26
+ "name": "video/repair",
27
+ "packaging": "fec-repair",
28
+ "source": "video",
29
+ "instanceId": 0,
30
+ "priority": 240
21
31
  },
22
- { "name": "video/repair", "packaging": "fec-repair", "priority": 240 },
23
32
  {
24
33
  "name": "video/repair/1",
25
34
  "packaging": "fec-repair",
26
- "depends": ["video"],
35
+ "source": "video",
36
+ "instanceId": 0,
27
37
  "repairLayer": 1,
28
38
  "repairSymbols": 16,
29
39
  "priority": 244,
@@ -10,20 +10,30 @@
10
10
  "mmtpMode": "mfu",
11
11
  "timescale": 90000,
12
12
  "groupDurationMs": 1000,
13
- "fec": {
14
- "algorithm": "raptorq",
15
- "blockProfile": "iso-ssbg1-v1",
16
- "sourceSymbols": 64,
17
- "repairSymbols": 8,
18
- "symbolSize": 1312,
19
- "repairTrack": "video/repair"
20
- }
13
+ "fec": [
14
+ {
15
+ "instanceId": 0,
16
+ "scheme": "raptorq",
17
+ "blockProfile": "iso-ssbg1-v1",
18
+ "sourceSymbols": 64,
19
+ "repairSymbols": 8,
20
+ "symbolSize": 1312,
21
+ "repairTrack": "video/repair"
22
+ }
23
+ ]
24
+ },
25
+ {
26
+ "name": "video/repair",
27
+ "packaging": "fec-repair",
28
+ "source": "video",
29
+ "instanceId": 0,
30
+ "priority": 240
21
31
  },
22
- { "name": "video/repair", "packaging": "fec-repair", "priority": 240 },
23
32
  {
24
33
  "name": "video/repair/1",
25
34
  "packaging": "fec-repair",
26
- "depends": ["video"],
35
+ "source": "video",
36
+ "instanceId": 0,
27
37
  "repairLayer": 1,
28
38
  "priority": 244
29
39
  }
@@ -10,33 +10,41 @@
10
10
  "mmtpMode": "mfu",
11
11
  "timescale": 90000,
12
12
  "groupDurationMs": 1000,
13
- "fec": {
14
- "algorithm": "raptorq",
15
- "blockProfile": "iso-ssbg1-v1",
16
- "sourceSymbols": 32,
17
- "repairSymbols": 8,
18
- "symbolSize": 1312,
19
- "repairTrack": "video-repair"
20
- }
13
+ "fec": [
14
+ {
15
+ "instanceId": 0,
16
+ "scheme": "raptorq",
17
+ "blockProfile": "iso-ssbg1-v1",
18
+ "sourceSymbols": 32,
19
+ "repairSymbols": 8,
20
+ "symbolSize": 1312,
21
+ "repairTrack": "video-repair"
22
+ },
23
+ {
24
+ "instanceId": 1,
25
+ "scope": "keyframe",
26
+ "scheme": "raptorq",
27
+ "blockProfile": "iso-ssbg1-v1",
28
+ "sourceSymbols": 0,
29
+ "repairSymbols": 32,
30
+ "symbolSize": 1312,
31
+ "repairTrack": "video/keyframe-repair"
32
+ }
33
+ ]
21
34
  },
22
35
  {
23
36
  "name": "video-repair",
24
37
  "packaging": "fec-repair",
38
+ "source": "video",
39
+ "instanceId": 0,
25
40
  "priority": 240,
26
- "depends": [
27
- "video"
28
- ],
29
41
  "repairLayer": 0
30
42
  },
31
43
  {
32
44
  "name": "video/keyframe-repair",
33
45
  "packaging": "fec-repair",
34
- "depends": [
35
- "video"
36
- ],
37
- "scope": "keyframe",
38
- "sourceSymbols": 0,
39
- "repairSymbols": 32,
46
+ "source": "video",
47
+ "instanceId": 1,
40
48
  "priority": 242
41
49
  }
42
50
  ]
@@ -10,18 +10,23 @@
10
10
  "mmtpMode": "mfu",
11
11
  "timescale": 90000,
12
12
  "groupDurationMs": 1000,
13
- "fec": {
14
- "algorithm": "raptorq",
15
- "blockProfile": "iso-ssbg1-v1",
16
- "sourceSymbols": 32,
17
- "repairSymbols": 0,
18
- "symbolSize": 1312,
19
- "repairTrack": "video-repair"
20
- }
13
+ "fec": [
14
+ {
15
+ "instanceId": 0,
16
+ "scheme": "raptorq",
17
+ "blockProfile": "iso-ssbg1-v1",
18
+ "sourceSymbols": 32,
19
+ "repairSymbols": 0,
20
+ "symbolSize": 1312,
21
+ "repairTrack": "video-repair"
22
+ }
23
+ ]
21
24
  },
22
25
  {
23
26
  "name": "video-repair",
24
27
  "packaging": "fec-repair",
28
+ "source": "video",
29
+ "instanceId": 0,
25
30
  "priority": 240
26
31
  }
27
32
  ]