-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathindex.bs
742 lines (543 loc) · 47.5 KB
/
index.bs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
<pre class='metadata'>
Title: AV1 Codec ISO Media File Format Binding
Status: FD
Text Macro: SPECVERSION v1.3.0
URL: https://aomediacodec.github.io/av1-isobmff/v1.3.0.html
Shortname: av1-isobmff
Editor: Cyril Concolato, Netflix
Editor: Dimitri Podborski, Apple
Editor: Wan-Teh Chang, Google
Abstract: This document specifies the storage format for [[!AV1]] bitstreams in [[!ISOBMFF]] tracks as well as in [[!CMAF]] files.
Date: 2024-04-03
Repository: AOMediaCodec/av1-isobmff
Group: AOM
Test Suite: https://aomediacodec.github.io/av1-isobmff/conformance/
!Previously approved version: <a href="v1.2.0.html">https://aomediacodec.github.io/av1-isobmff/v1.2.0.html</a>
!Latest approved version: <a href="latest-approved.html">https://aomediacodec.github.io/av1-isobmff/latest-approved.html</a>
!Latest draft version: <a href="latest-draft.html">https://aomediacodec.github.io/av1-isobmff/latest-draft.html</a>
Metadata Order: This version, !*, *
</pre>
<pre class="anchors">
url: https://www.iso.org/standard/68960.html#; spec: ISOBMFF; type: dfn;
text: VisualSampleEntry
text: Sample Auxiliary Information
url: https://www.iso.org/standard/68960.html#; spec: ISOBMFF; type: property;
text: bitr
text: clli
text: colr
text: ctts
text: iso6
text: mdcv
text: nclx
text: pasp
text: sgpd
text: stsd
text: saiz
url: https://www.webmproject.org/vp9/mp4/#; spec: VP9; type: property;
text: SmDm
text: CoLL
url: https://tools.ietf.org/html/rfc6381#; spec: RFC6381; type: property;
text: codecs
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=1; spec: AV1; type: dfn;
text: AV1 bitstream
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=39; spec: AV1; type: dfn;
text: OBU
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=40; spec: AV1; type: dfn;
text: OBU Header
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=49; spec: AV1; type: dfn;
text: Frame Header OBU
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=41; spec: AV1; type: dfn;
text: Sequence Header OBU
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=46; spec: AV1; type: dfn;
text: Temporal Delimiter OBU
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=71; spec: AV1; type: dfn;
text: Tile Group OBU
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=71; spec: AV1; type: dfn;
text: Frame OBU
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=121; spec: AV1; type: dfn;
text: Tile List OBU
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=46; spec: AV1; type: dfn;
text: Metadata OBU
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=49; spec: AV1; type: dfn;
text: Redundant Frame Header OBU
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=46; spec: AV1; type: dfn;
text: Padding OBU
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=218; spec: AV1; type: dfn;
text: Random Access Point
text: Delayed Random Access Point
text: Key Frame Dependent Recovery Point
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=13; spec: AV1; type: dfn
text: Inter Frame
text: Intra-only Frame
text: Key Frame
text: Switch Frame
text: Temporal Unit
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=39; spec: AV1; type: dfn
text: Low Overhead Bitstream Format
url: https://www.iso.org/standard/71975.html#; spec: CMAF; type: dfn;
text: CMAF Video Track
text: cmfc
text: cmf2
url: https://www.iso.org/standard/68042.html#; spec: CENC; type: dfn;
text: BytesOfProtectedData
text: BytesOfClearData
text: cbcs
text: cenc
text: cbc1
text: cens
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=45; spec: AV1; type: dfn
text: timing_info
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=44; spec: AV1; type: dfn
text: color_config
url: https://aomediacodec.github.io/av1-spec/av1-spec.pdf#page=2; spec: AV1; type: dfn;
text: buffer_removal_time
text: byte_alignment
text: frame_presentation_time
text: high_bitdepth
text: initial_display_delay_minus_1
text: max_frame_height_minus_1
text: max_frame_width_minus_1
text: mono_chrome
text: obu_has_size_field
text: obu_size
text: open_bitstream_unit
text: seq_level_idx
text: seq_profile
text: seq_tier
text: show_existing_frame
text: show_frame
text: still_picture
text: subsampling_x
text: subsampling_y
text: timing_info_present_flag
text: twelve_bit
</pre>
<pre class='biblio'>
{
"AV1": {
"href": "https://aomediacodec.github.io/av1-spec/av1-spec.pdf",
"title": "AV1 Bitstream & Decoding Process Specification",
"status": "Standard",
"publisher": "AOM"
},
"ISOBMFF": {
"title": "Information technology — Coding of audio-visual objects — Part 12: ISO base media file format",
"status": "Standard",
"publisher": "ISO",
"href": "https://www.iso.org/standard/83102.html"
},
"CMAF": {
"title": "Information technology — Multimedia application format (MPEG-A) — Part 19: Common media application format (CMAF) for segmented media",
"status": "Standard",
"publisher": "ISO",
"href": "https://www.iso.org/standard/71975.html"
},
"CENC": {
"title": "Information technology — MPEG systems technologies — Part 7: Common encryption in ISO base media file format files",
"status": "Standard",
"publisher": "ISO",
"href": "https://www.iso.org/standard/68042.html"
},
"CICP": {
"title": "Coding-independent code points for video signal type identification",
"status": "Standard",
"publisher": "ITU-T",
"href": "https://www.itu.int/rec/T-REC-H.273/en"
}
}
</pre>
Bitstream features overview {#bitstream-overview}
=================================================
An [=AV1 bitstream=] is composed of a sequence of [=OBUs=], grouped into [=Temporal Units=].
OBUs are made of a 1 or 2 bytes header, identifying in particular the type of OBU, followed by an optional length field and by an optional payload, whose presence and content depend on the OBU type. Depending on its type, an OBU can carry configuration information, metadata, or coded video data.
NOTE: [=Tile List OBUs=] defined in the [[!AV1]] specification are not supported in the current version of this specification. A future version of the specification may do so.
Temporal Units are processed by a decoder in the order given by the bitstream. Each Temporal Unit is associated with a presentation time. Some Temporal Units may contain multiple frames to be decoded but only one is presented.
NOTE: The AV1 specification defines scalability features, allowing frames from multiple layers or operating points to be present in a single temporal unit. This version of storage in ISOBMFF supports the simple storage of scalable streams in a single track, but does not specify advanced tools for handling multi-track support, layer extraction, or other scalability related use cases. A future version of the specification may do so.
Frames carried in Temporal Units may have coding dependencies on frames carried previously in the same Temporal Unit or in previous Temporal Units. Frames that can be decoded without dependencies to previous frames are of two categories: [=Key Frames=] and [=Intra-only Frames=]. Frames that cannot be decoded independently are of three categories: [=Inter Frames=], [=Switch Frames=], and frames with a [=show_existing_frame=] flag set to 1.
Key Frames with the [=show_frame=] flag set to 1 have the additional property that after decoding the Key Frame, all frames following the Key Frame in the bitstream can be decoded. They are called [=Random Access Points=] in [[!AV1]].
Key Frames with the [=show_frame=] flag set to 0 are called [=Delayed Random Access Points=]. [=Delayed Random Access Points=] have the additional property that if a future [=Key Frame Dependent Recovery Point=] exists, all frames following that [=Key Frame Dependent Recovery Point=] can be decoded. A [=Key Frame Dependent Recovery Point=] is a frame with [=show_existing_frame=] set to 1 that refers to a previous [=Delayed Random Access Points=].
Basic Encapsulation Scheme {#basic-encapsulation}
=================================================
This section describes the basic data structures used to signal encapsulation of [=AV1 bitstreams=] in [[!ISOBMFF]] containers.
General Requirements & Brands {#brands}
-----------------------------
A file conformant to this specification satisfies the following:
- <assert>It SHALL conform to the normative requirements of [[!ISOBMFF]]</assert>
- <assert>It SHALL have the <dfn value export for="ISOBMFF Brand">av01</dfn> brand among the compatible brands array of the FileTypeBox</assert>
- <assert>It SHALL contain at least one track using an [=AV1SampleEntry=], possibly transformed by encryption as specified in [[#CommonEncryption]]</assert>
- <assert>It SHOULD indicate a structural ISOBMFF brand among the compatible brands array of the FileTypeBox, such as 'iso6'</assert>
- <assert>It MAY indicate CMAF brands as specified in [[#cmaf]]</assert>
- <assert>It MAY indicate other brands not specified in this document provided that the associated requirements do not conflict with those given in this specification</assert>
Parsers SHALL support the structures required by the <code>'iso6'</code> brand and MAY support structures required by further ISOBMFF structural brands.
AV1 Sample Entry {#av1sampleentry-section}
----------------------------------
### Definition ### {#av1sampleentry-definition}
<pre class="def">
Sample Entry Type: <dfn value export for="AV1SampleEntry">av01</dfn>
Container: Sample Description Box ('stsd')
<assert>Mandatory: Yes <span hidden>for av01</span></assert>
<assert>Quantity: One or more <span hidden>for av01</span></assert>
</pre>
### Description ### {#av1sampleentry-description}
The <dfn>AV1SampleEntry</dfn> sample entry identifies that the track contains [=AV1 Samples=], and uses an [=AV1CodecConfigurationBox=].
### Syntax ### {#av1sampleentry-syntax}
```cpp
class AV1SampleEntry
extends VisualSampleEntry('av01')
{
AV1CodecConfigurationBox config;
}
```
### Semantics ### {#av1sampleentry-semantics}
<assert>The <dfn noexport>width</dfn> and <dfn noexport>height</dfn> fields of the [=VisualSampleEntry=] SHALL equal the values of [=max_frame_width_minus_1=] + 1 and [=max_frame_height_minus_1=] + 1 of the [=Sequence Header OBU=] applying to the samples associated with this sample entry.</assert>
Let MaxRenderWidth be the maximum RenderWidth and MaxRenderHeight be the maximum RenderHeight of all the frames in the track.
<assert>The width and height in the TrackHeaderBox SHOULD be equal to MaxRenderWidth and MaxRenderHeight, respectively.</assert>
<assert>Additionally, if MaxRenderWidth and MaxRenderHeight values do not equal respectively the [=max_frame_width_minus_1=] + 1 and [=max_frame_height_minus_1=] + 1 values of the [=Sequence Header OBU=], a PixelAspectRatioBox box SHALL be present in the sample entry and set such that</assert>:
```cpp
hSpacing / vSpacing = MaxRenderWidth * (max_frame_height_minus_1 + 1) /
((max_frame_width_minus_1 + 1) * MaxRenderHeight)
```
The <dfn noexport>compressorname</dfn> field of the [=VisualSampleEntry=] is an informative name. It is formatted in a fixed 32-byte field, with the first byte set to the number of bytes to be displayed, followed by that number of bytes of displayable data, followed by padding to complete 32 bytes total (including the size byte). <assert>The value "\012AOM Coding" is RECOMMENDED</assert>; the first byte is a count of the remaining bytes, here represented by \012, which (being octal 12) is decimal 10, the number of bytes in the rest of the string.
NOTE: Parsers may ignore the value of the compressorname field. It is specified in this document simply for legacy and backwards compatibility reasons.
<assert>The <dfn noexport>config</dfn> field SHALL contain an [=AV1CodecConfigurationBox=] that applies to the samples associated with this sample entry.</assert>
NOTE: <assert>Multiple instances of [=AV1SampleEntry=] may be required when the track contains samples requiring a [=AV1CodecConfigurationBox=] with different characteristics.</assert>
<assert>Optional boxes not specifically mentioned here can be present, in particular those indicated in the definition of the [=VisualSampleEntry=] in [[ISOBMFF]].</assert>
AV1 Codec Configuration Box {#av1codecconfigurationbox-section}
--------------------------------------------------------
### Definition ### {#av1codecconfigurationbox-definition}
<pre class="def">
Box Type: <dfn export>av1C</dfn>
Container: AV1 Sample Entry ('av01')
<assert>Mandatory: Yes <span hidden>for av1C</span></assert>
<assert>Quantity: Exactly One <span hidden>for av1C</span></assert>
</pre>
### Description ### {#av1codecconfigurationbox-description}
<assert>The <dfn>AV1CodecConfigurationBox</dfn> contains decoder configuration information that SHALL be valid for every sample that references the sample entry.</assert>
### Syntax ### {#av1codecconfigurationbox-syntax}
```cpp
class AV1CodecConfigurationBox
extends Box('av1C')
{
AV1CodecConfigurationRecord av1Config;
}
aligned(8) class AV1CodecConfigurationRecord
{
unsigned int(1) marker = 1;
unsigned int(7) version = 1;
unsigned int(3) seq_profile;
unsigned int(5) seq_level_idx_0;
unsigned int(1) seq_tier_0;
unsigned int(1) high_bitdepth;
unsigned int(1) twelve_bit;
unsigned int(1) monochrome;
unsigned int(1) chroma_subsampling_x;
unsigned int(1) chroma_subsampling_y;
unsigned int(2) chroma_sample_position;
unsigned int(3) reserved = 0;
unsigned int(1) initial_presentation_delay_present;
if(initial_presentation_delay_present) {
unsigned int(4) initial_presentation_delay_minus_one;
} else {
unsigned int(4) reserved = 0;
}
unsigned int(8) configOBUs[];
}
```
### Semantics ### {#av1codecconfigurationbox-semantics}
<assert>The <dfn export>marker</dfn> field SHALL be set to 1.</assert>
NOTE: The marker bit ensures that the bit pattern of the first byte of the AV1CodecConfigurationRecord cannot be mistaken for an [=OBU Header=] byte.
The <dfn noexport>version</dfn> field indicates the version of the AV1CodecConfigurationRecord. <assert>The value SHALL be set to 1 for AV1CodecConfigurationRecord</assert>.
<assert>The <dfn export>seq_profile</dfn> field indicates the AV1 profile and SHALL be equal to the seq_profile value from the [=Sequence Header OBU=].</assert>
<assert>The <dfn export>seq_level_idx_0</dfn> field SHALL be equal to the value of seq_level_idx[0] from the [=Sequence Header OBU=]</assert>.
<assert>The <dfn export>seq_tier_0</dfn> field SHALL be equal to the value of seq_tier[0] from the [=Sequence Header OBU=]</assert>.
<assert>The <dfn export>high_bitdepth</dfn> field SHALL be equal to the value of high_bitdepth flag from the [=Sequence Header OBU=].</assert>
<assert>The <dfn export>twelve_bit</dfn> field SHALL be equal to the value of the twelve_bit flag from the [=Sequence Header OBU=].</assert> <assert>When twelve_bit is not present in the [=Sequence Header OBU=] the AV1CodecConfigurationRecord twelve_bit value SHALL be 0.</assert>
<assert>The <dfn export>monochrome</dfn> field SHALL be equal to the value of the [=mono_chrome=] flag from the [=Sequence Header OBU=].</assert>
<assert>The <dfn export>chroma_subsampling_x</dfn> field SHALL be equal to the value of the [=subsampling_x=] value from the [=Sequence Header OBU=].</assert>
<assert>The <dfn export>chroma_subsampling_y</dfn> field SHALL be equal to the value of the [=subsampling_y=] value from the [=Sequence Header OBU=].</assert>
<assert>The <dfn export>chroma_sample_position</dfn> field SHALL be equal to the value of the [=chroma_sample_position=] value from the [=Sequence Header OBU=].</assert>
<assert>When not specified in the [=Sequence Header OBU=], and not defined by the conditions specified in the [[!AV1]] [=color_config=], the values of [=chroma_subsampling_x=], [=chroma_subsampling_y=], and [=chroma_sample_position=] SHALL be 0.</assert>
The <dfn export>initial_presentation_delay_present</dfn> field indicates the presence of the initial_presentation_delay_minus_one field.
The <dfn>initial_presentation_delay_minus_one</dfn> field indicates the number of samples (minus one) that need to be decoded prior to starting the presentation of the first sample associated with this sample entry in order to guarantee that each sample will be decoded prior to its presentation time under the constraints of the first level value indicated by [=seq_level_idx=] in the [=Sequence Header OBU=] (in the configOBUs field or in the associated samples). More precisely, <assert>the following procedure SHALL not return any error</assert>:
- construct a hypothetical bitstream consisting of the OBUs carried in the sample entry followed by the OBUs carried in all the samples referring to that sample entry,
- set the first [=initial_display_delay_minus_1=] field of each [=Sequence Header OBU=] to the number of frames minus one contained in the first [=initial_presentation_delay_minus_one=] + 1 samples,
- set the [=frame_presentation_time=] field of the frame header of each presentable frame such that it matches the presentation time difference between the sample carrying this frame and the previous sample (if it exists, 0 otherwise),
- apply the decoder model specified in [[!AV1]] to this hypothetical bitstream using the first operating point. If <code>buffer_removal_time</code> information is present in bitstream for this operating point, the decoding schedule mode SHALL be applied, otherwise the resource availability mode SHALL be applied.
NOTE: With the above procedure, when smooth presentation can be guaranteed after decoding the first sample, initial_presentation_delay_minus_one is 0.
NOTE: Because the above procedure considers all OBUs in all samples associated with a sample entry, if these OBUS form multiple coded video sequences which would have different values of <code>initial_presentation_delay_minus_one</code> if considered separately, the sample entry would signal the larger value.
<div class=example>
The difference between [=initial_presentation_delay_minus_one=] and [=initial_display_delay_minus_1=] can be illustrated by considering the following example:
```
a b c d e f g h
```
where letters correspond to frames. Assume that <code>[=initial_display_delay_minus_1=]</code> is 2, i.e. that once frame <code>c</code> has been decoded, all other frames in the bitstream can be presented on time. If those frames were grouped into temporal units and samples as follows:
```
[a] [b c d] [e] [f] [g] [h]
```
<code>[=initial_presentation_delay_minus_one=]</code> would be 1 because it takes presentation of 2 samples to ensure that <code>c</code> is decoded.
But if the frames were grouped as follows:
```
[a] [b] [c] [d e f] [g] [h]
```
<code>[=initial_presentation_delay_minus_one=]</code> would be 2 because it takes presentation of 3 samples to ensure that <code>c</code> is decoded.
</div>
<assert>The <dfn export>configOBUs</dfn> field contains zero or more OBUs</assert>. Any OBU may be present provided that the following procedures produce compliant AV1 bitstreams:
- <assert>From any sync sample, an AV1 bitstream is formed by first outputting the OBUs contained in the [=AV1CodecConfigurationBox=] and then by outputing all OBUs in the samples themselves, in order, starting from the sync sample.</assert>
NOTE: If a [=Sequence Header OBU=] is stored in the [=configOBUs=] field, because a sync sample also stores the [=Sequence Header OBU=], this procedure will produce 2 consecutive and identical [=Sequence Header OBUs=]. Compliant [[AV1]] decoders are expected to handle that.
- <assert>From any sample marked with the [=AV1ForwardKeyFrameSampleGroupEntry=], an AV1 bitstream is formed by first outputting the OBUs contained in the [=AV1CodecConfigurationBox=] and then by outputing all OBUs in the sample itself, then by outputting all OBUs in the samples, in order, starting from the sample at the distance indicated by the sample group.</assert>
Additionally, <assert>the configOBUs field SHALL contain at most one [=Sequence Header OBU=]</assert> and if present, <assert>it SHALL be the first OBU</assert>.
NOTE: The configOBUs field is expected to contain only one [=Sequence Header OBU=] and zero or more [=Metadata OBUs=] when applicable to all the associated samples.
OBUs stored in the configOBUs field follow the [=open_bitstream_unit=] [=Low Overhead Bitstream Format=] syntax as specified in [[!AV1]]. <assert>The flag [=obu_has_size_field=] SHALL be set to 1, indicating that the size of the OBU payload follows the header, and that it is coded using LEB128</assert>.
<assert>When a [=Sequence Header OBU=] is contained within the configOBUs of the AV1CodecConfigurationRecord, the values present in the [=Sequence Header OBU=] contained within configOBUs SHALL match the values of the AV1CodecConfigurationRecord.</assert>
<assert>When the samples associated with a sample entry do not contain any sync sample, a [=Sequence Header OBU=] SHALL be present in the [=configOBUs=] field of the AV1CodecConfigurationRecord of that sample entry.</assert>
The presentation times of AV1 samples are given by the ISOBMFF structures. <assert>The [=timing_info_present_flag=] in the [=Sequence Header OBU=] (in the configOBUs field or in the associated samples) SHOULD be set to 0</assert>. <assert>If set to 1, the [=timing_info=] structure of the [=Sequence Header OBU=], the [=frame_presentation_time=] and [=buffer_removal_time=] fields of the [=Frame Header OBUs=], if present, SHALL be ignored for the purpose of timed processing of the ISOBMFF file.</assert>
<assert>The sample entry SHOULD contain a 'colr' box with a colour_type set to 'nclx'</assert>. If a 'colr' box with a colour_type set to 'nclx' is present, the following applies:
- <assert>If any of colour_primaries, transfer_characteristics, and matrix_coefficients is specified with a value other than 2 in the [=Sequence Header OBU=] (in the configOBUs field or in the associated samples), then the value of that field in the 'colr' box SHALL match the value in the [=Sequence Header OBU=].</assert>
- <assert>If any of colour_primaries, transfer_characteristics, and matrix_coefficients is NOT specified or is specified with a value equal to 2 in the [=Sequence Header OBU=], then the value of that field in the 'colr' box MAY be different and the value in the 'colr' box overrides the value in the bitstream, as specified in the ColourInformationBox definition in ISOBMFF.</assert>
- <assert>The value of full_range_flag in the 'colr' box SHALL match the color_range flag in the [=Sequence Header OBU=].</assert>
<assert>When configOBUs does not contain a [=Sequence Header OBU=], a 'colr' box with a colour_type set to 'nclx' SHALL be present.</assert>
For sample entries corresponding to HDR content, the following applies:
- <assert>The ContentLightLevelBox 'clli' SHOULD be present</assert>. <assert>Its values SHALL equal the values contained in the [=Metadata OBU=] of type METADATA_TYPE_HDR_CLL, if present (in the configOBUs or in the samples)</assert>.
- <assert>The MasteringDisplayColourVolumeBox 'mdcv' SHOULD be present</assert>. <assert>Its decoded values SHALL equal (except for precision issues, see the second note below) the decoded values contained in the [=Metadata OBU=] of type METADATA_TYPE_HDR_MDCV, if present (in the configOBUs or in the samples)</assert>.
NOTE: The MasteringDisplayColourVolumeBox 'mdcv' and ContentLightLevelBox 'clli' have identical syntax to the SMPTE2086MasteringDisplayMetadataBox 'SmDm' and ContentLightLevelBox 'CoLL', except that they are of type <code>Box</code> and not <code>FullBox</code>. However, the semantics of the MasteringDisplayColourVolumeBox and SMPTE2086MasteringDisplayMetadataBox have important differences and SHOULD not be confused.
NOTE: In the MasteringDisplayColourVolumeBox 'mdcv', the representation and coding of some fields are different from the representation and coding of the corresponding fields in the [=Metadata OBU=] of type METADATA_TYPE_HDR_MDCV. Because of these differences, some values coded in the MasteringDisplayColourVolumeBox 'mdcv' may not have the same precision in the [=Metadata OBU=] of type METADATA_TYPE_HDR_MDCV, and vice versa.
<assert>Additional boxes may be provided at the end of the [=VisualSampleEntry=] as permitted by ISOBMFF, that may represent redundant or similar information to the one provided in some OBUs contained in the [=AV1CodecConfigurationBox=]</assert>. If the box definition does not indicate that its information overrides the OBU information, in case of conflict, the OBU information SHOULD be considered authoritative.
AV1 Sample Format {#sampleformat}
---------------------------------
For tracks using the [=AV1SampleEntry=], an <dfn>AV1 Sample</dfn> has the following constraints:
- <assert>the sample data SHALL be a sequence of [=OBUs=] forming a [=Temporal Unit=]</assert>,
- <assert>each OBU SHALL follow the [=open_bitstream_unit=] [=Low Overhead Bitstream Format=] syntax as specified in [[!AV1]]</assert>. <assert>Each OBU SHALL have the [=obu_has_size_field=] set to 1 except for the last OBU in the sample</assert>, for which <assert>[=obu_has_size_field=] MAY be set to 0, in which case it is assumed to fill the remainder of the sample</assert>,
NOTE: <assert>When extracting OBUs from an ISOBMFF file, and depending on the capabilities of the decoder processing these OBUs, ISOBMFF parsers MAY need to either: set the [=obu_has_size_field=] to 1 for some OBUs if not already set, add the size field in this case, and add [=Temporal Delimiter OBU=]; or use the length-delimited bitstream format as defined in Annex B of [=AV1=].</assert> <assert>If encryption is used, similar operations MAY have to be done before or after decryption depending on the demuxer/decryptor/decoder architecture.</assert>
- <assert>OBU trailing bits SHOULD be limited to byte alignment and SHOULD not be used for padding</assert>,
- <assert>OBUs of type OBU_TEMPORAL_DELIMITER, OBU_PADDING, or OBU_REDUNDANT_FRAME_HEADER SHOULD NOT be used</assert>.
- <assert>OBUs of type OBU_TILE_LIST SHALL NOT be used</assert>.
<assert>If an AV1 Sample is signaled as a sync sample (in the SyncSampleBox or by setting sample_is_non_sync_sample to 0), it SHALL be a Random Access Point as defined in [[!AV1]]</assert>, i.e. satisfy the following constraints:
- Its first frame is a [=Key Frame=] that has [=show_frame=] flag set to 1,
- It contains a [=Sequence Header OBU=] before the first [=Frame Header OBU=].
NOTE: Within this definition, a sync sample may contain additional frames that are not Key Frames. The fact that none of them is the first frame in the temporal unit ensures that they are decodable.
NOTE: Other types of OBUs such as [=metadata OBUs=] could be present before the [=Sequence Header OBU=].
<assert>[=Intra-only frames=] SHOULD be signaled using the sample_depends_on flag set to 2</assert>.
<assert>[=Delayed Random Access Points=] SHOULD be signaled using sample groups and the [=AV1ForwardKeyFrameSampleGroupEntry=]</assert>.
<assert>[=Switch Frames=] SHOULD be signaled using sample groups and the [=AV1SwitchFrameSampleGroupEntry=]</assert>.
Additionally, <assert>if a file contains multiple tracks that are alternative representations of the same content, in particular using [=Switch Frames=], those tracks SHOULD be marked as belonging to the same alternate group</assert> and <assert>SHOULD use a track selection box with an appropriate attribute (e.g. 'bitr')</assert>.
<assert>In tracks using the [=AV1SampleEntry=], the 'ctts' box and composition offsets in movie fragments SHALL NOT be used</assert>. Similarly, <assert>the is_leading flag, if used, SHALL be set to 0 or 2</assert>.
<assert>When a temporal unit contains more than one frame, the sample corresponding to that temporal unit MAY be marked using the [=AV1MultiFrameSampleGroupEntry=]</assert>.
<assert>[=Metadata OBUs=] may be carried in sample data</assert>. In this case, <assert>the [=AV1MetadataSampleGroupEntry=] SHOULD be used</assert>. <assert>If the [=metadata OBUs=] are static for the entire set of samples associated with a given sample description entry, they SHOULD also be in the OBU array in the sample description entry</assert>.
Unless explicitely stated, the grouping_type_parameter is not defined for the SampleToGroupBox with grouping types defined in this specification.
AV1 Forward Key Frame sample group entry {#forwardkeyframesamplegroupentry}
----------------------------------------------------------------
### Definition ### {#forwardkeyframesamplegroupentry-definition}
<pre class="def">
Group Type: <dfn export>av1f</dfn>
Container: Sample Group Description Box ('sgpd')
<assert>Mandatory: No <span hidden>for av1f</span></assert>
<assert>Quantity: Zero or more <span hidden>for av1f</span></assert>.
</pre>
### Description ### {#forwardkeyframesamplegroupentry-description}
The <dfn>AV1ForwardKeyFrameSampleGroupEntry</dfn> documents samples that contain a [=Delayed Random Access Point=] that are followed at a given distance in the bitstream by a [=Key Frame Dependent Recovery Point=].
### Syntax ### {#forwardkeyframesamplegroupentry-syntax}
```cpp
class AV1ForwardKeyFrameSampleGroupEntry
extends VisualSampleGroupEntry('av1f')
{
unsigned int(8) fwd_distance;
}
```
### Semantics ### {#forwardkeyframesamplegroupentry-semantics}
The <dfn export>fwd_distance</dfn> field indicates the number of samples between this sample and the next sample containing the associated [=Key Frame Dependent Recovery Point=]. 0 means the next sample.
AV1 Multi-Frame sample group entry {#multiframesamplegroupentry}
----------------------------------------------------------------
### Definition ### {#multiframesamplegroupentry-definition}
<pre class="def">
Group Type: <dfn value export for="AV1MultiFrameSampleGroupEntry">av1m</dfn>
Container: Sample Group Description Box ('sgpd')
<assert>Mandatory: No <span hidden>for av1m</span></assert>
<assert>Quantity: Zero or more <span hidden>for av1m</span></assert>.
</pre>
### Description ### {#multiframesamplegroupentry-description}
The <dfn>AV1MultiFrameSampleGroupEntry</dfn> documents samples that contain multiple frames.
### Syntax ### {#multiframesamplegroupentry-syntax}
```cpp
class AV1MultiFrameSampleGroupEntry
extends VisualSampleGroupEntry('av1m')
{
}
```
AV1 Switch Frame sample group entry {#switchframesamplegroupentry}
-------------------------------------------------------
### Definition ### {#switchframesamplegroupentry-definition}
<pre class="def">
Group Type: <dfn export>av1s</dfn>
Container: Sample Group Description Box ('sgpd')
<assert>Mandatory: No <span hidden>for av1s</span></assert>
<assert>Quantity: Zero or more <span hidden>for av1s</span></assert>.
</pre>
### Description ### {#switchframesamplegroupentry-description}
The <dfn>AV1SwitchFrameSampleGroupEntry</dfn> documents samples that start with a [=Switch Frame=].
### Syntax ### {#switchframesamplegroupentry-syntax}
```cpp
class AV1SwitchFrameSampleGroupEntry
extends VisualSampleGroupEntry('av1s')
{
}
```
AV1 Metadata sample group entry {#metadatasamplegroupentry}
-----------------------------------------------------------
### Definition ### {#metadatasamplegroupentry-definition}
<pre class="def">
Group Type: <dfn value noexport for="AV1MetadataSampleGroupEntry">av1M</dfn>
Container: Sample Group Description Box ('sgpd')
<assert>Mandatory: No <span hidden>for av1M</span></assert>
<assert>Quantity: Zero or more <span hidden>for av1M</span></assert>.
</pre>
### Description ### {#metadatasamplegroupentry-description}
The <dfn>AV1MetadataSampleGroupEntry</dfn> documents samples that contain [=metadata OBUs=]. The <code>grouping_type_parameter</code> can be used to identify samples containing [=metadata OBUs=] of a given type. If no <code>grouping_type_parameter</code> is provided, the sample group entry identifies samples containing [=metadata OBUs=] for which the <code>metadata_type</code> is unknown.
### Syntax ### {#metadatasamplegroupentry-syntax}
```cpp
class AV1MetadataSampleGroupEntry
extends VisualSampleGroupEntry('av1M')
{
}
```
For this sample group entry, the <code>grouping_type_parameter</code> syntax is as follows:
```cpp
{
unsigned int (8) metadata_type;
unsigned int (24) metadata_specific_parameters;
}
```
### Semantics ### {#metadatasamplegroupentry-semantics}
<dfn export>metadata_type</dfn> is a 8-bit field whose value is the value of the metadata_type field defined in [[!AV1]], when it is equal or lower than 255. metadata_type values above 255 are not supported by this sample group.
<dfn export>metadata_specific_parameters</dfn> provides an additional part of the <code>grouping_type_parameter</code>, which MAY be used to distinguish different sample groups having the same <code>metadata_type</code> but different sub-parameters. <assert>In this version of the specification, <code>metadata_specific_parameters</code> is only defined when <code>metadata_type</code> is set to <code>METADATA_TYPE_ITUT_T35</code> in which case its value SHALL be set to the first 24 bits of the <code>metadata_itut_t35</code> structure.</assert> <assert>For other types of metadata, its value SHOULD be set to 0. In all cases, when the <code>grouping_type_parameter</code> is used, readers processing sample groups SHALL use the entire value of <code>grouping_type_parameter</code></assert>.
NOTE: The current design is constrained to using only 3 bytes for ITU-T T.35 identification, which typically suffices for the itu_t_t35_country_code and the itu_t_t35_terminal_provider_code identification. Consequently, inspection of the payload becomes essential if an implementation aims to determine the values of subsequent bytes, for instance, the itu_t_t35_terminal_provider_oriented_code.
CMAF AV1 track format {#cmaf}
=====================================================
[[CMAF]] defines structural constraints on ISOBMFF files additional to [[ISOBMFF]] for the purpose of, for example, adaptive streaming or for protected files. Conformance to these structural constraints is signaled by the presence of the brands <code>[=cmfc=]</code> or <code>[=cmf2=]</code> in the <code>FileTypeBox</code>.
NOTE: It is important to note that while the <code>[=cmf2=]</code> brand does not introduce any new requirements compared to the previously defined <code>[=cmfc=]</code> brand, it further restricts the <code>[=cmfc=]</code> constraints.
For compatibility reasons, when the <code>[=cmf2=]</code> brand is used, the <code>[=cmfc=]</code> brand SHOULD also be included in the <code>FileTypeBox</code>.
If a [=CMAF Video Track=] uses the brand <code>av01</code>, it is called a <dfn>CMAF AV1 Track</dfn> and the following constraints, defining the CMAF Media Profile for AV1, apply:
- <assert>it SHALL use an [=AV1SampleEntry=], possibly transformed by encryption as specified in [[#CommonEncryption]]</assert>
- <assert>it MAY use multiple sample entries, and in that case the following values SHALL not change in the track</assert>:
- <code>seq_profile</code>
- <code>still_picture</code>
- the first value of <code>seq_level_idx</code>
- the first value of <code>seq_tier</code>
- <code>color_config</code>
- <code>initial_presentation_delay_minus_one</code>
<assert>When protected, [=CMAF AV1 Tracks=] SHALL use the signaling defined in [[!CMAF]], which in turn relies on [[!CENC]], with the provisions specified in [[#CommonEncryption]]</assert>.
Common Encryption {#CommonEncryption}
=========================
<assert>[=CMAF AV1 Tracks=] and non-segmented AV1 files MAY be protected</assert>. <assert>If protected, they SHALL conform to [[!CENC]]</assert>. <assert>Files SHOULD be protected using the <code>[=cbcs=]</code> protection scheme</assert> and <assert>MAY be protected using the <code>[=cenc=]</code> protection scheme</assert>.
<assert>When the protected scheme <code>[=cenc=]</code> is used, samples SHALL be protected using subsample encryption</assert> and <assert>SHALL NOT use pattern encryption</assert>.
<assert>When the protected scheme <code>[=cbcs=]</code> is used, samples SHALL be protected using subsample encryption</assert> and <assert>SHALL use pattern encryption</assert>. [[!CENC]] recommends that the Block Pattern length be 10, i.e. <code>crypt_byte_block + skip_byte_block = 10</code>, where a Block is of size 16-bytes. In this specification, the combination of <code>crypt_byte_block</code> and <code>skip_byte_block</code> SHALL be one of the following, with the first one being recommended:
- <assert><code>crypt_byte_block = 1</code> and <code>skip_byte_block = 9</code></assert>,
- <assert><code>crypt_byte_block = 5</code> and <code>skip_byte_block = 5</code></assert>,
- <assert><code>crypt_byte_block = 10</code> and <code>skip_byte_block = 0</code></assert>.
General Subsample Encryption constraints {#subsample-encryption}
--------------------------------------
Within protected samples, the following constraints apply:
- <assert>Protected samples SHALL be exactly spanned by one or more contiguous subsamples</assert>.
- <assert>An OBU MAY be spanned by one or more subsamples</assert>, especially when it has multiple ranges of protected data. However, as recommended in [[!CENC]], subsample encryption entries SHOULD be as compactly represented as possible. For example, only one subsample encryption entry should be created for multiple consecutive unprotected OBUs as well as the first unprotected and protected parts of the following protected OBU, if such protected OBU exists.
- <assert>A large unprotected OBU whose data size is larger than the maximum size of a single [=BytesOfClearData=] field MAY be spanned by multiple subsamples with zero size [=BytesOfProtectedData=]</assert>.
- <assert>All [=OBU Headers=] and associated [=obu_size=] fields SHALL be unprotected</assert>.
- <assert>[=Temporal Delimiter OBUs=], [=Sequence Header OBUs=], and [=Frame Header OBUs=] (including within a [=Frame OBU=]), [=Redundant Frame Header OBUs=] and [=Padding OBUs=] SHALL be unprotected</assert>.
- <assert>[=Metadata OBUs=] SHALL NOT be protected</assert>.
- <assert>[=Tile Group OBUs=] and [=Frame OBUs=] SHALL be protected</assert>. Within [=Tile Group OBUs=] or [=Frame OBUs=], the following applies:
- for the protected scheme <code>[=cbcs=]</code>:
- <assert>[=BytesOfProtectedData=] SHALL start on the first byte and end on the last byte of the <code>decode_tile</code> structure (including any trailing bits)</assert>.
NOTE: As a result of the above, [=BytesOfProtectedData=] is not necessarily a multiple of 16 bytes and partial blocks are included in the [=BytesOfProtectedData=] range, but per [[!CENC]] the data is not be encrypted.
- <assert>A subsample SHALL be created for each tile, even if its size is less than 16 bytes</assert>.
- <assert>All other parts of [=Tile Group OBUs=] and [=Frame OBUs=] SHALL be unprotected <span hidden>for cbcs</span></assert>.
- for the protected scheme <code>[=cenc=]</code>:
- <assert>[=BytesOfProtectedData=] SHALL be a multiple of 16 bytes</assert>.
- <assert>[=BytesOfProtectedData=] SHALL end on the last byte of the <code>decode_tile</code> structure (including any trailing bits)</assert>.
- <assert>[=BytesOfProtectedData=] SHALL span all complete 16-byte blocks of the <code>decode_tile</code> structure (including any trailing bits)</assert>.
NOTE: As a result of the above, partial blocks are not used and it is possible that [=BytesOfProtectedData=] does not start at the first byte of the <code>decode_tile</code> structure, but some number of bytes following that.
- <assert>A subsample SHALL be created for each tile that has a <code>decode_tile</code> structure whose size (including any trailing bits) is larger or equal to 16 bytes</assert>. <assert>If it is less than 16 bytes, per the rules above, the <code>decode_tile</code> structure is not encrypted and the corresponding bytes SHOULD be included in the [=BytesOfClearData=] field of a surrounding subsample, if any</assert>.
- <assert>All other parts of [=Tile Group OBUs=] and [=Frame OBUs=] SHALL be unprotected <span hidden>for cenc</span></assert>.
NOTE: Version 0 of the 'saiz' box as defined in [[ISOBMFF]] can only describe [=Sample Auxiliary Information=] whose size does not exceed 255 bytes. In the case of AV1 streams that use a large number of tiles or a large number of frames per sample, when following the encryption requirements defined in this section the size of the corresponding Sample Auxiliary Information may exceed that limit. Until updates are made to [[ISOBMFF]], authors are encouraged to avoid reaching the limit.
Subsample Encryption Illustration {#subsample-encryption-illustration}
------------------
Figure #1 illustrates Subsample based encryption of AV1.
<figure>
<img alt="Subsample-based AV1 encryption" src="images/subsample_encryption.svg">
<figcaption>Subsample-based AV1 encryption.</figcaption>
</figure>
Codecs Parameter String {#codecsparam}
======================================
DASH and other applications require defined values for the 'Codecs' parameter specified in [[!RFC6381]] for ISO Media tracks. The codecs parameter string for the AOM AV1 codec is as follows:
```
<sample entry 4CC>.<profile>.<level><tier>.<bitDepth>.<monochrome>.<chromaSubsampling>.
<colorPrimaries>.<transferCharacteristics>.<matrixCoefficients>.<videoFullRangeFlag>
```
All fields following the sample entry 4CC are expressed as double digit decimals, unless indicated otherwise. Leading or trailing zeros cannot be omitted.
<assert>The profile parameter value, represented by a single digit decimal, SHALL equal the value of seq_profile in the [=Sequence Header OBU=]</assert>.
<assert>The level parameter value SHALL equal the first level value indicated by [=seq_level_idx=] in the [=Sequence Header OBU=]</assert>.
<assert>The tier parameter value SHALL be equal to <code>M</code> when the first [=seq_tier=] value in the [=Sequence Header OBU=] is equal to 0, and <code>H</code> when it is equal to 1</assert>.
<assert>The bitDepth parameter value SHALL equal the value of BitDepth variable as defined in [[AV1]] derived from the [=Sequence Header OBU=]</assert>.
<assert>The monochrome parameter value, represented by a single digit decimal, SHALL equal the value of mono_chrome in the [=Sequence Header OBU=]</assert>.
<assert>The chromaSubsampling parameter value, represented by a three-digit decimal, SHALL have its first digit equal to subsampling_x and its second digit equal to subsampling_y</assert>. <assert>If both subsampling_x and subsampling_y are set to 1, then the third digit SHALL be equal to chroma_sample_position, otherwise it SHALL be set to 0</assert>.
The colorPrimaries, transferCharacteristics, matrixCoefficients, and videoFullRangeFlag parameter values are set as follows:
- <assert>If a 'colr' box with colour_type set to 'nclx' is present, the colorPrimaries, transferCharacteristics, matrixCoefficients, and videoFullRangeFlag parameter values SHALL equal the values of matching fields in the 'colr' box</assert>.
- Otherwise, a 'colr' box with colour_type set to 'nclx' is absent.
- <assert>The videoFullRangeFlag parameter value SHALL equal the color_range flag in the [=Sequence Header OBU=]</assert>.
- <assert>If the color_description_present_flag is set to 1 in the [=Sequence Header OBU=], the colorPrimaries, transferCharacteristics, and matrixCoefficients parameter values SHALL equal the values of matching fields in the [=Sequence Header OBU=]</assert>.
- Otherwise, the color_description_present_flag is set to 0 in the [=Sequence Header OBU=]. <assert>The colorPrimaries, transferCharacteristics, and matrixCoefficients parameter values SHOULD be set to the default values below</assert>.
NOTE: It is encouraged that a 'colr' box be present. The 'colr' box simplifies the task of the codecs parameter generator.
NOTE: If the encoded video uses a color space that is not registered in [[CICP]] and the file doesn't explicitly code 2/2/2 either in the 'colr' box or in the [=Sequence Header OBU=] (with color_description_present_flag set to 1), the derived codecs parameter string will declare ITU-R BT.709 (1/1/1). To avoid this behavior, a 'colr' box should be used.
The videoFullRangeFlag is represented by a single digit.
<assert>If the codecs parameter string ends with ".0.110.01.01.01.0" (containing all the default values below), that trailing part of the string SHOULD be omitted</assert>.
For example, codecs="av01.0.04M.10.0.112.09.16.09.0" represents AV1 Main Profile, level 3.0, Main tier, 10-bit content, non-monochrome, with 4:2:0 chroma subsampling co-located with (0, 0) luma sample, ITU-R BT.2100 color primaries, ITU-R BT.2100 PQ transfer characteristics, ITU-R BT.2100 YCbCr color matrix, and studio swing representation.
<assert>The parameters sample entry 4CC, profile, level, tier, and bitDepth are all mandatory fields</assert>. If any of these fields are empty, or not within their allowed range, the processing device SHOULD treat it as an error.
<assert>All the other fields (including their leading '.') are optional, mutually inclusive (all or none) fields</assert>. If not specified then the values listed in the table below are assumed.
<table class="def">
<tr>
<td>mono_chrome</td><td>0</td>
</tr>
<tr>
<td>chromaSubsampling</td><td>110 (4:2:0)</td>
</tr>
<tr>
<td>colorPrimaries</td><td>01 (ITU-R BT.709)</td>
</tr>
<tr>
<td>transferCharacteristics</td><td>01 (ITU-R BT.709)</td>
</tr>
<tr>
<td>matrixCoefficients</td><td>01 (ITU-R BT.709)</td>
</tr>
<tr>
<td>videoFullRangeFlag</td><td>0 (studio swing representation)</td>
</tr>
</table>
The string codecs="av01.0.01M.08" in this case would represent AV1 Main Profile, level 2.1, Main tier, 8-bit content with 4:2:0 chroma subsampling, ITU-R BT.709 color primaries, transfer characteristics, matrix coefficients, and studio swing representation.
If any character that is not '.', digits, part of the AV1 4CC, or a tier value is encountered, the string SHALL be interpreted ignoring all the characters starting from that character.
Changes since v1.2.0 release {#changelist}
==========================================
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/142">Clarify the color info in the codecs string.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/151">Update encryption diagram.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/152">Remove clap restriction.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/153">Clarify compactness and encryption.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/156">Add a NOTE to clarify the mdcv box.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/162">Clarify requirements on sample entry when encryption is used.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/167">Clarify the colr box.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/170">Update the CMAF section to mention the cmf2 brand.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/171">Make assert-id's unique and add them to the previous version.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/174">Correct the page numbers in links to the AV1 spec.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/175">Shorten long lines</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/181">Add a note on the identification of the T.35 message.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/182">Clarify storage of Sequence Header OBU.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/183">Use undated reference for ISOBMFF.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/195">Add note for encryption description limit.</a>
- <a href="https://github.com/AOMediaCodec/av1-isobmff/pull/198">Add a link to the conformance page.</a>
<script>
if (window.location.hash) {
const highlight_span = document.querySelector(window.location.hash);
if (highlight_span) {
highlight_span.parentNode.style.backgroundColor = "#F4EA565A";
setTimeout(() => {
highlight_span.parentNode.style.backgroundColor = "";
}, 5000);
}
}
</script>