Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1297)

Unified Diff: media/mp4/box_definitions.h

Issue 10536014: Implement ISO BMFF support in Media Source. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/mp4/box_definitions.h
diff --git a/media/mp4/box_definitions.h b/media/mp4/box_definitions.h
new file mode 100644
index 0000000000000000000000000000000000000000..e518002e7694d801ccad31228df1122cea208a7b
--- /dev/null
+++ b/media/mp4/box_definitions.h
@@ -0,0 +1,360 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_MP4_BOX_DEFINITIONS_H_
+#define MEDIA_MP4_BOX_DEFINITIONS_H_
+#pragma once
acolwell GONE FROM CHROMIUM 2012/06/06 17:32:39 remove
strobe_ 2012/06/07 16:33:54 Done.
+
+#include "base/basictypes.h"
+#include "media/mp4/avc.h"
+#include "media/mp4/fourccs.h"
+#include <string>
acolwell GONE FROM CHROMIUM 2012/06/06 17:32:39 goes before non-system includes
strobe_ 2012/06/07 16:33:54 Done.
+
+#define ARRAY_LENGTH(x) (sizeof(x) / sizeof(*(x)))
acolwell GONE FROM CHROMIUM 2012/06/06 17:32:39 remove. Use arraysize() from basictypes.h instead
strobe_ 2012/06/07 16:33:54 Done.
+
+namespace media {
+namespace mp4 {
+
+class BoxReader;
+
+enum TrackType {
+ kInvalid = 0,
+ kVideo,
+ kAudio,
+ kHint
+};
+
+struct FileType {
+ FourCC major_brand;
+ uint32 minor_version;
+
+ FileType();
+ ~FileType();
+};
+
+struct ProtectionSystemSpecificHeader {
+ std::vector<uint8> system_id;
+ std::vector<uint8> data;
+
+ ProtectionSystemSpecificHeader();
+ ~ProtectionSystemSpecificHeader();
+};
+
+struct SampleAuxiliaryInformationOffset {
+ std::vector<uint64> offsets;
+
+ SampleAuxiliaryInformationOffset();
+ ~SampleAuxiliaryInformationOffset();
+};
+
+struct SampleAuxiliaryInformationSize {
+ uint8 default_sample_info_size;
+ uint32 sample_count;
+ std::vector<uint8> sample_info_sizes;
+
+ SampleAuxiliaryInformationSize();
+ ~SampleAuxiliaryInformationSize();
+};
+
+struct OriginalFormat {
+ FourCC format;
+};
+
+struct SchemeType {
+ FourCC type;
+ uint32 version;
+
+ SchemeType() : type(0), version(0) {}
+};
+
+struct TrackEncryption {
+ // Note: this definition is specific to the CENC protection type.
+ bool is_encrypted;
+ uint8 default_iv_size;
+ std::vector<uint8> default_kid;
+
+ TrackEncryption();
+ ~TrackEncryption();
+};
+
+struct SchemeInfo {
+ TrackEncryption track_encryption;
+};
+
+struct ProtectionSchemeInfo {
+ OriginalFormat format;
+ SchemeType type;
+ SchemeInfo info;
+};
+
+struct MovieHeader {
+ uint64 creation_time;
+ uint64 modification_time;
+ uint32 timescale;
+ uint64 duration;
+ int32 rate;
+ int16 volume;
+ uint32 next_track_id;
+};
+
+struct TrackHeader {
+ static const uint32 kTrackEnabled = 1;
+ static const uint32 kTrackInMovie = 2;
+ static const uint32 kTrackInPreview = 4;
+
+ uint64 creation_time;
+ uint64 modification_time;
+ uint32 track_id;
+ uint64 duration;
+ int16 layer;
+ int16 alternate_group;
+ int16 volume;
+ uint32 width;
+ uint32 height;
+
+ TrackHeader();
+ ~TrackHeader();
+};
+
+struct EditListEntry {
+ uint64 segment_duration;
+ int64 media_time;
+ int16 media_rate_integer;
+ int16 media_rate_fraction;
+};
+
+struct EditList {
+ std::vector<EditListEntry> edits;
+
+ EditList();
+ ~EditList();
+};
+
+struct Edit {
+ EditList list;
+
+ Edit();
+ ~Edit();
+};
+
+struct HandlerReference {
+ TrackType type;
+};
+
+struct SampleEntry {
+ FourCC format;
+ uint16 data_reference_index;
+
+ ProtectionSchemeInfo sinf;
+
+ SampleEntry();
+ ~SampleEntry();
+};
+
+struct VideoSampleEntry : SampleEntry {
+ uint16 width;
+ uint16 height;
+
+ // Present iff format or original_format is 'avc1'.
+ AVCDecoderConfigurationRecord avcc;
+
+ VideoSampleEntry();
+ ~VideoSampleEntry();
+};
+
+struct AudioSampleEntry : SampleEntry {
+ uint16 channelcount;
+ uint16 samplesize;
+ uint32 samplerate;
+
+ AudioSampleEntry();
+ ~AudioSampleEntry();
+};
+
+struct SampleDescription {
+ TrackType type;
+ std::vector<VideoSampleEntry> video_entries;
+ std::vector<AudioSampleEntry> audio_entries;
+
+ SampleDescription();
+ ~SampleDescription();
+};
+
+struct SampleTable {
+ // Media Source specific: we ignore many of the sub-boxes in this box,
+ // including some that are required to be present in the BMFF spec.
+ SampleDescription description;
+
+ SampleTable();
+ ~SampleTable();
+};
+
+struct MediaHeader {
+ uint64 creation_time;
+ uint64 modification_time;
+ uint32 timescale;
+ uint64 duration;
+
+ MediaHeader();
+ ~MediaHeader();
+};
+
+struct MediaInformation {
+ SampleTable sample_table;
+};
+
+struct Media {
+ MediaHeader header;
+ HandlerReference handler;
+ MediaInformation information;
+};
+
+struct Track {
+ TrackHeader header;
+ Media media;
+ Edit edit;
+};
+
+struct MovieExtendsHeader {
+ uint64 fragment_duration;
+};
+
+struct TrackExtends {
+ uint32 track_id;
+ uint32 default_sample_description_index;
+ uint32 default_sample_duration;
+ uint32 default_sample_size;
+ uint32 default_sample_flags;
+};
+
+struct MovieExtends {
+ MovieExtendsHeader header;
+ std::vector<TrackExtends> tracks;
+
+ MovieExtends();
+ ~MovieExtends();
+};
+
+struct Movie {
+ bool fragmented;
+ MovieHeader header;
+ MovieExtends extends;
+ std::vector<Track> tracks;
+ std::vector<ProtectionSystemSpecificHeader> pssh;
+
+ Movie();
+ ~Movie();
+};
+
+struct TrackFragmentDecodeTime {
+ uint64 decode_time;
+};
+
+struct MovieFragmentHeader {
+ uint32 sequence_number;
+};
+
+struct TrackFragmentHeader {
+ uint32 track_id;
+ uint32 default_sample_duration;
+ uint32 default_sample_size;
+ uint32 default_sample_flags;
+
+ // As 'flags' might be all zero, we cannot use zeroness alone to identify
+ // when default_sample_flags wasn't specified, unlike the other values.
+ bool has_default_sample_flags;
+};
+
+struct TrackFragmentRun {
+ TrackFragmentRun();
+ ~TrackFragmentRun();
+
+ uint32 sample_count;
+ uint32 data_offset;
+ std::vector<uint32> sample_flags;
+ std::vector<uint32> sample_sizes;
+ std::vector<uint32> sample_durations;
+ std::vector<uint32> sample_composition_time_offsets;
+};
+
+struct TrackFragment {
+ TrackFragmentHeader header;
+ std::vector<TrackFragmentRun> runs;
+ TrackFragmentDecodeTime decode_time;
+ SampleAuxiliaryInformationOffset auxiliary_offset;
+ SampleAuxiliaryInformationSize auxiliary_size;
+
+ TrackFragment();
+ ~TrackFragment();
+};
+
+struct MovieFragment {
+ MovieFragmentHeader header;
+ std::vector<TrackFragment> tracks;
+ std::vector<ProtectionSystemSpecificHeader> pssh;
+
+ MovieFragment();
+ ~MovieFragment();
+};
+
+struct SegmentIndex {
+ uint32 reference_id;
+ uint32 timescale;
+ uint64 earliest_presentation_time;
+ uint64 first_offset;
+ std::vector<uint32> sizes;
+ std::vector<uint32> durations;
+
+ SegmentIndex();
+ ~SegmentIndex();
+};
+
+template<typename T> FourCC GetBoxType();
+
+#define DECLARE_BOX(T, F) \
+ bool Parse(BoxReader* r, T* box); \
acolwell GONE FROM CHROMIUM 2012/06/06 17:32:39 WDYT about bool T::Parse(BoxReader* reader) so thi
strobe_ 2012/06/07 16:33:54 I'm provisionally cool with that, and will give it
+ template<> inline FourCC GetBoxType<T>() { return FOURCC_ ## F; }
+
+DECLARE_BOX(AVCDecoderConfigurationRecord, AVCC);
+DECLARE_BOX(Edit, EDTS);
+DECLARE_BOX(EditList, ELST);
+DECLARE_BOX(FileType, FTYP);
+DECLARE_BOX(HandlerReference, HDLR);
+DECLARE_BOX(Media, MDIA);
+DECLARE_BOX(MediaHeader, MDHD);
+DECLARE_BOX(MediaInformation, MINF);
+DECLARE_BOX(Movie, MOOV);
+DECLARE_BOX(MovieExtends, MVEX);
+DECLARE_BOX(MovieExtendsHeader, MEHD);
+DECLARE_BOX(MovieFragment, MOOF);
+DECLARE_BOX(MovieFragmentHeader, MFHD);
+DECLARE_BOX(MovieHeader, MVHD);
+DECLARE_BOX(OriginalFormat, FRMA);
+DECLARE_BOX(ProtectionSchemeInfo, SINF);
+DECLARE_BOX(ProtectionSystemSpecificHeader, PSSH);
+DECLARE_BOX(SampleAuxiliaryInformationOffset, SAIO);
+DECLARE_BOX(SampleAuxiliaryInformationSize, SAIZ);
+DECLARE_BOX(SampleDescription, STSD);
+DECLARE_BOX(SampleTable, STBL);
+DECLARE_BOX(SchemeInfo, SCHI);
+DECLARE_BOX(SchemeType, SCHM);
+DECLARE_BOX(Track, TRAK);
+DECLARE_BOX(TrackEncryption, TENC);
+DECLARE_BOX(TrackExtends, TREX);
+DECLARE_BOX(TrackFragment, TRAF);
+DECLARE_BOX(TrackFragmentDecodeTime, TFDT);
+DECLARE_BOX(TrackFragmentHeader, TFHD);
+DECLARE_BOX(TrackFragmentRun, TRUN);
+DECLARE_BOX(TrackHeader, TKHD);
+
+#undef DECLARE_BOX
+
+// These boxes do not have an associated FourCC.
+bool Parse(BoxReader* r, VideoSampleEntry* entry);
+bool Parse(BoxReader* r, AudioSampleEntry* entry);
+
+} // namespace mp4
+} // namespace media
+
+#endif // MEDIA_MP4_BOX_DEFINITIONS_H_

Powered by Google App Engine
This is Rietveld 408576698