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