Home | History | Annotate | Download | only in mp4
      1 // Copyright 2014 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 MEDIA_FORMATS_MP4_BOX_DEFINITIONS_H_
      6 #define MEDIA_FORMATS_MP4_BOX_DEFINITIONS_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/compiler_specific.h"
     13 #include "media/base/media_export.h"
     14 #include "media/formats/mp4/aac.h"
     15 #include "media/formats/mp4/avc.h"
     16 #include "media/formats/mp4/box_reader.h"
     17 #include "media/formats/mp4/fourccs.h"
     18 
     19 namespace media {
     20 namespace mp4 {
     21 
     22 enum TrackType {
     23   kInvalid = 0,
     24   kVideo,
     25   kAudio,
     26   kHint
     27 };
     28 
     29 enum SampleFlags {
     30   kSampleIsNonSyncSample = 0x10000
     31 };
     32 
     33 #define DECLARE_BOX_METHODS(T) \
     34   T(); \
     35   virtual ~T(); \
     36   virtual bool Parse(BoxReader* reader) OVERRIDE; \
     37   virtual FourCC BoxType() const OVERRIDE; \
     38 
     39 struct MEDIA_EXPORT FileType : Box {
     40   DECLARE_BOX_METHODS(FileType);
     41 
     42   FourCC major_brand;
     43   uint32 minor_version;
     44 };
     45 
     46 struct MEDIA_EXPORT ProtectionSystemSpecificHeader : Box {
     47   DECLARE_BOX_METHODS(ProtectionSystemSpecificHeader);
     48 
     49   std::vector<uint8> system_id;
     50   std::vector<uint8> raw_box;
     51 };
     52 
     53 struct MEDIA_EXPORT SampleAuxiliaryInformationOffset : Box {
     54   DECLARE_BOX_METHODS(SampleAuxiliaryInformationOffset);
     55 
     56   std::vector<uint64> offsets;
     57 };
     58 
     59 struct MEDIA_EXPORT SampleAuxiliaryInformationSize : Box {
     60   DECLARE_BOX_METHODS(SampleAuxiliaryInformationSize);
     61 
     62   uint8 default_sample_info_size;
     63   uint32 sample_count;
     64   std::vector<uint8> sample_info_sizes;
     65 };
     66 
     67 struct MEDIA_EXPORT OriginalFormat : Box {
     68   DECLARE_BOX_METHODS(OriginalFormat);
     69 
     70   FourCC format;
     71 };
     72 
     73 struct MEDIA_EXPORT SchemeType : Box {
     74   DECLARE_BOX_METHODS(SchemeType);
     75 
     76   FourCC type;
     77   uint32 version;
     78 };
     79 
     80 struct MEDIA_EXPORT TrackEncryption : Box {
     81   DECLARE_BOX_METHODS(TrackEncryption);
     82 
     83   // Note: this definition is specific to the CENC protection type.
     84   bool is_encrypted;
     85   uint8 default_iv_size;
     86   std::vector<uint8> default_kid;
     87 };
     88 
     89 struct MEDIA_EXPORT SchemeInfo : Box {
     90   DECLARE_BOX_METHODS(SchemeInfo);
     91 
     92   TrackEncryption track_encryption;
     93 };
     94 
     95 struct MEDIA_EXPORT ProtectionSchemeInfo : Box {
     96   DECLARE_BOX_METHODS(ProtectionSchemeInfo);
     97 
     98   OriginalFormat format;
     99   SchemeType type;
    100   SchemeInfo info;
    101 };
    102 
    103 struct MEDIA_EXPORT MovieHeader : Box {
    104   DECLARE_BOX_METHODS(MovieHeader);
    105 
    106   uint64 creation_time;
    107   uint64 modification_time;
    108   uint32 timescale;
    109   uint64 duration;
    110   int32 rate;
    111   int16 volume;
    112   uint32 next_track_id;
    113 };
    114 
    115 struct MEDIA_EXPORT TrackHeader : Box {
    116   DECLARE_BOX_METHODS(TrackHeader);
    117 
    118   uint64 creation_time;
    119   uint64 modification_time;
    120   uint32 track_id;
    121   uint64 duration;
    122   int16 layer;
    123   int16 alternate_group;
    124   int16 volume;
    125   uint32 width;
    126   uint32 height;
    127 };
    128 
    129 struct MEDIA_EXPORT EditListEntry {
    130   uint64 segment_duration;
    131   int64 media_time;
    132   int16 media_rate_integer;
    133   int16 media_rate_fraction;
    134 };
    135 
    136 struct MEDIA_EXPORT EditList : Box {
    137   DECLARE_BOX_METHODS(EditList);
    138 
    139   std::vector<EditListEntry> edits;
    140 };
    141 
    142 struct MEDIA_EXPORT Edit : Box {
    143   DECLARE_BOX_METHODS(Edit);
    144 
    145   EditList list;
    146 };
    147 
    148 struct MEDIA_EXPORT HandlerReference : Box {
    149   DECLARE_BOX_METHODS(HandlerReference);
    150 
    151   TrackType type;
    152 };
    153 
    154 struct MEDIA_EXPORT AVCDecoderConfigurationRecord : Box {
    155   DECLARE_BOX_METHODS(AVCDecoderConfigurationRecord);
    156 
    157   // Parses AVCDecoderConfigurationRecord data encoded in |data|.
    158   // Note: This method is intended to parse data outside the MP4StreamParser
    159   //       context and therefore the box header is not expected to be present
    160   //       in |data|.
    161   // Returns true if |data| was successfully parsed.
    162   bool Parse(const uint8* data, int data_size);
    163 
    164   uint8 version;
    165   uint8 profile_indication;
    166   uint8 profile_compatibility;
    167   uint8 avc_level;
    168   uint8 length_size;
    169 
    170   typedef std::vector<uint8> SPS;
    171   typedef std::vector<uint8> PPS;
    172 
    173   std::vector<SPS> sps_list;
    174   std::vector<PPS> pps_list;
    175 
    176  private:
    177   bool ParseInternal(BufferReader* reader, const LogCB& log_cb);
    178 };
    179 
    180 struct MEDIA_EXPORT PixelAspectRatioBox : Box {
    181   DECLARE_BOX_METHODS(PixelAspectRatioBox);
    182 
    183   uint32 h_spacing;
    184   uint32 v_spacing;
    185 };
    186 
    187 struct MEDIA_EXPORT VideoSampleEntry : Box {
    188   DECLARE_BOX_METHODS(VideoSampleEntry);
    189 
    190   FourCC format;
    191   uint16 data_reference_index;
    192   uint16 width;
    193   uint16 height;
    194 
    195   PixelAspectRatioBox pixel_aspect;
    196   ProtectionSchemeInfo sinf;
    197 
    198   // Currently expected to be present regardless of format.
    199   AVCDecoderConfigurationRecord avcc;
    200 
    201   bool IsFormatValid() const;
    202 };
    203 
    204 struct MEDIA_EXPORT ElementaryStreamDescriptor : Box {
    205   DECLARE_BOX_METHODS(ElementaryStreamDescriptor);
    206 
    207   uint8 object_type;
    208   AAC aac;
    209 };
    210 
    211 struct MEDIA_EXPORT AudioSampleEntry : Box {
    212   DECLARE_BOX_METHODS(AudioSampleEntry);
    213 
    214   FourCC format;
    215   uint16 data_reference_index;
    216   uint16 channelcount;
    217   uint16 samplesize;
    218   uint32 samplerate;
    219 
    220   ProtectionSchemeInfo sinf;
    221   ElementaryStreamDescriptor esds;
    222 };
    223 
    224 struct MEDIA_EXPORT SampleDescription : Box {
    225   DECLARE_BOX_METHODS(SampleDescription);
    226 
    227   TrackType type;
    228   std::vector<VideoSampleEntry> video_entries;
    229   std::vector<AudioSampleEntry> audio_entries;
    230 };
    231 
    232 struct MEDIA_EXPORT SyncSample : Box {
    233   DECLARE_BOX_METHODS(SyncSample);
    234 
    235   // Returns true if the |k|th sample is a sync sample (aka a random
    236   // access point). Returns false if sample |k| is not a sync sample.
    237   bool IsSyncSample(size_t k) const;
    238 
    239   bool is_present;
    240   std::vector<uint32> entries;
    241 };
    242 
    243 struct MEDIA_EXPORT SampleTable : Box {
    244   DECLARE_BOX_METHODS(SampleTable);
    245 
    246   // Media Source specific: we ignore many of the sub-boxes in this box,
    247   // including some that are required to be present in the BMFF spec. This
    248   // includes the 'stts', 'stsc', and 'stco' boxes, which must contain no
    249   // samples in order to be compliant files.
    250   SampleDescription description;
    251   SyncSample sync_sample;
    252 };
    253 
    254 struct MEDIA_EXPORT MediaHeader : Box {
    255   DECLARE_BOX_METHODS(MediaHeader);
    256 
    257   uint64 creation_time;
    258   uint64 modification_time;
    259   uint32 timescale;
    260   uint64 duration;
    261 };
    262 
    263 struct MEDIA_EXPORT MediaInformation : Box {
    264   DECLARE_BOX_METHODS(MediaInformation);
    265 
    266   SampleTable sample_table;
    267 };
    268 
    269 struct MEDIA_EXPORT Media : Box {
    270   DECLARE_BOX_METHODS(Media);
    271 
    272   MediaHeader header;
    273   HandlerReference handler;
    274   MediaInformation information;
    275 };
    276 
    277 struct MEDIA_EXPORT Track : Box {
    278   DECLARE_BOX_METHODS(Track);
    279 
    280   TrackHeader header;
    281   Media media;
    282   Edit edit;
    283 };
    284 
    285 struct MEDIA_EXPORT MovieExtendsHeader : Box {
    286   DECLARE_BOX_METHODS(MovieExtendsHeader);
    287 
    288   uint64 fragment_duration;
    289 };
    290 
    291 struct MEDIA_EXPORT TrackExtends : Box {
    292   DECLARE_BOX_METHODS(TrackExtends);
    293 
    294   uint32 track_id;
    295   uint32 default_sample_description_index;
    296   uint32 default_sample_duration;
    297   uint32 default_sample_size;
    298   uint32 default_sample_flags;
    299 };
    300 
    301 struct MEDIA_EXPORT MovieExtends : Box {
    302   DECLARE_BOX_METHODS(MovieExtends);
    303 
    304   MovieExtendsHeader header;
    305   std::vector<TrackExtends> tracks;
    306 };
    307 
    308 struct MEDIA_EXPORT Movie : Box {
    309   DECLARE_BOX_METHODS(Movie);
    310 
    311   bool fragmented;
    312   MovieHeader header;
    313   MovieExtends extends;
    314   std::vector<Track> tracks;
    315   std::vector<ProtectionSystemSpecificHeader> pssh;
    316 };
    317 
    318 struct MEDIA_EXPORT TrackFragmentDecodeTime : Box {
    319   DECLARE_BOX_METHODS(TrackFragmentDecodeTime);
    320 
    321   uint64 decode_time;
    322 };
    323 
    324 struct MEDIA_EXPORT MovieFragmentHeader : Box {
    325   DECLARE_BOX_METHODS(MovieFragmentHeader);
    326 
    327   uint32 sequence_number;
    328 };
    329 
    330 struct MEDIA_EXPORT TrackFragmentHeader : Box {
    331   DECLARE_BOX_METHODS(TrackFragmentHeader);
    332 
    333   uint32 track_id;
    334 
    335   uint32 sample_description_index;
    336   uint32 default_sample_duration;
    337   uint32 default_sample_size;
    338   uint32 default_sample_flags;
    339 
    340   // As 'flags' might be all zero, we cannot use zeroness alone to identify
    341   // when default_sample_flags wasn't specified, unlike the other values.
    342   bool has_default_sample_flags;
    343 };
    344 
    345 struct MEDIA_EXPORT TrackFragmentRun : Box {
    346   DECLARE_BOX_METHODS(TrackFragmentRun);
    347 
    348   uint32 sample_count;
    349   uint32 data_offset;
    350   std::vector<uint32> sample_flags;
    351   std::vector<uint32> sample_sizes;
    352   std::vector<uint32> sample_durations;
    353   std::vector<int32> sample_composition_time_offsets;
    354 };
    355 
    356 // sample_depends_on values in ISO/IEC 14496-12 Section 8.40.2.3.
    357 enum SampleDependsOn {
    358   kSampleDependsOnUnknown = 0,
    359   kSampleDependsOnOthers = 1,
    360   kSampleDependsOnNoOther = 2,
    361   kSampleDependsOnReserved = 3,
    362 };
    363 
    364 class MEDIA_EXPORT IndependentAndDisposableSamples : public Box {
    365  public:
    366   DECLARE_BOX_METHODS(IndependentAndDisposableSamples);
    367 
    368   // Returns the SampleDependsOn value for the |i|'th value
    369   // in the track. If no data was parsed for the |i|'th sample,
    370   // then |kSampleDependsOnUnknown| is returned.
    371   SampleDependsOn sample_depends_on(size_t i) const;
    372 
    373  private:
    374   std::vector<SampleDependsOn> sample_depends_on_;
    375 };
    376 
    377 struct MEDIA_EXPORT CencSampleEncryptionInfoEntry {
    378   CencSampleEncryptionInfoEntry();
    379   ~CencSampleEncryptionInfoEntry();
    380 
    381   bool is_encrypted;
    382   uint8 iv_size;
    383   std::vector<uint8> key_id;
    384 };
    385 
    386 struct MEDIA_EXPORT SampleGroupDescription : Box {  // 'sgpd'.
    387   DECLARE_BOX_METHODS(SampleGroupDescription);
    388 
    389   uint32 grouping_type;
    390   std::vector<CencSampleEncryptionInfoEntry> entries;
    391 };
    392 
    393 struct MEDIA_EXPORT SampleToGroupEntry {
    394   enum GroupDescriptionIndexBase {
    395     kTrackGroupDescriptionIndexBase = 0,
    396     kFragmentGroupDescriptionIndexBase = 0x10000,
    397   };
    398 
    399   uint32 sample_count;
    400   uint32 group_description_index;
    401 };
    402 
    403 struct MEDIA_EXPORT SampleToGroup : Box {  // 'sbgp'.
    404   DECLARE_BOX_METHODS(SampleToGroup);
    405 
    406   uint32 grouping_type;
    407   uint32 grouping_type_parameter;  // Version 1 only.
    408   std::vector<SampleToGroupEntry> entries;
    409 };
    410 
    411 struct MEDIA_EXPORT TrackFragment : Box {
    412   DECLARE_BOX_METHODS(TrackFragment);
    413 
    414   TrackFragmentHeader header;
    415   std::vector<TrackFragmentRun> runs;
    416   TrackFragmentDecodeTime decode_time;
    417   SampleAuxiliaryInformationOffset auxiliary_offset;
    418   SampleAuxiliaryInformationSize auxiliary_size;
    419   IndependentAndDisposableSamples sdtp;
    420   SampleGroupDescription sample_group_description;
    421   SampleToGroup sample_to_group;
    422 };
    423 
    424 struct MEDIA_EXPORT MovieFragment : Box {
    425   DECLARE_BOX_METHODS(MovieFragment);
    426 
    427   MovieFragmentHeader header;
    428   std::vector<TrackFragment> tracks;
    429   std::vector<ProtectionSystemSpecificHeader> pssh;
    430 };
    431 
    432 #undef DECLARE_BOX
    433 
    434 }  // namespace mp4
    435 }  // namespace media
    436 
    437 #endif  // MEDIA_FORMATS_MP4_BOX_DEFINITIONS_H_
    438