Shaka Packager SDK
Loading...
Searching...
No Matches
box_definitions.h
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef PACKAGER_MEDIA_FORMATS_MP4_BOX_DEFINITIONS_H_
6#define PACKAGER_MEDIA_FORMATS_MP4_BOX_DEFINITIONS_H_
7
8#include <cstddef>
9#include <cstdint>
10#include <string>
11#include <vector>
12
13#include <packager/media/base/decrypt_config.h>
14#include <packager/media/base/fourccs.h>
15#include <packager/media/codecs/aac_audio_specific_config.h>
16#include <packager/media/codecs/es_descriptor.h>
17#include <packager/media/formats/mp4/box.h>
18
19namespace shaka {
20namespace media {
21
22class BufferReader;
23
24namespace mp4 {
25
26enum TrackType {
27 kInvalid = 0,
28 kVideo,
29 kAudio,
30 kHint,
31 kText,
32 kSubtitle,
33};
34
35class BoxBuffer;
36
37#define DECLARE_BOX_METHODS(T) \
38 public: \
39 T(); \
40 ~T() override; \
41 \
42 FourCC BoxType() const override; \
43 \
44 private: \
45 bool ReadWriteInternal(BoxBuffer* buffer) override; \
46 size_t ComputeSizeInternal() override; \
47 \
48 public:
49
50struct FileType : Box {
51 DECLARE_BOX_METHODS(FileType);
52
53 FourCC major_brand = FOURCC_NULL;
54 uint32_t minor_version = 0;
55 std::vector<FourCC> compatible_brands;
56};
57
59 FourCC BoxType() const override;
60};
61
63 DECLARE_BOX_METHODS(ProtectionSystemSpecificHeader);
64
65 std::vector<uint8_t> raw_box;
66};
67
69 DECLARE_BOX_METHODS(SampleAuxiliaryInformationOffset);
70
71 std::vector<uint64_t> offsets;
72};
73
75 DECLARE_BOX_METHODS(SampleAuxiliaryInformationSize);
76
77 uint8_t default_sample_info_size = 0;
78 uint32_t sample_count = 0;
79 std::vector<uint8_t> sample_info_sizes;
80};
81
89 bool ReadWrite(uint8_t iv_size, bool has_subsamples, BoxBuffer* buffer);
96 bool ParseFromBuffer(uint8_t iv_size,
97 bool has_subsamples,
98 BufferReader* reader);
100 uint32_t ComputeSize() const;
103 uint32_t GetTotalSizeOfSubsamples() const;
104
105 std::vector<uint8_t> initialization_vector;
106 std::vector<SubsampleEntry> subsamples;
107};
108
110 static const uint8_t kInvalidIvSize = 1;
111
112 enum SampleEncryptionFlags {
113 kUseSubsampleEncryption = 2,
114 };
115
116 DECLARE_BOX_METHODS(SampleEncryption);
123 uint8_t l_iv_size,
124 std::vector<SampleEncryptionEntry>* l_sample_encryption_entries) const;
125
128 std::vector<uint8_t> sample_encryption_data;
129
130 uint8_t iv_size = kInvalidIvSize;
131 std::vector<SampleEncryptionEntry> sample_encryption_entries;
132};
133
135 DECLARE_BOX_METHODS(OriginalFormat);
136
137 FourCC format = FOURCC_NULL;
138};
139
141 DECLARE_BOX_METHODS(SchemeType);
142
143 FourCC type = FOURCC_NULL;
144 uint32_t version = 0u;
145};
146
148 DECLARE_BOX_METHODS(TrackEncryption);
149
150 uint8_t default_is_protected = 0;
151 uint8_t default_per_sample_iv_size = 0;
152 // Default to a vector of 16 zeros.
153 std::vector<uint8_t> default_kid = std::vector<uint8_t>(16, 0);
154
155 // For pattern-based encryption.
156 uint8_t default_crypt_byte_block = 0;
157 uint8_t default_skip_byte_block = 0;
158
159 // Present only if
160 // |default_is_protected == 1 && default_per_sample_iv_size == 0|.
161 std::vector<uint8_t> default_constant_iv;
162};
163
164struct SchemeInfo : Box {
165 DECLARE_BOX_METHODS(SchemeInfo);
166
167 TrackEncryption track_encryption;
168};
169
171 DECLARE_BOX_METHODS(ProtectionSchemeInfo);
172
173 OriginalFormat format;
174 SchemeType type;
175 SchemeInfo info;
176};
177
179 DECLARE_BOX_METHODS(MovieHeader);
180
181 uint64_t creation_time = 0;
182 uint64_t modification_time = 0;
183 uint32_t timescale = 0;
184 uint64_t duration = 0;
185 int32_t rate = 1 << 16;
186 int16_t volume = 1 << 8;
187 uint32_t next_track_id = 0;
188};
189
191 enum TrackHeaderFlags {
192 kTrackEnabled = 0x000001,
193 kTrackInMovie = 0x000002,
194 kTrackInPreview = 0x000004,
195 };
196
197 DECLARE_BOX_METHODS(TrackHeader);
198
199 uint64_t creation_time = 0;
200 uint64_t modification_time = 0;
201 uint32_t track_id = 0;
202 uint64_t duration = 0;
203 int16_t layer = 0;
204 int16_t alternate_group = 0;
205 int16_t volume = -1;
206 // width and height specify the track's visual presentation size as
207 // fixed-point 16.16 values.
208 uint32_t width = 0;
209 uint32_t height = 0;
210};
211
213 uint64_t segment_duration = 0;
214 int64_t media_time = 0;
215 int16_t media_rate_integer = 0;
216 int16_t media_rate_fraction = 0;
217};
218
220 DECLARE_BOX_METHODS(EditList);
221
222 std::vector<EditListEntry> edits;
223};
224
225struct Edit : Box {
226 DECLARE_BOX_METHODS(Edit);
227
228 EditList list;
229};
230
232 DECLARE_BOX_METHODS(HandlerReference);
233
234 FourCC handler_type = FOURCC_NULL;
235};
236
237struct Language {
238 bool ReadWrite(BoxBuffer* buffer);
239 uint32_t ComputeSize() const;
240
241 std::string code;
242};
243
245struct ID3v2 : FullBox {
246 DECLARE_BOX_METHODS(ID3v2);
247
248 Language language;
249 std::vector<uint8_t> id3v2_data;
250};
251
253 DECLARE_BOX_METHODS(Metadata);
254
255 HandlerReference handler;
256 ID3v2 id3v2;
257};
258
259// This defines a common structure for various CodecConfiguration boxes:
260// AVCConfiguration, HEVCConfiguration and VPCodecConfiguration.
261// Note that unlike the other two CodecConfiguration boxes, VPCodecConfiguration
262// box inherits from FullBox instead of Box, according to VP Codec ISO Media
263// File Format Binding specification. It will be handled properly in the
264// implementation.
266 DECLARE_BOX_METHODS(CodecConfiguration);
267
268 FourCC box_type = FOURCC_NULL;
269 // Contains full codec configuration record, including possible extension
270 // boxes.
271 std::vector<uint8_t> data;
272};
273
275 DECLARE_BOX_METHODS(ColorParameters);
276
277 FourCC color_parameter_type = FOURCC_NULL;
278 uint16_t color_primaries = 1;
279 uint16_t transfer_characteristics = 1;
280 uint16_t matrix_coefficients = 1;
281 uint8_t video_full_range_flag = 0;
282 std::vector<uint8_t> raw_box;
283};
284
286 DECLARE_BOX_METHODS(PixelAspectRatio);
287
288 uint32_t h_spacing = 0u;
289 uint32_t v_spacing = 0u;
290};
291
293 DECLARE_BOX_METHODS(VideoSampleEntry);
294
295 // Returns actual format of this sample entry.
296 FourCC GetActualFormat() const {
297 return format == FOURCC_encv ? sinf.format.format : format;
298 }
299 // Returns the box type of codec configuration box from video format.
300 FourCC GetCodecConfigurationBoxType(FourCC l_format) const;
301
302 // Convert |extra_codec_configs| to vector.
303 std::vector<uint8_t> ExtraCodecConfigsAsVector() const;
304 // Parse |extra_codec_configs| from vector.
305 bool ParseExtraCodecConfigsVector(const std::vector<uint8_t>& data);
306 // Currently |extra_codec_configs| can include configs for Dolby Vision
307 // and/or Multiview.
308 bool HaveDolbyVisionConfig() const;
309 bool HaveLHEVCConfig() const;
310
311 FourCC format = FOURCC_NULL;
312 // data_reference_index is 1-based and "dref" box is mandatory so it is
313 // always present.
314 uint16_t data_reference_index = 1u;
315 uint16_t width = 0u;
316 uint16_t height = 0u;
317
318 ColorParameters colr;
319 PixelAspectRatio pixel_aspect;
321 CodecConfiguration codec_configuration;
322 // Some codecs, e.g. Dolby Vision, have extra codec configuration boxes that
323 // need to be propagated to muxers.
324 std::vector<CodecConfiguration> extra_codec_configs;
325};
326
328 DECLARE_BOX_METHODS(ElementaryStreamDescriptor);
329
330 AACAudioSpecificConfig aac_audio_specific_config;
331 ESDescriptor es_descriptor;
332};
333
334struct DTSSpecific : Box {
335 DECLARE_BOX_METHODS(DTSSpecific);
336
337 uint32_t sampling_frequency = 0u;
338 uint32_t max_bitrate = 0u;
339 uint32_t avg_bitrate = 0u;
340 uint8_t pcm_sample_depth = 0u;
341 std::vector<uint8_t> extra_data;
342};
343
345 DECLARE_BOX_METHODS(UDTSSpecific);
346
347 std::vector<uint8_t> data;
348};
349
350struct AC3Specific : Box {
351 DECLARE_BOX_METHODS(AC3Specific);
352
353 std::vector<uint8_t> data;
354};
355
357 DECLARE_BOX_METHODS(MHAConfiguration);
358
359 std::vector<uint8_t> data;
360 uint8_t mpeg_h_3da_profile_level_indication;
361};
362
363struct EC3Specific : Box {
364 DECLARE_BOX_METHODS(EC3Specific);
365
366 std::vector<uint8_t> data;
367};
368
369struct AC4Specific : Box {
370 DECLARE_BOX_METHODS(AC4Specific);
371
372 std::vector<uint8_t> data;
373};
374
376 DECLARE_BOX_METHODS(OpusSpecific);
377
378 std::vector<uint8_t> opus_identification_header;
379 // The number of priming samples. Extracted from |opus_identification_header|.
380 uint16_t preskip = 0u;
381};
382
384 DECLARE_BOX_METHODS(IAMFSpecific);
385
386 std::vector<uint8_t> data;
387};
388
389// FLAC specific decoder configuration box:
390// https://github.com/xiph/flac/blob/master/doc/isoflac.txt
391// We do not care about the actual data inside, which is simply copied over.
393 DECLARE_BOX_METHODS(FlacSpecific);
394
395 std::vector<uint8_t> data;
396};
397
398// ALAC specific decoder configuration box:
399// https://wiki.multimedia.cx/index.php/Apple_Lossless_Audio_Coding
400// We do not care about the actual data inside, which is simply copied over.
402 DECLARE_BOX_METHODS(ALACSpecific);
403
404 std::vector<uint8_t> data;
405};
406
408 DECLARE_BOX_METHODS(AudioSampleEntry);
409
410 // Returns actual format of this sample entry.
411 FourCC GetActualFormat() const {
412 return format == FOURCC_enca ? sinf.format.format : format;
413 }
414
415 FourCC format = FOURCC_NULL;
416 // data_reference_index is 1-based and "dref" box is mandatory so it is
417 // always present.
418 uint16_t data_reference_index = 1u;
419 uint16_t channelcount = 2u;
420 uint16_t samplesize = 16u;
421 uint32_t samplerate = 0u;
422
424
426 DTSSpecific ddts;
427 UDTSSpecific udts;
428 AC3Specific dac3;
429 EC3Specific dec3;
430 AC4Specific dac4;
431 OpusSpecific dops;
432 IAMFSpecific iacb;
433 FlacSpecific dfla;
434 MHAConfiguration mhac;
435 ALACSpecific alac;
436};
437
439 DECLARE_BOX_METHODS(WebVTTConfigurationBox);
440
441 std::string config;
442};
443
445 DECLARE_BOX_METHODS(WebVTTSourceLabelBox);
446
447 std::string source_label;
448};
449
451 DECLARE_BOX_METHODS(TextSampleEntry);
452
453 // Specifies fourcc of this sample entry. It needs to be set on write, e.g.
454 // set to 'wvtt' to write WVTTSampleEntry; On read, it is recovered from box
455 // header.
456 FourCC format = FOURCC_NULL;
457
458 // data_reference_index is 1-based and "dref" box is mandatory so it is
459 // always present.
460 uint16_t data_reference_index = 1u;
461
462 // Sub fields for ttml text sample entry.
463 std::string namespace_;
464 std::string schema_location;
465 // Optional MPEG4BitRateBox.
466
467 // Sub boxes for wvtt text sample entry.
470 // Optional MPEG4BitRateBox.
471};
472
474 DECLARE_BOX_METHODS(SampleDescription);
475
476 TrackType type = kInvalid;
477 // TODO(kqyang): Clean up the code to have one single member, e.g. by creating
478 // SampleEntry struct, std::vector<SampleEntry> sample_entries.
479 std::vector<VideoSampleEntry> video_entries;
480 std::vector<AudioSampleEntry> audio_entries;
481 std::vector<TextSampleEntry> text_entries;
482};
483
485 uint32_t sample_count;
486 uint32_t sample_delta;
487};
488
489// stts.
491 DECLARE_BOX_METHODS(DecodingTimeToSample);
492
493 std::vector<DecodingTime> decoding_time;
494};
495
497 uint32_t sample_count;
498 // If version == 0, sample_offset is uint32_t;
499 // If version == 1, sample_offset is int32_t.
500 // Use int64_t so both can be supported properly.
501 int64_t sample_offset;
502};
503
504// ctts. Optional.
506 DECLARE_BOX_METHODS(CompositionTimeToSample);
507
508 std::vector<CompositionOffset> composition_offset;
509};
510
511struct ChunkInfo {
512 uint32_t first_chunk;
513 uint32_t samples_per_chunk;
514 uint32_t sample_description_index;
515};
516
517// stsc.
519 DECLARE_BOX_METHODS(SampleToChunk);
520
521 std::vector<ChunkInfo> chunk_info;
522};
523
524// stsz.
526 DECLARE_BOX_METHODS(SampleSize);
527
528 uint32_t sample_size = 0u;
529 uint32_t sample_count = 0u;
530 std::vector<uint32_t> sizes;
531};
532
533// stz2.
535 DECLARE_BOX_METHODS(CompactSampleSize);
536
537 uint8_t field_size = 0u;
538 std::vector<uint32_t> sizes;
539};
540
541// co64.
543 DECLARE_BOX_METHODS(ChunkLargeOffset);
544
545 std::vector<uint64_t> offsets;
546};
547
548// stco.
550 DECLARE_BOX_METHODS(ChunkOffset);
551};
552
553// stss. Optional.
555 DECLARE_BOX_METHODS(SyncSample);
556
557 std::vector<uint32_t> sample_number;
558};
559
561 bool ReadWrite(BoxBuffer* buffer);
562 uint32_t ComputeSize() const;
563
564 uint8_t is_protected = 0u;
565 uint8_t per_sample_iv_size = 0u;
566 std::vector<uint8_t> key_id;
567
568 // For pattern-based encryption.
569 uint8_t crypt_byte_block = 0u;
570 uint8_t skip_byte_block = 0u;
571
572 // Present only if |is_protected == 1 && per_sample_iv_size == 0|.
573 std::vector<uint8_t> constant_iv;
574};
575
577 bool ReadWrite(BoxBuffer* buffer);
578 uint32_t ComputeSize() const;
579
580 int16_t roll_distance = 0;
581};
582
584 DECLARE_BOX_METHODS(SampleGroupDescription);
585
586 template <typename T>
587 bool ReadWriteEntries(BoxBuffer* buffer, std::vector<T>* entries);
588
589 uint32_t grouping_type = 0;
590 // Only present if grouping_type == 'seig'.
591 std::vector<CencSampleEncryptionInfoEntry>
592 cenc_sample_encryption_info_entries;
593 // Only present if grouping_type == 'roll'.
594 std::vector<AudioRollRecoveryEntry> audio_roll_recovery_entries;
595};
596
598 enum GroupDescriptionIndexBase {
599 kTrackGroupDescriptionIndexBase = 0,
600 kTrackFragmentGroupDescriptionIndexBase = 0x10000,
601 };
602
603 uint32_t sample_count = 0u;
604 uint32_t group_description_index = 0u;
605};
606
608 DECLARE_BOX_METHODS(SampleToGroup);
609
610 uint32_t grouping_type = 0u;
611 uint32_t grouping_type_parameter = 0u; // Version 1 only.
612 std::vector<SampleToGroupEntry> entries;
613};
614
615struct SampleTable : Box {
616 DECLARE_BOX_METHODS(SampleTable);
617
618 SampleDescription description;
619 DecodingTimeToSample decoding_time_to_sample;
620 CompositionTimeToSample composition_time_to_sample;
621 SampleToChunk sample_to_chunk;
622 // Either SampleSize or CompactSampleSize must present. Store in SampleSize.
623 SampleSize sample_size;
624 // Either ChunkOffset or ChunkLargeOffset must present. Store in
625 // ChunkLargeOffset.
626 ChunkLargeOffset chunk_large_offset;
627 SyncSample sync_sample;
628 std::vector<SampleGroupDescription> sample_group_descriptions;
629 std::vector<SampleToGroup> sample_to_groups;
630};
631
633 DECLARE_BOX_METHODS(MediaHeader);
634
635 uint64_t creation_time = 0u;
636 uint64_t modification_time = 0u;
637 uint32_t timescale = 0u;
638 uint64_t duration = 0u;
639 Language language;
640};
641
643 DECLARE_BOX_METHODS(VideoMediaHeader);
644
645 uint16_t graphicsmode = 0u;
646 uint16_t opcolor_red = 0u;
647 uint16_t opcolor_green = 0u;
648 uint16_t opcolor_blue = 0u;
649};
650
652 DECLARE_BOX_METHODS(SoundMediaHeader);
653
654 uint16_t balance = 0u;
655};
656
658 DECLARE_BOX_METHODS(NullMediaHeader);
659};
660
662 DECLARE_BOX_METHODS(SubtitleMediaHeader);
663};
664
666 DECLARE_BOX_METHODS(DataEntryUrl);
667
668 std::vector<uint8_t> location;
669};
670
672 DECLARE_BOX_METHODS(DataReference);
673
674 // Can be either url or urn box. Fix to url box for now.
675 std::vector<DataEntryUrl> data_entry = std::vector<DataEntryUrl>(1);
676};
677
679 DECLARE_BOX_METHODS(DataInformation);
680
681 DataReference dref;
682};
683
685 DECLARE_BOX_METHODS(MediaInformation);
686
687 DataInformation dinf;
688 SampleTable sample_table;
689 // Exactly one specific meida header shall be present, vmhd, smhd, hmhd, nmhd.
690 VideoMediaHeader vmhd;
691 SoundMediaHeader smhd;
692 NullMediaHeader nmhd;
694};
695
696struct Media : Box {
697 DECLARE_BOX_METHODS(Media);
698
699 MediaHeader header;
700 HandlerReference handler;
701 MediaInformation information;
702};
703
704struct Track : Box {
705 DECLARE_BOX_METHODS(Track);
706
707 TrackHeader header;
708 Media media;
709 Edit edit;
710 SampleEncryption sample_encryption;
711};
712
714 DECLARE_BOX_METHODS(MovieExtendsHeader);
715
716 uint64_t fragment_duration = 0u;
717};
718
720 DECLARE_BOX_METHODS(TrackExtends);
721
722 uint32_t track_id = 0u;
723 uint32_t default_sample_description_index = 0u;
724 uint32_t default_sample_duration = 0u;
725 uint32_t default_sample_size = 0u;
726 uint32_t default_sample_flags = 0u;
727};
728
730 DECLARE_BOX_METHODS(MovieExtends);
731
732 MovieExtendsHeader header;
733 std::vector<TrackExtends> tracks;
734};
735
736struct Movie : Box {
737 DECLARE_BOX_METHODS(Movie);
738
739 MovieHeader header;
740 Metadata metadata; // Used to hold version information.
741 MovieExtends extends;
742 std::vector<Track> tracks;
743 std::vector<ProtectionSystemSpecificHeader> pssh;
744};
745
747 DECLARE_BOX_METHODS(TrackFragmentDecodeTime);
748
749 uint64_t decode_time = 0u;
750};
751
753 DECLARE_BOX_METHODS(MovieFragmentHeader);
754
755 uint32_t sequence_number = 0u;
756};
757
759 enum TrackFragmentFlagsMasks {
760 kBaseDataOffsetPresentMask = 0x000001,
761 kSampleDescriptionIndexPresentMask = 0x000002,
762 kDefaultSampleDurationPresentMask = 0x000008,
763 kDefaultSampleSizePresentMask = 0x000010,
764 kDefaultSampleFlagsPresentMask = 0x000020,
765 kDurationIsEmptyMask = 0x010000,
766 kDefaultBaseIsMoofMask = 0x020000,
767 };
768
769 enum SampleFlagsMasks {
770 kUnset = 0x00000000,
771 kReservedMask = 0xFC000000,
772 kSampleDependsOnMask = 0x03000000,
773 kSampleIsDependedOnMask = 0x00C00000,
774 kSampleHasRedundancyMask = 0x00300000,
775 kSamplePaddingValueMask = 0x000E0000,
776 kNonKeySampleMask = 0x00010000,
777 kSampleDegradationPriorityMask = 0x0000FFFF,
778 };
779
780 DECLARE_BOX_METHODS(TrackFragmentHeader);
781
782 uint32_t track_id = 0u;
783 uint32_t sample_description_index = 0u;
784 uint32_t default_sample_duration = 0u;
785 uint32_t default_sample_size = 0u;
786 uint32_t default_sample_flags = 0u;
787};
788
790 enum TrackFragmentFlagsMasks {
791 kDataOffsetPresentMask = 0x000001,
792 kFirstSampleFlagsPresentMask = 0x000004,
793 kSampleDurationPresentMask = 0x000100,
794 kSampleSizePresentMask = 0x000200,
795 kSampleFlagsPresentMask = 0x000400,
796 kSampleCompTimeOffsetsPresentMask = 0x000800,
797 };
798
799 DECLARE_BOX_METHODS(TrackFragmentRun);
800
801 uint32_t sample_count = 0u;
802 uint32_t data_offset = 0u;
803 std::vector<uint32_t> sample_flags;
804 std::vector<uint32_t> sample_sizes;
805 std::vector<uint32_t> sample_durations;
806 std::vector<int64_t> sample_composition_time_offsets;
807};
808
810 DECLARE_BOX_METHODS(TrackFragment);
811
812 TrackFragmentHeader header;
813 std::vector<TrackFragmentRun> runs;
814 bool decode_time_absent = false;
815 TrackFragmentDecodeTime decode_time;
816 std::vector<SampleGroupDescription> sample_group_descriptions;
817 std::vector<SampleToGroup> sample_to_groups;
818 SampleAuxiliaryInformationSize auxiliary_size;
819 SampleAuxiliaryInformationOffset auxiliary_offset;
820 SampleEncryption sample_encryption;
821};
822
824 DECLARE_BOX_METHODS(MovieFragment);
825
826 MovieFragmentHeader header;
827 std::vector<TrackFragment> tracks;
828 std::vector<ProtectionSystemSpecificHeader> pssh;
829};
830
832 enum SAPType {
833 TypeUnknown = 0,
834 Type1 = 1, // T(ept) = T(dec) = T(sap) = T(ptf)
835 Type2 = 2, // T(ept) = T(dec) = T(sap) < T(ptf)
836 Type3 = 3, // T(ept) < T(dec) = T(sap) <= T(ptf)
837 Type4 = 4, // T(ept) <= T(ptf) < T(dec) = T(sap)
838 Type5 = 5, // T(ept) = T(dec) < T(sap)
839 Type6 = 6, // T(ept) < T(dec) < T(sap)
840 };
841
842 bool reference_type = false;
843 uint32_t referenced_size = 0u;
844 uint32_t subsegment_duration = 0u;
845 bool starts_with_sap = false;
846 SAPType sap_type = TypeUnknown;
847 uint32_t sap_delta_time = 0u;
848 // We add this field to keep track of earliest_presentation_time in this
849 // subsegment. It is not part of SegmentReference.
850 uint64_t earliest_presentation_time = 0u;
851};
852
854 DECLARE_BOX_METHODS(SegmentIndex);
855
856 uint32_t reference_id = 0u;
857 uint32_t timescale = 0u;
858 uint64_t earliest_presentation_time = 0u;
859 uint64_t first_offset = 0u;
860 std::vector<SegmentReference> references;
861};
862
863// The actual data is parsed and written separately.
864struct MediaData : Box {
865 DECLARE_BOX_METHODS(MediaData);
866
867 uint32_t data_size = 0u;
868};
869
870// Using negative value as "not set". It is very unlikely that 2^31 cues happen
871// at once.
872const int kCueSourceIdNotSet = -1;
873
875 DECLARE_BOX_METHODS(CueSourceIDBox);
876
877 int32_t source_id = kCueSourceIdNotSet;
878};
879
880struct CueTimeBox : Box {
881 DECLARE_BOX_METHODS(CueTimeBox);
882
883 std::string cue_current_time;
884};
885
886struct CueIDBox : Box {
887 DECLARE_BOX_METHODS(CueIDBox);
888
889 std::string cue_id;
890};
891
893 DECLARE_BOX_METHODS(CueSettingsBox);
894
895 std::string settings;
896};
897
899 DECLARE_BOX_METHODS(CuePayloadBox);
900
901 std::string cue_text;
902};
903
905 DECLARE_BOX_METHODS(VTTEmptyCueBox);
906};
907
909 DECLARE_BOX_METHODS(VTTAdditionalTextBox);
910
911 std::string cue_additional_text;
912};
913
914struct VTTCueBox : Box {
915 DECLARE_BOX_METHODS(VTTCueBox);
916
917 CueSourceIDBox cue_source_id;
918 CueIDBox cue_id;
919 CueTimeBox cue_time;
920 CueSettingsBox cue_settings;
921 CuePayloadBox cue_payload;
922};
923
924#undef DECLARE_BOX
925
926} // namespace mp4
927} // namespace media
928} // namespace shaka
929
930#endif // PACKAGER_MEDIA_FORMATS_MP4_BOX_DEFINITIONS_H_
All the methods that are virtual are virtual for mocking.
Implemented per http://mp4ra.org/#/references.
bool ParseFromBuffer(uint8_t iv_size, bool has_subsamples, BufferReader *reader)
bool ReadWrite(uint8_t iv_size, bool has_subsamples, BoxBuffer *buffer)
std::vector< uint8_t > sample_encryption_data
bool ParseFromSampleEncryptionData(uint8_t l_iv_size, std::vector< SampleEncryptionEntry > *l_sample_encryption_entries) const
FourCC BoxType() const override