diff --git a/docs/annotated.html b/docs/annotated.html index 04bcdef014..e42d49f07c 100644 --- a/docs/annotated.html +++ b/docs/annotated.html @@ -134,73 +134,74 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); |||oCVideoSampleEntry |||oCElementaryStreamDescriptor |||oCDTSSpecific -|||oCAudioSampleEntry -|||oCWebVTTConfigurationBox -|||oCWebVTTSourceLabelBox -|||oCWVTTSampleEntry -|||oCSampleDescription -|||oCDecodingTime -|||oCDecodingTimeToSample -|||oCCompositionOffset -|||oCCompositionTimeToSample -|||oCChunkInfo -|||oCSampleToChunk -|||oCSampleSize -|||oCCompactSampleSize -|||oCChunkLargeOffset -|||oCChunkOffset -|||oCSyncSample -|||oCSampleTable -|||oCMediaHeader -|||oCVideoMediaHeader -|||oCSoundMediaHeader -|||oCSubtitleMediaHeader -|||oCDataEntryUrl -|||oCDataReference -|||oCDataInformation -|||oCMediaInformation -|||oCMedia -|||oCTrack -|||oCMovieExtendsHeader -|||oCTrackExtends -|||oCMovieExtends -|||oCMovie -|||oCTrackFragmentDecodeTime -|||oCMovieFragmentHeader -|||oCTrackFragmentHeader -|||oCTrackFragmentRun -|||oCSampleToGroupEntry -|||oCSampleToGroup -|||oCCencSampleEncryptionInfoEntry -|||oCSampleGroupDescription -|||oCTrackFragment -|||oCMovieFragment -|||oCSegmentReference -|||oCSegmentIndex -|||oCMediaData -|||oCCueSourceIDBox -|||oCCueTimeBox -|||oCCueIDBox -|||oCCueSettingsBox -|||oCCuePayloadBox -|||oCVTTEmptyCueBox -|||oCVTTAdditionalTextBox -|||oCVTTCueBox -|||oCBoxReaderClass for reading MP4 boxes -|||oCChunkInfoIterator -|||oCCompositionOffsetIterator -|||oCDecodingTimeIterator -|||oCEncryptingFragmenterEncryptingFragmenter generates MP4 fragments with sample encrypted -|||oCESDescriptor -|||oCFragmenter -|||oCKeyRotationFragmenter -|||oCMP4MediaParser -|||oCMP4Muxer -|||oCMultiSegmentSegmenter -|||oCSegmenter -|||oCSingleSegmentSegmenter -|||oCSyncSampleIterator -|||\CTrackRunIterator +|||oCAC3Specific +|||oCAudioSampleEntry +|||oCWebVTTConfigurationBox +|||oCWebVTTSourceLabelBox +|||oCWVTTSampleEntry +|||oCSampleDescription +|||oCDecodingTime +|||oCDecodingTimeToSample +|||oCCompositionOffset +|||oCCompositionTimeToSample +|||oCChunkInfo +|||oCSampleToChunk +|||oCSampleSize +|||oCCompactSampleSize +|||oCChunkLargeOffset +|||oCChunkOffset +|||oCSyncSample +|||oCSampleTable +|||oCMediaHeader +|||oCVideoMediaHeader +|||oCSoundMediaHeader +|||oCSubtitleMediaHeader +|||oCDataEntryUrl +|||oCDataReference +|||oCDataInformation +|||oCMediaInformation +|||oCMedia +|||oCTrack +|||oCMovieExtendsHeader +|||oCTrackExtends +|||oCMovieExtends +|||oCMovie +|||oCTrackFragmentDecodeTime +|||oCMovieFragmentHeader +|||oCTrackFragmentHeader +|||oCTrackFragmentRun +|||oCSampleToGroupEntry +|||oCSampleToGroup +|||oCCencSampleEncryptionInfoEntry +|||oCSampleGroupDescription +|||oCTrackFragment +|||oCMovieFragment +|||oCSegmentReference +|||oCSegmentIndex +|||oCMediaData +|||oCCueSourceIDBox +|||oCCueTimeBox +|||oCCueIDBox +|||oCCueSettingsBox +|||oCCuePayloadBox +|||oCVTTEmptyCueBox +|||oCVTTAdditionalTextBox +|||oCVTTCueBox +|||oCBoxReaderClass for reading MP4 boxes +|||oCChunkInfoIterator +|||oCCompositionOffsetIterator +|||oCDecodingTimeIterator +|||oCEncryptingFragmenterEncryptingFragmenter generates MP4 fragments with sample encrypted +|||oCESDescriptor +|||oCFragmenter +|||oCKeyRotationFragmenter +|||oCMP4MediaParser +|||oCMP4Muxer +|||oCMultiSegmentSegmenter +|||oCSegmenter +|||oCSingleSegmentSegmenter +|||oCSyncSampleIterator +|||\CTrackRunIterator ||oNwebm |||oCMultiSegmentSegmenter |||oCSegmenter @@ -335,7 +336,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/classes.html b/docs/classes.html index b2224bf887..6fcdf0a607 100644 --- a/docs/classes.html +++ b/docs/classes.html @@ -89,87 +89,90 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
A | B | C | D | E | F | H | I | K | L | M | O | P | R | S | T | U | V | W | X
- - - - - - - - - - - - - - + + + + + + + + + - + + + + + + + - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - + + + - - - + + + + + + + + + + +
  A  
-
DataReference (edash_packager::media::mp4)   
  L  
-
ProtectionSystemSpecificHeader (edash_packager::media::mp4)   TrackFragment (edash_packager::media::mp4)   
DecodingTime (edash_packager::media::mp4)   
  R  
-
TrackFragmentDecodeTime (edash_packager::media::mp4)   
AACAudioSpecificConfig (edash_packager::media::mp4)   DecodingTimeIterator (edash_packager::media::mp4)   Language (edash_packager::media::mp4)   TrackFragmentHeader (edash_packager::media::mp4)   
AdaptationSet (edash_packager)   DecodingTimeToSample (edash_packager::media::mp4)   LibcryptoThreading (edash_packager::media)   Representation (edash_packager)   TrackFragmentRun (edash_packager::media::mp4)   
AdaptationSetXmlNode (edash_packager::xml)   DecryptConfig (edash_packager::media)   LocalFile (edash_packager::media)   RepresentationBaseXmlNode (edash_packager::xml)   TrackHeader (edash_packager::media::mp4)   
AdtsHeader (edash_packager::media::mp2t)   DecryptorSource (edash_packager::media)   
  M  
-
RepresentationStateChangeListener (edash_packager)   TrackRunIterator (edash_packager::media::mp4)   
AesCbcCtsDecryptor (edash_packager::media)   Demuxer (edash_packager::media)   RepresentationXmlNode (edash_packager::xml)   TracksBuilder (edash_packager::media)   
AesCbcCtsEncryptor (edash_packager::media)   DemuxStreamIdMediaSample (edash_packager::media::wvm)   Media (edash_packager::media::mp4)   RequestSigner (edash_packager::media)   TsPacket (edash_packager::media::mp2t)   
AesCbcPkcs5Decryptor (edash_packager::media)   DTSSpecific (edash_packager::media::mp4)   MediaData (edash_packager::media::mp4)   RsaPrivateKey (edash_packager::media)   TsSection (edash_packager::media::mp2t)   
AesCbcPkcs5Encryptor (edash_packager::media)   
  E  
-
MediaHeader (edash_packager::media::mp4)   RsaPublicKey (edash_packager::media)   TsSectionPat (edash_packager::media::mp2t)   
AesCtrEncryptor (edash_packager::media)   MediaInformation (edash_packager::media::mp4)   RsaRequestSigner (edash_packager::media)   TsSectionPes (edash_packager::media::mp2t)   
AesRequestSigner (edash_packager::media)   Edit (edash_packager::media::mp4)   MediaParser (edash_packager::media)   
  S  
-
TsSectionPmt (edash_packager::media::mp2t)   
AudioSampleEntry (edash_packager::media::mp4)   EditList (edash_packager::media::mp4)   MediaSample (edash_packager::media)   TsSectionPsi (edash_packager::media::mp2t)   
AudioStreamInfo (edash_packager::media)   EditListEntry (edash_packager::media::mp4)   MediaStream (edash_packager::media)   SampleAuxiliaryInformationOffset (edash_packager::media::mp4)   TwoPassSingleSegmentSegmenter (edash_packager::media::webm)   
AudioTimestampHelper (edash_packager::media)   Element (edash_packager)   MemoryFile (edash_packager::media)   SampleAuxiliaryInformationSize (edash_packager::media::mp4)   
  U  
+
DataReference (edash_packager::media::mp4)   LibcryptoThreading (edash_packager::media)   RepresentationBaseXmlNode (edash_packager::xml)   TrackRunIterator (edash_packager::media::mp4)   
DecodingTime (edash_packager::media::mp4)   LocalFile (edash_packager::media)   RepresentationStateChangeListener (edash_packager)   TracksBuilder (edash_packager::media)   
AACAudioSpecificConfig (edash_packager::media::mp4)   DecodingTimeIterator (edash_packager::media::mp4)   
  M  
+
RepresentationXmlNode (edash_packager::xml)   TsPacket (edash_packager::media::mp2t)   
AC3Specific (edash_packager::media::mp4)   DecodingTimeToSample (edash_packager::media::mp4)   RequestSigner (edash_packager::media)   TsSection (edash_packager::media::mp2t)   
AdaptationSet (edash_packager)   DecryptConfig (edash_packager::media)   Media (edash_packager::media::mp4)   RsaPrivateKey (edash_packager::media)   TsSectionPat (edash_packager::media::mp2t)   
AdaptationSetXmlNode (edash_packager::xml)   DecryptorSource (edash_packager::media)   MediaData (edash_packager::media::mp4)   RsaPublicKey (edash_packager::media)   TsSectionPes (edash_packager::media::mp2t)   
AdtsHeader (edash_packager::media::mp2t)   Demuxer (edash_packager::media)   MediaHeader (edash_packager::media::mp4)   RsaRequestSigner (edash_packager::media)   TsSectionPmt (edash_packager::media::mp2t)   
AesCbcCtsDecryptor (edash_packager::media)   DemuxStreamIdMediaSample (edash_packager::media::wvm)   MediaInformation (edash_packager::media::mp4)   
  S  
+
TsSectionPsi (edash_packager::media::mp2t)   
AesCbcCtsEncryptor (edash_packager::media)   DTSSpecific (edash_packager::media::mp4)   MediaParser (edash_packager::media)   TwoPassSingleSegmentSegmenter (edash_packager::media::webm)   
AesCbcPkcs5Decryptor (edash_packager::media)   
  E  
+
MediaSample (edash_packager::media)   SampleAuxiliaryInformationOffset (edash_packager::media::mp4)   
  U  
AVCDecoderConfiguration (edash_packager::media)   ElementaryStreamDescriptor (edash_packager::media::mp4)   Metadata (edash_packager::media::mp4)   SampleDescription (edash_packager::media::mp4)   
AesCbcPkcs5Encryptor (edash_packager::media)   MediaStream (edash_packager::media)   SampleAuxiliaryInformationSize (edash_packager::media::mp4)   
AesCtrEncryptor (edash_packager::media)   Edit (edash_packager::media::mp4)   MemoryFile (edash_packager::media)   SampleDescription (edash_packager::media::mp4)   UdpFile (edash_packager::media)   
AesRequestSigner (edash_packager::media)   EditList (edash_packager::media::mp4)   Metadata (edash_packager::media::mp4)   SampleEncryption (edash_packager::media::mp4)   
  V  
+
AudioSampleEntry (edash_packager::media::mp4)   EditListEntry (edash_packager::media::mp4)   MkvWriter (edash_packager::media)   SampleEncryptionEntry (edash_packager::media::mp4)   
AudioStreamInfo (edash_packager::media)   Element (edash_packager)   MockAdaptationSet (edash_packager)   SampleGroupDescription (edash_packager::media::mp4)   VideoMediaHeader (edash_packager::media::mp4)   
AudioTimestampHelper (edash_packager::media)   ElementaryStreamDescriptor (edash_packager::media::mp4)   MockMpdBuilder (edash_packager)   SampleSize (edash_packager::media::mp4)   VideoSampleEntry (edash_packager::media::mp4)   
AVCDecoderConfiguration (edash_packager::media)   EncryptingFragmenter (edash_packager::media::mp4)   MockMpdNotifier (edash_packager)   SampleTable (edash_packager::media::mp4)   VideoStreamInfo (edash_packager::media)   
  B  
-
EncryptingFragmenter (edash_packager::media::mp4)   MkvWriter (edash_packager::media)   SampleEncryption (edash_packager::media::mp4)   UdpFile (edash_packager::media)   
EncryptionKey (edash_packager::media)   MockAdaptationSet (edash_packager)   SampleEncryptionEntry (edash_packager::media::mp4)   
  V  
-
BandwidthEstimator   ESDescriptor (edash_packager::media::mp4)   MockMpdBuilder (edash_packager)   SampleGroupDescription (edash_packager::media::mp4)   
BitReader (edash_packager::media)   EsParser (edash_packager::media::mp2t)   MockMpdNotifier (edash_packager)   SampleSize (edash_packager::media::mp4)   VideoMediaHeader (edash_packager::media::mp4)   
Box (edash_packager::media::mp4)   EsParserAdts (edash_packager::media::mp2t)   MockRepresentation (edash_packager)   SampleTable (edash_packager::media::mp4)   VideoSampleEntry (edash_packager::media::mp4)   
BoxBuffer (edash_packager::media::mp4)   EsParserH264 (edash_packager::media::mp2t)   Movie (edash_packager::media::mp4)   SampleToChunk (edash_packager::media::mp4)   VideoStreamInfo (edash_packager::media)   
BoxReader (edash_packager::media::mp4)   
  F  
-
MovieExtends (edash_packager::media::mp4)   SampleToGroup (edash_packager::media::mp4)   VideoStreamInfoParameters (edash_packager::media)   
BufferReader (edash_packager::media)   MovieExtendsHeader (edash_packager::media::mp4)   SampleToGroupEntry (edash_packager::media::mp4)   VodMediaInfoDumpMuxerListener (edash_packager::media)   
BufferWriter (edash_packager::media)   File (edash_packager::media)   MovieFragment (edash_packager::media::mp4)   SchemeInfo (edash_packager::media::mp4)   VP8Parser (edash_packager::media)   
ByteQueue (edash_packager::media)   FileCloser (edash_packager::media)   MovieFragmentHeader (edash_packager::media::mp4)   SchemeType (edash_packager::media::mp4)   VP9Parser (edash_packager::media)   
EncryptionKey (edash_packager::media)   MockRepresentation (edash_packager)   SampleToChunk (edash_packager::media::mp4)   VideoStreamInfoParameters (edash_packager::media)   
ESDescriptor (edash_packager::media::mp4)   Movie (edash_packager::media::mp4)   SampleToGroup (edash_packager::media::mp4)   VodMediaInfoDumpMuxerListener (edash_packager::media)   
BandwidthEstimator   EsParser (edash_packager::media::mp2t)   MovieExtends (edash_packager::media::mp4)   SampleToGroupEntry (edash_packager::media::mp4)   VP8Parser (edash_packager::media)   
BitReader (edash_packager::media)   EsParserAdts (edash_packager::media::mp2t)   MovieExtendsHeader (edash_packager::media::mp4)   SchemeInfo (edash_packager::media::mp4)   VP9Parser (edash_packager::media)   
Box (edash_packager::media::mp4)   EsParserH264 (edash_packager::media::mp2t)   MovieFragment (edash_packager::media::mp4)   SchemeType (edash_packager::media::mp4)   VPCodecConfiguration (edash_packager::media)   
BoxBuffer (edash_packager::media::mp4)   
  F  
+
MovieFragmentHeader (edash_packager::media::mp4)   SeekHead (edash_packager::media)   VPxFrameInfo (edash_packager::media)   
BoxReader (edash_packager::media::mp4)   MovieHeader (edash_packager::media::mp4)   Segmenter (edash_packager::media::webm)   VPxParser (edash_packager::media)   
BufferReader (edash_packager::media)   File (edash_packager::media)   Mp2tMediaParser (edash_packager::media::mp2t)   Segmenter (edash_packager::media::mp4)   VTTAdditionalTextBox (edash_packager::media::mp4)   
BufferWriter (edash_packager::media)   FileCloser (edash_packager::media)   MP4MediaParser (edash_packager::media::mp4)   SegmentIndex (edash_packager::media::mp4)   VTTCueBox (edash_packager::media::mp4)   
ByteQueue (edash_packager::media)   FileType (edash_packager::media::mp4)   MP4Muxer (edash_packager::media::mp4)   SegmentInfo (edash_packager)   VTTEmptyCueBox (edash_packager::media::mp4)   
  C  
-
FileType (edash_packager::media::mp4)   MovieHeader (edash_packager::media::mp4)   SeekHead (edash_packager::media)   VPCodecConfiguration (edash_packager::media)   
Fragmenter (edash_packager::media::mp4)   Mp2tMediaParser (edash_packager::media::mp2t)   Segmenter (edash_packager::media::webm)   VPxFrameInfo (edash_packager::media)   
CencSampleEncryptionInfoEntry (edash_packager::media::mp4)   FullBox (edash_packager::media::mp4)   MP4MediaParser (edash_packager::media::mp4)   Segmenter (edash_packager::media::mp4)   VPxParser (edash_packager::media)   
ChunkInfo (edash_packager::media::mp4)   
  H  
-
MP4Muxer (edash_packager::media::mp4)   SegmentIndex (edash_packager::media::mp4)   VTTAdditionalTextBox (edash_packager::media::mp4)   
ChunkInfoIterator (edash_packager::media::mp4)   MpdBuilder (edash_packager)   SegmentInfo (edash_packager)   VTTCueBox (edash_packager::media::mp4)   
ChunkLargeOffset (edash_packager::media::mp4)   H264BitReader (edash_packager::media)   MpdNotifier (edash_packager)   SegmentReference (edash_packager::media::mp4)   VTTEmptyCueBox (edash_packager::media::mp4)   
ChunkOffset (edash_packager::media::mp4)   H264ByteToUnitStreamConverter (edash_packager::media)   MpdNotifierFactory (edash_packager)   SegmentTestBase (edash_packager::media)   
  W  
+
Fragmenter (edash_packager::media::mp4)   MpdBuilder (edash_packager)   SegmentReference (edash_packager::media::mp4)   
  W  
ClosureThread (edash_packager::media)   H264DecRefPicMarking (edash_packager::media)   MpdNotifyMuxerListener (edash_packager::media)   SegmentType (edash_packager::media::mp4)   
Cluster (edash_packager::media)   H264ModificationOfPicNum (edash_packager::media)   MpdOptions (edash_packager)   SimpleMpdNotifier (edash_packager)   WebMAudioClient (edash_packager::media)   
ClusterBuilder (edash_packager::media)   H264NALU (edash_packager::media)   MpdWriter (edash_packager)   SingleSegmentSegmenter (edash_packager::media::webm)   WebMClusterParser (edash_packager::media)   
SegmentTestBase::ClusterParser (edash_packager::media)   H264Parser (edash_packager::media)   MultiSegmentSegmenter (edash_packager::media::webm)   SingleSegmentSegmenter (edash_packager::media::mp4)   WebMContentEncodingsClient (edash_packager::media)   
CodecConfigurationRecord (edash_packager::media::mp4)   H264PPS (edash_packager::media)   MultiSegmentSegmenter (edash_packager::media::mp4)   SoundMediaHeader (edash_packager::media::mp4)   WebMInfoParser (edash_packager::media)   
CompactSampleSize (edash_packager::media::mp4)   H264SEIMessage (edash_packager::media)   Muxer (edash_packager::media)   Status (edash_packager::media)   WebMListParser (edash_packager::media)   
CompositionOffset (edash_packager::media::mp4)   H264SEIRecoveryPoint (edash_packager::media)   MuxerListener (edash_packager::media)   StreamDescriptor (edash_packager::media)   WebMMediaParser (edash_packager::media)   
CompositionOffsetIterator (edash_packager::media::mp4)   H264SliceHeader (edash_packager::media)   MuxerOptions (edash_packager::media)   StreamDescriptorCompareFn (edash_packager::media)   WebMMuxer (edash_packager::media::webm)   
CompositionTimeToSample (edash_packager::media::mp4)   H264SPS (edash_packager::media)   
  O  
-
StreamInfo (edash_packager::media)   WebMParserClient (edash_packager::media)   
ContentEncoding (edash_packager::media)   H264WeightingFactors (edash_packager::media)   SubsampleEntry (edash_packager::media)   WebMTracksParser (edash_packager::media)   
ContentProtectionElement (edash_packager)   HandlerReference (edash_packager::media::mp4)   OffsetByteQueue (edash_packager::media)   SubtitleMediaHeader (edash_packager::media::mp4)   WebMVideoClient (edash_packager::media)   
Cue (edash_packager::media)   HEVCDecoderConfiguration (edash_packager::media)   OnMediaEndParameters (edash_packager::media)   SyncSample (edash_packager::media::mp4)   WebMWebVTTParser (edash_packager::media)   
CueIDBox (edash_packager::media::mp4)   HttpKeyFetcher (edash_packager::media)   OpusPacket (edash_packager::media)   SyncSampleIterator (edash_packager::media::mp4)   WebVTTConfigurationBox (edash_packager::media::mp4)   
CuePayloadBox (edash_packager::media::mp4)   
  I  
-
OriginalFormat (edash_packager::media::mp4)   
  T  
-
WebVttMediaParser (edash_packager::media)   
CueSettingsBox (edash_packager::media::mp4)   
  P  
+
FullBox (edash_packager::media::mp4)   MpdNotifier (edash_packager)   SegmentTestBase (edash_packager::media)   
CencSampleEncryptionInfoEntry (edash_packager::media::mp4)   
  H  
+
MpdNotifierFactory (edash_packager)   SegmentType (edash_packager::media::mp4)   WebMAudioClient (edash_packager::media)   
ChunkInfo (edash_packager::media::mp4)   MpdNotifyMuxerListener (edash_packager::media)   SimpleMpdNotifier (edash_packager)   WebMClusterParser (edash_packager::media)   
ChunkInfoIterator (edash_packager::media::mp4)   H264BitReader (edash_packager::media)   MpdOptions (edash_packager)   SingleSegmentSegmenter (edash_packager::media::mp4)   WebMContentEncodingsClient (edash_packager::media)   
ChunkLargeOffset (edash_packager::media::mp4)   H264ByteToUnitStreamConverter (edash_packager::media)   MpdWriter (edash_packager)   SingleSegmentSegmenter (edash_packager::media::webm)   WebMInfoParser (edash_packager::media)   
ChunkOffset (edash_packager::media::mp4)   H264DecRefPicMarking (edash_packager::media)   MultiSegmentSegmenter (edash_packager::media::mp4)   SoundMediaHeader (edash_packager::media::mp4)   WebMListParser (edash_packager::media)   
ClosureThread (edash_packager::media)   H264ModificationOfPicNum (edash_packager::media)   MultiSegmentSegmenter (edash_packager::media::webm)   Status (edash_packager::media)   WebMMediaParser (edash_packager::media)   
Cluster (edash_packager::media)   H264NALU (edash_packager::media)   Muxer (edash_packager::media)   StreamDescriptor (edash_packager::media)   WebMMuxer (edash_packager::media::webm)   
ClusterBuilder (edash_packager::media)   H264Parser (edash_packager::media)   MuxerListener (edash_packager::media)   StreamDescriptorCompareFn (edash_packager::media)   WebMParserClient (edash_packager::media)   
SegmentTestBase::ClusterParser (edash_packager::media)   H264PPS (edash_packager::media)   MuxerOptions (edash_packager::media)   StreamInfo (edash_packager::media)   WebMTracksParser (edash_packager::media)   
CodecConfigurationRecord (edash_packager::media::mp4)   H264SEIMessage (edash_packager::media)   
  O  
+
SubsampleEntry (edash_packager::media)   WebMVideoClient (edash_packager::media)   
CompactSampleSize (edash_packager::media::mp4)   H264SEIRecoveryPoint (edash_packager::media)   SubtitleMediaHeader (edash_packager::media::mp4)   WebMWebVTTParser (edash_packager::media)   
CompositionOffset (edash_packager::media::mp4)   H264SliceHeader (edash_packager::media)   OffsetByteQueue (edash_packager::media)   SyncSample (edash_packager::media::mp4)   WebVTTConfigurationBox (edash_packager::media::mp4)   
CompositionOffsetIterator (edash_packager::media::mp4)   H264SPS (edash_packager::media)   OnMediaEndParameters (edash_packager::media)   SyncSampleIterator (edash_packager::media::mp4)   WebVttMediaParser (edash_packager::media)   
CompositionTimeToSample (edash_packager::media::mp4)   H264WeightingFactors (edash_packager::media)   OpusPacket (edash_packager::media)   
  T  
WebVTTSourceLabelBox (edash_packager::media::mp4)   
CueSourceIDBox (edash_packager::media::mp4)   ID3v2 (edash_packager::media::mp4)   TextStreamInfo (edash_packager::media)   WidevineKeySource (edash_packager::media)   
CueTimeBox (edash_packager::media::mp4)   IoCache (edash_packager::media)   PixelAspectRatio (edash_packager::media::mp4)   TextTrack (edash_packager::media)   WvmMediaParser (edash_packager::media::wvm)   
  D  
-
  K  
-
PrevSampleData (edash_packager::media::wvm)   TextTrackConfig (edash_packager::media)   WVTTSampleEntry (edash_packager::media::mp4)   
PrivFrame (edash_packager::media::mp4)   ThreadedIoFile (edash_packager::media)   
  X  
+
ContentEncoding (edash_packager::media)   HandlerReference (edash_packager::media::mp4)   OriginalFormat (edash_packager::media::mp4)   WidevineKeySource (edash_packager::media)   
ContentProtectionElement (edash_packager)   HEVCDecoderConfiguration (edash_packager::media)   
  P  
+
TextStreamInfo (edash_packager::media)   WvmMediaParser (edash_packager::media::wvm)   
Cue (edash_packager::media)   HttpKeyFetcher (edash_packager::media)   TextTrack (edash_packager::media)   WVTTSampleEntry (edash_packager::media::mp4)   
CueIDBox (edash_packager::media::mp4)   
  I  
+
PixelAspectRatio (edash_packager::media::mp4)   TextTrackConfig (edash_packager::media)   
  X  
DashIopMpdNotifier (edash_packager)   KeyFetcher (edash_packager::media)   ProducerConsumerQueue (edash_packager::media)   Track (edash_packager::media::mp4)   
DataEntryUrl (edash_packager::media::mp4)   KeyRotationFragmenter (edash_packager::media::mp4)   ProgressListener (edash_packager::media)   TrackEncryption (edash_packager::media::mp4)   XmlDeleter (edash_packager::xml)   
DataInformation (edash_packager::media::mp4)   KeySource (edash_packager::media)   ProtectionSchemeInfo (edash_packager::media::mp4)   TrackExtends (edash_packager::media::mp4)   XmlNode (edash_packager::xml)   
CuePayloadBox (edash_packager::media::mp4)   PrevSampleData (edash_packager::media::wvm)   ThreadedIoFile (edash_packager::media)   
CueSettingsBox (edash_packager::media::mp4)   ID3v2 (edash_packager::media::mp4)   PrivFrame (edash_packager::media::mp4)   Track (edash_packager::media::mp4)   XmlDeleter (edash_packager::xml)   
CueSourceIDBox (edash_packager::media::mp4)   IoCache (edash_packager::media)   ProducerConsumerQueue (edash_packager::media)   TrackEncryption (edash_packager::media::mp4)   XmlNode (edash_packager::xml)   
CueTimeBox (edash_packager::media::mp4)   
  K  
+
ProgressListener (edash_packager::media)   TrackExtends (edash_packager::media::mp4)   
  D  
+
ProtectionSchemeInfo (edash_packager::media::mp4)   TrackFragment (edash_packager::media::mp4)   
KeyFetcher (edash_packager::media)   ProtectionSystemSpecificHeader (edash_packager::media::mp4)   TrackFragmentDecodeTime (edash_packager::media::mp4)   
DashIopMpdNotifier (edash_packager)   KeyRotationFragmenter (edash_packager::media::mp4)   
  R  
+
TrackFragmentHeader (edash_packager::media::mp4)   
DataEntryUrl (edash_packager::media::mp4)   KeySource (edash_packager::media)   TrackFragmentRun (edash_packager::media::mp4)   
DataInformation (edash_packager::media::mp4)   
  L  
+
Representation (edash_packager)   TrackHeader (edash_packager::media::mp4)   
Language (edash_packager::media::mp4)   
A | B | C | D | E | F | H | I | K | L | M | O | P | R | S | T | U | V | W | X
diff --git a/docs/d0/d03/classedash__packager_1_1media_1_1webm_1_1SingleSegmentSegmenter.html b/docs/d0/d03/classedash__packager_1_1media_1_1webm_1_1SingleSegmentSegmenter.html index 55c4368f42..3879599292 100644 --- a/docs/d0/d03/classedash__packager_1_1media_1_1webm_1_1SingleSegmentSegmenter.html +++ b/docs/d0/d03/classedash__packager_1_1media_1_1webm_1_1SingleSegmentSegmenter.html @@ -290,7 +290,7 @@ double cluster_length_sec< diff --git a/docs/d0/d06/mpd__flags_8cc_source.html b/docs/d0/d06/mpd__flags_8cc_source.html index 8af5e544cb..f33527d32c 100644 --- a/docs/d0/d06/mpd__flags_8cc_source.html +++ b/docs/d0/d06/mpd__flags_8cc_source.html @@ -148,7 +148,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d08/structedash__packager_1_1media_1_1mp4_1_1CodecConfigurationRecord-members.html b/docs/d0/d08/structedash__packager_1_1media_1_1mp4_1_1CodecConfigurationRecord-members.html index 4d89b79b9a..b14a1f66fb 100644 --- a/docs/d0/d08/structedash__packager_1_1media_1_1mp4_1_1CodecConfigurationRecord-members.html +++ b/docs/d0/d08/structedash__packager_1_1media_1_1mp4_1_1CodecConfigurationRecord-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d0e/muxer__options_8h_source.html b/docs/d0/d0e/muxer__options_8h_source.html index f739f4f159..f97f254ad8 100644 --- a/docs/d0/d0e/muxer__options_8h_source.html +++ b/docs/d0/d0e/muxer__options_8h_source.html @@ -149,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d0e/structedash__packager_1_1media_1_1StreamDescriptor-members.html b/docs/d0/d0e/structedash__packager_1_1media_1_1StreamDescriptor-members.html index 94207e19fc..04a26e7cad 100644 --- a/docs/d0/d0e/structedash__packager_1_1media_1_1StreamDescriptor-members.html +++ b/docs/d0/d0e/structedash__packager_1_1media_1_1StreamDescriptor-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d1a/structedash__packager_1_1media_1_1mp4_1_1ChunkOffset-members.html b/docs/d0/d1a/structedash__packager_1_1media_1_1mp4_1_1ChunkOffset-members.html index 125ac585f1..7e52b6455e 100644 --- a/docs/d0/d1a/structedash__packager_1_1media_1_1mp4_1_1ChunkOffset-members.html +++ b/docs/d0/d1a/structedash__packager_1_1media_1_1mp4_1_1ChunkOffset-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d24/structedash__packager_1_1media_1_1H264DecRefPicMarking-members.html b/docs/d0/d24/structedash__packager_1_1media_1_1H264DecRefPicMarking-members.html index 1a335d9eb0..84c2fbef62 100644 --- a/docs/d0/d24/structedash__packager_1_1media_1_1H264DecRefPicMarking-members.html +++ b/docs/d0/d24/structedash__packager_1_1media_1_1H264DecRefPicMarking-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d28/classedash__packager_1_1media_1_1mp4_1_1MultiSegmentSegmenter-members.html b/docs/d0/d28/classedash__packager_1_1media_1_1mp4_1_1MultiSegmentSegmenter-members.html index 4fdfcbb6b4..538d3a79ea 100644 --- a/docs/d0/d28/classedash__packager_1_1media_1_1mp4_1_1MultiSegmentSegmenter-members.html +++ b/docs/d0/d28/classedash__packager_1_1media_1_1mp4_1_1MultiSegmentSegmenter-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d30/mock__mpd__notifier_8h_source.html b/docs/d0/d30/mock__mpd__notifier_8h_source.html index e6723f9d6e..f8cc7d96c6 100644 --- a/docs/d0/d30/mock__mpd__notifier_8h_source.html +++ b/docs/d0/d30/mock__mpd__notifier_8h_source.html @@ -148,7 +148,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d32/mp2t__common_8h_source.html b/docs/d0/d32/mp2t__common_8h_source.html index df80ad3a4c..5b3bcd32a9 100644 --- a/docs/d0/d32/mp2t__common_8h_source.html +++ b/docs/d0/d32/mp2t__common_8h_source.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d35/es__descriptor_8cc_source.html b/docs/d0/d35/es__descriptor_8cc_source.html index 1d7f7c4cfd..19fc6fd6f9 100644 --- a/docs/d0/d35/es__descriptor_8cc_source.html +++ b/docs/d0/d35/es__descriptor_8cc_source.html @@ -286,7 +286,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d3a/classedash__packager_1_1media_1_1SeekHead-members.html b/docs/d0/d3a/classedash__packager_1_1media_1_1SeekHead-members.html index af36793f8c..637cdb054c 100644 --- a/docs/d0/d3a/classedash__packager_1_1media_1_1SeekHead-members.html +++ b/docs/d0/d3a/classedash__packager_1_1media_1_1SeekHead-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d3a/classedash__packager_1_1xml_1_1RepresentationBaseXmlNode-members.html b/docs/d0/d3a/classedash__packager_1_1xml_1_1RepresentationBaseXmlNode-members.html index 8560e2b35e..2cffe6e8bc 100644 --- a/docs/d0/d3a/classedash__packager_1_1xml_1_1RepresentationBaseXmlNode-members.html +++ b/docs/d0/d3a/classedash__packager_1_1xml_1_1RepresentationBaseXmlNode-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d3a/webm__constants_8h_source.html b/docs/d0/d3a/webm__constants_8h_source.html index 81a8d575c5..bca35e5269 100644 --- a/docs/d0/d3a/webm__constants_8h_source.html +++ b/docs/d0/d3a/webm__constants_8h_source.html @@ -313,7 +313,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d42/widevine__encryption__flags_8cc_source.html b/docs/d0/d42/widevine__encryption__flags_8cc_source.html index bbe91b8ab1..2a6b0bd725 100644 --- a/docs/d0/d42/widevine__encryption__flags_8cc_source.html +++ b/docs/d0/d42/widevine__encryption__flags_8cc_source.html @@ -244,7 +244,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d43/structedash__packager_1_1media_1_1H264SPS-members.html b/docs/d0/d43/structedash__packager_1_1media_1_1H264SPS-members.html index 2c9852d134..297b8959d4 100644 --- a/docs/d0/d43/structedash__packager_1_1media_1_1H264SPS-members.html +++ b/docs/d0/d43/structedash__packager_1_1media_1_1H264SPS-members.html @@ -142,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d46/fourccs_8h_source.html b/docs/d0/d46/fourccs_8h_source.html index 4f82f41fe6..c9ebaad27b 100644 --- a/docs/d0/d46/fourccs_8h_source.html +++ b/docs/d0/d46/fourccs_8h_source.html @@ -105,136 +105,137 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
16  FOURCC_NULL = 0,
17  FOURCC_ID32 = 0x49443332,
18  FOURCC_PRIV = 0x50524956,
-
19  FOURCC_AVC1 = 0x61766331,
-
20  FOURCC_AVCC = 0x61766343,
-
21  FOURCC_BLOC = 0x626C6F63,
-
22  FOURCC_CENC = 0x63656e63,
-
23  FOURCC_CO64 = 0x636f3634,
-
24  FOURCC_CTTS = 0x63747473,
-
25  FOURCC_DASH = 0x64617368,
-
26  FOURCC_DDTS = 0x64647473,
-
27  FOURCC_DINF = 0x64696e66,
-
28  FOURCC_DREF = 0x64726566,
-
29  FOURCC_DTSC = 0x64747363,
-
30  FOURCC_DTSE = 0x64747365,
-
31  FOURCC_DTSH = 0x64747368,
-
32  FOURCC_DTSL = 0x6474736c,
-
33  FOURCC_DTSM = 0x6474732d,
-
34  FOURCC_DTSP = 0x6474732b,
-
35  FOURCC_EAC3 = 0x65632d33,
-
36  FOURCC_EDTS = 0x65647473,
-
37  FOURCC_ELST = 0x656c7374,
-
38  FOURCC_ENCA = 0x656e6361,
-
39  FOURCC_ENCV = 0x656e6376,
-
40  FOURCC_ESDS = 0x65736473,
-
41  FOURCC_FREE = 0x66726565,
-
42  FOURCC_FRMA = 0x66726d61,
-
43  FOURCC_FTYP = 0x66747970,
-
44  FOURCC_HDLR = 0x68646c72,
-
45  FOURCC_HEV1 = 0x68657631,
-
46  FOURCC_HINT = 0x68696e74,
-
47  FOURCC_HVC1 = 0x68766331,
-
48  FOURCC_HVCC = 0x68766343,
-
49  FOURCC_ISO6 = 0x69736f36,
-
50  FOURCC_IODS = 0x696f6473,
-
51  FOURCC_MDAT = 0x6d646174,
-
52  FOURCC_MDHD = 0x6d646864,
-
53  FOURCC_MDIA = 0x6d646961,
-
54  FOURCC_MECO = 0x6d65636f,
-
55  FOURCC_MEHD = 0x6d656864,
-
56  FOURCC_META = 0x6d657461,
-
57  FOURCC_MFHD = 0x6d666864,
-
58  FOURCC_MFRA = 0x6d667261,
-
59  FOURCC_MINF = 0x6d696e66,
-
60  FOURCC_MOOF = 0x6d6f6f66,
-
61  FOURCC_MOOV = 0x6d6f6f76,
-
62  FOURCC_MP41 = 0x6d703431,
-
63  FOURCC_MP4A = 0x6d703461,
-
64  FOURCC_MP4V = 0x6d703476,
-
65  FOURCC_MVEX = 0x6d766578,
-
66  FOURCC_MVHD = 0x6d766864,
-
67  FOURCC_PASP = 0x70617370,
-
68  FOURCC_PDIN = 0x7064696e,
-
69  FOURCC_PRFT = 0x70726674,
-
70  FOURCC_PSSH = 0x70737368,
-
71  FOURCC_SAIO = 0x7361696f,
-
72  FOURCC_SAIZ = 0x7361697a,
-
73  FOURCC_SBGP = 0x73626770,
-
74  FOURCC_SCHI = 0x73636869,
-
75  FOURCC_SCHM = 0x7363686d,
-
76  FOURCC_SDTP = 0x73647470,
-
77  FOURCC_SEIG = 0x73656967,
-
78  FOURCC_SENC = 0x73656e63,
-
79  FOURCC_SGPD = 0x73677064,
-
80  FOURCC_SIDX = 0x73696478,
-
81  FOURCC_SINF = 0x73696e66,
-
82  FOURCC_SKIP = 0x736b6970,
-
83  FOURCC_SMHD = 0x736d6864,
-
84  FOURCC_SOUN = 0x736f756e,
-
85  FOURCC_SSIX = 0x73736978,
-
86  FOURCC_STBL = 0x7374626c,
-
87  FOURCC_STCO = 0x7374636f,
-
88  FOURCC_STSC = 0x73747363,
-
89  FOURCC_STSD = 0x73747364,
-
90  FOURCC_STSS = 0x73747373,
-
91  FOURCC_STSZ = 0x7374737a,
-
92  FOURCC_STTS = 0x73747473,
-
93  FOURCC_STYP = 0x73747970,
-
94  FOURCC_STZ2 = 0x73747a32,
-
95  FOURCC_SUBT = 0x73756274,
-
96  FOURCC_TENC = 0x74656e63,
-
97  FOURCC_TEXT = 0x74657874,
-
98  FOURCC_TFDT = 0x74666474,
-
99  FOURCC_TFHD = 0x74666864,
-
100  FOURCC_TKHD = 0x746b6864,
-
101  FOURCC_TRAF = 0x74726166,
-
102  FOURCC_TRAK = 0x7472616b,
-
103  FOURCC_TREX = 0x74726578,
-
104  FOURCC_TRUN = 0x7472756e,
-
105  FOURCC_UDTA = 0x75647461,
-
106  FOURCC_URL = 0x75726c20,
-
107  FOURCC_URN = 0x75726e20,
-
108  FOURCC_UUID = 0x75756964,
-
109  FOURCC_VIDE = 0x76696465,
-
110  FOURCC_VMHD = 0x766d6864,
-
111  FOURCC_VP08 = 0x76703038,
-
112  FOURCC_VP09 = 0x76703039,
-
113  FOURCC_VP10 = 0x76703130,
-
114  FOURCC_VPCC = 0x76706343,
-
115  FOURCC_WIDE = 0x77696465,
-
116  FOURCC_ctim = 0x6374696d,
-
117  FOURCC_iden = 0x6964656e,
-
118  FOURCC_payl = 0x7061796c,
-
119  FOURCC_sthd = 0x73746864,
-
120  FOURCC_sttg = 0x73747467,
-
121  FOURCC_vlab = 0x766c6162,
-
122  FOURCC_vsid = 0x76736964,
-
123  FOURCC_vttC = 0x76747443,
-
124  FOURCC_vtta = 0x76747461,
-
125  FOURCC_vttc = 0x76747463,
-
126  FOURCC_vtte = 0x76747465,
-
127  FOURCC_wvtt = 0x77767474,
-
128 };
-
129 
-
130 const inline std::string FourCCToString(FourCC fourcc) {
-
131  char buf[5];
-
132  buf[0] = (fourcc >> 24) & 0xff;
-
133  buf[1] = (fourcc >> 16) & 0xff;
-
134  buf[2] = (fourcc >> 8) & 0xff;
-
135  buf[3] = (fourcc) & 0xff;
-
136  buf[4] = 0;
-
137  return std::string(buf);
-
138 }
-
139 
-
140 } // namespace mp4
-
141 } // namespace media
-
142 } // namespace edash_packager
-
143 
-
144 #endif // MEDIA_FORMATS_MP4_FOURCCS_H_
+
19  FOURCC_AC3 = 0x61632d33, // This fourcc is "ac-3".
+
20  FOURCC_AVC1 = 0x61766331,
+
21  FOURCC_AVCC = 0x61766343,
+
22  FOURCC_BLOC = 0x626C6F63,
+
23  FOURCC_CENC = 0x63656e63,
+
24  FOURCC_CO64 = 0x636f3634,
+
25  FOURCC_CTTS = 0x63747473,
+
26  FOURCC_DAC3 = 0x64616333,
+
27  FOURCC_DASH = 0x64617368,
+
28  FOURCC_DDTS = 0x64647473,
+
29  FOURCC_DINF = 0x64696e66,
+
30  FOURCC_DREF = 0x64726566,
+
31  FOURCC_DTSC = 0x64747363,
+
32  FOURCC_DTSE = 0x64747365,
+
33  FOURCC_DTSH = 0x64747368,
+
34  FOURCC_DTSL = 0x6474736c,
+
35  FOURCC_DTSM = 0x6474732d,
+
36  FOURCC_DTSP = 0x6474732b,
+
37  FOURCC_EDTS = 0x65647473,
+
38  FOURCC_ELST = 0x656c7374,
+
39  FOURCC_ENCA = 0x656e6361,
+
40  FOURCC_ENCV = 0x656e6376,
+
41  FOURCC_ESDS = 0x65736473,
+
42  FOURCC_FREE = 0x66726565,
+
43  FOURCC_FRMA = 0x66726d61,
+
44  FOURCC_FTYP = 0x66747970,
+
45  FOURCC_HDLR = 0x68646c72,
+
46  FOURCC_HEV1 = 0x68657631,
+
47  FOURCC_HINT = 0x68696e74,
+
48  FOURCC_HVC1 = 0x68766331,
+
49  FOURCC_HVCC = 0x68766343,
+
50  FOURCC_ISO6 = 0x69736f36,
+
51  FOURCC_IODS = 0x696f6473,
+
52  FOURCC_MDAT = 0x6d646174,
+
53  FOURCC_MDHD = 0x6d646864,
+
54  FOURCC_MDIA = 0x6d646961,
+
55  FOURCC_MECO = 0x6d65636f,
+
56  FOURCC_MEHD = 0x6d656864,
+
57  FOURCC_META = 0x6d657461,
+
58  FOURCC_MFHD = 0x6d666864,
+
59  FOURCC_MFRA = 0x6d667261,
+
60  FOURCC_MINF = 0x6d696e66,
+
61  FOURCC_MOOF = 0x6d6f6f66,
+
62  FOURCC_MOOV = 0x6d6f6f76,
+
63  FOURCC_MP41 = 0x6d703431,
+
64  FOURCC_MP4A = 0x6d703461,
+
65  FOURCC_MP4V = 0x6d703476,
+
66  FOURCC_MVEX = 0x6d766578,
+
67  FOURCC_MVHD = 0x6d766864,
+
68  FOURCC_PASP = 0x70617370,
+
69  FOURCC_PDIN = 0x7064696e,
+
70  FOURCC_PRFT = 0x70726674,
+
71  FOURCC_PSSH = 0x70737368,
+
72  FOURCC_SAIO = 0x7361696f,
+
73  FOURCC_SAIZ = 0x7361697a,
+
74  FOURCC_SBGP = 0x73626770,
+
75  FOURCC_SCHI = 0x73636869,
+
76  FOURCC_SCHM = 0x7363686d,
+
77  FOURCC_SDTP = 0x73647470,
+
78  FOURCC_SEIG = 0x73656967,
+
79  FOURCC_SENC = 0x73656e63,
+
80  FOURCC_SGPD = 0x73677064,
+
81  FOURCC_SIDX = 0x73696478,
+
82  FOURCC_SINF = 0x73696e66,
+
83  FOURCC_SKIP = 0x736b6970,
+
84  FOURCC_SMHD = 0x736d6864,
+
85  FOURCC_SOUN = 0x736f756e,
+
86  FOURCC_SSIX = 0x73736978,
+
87  FOURCC_STBL = 0x7374626c,
+
88  FOURCC_STCO = 0x7374636f,
+
89  FOURCC_STSC = 0x73747363,
+
90  FOURCC_STSD = 0x73747364,
+
91  FOURCC_STSS = 0x73747373,
+
92  FOURCC_STSZ = 0x7374737a,
+
93  FOURCC_STTS = 0x73747473,
+
94  FOURCC_STYP = 0x73747970,
+
95  FOURCC_STZ2 = 0x73747a32,
+
96  FOURCC_SUBT = 0x73756274,
+
97  FOURCC_TENC = 0x74656e63,
+
98  FOURCC_TEXT = 0x74657874,
+
99  FOURCC_TFDT = 0x74666474,
+
100  FOURCC_TFHD = 0x74666864,
+
101  FOURCC_TKHD = 0x746b6864,
+
102  FOURCC_TRAF = 0x74726166,
+
103  FOURCC_TRAK = 0x7472616b,
+
104  FOURCC_TREX = 0x74726578,
+
105  FOURCC_TRUN = 0x7472756e,
+
106  FOURCC_UDTA = 0x75647461,
+
107  FOURCC_URL = 0x75726c20,
+
108  FOURCC_URN = 0x75726e20,
+
109  FOURCC_UUID = 0x75756964,
+
110  FOURCC_VIDE = 0x76696465,
+
111  FOURCC_VMHD = 0x766d6864,
+
112  FOURCC_VP08 = 0x76703038,
+
113  FOURCC_VP09 = 0x76703039,
+
114  FOURCC_VP10 = 0x76703130,
+
115  FOURCC_VPCC = 0x76706343,
+
116  FOURCC_WIDE = 0x77696465,
+
117  FOURCC_ctim = 0x6374696d,
+
118  FOURCC_iden = 0x6964656e,
+
119  FOURCC_payl = 0x7061796c,
+
120  FOURCC_sthd = 0x73746864,
+
121  FOURCC_sttg = 0x73747467,
+
122  FOURCC_vlab = 0x766c6162,
+
123  FOURCC_vsid = 0x76736964,
+
124  FOURCC_vttC = 0x76747443,
+
125  FOURCC_vtta = 0x76747461,
+
126  FOURCC_vttc = 0x76747463,
+
127  FOURCC_vtte = 0x76747465,
+
128  FOURCC_wvtt = 0x77767474,
+
129 };
+
130 
+
131 const inline std::string FourCCToString(FourCC fourcc) {
+
132  char buf[5];
+
133  buf[0] = (fourcc >> 24) & 0xff;
+
134  buf[1] = (fourcc >> 16) & 0xff;
+
135  buf[2] = (fourcc >> 8) & 0xff;
+
136  buf[3] = (fourcc) & 0xff;
+
137  buf[4] = 0;
+
138  return std::string(buf);
+
139 }
+
140 
+
141 } // namespace mp4
+
142 } // namespace media
+
143 } // namespace edash_packager
+
144 
+
145 #endif // MEDIA_FORMATS_MP4_FOURCCS_H_
diff --git a/docs/d0/d49/vod__media__info__dump__muxer__listener_8cc_source.html b/docs/d0/d49/vod__media__info__dump__muxer__listener_8cc_source.html index cc1864cc5a..87854a48cc 100644 --- a/docs/d0/d49/vod__media__info__dump__muxer__listener_8cc_source.html +++ b/docs/d0/d49/vod__media__info__dump__muxer__listener_8cc_source.html @@ -234,7 +234,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d4a/structedash__packager_1_1media_1_1mp4_1_1SampleSize-members.html b/docs/d0/d4a/structedash__packager_1_1media_1_1mp4_1_1SampleSize-members.html index 32be51abd5..bf7a671ab5 100644 --- a/docs/d0/d4a/structedash__packager_1_1media_1_1mp4_1_1SampleSize-members.html +++ b/docs/d0/d4a/structedash__packager_1_1media_1_1mp4_1_1SampleSize-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d4c/structedash__packager_1_1media_1_1mp4_1_1CueTimeBox-members.html b/docs/d0/d4c/structedash__packager_1_1media_1_1mp4_1_1CueTimeBox-members.html index 07b0c093cc..a9caeaada6 100644 --- a/docs/d0/d4c/structedash__packager_1_1media_1_1mp4_1_1CueTimeBox-members.html +++ b/docs/d0/d4c/structedash__packager_1_1media_1_1mp4_1_1CueTimeBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d4e/libcrypto__threading_8cc_source.html b/docs/d0/d4e/libcrypto__threading_8cc_source.html index ef1ba635cd..db59dbb6ad 100644 --- a/docs/d0/d4e/libcrypto__threading_8cc_source.html +++ b/docs/d0/d4e/libcrypto__threading_8cc_source.html @@ -143,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d5b/structedash__packager_1_1media_1_1mp4_1_1VTTAdditionalTextBox-members.html b/docs/d0/d5b/structedash__packager_1_1media_1_1mp4_1_1VTTAdditionalTextBox-members.html index acf4370d0a..cd7c8758ff 100644 --- a/docs/d0/d5b/structedash__packager_1_1media_1_1mp4_1_1VTTAdditionalTextBox-members.html +++ b/docs/d0/d5b/structedash__packager_1_1media_1_1mp4_1_1VTTAdditionalTextBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d65/structedash__packager_1_1media_1_1mp4_1_1AC3Specific.html b/docs/d0/d65/structedash__packager_1_1media_1_1mp4_1_1AC3Specific.html new file mode 100644 index 0000000000..34a2402df0 --- /dev/null +++ b/docs/d0/d65/structedash__packager_1_1media_1_1mp4_1_1AC3Specific.html @@ -0,0 +1,181 @@ + + + + + + +DASH Media Packaging SDK: edash_packager::media::mp4::AC3Specific Struct Reference + + + + + + + + + +
+
+ + + + + + +
+
DASH Media Packaging SDK +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+ +
+
edash_packager::media::mp4::AC3Specific Struct Reference
+
+
+
+Inheritance diagram for edash_packager::media::mp4::AC3Specific:
+
+
+ + +edash_packager::media::mp4::Box + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

FourCC BoxType () const override
 
- Public Member Functions inherited from edash_packager::media::mp4::Box
bool Parse (BoxReader *reader)
 
void Write (BufferWriter *writer)
 
void WriteHeader (BufferWriter *writer)
 
uint32_t ComputeSize ()
 
virtual uint32_t HeaderSize () const
 
uint32_t box_size ()
 
+ + + +

+Public Attributes

+std::vector< uint8_t > data
 
+ + + + +

+Additional Inherited Members

- Protected Member Functions inherited from edash_packager::media::mp4::Box
virtual bool ReadWriteHeaderInternal (BoxBuffer *buffer)
 
+

Detailed Description

+
+

Definition at line 312 of file box_definitions.h.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
FourCC edash_packager::media::mp4::AC3Specific::BoxType () const
+
+overridevirtual
+
+
Returns
box type.
+ +

Implements edash_packager::media::mp4::Box.

+ +

Definition at line 1422 of file box_definitions.cc.

+ +
+
+
The documentation for this struct was generated from the following files: +
+ + + + diff --git a/docs/d0/d65/structedash__packager_1_1media_1_1mp4_1_1AC3Specific.png b/docs/d0/d65/structedash__packager_1_1media_1_1mp4_1_1AC3Specific.png new file mode 100644 index 0000000000..725a29c3e9 Binary files /dev/null and b/docs/d0/d65/structedash__packager_1_1media_1_1mp4_1_1AC3Specific.png differ diff --git a/docs/d0/d7d/classedash__packager_1_1media_1_1H264Parser-members.html b/docs/d0/d7d/classedash__packager_1_1media_1_1H264Parser-members.html index ea03fa28ee..263ba23493 100644 --- a/docs/d0/d7d/classedash__packager_1_1media_1_1H264Parser-members.html +++ b/docs/d0/d7d/classedash__packager_1_1media_1_1H264Parser-members.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d7d/decryptor__source_8h_source.html b/docs/d0/d7d/decryptor__source_8h_source.html index 811e6a0fd9..5dc16ff00c 100644 --- a/docs/d0/d7d/decryptor__source_8h_source.html +++ b/docs/d0/d7d/decryptor__source_8h_source.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d86/structedash__packager_1_1media_1_1EncryptionKey.html b/docs/d0/d86/structedash__packager_1_1media_1_1EncryptionKey.html index 3a4fa27f59..f40b923c06 100644 --- a/docs/d0/d86/structedash__packager_1_1media_1_1EncryptionKey.html +++ b/docs/d0/d86/structedash__packager_1_1media_1_1EncryptionKey.html @@ -119,7 +119,7 @@ std::vector< uint8_t >  diff --git a/docs/d0/d92/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html b/docs/d0/d92/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html index afb30a966b..05a2d823a5 100644 --- a/docs/d0/d92/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html +++ b/docs/d0/d92/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html @@ -145,7 +145,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 561 of file box_definitions.h.

+

Definition at line 568 of file box_definitions.h.

Member Function Documentation

@@ -171,7 +171,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 1884 of file box_definitions.cc.

+

Definition at line 1905 of file box_definitions.cc.

@@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d0/d93/structedash__packager_1_1media_1_1mp4_1_1SampleTable-members.html b/docs/d0/d93/structedash__packager_1_1media_1_1mp4_1_1SampleTable-members.html index 6341531207..3bed9a4953 100644 --- a/docs/d0/d93/structedash__packager_1_1media_1_1mp4_1_1SampleTable-members.html +++ b/docs/d0/d93/structedash__packager_1_1media_1_1mp4_1_1SampleTable-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/d96/structedash__packager_1_1ContentProtectionElement.html b/docs/d0/d96/structedash__packager_1_1ContentProtectionElement.html index 003ebc8948..947708f945 100644 --- a/docs/d0/d96/structedash__packager_1_1ContentProtectionElement.html +++ b/docs/d0/d96/structedash__packager_1_1ContentProtectionElement.html @@ -123,7 +123,7 @@ std::vector< diff --git a/docs/d0/d96/structedash__packager_1_1media_1_1mp4_1_1WebVTTSourceLabelBox-members.html b/docs/d0/d96/structedash__packager_1_1media_1_1mp4_1_1WebVTTSourceLabelBox-members.html index 3a2b53d670..f17f9439c9 100644 --- a/docs/d0/d96/structedash__packager_1_1media_1_1mp4_1_1WebVTTSourceLabelBox-members.html +++ b/docs/d0/d96/structedash__packager_1_1media_1_1mp4_1_1WebVTTSourceLabelBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/da4/classedash__packager_1_1media_1_1WebMVideoClient-members.html b/docs/d0/da4/classedash__packager_1_1media_1_1WebMVideoClient-members.html index b12608798c..5983861d90 100644 --- a/docs/d0/da4/classedash__packager_1_1media_1_1WebMVideoClient-members.html +++ b/docs/d0/da4/classedash__packager_1_1media_1_1WebMVideoClient-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/da6/stream__descriptor_8cc_source.html b/docs/d0/da6/stream__descriptor_8cc_source.html index b108336ce2..8d59c5fd4a 100644 --- a/docs/d0/da6/stream__descriptor_8cc_source.html +++ b/docs/d0/da6/stream__descriptor_8cc_source.html @@ -243,7 +243,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/da9/classedash__packager_1_1MockRepresentation.html b/docs/d0/da9/classedash__packager_1_1MockRepresentation.html index ca46236974..098d31d77c 100644 --- a/docs/d0/da9/classedash__packager_1_1MockRepresentation.html +++ b/docs/d0/da9/classedash__packager_1_1MockRepresentation.html @@ -133,8 +133,22 @@ Public Member Functions   xml::scoped_xml_ptr< xmlNode > GetXml ()   +void SuppressOnce (SuppressFlag flag) +  uint32_t id () const   + + + + + + + +

+Additional Inherited Members

- Public Types inherited from edash_packager::Representation
enum  SuppressFlag { kSuppressWidth = 1, +kSuppressHeight = 2, +kSuppressFrameRate = 4 + }
 
- Protected Member Functions inherited from edash_packager::Representation
 Representation (const MediaInfo &media_info, const MpdOptions &mpd_options, uint32_t representation_id, scoped_ptr< RepresentationStateChangeListener > state_change_listener)
 

Detailed Description

@@ -146,7 +160,7 @@ Public Member Functions
diff --git a/docs/d0/da9/classedash__packager_1_1media_1_1webm_1_1WebMMuxer-members.html b/docs/d0/da9/classedash__packager_1_1media_1_1webm_1_1WebMMuxer-members.html index 792230dda1..82a49668ed 100644 --- a/docs/d0/da9/classedash__packager_1_1media_1_1webm_1_1WebMMuxer-members.html +++ b/docs/d0/da9/classedash__packager_1_1media_1_1webm_1_1WebMMuxer-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/dae/classedash__packager_1_1media_1_1BufferWriter-members.html b/docs/d0/dae/classedash__packager_1_1media_1_1BufferWriter-members.html index cf509755a9..425a3c70c4 100644 --- a/docs/d0/dae/classedash__packager_1_1media_1_1BufferWriter-members.html +++ b/docs/d0/dae/classedash__packager_1_1media_1_1BufferWriter-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/db7/structedash__packager_1_1media_1_1mp4_1_1DTSSpecific.html b/docs/d0/db7/structedash__packager_1_1media_1_1mp4_1_1DTSSpecific.html index f8e6d4d21f..9badd70044 100644 --- a/docs/d0/db7/structedash__packager_1_1media_1_1mp4_1_1DTSSpecific.html +++ b/docs/d0/db7/structedash__packager_1_1media_1_1mp4_1_1DTSSpecific.html @@ -174,7 +174,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 1388 of file box_definitions.cc.

+

Definition at line 1389 of file box_definitions.cc.

@@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/d0/dd1/classedash__packager_1_1SimpleMpdNotifier-members.html b/docs/d0/dd1/classedash__packager_1_1SimpleMpdNotifier-members.html index 15202d6a7c..1108b12e6c 100644 --- a/docs/d0/dd1/classedash__packager_1_1SimpleMpdNotifier-members.html +++ b/docs/d0/dd1/classedash__packager_1_1SimpleMpdNotifier-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/dd4/structedash__packager_1_1media_1_1SubsampleEntry-members.html b/docs/d0/dd4/structedash__packager_1_1media_1_1SubsampleEntry-members.html index b035863d95..e458e29b13 100644 --- a/docs/d0/dd4/structedash__packager_1_1media_1_1SubsampleEntry-members.html +++ b/docs/d0/dd4/structedash__packager_1_1media_1_1SubsampleEntry-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/dd6/webm__crypto__helpers_8cc_source.html b/docs/d0/dd6/webm__crypto__helpers_8cc_source.html index 8f25492315..66446962a1 100644 --- a/docs/d0/dd6/webm__crypto__helpers_8cc_source.html +++ b/docs/d0/dd6/webm__crypto__helpers_8cc_source.html @@ -157,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/ddc/structedash__packager_1_1media_1_1FileCloser.html b/docs/d0/ddc/structedash__packager_1_1media_1_1FileCloser.html index 9e6bebb11f..61b25e7823 100644 --- a/docs/d0/ddc/structedash__packager_1_1media_1_1FileCloser.html +++ b/docs/d0/ddc/structedash__packager_1_1media_1_1FileCloser.html @@ -112,7 +112,7 @@ void operator() ( diff --git a/docs/d0/de0/structedash__packager_1_1media_1_1mp4_1_1VideoSampleEntry-members.html b/docs/d0/de0/structedash__packager_1_1media_1_1mp4_1_1VideoSampleEntry-members.html index 08e82dc8f7..e2525d7214 100644 --- a/docs/d0/de0/structedash__packager_1_1media_1_1mp4_1_1VideoSampleEntry-members.html +++ b/docs/d0/de0/structedash__packager_1_1media_1_1mp4_1_1VideoSampleEntry-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/de4/structedash__packager_1_1media_1_1mp4_1_1MovieFragmentHeader-members.html b/docs/d0/de4/structedash__packager_1_1media_1_1mp4_1_1MovieFragmentHeader-members.html index 09622b6532..779678134c 100644 --- a/docs/d0/de4/structedash__packager_1_1media_1_1mp4_1_1MovieFragmentHeader-members.html +++ b/docs/d0/de4/structedash__packager_1_1media_1_1mp4_1_1MovieFragmentHeader-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/de6/classedash__packager_1_1media_1_1TracksBuilder.html b/docs/d0/de6/classedash__packager_1_1media_1_1TracksBuilder.html index 0ee6a9b6ce..9ee25ed13a 100644 --- a/docs/d0/de6/classedash__packager_1_1media_1_1TracksBuilder.html +++ b/docs/d0/de6/classedash__packager_1_1media_1_1TracksBuilder.html @@ -123,7 +123,7 @@ std::vector< uint8_t >  diff --git a/docs/d0/de8/structedash__packager_1_1media_1_1mp4_1_1VTTCueBox-members.html b/docs/d0/de8/structedash__packager_1_1media_1_1mp4_1_1VTTCueBox-members.html index 6a8dac5dfc..611117ffa0 100644 --- a/docs/d0/de8/structedash__packager_1_1media_1_1mp4_1_1VTTCueBox-members.html +++ b/docs/d0/de8/structedash__packager_1_1media_1_1mp4_1_1VTTCueBox-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/dea/structedash__packager_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader-members.html b/docs/d0/dea/structedash__packager_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader-members.html index 01f0c4ab41..121cb9a5b6 100644 --- a/docs/d0/dea/structedash__packager_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader-members.html +++ b/docs/d0/dea/structedash__packager_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/dee/segmenter__test__base_8h_source.html b/docs/d0/dee/segmenter__test__base_8h_source.html index ea709b7c5a..9e7c479a47 100644 --- a/docs/d0/dee/segmenter__test__base_8h_source.html +++ b/docs/d0/dee/segmenter__test__base_8h_source.html @@ -115,90 +115,102 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
26 namespace media {
27 
28 class SegmentTestBase : public ::testing::Test {
-
29  protected:
-
30  SegmentTestBase();
-
31 
-
32  void SetUp() override;
-
33  void TearDown() override;
-
34 
-
36  template <typename S>
-
37  void CreateAndInitializeSegmenter(const MuxerOptions& options,
-
38  StreamInfo* info,
-
39  scoped_ptr<webm::Segmenter>* result) const {
-
40  scoped_ptr<S> segmenter(new S(options));
+
29  public:
+
30  enum KeyFrameFlag {
+
31  kKeyFrame,
+
32  kNotKeyFrame,
+
33  };
+
34  enum SideDataFlag {
+
35  kGenerateSideData,
+
36  kNoSideData,
+
37  };
+
38 
+
39  protected:
+
40  SegmentTestBase();
41 
-
42  scoped_ptr<MkvWriter> writer(new MkvWriter());
-
43  ASSERT_OK(writer->Open(options.output_file_name));
-
44  ASSERT_OK(segmenter->Initialize(writer.Pass(), info, NULL, NULL, NULL));
-
45  *result = segmenter.Pass();
-
46  }
-
47 
-
49  scoped_refptr<MediaSample> CreateSample(bool is_key_frame, uint64_t duration);
-
51  MuxerOptions CreateMuxerOptions() const;
-
53  VideoStreamInfo* CreateVideoStreamInfo() const;
-
54 
-
56  std::string OutputFileName() const;
-
58  std::string TemplateFileName(int number) const;
-
59 
-
60  protected:
-
61  // A helper class used to determine the number of clusters and frames for a
-
62  // given WebM file.
-
63  class ClusterParser : private WebMParserClient {
-
64  public:
-
65  ClusterParser();
-
66  ~ClusterParser() override;
-
67 
-
68  // Make sure to use ASSERT_NO_FATAL_FAILURE.
-
69  void PopulateFromCluster(const std::string& file_name);
-
70  void PopulateFromSegment(const std::string& file_name);
+
42  void SetUp() override;
+
43  void TearDown() override;
+
44 
+
46  template <typename S>
+
47  void CreateAndInitializeSegmenter(const MuxerOptions& options,
+
48  StreamInfo* info,
+
49  scoped_ptr<webm::Segmenter>* result) const {
+
50  scoped_ptr<S> segmenter(new S(options));
+
51 
+
52  scoped_ptr<MkvWriter> writer(new MkvWriter());
+
53  ASSERT_OK(writer->Open(options.output_file_name));
+
54  ASSERT_OK(segmenter->Initialize(writer.Pass(), info, NULL, NULL, NULL));
+
55  *result = segmenter.Pass();
+
56  }
+
57 
+
59  scoped_refptr<MediaSample> CreateSample(KeyFrameFlag key_frame_flag,
+
60  uint64_t duration,
+
61  SideDataFlag side_data_flag);
+
63  MuxerOptions CreateMuxerOptions() const;
+
65  VideoStreamInfo* CreateVideoStreamInfo() const;
+
66 
+
68  std::string OutputFileName() const;
+
70  std::string TemplateFileName(int number) const;
71 
-
72  int GetFrameCountForCluster(size_t i) const;
-
73 
-
74  int cluster_count() const;
-
75 
-
76  private:
-
77  // WebMParserClient overrides.
-
78  WebMParserClient* OnListStart(int id) override;
-
79  bool OnListEnd(int id) override;
-
80  bool OnUInt(int id, int64_t val) override;
-
81  bool OnFloat(int id, double val) override;
-
82  bool OnBinary(int id, const uint8_t* data, int size) override;
-
83  bool OnString(int id, const std::string& str) override;
-
84 
-
85  private:
-
86  std::vector<int> cluster_sizes_;
-
87  bool in_cluster_;
-
88  };
-
89 
-
90  protected:
-
91  std::string output_file_name_;
-
92  std::string segment_template_;
-
93  uint64_t cur_time_timescale_;
-
94  bool single_segment_;
-
95 };
+
72  protected:
+
73  // A helper class used to determine the number of clusters and frames for a
+
74  // given WebM file.
+
75  class ClusterParser : private WebMParserClient {
+
76  public:
+
77  ClusterParser();
+
78  ~ClusterParser() override;
+
79 
+
80  // Make sure to use ASSERT_NO_FATAL_FAILURE.
+
81  void PopulateFromCluster(const std::string& file_name);
+
82  void PopulateFromSegment(const std::string& file_name);
+
83 
+
84  int GetFrameCountForCluster(size_t i) const;
+
85 
+
86  int cluster_count() const;
+
87 
+
88  private:
+
89  // WebMParserClient overrides.
+
90  WebMParserClient* OnListStart(int id) override;
+
91  bool OnListEnd(int id) override;
+
92  bool OnUInt(int id, int64_t val) override;
+
93  bool OnFloat(int id, double val) override;
+
94  bool OnBinary(int id, const uint8_t* data, int size) override;
+
95  bool OnString(int id, const std::string& str) override;
96 
-
97 } // namespace media
-
98 } // namespace edash_packager
-
99 
-
100 #endif // MEDIA_FORMATS_WEBM_SEGMENTER_TEST_UTILS_H_
+
97  private:
+
98  std::vector<int> cluster_sizes_;
+
99  bool in_cluster_;
+
100  };
+
101 
+
102  protected:
+
103  std::string output_file_name_;
+
104  std::string segment_template_;
+
105  uint64_t cur_time_timescale_;
+
106  bool single_segment_;
+
107 };
+
108 
+
109 } // namespace media
+
110 } // namespace edash_packager
+
111 
+
112 #endif // MEDIA_FORMATS_WEBM_SEGMENTER_TEST_UTILS_H_
std::string output_file_name
Definition: muxer_options.h:55
Definition: webm_parser.h:30
An implementation of IMkvWriter using our File type.
Definition: mkv_writer.h:21
-
std::string OutputFileName() const
Gets the file name of the current output file.
+
std::string OutputFileName() const
Gets the file name of the current output file.
Abstract class holds stream information.
Definition: stream_info.h:26
-
-
void CreateAndInitializeSegmenter(const MuxerOptions &options, StreamInfo *info, scoped_ptr< webm::Segmenter > *result) const
Creates a Segmenter of the given type and initializes it.
-
scoped_refptr< MediaSample > CreateSample(bool is_key_frame, uint64_t duration)
Creates a new media sample.
-
std::string TemplateFileName(int number) const
Gets the file name of the given template file.
-
VideoStreamInfo * CreateVideoStreamInfo() const
Creates a video stream info object for testing.
-
MuxerOptions CreateMuxerOptions() const
Creates a Muxer options object for testing.
+
+
void CreateAndInitializeSegmenter(const MuxerOptions &options, StreamInfo *info, scoped_ptr< webm::Segmenter > *result) const
Creates a Segmenter of the given type and initializes it.
+
std::string TemplateFileName(int number) const
Gets the file name of the given template file.
+
VideoStreamInfo * CreateVideoStreamInfo() const
Creates a video stream info object for testing.
+
MuxerOptions CreateMuxerOptions() const
Creates a Muxer options object for testing.
Holds video stream information.
This structure contains the list of configuration options for Muxer.
Definition: muxer_options.h:18
+
scoped_refptr< MediaSample > CreateSample(KeyFrameFlag key_frame_flag, uint64_t duration, SideDataFlag side_data_flag)
Creates a new media sample.
diff --git a/docs/d0/df3/packager__util_8cc_source.html b/docs/d0/df3/packager__util_8cc_source.html index b506d85cd2..be73f28d26 100644 --- a/docs/d0/df3/packager__util_8cc_source.html +++ b/docs/d0/df3/packager__util_8cc_source.html @@ -329,7 +329,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/df6/structedash__packager_1_1media_1_1mp4_1_1MovieExtends-members.html b/docs/d0/df6/structedash__packager_1_1media_1_1mp4_1_1MovieExtends-members.html index 6487ae4e63..a65938a958 100644 --- a/docs/d0/df6/structedash__packager_1_1media_1_1mp4_1_1MovieExtends-members.html +++ b/docs/d0/df6/structedash__packager_1_1media_1_1mp4_1_1MovieExtends-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d0/dfa/structedash__packager_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample.html b/docs/d0/dfa/structedash__packager_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample.html index f0caa2e69c..2a0a00ab25 100644 --- a/docs/d0/dfa/structedash__packager_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample.html +++ b/docs/d0/dfa/structedash__packager_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample.html @@ -116,7 +116,7 @@ scoped_refptr< diff --git a/docs/d1/d02/classedash__packager_1_1media_1_1mp4_1_1BoxBuffer-members.html b/docs/d1/d02/classedash__packager_1_1media_1_1mp4_1_1BoxBuffer-members.html index c87fe7cc01..354ccb8cea 100644 --- a/docs/d1/d02/classedash__packager_1_1media_1_1mp4_1_1BoxBuffer-members.html +++ b/docs/d1/d02/classedash__packager_1_1media_1_1mp4_1_1BoxBuffer-members.html @@ -121,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d13/status_8h_source.html b/docs/d1/d13/status_8h_source.html index 0ea79688de..6116800501 100644 --- a/docs/d1/d13/status_8h_source.html +++ b/docs/d1/d13/status_8h_source.html @@ -239,7 +239,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d16/structedash__packager_1_1xml_1_1XmlDeleter-members.html b/docs/d1/d16/structedash__packager_1_1xml_1_1XmlDeleter-members.html index 9ccd330576..496dc12482 100644 --- a/docs/d1/d16/structedash__packager_1_1xml_1_1XmlDeleter-members.html +++ b/docs/d1/d16/structedash__packager_1_1xml_1_1XmlDeleter-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d1c/two__pass__single__segment__segmenter_8cc_source.html b/docs/d1/d1c/two__pass__single__segment__segmenter_8cc_source.html index f045d66d27..bc739e3e03 100644 --- a/docs/d1/d1c/two__pass__single__segment__segmenter_8cc_source.html +++ b/docs/d1/d1c/two__pass__single__segment__segmenter_8cc_source.html @@ -275,7 +275,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d1d/muxer__flags_8cc_source.html b/docs/d1/d1d/muxer__flags_8cc_source.html index 2d60c39e0f..1f9bcd0bd5 100644 --- a/docs/d1/d1d/muxer__flags_8cc_source.html +++ b/docs/d1/d1d/muxer__flags_8cc_source.html @@ -143,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d27/key__fetcher_8h_source.html b/docs/d1/d27/key__fetcher_8h_source.html index d7d6a92dcc..a9c0c9d679 100644 --- a/docs/d1/d27/key__fetcher_8h_source.html +++ b/docs/d1/d27/key__fetcher_8h_source.html @@ -126,7 +126,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d28/classedash__packager_1_1media_1_1WebMTracksParser-members.html b/docs/d1/d28/classedash__packager_1_1media_1_1WebMTracksParser-members.html index 0f11d51256..120e5940db 100644 --- a/docs/d1/d28/classedash__packager_1_1media_1_1WebMTracksParser-members.html +++ b/docs/d1/d28/classedash__packager_1_1media_1_1WebMTracksParser-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d28/classedash__packager_1_1media_1_1mp4_1_1SyncSampleIterator-members.html b/docs/d1/d28/classedash__packager_1_1media_1_1mp4_1_1SyncSampleIterator-members.html index ceaed8b5ac..ca642719a3 100644 --- a/docs/d1/d28/classedash__packager_1_1media_1_1mp4_1_1SyncSampleIterator-members.html +++ b/docs/d1/d28/classedash__packager_1_1media_1_1mp4_1_1SyncSampleIterator-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d2a/structedash__packager_1_1media_1_1mp4_1_1TrackExtends-members.html b/docs/d1/d2a/structedash__packager_1_1media_1_1mp4_1_1TrackExtends-members.html index cf80e95336..9b61bf724c 100644 --- a/docs/d1/d2a/structedash__packager_1_1media_1_1mp4_1_1TrackExtends-members.html +++ b/docs/d1/d2a/structedash__packager_1_1media_1_1mp4_1_1TrackExtends-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d2f/webvtt__media__parser_8cc_source.html b/docs/d1/d2f/webvtt__media__parser_8cc_source.html index adde4415dc..888aba067f 100644 --- a/docs/d1/d2f/webvtt__media__parser_8cc_source.html +++ b/docs/d1/d2f/webvtt__media__parser_8cc_source.html @@ -484,7 +484,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d31/structedash__packager_1_1media_1_1mp4_1_1CodecConfigurationRecord.html b/docs/d1/d31/structedash__packager_1_1media_1_1mp4_1_1CodecConfigurationRecord.html index 2d58c552b5..eeb0564337 100644 --- a/docs/d1/d31/structedash__packager_1_1media_1_1mp4_1_1CodecConfigurationRecord.html +++ b/docs/d1/d31/structedash__packager_1_1media_1_1mp4_1_1CodecConfigurationRecord.html @@ -165,7 +165,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 1201 of file box_definitions.cc.

+

Definition at line 1202 of file box_definitions.cc.

@@ -176,7 +176,7 @@ Additional Inherited Members diff --git a/docs/d1/d37/es__parser__h264_8h_source.html b/docs/d1/d37/es__parser__h264_8h_source.html index 0edb5d75d5..3f320c8cb8 100644 --- a/docs/d1/d37/es__parser__h264_8h_source.html +++ b/docs/d1/d37/es__parser__h264_8h_source.html @@ -200,7 +200,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d38/classedash__packager_1_1MockRepresentation-members.html b/docs/d1/d38/classedash__packager_1_1MockRepresentation-members.html index 7a974103e5..c54d142264 100644 --- a/docs/d1/d38/classedash__packager_1_1MockRepresentation-members.html +++ b/docs/d1/d38/classedash__packager_1_1MockRepresentation-members.html @@ -98,20 +98,25 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); GetXml()edash_packager::Representation id() const edash_packager::Representationinline Init()edash_packager::Representation - MOCK_METHOD1(AddContentProtectionElement, void(const ContentProtectionElement &element)) (defined in edash_packager::MockRepresentation)edash_packager::MockRepresentation - MOCK_METHOD1(SetSampleDuration, void(uint32_t sample_duration)) (defined in edash_packager::MockRepresentation)edash_packager::MockRepresentation - MOCK_METHOD2(UpdateContentProtectionPssh, void(const std::string &drm_uuid, const std::string &pssh)) (defined in edash_packager::MockRepresentation)edash_packager::MockRepresentation - MOCK_METHOD3(AddNewSegment, void(uint64_t start_time, uint64_t duration, uint64_t size)) (defined in edash_packager::MockRepresentation)edash_packager::MockRepresentation - MockRepresentation(uint32_t representation_id) (defined in edash_packager::MockRepresentation)edash_packager::MockRepresentationexplicit - Representation(const MediaInfo &media_info, const MpdOptions &mpd_options, uint32_t representation_id, scoped_ptr< RepresentationStateChangeListener > state_change_listener)edash_packager::Representationprotected - SetSampleDuration(uint32_t sample_duration)edash_packager::Representationvirtual - UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)edash_packager::Representationvirtual - ~MockRepresentation() override (defined in edash_packager::MockRepresentation)edash_packager::MockRepresentation - ~Representation() (defined in edash_packager::Representation)edash_packager::Representationvirtual + kSuppressFrameRate enum value (defined in edash_packager::Representation)edash_packager::Representation + kSuppressHeight enum value (defined in edash_packager::Representation)edash_packager::Representation + kSuppressWidth enum value (defined in edash_packager::Representation)edash_packager::Representation + MOCK_METHOD1(AddContentProtectionElement, void(const ContentProtectionElement &element)) (defined in edash_packager::MockRepresentation)edash_packager::MockRepresentation + MOCK_METHOD1(SetSampleDuration, void(uint32_t sample_duration)) (defined in edash_packager::MockRepresentation)edash_packager::MockRepresentation + MOCK_METHOD2(UpdateContentProtectionPssh, void(const std::string &drm_uuid, const std::string &pssh)) (defined in edash_packager::MockRepresentation)edash_packager::MockRepresentation + MOCK_METHOD3(AddNewSegment, void(uint64_t start_time, uint64_t duration, uint64_t size)) (defined in edash_packager::MockRepresentation)edash_packager::MockRepresentation + MockRepresentation(uint32_t representation_id) (defined in edash_packager::MockRepresentation)edash_packager::MockRepresentationexplicit + Representation(const MediaInfo &media_info, const MpdOptions &mpd_options, uint32_t representation_id, scoped_ptr< RepresentationStateChangeListener > state_change_listener)edash_packager::Representationprotected + SetSampleDuration(uint32_t sample_duration)edash_packager::Representationvirtual + SuppressFlag enum name (defined in edash_packager::Representation)edash_packager::Representation + SuppressOnce(SuppressFlag flag)edash_packager::Representation + UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)edash_packager::Representationvirtual + ~MockRepresentation() override (defined in edash_packager::MockRepresentation)edash_packager::MockRepresentation + ~Representation() (defined in edash_packager::Representation)edash_packager::Representationvirtual diff --git a/docs/d1/d3b/mpd__generator__flags_8h_source.html b/docs/d1/d3b/mpd__generator__flags_8h_source.html index f956b2d726..1fe72ebb13 100644 --- a/docs/d1/d3b/mpd__generator__flags_8h_source.html +++ b/docs/d1/d3b/mpd__generator__flags_8h_source.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d45/decoding__time__iterator_8cc_source.html b/docs/d1/d45/decoding__time__iterator_8cc_source.html index cbd368b447..a6ec8ab2b1 100644 --- a/docs/d1/d45/decoding__time__iterator_8cc_source.html +++ b/docs/d1/d45/decoding__time__iterator_8cc_source.html @@ -163,12 +163,12 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
bool IsValid() const
bool AdvanceSample()
uint32_t NumSamples() const
-
+
uint64_t Duration(uint32_t start_sample, uint32_t end_sample) const
diff --git a/docs/d1/d48/text__track__config_8h_source.html b/docs/d1/d48/text__track__config_8h_source.html index a952908a48..dfb1f56e6e 100644 --- a/docs/d1/d48/text__track__config_8h_source.html +++ b/docs/d1/d48/text__track__config_8h_source.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d4b/classedash__packager_1_1media_1_1mp2t_1_1TsPacket.html b/docs/d1/d4b/classedash__packager_1_1media_1_1mp2t_1_1TsPacket.html index 3487eef899..19742828ed 100644 --- a/docs/d1/d4b/classedash__packager_1_1media_1_1mp2t_1_1TsPacket.html +++ b/docs/d1/d4b/classedash__packager_1_1media_1_1mp2t_1_1TsPacket.html @@ -145,7 +145,7 @@ static const int kPacketSi diff --git a/docs/d1/d4d/h264__bit__reader_8cc_source.html b/docs/d1/d4d/h264__bit__reader_8cc_source.html index 6e675e08d2..9923cdd873 100644 --- a/docs/d1/d4d/h264__bit__reader_8cc_source.html +++ b/docs/d1/d4d/h264__bit__reader_8cc_source.html @@ -205,7 +205,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d5d/structedash__packager_1_1MpdOptions.html b/docs/d1/d5d/structedash__packager_1_1MpdOptions.html index 83cb4d2709..16aeba8a47 100644 --- a/docs/d1/d5d/structedash__packager_1_1MpdOptions.html +++ b/docs/d1/d5d/structedash__packager_1_1MpdOptions.html @@ -130,7 +130,7 @@ std::string packager_versi diff --git a/docs/d1/d65/structedash__packager_1_1media_1_1mp4_1_1SampleToGroup.html b/docs/d1/d65/structedash__packager_1_1media_1_1mp4_1_1SampleToGroup.html index 3a0993f2af..f014abaf64 100644 --- a/docs/d1/d65/structedash__packager_1_1media_1_1mp4_1_1SampleToGroup.html +++ b/docs/d1/d65/structedash__packager_1_1media_1_1mp4_1_1SampleToGroup.html @@ -151,7 +151,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 633 of file box_definitions.h.

+

Definition at line 640 of file box_definitions.h.

Member Function Documentation

@@ -177,7 +177,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 2095 of file box_definitions.cc.

+

Definition at line 2116 of file box_definitions.cc.

@@ -188,7 +188,7 @@ Additional Inherited Members diff --git a/docs/d1/d70/vp8__parser_8cc_source.html b/docs/d1/d70/vp8__parser_8cc_source.html index 6f3cc8ed1a..fe83331cad 100644 --- a/docs/d1/d70/vp8__parser_8cc_source.html +++ b/docs/d1/d70/vp8__parser_8cc_source.html @@ -293,7 +293,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d72/language__utils_8cc_source.html b/docs/d1/d72/language__utils_8cc_source.html index e0fbc753d4..b3941453c7 100644 --- a/docs/d1/d72/language__utils_8cc_source.html +++ b/docs/d1/d72/language__utils_8cc_source.html @@ -206,7 +206,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d72/structedash__packager_1_1media_1_1mp4_1_1AudioSampleEntry-members.html b/docs/d1/d72/structedash__packager_1_1media_1_1mp4_1_1AudioSampleEntry-members.html index 57c2eeeb42..5162bb5182 100644 --- a/docs/d1/d72/structedash__packager_1_1media_1_1mp4_1_1AudioSampleEntry-members.html +++ b/docs/d1/d72/structedash__packager_1_1media_1_1mp4_1_1AudioSampleEntry-members.html @@ -99,25 +99,26 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); BoxType() const overrideedash_packager::media::mp4::AudioSampleEntryvirtual channelcount (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry ComputeSize()edash_packager::media::mp4::Box - data_reference_index (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry - ddts (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry - esds (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry - format (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry - GetActualFormat() const (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntryinline - HeaderSize() const edash_packager::media::mp4::Boxvirtual - Parse(BoxReader *reader)edash_packager::media::mp4::Box - ReadWriteHeaderInternal(BoxBuffer *buffer)edash_packager::media::mp4::Boxprotectedvirtual - samplerate (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry - samplesize (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry - sinf (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry - Write(BufferWriter *writer)edash_packager::media::mp4::Box - WriteHeader(BufferWriter *writer)edash_packager::media::mp4::Box - ~AudioSampleEntry() override (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry - ~Box() (defined in edash_packager::media::mp4::Box)edash_packager::media::mp4::Boxvirtual + dac3 (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry + data_reference_index (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry + ddts (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry + esds (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry + format (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry + GetActualFormat() const (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntryinline + HeaderSize() const edash_packager::media::mp4::Boxvirtual + Parse(BoxReader *reader)edash_packager::media::mp4::Box + ReadWriteHeaderInternal(BoxBuffer *buffer)edash_packager::media::mp4::Boxprotectedvirtual + samplerate (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry + samplesize (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry + sinf (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry + Write(BufferWriter *writer)edash_packager::media::mp4::Box + WriteHeader(BufferWriter *writer)edash_packager::media::mp4::Box + ~AudioSampleEntry() override (defined in edash_packager::media::mp4::AudioSampleEntry)edash_packager::media::mp4::AudioSampleEntry + ~Box() (defined in edash_packager::media::mp4::Box)edash_packager::media::mp4::Boxvirtual diff --git a/docs/d1/d72/structedash__packager_1_1media_1_1mp4_1_1PixelAspectRatio-members.html b/docs/d1/d72/structedash__packager_1_1media_1_1mp4_1_1PixelAspectRatio-members.html index 58fa681fe1..740fc16233 100644 --- a/docs/d1/d72/structedash__packager_1_1media_1_1mp4_1_1PixelAspectRatio-members.html +++ b/docs/d1/d72/structedash__packager_1_1media_1_1mp4_1_1PixelAspectRatio-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d74/mp2t__media__parser_8cc_source.html b/docs/d1/d74/mp2t__media__parser_8cc_source.html index 96f80f9ff6..c8a8a89118 100644 --- a/docs/d1/d74/mp2t__media__parser_8cc_source.html +++ b/docs/d1/d74/mp2t__media__parser_8cc_source.html @@ -528,7 +528,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d76/structedash__packager_1_1media_1_1mp4_1_1SampleToChunk-members.html b/docs/d1/d76/structedash__packager_1_1media_1_1mp4_1_1SampleToChunk-members.html index 6afdac55d9..8a652d11db 100644 --- a/docs/d1/d76/structedash__packager_1_1media_1_1mp4_1_1SampleToChunk-members.html +++ b/docs/d1/d76/structedash__packager_1_1media_1_1mp4_1_1SampleToChunk-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d78/classedash__packager_1_1media_1_1mp4_1_1MP4Muxer.html b/docs/d1/d78/classedash__packager_1_1media_1_1mp4_1_1MP4Muxer.html index 13a99d1ec5..b685b786e9 100644 --- a/docs/d1/d78/classedash__packager_1_1media_1_1mp4_1_1MP4Muxer.html +++ b/docs/d1/d78/classedash__packager_1_1media_1_1mp4_1_1MP4Muxer.html @@ -176,7 +176,7 @@ base::Clock * clock () diff --git a/docs/d1/d7d/webm__video__client_8cc_source.html b/docs/d1/d7d/webm__video__client_8cc_source.html index 4e6748e864..240659ac97 100644 --- a/docs/d1/d7d/webm__video__client_8cc_source.html +++ b/docs/d1/d7d/webm__video__client_8cc_source.html @@ -266,7 +266,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d7f/classedash__packager_1_1media_1_1BitReader-members.html b/docs/d1/d7f/classedash__packager_1_1media_1_1BitReader-members.html index 0307e36da1..cbd6f8ec5d 100644 --- a/docs/d1/d7f/classedash__packager_1_1media_1_1BitReader-members.html +++ b/docs/d1/d7f/classedash__packager_1_1media_1_1BitReader-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d81/structedash__packager_1_1media_1_1mp4_1_1SegmentIndex.html b/docs/d1/d81/structedash__packager_1_1media_1_1mp4_1_1SegmentIndex.html index 3ac1ffc1f9..c31de534f1 100644 --- a/docs/d1/d81/structedash__packager_1_1media_1_1mp4_1_1SegmentIndex.html +++ b/docs/d1/d81/structedash__packager_1_1media_1_1mp4_1_1SegmentIndex.html @@ -157,7 +157,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 701 of file box_definitions.h.

+

Definition at line 708 of file box_definitions.h.

Member Function Documentation

@@ -183,7 +183,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 2300 of file box_definitions.cc.

+

Definition at line 2321 of file box_definitions.cc.

@@ -194,7 +194,7 @@ Additional Inherited Members diff --git a/docs/d1/d82/adts__constants_8h_source.html b/docs/d1/d82/adts__constants_8h_source.html index eb4019f0f2..bd9dc5db93 100644 --- a/docs/d1/d82/adts__constants_8h_source.html +++ b/docs/d1/d82/adts__constants_8h_source.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d86/classedash__packager_1_1media_1_1RsaPublicKey.html b/docs/d1/d86/classedash__packager_1_1media_1_1RsaPublicKey.html index 662881c494..658bab89f0 100644 --- a/docs/d1/d86/classedash__packager_1_1media_1_1RsaPublicKey.html +++ b/docs/d1/d86/classedash__packager_1_1media_1_1RsaPublicKey.html @@ -218,7 +218,7 @@ Static Public Member Functions diff --git a/docs/d1/d86/structedash__packager_1_1media_1_1mp4_1_1SubtitleMediaHeader.html b/docs/d1/d86/structedash__packager_1_1media_1_1mp4_1_1SubtitleMediaHeader.html index 4f0581b6ce..d14d22fd33 100644 --- a/docs/d1/d86/structedash__packager_1_1media_1_1mp4_1_1SubtitleMediaHeader.html +++ b/docs/d1/d86/structedash__packager_1_1media_1_1mp4_1_1SubtitleMediaHeader.html @@ -138,7 +138,7 @@ uint32_t flags

Detailed Description

-

Definition at line 477 of file box_definitions.h.

+

Definition at line 484 of file box_definitions.h.

Member Function Documentation

@@ -164,7 +164,7 @@ uint32_t flagsImplements edash_packager::media::mp4::Box.

-

Definition at line 1607 of file box_definitions.cc.

+

Definition at line 1628 of file box_definitions.cc.

@@ -175,7 +175,7 @@ uint32_t flags diff --git a/docs/d1/d8e/structedash__packager_1_1media_1_1mp4_1_1CompositionTimeToSample-members.html b/docs/d1/d8e/structedash__packager_1_1media_1_1mp4_1_1CompositionTimeToSample-members.html index 8d20003761..7bc00b5860 100644 --- a/docs/d1/d8e/structedash__packager_1_1media_1_1mp4_1_1CompositionTimeToSample-members.html +++ b/docs/d1/d8e/structedash__packager_1_1media_1_1mp4_1_1CompositionTimeToSample-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/d8e/webm__audio__client_8cc_source.html b/docs/d1/d8e/webm__audio__client_8cc_source.html index a51d537fd5..65f338a4b5 100644 --- a/docs/d1/d8e/webm__audio__client_8cc_source.html +++ b/docs/d1/d8e/webm__audio__client_8cc_source.html @@ -204,14 +204,14 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
115 
116 } // namespace media
117 } // namespace edash_packager
-
Holds audio stream information.
+
Holds audio stream information.
void Reset()
Reset this object's state so it can process a new audio track element.
-
static std::string GetCodecString(AudioCodec codec, uint8_t audio_object_type)
+
static std::string GetCodecString(AudioCodec codec, uint8_t audio_object_type)
scoped_refptr< AudioStreamInfo > GetAudioStreamInfo(int64_t track_num, const std::string &codec_id, const std::vector< uint8_t > &codec_private, const std::string &language, bool is_encrypted)
diff --git a/docs/d1/d92/classedash__packager_1_1media_1_1OffsetByteQueue.html b/docs/d1/d92/classedash__packager_1_1media_1_1OffsetByteQueue.html index e6656011d6..d76a7ca33f 100644 --- a/docs/d1/d92/classedash__packager_1_1media_1_1OffsetByteQueue.html +++ b/docs/d1/d92/classedash__packager_1_1media_1_1OffsetByteQueue.html @@ -242,7 +242,7 @@ false if max_offset > diff --git a/docs/d1/d9d/tracks__builder_8h_source.html b/docs/d1/d9d/tracks__builder_8h_source.html index 86988eda81..e291821ff7 100644 --- a/docs/d1/d9d/tracks__builder_8h_source.html +++ b/docs/d1/d9d/tracks__builder_8h_source.html @@ -210,7 +210,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/dc3/classedash__packager_1_1media_1_1LocalFile-members.html b/docs/d1/dc3/classedash__packager_1_1media_1_1LocalFile-members.html index eabbee49b5..16ed8906ce 100644 --- a/docs/d1/dc3/classedash__packager_1_1media_1_1LocalFile-members.html +++ b/docs/d1/dc3/classedash__packager_1_1media_1_1LocalFile-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/dcb/encrypting__fragmenter_8h_source.html b/docs/d1/dcb/encrypting__fragmenter_8h_source.html index fd6e98b479..d41684d18b 100644 --- a/docs/d1/dcb/encrypting__fragmenter_8h_source.html +++ b/docs/d1/dcb/encrypting__fragmenter_8h_source.html @@ -175,13 +175,13 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
Status AddSample(scoped_refptr< MediaSample > sample) override
void FinalizeFragment() override
Finalize and optimize the fragment.
- +
virtual Status PrepareFragmentForEncryption(bool enable_encryption)
virtual void FinalizeFragmentForEncryption()
Finalize current fragment for encryption.
diff --git a/docs/d1/dcd/structedash__packager_1_1media_1_1mp4_1_1FileType.html b/docs/d1/dcd/structedash__packager_1_1media_1_1mp4_1_1FileType.html index fba8bd332c..4f6a5dccfa 100644 --- a/docs/d1/dcd/structedash__packager_1_1media_1_1mp4_1_1FileType.html +++ b/docs/d1/dcd/structedash__packager_1_1media_1_1mp4_1_1FileType.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d1/dd0/structedash__packager_1_1media_1_1mp4_1_1SampleToGroup-members.html b/docs/d1/dd0/structedash__packager_1_1media_1_1mp4_1_1SampleToGroup-members.html index 271e80171c..ff2ec54bd3 100644 --- a/docs/d1/dd0/structedash__packager_1_1media_1_1mp4_1_1SampleToGroup-members.html +++ b/docs/d1/dd0/structedash__packager_1_1media_1_1mp4_1_1SampleToGroup-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/dd5/classedash__packager_1_1xml_1_1RepresentationBaseXmlNode.html b/docs/d1/dd5/classedash__packager_1_1xml_1_1RepresentationBaseXmlNode.html index 5edf4a9153..12453f6684 100644 --- a/docs/d1/dd5/classedash__packager_1_1xml_1_1RepresentationBaseXmlNode.html +++ b/docs/d1/dd5/classedash__packager_1_1xml_1_1RepresentationBaseXmlNode.html @@ -156,7 +156,7 @@ Protected Member Functions diff --git a/docs/d1/ddc/classedash__packager_1_1media_1_1VP9Parser-members.html b/docs/d1/ddc/classedash__packager_1_1media_1_1VP9Parser-members.html index 272384719c..7e1dbeaa10 100644 --- a/docs/d1/ddc/classedash__packager_1_1media_1_1VP9Parser-members.html +++ b/docs/d1/ddc/classedash__packager_1_1media_1_1VP9Parser-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/de2/composition__offset__iterator_8cc_source.html b/docs/d1/de2/composition__offset__iterator_8cc_source.html index ea209c276f..9971d9d0ff 100644 --- a/docs/d1/de2/composition__offset__iterator_8cc_source.html +++ b/docs/d1/de2/composition__offset__iterator_8cc_source.html @@ -153,13 +153,13 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
CompositionOffsetIterator(const CompositionTimeToSample &composition_time_to_sample)
Create CompositionOffsetIterator from composition time to sample box.
- + diff --git a/docs/d1/df0/aes__encryptor_8h_source.html b/docs/d1/df0/aes__encryptor_8h_source.html index aec82ecbb2..9d642c7922 100644 --- a/docs/d1/df0/aes__encryptor_8h_source.html +++ b/docs/d1/df0/aes__encryptor_8h_source.html @@ -305,7 +305,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d1/df2/structedash__packager_1_1media_1_1mp4_1_1CueSettingsBox.html b/docs/d1/df2/structedash__packager_1_1media_1_1mp4_1_1CueSettingsBox.html index 2dcf1deed2..34a6709821 100644 --- a/docs/d1/df2/structedash__packager_1_1media_1_1mp4_1_1CueSettingsBox.html +++ b/docs/d1/df2/structedash__packager_1_1media_1_1mp4_1_1CueSettingsBox.html @@ -136,7 +136,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 733 of file box_definitions.h.

+

Definition at line 740 of file box_definitions.h.

Member Function Documentation

@@ -162,7 +162,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 2421 of file box_definitions.cc.

+

Definition at line 2442 of file box_definitions.cc.

@@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d1/dfc/structedash__packager_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample-members.html b/docs/d1/dfc/structedash__packager_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample-members.html index aca211757e..e4fddbd314 100644 --- a/docs/d1/dfc/structedash__packager_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample-members.html +++ b/docs/d1/dfc/structedash__packager_1_1media_1_1wvm_1_1DemuxStreamIdMediaSample-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d02/timestamp_8h_source.html b/docs/d2/d02/timestamp_8h_source.html index f80218147d..2f6443394e 100644 --- a/docs/d2/d02/timestamp_8h_source.html +++ b/docs/d2/d02/timestamp_8h_source.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d06/structedash__packager_1_1media_1_1mp4_1_1Metadata.html b/docs/d2/d06/structedash__packager_1_1media_1_1mp4_1_1Metadata.html index 853330ff11..34986c845a 100644 --- a/docs/d2/d06/structedash__packager_1_1media_1_1mp4_1_1Metadata.html +++ b/docs/d2/d06/structedash__packager_1_1media_1_1mp4_1_1Metadata.html @@ -174,7 +174,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 1180 of file box_definitions.cc.

+

Definition at line 1181 of file box_definitions.cc.

@@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/d2/d0f/structedash__packager_1_1media_1_1mp4_1_1MediaInformation-members.html b/docs/d2/d0f/structedash__packager_1_1media_1_1mp4_1_1MediaInformation-members.html index c89b93cf82..9af8fe292d 100644 --- a/docs/d2/d0f/structedash__packager_1_1media_1_1mp4_1_1MediaInformation-members.html +++ b/docs/d2/d0f/structedash__packager_1_1media_1_1mp4_1_1MediaInformation-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d17/ts__section__pat_8cc_source.html b/docs/d2/d17/ts__section__pat_8cc_source.html index 4f763c014f..e36dab1d49 100644 --- a/docs/d2/d17/ts__section__pat_8cc_source.html +++ b/docs/d2/d17/ts__section__pat_8cc_source.html @@ -214,7 +214,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d23/threaded__io__file_8cc_source.html b/docs/d2/d23/threaded__io__file_8cc_source.html index 930fb7b6c6..7890605e72 100644 --- a/docs/d2/d23/threaded__io__file_8cc_source.html +++ b/docs/d2/d23/threaded__io__file_8cc_source.html @@ -97,8 +97,8 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
8 
9 #include "packager/base/bind.h"
10 #include "packager/base/bind_helpers.h"
-
11 #include "packager/base/threading/platform_thread.h"
-
12 #include "packager/media/base/closure_thread.h"
+
11 #include "packager/base/location.h"
+
12 #include "packager/base/threading/worker_pool.h"
13 
14 namespace edash_packager {
15 namespace media {
@@ -120,136 +120,136 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
31  eof_(false),
32  flushing_(false),
33  flush_complete_event_(false, false),
-
34  internal_file_error_(0){
-
35  DCHECK(internal_file_);
-
36 }
-
37 
-
38 ThreadedIoFile::~ThreadedIoFile() {}
-
39 
- -
41  DCHECK(internal_file_);
-
42 
-
43  if (!internal_file_->Open())
-
44  return false;
-
45 
-
46  position_ = 0;
-
47  size_ = internal_file_->Size();
-
48 
-
49  thread_.reset(new ClosureThread("ThreadedIoFile",
-
50  base::Bind(mode_ == kInputMode ?
-
51  &ThreadedIoFile::RunInInputMode :
-
52  &ThreadedIoFile::RunInOutputMode,
-
53  base::Unretained(this))));
-
54  thread_->Start();
-
55  return true;
-
56 }
-
57 
- -
59  DCHECK(internal_file_);
-
60  DCHECK(thread_);
+
34  internal_file_error_(0),
+
35  task_exit_event_(false, false) {
+
36  DCHECK(internal_file_);
+
37 }
+
38 
+
39 ThreadedIoFile::~ThreadedIoFile() {}
+
40 
+ +
42  DCHECK(internal_file_);
+
43 
+
44  if (!internal_file_->Open())
+
45  return false;
+
46 
+
47  position_ = 0;
+
48  size_ = internal_file_->Size();
+
49 
+
50  base::WorkerPool::PostTask(FROM_HERE, base::Bind(&ThreadedIoFile::TaskHandler,
+
51  base::Unretained(this)),
+
52  true /* task_is_slow */);
+
53  return true;
+
54 }
+
55 
+ +
57  DCHECK(internal_file_);
+
58 
+
59  if (mode_ == kOutputMode)
+
60  Flush();
61 
-
62  if (mode_ == kOutputMode)
-
63  Flush();
+
62  cache_.Close();
+
63  task_exit_event_.Wait();
64 
-
65  cache_.Close();
-
66  thread_->Join();
-
67 
-
68  bool result = internal_file_.release()->Close();
-
69  delete this;
-
70  return result;
-
71 }
-
72 
-
73 int64_t ThreadedIoFile::Read(void* buffer, uint64_t length) {
-
74  DCHECK(internal_file_);
-
75  DCHECK(thread_);
-
76  DCHECK_EQ(kInputMode, mode_);
-
77 
-
78  if (NoBarrier_Load(&eof_) && !cache_.BytesCached())
-
79  return 0;
+
65  bool result = internal_file_.release()->Close();
+
66  delete this;
+
67  return result;
+
68 }
+
69 
+
70 int64_t ThreadedIoFile::Read(void* buffer, uint64_t length) {
+
71  DCHECK(internal_file_);
+
72  DCHECK_EQ(kInputMode, mode_);
+
73 
+
74  if (NoBarrier_Load(&eof_) && !cache_.BytesCached())
+
75  return 0;
+
76 
+
77  if (NoBarrier_Load(&internal_file_error_))
+
78  return NoBarrier_Load(&internal_file_error_);
+
79 
80 
-
81  if (NoBarrier_Load(&internal_file_error_))
-
82  return NoBarrier_Load(&internal_file_error_);
+
81  uint64_t bytes_read = cache_.Read(buffer, length);
+
82  position_ += bytes_read;
83 
-
84 
-
85  uint64_t bytes_read = cache_.Read(buffer, length);
-
86  position_ += bytes_read;
-
87 
-
88  return bytes_read;
-
89 }
+
84  return bytes_read;
+
85 }
+
86 
+
87 int64_t ThreadedIoFile::Write(const void* buffer, uint64_t length) {
+
88  DCHECK(internal_file_);
+
89  DCHECK_EQ(kOutputMode, mode_);
90 
-
91 int64_t ThreadedIoFile::Write(const void* buffer, uint64_t length) {
-
92  DCHECK(internal_file_);
-
93  DCHECK(thread_);
-
94  DCHECK_EQ(kOutputMode, mode_);
-
95 
-
96  if (NoBarrier_Load(&internal_file_error_))
-
97  return NoBarrier_Load(&internal_file_error_);
+
91  if (NoBarrier_Load(&internal_file_error_))
+
92  return NoBarrier_Load(&internal_file_error_);
+
93 
+
94  uint64_t bytes_written = cache_.Write(buffer, length);
+
95  position_ += bytes_written;
+
96  if (position_ > size_)
+
97  size_ = position_;
98 
-
99  uint64_t bytes_written = cache_.Write(buffer, length);
-
100  position_ += bytes_written;
-
101  if (position_ > size_)
-
102  size_ = position_;
-
103 
-
104  return bytes_written;
-
105 }
-
106 
- -
108  DCHECK(internal_file_);
-
109  DCHECK(thread_);
-
110 
-
111  return size_;
-
112 }
-
113 
- -
115  DCHECK(internal_file_);
-
116  DCHECK(thread_);
-
117  DCHECK_EQ(kOutputMode, mode_);
-
118 
-
119  flushing_ = true;
-
120  cache_.Close();
-
121  flush_complete_event_.Wait();
-
122  return internal_file_->Flush();
-
123 }
-
124 
-
125 bool ThreadedIoFile::Seek(uint64_t position) {
-
126  if (mode_ == kOutputMode) {
-
127  // Writing. Just flush the cache and seek.
-
128  if (!Flush()) return false;
-
129  if (!internal_file_->Seek(position)) return false;
-
130  } else {
-
131  // Reading. Close cache, wait for I/O thread to exit, seek, and restart
-
132  // I/O thread.
-
133  cache_.Close();
-
134  thread_->Join();
-
135  bool result = internal_file_->Seek(position);
-
136  if (!result) {
-
137  // Seek failed. Seek to logical position instead.
-
138  if (!internal_file_->Seek(position_) && (position != position_)) {
-
139  LOG(WARNING) << "Seek failed. ThreadedIoFile left in invalid state.";
-
140  }
-
141  }
-
142  cache_.Reopen();
-
143  eof_ = false;
-
144  thread_.reset(new ClosureThread("ThreadedIoFile",
-
145  base::Bind(&ThreadedIoFile::RunInInputMode,
-
146  base::Unretained(this))));
-
147  thread_->Start();
-
148  if (!result) return false;
-
149  }
-
150  position_ = position;
+
99  return bytes_written;
+
100 }
+
101 
+ +
103  DCHECK(internal_file_);
+
104 
+
105  return size_;
+
106 }
+
107 
+ +
109  DCHECK(internal_file_);
+
110  DCHECK_EQ(kOutputMode, mode_);
+
111 
+
112  flushing_ = true;
+
113  cache_.Close();
+
114  flush_complete_event_.Wait();
+
115  return internal_file_->Flush();
+
116 }
+
117 
+
118 bool ThreadedIoFile::Seek(uint64_t position) {
+
119  if (mode_ == kOutputMode) {
+
120  // Writing. Just flush the cache and seek.
+
121  if (!Flush()) return false;
+
122  if (!internal_file_->Seek(position)) return false;
+
123  } else {
+
124  // Reading. Close cache, wait for thread task to exit, seek, and re-post
+
125  // the task.
+
126  cache_.Close();
+
127  task_exit_event_.Wait();
+
128  bool result = internal_file_->Seek(position);
+
129  if (!result) {
+
130  // Seek failed. Seek to logical position instead.
+
131  if (!internal_file_->Seek(position_) && (position != position_)) {
+
132  LOG(WARNING) << "Seek failed. ThreadedIoFile left in invalid state.";
+
133  }
+
134  }
+
135  cache_.Reopen();
+
136  eof_ = false;
+
137  base::WorkerPool::PostTask(
+
138  FROM_HERE,
+
139  base::Bind(&ThreadedIoFile::TaskHandler, base::Unretained(this)),
+
140  true /* task_is_slow */);
+
141  if (!result) return false;
+
142  }
+
143  position_ = position;
+
144  return true;
+
145 }
+
146 
+
147 bool ThreadedIoFile::Tell(uint64_t* position) {
+
148  DCHECK(position);
+
149 
+
150  *position = position_;
151  return true;
152 }
153 
-
154 bool ThreadedIoFile::Tell(uint64_t* position) {
-
155  DCHECK(position);
-
156 
-
157  *position = position_;
-
158  return true;
-
159 }
-
160 
-
161 void ThreadedIoFile::RunInInputMode() {
-
162  DCHECK(internal_file_);
-
163  DCHECK(thread_);
+
154 void ThreadedIoFile::TaskHandler() {
+
155  if (mode_ == kInputMode)
+
156  RunInInputMode();
+
157  else
+
158  RunInOutputMode();
+
159  task_exit_event_.Signal();
+
160 }
+
161 
+
162 void ThreadedIoFile::RunInInputMode() {
+
163  DCHECK(internal_file_);
164  DCHECK_EQ(kInputMode, mode_);
165 
166  while (true) {
@@ -269,55 +269,53 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
180 
181 void ThreadedIoFile::RunInOutputMode() {
182  DCHECK(internal_file_);
-
183  DCHECK(thread_);
-
184  DCHECK_EQ(kOutputMode, mode_);
-
185 
-
186  while (true) {
-
187  uint64_t write_bytes = cache_.Read(&io_buffer_[0], io_buffer_.size());
-
188  if (write_bytes == 0) {
-
189  if (flushing_) {
-
190  cache_.Reopen();
-
191  flushing_ = false;
-
192  flush_complete_event_.Signal();
-
193  } else {
-
194  return;
-
195  }
-
196  } else {
-
197  uint64_t bytes_written(0);
-
198  while (bytes_written < write_bytes) {
-
199  int64_t write_result = internal_file_->Write(
-
200  &io_buffer_[bytes_written], write_bytes - bytes_written);
-
201  if (write_result < 0) {
-
202  NoBarrier_Store(&internal_file_error_, write_result);
-
203  cache_.Close();
-
204  return;
-
205  }
-
206  bytes_written += write_result;
-
207  }
-
208  }
-
209  }
-
210 }
-
211 
-
212 } // namespace media
-
213 } // namespace edash_packager
+
183  DCHECK_EQ(kOutputMode, mode_);
+
184 
+
185  while (true) {
+
186  uint64_t write_bytes = cache_.Read(&io_buffer_[0], io_buffer_.size());
+
187  if (write_bytes == 0) {
+
188  if (flushing_) {
+
189  cache_.Reopen();
+
190  flushing_ = false;
+
191  flush_complete_event_.Signal();
+
192  } else {
+
193  return;
+
194  }
+
195  } else {
+
196  uint64_t bytes_written(0);
+
197  while (bytes_written < write_bytes) {
+
198  int64_t write_result = internal_file_->Write(
+
199  &io_buffer_[bytes_written], write_bytes - bytes_written);
+
200  if (write_result < 0) {
+
201  NoBarrier_Store(&internal_file_error_, write_result);
+
202  cache_.Close();
+
203  return;
+
204  }
+
205  bytes_written += write_result;
+
206  }
+
207  }
+
208  }
+
209 }
+
210 
+
211 } // namespace media
+
212 } // namespace edash_packager
void Reopen()
Reopens the cache. Any data still in the cache will be lost.
Definition: io_cache.cc:117
-
int64_t Write(const void *buffer, uint64_t length) override
-
bool Seek(uint64_t position) override
- +
int64_t Write(const void *buffer, uint64_t length) override
+
bool Seek(uint64_t position) override
+ -
int64_t Read(void *buffer, uint64_t length) override
-
bool Open() override
Internal open. Should not be used directly.
+
int64_t Read(void *buffer, uint64_t length) override
+
bool Open() override
Internal open. Should not be used directly.
uint64_t Write(const void *buffer, uint64_t size)
Definition: io_cache.cc:67
- - - + +
uint64_t Read(void *buffer, uint64_t size)
Definition: io_cache.cc:39
-
bool Tell(uint64_t *position) override
+
bool Tell(uint64_t *position) override
diff --git a/docs/d2/d24/packager__util_8h_source.html b/docs/d2/d24/packager__util_8h_source.html index 6b359fb518..aa04c454a8 100644 --- a/docs/d2/d24/packager__util_8h_source.html +++ b/docs/d2/d24/packager__util_8h_source.html @@ -142,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d26/structedash__packager_1_1media_1_1mp4_1_1SampleGroupDescription.html b/docs/d2/d26/structedash__packager_1_1media_1_1mp4_1_1SampleGroupDescription.html index eb30684930..bcab7620b8 100644 --- a/docs/d2/d26/structedash__packager_1_1media_1_1mp4_1_1SampleGroupDescription.html +++ b/docs/d2/d26/structedash__packager_1_1media_1_1mp4_1_1SampleGroupDescription.html @@ -149,7 +149,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 650 of file box_definitions.h.

+

Definition at line 657 of file box_definitions.h.

Member Function Documentation

@@ -175,7 +175,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 2137 of file box_definitions.cc.

+

Definition at line 2158 of file box_definitions.cc.

@@ -186,7 +186,7 @@ Additional Inherited Members diff --git a/docs/d2/d28/classedash__packager_1_1media_1_1SegmentTestBase.html b/docs/d2/d28/classedash__packager_1_1media_1_1SegmentTestBase.html index 031412dcd6..5e58d21ec2 100644 --- a/docs/d2/d28/classedash__packager_1_1media_1_1SegmentTestBase.html +++ b/docs/d2/d28/classedash__packager_1_1media_1_1SegmentTestBase.html @@ -88,6 +88,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
@@ -109,6 +110,17 @@ Classes class  ClusterParser   + + + + + +

+Public Types

enum  KeyFrameFlag { kKeyFrame, +kNotKeyFrame + }
 
enum  SideDataFlag { kGenerateSideData, +kNoSideData + }
 
- - - + + + @@ -168,7 +180,7 @@ bool 

Protected Member Functions

@@ -122,10 +134,10 @@ template<typename S >
void CreateAndInitializeSegmenter (const MuxerOptions &options, StreamInfo *info, scoped_ptr< webm::Segmenter > *result) const
 Creates a Segmenter of the given type and initializes it.
 
-scoped_refptr< MediaSampleCreateSample (bool is_key_frame, uint64_t duration)
 Creates a new media sample.
 
+scoped_refptr< MediaSampleCreateSample (KeyFrameFlag key_frame_flag, uint64_t duration, SideDataFlag side_data_flag)
 Creates a new media sample.
 
MuxerOptions CreateMuxerOptions () const
 Creates a Muxer options object for testing.
single_segment_ diff --git a/docs/d2/d2d/structedash__packager_1_1media_1_1mp4_1_1MediaHeader-members.html b/docs/d2/d2d/structedash__packager_1_1media_1_1mp4_1_1MediaHeader-members.html index ab4cd6e0f1..4887b5ec39 100644 --- a/docs/d2/d2d/structedash__packager_1_1media_1_1mp4_1_1MediaHeader-members.html +++ b/docs/d2/d2d/structedash__packager_1_1media_1_1mp4_1_1MediaHeader-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
diff --git a/docs/d2/d30/tracks__builder_8cc_source.html b/docs/d2/d30/tracks__builder_8cc_source.html index f94b17b8fa..b077255df6 100644 --- a/docs/d2/d30/tracks__builder_8cc_source.html +++ b/docs/d2/d30/tracks__builder_8cc_source.html @@ -487,7 +487,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d48/classedash__packager_1_1media_1_1mp2t_1_1AdtsHeader-members.html b/docs/d2/d48/classedash__packager_1_1media_1_1mp2t_1_1AdtsHeader-members.html index 4b1213db06..3f6735cca6 100644 --- a/docs/d2/d48/classedash__packager_1_1media_1_1mp2t_1_1AdtsHeader-members.html +++ b/docs/d2/d48/classedash__packager_1_1media_1_1mp2t_1_1AdtsHeader-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d4b/structedash__packager_1_1media_1_1FileCloser-members.html b/docs/d2/d4b/structedash__packager_1_1media_1_1FileCloser-members.html index 6fce154d31..0241f3eb28 100644 --- a/docs/d2/d4b/structedash__packager_1_1media_1_1FileCloser-members.html +++ b/docs/d2/d4b/structedash__packager_1_1media_1_1FileCloser-members.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d4d/file_8h_source.html b/docs/d2/d4d/file_8h_source.html index d58e0cafed..08e9b9608b 100644 --- a/docs/d2/d4d/file_8h_source.html +++ b/docs/d2/d4d/file_8h_source.html @@ -181,7 +181,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
virtual bool Tell(uint64_t *position)=0
virtual int64_t Size()=0
-
Declaration of class which implements a thread-safe circular buffer.
+
Declaration of class which implements a thread-safe circular buffer.
static bool Copy(const char *from_file_name, const char *to_file_name)
Definition: file.cc:202
virtual int64_t Write(const void *buffer, uint64_t length)=0
@@ -190,7 +190,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d50/structedash__packager_1_1media_1_1H264DecRefPicMarking.html b/docs/d2/d50/structedash__packager_1_1media_1_1H264DecRefPicMarking.html index 30c20314d2..a144cf0253 100644 --- a/docs/d2/d50/structedash__packager_1_1media_1_1H264DecRefPicMarking.html +++ b/docs/d2/d50/structedash__packager_1_1media_1_1H264DecRefPicMarking.html @@ -121,7 +121,7 @@ int max_long_term_frame_id diff --git a/docs/d2/d51/classedash__packager_1_1media_1_1WebVttMediaParser.html b/docs/d2/d51/classedash__packager_1_1media_1_1WebVttMediaParser.html index 8d815c63b3..7cefc98b50 100644 --- a/docs/d2/d51/classedash__packager_1_1media_1_1WebVttMediaParser.html +++ b/docs/d2/d51/classedash__packager_1_1media_1_1WebVttMediaParser.html @@ -255,7 +255,7 @@ track_id, const scoped_refptr
diff --git a/docs/d2/d51/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html b/docs/d2/d51/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html index 1437981b2b..b0e941567c 100644 --- a/docs/d2/d51/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html +++ b/docs/d2/d51/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html @@ -177,7 +177,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 220 of file box_definitions.cc.

+

Definition at line 221 of file box_definitions.cc.

@@ -188,7 +188,7 @@ Additional Inherited Members diff --git a/docs/d2/d5b/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPmt.html b/docs/d2/d5b/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPmt.html index 13d3d22736..0105fc4438 100644 --- a/docs/d2/d5b/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPmt.html +++ b/docs/d2/d5b/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPmt.html @@ -155,7 +155,7 @@ void Reset () override diff --git a/docs/d2/d5d/structedash__packager_1_1media_1_1mp4_1_1VideoMediaHeader-members.html b/docs/d2/d5d/structedash__packager_1_1media_1_1mp4_1_1VideoMediaHeader-members.html index 5dcceda9d7..164cd8cbfb 100644 --- a/docs/d2/d5d/structedash__packager_1_1media_1_1mp4_1_1VideoMediaHeader-members.html +++ b/docs/d2/d5d/structedash__packager_1_1media_1_1mp4_1_1VideoMediaHeader-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d62/simple__mpd__notifier_8h_source.html b/docs/d2/d62/simple__mpd__notifier_8h_source.html index 7e480ca319..b87232f762 100644 --- a/docs/d2/d62/simple__mpd__notifier_8h_source.html +++ b/docs/d2/d62/simple__mpd__notifier_8h_source.html @@ -188,7 +188,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d6f/classBandwidthEstimator.html b/docs/d2/d6f/classBandwidthEstimator.html index 43ae2d5785..c9152c2a25 100644 --- a/docs/d2/d6f/classBandwidthEstimator.html +++ b/docs/d2/d6f/classBandwidthEstimator.html @@ -151,7 +151,7 @@ static const int kUseAllBl diff --git a/docs/d2/d6f/structedash__packager_1_1media_1_1mp4_1_1SchemeInfo.html b/docs/d2/d6f/structedash__packager_1_1media_1_1mp4_1_1SchemeInfo.html index d132ab738b..9877e459dd 100644 --- a/docs/d2/d6f/structedash__packager_1_1media_1_1mp4_1_1SchemeInfo.html +++ b/docs/d2/d6f/structedash__packager_1_1media_1_1mp4_1_1SchemeInfo.html @@ -162,7 +162,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 445 of file box_definitions.cc.

+

Definition at line 446 of file box_definitions.cc.

@@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d2/d7b/simple__mpd__notifier_8cc_source.html b/docs/d2/d7b/simple__mpd__notifier_8cc_source.html index 4dc324704f..5895e9cb35 100644 --- a/docs/d2/d7b/simple__mpd__notifier_8cc_source.html +++ b/docs/d2/d7b/simple__mpd__notifier_8cc_source.html @@ -229,7 +229,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
void AddContentProtectionElements(const MediaInfo &media_info, Representation *parent)
Definition: mpd_utils.cc:268
bool NotifySampleDuration(uint32_t container_id, uint32_t sample_duration) override
-
static void MakePathsRelativeToMpd(const std::string &mpd_path, MediaInfo *media_info)
Definition: mpd_builder.cc:625
+
static void MakePathsRelativeToMpd(const std::string &mpd_path, MediaInfo *media_info)
Definition: mpd_builder.cc:626
bool NotifyNewContainer(const MediaInfo &media_info, uint32_t *id) override
bool NotifyNewSegment(uint32_t id, uint64_t start_time, uint64_t duration, uint64_t size) override
@@ -237,12 +237,12 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
bool WriteMpdToFile(const std::string &output_path, MpdBuilder *mpd_builder)
- +
ContentType GetContentType(const MediaInfo &media_info)
diff --git a/docs/d2/d7e/aac__audio__specific__config_8h_source.html b/docs/d2/d7e/aac__audio__specific__config_8h_source.html index 7f1a4207f1..65285c0d9d 100644 --- a/docs/d2/d7e/aac__audio__specific__config_8h_source.html +++ b/docs/d2/d7e/aac__audio__specific__config_8h_source.html @@ -166,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d90/classedash__packager_1_1media_1_1Status.html b/docs/d2/d90/classedash__packager_1_1media_1_1Status.html index 63148c89bd..d74c8b734c 100644 --- a/docs/d2/d90/classedash__packager_1_1media_1_1Status.html +++ b/docs/d2/d90/classedash__packager_1_1media_1_1Status.html @@ -302,7 +302,7 @@ static const diff --git a/docs/d2/d92/box__reader_8h_source.html b/docs/d2/d92/box__reader_8h_source.html index 2845802813..27e7a1b61a 100644 --- a/docs/d2/d92/box__reader_8h_source.html +++ b/docs/d2/d92/box__reader_8h_source.html @@ -249,7 +249,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/d98/avc__decoder__configuration_8h_source.html b/docs/d2/d98/avc__decoder__configuration_8h_source.html index 9222c6d4ae..9c27f67588 100644 --- a/docs/d2/d98/avc__decoder__configuration_8h_source.html +++ b/docs/d2/d98/avc__decoder__configuration_8h_source.html @@ -154,7 +154,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/da6/threaded__io__file_8h_source.html b/docs/d2/da6/threaded__io__file_8h_source.html index 173ace7a19..d025b38db3 100644 --- a/docs/d2/da6/threaded__io__file_8h_source.html +++ b/docs/d2/da6/threaded__io__file_8h_source.html @@ -98,80 +98,81 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
9 
10 #include "packager/base/atomicops.h"
11 #include "packager/base/memory/scoped_ptr.h"
-
12 #include "packager/base/synchronization/lock.h"
-
13 #include "packager/base/synchronization/waitable_event.h"
-
14 #include "packager/media/file/file.h"
-
15 #include "packager/media/file/file_closer.h"
-
16 #include "packager/media/file/io_cache.h"
-
17 
-
18 namespace edash_packager {
-
19 namespace media {
-
20 
-
21 class ClosureThread;
-
22 
-
24 class ThreadedIoFile : public File {
-
25  public:
-
26  enum Mode {
-
27  kInputMode,
-
28  kOutputMode
-
29  };
-
30 
-
31  ThreadedIoFile(scoped_ptr<File, FileCloser> internal_file,
-
32  Mode mode,
-
33  uint64_t io_cache_size,
-
34  uint64_t io_block_size);
-
35 
-
38  bool Close() override;
-
39  int64_t Read(void* buffer, uint64_t length) override;
-
40  int64_t Write(const void* buffer, uint64_t length) override;
-
41  int64_t Size() override;
-
42  bool Flush() override;
-
43  bool Seek(uint64_t position) override;
-
44  bool Tell(uint64_t* position) override;
+
12 #include "packager/base/synchronization/waitable_event.h"
+
13 #include "packager/media/file/file.h"
+
14 #include "packager/media/file/file_closer.h"
+
15 #include "packager/media/file/io_cache.h"
+
16 
+
17 namespace edash_packager {
+
18 namespace media {
+
19 
+
21 class ThreadedIoFile : public File {
+
22  public:
+
23  enum Mode {
+
24  kInputMode,
+
25  kOutputMode
+
26  };
+
27 
+
28  ThreadedIoFile(scoped_ptr<File, FileCloser> internal_file,
+
29  Mode mode,
+
30  uint64_t io_cache_size,
+
31  uint64_t io_block_size);
+
32 
+
35  bool Close() override;
+
36  int64_t Read(void* buffer, uint64_t length) override;
+
37  int64_t Write(const void* buffer, uint64_t length) override;
+
38  int64_t Size() override;
+
39  bool Flush() override;
+
40  bool Seek(uint64_t position) override;
+
41  bool Tell(uint64_t* position) override;
+
43 
+
44  protected:
+
45  ~ThreadedIoFile() override;
46 
-
47  protected:
-
48  ~ThreadedIoFile() override;
-
49 
-
50  bool Open() override;
-
51 
-
52  void RunInInputMode();
-
53  void RunInOutputMode();
-
54 
-
55  private:
+
47  bool Open() override;
+
48 
+
49  private:
+
50  // Internal task handler implementation. Will dispatch to either
+
51  // |RunInInputMode| or |RunInOutputMode| depending on |mode_|.
+
52  void TaskHandler();
+
53  void RunInInputMode();
+
54  void RunInOutputMode();
+
55 
56  scoped_ptr<File, FileCloser> internal_file_;
57  const Mode mode_;
58  IoCache cache_;
59  std::vector<uint8_t> io_buffer_;
-
60  scoped_ptr<ClosureThread> thread_;
-
61  uint64_t position_;
-
62  uint64_t size_;
-
63  base::subtle::Atomic32 eof_;
-
64  bool flushing_;
-
65  base::WaitableEvent flush_complete_event_;
-
66  base::subtle::Atomic32 internal_file_error_;
-
67 
-
68  DISALLOW_COPY_AND_ASSIGN(ThreadedIoFile);
-
69 };
-
70 
-
71 } // namespace media
-
72 } // namespace edash_packager
-
73 
-
74 #endif // PACKAGER_FILE_THREADED_IO_FILE_H
-
int64_t Write(const void *buffer, uint64_t length) override
+
60  uint64_t position_;
+
61  uint64_t size_;
+
62  base::subtle::Atomic32 eof_;
+
63  bool flushing_;
+
64  base::WaitableEvent flush_complete_event_;
+
65  base::subtle::Atomic32 internal_file_error_;
+
66  // Signalled when thread task exits.
+
67  base::WaitableEvent task_exit_event_;
+
68 
+
69  DISALLOW_COPY_AND_ASSIGN(ThreadedIoFile);
+
70 };
+
71 
+
72 } // namespace media
+
73 } // namespace edash_packager
+
74 
+
75 #endif // PACKAGER_FILE_THREADED_IO_FILE_H
+
int64_t Write(const void *buffer, uint64_t length) override
Declaration of class which implements a thread-safe circular buffer.
Definition: io_cache.h:20
-
bool Seek(uint64_t position) override
- +
bool Seek(uint64_t position) override
+
Define an abstract file interface.
Definition: file.h:23
-
int64_t Read(void *buffer, uint64_t length) override
-
bool Open() override
Internal open. Should not be used directly.
- -
Declaration of class which implements a thread-safe circular buffer.
- -
bool Tell(uint64_t *position) override
+
int64_t Read(void *buffer, uint64_t length) override
+
bool Open() override
Internal open. Should not be used directly.
+ +
Declaration of class which implements a thread-safe circular buffer.
+ +
bool Tell(uint64_t *position) override
diff --git a/docs/d2/da8/mp4_2segmenter_8cc_source.html b/docs/d2/da8/mp4_2segmenter_8cc_source.html index 889cd2ca61..b652d7e151 100644 --- a/docs/d2/da8/mp4_2segmenter_8cc_source.html +++ b/docs/d2/da8/mp4_2segmenter_8cc_source.html @@ -530,10 +530,10 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
441 } // namespace media
442 } // namespace edash_packager
Status Initialize(scoped_ptr< MkvWriter > writer, StreamInfo *info, ProgressListener *progress_listener, MuxerListener *muxer_listener, KeySource *encryption_key_source)
Definition: segmenter.cc:45
- +
virtual Status GetKey(TrackType track_type, EncryptionKey *key)
Definition: key_source.cc:46
- + @@ -548,7 +548,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
KeySource is responsible for encryption key acquisition.
Definition: key_source.h:29
virtual void OnProgress(double progress)=0
-
void UpdateProgress(uint64_t progress)
Update segmentation progress using ProgressListener.
Definition: segmenter.cc:202
+
void UpdateProgress(uint64_t progress)
Update segmentation progress using ProgressListener.
Definition: segmenter.cc:219
virtual std::string SystemName()
Definition: key_source.cc:96
@@ -557,7 +557,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dae/webm__muxer_8cc_source.html b/docs/d2/dae/webm__muxer_8cc_source.html index cbc00b2e67..a9657f2ef7 100644 --- a/docs/d2/dae/webm__muxer_8cc_source.html +++ b/docs/d2/dae/webm__muxer_8cc_source.html @@ -209,7 +209,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dc5/structedash__packager_1_1media_1_1mp4_1_1CueSettingsBox-members.html b/docs/d2/dc5/structedash__packager_1_1media_1_1mp4_1_1CueSettingsBox-members.html index 4547e0ed74..b30d9c3fd9 100644 --- a/docs/d2/dc5/structedash__packager_1_1media_1_1mp4_1_1CueSettingsBox-members.html +++ b/docs/d2/dc5/structedash__packager_1_1media_1_1mp4_1_1CueSettingsBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dd6/mkv__writer_8h_source.html b/docs/d2/dd6/mkv__writer_8h_source.html index 0a0e454583..022e3846ed 100644 --- a/docs/d2/dd6/mkv__writer_8h_source.html +++ b/docs/d2/dd6/mkv__writer_8h_source.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dd9/structedash__packager_1_1media_1_1VideoStreamInfoParameters.html b/docs/d2/dd9/structedash__packager_1_1media_1_1VideoStreamInfoParameters.html index fa789c8320..7907a945ed 100644 --- a/docs/d2/dd9/structedash__packager_1_1media_1_1VideoStreamInfoParameters.html +++ b/docs/d2/dd9/structedash__packager_1_1media_1_1VideoStreamInfoParameters.html @@ -146,7 +146,7 @@ bool is_encrypted diff --git a/docs/d2/dda/vp__codec__configuration_8cc_source.html b/docs/d2/dda/vp__codec__configuration_8cc_source.html index 5690741258..557988b5bd 100644 --- a/docs/d2/dda/vp__codec__configuration_8cc_source.html +++ b/docs/d2/dda/vp__codec__configuration_8cc_source.html @@ -217,7 +217,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/de6/packager__main_8cc_source.html b/docs/d2/de6/packager__main_8cc_source.html index 569b04cd6a..8d590ab969 100644 --- a/docs/d2/de6/packager__main_8cc_source.html +++ b/docs/d2/de6/packager__main_8cc_source.html @@ -104,458 +104,460 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
15 #include "packager/app/stream_descriptor.h"
16 #include "packager/app/vlog_flags.h"
17 #include "packager/app/widevine_encryption_flags.h"
-
18 #include "packager/base/command_line.h"
-
19 #include "packager/base/logging.h"
-
20 #include "packager/base/stl_util.h"
-
21 #include "packager/base/strings/string_split.h"
-
22 #include "packager/base/strings/stringprintf.h"
-
23 #include "packager/base/threading/simple_thread.h"
-
24 #include "packager/base/time/clock.h"
-
25 #include "packager/media/base/container_names.h"
-
26 #include "packager/media/base/demuxer.h"
-
27 #include "packager/media/base/key_source.h"
-
28 #include "packager/media/base/muxer_options.h"
-
29 #include "packager/media/base/muxer_util.h"
-
30 #include "packager/media/event/mpd_notify_muxer_listener.h"
-
31 #include "packager/media/event/vod_media_info_dump_muxer_listener.h"
-
32 #include "packager/media/file/file.h"
-
33 #include "packager/media/formats/mp4/mp4_muxer.h"
-
34 #include "packager/media/formats/webm/webm_muxer.h"
-
35 #include "packager/mpd/base/dash_iop_mpd_notifier.h"
-
36 #include "packager/mpd/base/media_info.pb.h"
-
37 #include "packager/mpd/base/mpd_builder.h"
-
38 #include "packager/mpd/base/simple_mpd_notifier.h"
-
39 #include "packager/version/version.h"
-
40 
-
41 DEFINE_bool(use_fake_clock_for_muxer,
-
42  false,
-
43  "Set to true to use a fake clock for muxer. With this flag set, "
-
44  "creation time and modification time in outputs are set to 0. "
-
45  "Should only be used for testing.");
-
46 
-
47 namespace {
-
48 const char kUsage[] =
-
49  "Packager driver program. Usage:\n\n"
-
50  "%s [flags] <stream_descriptor> ...\n"
-
51  "stream_descriptor consists of comma separated field_name/value pairs:\n"
-
52  "field_name=value,[field_name=value,]...\n"
-
53  "Supported field names are as follows:\n"
-
54  " - input (in): Required input/source media file path or network stream\n"
-
55  " URL.\n"
-
56  " - stream_selector (stream): Required field with value 'audio',\n"
-
57  " 'video', or stream number (zero based).\n"
-
58  " - output (out): Required output file (single file) or initialization\n"
-
59  " file path (multiple file).\n"
-
60  " - segment_template (segment): Optional value which specifies the\n"
-
61  " naming pattern for the segment files, and that the stream should be\n"
-
62  " split into multiple files. Its presence should be consistent across\n"
-
63  " streams.\n"
-
64  " - bandwidth (bw): Optional value which contains a user-specified\n"
-
65  " content bit rate for the stream, in bits/sec. If specified, this\n"
-
66  " value is propagated to the $Bandwidth$ template parameter for\n"
-
67  " segment names. If not specified, its value may be estimated.\n"
-
68  " - language (lang): Optional value which contains a user-specified\n"
-
69  " language tag. If specified, this value overrides any language\n"
-
70  " metadata in the input track.\n"
-
71  " - output_format (format): Optional value which specifies the format\n"
-
72  " of the output files (MP4 or WebM). If not specified, it will be\n"
-
73  " derived from the file extension of the output file.\n";
-
74 
-
75 const char kMediaInfoSuffix[] = ".media_info";
-
76 
-
77 enum ExitStatus {
-
78  kSuccess = 0,
-
79  kArgumentValidationFailed,
-
80  kPackagingFailed,
-
81  kInternalError,
-
82 };
-
83 
-
84 // TODO(rkuroiwa): Write TTML and WebVTT parser (demuxing) for a better check
-
85 // and for supporting live/segmenting (muxing). With a demuxer and a muxer,
-
86 // CreateRemuxJobs() shouldn't treat text as a special case.
-
87 std::string DetermineTextFileFormat(const std::string& file) {
-
88  std::string content;
-
89  if (!edash_packager::media::File::ReadFileToString(file.c_str(), &content)) {
-
90  LOG(ERROR) << "Failed to open file " << file
-
91  << " to determine file format.";
-
92  return "";
-
93  }
-
94  edash_packager::media::MediaContainerName container_name =
-
95  edash_packager::media::DetermineContainer(
-
96  reinterpret_cast<const uint8_t*>(content.data()), content.size());
-
97  if (container_name == edash_packager::media::CONTAINER_WEBVTT) {
-
98  return "vtt";
-
99  } else if (container_name == edash_packager::media::CONTAINER_TTML) {
-
100  return "ttml";
-
101  }
-
102 
-
103  return "";
-
104 }
-
105 
-
106 } // namespace
-
107 
-
108 namespace edash_packager {
-
109 namespace media {
-
110 
-
111 // A fake clock that always return time 0 (epoch). Should only be used for
-
112 // testing.
-
113 class FakeClock : public base::Clock {
-
114  public:
-
115  base::Time Now() override { return base::Time(); }
-
116 };
-
117 
-
118 // Demux, Mux(es) and worker thread used to remux a source file/stream.
-
119 class RemuxJob : public base::SimpleThread {
-
120  public:
-
121  RemuxJob(scoped_ptr<Demuxer> demuxer)
-
122  : SimpleThread("RemuxJob"),
-
123  demuxer_(demuxer.Pass()) {}
-
124 
-
125  ~RemuxJob() override {
-
126  STLDeleteElements(&muxers_);
-
127  }
-
128 
-
129  void AddMuxer(scoped_ptr<Muxer> mux) {
-
130  muxers_.push_back(mux.release());
-
131  }
-
132 
-
133  Demuxer* demuxer() { return demuxer_.get(); }
-
134  Status status() { return status_; }
-
135 
-
136  private:
-
137  void Run() override {
-
138  DCHECK(demuxer_);
-
139  status_ = demuxer_->Run();
-
140  }
-
141 
-
142  scoped_ptr<Demuxer> demuxer_;
-
143  std::vector<Muxer*> muxers_;
-
144  Status status_;
-
145 
-
146  DISALLOW_COPY_AND_ASSIGN(RemuxJob);
-
147 };
-
148 
-
149 bool StreamInfoToTextMediaInfo(const StreamDescriptor& stream_descriptor,
-
150  const MuxerOptions& stream_muxer_options,
-
151  MediaInfo* text_media_info) {
-
152  const std::string& language = stream_descriptor.language;
-
153  std::string format = DetermineTextFileFormat(stream_descriptor.input);
-
154  if (format.empty()) {
-
155  LOG(ERROR) << "Failed to determine the text file format for "
-
156  << stream_descriptor.input;
-
157  return false;
-
158  }
-
159 
-
160  if (!File::Copy(stream_descriptor.input.c_str(),
-
161  stream_muxer_options.output_file_name.c_str())) {
-
162  LOG(ERROR) << "Failed to copy the input file (" << stream_descriptor.input
-
163  << ") to output file (" << stream_muxer_options.output_file_name
-
164  << ").";
-
165  return false;
-
166  }
-
167 
-
168  text_media_info->set_media_file_name(stream_muxer_options.output_file_name);
-
169  text_media_info->set_container_type(MediaInfo::CONTAINER_TEXT);
-
170 
-
171  if (stream_muxer_options.bandwidth != 0) {
-
172  text_media_info->set_bandwidth(stream_muxer_options.bandwidth);
-
173  } else {
-
174  // Text files are usually small and since the input is one file; there's no
-
175  // way for the player to do ranged requests. So set this value to something
-
176  // reasonable.
-
177  text_media_info->set_bandwidth(256);
-
178  }
-
179 
-
180  MediaInfo::TextInfo* text_info = text_media_info->mutable_text_info();
-
181  text_info->set_format(format);
-
182  if (!language.empty())
-
183  text_info->set_language(language);
-
184 
-
185  return true;
-
186 }
-
187 
-
188 scoped_ptr<Muxer> CreateOutputMuxer(const MuxerOptions& options,
-
189  MediaContainerName container) {
-
190  if (container == CONTAINER_WEBM) {
-
191  return scoped_ptr<Muxer>(new webm::WebMMuxer(options));
-
192  } else {
-
193  DCHECK_EQ(container, CONTAINER_MOV);
-
194  return scoped_ptr<Muxer>(new mp4::MP4Muxer(options));
-
195  }
-
196 }
-
197 
-
198 bool CreateRemuxJobs(const StreamDescriptorList& stream_descriptors,
-
199  const MuxerOptions& muxer_options,
-
200  FakeClock* fake_clock,
-
201  KeySource* key_source,
-
202  MpdNotifier* mpd_notifier,
-
203  std::vector<RemuxJob*>* remux_jobs) {
-
204  DCHECK(remux_jobs);
-
205 
-
206  std::string previous_input;
-
207  for (StreamDescriptorList::const_iterator stream_iter =
-
208  stream_descriptors.begin();
-
209  stream_iter != stream_descriptors.end();
-
210  ++stream_iter) {
-
211  // Process stream descriptor.
-
212  MuxerOptions stream_muxer_options(muxer_options);
-
213  stream_muxer_options.output_file_name = stream_iter->output;
-
214  if (!stream_iter->segment_template.empty()) {
-
215  if (!ValidateSegmentTemplate(stream_iter->segment_template)) {
-
216  LOG(ERROR) << "ERROR: segment template with '"
-
217  << stream_iter->segment_template << "' is invalid.";
-
218  return false;
-
219  }
-
220  stream_muxer_options.segment_template = stream_iter->segment_template;
-
221  }
-
222  stream_muxer_options.bandwidth = stream_iter->bandwidth;
-
223 
-
224  // Handle text input.
-
225  if (stream_iter->stream_selector == "text") {
-
226  MediaInfo text_media_info;
-
227  if (!StreamInfoToTextMediaInfo(*stream_iter, stream_muxer_options,
-
228  &text_media_info)) {
-
229  return false;
-
230  }
-
231 
-
232  if (mpd_notifier) {
-
233  uint32 unused;
-
234  if (!mpd_notifier->NotifyNewContainer(text_media_info, &unused)) {
-
235  LOG(ERROR) << "Failed to process text file " << stream_iter->input;
-
236  } else {
-
237  mpd_notifier->Flush();
-
238  }
-
239  } else if (FLAGS_output_media_info) {
- -
241  text_media_info,
-
242  stream_muxer_options.output_file_name + kMediaInfoSuffix);
-
243  } else {
-
244  NOTIMPLEMENTED()
-
245  << "--mpd_output or --output_media_info flags are "
-
246  "required for text output. Skipping manifest related output for "
-
247  << stream_iter->input;
-
248  }
-
249  continue;
-
250  }
-
251 
-
252  if (stream_iter->input != previous_input) {
-
253  // New remux job needed. Create demux and job thread.
-
254  scoped_ptr<Demuxer> demuxer(new Demuxer(stream_iter->input));
-
255  if (FLAGS_enable_widevine_decryption ||
-
256  FLAGS_enable_fixed_key_decryption) {
-
257  scoped_ptr<KeySource> key_source(CreateDecryptionKeySource());
-
258  if (!key_source)
-
259  return false;
-
260  demuxer->SetKeySource(key_source.Pass());
-
261  }
-
262  Status status = demuxer->Initialize();
-
263  if (!status.ok()) {
-
264  LOG(ERROR) << "Demuxer failed to initialize: " << status.ToString();
-
265  return false;
-
266  }
-
267  if (FLAGS_dump_stream_info) {
-
268  printf("\nFile \"%s\":\n", stream_iter->input.c_str());
-
269  DumpStreamInfo(demuxer->streams());
-
270  if (stream_iter->output.empty())
-
271  continue; // just need stream info.
-
272  }
-
273  remux_jobs->push_back(new RemuxJob(demuxer.Pass()));
-
274  previous_input = stream_iter->input;
-
275  }
-
276  DCHECK(!remux_jobs->empty());
-
277 
-
278  MediaContainerName output_format = stream_iter->output_format;
-
279  if (output_format == CONTAINER_UNKNOWN) {
-
280  output_format =
-
281  DetermineContainerFromFileName(stream_muxer_options.output_file_name);
-
282 
-
283  if (output_format == CONTAINER_UNKNOWN) {
-
284  LOG(ERROR) << "Unable to determine output format for file "
-
285  << stream_muxer_options.output_file_name;
-
286  return false;
-
287  }
-
288  }
-
289 
-
290  scoped_ptr<Muxer> muxer(
-
291  CreateOutputMuxer(stream_muxer_options, output_format));
-
292  if (FLAGS_use_fake_clock_for_muxer) muxer->set_clock(fake_clock);
-
293 
-
294  if (key_source) {
-
295  muxer->SetKeySource(key_source,
-
296  FLAGS_max_sd_pixels,
-
297  FLAGS_clear_lead,
-
298  FLAGS_crypto_period_duration);
-
299  }
-
300 
-
301  scoped_ptr<MuxerListener> muxer_listener;
-
302  DCHECK(!(FLAGS_output_media_info && mpd_notifier));
-
303  if (FLAGS_output_media_info) {
-
304  const std::string output_media_info_file_name =
-
305  stream_muxer_options.output_file_name + kMediaInfoSuffix;
-
306  scoped_ptr<VodMediaInfoDumpMuxerListener>
-
307  vod_media_info_dump_muxer_listener(
-
308  new VodMediaInfoDumpMuxerListener(output_media_info_file_name));
-
309  vod_media_info_dump_muxer_listener->SetContentProtectionSchemeIdUri(
-
310  FLAGS_scheme_id_uri);
-
311  muxer_listener = vod_media_info_dump_muxer_listener.Pass();
-
312  }
-
313  if (mpd_notifier) {
-
314  scoped_ptr<MpdNotifyMuxerListener> mpd_notify_muxer_listener(
-
315  new MpdNotifyMuxerListener(mpd_notifier));
-
316  mpd_notify_muxer_listener->SetContentProtectionSchemeIdUri(
-
317  FLAGS_scheme_id_uri);
-
318  muxer_listener = mpd_notify_muxer_listener.Pass();
-
319  }
-
320 
-
321  if (muxer_listener)
-
322  muxer->SetMuxerListener(muxer_listener.Pass());
-
323 
-
324  if (!AddStreamToMuxer(remux_jobs->back()->demuxer()->streams(),
-
325  stream_iter->stream_selector,
-
326  stream_iter->language,
-
327  muxer.get()))
-
328  return false;
-
329  remux_jobs->back()->AddMuxer(muxer.Pass());
-
330  }
-
331 
-
332  return true;
-
333 }
-
334 
-
335 Status RunRemuxJobs(const std::vector<RemuxJob*>& remux_jobs) {
-
336  // Start the job threads.
-
337  for (std::vector<RemuxJob*>::const_iterator job_iter = remux_jobs.begin();
-
338  job_iter != remux_jobs.end();
-
339  ++job_iter) {
-
340  (*job_iter)->Start();
-
341  }
-
342 
-
343  // Wait for all jobs to complete or an error occurs.
-
344  Status status;
-
345  bool all_joined;
-
346  do {
-
347  all_joined = true;
-
348  for (std::vector<RemuxJob*>::const_iterator job_iter = remux_jobs.begin();
-
349  job_iter != remux_jobs.end();
-
350  ++job_iter) {
-
351  if ((*job_iter)->HasBeenJoined()) {
-
352  status = (*job_iter)->status();
-
353  if (!status.ok())
-
354  break;
-
355  } else {
-
356  all_joined = false;
-
357  (*job_iter)->Join();
-
358  }
-
359  }
-
360  } while (!all_joined && status.ok());
-
361 
-
362  return status;
-
363 }
-
364 
-
365 bool RunPackager(const StreamDescriptorList& stream_descriptors) {
-
366  if (!AssignFlagsFromProfile())
-
367  return false;
-
368 
-
369  if (FLAGS_output_media_info && !FLAGS_mpd_output.empty()) {
-
370  NOTIMPLEMENTED() << "ERROR: --output_media_info and --mpd_output do not "
-
371  "work together.";
-
372  return false;
-
373  }
-
374  if (FLAGS_output_media_info && !FLAGS_single_segment) {
-
375  // TODO(rkuroiwa, kqyang): Support partial media info dump for live.
-
376  NOTIMPLEMENTED() << "ERROR: --output_media_info is only supported if "
-
377  "--single_segment is true.";
-
378  return false;
-
379  }
-
380 
-
381  // Get basic muxer options.
-
382  MuxerOptions muxer_options;
-
383  if (!GetMuxerOptions(&muxer_options))
-
384  return false;
-
385 
-
386  MpdOptions mpd_options;
-
387  if (!GetMpdOptions(&mpd_options))
-
388  return false;
-
389 
-
390  // Create encryption key source if needed.
-
391  scoped_ptr<KeySource> encryption_key_source;
-
392  if (FLAGS_enable_widevine_encryption || FLAGS_enable_fixed_key_encryption) {
-
393  encryption_key_source = CreateEncryptionKeySource();
-
394  if (!encryption_key_source)
-
395  return false;
-
396  }
-
397 
-
398  scoped_ptr<MpdNotifier> mpd_notifier;
-
399  if (!FLAGS_mpd_output.empty()) {
-
400  DashProfile profile =
-
401  FLAGS_single_segment ? kOnDemandProfile : kLiveProfile;
-
402  std::vector<std::string> base_urls;
-
403  base::SplitString(FLAGS_base_urls, ',', &base_urls);
-
404  if (FLAGS_generate_dash_if_iop_compliant_mpd) {
-
405  mpd_notifier.reset(new DashIopMpdNotifier(profile, mpd_options, base_urls,
-
406  FLAGS_mpd_output));
-
407  } else {
-
408  mpd_notifier.reset(new SimpleMpdNotifier(profile, mpd_options, base_urls,
-
409  FLAGS_mpd_output));
-
410  }
-
411  if (!mpd_notifier->Init()) {
-
412  LOG(ERROR) << "MpdNotifier failed to initialize.";
-
413  return false;
-
414  }
-
415  }
-
416 
-
417  std::vector<RemuxJob*> remux_jobs;
-
418  STLElementDeleter<std::vector<RemuxJob*> > scoped_jobs_deleter(&remux_jobs);
-
419  FakeClock fake_clock;
-
420  if (!CreateRemuxJobs(stream_descriptors, muxer_options, &fake_clock,
-
421  encryption_key_source.get(), mpd_notifier.get(),
-
422  &remux_jobs)) {
-
423  return false;
-
424  }
-
425 
-
426  Status status = RunRemuxJobs(remux_jobs);
-
427  if (!status.ok()) {
-
428  LOG(ERROR) << "Packaging Error: " << status.ToString();
-
429  return false;
-
430  }
-
431 
-
432  printf("Packaging completed successfully.\n");
-
433  return true;
-
434 }
-
435 
-
436 int PackagerMain(int argc, char** argv) {
-
437  // Needed to enable VLOG/DVLOG through --vmodule or --v.
-
438  base::CommandLine::Init(argc, argv);
-
439  CHECK(logging::InitLogging(logging::LoggingSettings()));
-
440 
-
441  google::SetUsageMessage(base::StringPrintf(kUsage, argv[0]));
-
442  google::ParseCommandLineFlags(&argc, &argv, true);
-
443  if (argc < 2) {
-
444  std::string version_string =
-
445  base::StringPrintf("edash-packager version %s", kPackagerVersion);
-
446  google::ShowUsageWithFlags(version_string.c_str());
-
447  return kSuccess;
-
448  }
-
449 
- -
451  return kArgumentValidationFailed;
-
452 
-
453  edash_packager::media::LibcryptoThreading libcrypto_threading;
-
454  // TODO(tinskip): Make InsertStreamDescriptor a member of
-
455  // StreamDescriptorList.
-
456  StreamDescriptorList stream_descriptors;
-
457  for (int i = 1; i < argc; ++i) {
-
458  if (!InsertStreamDescriptor(argv[i], &stream_descriptors))
-
459  return kArgumentValidationFailed;
-
460  }
-
461  return RunPackager(stream_descriptors) ? kSuccess : kPackagingFailed;
-
462 }
-
463 
-
464 } // namespace media
-
465 } // namespace edash_packager
-
466 
-
467 int main(int argc, char** argv) {
-
468  return edash_packager::media::PackagerMain(argc, argv);
-
469 }
+
18 #include "packager/base/at_exit.h"
+
19 #include "packager/base/command_line.h"
+
20 #include "packager/base/logging.h"
+
21 #include "packager/base/stl_util.h"
+
22 #include "packager/base/strings/string_split.h"
+
23 #include "packager/base/strings/stringprintf.h"
+
24 #include "packager/base/threading/simple_thread.h"
+
25 #include "packager/base/time/clock.h"
+
26 #include "packager/media/base/container_names.h"
+
27 #include "packager/media/base/demuxer.h"
+
28 #include "packager/media/base/key_source.h"
+
29 #include "packager/media/base/muxer_options.h"
+
30 #include "packager/media/base/muxer_util.h"
+
31 #include "packager/media/event/mpd_notify_muxer_listener.h"
+
32 #include "packager/media/event/vod_media_info_dump_muxer_listener.h"
+
33 #include "packager/media/file/file.h"
+
34 #include "packager/media/formats/mp4/mp4_muxer.h"
+
35 #include "packager/media/formats/webm/webm_muxer.h"
+
36 #include "packager/mpd/base/dash_iop_mpd_notifier.h"
+
37 #include "packager/mpd/base/media_info.pb.h"
+
38 #include "packager/mpd/base/mpd_builder.h"
+
39 #include "packager/mpd/base/simple_mpd_notifier.h"
+
40 #include "packager/version/version.h"
+
41 
+
42 DEFINE_bool(use_fake_clock_for_muxer,
+
43  false,
+
44  "Set to true to use a fake clock for muxer. With this flag set, "
+
45  "creation time and modification time in outputs are set to 0. "
+
46  "Should only be used for testing.");
+
47 
+
48 namespace {
+
49 const char kUsage[] =
+
50  "Packager driver program. Usage:\n\n"
+
51  "%s [flags] <stream_descriptor> ...\n"
+
52  "stream_descriptor consists of comma separated field_name/value pairs:\n"
+
53  "field_name=value,[field_name=value,]...\n"
+
54  "Supported field names are as follows:\n"
+
55  " - input (in): Required input/source media file path or network stream\n"
+
56  " URL.\n"
+
57  " - stream_selector (stream): Required field with value 'audio',\n"
+
58  " 'video', or stream number (zero based).\n"
+
59  " - output (out): Required output file (single file) or initialization\n"
+
60  " file path (multiple file).\n"
+
61  " - segment_template (segment): Optional value which specifies the\n"
+
62  " naming pattern for the segment files, and that the stream should be\n"
+
63  " split into multiple files. Its presence should be consistent across\n"
+
64  " streams.\n"
+
65  " - bandwidth (bw): Optional value which contains a user-specified\n"
+
66  " content bit rate for the stream, in bits/sec. If specified, this\n"
+
67  " value is propagated to the $Bandwidth$ template parameter for\n"
+
68  " segment names. If not specified, its value may be estimated.\n"
+
69  " - language (lang): Optional value which contains a user-specified\n"
+
70  " language tag. If specified, this value overrides any language\n"
+
71  " metadata in the input track.\n"
+
72  " - output_format (format): Optional value which specifies the format\n"
+
73  " of the output files (MP4 or WebM). If not specified, it will be\n"
+
74  " derived from the file extension of the output file.\n";
+
75 
+
76 const char kMediaInfoSuffix[] = ".media_info";
+
77 
+
78 enum ExitStatus {
+
79  kSuccess = 0,
+
80  kArgumentValidationFailed,
+
81  kPackagingFailed,
+
82  kInternalError,
+
83 };
+
84 
+
85 // TODO(rkuroiwa): Write TTML and WebVTT parser (demuxing) for a better check
+
86 // and for supporting live/segmenting (muxing). With a demuxer and a muxer,
+
87 // CreateRemuxJobs() shouldn't treat text as a special case.
+
88 std::string DetermineTextFileFormat(const std::string& file) {
+
89  std::string content;
+
90  if (!edash_packager::media::File::ReadFileToString(file.c_str(), &content)) {
+
91  LOG(ERROR) << "Failed to open file " << file
+
92  << " to determine file format.";
+
93  return "";
+
94  }
+
95  edash_packager::media::MediaContainerName container_name =
+
96  edash_packager::media::DetermineContainer(
+
97  reinterpret_cast<const uint8_t*>(content.data()), content.size());
+
98  if (container_name == edash_packager::media::CONTAINER_WEBVTT) {
+
99  return "vtt";
+
100  } else if (container_name == edash_packager::media::CONTAINER_TTML) {
+
101  return "ttml";
+
102  }
+
103 
+
104  return "";
+
105 }
+
106 
+
107 } // namespace
+
108 
+
109 namespace edash_packager {
+
110 namespace media {
+
111 
+
112 // A fake clock that always return time 0 (epoch). Should only be used for
+
113 // testing.
+
114 class FakeClock : public base::Clock {
+
115  public:
+
116  base::Time Now() override { return base::Time(); }
+
117 };
+
118 
+
119 // Demux, Mux(es) and worker thread used to remux a source file/stream.
+
120 class RemuxJob : public base::SimpleThread {
+
121  public:
+
122  RemuxJob(scoped_ptr<Demuxer> demuxer)
+
123  : SimpleThread("RemuxJob"),
+
124  demuxer_(demuxer.Pass()) {}
+
125 
+
126  ~RemuxJob() override {
+
127  STLDeleteElements(&muxers_);
+
128  }
+
129 
+
130  void AddMuxer(scoped_ptr<Muxer> mux) {
+
131  muxers_.push_back(mux.release());
+
132  }
+
133 
+
134  Demuxer* demuxer() { return demuxer_.get(); }
+
135  Status status() { return status_; }
+
136 
+
137  private:
+
138  void Run() override {
+
139  DCHECK(demuxer_);
+
140  status_ = demuxer_->Run();
+
141  }
+
142 
+
143  scoped_ptr<Demuxer> demuxer_;
+
144  std::vector<Muxer*> muxers_;
+
145  Status status_;
+
146 
+
147  DISALLOW_COPY_AND_ASSIGN(RemuxJob);
+
148 };
+
149 
+
150 bool StreamInfoToTextMediaInfo(const StreamDescriptor& stream_descriptor,
+
151  const MuxerOptions& stream_muxer_options,
+
152  MediaInfo* text_media_info) {
+
153  const std::string& language = stream_descriptor.language;
+
154  std::string format = DetermineTextFileFormat(stream_descriptor.input);
+
155  if (format.empty()) {
+
156  LOG(ERROR) << "Failed to determine the text file format for "
+
157  << stream_descriptor.input;
+
158  return false;
+
159  }
+
160 
+
161  if (!File::Copy(stream_descriptor.input.c_str(),
+
162  stream_muxer_options.output_file_name.c_str())) {
+
163  LOG(ERROR) << "Failed to copy the input file (" << stream_descriptor.input
+
164  << ") to output file (" << stream_muxer_options.output_file_name
+
165  << ").";
+
166  return false;
+
167  }
+
168 
+
169  text_media_info->set_media_file_name(stream_muxer_options.output_file_name);
+
170  text_media_info->set_container_type(MediaInfo::CONTAINER_TEXT);
+
171 
+
172  if (stream_muxer_options.bandwidth != 0) {
+
173  text_media_info->set_bandwidth(stream_muxer_options.bandwidth);
+
174  } else {
+
175  // Text files are usually small and since the input is one file; there's no
+
176  // way for the player to do ranged requests. So set this value to something
+
177  // reasonable.
+
178  text_media_info->set_bandwidth(256);
+
179  }
+
180 
+
181  MediaInfo::TextInfo* text_info = text_media_info->mutable_text_info();
+
182  text_info->set_format(format);
+
183  if (!language.empty())
+
184  text_info->set_language(language);
+
185 
+
186  return true;
+
187 }
+
188 
+
189 scoped_ptr<Muxer> CreateOutputMuxer(const MuxerOptions& options,
+
190  MediaContainerName container) {
+
191  if (container == CONTAINER_WEBM) {
+
192  return scoped_ptr<Muxer>(new webm::WebMMuxer(options));
+
193  } else {
+
194  DCHECK_EQ(container, CONTAINER_MOV);
+
195  return scoped_ptr<Muxer>(new mp4::MP4Muxer(options));
+
196  }
+
197 }
+
198 
+
199 bool CreateRemuxJobs(const StreamDescriptorList& stream_descriptors,
+
200  const MuxerOptions& muxer_options,
+
201  FakeClock* fake_clock,
+
202  KeySource* key_source,
+
203  MpdNotifier* mpd_notifier,
+
204  std::vector<RemuxJob*>* remux_jobs) {
+
205  DCHECK(remux_jobs);
+
206 
+
207  std::string previous_input;
+
208  for (StreamDescriptorList::const_iterator stream_iter =
+
209  stream_descriptors.begin();
+
210  stream_iter != stream_descriptors.end();
+
211  ++stream_iter) {
+
212  // Process stream descriptor.
+
213  MuxerOptions stream_muxer_options(muxer_options);
+
214  stream_muxer_options.output_file_name = stream_iter->output;
+
215  if (!stream_iter->segment_template.empty()) {
+
216  if (!ValidateSegmentTemplate(stream_iter->segment_template)) {
+
217  LOG(ERROR) << "ERROR: segment template with '"
+
218  << stream_iter->segment_template << "' is invalid.";
+
219  return false;
+
220  }
+
221  stream_muxer_options.segment_template = stream_iter->segment_template;
+
222  }
+
223  stream_muxer_options.bandwidth = stream_iter->bandwidth;
+
224 
+
225  // Handle text input.
+
226  if (stream_iter->stream_selector == "text") {
+
227  MediaInfo text_media_info;
+
228  if (!StreamInfoToTextMediaInfo(*stream_iter, stream_muxer_options,
+
229  &text_media_info)) {
+
230  return false;
+
231  }
+
232 
+
233  if (mpd_notifier) {
+
234  uint32 unused;
+
235  if (!mpd_notifier->NotifyNewContainer(text_media_info, &unused)) {
+
236  LOG(ERROR) << "Failed to process text file " << stream_iter->input;
+
237  } else {
+
238  mpd_notifier->Flush();
+
239  }
+
240  } else if (FLAGS_output_media_info) {
+ +
242  text_media_info,
+
243  stream_muxer_options.output_file_name + kMediaInfoSuffix);
+
244  } else {
+
245  NOTIMPLEMENTED()
+
246  << "--mpd_output or --output_media_info flags are "
+
247  "required for text output. Skipping manifest related output for "
+
248  << stream_iter->input;
+
249  }
+
250  continue;
+
251  }
+
252 
+
253  if (stream_iter->input != previous_input) {
+
254  // New remux job needed. Create demux and job thread.
+
255  scoped_ptr<Demuxer> demuxer(new Demuxer(stream_iter->input));
+
256  if (FLAGS_enable_widevine_decryption ||
+
257  FLAGS_enable_fixed_key_decryption) {
+
258  scoped_ptr<KeySource> key_source(CreateDecryptionKeySource());
+
259  if (!key_source)
+
260  return false;
+
261  demuxer->SetKeySource(key_source.Pass());
+
262  }
+
263  Status status = demuxer->Initialize();
+
264  if (!status.ok()) {
+
265  LOG(ERROR) << "Demuxer failed to initialize: " << status.ToString();
+
266  return false;
+
267  }
+
268  if (FLAGS_dump_stream_info) {
+
269  printf("\nFile \"%s\":\n", stream_iter->input.c_str());
+
270  DumpStreamInfo(demuxer->streams());
+
271  if (stream_iter->output.empty())
+
272  continue; // just need stream info.
+
273  }
+
274  remux_jobs->push_back(new RemuxJob(demuxer.Pass()));
+
275  previous_input = stream_iter->input;
+
276  }
+
277  DCHECK(!remux_jobs->empty());
+
278 
+
279  MediaContainerName output_format = stream_iter->output_format;
+
280  if (output_format == CONTAINER_UNKNOWN) {
+
281  output_format =
+
282  DetermineContainerFromFileName(stream_muxer_options.output_file_name);
+
283 
+
284  if (output_format == CONTAINER_UNKNOWN) {
+
285  LOG(ERROR) << "Unable to determine output format for file "
+
286  << stream_muxer_options.output_file_name;
+
287  return false;
+
288  }
+
289  }
+
290 
+
291  scoped_ptr<Muxer> muxer(
+
292  CreateOutputMuxer(stream_muxer_options, output_format));
+
293  if (FLAGS_use_fake_clock_for_muxer) muxer->set_clock(fake_clock);
+
294 
+
295  if (key_source) {
+
296  muxer->SetKeySource(key_source,
+
297  FLAGS_max_sd_pixels,
+
298  FLAGS_clear_lead,
+
299  FLAGS_crypto_period_duration);
+
300  }
+
301 
+
302  scoped_ptr<MuxerListener> muxer_listener;
+
303  DCHECK(!(FLAGS_output_media_info && mpd_notifier));
+
304  if (FLAGS_output_media_info) {
+
305  const std::string output_media_info_file_name =
+
306  stream_muxer_options.output_file_name + kMediaInfoSuffix;
+
307  scoped_ptr<VodMediaInfoDumpMuxerListener>
+
308  vod_media_info_dump_muxer_listener(
+
309  new VodMediaInfoDumpMuxerListener(output_media_info_file_name));
+
310  vod_media_info_dump_muxer_listener->SetContentProtectionSchemeIdUri(
+
311  FLAGS_scheme_id_uri);
+
312  muxer_listener = vod_media_info_dump_muxer_listener.Pass();
+
313  }
+
314  if (mpd_notifier) {
+
315  scoped_ptr<MpdNotifyMuxerListener> mpd_notify_muxer_listener(
+
316  new MpdNotifyMuxerListener(mpd_notifier));
+
317  mpd_notify_muxer_listener->SetContentProtectionSchemeIdUri(
+
318  FLAGS_scheme_id_uri);
+
319  muxer_listener = mpd_notify_muxer_listener.Pass();
+
320  }
+
321 
+
322  if (muxer_listener)
+
323  muxer->SetMuxerListener(muxer_listener.Pass());
+
324 
+
325  if (!AddStreamToMuxer(remux_jobs->back()->demuxer()->streams(),
+
326  stream_iter->stream_selector,
+
327  stream_iter->language,
+
328  muxer.get()))
+
329  return false;
+
330  remux_jobs->back()->AddMuxer(muxer.Pass());
+
331  }
+
332 
+
333  return true;
+
334 }
+
335 
+
336 Status RunRemuxJobs(const std::vector<RemuxJob*>& remux_jobs) {
+
337  // Start the job threads.
+
338  for (std::vector<RemuxJob*>::const_iterator job_iter = remux_jobs.begin();
+
339  job_iter != remux_jobs.end();
+
340  ++job_iter) {
+
341  (*job_iter)->Start();
+
342  }
+
343 
+
344  // Wait for all jobs to complete or an error occurs.
+
345  Status status;
+
346  bool all_joined;
+
347  do {
+
348  all_joined = true;
+
349  for (std::vector<RemuxJob*>::const_iterator job_iter = remux_jobs.begin();
+
350  job_iter != remux_jobs.end();
+
351  ++job_iter) {
+
352  if ((*job_iter)->HasBeenJoined()) {
+
353  status = (*job_iter)->status();
+
354  if (!status.ok())
+
355  break;
+
356  } else {
+
357  all_joined = false;
+
358  (*job_iter)->Join();
+
359  }
+
360  }
+
361  } while (!all_joined && status.ok());
+
362 
+
363  return status;
+
364 }
+
365 
+
366 bool RunPackager(const StreamDescriptorList& stream_descriptors) {
+
367  if (!AssignFlagsFromProfile())
+
368  return false;
+
369 
+
370  if (FLAGS_output_media_info && !FLAGS_mpd_output.empty()) {
+
371  NOTIMPLEMENTED() << "ERROR: --output_media_info and --mpd_output do not "
+
372  "work together.";
+
373  return false;
+
374  }
+
375  if (FLAGS_output_media_info && !FLAGS_single_segment) {
+
376  // TODO(rkuroiwa, kqyang): Support partial media info dump for live.
+
377  NOTIMPLEMENTED() << "ERROR: --output_media_info is only supported if "
+
378  "--single_segment is true.";
+
379  return false;
+
380  }
+
381 
+
382  // Get basic muxer options.
+
383  MuxerOptions muxer_options;
+
384  if (!GetMuxerOptions(&muxer_options))
+
385  return false;
+
386 
+
387  MpdOptions mpd_options;
+
388  if (!GetMpdOptions(&mpd_options))
+
389  return false;
+
390 
+
391  // Create encryption key source if needed.
+
392  scoped_ptr<KeySource> encryption_key_source;
+
393  if (FLAGS_enable_widevine_encryption || FLAGS_enable_fixed_key_encryption) {
+
394  encryption_key_source = CreateEncryptionKeySource();
+
395  if (!encryption_key_source)
+
396  return false;
+
397  }
+
398 
+
399  scoped_ptr<MpdNotifier> mpd_notifier;
+
400  if (!FLAGS_mpd_output.empty()) {
+
401  DashProfile profile =
+
402  FLAGS_single_segment ? kOnDemandProfile : kLiveProfile;
+
403  std::vector<std::string> base_urls;
+
404  base::SplitString(FLAGS_base_urls, ',', &base_urls);
+
405  if (FLAGS_generate_dash_if_iop_compliant_mpd) {
+
406  mpd_notifier.reset(new DashIopMpdNotifier(profile, mpd_options, base_urls,
+
407  FLAGS_mpd_output));
+
408  } else {
+
409  mpd_notifier.reset(new SimpleMpdNotifier(profile, mpd_options, base_urls,
+
410  FLAGS_mpd_output));
+
411  }
+
412  if (!mpd_notifier->Init()) {
+
413  LOG(ERROR) << "MpdNotifier failed to initialize.";
+
414  return false;
+
415  }
+
416  }
+
417 
+
418  std::vector<RemuxJob*> remux_jobs;
+
419  STLElementDeleter<std::vector<RemuxJob*> > scoped_jobs_deleter(&remux_jobs);
+
420  FakeClock fake_clock;
+
421  if (!CreateRemuxJobs(stream_descriptors, muxer_options, &fake_clock,
+
422  encryption_key_source.get(), mpd_notifier.get(),
+
423  &remux_jobs)) {
+
424  return false;
+
425  }
+
426 
+
427  Status status = RunRemuxJobs(remux_jobs);
+
428  if (!status.ok()) {
+
429  LOG(ERROR) << "Packaging Error: " << status.ToString();
+
430  return false;
+
431  }
+
432 
+
433  printf("Packaging completed successfully.\n");
+
434  return true;
+
435 }
+
436 
+
437 int PackagerMain(int argc, char** argv) {
+
438  base::AtExitManager exit;
+
439  // Needed to enable VLOG/DVLOG through --vmodule or --v.
+
440  base::CommandLine::Init(argc, argv);
+
441  CHECK(logging::InitLogging(logging::LoggingSettings()));
+
442 
+
443  google::SetUsageMessage(base::StringPrintf(kUsage, argv[0]));
+
444  google::ParseCommandLineFlags(&argc, &argv, true);
+
445  if (argc < 2) {
+
446  std::string version_string =
+
447  base::StringPrintf("edash-packager version %s", kPackagerVersion);
+
448  google::ShowUsageWithFlags(version_string.c_str());
+
449  return kSuccess;
+
450  }
+
451 
+ +
453  return kArgumentValidationFailed;
+
454 
+
455  edash_packager::media::LibcryptoThreading libcrypto_threading;
+
456  // TODO(tinskip): Make InsertStreamDescriptor a member of
+
457  // StreamDescriptorList.
+
458  StreamDescriptorList stream_descriptors;
+
459  for (int i = 1; i < argc; ++i) {
+
460  if (!InsertStreamDescriptor(argv[i], &stream_descriptors))
+
461  return kArgumentValidationFailed;
+
462  }
+
463  return RunPackager(stream_descriptors) ? kSuccess : kPackagingFailed;
+
464 }
+
465 
+
466 } // namespace media
+
467 } // namespace edash_packager
+
468 
+
469 int main(int argc, char** argv) {
+
470  return edash_packager::media::PackagerMain(argc, argv);
+
471 }
static bool ReadFileToString(const char *file_name, std::string *contents)
Definition: file.cc:184
@@ -565,7 +567,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/deb/es__parser_8h_source.html b/docs/d2/deb/es__parser_8h_source.html index 29d2b5c38c..d3072022df 100644 --- a/docs/d2/deb/es__parser_8h_source.html +++ b/docs/d2/deb/es__parser_8h_source.html @@ -145,7 +145,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/df3/structedash__packager_1_1media_1_1mp4_1_1Edit-members.html b/docs/d2/df3/structedash__packager_1_1media_1_1mp4_1_1Edit-members.html index ac7aeb6222..4fb0083f9b 100644 --- a/docs/d2/df3/structedash__packager_1_1media_1_1mp4_1_1Edit-members.html +++ b/docs/d2/df3/structedash__packager_1_1media_1_1mp4_1_1Edit-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/df8/structedash__packager_1_1media_1_1mp4_1_1CueSourceIDBox.html b/docs/d2/df8/structedash__packager_1_1media_1_1mp4_1_1CueSourceIDBox.html index 4a26c18fab..1ac6360931 100644 --- a/docs/d2/df8/structedash__packager_1_1media_1_1mp4_1_1CueSourceIDBox.html +++ b/docs/d2/df8/structedash__packager_1_1media_1_1mp4_1_1CueSourceIDBox.html @@ -136,7 +136,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 718 of file box_definitions.h.

+

Definition at line 725 of file box_definitions.h.

Member Function Documentation

@@ -162,7 +162,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 2366 of file box_definitions.cc.

+

Definition at line 2387 of file box_definitions.cc.

@@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d2/dfa/classedash__packager_1_1RepresentationStateChangeListener.html b/docs/d2/dfa/classedash__packager_1_1RepresentationStateChangeListener.html index 9190c4d460..39fb69efd0 100644 --- a/docs/d2/dfa/classedash__packager_1_1RepresentationStateChangeListener.html +++ b/docs/d2/dfa/classedash__packager_1_1RepresentationStateChangeListener.html @@ -195,7 +195,7 @@ Public Member Functions diff --git a/docs/d2/dfd/adts__header_8h_source.html b/docs/d2/dfd/adts__header_8h_source.html index d6d2993a7b..ff10ca8558 100644 --- a/docs/d2/dfd/adts__header_8h_source.html +++ b/docs/d2/dfd/adts__header_8h_source.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d2/dfd/classedash__packager_1_1media_1_1MediaStream.html b/docs/d2/dfd/classedash__packager_1_1media_1_1MediaStream.html index 62eff00034..c46c3c08fc 100644 --- a/docs/d2/dfd/classedash__packager_1_1media_1_1MediaStream.html +++ b/docs/d2/dfd/classedash__packager_1_1media_1_1MediaStream.html @@ -225,7 +225,7 @@ const scoped_refptr< diff --git a/docs/d3/d00/structedash__packager_1_1media_1_1VPxFrameInfo-members.html b/docs/d3/d00/structedash__packager_1_1media_1_1VPxFrameInfo-members.html index d86e7e86e0..92b7e8a9a1 100644 --- a/docs/d3/d00/structedash__packager_1_1media_1_1VPxFrameInfo-members.html +++ b/docs/d3/d00/structedash__packager_1_1media_1_1VPxFrameInfo-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d04/classedash__packager_1_1media_1_1WebMAudioClient-members.html b/docs/d3/d04/classedash__packager_1_1media_1_1WebMAudioClient-members.html index d43fcc1eaf..3b7c8f0ea4 100644 --- a/docs/d3/d04/classedash__packager_1_1media_1_1WebMAudioClient-members.html +++ b/docs/d3/d04/classedash__packager_1_1media_1_1WebMAudioClient-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d0e/classedash__packager_1_1media_1_1MpdNotifyMuxerListener.html b/docs/d3/d0e/classedash__packager_1_1media_1_1MpdNotifyMuxerListener.html index cf4579fb36..3490a80784 100644 --- a/docs/d3/d0e/classedash__packager_1_1media_1_1MpdNotifyMuxerListener.html +++ b/docs/d3/d0e/classedash__packager_1_1media_1_1MpdNotifyMuxerListener.html @@ -234,7 +234,7 @@ Additional Inherited Members diff --git a/docs/d3/d15/udp__file__win_8cc_source.html b/docs/d3/d15/udp__file__win_8cc_source.html index 6dbf32d753..261f13ad63 100644 --- a/docs/d3/d15/udp__file__win_8cc_source.html +++ b/docs/d3/d15/udp__file__win_8cc_source.html @@ -160,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d19/io__cache_8h_source.html b/docs/d3/d19/io__cache_8h_source.html index 79a83c5247..036ca18681 100644 --- a/docs/d3/d19/io__cache_8h_source.html +++ b/docs/d3/d19/io__cache_8h_source.html @@ -162,7 +162,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d1c/structedash__packager_1_1media_1_1mp4_1_1VTTEmptyCueBox.html b/docs/d3/d1c/structedash__packager_1_1media_1_1mp4_1_1VTTEmptyCueBox.html index 44bc8bf911..97500f58b2 100644 --- a/docs/d3/d1c/structedash__packager_1_1media_1_1mp4_1_1VTTEmptyCueBox.html +++ b/docs/d3/d1c/structedash__packager_1_1media_1_1mp4_1_1VTTEmptyCueBox.html @@ -129,7 +129,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 743 of file box_definitions.h.

+

Definition at line 750 of file box_definitions.h.

Member Function Documentation

@@ -155,7 +155,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 2457 of file box_definitions.cc.

+

Definition at line 2478 of file box_definitions.cc.

@@ -166,7 +166,7 @@ Additional Inherited Members diff --git a/docs/d3/d2c/structedash__packager_1_1media_1_1mp4_1_1TrackExtends.html b/docs/d3/d2c/structedash__packager_1_1media_1_1mp4_1_1TrackExtends.html index 8ed7ee8dfc..5b8c369186 100644 --- a/docs/d3/d2c/structedash__packager_1_1media_1_1mp4_1_1TrackExtends.html +++ b/docs/d3/d2c/structedash__packager_1_1media_1_1mp4_1_1TrackExtends.html @@ -157,7 +157,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 534 of file box_definitions.h.

+

Definition at line 541 of file box_definitions.h.

Member Function Documentation

@@ -183,7 +183,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 1801 of file box_definitions.cc.

+

Definition at line 1822 of file box_definitions.cc.

@@ -194,7 +194,7 @@ Additional Inherited Members diff --git a/docs/d3/d2f/structedash__packager_1_1media_1_1mp4_1_1TrackEncryption-members.html b/docs/d3/d2f/structedash__packager_1_1media_1_1mp4_1_1TrackEncryption-members.html index fdfa926a16..51d982c71c 100644 --- a/docs/d3/d2f/structedash__packager_1_1media_1_1mp4_1_1TrackEncryption-members.html +++ b/docs/d3/d2f/structedash__packager_1_1media_1_1mp4_1_1TrackEncryption-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d3e/classedash__packager_1_1media_1_1HttpKeyFetcher.html b/docs/d3/d3e/classedash__packager_1_1media_1_1HttpKeyFetcher.html index 8ec8068d27..3858058fe9 100644 --- a/docs/d3/d3e/classedash__packager_1_1media_1_1HttpKeyFetcher.html +++ b/docs/d3/d3e/classedash__packager_1_1media_1_1HttpKeyFetcher.html @@ -311,7 +311,7 @@ KeyFetcher implementation overrides. diff --git a/docs/d3/d48/structedash__packager_1_1media_1_1mp4_1_1EditList-members.html b/docs/d3/d48/structedash__packager_1_1media_1_1mp4_1_1EditList-members.html index 757feb2c29..f74544b431 100644 --- a/docs/d3/d48/structedash__packager_1_1media_1_1mp4_1_1EditList-members.html +++ b/docs/d3/d48/structedash__packager_1_1media_1_1mp4_1_1EditList-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d52/classedash__packager_1_1media_1_1mp4_1_1ChunkInfoIterator-members.html b/docs/d3/d52/classedash__packager_1_1media_1_1mp4_1_1ChunkInfoIterator-members.html index 88d5a3aaa9..1a220c62c4 100644 --- a/docs/d3/d52/classedash__packager_1_1media_1_1mp4_1_1ChunkInfoIterator-members.html +++ b/docs/d3/d52/classedash__packager_1_1media_1_1mp4_1_1ChunkInfoIterator-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d56/decrypt__config_8cc_source.html b/docs/d3/d56/decrypt__config_8cc_source.html index 96424b8362..51c9af607b 100644 --- a/docs/d3/d56/decrypt__config_8cc_source.html +++ b/docs/d3/d56/decrypt__config_8cc_source.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d59/structedash__packager_1_1media_1_1mp4_1_1PrivFrame.html b/docs/d3/d59/structedash__packager_1_1media_1_1mp4_1_1PrivFrame.html index f4aaca9db2..4256e1e330 100644 --- a/docs/d3/d59/structedash__packager_1_1media_1_1mp4_1_1PrivFrame.html +++ b/docs/d3/d59/structedash__packager_1_1media_1_1mp4_1_1PrivFrame.html @@ -129,7 +129,7 @@ std::string value diff --git a/docs/d3/d62/rcheck_8h_source.html b/docs/d3/d62/rcheck_8h_source.html index 263cbe1f2b..08b9df59fe 100644 --- a/docs/d3/d62/rcheck_8h_source.html +++ b/docs/d3/d62/rcheck_8h_source.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d67/structedash__packager_1_1media_1_1mp4_1_1PrivFrame-members.html b/docs/d3/d67/structedash__packager_1_1media_1_1mp4_1_1PrivFrame-members.html index 142bb4798b..1aca5cf66c 100644 --- a/docs/d3/d67/structedash__packager_1_1media_1_1mp4_1_1PrivFrame-members.html +++ b/docs/d3/d67/structedash__packager_1_1media_1_1mp4_1_1PrivFrame-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d69/classedash__packager_1_1media_1_1ClusterBuilder.html b/docs/d3/d69/classedash__packager_1_1media_1_1ClusterBuilder.html index 74ccace3c2..dadd6d8ca3 100644 --- a/docs/d3/d69/classedash__packager_1_1media_1_1ClusterBuilder.html +++ b/docs/d3/d69/classedash__packager_1_1media_1_1ClusterBuilder.html @@ -125,7 +125,7 @@ scoped_ptr< diff --git a/docs/d3/d6b/classedash__packager_1_1media_1_1IoCache.html b/docs/d3/d6b/classedash__packager_1_1media_1_1IoCache.html index 6b3a3fdd20..e9a9334617 100644 --- a/docs/d3/d6b/classedash__packager_1_1media_1_1IoCache.html +++ b/docs/d3/d6b/classedash__packager_1_1media_1_1IoCache.html @@ -297,7 +297,7 @@ void  diff --git a/docs/d3/d74/structedash__packager_1_1media_1_1mp4_1_1SampleDescription.html b/docs/d3/d74/structedash__packager_1_1media_1_1mp4_1_1SampleDescription.html index 115c9ecc93..7f6e94c5c3 100644 --- a/docs/d3/d74/structedash__packager_1_1media_1_1mp4_1_1SampleDescription.html +++ b/docs/d3/d74/structedash__packager_1_1media_1_1mp4_1_1SampleDescription.html @@ -154,7 +154,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 350 of file box_definitions.h.

+

Definition at line 357 of file box_definitions.h.

Member Function Documentation

@@ -180,7 +180,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 575 of file box_definitions.cc.

+

Definition at line 576 of file box_definitions.cc.

@@ -191,7 +191,7 @@ Additional Inherited Members diff --git a/docs/d3/d76/muxer__flags_8h_source.html b/docs/d3/d76/muxer__flags_8h_source.html index 74672791b9..fd8723c0d1 100644 --- a/docs/d3/d76/muxer__flags_8h_source.html +++ b/docs/d3/d76/muxer__flags_8h_source.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d77/structedash__packager_1_1media_1_1mp4_1_1SampleTable.html b/docs/d3/d77/structedash__packager_1_1media_1_1mp4_1_1SampleTable.html index 6f9b163e04..9b893ffe4e 100644 --- a/docs/d3/d77/structedash__packager_1_1media_1_1mp4_1_1SampleTable.html +++ b/docs/d3/d77/structedash__packager_1_1media_1_1mp4_1_1SampleTable.html @@ -154,7 +154,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 437 of file box_definitions.h.

+

Definition at line 444 of file box_definitions.h.

Member Function Documentation

@@ -180,7 +180,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 902 of file box_definitions.cc.

+

Definition at line 903 of file box_definitions.cc.

@@ -191,7 +191,7 @@ Additional Inherited Members diff --git a/docs/d3/d80/muxer__util_8h_source.html b/docs/d3/d80/muxer__util_8h_source.html index 81eeb08c78..2579e155af 100644 --- a/docs/d3/d80/muxer__util_8h_source.html +++ b/docs/d3/d80/muxer__util_8h_source.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d81/classedash__packager_1_1media_1_1MemoryFile.html b/docs/d3/d81/classedash__packager_1_1media_1_1MemoryFile.html index da26a36529..5e30dbdda0 100644 --- a/docs/d3/d81/classedash__packager_1_1media_1_1MemoryFile.html +++ b/docs/d3/d81/classedash__packager_1_1media_1_1MemoryFile.html @@ -485,7 +485,7 @@ bool  diff --git a/docs/d3/d8a/classedash__packager_1_1RepresentationStateChangeListener-members.html b/docs/d3/d8a/classedash__packager_1_1RepresentationStateChangeListener-members.html index 9c8764e1b5..66b652179d 100644 --- a/docs/d3/d8a/classedash__packager_1_1RepresentationStateChangeListener-members.html +++ b/docs/d3/d8a/classedash__packager_1_1RepresentationStateChangeListener-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d8d/webm__audio__client_8h_source.html b/docs/d3/d8d/webm__audio__client_8h_source.html index d7842a5989..0da8b77913 100644 --- a/docs/d3/d8d/webm__audio__client_8h_source.html +++ b/docs/d3/d8d/webm__audio__client_8h_source.html @@ -142,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d8e/classedash__packager_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter-members.html b/docs/d3/d8e/classedash__packager_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter-members.html index 72041ba443..c01a387aa3 100644 --- a/docs/d3/d8e/classedash__packager_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter-members.html +++ b/docs/d3/d8e/classedash__packager_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter-members.html @@ -129,7 +129,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d9b/structedash__packager_1_1media_1_1VideoStreamInfoParameters-members.html b/docs/d3/d9b/structedash__packager_1_1media_1_1VideoStreamInfoParameters-members.html index 33e093b581..e94ad19694 100644 --- a/docs/d3/d9b/structedash__packager_1_1media_1_1VideoStreamInfoParameters-members.html +++ b/docs/d3/d9b/structedash__packager_1_1media_1_1VideoStreamInfoParameters-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/d9f/classedash__packager_1_1media_1_1mp4_1_1ESDescriptor-members.html b/docs/d3/d9f/classedash__packager_1_1media_1_1mp4_1_1ESDescriptor-members.html index 604c356641..5f2dff7413 100644 --- a/docs/d3/d9f/classedash__packager_1_1media_1_1mp4_1_1ESDescriptor-members.html +++ b/docs/d3/d9f/classedash__packager_1_1media_1_1mp4_1_1ESDescriptor-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/db6/webm__parser_8cc_source.html b/docs/d3/db6/webm__parser_8cc_source.html index ae4f39690f..5fec3df91e 100644 --- a/docs/d3/db6/webm__parser_8cc_source.html +++ b/docs/d3/db6/webm__parser_8cc_source.html @@ -1068,7 +1068,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/dbc/seek__head_8cc_source.html b/docs/d3/dbc/seek__head_8cc_source.html index 3a6cf19f1c..5b304487bb 100644 --- a/docs/d3/dbc/seek__head_8cc_source.html +++ b/docs/d3/dbc/seek__head_8cc_source.html @@ -215,7 +215,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/dbc/structedash__packager_1_1media_1_1H264WeightingFactors.html b/docs/d3/dbc/structedash__packager_1_1media_1_1H264WeightingFactors.html index b7458959c2..072a005faf 100644 --- a/docs/d3/dbc/structedash__packager_1_1media_1_1H264WeightingFactors.html +++ b/docs/d3/dbc/structedash__packager_1_1media_1_1H264WeightingFactors.html @@ -124,7 +124,7 @@ int chroma_offset [32] diff --git a/docs/d3/dbd/structedash__packager_1_1media_1_1mp4_1_1HandlerReference.html b/docs/d3/dbd/structedash__packager_1_1media_1_1mp4_1_1HandlerReference.html index d4ee2e61ca..b8c206d44c 100644 --- a/docs/d3/dbd/structedash__packager_1_1media_1_1mp4_1_1HandlerReference.html +++ b/docs/d3/dbd/structedash__packager_1_1media_1_1mp4_1_1HandlerReference.html @@ -171,7 +171,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 1007 of file box_definitions.cc.

+

Definition at line 1008 of file box_definitions.cc.

@@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d3/dbe/classedash__packager_1_1media_1_1WebMMediaParser-members.html b/docs/d3/dbe/classedash__packager_1_1media_1_1WebMMediaParser-members.html index 362840cdbc..a66d981c7b 100644 --- a/docs/d3/dbe/classedash__packager_1_1media_1_1WebMMediaParser-members.html +++ b/docs/d3/dbe/classedash__packager_1_1media_1_1WebMMediaParser-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/dbe/demuxer_8cc_source.html b/docs/d3/dbe/demuxer_8cc_source.html index 12538c2cde..30528df473 100644 --- a/docs/d3/dbe/demuxer_8cc_source.html +++ b/docs/d3/dbe/demuxer_8cc_source.html @@ -311,7 +311,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/dc0/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset-members.html b/docs/d3/dc0/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset-members.html index 8d094ea565..e391d6de15 100644 --- a/docs/d3/dc0/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset-members.html +++ b/docs/d3/dc0/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/dcc/classedash__packager_1_1media_1_1ProgressListener-members.html b/docs/d3/dcc/classedash__packager_1_1media_1_1ProgressListener-members.html index 351eb0176f..be8b7db090 100644 --- a/docs/d3/dcc/classedash__packager_1_1media_1_1ProgressListener-members.html +++ b/docs/d3/dcc/classedash__packager_1_1media_1_1ProgressListener-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/dd0/classedash__packager_1_1media_1_1mp4_1_1BoxReader-members.html b/docs/d3/dd0/classedash__packager_1_1media_1_1mp4_1_1BoxReader-members.html index 81ba904d8d..65eb2cac2e 100644 --- a/docs/d3/dd0/classedash__packager_1_1media_1_1mp4_1_1BoxReader-members.html +++ b/docs/d3/dd0/classedash__packager_1_1media_1_1mp4_1_1BoxReader-members.html @@ -128,7 +128,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/de1/structedash__packager_1_1media_1_1mp4_1_1Track.html b/docs/d3/de1/structedash__packager_1_1media_1_1mp4_1_1Track.html index 07fe34ff90..a44e5a732e 100644 --- a/docs/d3/de1/structedash__packager_1_1media_1_1mp4_1_1Track.html +++ b/docs/d3/de1/structedash__packager_1_1media_1_1mp4_1_1Track.html @@ -145,7 +145,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 519 of file box_definitions.h.

+

Definition at line 526 of file box_definitions.h.

Member Function Documentation

@@ -171,7 +171,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 1758 of file box_definitions.cc.

+

Definition at line 1779 of file box_definitions.cc.

@@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d3/de4/seek__head_8h_source.html b/docs/d3/de4/seek__head_8h_source.html index 6968c31585..9e9ee3b82c 100644 --- a/docs/d3/de4/seek__head_8h_source.html +++ b/docs/d3/de4/seek__head_8h_source.html @@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/de7/structedash__packager_1_1media_1_1OnMediaEndParameters.html b/docs/d3/de7/structedash__packager_1_1media_1_1OnMediaEndParameters.html index f0d35e0e4a..8f614f7fa4 100644 --- a/docs/d3/de7/structedash__packager_1_1media_1_1OnMediaEndParameters.html +++ b/docs/d3/de7/structedash__packager_1_1media_1_1OnMediaEndParameters.html @@ -130,7 +130,7 @@ uint64_t file_size diff --git a/docs/d3/df1/box__reader_8cc_source.html b/docs/d3/df1/box__reader_8cc_source.html index 57e0863d0c..214fa74635 100644 --- a/docs/d3/df1/box__reader_8cc_source.html +++ b/docs/d3/df1/box__reader_8cc_source.html @@ -296,7 +296,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d3/dfa/classedash__packager_1_1MpdBuilder.html b/docs/d3/dfa/classedash__packager_1_1MpdBuilder.html index adc6e4c002..0adb5630c1 100644 --- a/docs/d3/dfa/classedash__packager_1_1MpdBuilder.html +++ b/docs/d3/dfa/classedash__packager_1_1MpdBuilder.html @@ -180,7 +180,7 @@ class DynamicMpdBuilderTes -

Definition at line 396 of file mpd_builder.cc.

+

Definition at line 397 of file mpd_builder.cc.

@@ -215,7 +215,7 @@ class DynamicMpdBuilderTes
Returns
The new adaptation set, which is owned by this instance.
-

Definition at line 407 of file mpd_builder.cc.

+

Definition at line 408 of file mpd_builder.cc.

@@ -240,7 +240,7 @@ class DynamicMpdBuilderTes -

Definition at line 403 of file mpd_builder.cc.

+

Definition at line 404 of file mpd_builder.cc.

@@ -284,7 +284,7 @@ class DynamicMpdBuilderTes -

Definition at line 625 of file mpd_builder.cc.

+

Definition at line 626 of file mpd_builder.cc.

@@ -318,7 +318,7 @@ class DynamicMpdBuilderTes
Returns
true on success, false otherwise.
-

Definition at line 422 of file mpd_builder.cc.

+

Definition at line 423 of file mpd_builder.cc.

@@ -370,7 +370,7 @@ class DynamicMpdBuilderTes
Returns
true on success, false otherwise.
-

Definition at line 417 of file mpd_builder.cc.

+

Definition at line 418 of file mpd_builder.cc.

@@ -381,7 +381,7 @@ class DynamicMpdBuilderTes diff --git a/docs/d3/dfa/structedash__packager_1_1media_1_1H264SliceHeader-members.html b/docs/d3/dfa/structedash__packager_1_1media_1_1H264SliceHeader-members.html index 96421dfff0..e12c991432 100644 --- a/docs/d3/dfa/structedash__packager_1_1media_1_1H264SliceHeader-members.html +++ b/docs/d3/dfa/structedash__packager_1_1media_1_1H264SliceHeader-members.html @@ -154,7 +154,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d00/mp4_2multi__segment__segmenter_8cc_source.html b/docs/d4/d00/mp4_2multi__segment__segmenter_8cc_source.html index ec1b52ba44..a2e9fec60e 100644 --- a/docs/d4/d00/mp4_2multi__segment__segmenter_8cc_source.html +++ b/docs/d4/d00/mp4_2multi__segment__segmenter_8cc_source.html @@ -303,7 +303,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d0b/structedash__packager_1_1media_1_1mp4_1_1Media-members.html b/docs/d4/d0b/structedash__packager_1_1media_1_1mp4_1_1Media-members.html index eb2ad1278b..3ab928c860 100644 --- a/docs/d4/d0b/structedash__packager_1_1media_1_1mp4_1_1Media-members.html +++ b/docs/d4/d0b/structedash__packager_1_1media_1_1mp4_1_1Media-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d1d/classedash__packager_1_1media_1_1Muxer.html b/docs/d4/d1d/classedash__packager_1_1media_1_1Muxer.html index 3b5bdb9f26..e6ce2884f7 100644 --- a/docs/d4/d1d/classedash__packager_1_1media_1_1Muxer.html +++ b/docs/d4/d1d/classedash__packager_1_1media_1_1Muxer.html @@ -331,7 +331,7 @@ class MediaStream diff --git a/docs/d4/d37/io__cache_8cc_source.html b/docs/d4/d37/io__cache_8cc_source.html index a39f89c3e2..8d44ea0671 100644 --- a/docs/d4/d37/io__cache_8cc_source.html +++ b/docs/d4/d37/io__cache_8cc_source.html @@ -253,7 +253,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d3d/structedash__packager_1_1media_1_1mp4_1_1PixelAspectRatio.html b/docs/d4/d3d/structedash__packager_1_1media_1_1mp4_1_1PixelAspectRatio.html index 795b19232c..1476534321 100644 --- a/docs/d4/d3d/structedash__packager_1_1media_1_1mp4_1_1PixelAspectRatio.html +++ b/docs/d4/d3d/structedash__packager_1_1media_1_1mp4_1_1PixelAspectRatio.html @@ -165,7 +165,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 1225 of file box_definitions.cc.

+

Definition at line 1226 of file box_definitions.cc.

@@ -176,7 +176,7 @@ Additional Inherited Members diff --git a/docs/d4/d43/classedash__packager_1_1media_1_1KeyFetcher.html b/docs/d4/d43/classedash__packager_1_1media_1_1KeyFetcher.html index 389777956f..4af1f220e3 100644 --- a/docs/d4/d43/classedash__packager_1_1media_1_1KeyFetcher.html +++ b/docs/d4/d43/classedash__packager_1_1media_1_1KeyFetcher.html @@ -177,7 +177,7 @@ Public Member Functions diff --git a/docs/d4/d55/classedash__packager_1_1media_1_1H264BitReader.html b/docs/d4/d55/classedash__packager_1_1media_1_1H264BitReader.html index 21d12ddf2b..987aa3aaba 100644 --- a/docs/d4/d55/classedash__packager_1_1media_1_1H264BitReader.html +++ b/docs/d4/d55/classedash__packager_1_1media_1_1H264BitReader.html @@ -122,7 +122,7 @@ size_t NumEmulationPrevent diff --git a/docs/d4/d67/structedash__packager_1_1media_1_1mp4_1_1MovieFragment-members.html b/docs/d4/d67/structedash__packager_1_1media_1_1mp4_1_1MovieFragment-members.html index 923688c79c..a92aaa906e 100644 --- a/docs/d4/d67/structedash__packager_1_1media_1_1mp4_1_1MovieFragment-members.html +++ b/docs/d4/d67/structedash__packager_1_1media_1_1mp4_1_1MovieFragment-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d72/classedash__packager_1_1media_1_1webm_1_1SingleSegmentSegmenter-members.html b/docs/d4/d72/classedash__packager_1_1media_1_1webm_1_1SingleSegmentSegmenter-members.html index 246dcc4cbc..f3606dae11 100644 --- a/docs/d4/d72/classedash__packager_1_1media_1_1webm_1_1SingleSegmentSegmenter-members.html +++ b/docs/d4/d72/classedash__packager_1_1media_1_1webm_1_1SingleSegmentSegmenter-members.html @@ -127,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d8c/classedash__packager_1_1media_1_1MkvWriter.html b/docs/d4/d8c/classedash__packager_1_1media_1_1MkvWriter.html index 8b1b785328..0f0850799b 100644 --- a/docs/d4/d8c/classedash__packager_1_1media_1_1MkvWriter.html +++ b/docs/d4/d8c/classedash__packager_1_1media_1_1MkvWriter.html @@ -372,7 +372,7 @@ Public Member Functions diff --git a/docs/d4/d8f/structedash__packager_1_1media_1_1mp4_1_1MovieHeader-members.html b/docs/d4/d8f/structedash__packager_1_1media_1_1mp4_1_1MovieHeader-members.html index 598e203608..378cdc4eb3 100644 --- a/docs/d4/d8f/structedash__packager_1_1media_1_1mp4_1_1MovieHeader-members.html +++ b/docs/d4/d8f/structedash__packager_1_1media_1_1mp4_1_1MovieHeader-members.html @@ -119,7 +119,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/d90/classedash__packager_1_1media_1_1mp4_1_1DecodingTimeIterator.html b/docs/d4/d90/classedash__packager_1_1media_1_1mp4_1_1DecodingTimeIterator.html index 215aca5549..400f2d5a9d 100644 --- a/docs/d4/d90/classedash__packager_1_1media_1_1mp4_1_1DecodingTimeIterator.html +++ b/docs/d4/d90/classedash__packager_1_1media_1_1mp4_1_1DecodingTimeIterator.html @@ -235,7 +235,7 @@ Public Member Functions diff --git a/docs/d4/d92/structedash__packager_1_1media_1_1mp4_1_1MediaData.html b/docs/d4/d92/structedash__packager_1_1media_1_1mp4_1_1MediaData.html index 6203b46706..08badc22d9 100644 --- a/docs/d4/d92/structedash__packager_1_1media_1_1mp4_1_1MediaData.html +++ b/docs/d4/d92/structedash__packager_1_1media_1_1mp4_1_1MediaData.html @@ -136,7 +136,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 712 of file box_definitions.h.

+

Definition at line 719 of file box_definitions.h.

Member Function Documentation

@@ -162,7 +162,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 2352 of file box_definitions.cc.

+

Definition at line 2373 of file box_definitions.cc.

@@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d4/d93/structedash__packager_1_1media_1_1H264SEIMessage.html b/docs/d4/d93/structedash__packager_1_1media_1_1H264SEIMessage.html index 902b81b428..13bf310727 100644 --- a/docs/d4/d93/structedash__packager_1_1media_1_1H264SEIMessage.html +++ b/docs/d4/d93/structedash__packager_1_1media_1_1H264SEIMessage.html @@ -127,7 +127,7 @@ union { diff --git a/docs/d4/d9b/classedash__packager_1_1AdaptationSet-members.html b/docs/d4/d9b/classedash__packager_1_1AdaptationSet-members.html index ed4d29c48e..9a1393bdf6 100644 --- a/docs/d4/d9b/classedash__packager_1_1AdaptationSet-members.html +++ b/docs/d4/d9b/classedash__packager_1_1AdaptationSet-members.html @@ -119,7 +119,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/da1/classedash__packager_1_1media_1_1DecryptConfig.html b/docs/d4/da1/classedash__packager_1_1media_1_1DecryptConfig.html index 5989cef0e1..7e1407e844 100644 --- a/docs/d4/da1/classedash__packager_1_1media_1_1DecryptConfig.html +++ b/docs/d4/da1/classedash__packager_1_1media_1_1DecryptConfig.html @@ -183,7 +183,7 @@ static const size_t  diff --git a/docs/d4/da4/classedash__packager_1_1media_1_1AesCbcCtsEncryptor-members.html b/docs/d4/da4/classedash__packager_1_1media_1_1AesCbcCtsEncryptor-members.html index f70f0e5c62..576f184383 100644 --- a/docs/d4/da4/classedash__packager_1_1media_1_1AesCbcCtsEncryptor-members.html +++ b/docs/d4/da4/classedash__packager_1_1media_1_1AesCbcCtsEncryptor-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/da7/segmenter__test__base_8cc_source.html b/docs/d4/da7/segmenter__test__base_8cc_source.html index ea8cbe42db..efb9509d28 100644 --- a/docs/d4/da7/segmenter__test__base_8cc_source.html +++ b/docs/d4/da7/segmenter__test__base_8cc_source.html @@ -104,198 +104,212 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
15 namespace {
16 
17 // The contents of a frame does not mater.
-
18 const uint8_t kTestMediaSampleData[] = {0xDE, 0xAD, 0xBE, 0xEF, 0x00};
-
19 const size_t kTestMediaSampleDataSize = sizeof(kTestMediaSampleData);
-
20 
-
21 const int kTrackId = 1;
-
22 const uint32_t kTimeScale = 1000;
-
23 const uint64_t kDuration = 8000;
-
24 const VideoCodec kVideoCodec = kCodecVP8;
-
25 const std::string kCodecString = "vp8";
-
26 const std::string kLanguage = "en";
-
27 const uint16_t kWidth = 100;
-
28 const uint16_t kHeight = 100;
-
29 const uint16_t kPixelWidth = 100;
-
30 const uint16_t kPixelHeight = 100;
-
31 const int16_t kTrickPlayRate = 1;
-
32 const uint8_t kNaluLengthSize = 0;
-
33 
-
34 } // namespace
-
35 
-
36 SegmentTestBase::SegmentTestBase() {}
-
37 
-
38 void SegmentTestBase::SetUp() {
-
39  output_file_name_ = "memory://output-file.webm";
-
40  segment_template_ = "memory://output-template-$Number$.webm";
-
41  cur_time_timescale_ = 0;
-
42  single_segment_ = true;
-
43 }
-
44 
-
45 void SegmentTestBase::TearDown() {
- -
47 }
-
48 
-
49 scoped_refptr<MediaSample> SegmentTestBase::CreateSample(bool is_key_frame,
-
50  uint64_t duration) {
-
51  scoped_refptr<MediaSample> sample = MediaSample::CopyFrom(
-
52  kTestMediaSampleData, kTestMediaSampleDataSize, is_key_frame);
-
53  sample->set_dts(cur_time_timescale_);
-
54  sample->set_pts(cur_time_timescale_);
-
55  sample->set_duration(duration);
-
56 
-
57  cur_time_timescale_ += duration;
-
58  return sample;
-
59 }
-
60 
- -
62  MuxerOptions ret;
-
63  ret.single_segment = single_segment_;
-
64  ret.output_file_name = output_file_name_;
-
65  ret.segment_template = segment_template_;
-
66  ret.packager_version_string = "test";
-
67  ret.segment_duration = 30; // seconds
-
68  ret.fragment_duration = 30; // seconds
-
69  ret.segment_sap_aligned = false;
-
70  ret.fragment_sap_aligned = false;
-
71  // Use memory files for temp storage. Normally this would be a bad idea
-
72  // since it wouldn't support large files, but for tests the files are small.
-
73  ret.temp_dir = "memory://temp/";
-
74  return ret;
-
75 }
-
76 
- -
78  return new VideoStreamInfo(kTrackId, kTimeScale, kDuration, kVideoCodec,
-
79  kCodecString, kLanguage, kWidth, kHeight,
-
80  kPixelWidth, kPixelHeight, kTrickPlayRate,
-
81  kNaluLengthSize, NULL, 0, false);
-
82 }
-
83 
-
84 std::string SegmentTestBase::OutputFileName() const {
-
85  return output_file_name_;
-
86 }
-
87 
-
88 std::string SegmentTestBase::TemplateFileName(int number) const {
-
89  return GetSegmentName(segment_template_, 0, number, 0);
-
90 }
-
91 
-
92 SegmentTestBase::ClusterParser::ClusterParser() : in_cluster_(false) {}
-
93 
-
94 SegmentTestBase::ClusterParser::~ClusterParser() {}
-
95 
-
96 void SegmentTestBase::ClusterParser::PopulateFromCluster(
-
97  const std::string& file_name) {
-
98  cluster_sizes_.clear();
-
99  std::string file_contents;
-
100  ASSERT_TRUE(File::ReadFileToString(file_name.c_str(), &file_contents));
+
18 const uint8_t kTestMediaSampleData[] = {0xde, 0xad, 0xbe, 0xef, 0x00};
+
19 const uint8_t kTestMediaSampleSideData[] = {
+
20  // First 8 bytes of side_data is the BlockAddID element in big endian.
+
21  0x12, 0x34, 0x56, 0x78, 0x9a, 0x00, 0x00, 0x00,
+
22  0x73, 0x69, 0x64, 0x65, 0x00};
+
23 
+
24 const int kTrackId = 1;
+
25 const uint32_t kTimeScale = 1000;
+
26 const uint64_t kDuration = 8000;
+
27 const VideoCodec kVideoCodec = kCodecVP8;
+
28 const std::string kCodecString = "vp8";
+
29 const std::string kLanguage = "en";
+
30 const uint16_t kWidth = 100;
+
31 const uint16_t kHeight = 100;
+
32 const uint16_t kPixelWidth = 100;
+
33 const uint16_t kPixelHeight = 100;
+
34 const int16_t kTrickPlayRate = 1;
+
35 const uint8_t kNaluLengthSize = 0;
+
36 
+
37 } // namespace
+
38 
+
39 SegmentTestBase::SegmentTestBase() {}
+
40 
+
41 void SegmentTestBase::SetUp() {
+
42  output_file_name_ = "memory://output-file.webm";
+
43  segment_template_ = "memory://output-template-$Number$.webm";
+
44  cur_time_timescale_ = 0;
+
45  single_segment_ = true;
+
46 }
+
47 
+
48 void SegmentTestBase::TearDown() {
+ +
50 }
+
51 
+
52 scoped_refptr<MediaSample> SegmentTestBase::CreateSample(
+
53  KeyFrameFlag key_frame_flag,
+
54  uint64_t duration,
+
55  SideDataFlag side_data_flag) {
+
56  scoped_refptr<MediaSample> sample;
+
57  const bool is_key_frame = key_frame_flag == kKeyFrame;
+
58  if (side_data_flag == kGenerateSideData) {
+
59  sample = MediaSample::CopyFrom(
+
60  kTestMediaSampleData, sizeof(kTestMediaSampleData),
+
61  kTestMediaSampleSideData, sizeof(kTestMediaSampleSideData),
+
62  is_key_frame);
+
63  } else {
+
64  sample = MediaSample::CopyFrom(kTestMediaSampleData,
+
65  sizeof(kTestMediaSampleData), is_key_frame);
+
66  }
+
67  sample->set_dts(cur_time_timescale_);
+
68  sample->set_pts(cur_time_timescale_);
+
69  sample->set_duration(duration);
+
70 
+
71  cur_time_timescale_ += duration;
+
72  return sample;
+
73 }
+
74 
+ +
76  MuxerOptions ret;
+
77  ret.single_segment = single_segment_;
+
78  ret.output_file_name = output_file_name_;
+
79  ret.segment_template = segment_template_;
+
80  ret.packager_version_string = "test";
+
81  ret.segment_duration = 30; // seconds
+
82  ret.fragment_duration = 30; // seconds
+
83  ret.segment_sap_aligned = false;
+
84  ret.fragment_sap_aligned = false;
+
85  // Use memory files for temp storage. Normally this would be a bad idea
+
86  // since it wouldn't support large files, but for tests the files are small.
+
87  ret.temp_dir = "memory://temp/";
+
88  return ret;
+
89 }
+
90 
+ +
92  return new VideoStreamInfo(kTrackId, kTimeScale, kDuration, kVideoCodec,
+
93  kCodecString, kLanguage, kWidth, kHeight,
+
94  kPixelWidth, kPixelHeight, kTrickPlayRate,
+
95  kNaluLengthSize, NULL, 0, false);
+
96 }
+
97 
+
98 std::string SegmentTestBase::OutputFileName() const {
+
99  return output_file_name_;
+
100 }
101 
-
102  const uint8_t* data = reinterpret_cast<const uint8_t*>(file_contents.c_str());
-
103  const size_t size = file_contents.size();
-
104  WebMListParser cluster_parser(kWebMIdCluster, this);
-
105  size_t position = 0;
-
106  while (position < size) {
-
107  int read = cluster_parser.Parse(data + position, size - position);
-
108  ASSERT_LT(0, read);
+
102 std::string SegmentTestBase::TemplateFileName(int number) const {
+
103  return GetSegmentName(segment_template_, 0, number, 0);
+
104 }
+
105 
+
106 SegmentTestBase::ClusterParser::ClusterParser() : in_cluster_(false) {}
+
107 
+
108 SegmentTestBase::ClusterParser::~ClusterParser() {}
109 
-
110  cluster_parser.Reset();
-
111  position += read;
-
112  }
-
113 }
-
114 
-
115 void SegmentTestBase::ClusterParser::PopulateFromSegment(
-
116  const std::string& file_name) {
-
117  cluster_sizes_.clear();
-
118  std::string file_contents;
-
119  ASSERT_TRUE(File::ReadFileToString(file_name.c_str(), &file_contents));
-
120 
-
121  const uint8_t* data = reinterpret_cast<const uint8_t*>(file_contents.c_str());
-
122  const size_t size = file_contents.size();
-
123  WebMListParser header_parser(kWebMIdEBMLHeader, this);
-
124  int offset = header_parser.Parse(data, size);
-
125  ASSERT_LT(0, offset);
-
126 
-
127  WebMListParser segment_parser(kWebMIdSegment, this);
-
128  ASSERT_LT(0, segment_parser.Parse(data + offset, size - offset));
-
129 }
-
130 
-
131 int SegmentTestBase::ClusterParser::GetFrameCountForCluster(size_t i) const {
-
132  DCHECK(i < cluster_sizes_.size());
-
133  return cluster_sizes_[i];
-
134 }
-
135 
-
136 int SegmentTestBase::ClusterParser::cluster_count() const {
-
137  return cluster_sizes_.size();
-
138 }
-
139 
-
140 WebMParserClient* SegmentTestBase::ClusterParser::OnListStart(int id) {
-
141  if (id == kWebMIdCluster) {
-
142  if (in_cluster_)
-
143  return NULL;
+
110 void SegmentTestBase::ClusterParser::PopulateFromCluster(
+
111  const std::string& file_name) {
+
112  cluster_sizes_.clear();
+
113  std::string file_contents;
+
114  ASSERT_TRUE(File::ReadFileToString(file_name.c_str(), &file_contents));
+
115 
+
116  const uint8_t* data = reinterpret_cast<const uint8_t*>(file_contents.c_str());
+
117  const size_t size = file_contents.size();
+
118  WebMListParser cluster_parser(kWebMIdCluster, this);
+
119  size_t position = 0;
+
120  while (position < size) {
+
121  int read = cluster_parser.Parse(data + position, size - position);
+
122  ASSERT_LT(0, read);
+
123 
+
124  cluster_parser.Reset();
+
125  position += read;
+
126  }
+
127 }
+
128 
+
129 void SegmentTestBase::ClusterParser::PopulateFromSegment(
+
130  const std::string& file_name) {
+
131  cluster_sizes_.clear();
+
132  std::string file_contents;
+
133  ASSERT_TRUE(File::ReadFileToString(file_name.c_str(), &file_contents));
+
134 
+
135  const uint8_t* data = reinterpret_cast<const uint8_t*>(file_contents.c_str());
+
136  const size_t size = file_contents.size();
+
137  WebMListParser header_parser(kWebMIdEBMLHeader, this);
+
138  int offset = header_parser.Parse(data, size);
+
139  ASSERT_LT(0, offset);
+
140 
+
141  WebMListParser segment_parser(kWebMIdSegment, this);
+
142  ASSERT_LT(0, segment_parser.Parse(data + offset, size - offset));
+
143 }
144 
-
145  cluster_sizes_.push_back(0);
-
146  in_cluster_ = true;
-
147  }
-
148 
-
149  return this;
-
150 }
-
151 
-
152 bool SegmentTestBase::ClusterParser::OnListEnd(int id) {
-
153  if (id == kWebMIdCluster) {
-
154  if (!in_cluster_)
-
155  return false;
-
156  in_cluster_ = false;
-
157  }
+
145 int SegmentTestBase::ClusterParser::GetFrameCountForCluster(size_t i) const {
+
146  DCHECK(i < cluster_sizes_.size());
+
147  return cluster_sizes_[i];
+
148 }
+
149 
+
150 int SegmentTestBase::ClusterParser::cluster_count() const {
+
151  return cluster_sizes_.size();
+
152 }
+
153 
+
154 WebMParserClient* SegmentTestBase::ClusterParser::OnListStart(int id) {
+
155  if (id == kWebMIdCluster) {
+
156  if (in_cluster_)
+
157  return NULL;
158 
-
159  return true;
-
160 }
-
161 
-
162 bool SegmentTestBase::ClusterParser::OnUInt(int id, int64_t val) {
-
163  return true;
+
159  cluster_sizes_.push_back(0);
+
160  in_cluster_ = true;
+
161  }
+
162 
+
163  return this;
164 }
165 
-
166 bool SegmentTestBase::ClusterParser::OnFloat(int id, double val) {
-
167  return true;
-
168 }
-
169 
-
170 bool SegmentTestBase::ClusterParser::OnBinary(int id,
-
171  const uint8_t* data,
-
172  int size) {
-
173  if (in_cluster_ && id == kWebMIdSimpleBlock) {
-
174  cluster_sizes_[cluster_sizes_.size() - 1]++;
-
175  }
-
176 
+
166 bool SegmentTestBase::ClusterParser::OnListEnd(int id) {
+
167  if (id == kWebMIdCluster) {
+
168  if (!in_cluster_)
+
169  return false;
+
170  in_cluster_ = false;
+
171  }
+
172 
+
173  return true;
+
174 }
+
175 
+
176 bool SegmentTestBase::ClusterParser::OnUInt(int id, int64_t val) {
177  return true;
178 }
179 
-
180 bool SegmentTestBase::ClusterParser::OnString(int id, const std::string& str) {
+
180 bool SegmentTestBase::ClusterParser::OnFloat(int id, double val) {
181  return true;
182 }
183 
-
184 } // namespace media
-
185 } // namespace edash_packager
-
186 
+
184 bool SegmentTestBase::ClusterParser::OnBinary(int id,
+
185  const uint8_t* data,
+
186  int size) {
+
187  if (in_cluster_ && (id == kWebMIdSimpleBlock || id == kWebMIdBlock)) {
+
188  cluster_sizes_.back()++;
+
189  }
+
190 
+
191  return true;
+
192 }
+
193 
+
194 bool SegmentTestBase::ClusterParser::OnString(int id, const std::string& str) {
+
195  return true;
+
196 }
+
197 
+
198 } // namespace media
+
199 } // namespace edash_packager
+
200 
static bool ReadFileToString(const char *file_name, std::string *contents)
Definition: file.cc:184
std::string temp_dir
Specify temporary directory for intermediate files.
Definition: muxer_options.h:64
-
std::string OutputFileName() const
Gets the file name of the current output file.
+
std::string OutputFileName() const
Gets the file name of the current output file.
std::string packager_version_string
Specify the version string to be embedded in the output files.
Definition: muxer_options.h:71
static scoped_refptr< MediaSample > CopyFrom(const uint8_t *data, size_t size, bool is_key_frame)
Definition: media_sample.cc:45
-
scoped_refptr< MediaSample > CreateSample(bool is_key_frame, uint64_t duration)
Creates a new media sample.
-
std::string TemplateFileName(int number) const
Gets the file name of the given template file.
-
VideoStreamInfo * CreateVideoStreamInfo() const
Creates a video stream info object for testing.
+
std::string TemplateFileName(int number) const
Gets the file name of the given template file.
+
VideoStreamInfo * CreateVideoStreamInfo() const
Creates a video stream info object for testing.
-
MuxerOptions CreateMuxerOptions() const
Creates a Muxer options object for testing.
+
MuxerOptions CreateMuxerOptions() const
Creates a Muxer options object for testing.
Holds video stream information.
This structure contains the list of configuration options for Muxer.
Definition: muxer_options.h:18
+
scoped_refptr< MediaSample > CreateSample(KeyFrameFlag key_frame_flag, uint64_t duration, SideDataFlag side_data_flag)
Creates a new media sample.
diff --git a/docs/d4/db2/cluster__builder_8h_source.html b/docs/d4/db2/cluster__builder_8h_source.html index d442c8d3db..9c4189f12d 100644 --- a/docs/d4/db2/cluster__builder_8h_source.html +++ b/docs/d4/db2/cluster__builder_8h_source.html @@ -176,7 +176,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/dca/structedash__packager_1_1media_1_1H264SEIRecoveryPoint.html b/docs/d4/dca/structedash__packager_1_1media_1_1H264SEIRecoveryPoint.html index 816e059db3..b4a90e4584 100644 --- a/docs/d4/dca/structedash__packager_1_1media_1_1H264SEIRecoveryPoint.html +++ b/docs/d4/dca/structedash__packager_1_1media_1_1H264SEIRecoveryPoint.html @@ -118,7 +118,7 @@ int changing_slice_group_i diff --git a/docs/d4/dcb/classedash__packager_1_1media_1_1Status-members.html b/docs/d4/dcb/classedash__packager_1_1media_1_1Status-members.html index 36868487a3..02f9e71c0c 100644 --- a/docs/d4/dcb/classedash__packager_1_1media_1_1Status-members.html +++ b/docs/d4/dcb/classedash__packager_1_1media_1_1Status-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/dcc/structedash__packager_1_1media_1_1mp4_1_1SchemeType.html b/docs/d4/dcc/structedash__packager_1_1media_1_1mp4_1_1SchemeType.html index cae4092f3d..6ff89c2d7c 100644 --- a/docs/d4/dcc/structedash__packager_1_1media_1_1mp4_1_1SchemeType.html +++ b/docs/d4/dcc/structedash__packager_1_1media_1_1mp4_1_1SchemeType.html @@ -174,7 +174,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 394 of file box_definitions.cc.

+

Definition at line 395 of file box_definitions.cc.

@@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/d4/dcd/classedash__packager_1_1media_1_1OffsetByteQueue-members.html b/docs/d4/dcd/classedash__packager_1_1media_1_1OffsetByteQueue-members.html index 9b90a8776d..86f1c4fae1 100644 --- a/docs/d4/dcd/classedash__packager_1_1media_1_1OffsetByteQueue-members.html +++ b/docs/d4/dcd/classedash__packager_1_1media_1_1OffsetByteQueue-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/dce/structedash__packager_1_1media_1_1mp4_1_1SegmentReference.html b/docs/d4/dce/structedash__packager_1_1media_1_1mp4_1_1SegmentReference.html index b80ede8cac..ec120cb610 100644 --- a/docs/d4/dce/structedash__packager_1_1media_1_1mp4_1_1SegmentReference.html +++ b/docs/d4/dce/structedash__packager_1_1media_1_1mp4_1_1SegmentReference.html @@ -136,14 +136,14 @@ uint64_t earliest_presenta

Detailed Description

-

Definition at line 679 of file box_definitions.h.

+

Definition at line 686 of file box_definitions.h.


The documentation for this struct was generated from the following file: diff --git a/docs/d4/dd3/bit__reader_8h_source.html b/docs/d4/dd3/bit__reader_8h_source.html index e4a179c80e..78da215297 100644 --- a/docs/d4/dd3/bit__reader_8h_source.html +++ b/docs/d4/dd3/bit__reader_8h_source.html @@ -178,7 +178,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/dd9/structedash__packager_1_1media_1_1mp4_1_1TrackFragment.html b/docs/d4/dd9/structedash__packager_1_1media_1_1mp4_1_1TrackFragment.html index 5662477f31..30e07f5aef 100644 --- a/docs/d4/dd9/structedash__packager_1_1media_1_1mp4_1_1TrackFragment.html +++ b/docs/d4/dd9/structedash__packager_1_1media_1_1mp4_1_1TrackFragment.html @@ -160,7 +160,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 657 of file box_definitions.h.

+

Definition at line 664 of file box_definitions.h.

Member Function Documentation

@@ -186,7 +186,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 2214 of file box_definitions.cc.

+

Definition at line 2235 of file box_definitions.cc.

@@ -197,7 +197,7 @@ Additional Inherited Members diff --git a/docs/d4/dde/webvtt__util_8h_source.html b/docs/d4/dde/webvtt__util_8h_source.html index d3cf975aa6..409b861215 100644 --- a/docs/d4/dde/webvtt__util_8h_source.html +++ b/docs/d4/dde/webvtt__util_8h_source.html @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/de4/structedash__packager_1_1media_1_1SubsampleEntry.html b/docs/d4/de4/structedash__packager_1_1media_1_1SubsampleEntry.html index b182b2bda4..64d68063d9 100644 --- a/docs/d4/de4/structedash__packager_1_1media_1_1SubsampleEntry.html +++ b/docs/d4/de4/structedash__packager_1_1media_1_1SubsampleEntry.html @@ -115,7 +115,7 @@ uint32_t cipher_bytes< diff --git a/docs/d4/de5/classedash__packager_1_1media_1_1mp4_1_1CompositionOffsetIterator.html b/docs/d4/de5/classedash__packager_1_1media_1_1mp4_1_1CompositionOffsetIterator.html index d41c8ddccd..9ec95c283a 100644 --- a/docs/d4/de5/classedash__packager_1_1media_1_1mp4_1_1CompositionOffsetIterator.html +++ b/docs/d4/de5/classedash__packager_1_1media_1_1mp4_1_1CompositionOffsetIterator.html @@ -225,7 +225,7 @@ Public Member Functions diff --git a/docs/d4/de7/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize-members.html b/docs/d4/de7/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize-members.html index 1a7e474b5b..fe633821e2 100644 --- a/docs/d4/de7/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize-members.html +++ b/docs/d4/de7/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/df5/request__signer_8cc_source.html b/docs/d4/df5/request__signer_8cc_source.html index 8989db4af6..a88cbb1336 100644 --- a/docs/d4/df5/request__signer_8cc_source.html +++ b/docs/d4/df5/request__signer_8cc_source.html @@ -176,7 +176,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/df9/structedash__packager_1_1MpdOptions-members.html b/docs/d4/df9/structedash__packager_1_1MpdOptions-members.html index 2f0cc0f13f..f14164b790 100644 --- a/docs/d4/df9/structedash__packager_1_1MpdOptions-members.html +++ b/docs/d4/df9/structedash__packager_1_1MpdOptions-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d4/dff/webm__media__parser_8cc_source.html b/docs/d4/dff/webm__media__parser_8cc_source.html index 69d99d595d..acddb9a552 100644 --- a/docs/d4/dff/webm__media__parser_8cc_source.html +++ b/docs/d4/dff/webm__media__parser_8cc_source.html @@ -335,7 +335,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d02/classedash__packager_1_1media_1_1ProducerConsumerQueue.html b/docs/d5/d02/classedash__packager_1_1media_1_1ProducerConsumerQueue.html index 9abfe4762f..5b0b8a4b30 100644 --- a/docs/d5/d02/classedash__packager_1_1media_1_1ProducerConsumerQueue.html +++ b/docs/d5/d02/classedash__packager_1_1media_1_1ProducerConsumerQueue.html @@ -501,7 +501,7 @@ template<class T > diff --git a/docs/d5/d15/producer__consumer__queue_8h_source.html b/docs/d5/d15/producer__consumer__queue_8h_source.html index a655d5349e..3a0d0900fc 100644 --- a/docs/d5/d15/producer__consumer__queue_8h_source.html +++ b/docs/d5/d15/producer__consumer__queue_8h_source.html @@ -374,7 +374,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d18/structedash__packager_1_1media_1_1H264NALU-members.html b/docs/d5/d18/structedash__packager_1_1media_1_1H264NALU-members.html index 678ec00a18..657f12a604 100644 --- a/docs/d5/d18/structedash__packager_1_1media_1_1H264NALU-members.html +++ b/docs/d5/d18/structedash__packager_1_1media_1_1H264NALU-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d18/structedash__packager_1_1media_1_1mp4_1_1CueIDBox-members.html b/docs/d5/d18/structedash__packager_1_1media_1_1mp4_1_1CueIDBox-members.html index 9e0bccce05..ac04a7b79b 100644 --- a/docs/d5/d18/structedash__packager_1_1media_1_1mp4_1_1CueIDBox-members.html +++ b/docs/d5/d18/structedash__packager_1_1media_1_1mp4_1_1CueIDBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d1a/ts__section_8h_source.html b/docs/d5/d1a/ts__section_8h_source.html index 91b6746fe3..aeaab7af61 100644 --- a/docs/d5/d1a/ts__section_8h_source.html +++ b/docs/d5/d1a/ts__section_8h_source.html @@ -134,7 +134,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d1f/classedash__packager_1_1media_1_1BufferReader-members.html b/docs/d5/d1f/classedash__packager_1_1media_1_1BufferReader-members.html index f55512773e..0427aef600 100644 --- a/docs/d5/d1f/classedash__packager_1_1media_1_1BufferReader-members.html +++ b/docs/d5/d1f/classedash__packager_1_1media_1_1BufferReader-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d26/classedash__packager_1_1media_1_1MediaParser-members.html b/docs/d5/d26/classedash__packager_1_1media_1_1MediaParser-members.html index 9c18ebf4ba..5098b748ba 100644 --- a/docs/d5/d26/classedash__packager_1_1media_1_1MediaParser-members.html +++ b/docs/d5/d26/classedash__packager_1_1media_1_1MediaParser-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d27/key__fetcher_8cc_source.html b/docs/d5/d27/key__fetcher_8cc_source.html index 5539e1b93d..0436d931e1 100644 --- a/docs/d5/d27/key__fetcher_8cc_source.html +++ b/docs/d5/d27/key__fetcher_8cc_source.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d30/classedash__packager_1_1media_1_1H264ByteToUnitStreamConverter.html b/docs/d5/d30/classedash__packager_1_1media_1_1H264ByteToUnitStreamConverter.html index 2b07a8be47..1826796117 100644 --- a/docs/d5/d30/classedash__packager_1_1media_1_1H264ByteToUnitStreamConverter.html +++ b/docs/d5/d30/classedash__packager_1_1media_1_1H264ByteToUnitStreamConverter.html @@ -192,7 +192,7 @@ static const size_t kUnitS diff --git a/docs/d5/d40/webm_2single__segment__segmenter_8h_source.html b/docs/d5/d40/webm_2single__segment__segmenter_8h_source.html index 22722e97d7..e7c4aaf9ab 100644 --- a/docs/d5/d40/webm_2single__segment__segmenter_8h_source.html +++ b/docs/d5/d40/webm_2single__segment__segmenter_8h_source.html @@ -154,7 +154,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d41/hevc__decoder__configuration_8cc_source.html b/docs/d5/d41/hevc__decoder__configuration_8cc_source.html index 6ccf693245..9ba713b3b8 100644 --- a/docs/d5/d41/hevc__decoder__configuration_8cc_source.html +++ b/docs/d5/d41/hevc__decoder__configuration_8cc_source.html @@ -232,7 +232,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d4a/classedash__packager_1_1media_1_1mp2t_1_1TsPacket-members.html b/docs/d5/d4a/classedash__packager_1_1media_1_1mp2t_1_1TsPacket-members.html index 980067974c..a54d374006 100644 --- a/docs/d5/d4a/classedash__packager_1_1media_1_1mp2t_1_1TsPacket-members.html +++ b/docs/d5/d4a/classedash__packager_1_1media_1_1mp2t_1_1TsPacket-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d4d/box_8cc_source.html b/docs/d5/d4d/box_8cc_source.html index 0b0e173482..20bdc6387b 100644 --- a/docs/d5/d4d/box_8cc_source.html +++ b/docs/d5/d4d/box_8cc_source.html @@ -199,7 +199,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d52/ts__section__pes_8h_source.html b/docs/d5/d52/ts__section__pes_8h_source.html index 030914908c..4f5fa8d451 100644 --- a/docs/d5/d52/ts__section__pes_8h_source.html +++ b/docs/d5/d52/ts__section__pes_8h_source.html @@ -161,7 +161,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d54/classedash__packager_1_1media_1_1mp4_1_1AACAudioSpecificConfig-members.html b/docs/d5/d54/classedash__packager_1_1media_1_1mp4_1_1AACAudioSpecificConfig-members.html index 9e0cc198b6..bcd1101e82 100644 --- a/docs/d5/d54/classedash__packager_1_1media_1_1mp4_1_1AACAudioSpecificConfig-members.html +++ b/docs/d5/d54/classedash__packager_1_1media_1_1mp4_1_1AACAudioSpecificConfig-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d62/classedash__packager_1_1media_1_1RsaPrivateKey.html b/docs/d5/d62/classedash__packager_1_1media_1_1RsaPrivateKey.html index ad837531df..93b99694ae 100644 --- a/docs/d5/d62/classedash__packager_1_1media_1_1RsaPrivateKey.html +++ b/docs/d5/d62/classedash__packager_1_1media_1_1RsaPrivateKey.html @@ -224,7 +224,7 @@ Static Public Member Functions diff --git a/docs/d5/d63/network__util_8cc_source.html b/docs/d5/d63/network__util_8cc_source.html index 139d7d7939..76c2868715 100644 --- a/docs/d5/d63/network__util_8cc_source.html +++ b/docs/d5/d63/network__util_8cc_source.html @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d6e/structedash__packager_1_1media_1_1mp4_1_1MovieExtendsHeader-members.html b/docs/d5/d6e/structedash__packager_1_1media_1_1mp4_1_1MovieExtendsHeader-members.html index 6e53a2f49a..d2b063d763 100644 --- a/docs/d5/d6e/structedash__packager_1_1media_1_1mp4_1_1MovieExtendsHeader-members.html +++ b/docs/d5/d6e/structedash__packager_1_1media_1_1mp4_1_1MovieExtendsHeader-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d6f/vlog__flags_8cc_source.html b/docs/d5/d6f/vlog__flags_8cc_source.html index f731b2a8b5..7befe697df 100644 --- a/docs/d5/d6f/vlog__flags_8cc_source.html +++ b/docs/d5/d6f/vlog__flags_8cc_source.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d73/vp__codec__configuration_8h_source.html b/docs/d5/d73/vp__codec__configuration_8h_source.html index 4592c75810..fad01dd303 100644 --- a/docs/d5/d73/vp__codec__configuration_8h_source.html +++ b/docs/d5/d73/vp__codec__configuration_8h_source.html @@ -192,7 +192,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d78/structedash__packager_1_1media_1_1mp4_1_1SampleEncryption.html b/docs/d5/d78/structedash__packager_1_1media_1_1mp4_1_1SampleEncryption.html index 6e92664878..b70a216a6f 100644 --- a/docs/d5/d78/structedash__packager_1_1media_1_1mp4_1_1SampleEncryption.html +++ b/docs/d5/d78/structedash__packager_1_1media_1_1mp4_1_1SampleEncryption.html @@ -186,7 +186,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 313 of file box_definitions.cc.

+

Definition at line 314 of file box_definitions.cc.

@@ -223,7 +223,7 @@ Additional Inherited Members
Returns
true on success, false otherwise.
-

Definition at line 362 of file box_definitions.cc.

+

Definition at line 363 of file box_definitions.cc.

@@ -250,7 +250,7 @@ Additional Inherited Members diff --git a/docs/d5/d7a/structedash__packager_1_1Element.html b/docs/d5/d7a/structedash__packager_1_1Element.html index d321858783..07237b0d1d 100644 --- a/docs/d5/d7a/structedash__packager_1_1Element.html +++ b/docs/d5/d7a/structedash__packager_1_1Element.html @@ -120,7 +120,7 @@ std::vector< diff --git a/docs/d5/d7b/box__definitions_8h_source.html b/docs/d5/d7b/box__definitions_8h_source.html index d17cfe3b75..0cbb990b5a 100644 --- a/docs/d5/d7b/box__definitions_8h_source.html +++ b/docs/d5/d7b/box__definitions_8h_source.html @@ -372,560 +372,568 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
309  std::vector<uint8_t> extra_data;
310 };
311 
- -
313  DECLARE_BOX_METHODS(AudioSampleEntry);
-
314  // Returns actual format of this sample entry.
-
315  FourCC GetActualFormat() const {
-
316  return format == FOURCC_ENCA ? sinf.format.format : format;
-
317  }
-
318 
-
319  FourCC format;
-
320  uint16_t data_reference_index;
-
321  uint16_t channelcount;
-
322  uint16_t samplesize;
-
323  uint32_t samplerate;
+
312 struct AC3Specific : Box {
+
313  DECLARE_BOX_METHODS(AC3Specific);
+
314 
+
315  std::vector<uint8_t> data;
+
316 };
+
317 
+ +
319  DECLARE_BOX_METHODS(AudioSampleEntry);
+
320  // Returns actual format of this sample entry.
+
321  FourCC GetActualFormat() const {
+
322  return format == FOURCC_ENCA ? sinf.format.format : format;
+
323  }
324 
- - -
327  DTSSpecific ddts;
-
328 };
-
329 
- -
331  DECLARE_BOX_METHODS(WebVTTConfigurationBox);
-
332  std::string config;
-
333 };
-
334 
- -
336  DECLARE_BOX_METHODS(WebVTTSourceLabelBox);
-
337  std::string source_label;
-
338 };
-
339 
- -
341  DECLARE_BOX_METHODS(WVTTSampleEntry);
-
342 
-
343  uint16_t data_reference_index;
-
344 
-
345  WebVTTConfigurationBox config;
-
346  WebVTTSourceLabelBox label;
-
347  // Optional MPEG4BitRateBox.
-
348 };
+
325  FourCC format;
+
326  uint16_t data_reference_index;
+
327  uint16_t channelcount;
+
328  uint16_t samplesize;
+
329  uint32_t samplerate;
+
330 
+ + +
333  DTSSpecific ddts;
+
334  AC3Specific dac3;
+
335 };
+
336 
+ +
338  DECLARE_BOX_METHODS(WebVTTConfigurationBox);
+
339  std::string config;
+
340 };
+
341 
+ +
343  DECLARE_BOX_METHODS(WebVTTSourceLabelBox);
+
344  std::string source_label;
+
345 };
+
346 
+ +
348  DECLARE_BOX_METHODS(WVTTSampleEntry);
349 
- -
351  DECLARE_BOX_METHODS(SampleDescription);
-
352 
-
353  TrackType type;
-
354  // TODO(kqyang): Clean up the code to have one single member, e.g. by creating
-
355  // SampleEntry struct, std::vector<SampleEntry> sample_entries.
-
356  std::vector<VideoSampleEntry> video_entries;
-
357  std::vector<AudioSampleEntry> audio_entries;
-
358  std::vector<WVTTSampleEntry> wvtt_entries;
-
359 };
-
360 
-
361 struct DecodingTime {
-
362  uint32_t sample_count;
-
363  uint32_t sample_delta;
-
364 };
-
365 
-
366 // stts.
- -
368  DECLARE_BOX_METHODS(DecodingTimeToSample);
-
369 
-
370  std::vector<DecodingTime> decoding_time;
+
350  uint16_t data_reference_index;
+
351 
+
352  WebVTTConfigurationBox config;
+
353  WebVTTSourceLabelBox label;
+
354  // Optional MPEG4BitRateBox.
+
355 };
+
356 
+ +
358  DECLARE_BOX_METHODS(SampleDescription);
+
359 
+
360  TrackType type;
+
361  // TODO(kqyang): Clean up the code to have one single member, e.g. by creating
+
362  // SampleEntry struct, std::vector<SampleEntry> sample_entries.
+
363  std::vector<VideoSampleEntry> video_entries;
+
364  std::vector<AudioSampleEntry> audio_entries;
+
365  std::vector<WVTTSampleEntry> wvtt_entries;
+
366 };
+
367 
+
368 struct DecodingTime {
+
369  uint32_t sample_count;
+
370  uint32_t sample_delta;
371 };
372 
- -
374  uint32_t sample_count;
-
375  // If version == 0, sample_offset is uint32_t;
-
376  // If version == 1, sample_offset is int32_t.
-
377  // Use int64_t so both can be supported properly.
-
378  int64_t sample_offset;
-
379 };
-
380 
-
381 // ctts. Optional.
- -
383  DECLARE_BOX_METHODS(CompositionTimeToSample);
-
384 
-
385  std::vector<CompositionOffset> composition_offset;
+
373 // stts.
+ +
375  DECLARE_BOX_METHODS(DecodingTimeToSample);
+
376 
+
377  std::vector<DecodingTime> decoding_time;
+
378 };
+
379 
+ +
381  uint32_t sample_count;
+
382  // If version == 0, sample_offset is uint32_t;
+
383  // If version == 1, sample_offset is int32_t.
+
384  // Use int64_t so both can be supported properly.
+
385  int64_t sample_offset;
386 };
387 
-
388 struct ChunkInfo {
-
389  uint32_t first_chunk;
-
390  uint32_t samples_per_chunk;
-
391  uint32_t sample_description_index;
-
392 };
-
393 
-
394 // stsc.
- -
396  DECLARE_BOX_METHODS(SampleToChunk);
-
397 
-
398  std::vector<ChunkInfo> chunk_info;
+
388 // ctts. Optional.
+ +
390  DECLARE_BOX_METHODS(CompositionTimeToSample);
+
391 
+
392  std::vector<CompositionOffset> composition_offset;
+
393 };
+
394 
+
395 struct ChunkInfo {
+
396  uint32_t first_chunk;
+
397  uint32_t samples_per_chunk;
+
398  uint32_t sample_description_index;
399 };
400 
-
401 // stsz.
-
402 struct SampleSize : FullBox {
-
403  DECLARE_BOX_METHODS(SampleSize);
+
401 // stsc.
+ +
403  DECLARE_BOX_METHODS(SampleToChunk);
404 
-
405  uint32_t sample_size;
-
406  uint32_t sample_count;
-
407  std::vector<uint32_t> sizes;
-
408 };
-
409 
-
410 // stz2.
- -
412  DECLARE_BOX_METHODS(CompactSampleSize);
-
413 
-
414  uint8_t field_size;
-
415  std::vector<uint32_t> sizes;
-
416 };
-
417 
-
418 // co64.
- -
420  DECLARE_BOX_METHODS(ChunkLargeOffset);
-
421 
-
422  std::vector<uint64_t> offsets;
+
405  std::vector<ChunkInfo> chunk_info;
+
406 };
+
407 
+
408 // stsz.
+
409 struct SampleSize : FullBox {
+
410  DECLARE_BOX_METHODS(SampleSize);
+
411 
+
412  uint32_t sample_size;
+
413  uint32_t sample_count;
+
414  std::vector<uint32_t> sizes;
+
415 };
+
416 
+
417 // stz2.
+ +
419  DECLARE_BOX_METHODS(CompactSampleSize);
+
420 
+
421  uint8_t field_size;
+
422  std::vector<uint32_t> sizes;
423 };
424 
-
425 // stco.
- -
427  DECLARE_BOX_METHODS(ChunkOffset);
-
428 };
-
429 
-
430 // stss. Optional.
-
431 struct SyncSample : FullBox {
-
432  DECLARE_BOX_METHODS(SyncSample);
-
433 
-
434  std::vector<uint32_t> sample_number;
+
425 // co64.
+ +
427  DECLARE_BOX_METHODS(ChunkLargeOffset);
+
428 
+
429  std::vector<uint64_t> offsets;
+
430 };
+
431 
+
432 // stco.
+ +
434  DECLARE_BOX_METHODS(ChunkOffset);
435 };
436 
-
437 struct SampleTable : Box {
-
438  DECLARE_BOX_METHODS(SampleTable);
-
439 
-
440  SampleDescription description;
-
441  DecodingTimeToSample decoding_time_to_sample;
-
442  CompositionTimeToSample composition_time_to_sample;
-
443  SampleToChunk sample_to_chunk;
-
444  // Either SampleSize or CompactSampleSize must present. Store in SampleSize.
-
445  SampleSize sample_size;
-
446  // Either ChunkOffset or ChunkLargeOffset must present. Store in
-
447  // ChunkLargeOffset.
-
448  ChunkLargeOffset chunk_large_offset;
-
449  SyncSample sync_sample;
-
450 };
-
451 
- -
453  DECLARE_BOX_METHODS(MediaHeader);
-
454 
-
455  uint64_t creation_time;
-
456  uint64_t modification_time;
-
457  uint32_t timescale;
-
458  uint64_t duration;
-
459  Language language;
-
460 };
+
437 // stss. Optional.
+
438 struct SyncSample : FullBox {
+
439  DECLARE_BOX_METHODS(SyncSample);
+
440 
+
441  std::vector<uint32_t> sample_number;
+
442 };
+
443 
+
444 struct SampleTable : Box {
+
445  DECLARE_BOX_METHODS(SampleTable);
+
446 
+
447  SampleDescription description;
+
448  DecodingTimeToSample decoding_time_to_sample;
+
449  CompositionTimeToSample composition_time_to_sample;
+
450  SampleToChunk sample_to_chunk;
+
451  // Either SampleSize or CompactSampleSize must present. Store in SampleSize.
+
452  SampleSize sample_size;
+
453  // Either ChunkOffset or ChunkLargeOffset must present. Store in
+
454  // ChunkLargeOffset.
+
455  ChunkLargeOffset chunk_large_offset;
+
456  SyncSample sync_sample;
+
457 };
+
458 
+ +
460  DECLARE_BOX_METHODS(MediaHeader);
461 
- -
463  DECLARE_BOX_METHODS(VideoMediaHeader);
-
464 
-
465  uint16_t graphicsmode;
-
466  uint16_t opcolor_red;
-
467  uint16_t opcolor_green;
-
468  uint16_t opcolor_blue;
-
469 };
-
470 
- -
472  DECLARE_BOX_METHODS(SoundMediaHeader);
-
473 
-
474  uint16_t balance;
-
475 };
-
476 
- -
478  DECLARE_BOX_METHODS(SubtitleMediaHeader);
-
479 };
+
462  uint64_t creation_time;
+
463  uint64_t modification_time;
+
464  uint32_t timescale;
+
465  uint64_t duration;
+
466  Language language;
+
467 };
+
468 
+ +
470  DECLARE_BOX_METHODS(VideoMediaHeader);
+
471 
+
472  uint16_t graphicsmode;
+
473  uint16_t opcolor_red;
+
474  uint16_t opcolor_green;
+
475  uint16_t opcolor_blue;
+
476 };
+
477 
+ +
479  DECLARE_BOX_METHODS(SoundMediaHeader);
480 
- -
482  DECLARE_BOX_METHODS(DataEntryUrl);
+
481  uint16_t balance;
+
482 };
483 
-
484  std::vector<uint8_t> location;
-
485 };
-
486 
- -
488  DECLARE_BOX_METHODS(DataReference);
-
489 
-
490  // data entry can be either url or urn box. Fix to url box for now.
-
491  std::vector<DataEntryUrl> data_entry;
+ +
485  DECLARE_BOX_METHODS(SubtitleMediaHeader);
+
486 };
+
487 
+ +
489  DECLARE_BOX_METHODS(DataEntryUrl);
+
490 
+
491  std::vector<uint8_t> location;
492 };
493 
- -
495  DECLARE_BOX_METHODS(DataInformation);
+ +
495  DECLARE_BOX_METHODS(DataReference);
496 
-
497  DataReference dref;
-
498 };
-
499 
- -
501  DECLARE_BOX_METHODS(MediaInformation);
-
502 
-
503  DataInformation dinf;
-
504  SampleTable sample_table;
-
505  // Exactly one specific meida header shall be present, vmhd, smhd, hmhd, nmhd.
-
506  VideoMediaHeader vmhd;
-
507  SoundMediaHeader smhd;
-
508  SubtitleMediaHeader sthd;
-
509 };
-
510 
-
511 struct Media : Box {
-
512  DECLARE_BOX_METHODS(Media);
-
513 
-
514  MediaHeader header;
-
515  HandlerReference handler;
-
516  MediaInformation information;
-
517 };
-
518 
-
519 struct Track : Box {
-
520  DECLARE_BOX_METHODS(Track);
-
521 
-
522  TrackHeader header;
-
523  Media media;
-
524  Edit edit;
-
525  SampleEncryption sample_encryption;
-
526 };
-
527 
- -
529  DECLARE_BOX_METHODS(MovieExtendsHeader);
-
530 
-
531  uint64_t fragment_duration;
-
532 };
-
533 
- -
535  DECLARE_BOX_METHODS(TrackExtends);
-
536 
-
537  uint32_t track_id;
-
538  uint32_t default_sample_description_index;
-
539  uint32_t default_sample_duration;
-
540  uint32_t default_sample_size;
-
541  uint32_t default_sample_flags;
-
542 };
+
497  // data entry can be either url or urn box. Fix to url box for now.
+
498  std::vector<DataEntryUrl> data_entry;
+
499 };
+
500 
+ +
502  DECLARE_BOX_METHODS(DataInformation);
+
503 
+
504  DataReference dref;
+
505 };
+
506 
+ +
508  DECLARE_BOX_METHODS(MediaInformation);
+
509 
+
510  DataInformation dinf;
+
511  SampleTable sample_table;
+
512  // Exactly one specific meida header shall be present, vmhd, smhd, hmhd, nmhd.
+
513  VideoMediaHeader vmhd;
+
514  SoundMediaHeader smhd;
+
515  SubtitleMediaHeader sthd;
+
516 };
+
517 
+
518 struct Media : Box {
+
519  DECLARE_BOX_METHODS(Media);
+
520 
+
521  MediaHeader header;
+
522  HandlerReference handler;
+
523  MediaInformation information;
+
524 };
+
525 
+
526 struct Track : Box {
+
527  DECLARE_BOX_METHODS(Track);
+
528 
+
529  TrackHeader header;
+
530  Media media;
+
531  Edit edit;
+
532  SampleEncryption sample_encryption;
+
533 };
+
534 
+ +
536  DECLARE_BOX_METHODS(MovieExtendsHeader);
+
537 
+
538  uint64_t fragment_duration;
+
539 };
+
540 
+ +
542  DECLARE_BOX_METHODS(TrackExtends);
543 
-
544 struct MovieExtends : Box {
-
545  DECLARE_BOX_METHODS(MovieExtends);
-
546 
-
547  MovieExtendsHeader header;
-
548  std::vector<TrackExtends> tracks;
+
544  uint32_t track_id;
+
545  uint32_t default_sample_description_index;
+
546  uint32_t default_sample_duration;
+
547  uint32_t default_sample_size;
+
548  uint32_t default_sample_flags;
549 };
550 
-
551 struct Movie : Box {
-
552  DECLARE_BOX_METHODS(Movie);
+
551 struct MovieExtends : Box {
+
552  DECLARE_BOX_METHODS(MovieExtends);
553 
-
554  MovieHeader header;
-
555  Metadata metadata; // Used to hold version information.
-
556  MovieExtends extends;
-
557  std::vector<Track> tracks;
-
558  std::vector<ProtectionSystemSpecificHeader> pssh;
-
559 };
+
554  MovieExtendsHeader header;
+
555  std::vector<TrackExtends> tracks;
+
556 };
+
557 
+
558 struct Movie : Box {
+
559  DECLARE_BOX_METHODS(Movie);
560 
- -
562  DECLARE_BOX_METHODS(TrackFragmentDecodeTime);
-
563 
-
564  uint64_t decode_time;
-
565 };
-
566 
- -
568  DECLARE_BOX_METHODS(MovieFragmentHeader);
-
569 
-
570  uint32_t sequence_number;
-
571 };
-
572 
- -
574  enum TrackFragmentFlagsMasks {
-
575  kBaseDataOffsetPresentMask = 0x000001,
-
576  kSampleDescriptionIndexPresentMask = 0x000002,
-
577  kDefaultSampleDurationPresentMask = 0x000008,
-
578  kDefaultSampleSizePresentMask = 0x000010,
-
579  kDefaultSampleFlagsPresentMask = 0x000020,
-
580  kDurationIsEmptyMask = 0x010000,
-
581  kDefaultBaseIsMoofMask = 0x020000,
-
582  };
-
583 
-
584  enum SampleFlagsMasks {
-
585  kReservedMask = 0xFC000000,
-
586  kSampleDependsOnMask = 0x03000000,
-
587  kSampleIsDependedOnMask = 0x00C00000,
-
588  kSampleHasRedundancyMask = 0x00300000,
-
589  kSamplePaddingValueMask = 0x000E0000,
-
590  kNonKeySampleMask = 0x00010000,
-
591  kSampleDegradationPriorityMask = 0x0000FFFF,
-
592  };
-
593 
-
594  DECLARE_BOX_METHODS(TrackFragmentHeader);
-
595 
-
596  uint32_t track_id;
-
597  uint32_t sample_description_index;
-
598  uint32_t default_sample_duration;
-
599  uint32_t default_sample_size;
-
600  uint32_t default_sample_flags;
-
601 };
+
561  MovieHeader header;
+
562  Metadata metadata; // Used to hold version information.
+
563  MovieExtends extends;
+
564  std::vector<Track> tracks;
+
565  std::vector<ProtectionSystemSpecificHeader> pssh;
+
566 };
+
567 
+ +
569  DECLARE_BOX_METHODS(TrackFragmentDecodeTime);
+
570 
+
571  uint64_t decode_time;
+
572 };
+
573 
+ +
575  DECLARE_BOX_METHODS(MovieFragmentHeader);
+
576 
+
577  uint32_t sequence_number;
+
578 };
+
579 
+ +
581  enum TrackFragmentFlagsMasks {
+
582  kBaseDataOffsetPresentMask = 0x000001,
+
583  kSampleDescriptionIndexPresentMask = 0x000002,
+
584  kDefaultSampleDurationPresentMask = 0x000008,
+
585  kDefaultSampleSizePresentMask = 0x000010,
+
586  kDefaultSampleFlagsPresentMask = 0x000020,
+
587  kDurationIsEmptyMask = 0x010000,
+
588  kDefaultBaseIsMoofMask = 0x020000,
+
589  };
+
590 
+
591  enum SampleFlagsMasks {
+
592  kReservedMask = 0xFC000000,
+
593  kSampleDependsOnMask = 0x03000000,
+
594  kSampleIsDependedOnMask = 0x00C00000,
+
595  kSampleHasRedundancyMask = 0x00300000,
+
596  kSamplePaddingValueMask = 0x000E0000,
+
597  kNonKeySampleMask = 0x00010000,
+
598  kSampleDegradationPriorityMask = 0x0000FFFF,
+
599  };
+
600 
+
601  DECLARE_BOX_METHODS(TrackFragmentHeader);
602 
- -
604  enum TrackFragmentFlagsMasks {
-
605  kDataOffsetPresentMask = 0x000001,
-
606  kFirstSampleFlagsPresentMask = 0x000004,
-
607  kSampleDurationPresentMask = 0x000100,
-
608  kSampleSizePresentMask = 0x000200,
-
609  kSampleFlagsPresentMask = 0x000400,
-
610  kSampleCompTimeOffsetsPresentMask = 0x000800,
-
611  };
-
612 
-
613  DECLARE_BOX_METHODS(TrackFragmentRun);
-
614 
-
615  uint32_t sample_count;
-
616  uint32_t data_offset;
-
617  std::vector<uint32_t> sample_flags;
-
618  std::vector<uint32_t> sample_sizes;
-
619  std::vector<uint32_t> sample_durations;
-
620  std::vector<int64_t> sample_composition_time_offsets;
-
621 };
-
622 
- -
624  enum GroupDescriptionIndexBase {
-
625  kTrackGroupDescriptionIndexBase = 0,
-
626  kTrackFragmentGroupDescriptionIndexBase = 0x10000,
-
627  };
-
628 
-
629  uint32_t sample_count;
-
630  uint32_t group_description_index;
-
631 };
-
632 
- -
634  DECLARE_BOX_METHODS(SampleToGroup);
+
603  uint32_t track_id;
+
604  uint32_t sample_description_index;
+
605  uint32_t default_sample_duration;
+
606  uint32_t default_sample_size;
+
607  uint32_t default_sample_flags;
+
608 };
+
609 
+ +
611  enum TrackFragmentFlagsMasks {
+
612  kDataOffsetPresentMask = 0x000001,
+
613  kFirstSampleFlagsPresentMask = 0x000004,
+
614  kSampleDurationPresentMask = 0x000100,
+
615  kSampleSizePresentMask = 0x000200,
+
616  kSampleFlagsPresentMask = 0x000400,
+
617  kSampleCompTimeOffsetsPresentMask = 0x000800,
+
618  };
+
619 
+
620  DECLARE_BOX_METHODS(TrackFragmentRun);
+
621 
+
622  uint32_t sample_count;
+
623  uint32_t data_offset;
+
624  std::vector<uint32_t> sample_flags;
+
625  std::vector<uint32_t> sample_sizes;
+
626  std::vector<uint32_t> sample_durations;
+
627  std::vector<int64_t> sample_composition_time_offsets;
+
628 };
+
629 
+ +
631  enum GroupDescriptionIndexBase {
+
632  kTrackGroupDescriptionIndexBase = 0,
+
633  kTrackFragmentGroupDescriptionIndexBase = 0x10000,
+
634  };
635 
-
636  uint32_t grouping_type;
-
637  uint32_t grouping_type_parameter; // Version 1 only.
-
638  std::vector<SampleToGroupEntry> entries;
-
639 };
-
640 
- - - -
644 
-
645  bool is_encrypted;
-
646  uint8_t iv_size;
-
647  std::vector<uint8_t> key_id;
-
648 };
-
649 
- -
651  DECLARE_BOX_METHODS(SampleGroupDescription);
-
652 
-
653  uint32_t grouping_type;
-
654  std::vector<CencSampleEncryptionInfoEntry> entries;
+
636  uint32_t sample_count;
+
637  uint32_t group_description_index;
+
638 };
+
639 
+ +
641  DECLARE_BOX_METHODS(SampleToGroup);
+
642 
+
643  uint32_t grouping_type;
+
644  uint32_t grouping_type_parameter; // Version 1 only.
+
645  std::vector<SampleToGroupEntry> entries;
+
646 };
+
647 
+ + + +
651 
+
652  bool is_encrypted;
+
653  uint8_t iv_size;
+
654  std::vector<uint8_t> key_id;
655 };
656 
-
657 struct TrackFragment : Box {
-
658  DECLARE_BOX_METHODS(TrackFragment);
+ +
658  DECLARE_BOX_METHODS(SampleGroupDescription);
659 
-
660  TrackFragmentHeader header;
-
661  std::vector<TrackFragmentRun> runs;
-
662  bool decode_time_absent;
-
663  TrackFragmentDecodeTime decode_time;
-
664  SampleToGroup sample_to_group;
-
665  SampleGroupDescription sample_group_description;
-
666  SampleAuxiliaryInformationSize auxiliary_size;
-
667  SampleAuxiliaryInformationOffset auxiliary_offset;
-
668  SampleEncryption sample_encryption;
-
669 };
-
670 
-
671 struct MovieFragment : Box {
-
672  DECLARE_BOX_METHODS(MovieFragment);
-
673 
-
674  MovieFragmentHeader header;
-
675  std::vector<TrackFragment> tracks;
-
676  std::vector<ProtectionSystemSpecificHeader> pssh;
-
677 };
-
678 
- -
680  enum SAPType {
-
681  TypeUnknown = 0,
-
682  Type1 = 1, // T(ept) = T(dec) = T(sap) = T(ptf)
-
683  Type2 = 2, // T(ept) = T(dec) = T(sap) < T(ptf)
-
684  Type3 = 3, // T(ept) < T(dec) = T(sap) <= T(ptf)
-
685  Type4 = 4, // T(ept) <= T(ptf) < T(dec) = T(sap)
-
686  Type5 = 5, // T(ept) = T(dec) < T(sap)
-
687  Type6 = 6, // T(ept) < T(dec) < T(sap)
-
688  };
-
689 
-
690  bool reference_type;
-
691  uint32_t referenced_size;
-
692  uint32_t subsegment_duration;
-
693  bool starts_with_sap;
-
694  SAPType sap_type;
-
695  uint32_t sap_delta_time;
-
696  // We add this field to keep track of earliest_presentation_time in this
-
697  // subsegment. It is not part of SegmentReference.
-
698  uint64_t earliest_presentation_time;
-
699 };
-
700 
- -
702  DECLARE_BOX_METHODS(SegmentIndex);
-
703 
-
704  uint32_t reference_id;
-
705  uint32_t timescale;
-
706  uint64_t earliest_presentation_time;
-
707  uint64_t first_offset;
-
708  std::vector<SegmentReference> references;
-
709 };
+
660  uint32_t grouping_type;
+
661  std::vector<CencSampleEncryptionInfoEntry> entries;
+
662 };
+
663 
+
664 struct TrackFragment : Box {
+
665  DECLARE_BOX_METHODS(TrackFragment);
+
666 
+
667  TrackFragmentHeader header;
+
668  std::vector<TrackFragmentRun> runs;
+
669  bool decode_time_absent;
+
670  TrackFragmentDecodeTime decode_time;
+
671  SampleToGroup sample_to_group;
+
672  SampleGroupDescription sample_group_description;
+
673  SampleAuxiliaryInformationSize auxiliary_size;
+
674  SampleAuxiliaryInformationOffset auxiliary_offset;
+
675  SampleEncryption sample_encryption;
+
676 };
+
677 
+
678 struct MovieFragment : Box {
+
679  DECLARE_BOX_METHODS(MovieFragment);
+
680 
+
681  MovieFragmentHeader header;
+
682  std::vector<TrackFragment> tracks;
+
683  std::vector<ProtectionSystemSpecificHeader> pssh;
+
684 };
+
685 
+ +
687  enum SAPType {
+
688  TypeUnknown = 0,
+
689  Type1 = 1, // T(ept) = T(dec) = T(sap) = T(ptf)
+
690  Type2 = 2, // T(ept) = T(dec) = T(sap) < T(ptf)
+
691  Type3 = 3, // T(ept) < T(dec) = T(sap) <= T(ptf)
+
692  Type4 = 4, // T(ept) <= T(ptf) < T(dec) = T(sap)
+
693  Type5 = 5, // T(ept) = T(dec) < T(sap)
+
694  Type6 = 6, // T(ept) < T(dec) < T(sap)
+
695  };
+
696 
+
697  bool reference_type;
+
698  uint32_t referenced_size;
+
699  uint32_t subsegment_duration;
+
700  bool starts_with_sap;
+
701  SAPType sap_type;
+
702  uint32_t sap_delta_time;
+
703  // We add this field to keep track of earliest_presentation_time in this
+
704  // subsegment. It is not part of SegmentReference.
+
705  uint64_t earliest_presentation_time;
+
706 };
+
707 
+ +
709  DECLARE_BOX_METHODS(SegmentIndex);
710 
-
711 // The actual data is parsed and written separately.
-
712 struct MediaData : Box {
-
713  DECLARE_BOX_METHODS(MediaData);
-
714 
-
715  uint32_t data_size;
+
711  uint32_t reference_id;
+
712  uint32_t timescale;
+
713  uint64_t earliest_presentation_time;
+
714  uint64_t first_offset;
+
715  std::vector<SegmentReference> references;
716 };
717 
-
718 struct CueSourceIDBox : Box {
-
719  DECLARE_BOX_METHODS(CueSourceIDBox);
-
720  int32_t source_id;
-
721 };
-
722 
-
723 struct CueTimeBox : Box {
-
724  DECLARE_BOX_METHODS(CueTimeBox);
-
725  std::string cue_current_time;
-
726 };
-
727 
-
728 struct CueIDBox : Box {
-
729  DECLARE_BOX_METHODS(CueIDBox);
-
730  std::string cue_id;
-
731 };
-
732 
-
733 struct CueSettingsBox : Box {
-
734  DECLARE_BOX_METHODS(CueSettingsBox);
-
735  std::string settings;
-
736 };
-
737 
-
738 struct CuePayloadBox : Box {
-
739  DECLARE_BOX_METHODS(CuePayloadBox);
-
740  std::string cue_text;
-
741 };
-
742 
-
743 struct VTTEmptyCueBox : Box {
-
744  DECLARE_BOX_METHODS(VTTEmptyCueBox);
-
745 };
-
746 
- -
748  DECLARE_BOX_METHODS(VTTAdditionalTextBox);
-
749  std::string cue_additional_text;
-
750 };
-
751 
-
752 struct VTTCueBox : Box {
-
753  DECLARE_BOX_METHODS(VTTCueBox);
-
754 
-
755  CueSourceIDBox cue_source_id;
-
756  CueIDBox cue_id;
-
757  CueTimeBox cue_time;
-
758  CueSettingsBox cue_settings;
-
759  CuePayloadBox cue_payload;
-
760 };
+
718 // The actual data is parsed and written separately.
+
719 struct MediaData : Box {
+
720  DECLARE_BOX_METHODS(MediaData);
+
721 
+
722  uint32_t data_size;
+
723 };
+
724 
+
725 struct CueSourceIDBox : Box {
+
726  DECLARE_BOX_METHODS(CueSourceIDBox);
+
727  int32_t source_id;
+
728 };
+
729 
+
730 struct CueTimeBox : Box {
+
731  DECLARE_BOX_METHODS(CueTimeBox);
+
732  std::string cue_current_time;
+
733 };
+
734 
+
735 struct CueIDBox : Box {
+
736  DECLARE_BOX_METHODS(CueIDBox);
+
737  std::string cue_id;
+
738 };
+
739 
+
740 struct CueSettingsBox : Box {
+
741  DECLARE_BOX_METHODS(CueSettingsBox);
+
742  std::string settings;
+
743 };
+
744 
+
745 struct CuePayloadBox : Box {
+
746  DECLARE_BOX_METHODS(CuePayloadBox);
+
747  std::string cue_text;
+
748 };
+
749 
+
750 struct VTTEmptyCueBox : Box {
+
751  DECLARE_BOX_METHODS(VTTEmptyCueBox);
+
752 };
+
753 
+ +
755  DECLARE_BOX_METHODS(VTTAdditionalTextBox);
+
756  std::string cue_additional_text;
+
757 };
+
758 
+
759 struct VTTCueBox : Box {
+
760  DECLARE_BOX_METHODS(VTTCueBox);
761 
-
762 #undef DECLARE_BOX
-
763 
-
764 } // namespace mp4
-
765 } // namespace media
-
766 } // namespace edash_packager
-
767 
-
768 #endif // MEDIA_FORMATS_MP4_BOX_DEFINITIONS_H_
+
762  CueSourceIDBox cue_source_id;
+
763  CueIDBox cue_id;
+
764  CueTimeBox cue_time;
+
765  CueSettingsBox cue_settings;
+
766  CuePayloadBox cue_payload;
+
767 };
+
768 
+
769 #undef DECLARE_BOX
+
770 
+
771 } // namespace mp4
+
772 } // namespace media
+
773 } // namespace edash_packager
+
774 
+
775 #endif // MEDIA_FORMATS_MP4_BOX_DEFINITIONS_H_
- - + +
Implemented per http://id3.org/id3v2.4.0-frames.
- - + + - - + + - + - + - - + + - + - -
bool ParseFromSampleEncryptionData(size_t iv_size, std::vector< SampleEncryptionEntry > *sample_encryption_entries) const
+ +
bool ParseFromSampleEncryptionData(size_t iv_size, std::vector< SampleEncryptionEntry > *sample_encryption_entries) const
- - + + - + - + - + - - - - + + + + - + - - - - - + + + + + - + - - - + + + - - + + - - + +
PrivFrame private_frame
We only support PrivateFrame in ID3. Other frames are ignored.
- + - - - + + + - - + + - - + + - - + + - + - - + + - -
bool ParseFromBuffer(uint8_t iv_size, bool has_subsamples, BufferReader *reader)
+ +
bool ParseFromBuffer(uint8_t iv_size, bool has_subsamples, BufferReader *reader)
+ - + - -
bool ReadWrite(uint8_t iv_size, bool has_subsamples, BoxBuffer *buffer)
- - + +
bool ReadWrite(uint8_t iv_size, bool has_subsamples, BoxBuffer *buffer)
+ + - + - + diff --git a/docs/d5/d89/widevine__key__source_8cc_source.html b/docs/d5/d89/widevine__key__source_8cc_source.html index e274ef70c8..ff947b49f4 100644 --- a/docs/d5/d89/widevine__key__source_8cc_source.html +++ b/docs/d5/d89/widevine__key__source_8cc_source.html @@ -657,7 +657,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d8f/webm__cluster__parser_8cc_source.html b/docs/d5/d8f/webm__cluster__parser_8cc_source.html index 16c4df8de7..9b0a2696f7 100644 --- a/docs/d5/d8f/webm__cluster__parser_8cc_source.html +++ b/docs/d5/d8f/webm__cluster__parser_8cc_source.html @@ -881,7 +881,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/d91/es__parser__adts_8cc_source.html b/docs/d5/d91/es__parser__adts_8cc_source.html index f48d1c1921..5c82694943 100644 --- a/docs/d5/d91/es__parser__adts_8cc_source.html +++ b/docs/d5/d91/es__parser__adts_8cc_source.html @@ -371,12 +371,12 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
static scoped_refptr< MediaSample > CopyFrom(const uint8_t *data, size_t size, bool is_key_frame)
Definition: media_sample.cc:45
static size_t GetAdtsHeaderSize(const uint8_t *data, size_t num_bytes)
Definition: adts_header.cc:31
void Reset()
Reset the queue to the empty state.
Definition: byte_queue.cc:24
-
static std::string GetCodecString(AudioCodec codec, uint8_t audio_object_type)
+
static std::string GetCodecString(AudioCodec codec, uint8_t audio_object_type)
void Peek(const uint8_t **data, int *size) const
Definition: byte_queue.cc:63
diff --git a/docs/d5/d9c/classedash__packager_1_1MpdNotifierFactory-members.html b/docs/d5/d9c/classedash__packager_1_1MpdNotifierFactory-members.html index f9078f9c23..6fdfd50d91 100644 --- a/docs/d5/d9c/classedash__packager_1_1MpdNotifierFactory-members.html +++ b/docs/d5/d9c/classedash__packager_1_1MpdNotifierFactory-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/da4/aes__encryptor_8cc_source.html b/docs/d5/da4/aes__encryptor_8cc_source.html index f97f027148..dbabf01417 100644 --- a/docs/d5/da4/aes__encryptor_8cc_source.html +++ b/docs/d5/da4/aes__encryptor_8cc_source.html @@ -568,7 +568,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/db7/classedash__packager_1_1xml_1_1AdaptationSetXmlNode-members.html b/docs/d5/db7/classedash__packager_1_1xml_1_1AdaptationSetXmlNode-members.html index b5b262cd31..7fe8eb426c 100644 --- a/docs/d5/db7/classedash__packager_1_1xml_1_1AdaptationSetXmlNode-members.html +++ b/docs/d5/db7/classedash__packager_1_1xml_1_1AdaptationSetXmlNode-members.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dba/ts__packet_8cc_source.html b/docs/d5/dba/ts__packet_8cc_source.html index 5db19895d5..d084e62d30 100644 --- a/docs/d5/dba/ts__packet_8cc_source.html +++ b/docs/d5/dba/ts__packet_8cc_source.html @@ -304,7 +304,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dc1/webm__webvtt__parser_8cc_source.html b/docs/d5/dc1/webm__webvtt__parser_8cc_source.html index 5d773876a8..d87118b425 100644 --- a/docs/d5/dc1/webm__webvtt__parser_8cc_source.html +++ b/docs/d5/dc1/webm__webvtt__parser_8cc_source.html @@ -171,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dc8/classedash__packager_1_1media_1_1OpusPacket.html b/docs/d5/dc8/classedash__packager_1_1media_1_1OpusPacket.html index c8cbced9e7..4f56c33278 100644 --- a/docs/d5/dc8/classedash__packager_1_1media_1_1OpusPacket.html +++ b/docs/d5/dc8/classedash__packager_1_1media_1_1OpusPacket.html @@ -119,7 +119,7 @@ double duration_ms () diff --git a/docs/d5/dce/classedash__packager_1_1media_1_1Demuxer.html b/docs/d5/dce/classedash__packager_1_1media_1_1Demuxer.html index f1df523103..7542c2c60b 100644 --- a/docs/d5/dce/classedash__packager_1_1media_1_1Demuxer.html +++ b/docs/d5/dce/classedash__packager_1_1media_1_1Demuxer.html @@ -294,7 +294,7 @@ Public Member Functions diff --git a/docs/d5/dce/classedash__packager_1_1media_1_1VP8Parser.html b/docs/d5/dce/classedash__packager_1_1media_1_1VP8Parser.html index 1c596c2086..1c35dc3979 100644 --- a/docs/d5/dce/classedash__packager_1_1media_1_1VP8Parser.html +++ b/docs/d5/dce/classedash__packager_1_1media_1_1VP8Parser.html @@ -235,7 +235,7 @@ Additional Inherited Members diff --git a/docs/d5/dcf/rsa__key_8h_source.html b/docs/d5/dcf/rsa__key_8h_source.html index 4a68b4275f..8b2868b4ec 100644 --- a/docs/d5/dcf/rsa__key_8h_source.html +++ b/docs/d5/dcf/rsa__key_8h_source.html @@ -165,7 +165,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dd2/classedash__packager_1_1media_1_1VPxParser.html b/docs/d5/dd2/classedash__packager_1_1media_1_1VPxParser.html index 7b17adb864..5cfb52f00b 100644 --- a/docs/d5/dd2/classedash__packager_1_1media_1_1VPxParser.html +++ b/docs/d5/dd2/classedash__packager_1_1media_1_1VPxParser.html @@ -205,7 +205,7 @@ Protected Member Functions diff --git a/docs/d5/dda/ts__section__psi_8h_source.html b/docs/d5/dda/ts__section__psi_8h_source.html index 071b244744..2bbd049422 100644 --- a/docs/d5/dda/ts__section__psi_8h_source.html +++ b/docs/d5/dda/ts__section__psi_8h_source.html @@ -151,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/de0/bit__reader_8cc_source.html b/docs/d5/de0/bit__reader_8cc_source.html index 9275129276..cc9843b65f 100644 --- a/docs/d5/de0/bit__reader_8cc_source.html +++ b/docs/d5/de0/bit__reader_8cc_source.html @@ -199,7 +199,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dec/classedash__packager_1_1media_1_1wvm_1_1WvmMediaParser-members.html b/docs/d5/dec/classedash__packager_1_1media_1_1wvm_1_1WvmMediaParser-members.html index fae6280c70..2babfe100d 100644 --- a/docs/d5/dec/classedash__packager_1_1media_1_1wvm_1_1WvmMediaParser-members.html +++ b/docs/d5/dec/classedash__packager_1_1media_1_1wvm_1_1WvmMediaParser-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/def/ts__section__pmt_8h_source.html b/docs/d5/def/ts__section__pmt_8h_source.html index 8393aa1ae4..7307532d6f 100644 --- a/docs/d5/def/ts__section__pmt_8h_source.html +++ b/docs/d5/def/ts__section__pmt_8h_source.html @@ -133,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/df8/classedash__packager_1_1media_1_1H264BitReader-members.html b/docs/d5/df8/classedash__packager_1_1media_1_1H264BitReader-members.html index e5ea44adac..f3ebcffb10 100644 --- a/docs/d5/df8/classedash__packager_1_1media_1_1H264BitReader-members.html +++ b/docs/d5/df8/classedash__packager_1_1media_1_1H264BitReader-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d5/dfc/file_8cc_source.html b/docs/d5/dfc/file_8cc_source.html index 4f44732fb5..27a94dc53f 100644 --- a/docs/d5/dfc/file_8cc_source.html +++ b/docs/d5/dfc/file_8cc_source.html @@ -376,7 +376,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d00/structedash__packager_1_1media_1_1mp4_1_1Box-members.html b/docs/d6/d00/structedash__packager_1_1media_1_1mp4_1_1Box-members.html index 2970cdbd1e..60c262a172 100644 --- a/docs/d6/d00/structedash__packager_1_1media_1_1mp4_1_1Box-members.html +++ b/docs/d6/d00/structedash__packager_1_1media_1_1mp4_1_1Box-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d06/classedash__packager_1_1media_1_1StreamInfo.html b/docs/d6/d06/classedash__packager_1_1media_1_1StreamInfo.html index 3a319beafb..aa7022e3b3 100644 --- a/docs/d6/d06/classedash__packager_1_1media_1_1StreamInfo.html +++ b/docs/d6/d06/classedash__packager_1_1media_1_1StreamInfo.html @@ -229,7 +229,7 @@ class base::RefCountedThre diff --git a/docs/d6/d10/classedash__packager_1_1media_1_1VideoStreamInfo-members.html b/docs/d6/d10/classedash__packager_1_1media_1_1VideoStreamInfo-members.html index b49f69c6d4..52cd0af335 100644 --- a/docs/d6/d10/classedash__packager_1_1media_1_1VideoStreamInfo-members.html +++ b/docs/d6/d10/classedash__packager_1_1media_1_1VideoStreamInfo-members.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d12/structedash__packager_1_1media_1_1mp4_1_1OriginalFormat-members.html b/docs/d6/d12/structedash__packager_1_1media_1_1mp4_1_1OriginalFormat-members.html index e28c340ff6..5cef89b6f5 100644 --- a/docs/d6/d12/structedash__packager_1_1media_1_1mp4_1_1OriginalFormat-members.html +++ b/docs/d6/d12/structedash__packager_1_1media_1_1mp4_1_1OriginalFormat-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d13/classedash__packager_1_1media_1_1mp4_1_1CompositionOffsetIterator-members.html b/docs/d6/d13/classedash__packager_1_1media_1_1mp4_1_1CompositionOffsetIterator-members.html index d5b72aea25..bcd58393b0 100644 --- a/docs/d6/d13/classedash__packager_1_1media_1_1mp4_1_1CompositionOffsetIterator-members.html +++ b/docs/d6/d13/classedash__packager_1_1media_1_1mp4_1_1CompositionOffsetIterator-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d16/text__stream__info_8cc_source.html b/docs/d6/d16/text__stream__info_8cc_source.html index 11c04c115c..031763996b 100644 --- a/docs/d6/d16/text__stream__info_8cc_source.html +++ b/docs/d6/d16/text__stream__info_8cc_source.html @@ -132,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d17/es__parser__h264_8cc_source.html b/docs/d6/d17/es__parser__h264_8cc_source.html index efe4b6bbfc..a9697a9a71 100644 --- a/docs/d6/d17/es__parser__h264_8cc_source.html +++ b/docs/d6/d17/es__parser__h264_8cc_source.html @@ -482,7 +482,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d19/structedash__packager_1_1media_1_1mp4_1_1SampleGroupDescription-members.html b/docs/d6/d19/structedash__packager_1_1media_1_1mp4_1_1SampleGroupDescription-members.html index 5d90f251f3..272dd9a72e 100644 --- a/docs/d6/d19/structedash__packager_1_1media_1_1mp4_1_1SampleGroupDescription-members.html +++ b/docs/d6/d19/structedash__packager_1_1media_1_1mp4_1_1SampleGroupDescription-members.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d1b/classedash__packager_1_1media_1_1ClosureThread-members.html b/docs/d6/d1b/classedash__packager_1_1media_1_1ClosureThread-members.html index 509729e918..a58bfb9bfc 100644 --- a/docs/d6/d1b/classedash__packager_1_1media_1_1ClosureThread-members.html +++ b/docs/d6/d1b/classedash__packager_1_1media_1_1ClosureThread-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d2e/mpd__notifier__util_8cc_source.html b/docs/d6/d2e/mpd__notifier__util_8cc_source.html index 7e355d2aca..66e31c17f6 100644 --- a/docs/d6/d2e/mpd__notifier__util_8cc_source.html +++ b/docs/d6/d2e/mpd__notifier__util_8cc_source.html @@ -165,12 +165,12 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
This class generates DASH MPDs (Media Presentation Descriptions).
Definition: mpd_builder.h:55
std::string Uint8VectorToBase64(const std::vector< uint8_t > &input)
Converts uint8 vector into base64 encoded string.
bool WriteMpdToFile(const std::string &output_path, MpdBuilder *mpd_builder)
-
virtual bool ToString(std::string *output)
Definition: mpd_builder.cc:422
+
virtual bool ToString(std::string *output)
Definition: mpd_builder.cc:423
ContentType GetContentType(const MediaInfo &media_info)
diff --git a/docs/d6/d35/webm__content__encodings_8cc_source.html b/docs/d6/d35/webm__content__encodings_8cc_source.html index 9f03be5373..60cf79e0c1 100644 --- a/docs/d6/d35/webm__content__encodings_8cc_source.html +++ b/docs/d6/d35/webm__content__encodings_8cc_source.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d37/classedash__packager_1_1xml_1_1AdaptationSetXmlNode.html b/docs/d6/d37/classedash__packager_1_1xml_1_1AdaptationSetXmlNode.html index 0bdbbc5e37..693379f088 100644 --- a/docs/d6/d37/classedash__packager_1_1xml_1_1AdaptationSetXmlNode.html +++ b/docs/d6/d37/classedash__packager_1_1xml_1_1AdaptationSetXmlNode.html @@ -197,7 +197,7 @@ Additional Inherited Members diff --git a/docs/d6/d3a/classedash__packager_1_1media_1_1AesRequestSigner-members.html b/docs/d6/d3a/classedash__packager_1_1media_1_1AesRequestSigner-members.html index a607e95025..3ea2fda2d9 100644 --- a/docs/d6/d3a/classedash__packager_1_1media_1_1AesRequestSigner-members.html +++ b/docs/d6/d3a/classedash__packager_1_1media_1_1AesRequestSigner-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d3b/chunk__info__iterator_8cc_source.html b/docs/d6/d3b/chunk__info__iterator_8cc_source.html index 3b7cba6d1d..764c04437a 100644 --- a/docs/d6/d3b/chunk__info__iterator_8cc_source.html +++ b/docs/d6/d3b/chunk__info__iterator_8cc_source.html @@ -162,7 +162,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
73 } // namespace mp4
74 } // namespace media
75 } // namespace edash_packager
- +
uint32_t NumSamples(uint32_t start_chunk, uint32_t end_chunk) const
ChunkInfoIterator(const SampleToChunk &sample_to_chunk)
Create ChunkInfoIterator from sample to chunk box.
@@ -171,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d41/encrypting__fragmenter_8cc_source.html b/docs/d6/d41/encrypting__fragmenter_8cc_source.html index 1f7606a0dc..3d999c9154 100644 --- a/docs/d6/d41/encrypting__fragmenter_8cc_source.html +++ b/docs/d6/d41/encrypting__fragmenter_8cc_source.html @@ -313,22 +313,22 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
Status InitializeFragment(int64_t first_sample_dts) override
-
virtual Status InitializeFragment(int64_t first_sample_dts)
Definition: fragmenter.cc:73
+
virtual Status InitializeFragment(int64_t first_sample_dts)
Definition: fragmenter.cc:76
virtual Status AddSample(scoped_refptr< MediaSample > sample)
Definition: fragmenter.cc:36
Class to parse a vp9 bit stream.
Definition: vp9_parser.h:20
bool OptimizeSampleEntries(std::vector< T > *entries, T *default_value)
Definition: fragmenter.h:89
Status AddSample(scoped_refptr< MediaSample > sample) override
void FinalizeFragment() override
Finalize and optimize the fragment.
- +
virtual Status PrepareFragmentForEncryption(bool enable_encryption)
virtual void FinalizeFragmentForEncryption()
Finalize current fragment for encryption.
-
virtual void FinalizeFragment()
Finalize and optimize the fragment.
Definition: fragmenter.cc:90
+
virtual void FinalizeFragment()
Finalize and optimize the fragment.
Definition: fragmenter.cc:93
diff --git a/docs/d6/d48/structedash__packager_1_1media_1_1mp4_1_1DataEntryUrl-members.html b/docs/d6/d48/structedash__packager_1_1media_1_1mp4_1_1DataEntryUrl-members.html index 9fe3d242d1..5a37511760 100644 --- a/docs/d6/d48/structedash__packager_1_1media_1_1mp4_1_1DataEntryUrl-members.html +++ b/docs/d6/d48/structedash__packager_1_1media_1_1mp4_1_1DataEntryUrl-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d49/classedash__packager_1_1media_1_1AVCDecoderConfiguration.html b/docs/d6/d49/classedash__packager_1_1media_1_1AVCDecoderConfiguration.html index 3552396e7b..69ae88a07f 100644 --- a/docs/d6/d49/classedash__packager_1_1media_1_1AVCDecoderConfiguration.html +++ b/docs/d6/d49/classedash__packager_1_1media_1_1AVCDecoderConfiguration.html @@ -233,7 +233,7 @@ Static Public Member Functions diff --git a/docs/d6/d4e/webm_2multi__segment__segmenter_8cc_source.html b/docs/d6/d4e/webm_2multi__segment__segmenter_8cc_source.html index 0ab4c78fa6..4543a5abf4 100644 --- a/docs/d6/d4e/webm_2multi__segment__segmenter_8cc_source.html +++ b/docs/d6/d4e/webm_2multi__segment__segmenter_8cc_source.html @@ -183,7 +183,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d59/structedash__packager_1_1media_1_1mp4_1_1DataInformation.html b/docs/d6/d59/structedash__packager_1_1media_1_1mp4_1_1DataInformation.html index 41c5e3e24c..62fe85f0cd 100644 --- a/docs/d6/d59/structedash__packager_1_1media_1_1mp4_1_1DataInformation.html +++ b/docs/d6/d59/structedash__packager_1_1media_1_1mp4_1_1DataInformation.html @@ -136,7 +136,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 494 of file box_definitions.h.

+

Definition at line 501 of file box_definitions.h.

Member Function Documentation

@@ -162,7 +162,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 1664 of file box_definitions.cc.

+

Definition at line 1685 of file box_definitions.cc.

@@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d6/d5d/classedash__packager_1_1media_1_1HEVCDecoderConfiguration.html b/docs/d6/d5d/classedash__packager_1_1media_1_1HEVCDecoderConfiguration.html index 2bfa351385..577fbcfa85 100644 --- a/docs/d6/d5d/classedash__packager_1_1media_1_1HEVCDecoderConfiguration.html +++ b/docs/d6/d5d/classedash__packager_1_1media_1_1HEVCDecoderConfiguration.html @@ -185,7 +185,7 @@ Public Member Functions diff --git a/docs/d6/d5e/structedash__packager_1_1media_1_1H264SEIRecoveryPoint-members.html b/docs/d6/d5e/structedash__packager_1_1media_1_1H264SEIRecoveryPoint-members.html index 5c91abbc7c..d4f52dc03f 100644 --- a/docs/d6/d5e/structedash__packager_1_1media_1_1H264SEIRecoveryPoint-members.html +++ b/docs/d6/d5e/structedash__packager_1_1media_1_1H264SEIRecoveryPoint-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d5e/structedash__packager_1_1media_1_1mp4_1_1DTSSpecific-members.html b/docs/d6/d5e/structedash__packager_1_1media_1_1mp4_1_1DTSSpecific-members.html index 6c1ecfec2c..9820f0336b 100644 --- a/docs/d6/d5e/structedash__packager_1_1media_1_1mp4_1_1DTSSpecific-members.html +++ b/docs/d6/d5e/structedash__packager_1_1media_1_1mp4_1_1DTSSpecific-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d6c/structedash__packager_1_1media_1_1mp4_1_1DataEntryUrl.html b/docs/d6/d6c/structedash__packager_1_1media_1_1mp4_1_1DataEntryUrl.html index d224e85e3e..f2cf7699bc 100644 --- a/docs/d6/d6c/structedash__packager_1_1media_1_1mp4_1_1DataEntryUrl.html +++ b/docs/d6/d6c/structedash__packager_1_1media_1_1mp4_1_1DataEntryUrl.html @@ -145,7 +145,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 481 of file box_definitions.h.

+

Definition at line 488 of file box_definitions.h.

Member Function Documentation

@@ -171,7 +171,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 1622 of file box_definitions.cc.

+

Definition at line 1643 of file box_definitions.cc.

@@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d6/d6e/ts__section__pes_8cc_source.html b/docs/d6/d6e/ts__section__pes_8cc_source.html index 0de96dbc46..c1be7978e1 100644 --- a/docs/d6/d6e/ts__section__pes_8cc_source.html +++ b/docs/d6/d6e/ts__section__pes_8cc_source.html @@ -405,7 +405,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d71/scoped__xml__ptr_8h_source.html b/docs/d6/d71/scoped__xml__ptr_8h_source.html index 5b482e8692..dc6bc2be6f 100644 --- a/docs/d6/d71/scoped__xml__ptr_8h_source.html +++ b/docs/d6/d71/scoped__xml__ptr_8h_source.html @@ -131,7 +131,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d74/structedash__packager_1_1media_1_1mp4_1_1VTTCueBox.html b/docs/d6/d74/structedash__packager_1_1media_1_1mp4_1_1VTTCueBox.html index ffca1587fd..ef94cf40d0 100644 --- a/docs/d6/d74/structedash__packager_1_1media_1_1mp4_1_1VTTCueBox.html +++ b/docs/d6/d74/structedash__packager_1_1media_1_1mp4_1_1VTTCueBox.html @@ -148,7 +148,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 752 of file box_definitions.h.

+

Definition at line 759 of file box_definitions.h.

Member Function Documentation

@@ -174,7 +174,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 2490 of file box_definitions.cc.

+

Definition at line 2511 of file box_definitions.cc.

@@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/d6/d77/dash__iop__mpd__notifier_8h_source.html b/docs/d6/d77/dash__iop__mpd__notifier_8h_source.html index 13a2be24a2..caa7aee60b 100644 --- a/docs/d6/d77/dash__iop__mpd__notifier_8h_source.html +++ b/docs/d6/d77/dash__iop__mpd__notifier_8h_source.html @@ -218,7 +218,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d79/structedash__packager_1_1media_1_1mp4_1_1ChunkOffset.html b/docs/d6/d79/structedash__packager_1_1media_1_1mp4_1_1ChunkOffset.html index b51d2d4042..78dfc015e0 100644 --- a/docs/d6/d79/structedash__packager_1_1media_1_1mp4_1_1ChunkOffset.html +++ b/docs/d6/d79/structedash__packager_1_1media_1_1mp4_1_1ChunkOffset.html @@ -143,7 +143,7 @@ uint32_t flags

Detailed Description

-

Definition at line 426 of file box_definitions.h.

+

Definition at line 433 of file box_definitions.h.

Member Function Documentation

@@ -169,7 +169,7 @@ uint32_t flagsReimplemented from edash_packager::media::mp4::ChunkLargeOffset.

-

Definition at line 824 of file box_definitions.cc.

+

Definition at line 825 of file box_definitions.cc.

@@ -180,7 +180,7 @@ uint32_t flags diff --git a/docs/d6/d7b/webm__tracks__parser_8h_source.html b/docs/d6/d7b/webm__tracks__parser_8h_source.html index 5751cc0344..6782eae729 100644 --- a/docs/d6/d7b/webm__tracks__parser_8h_source.html +++ b/docs/d6/d7b/webm__tracks__parser_8h_source.html @@ -202,7 +202,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d80/classedash__packager_1_1media_1_1Demuxer-members.html b/docs/d6/d80/classedash__packager_1_1media_1_1Demuxer-members.html index 41a2c23766..11ac5f1cbe 100644 --- a/docs/d6/d80/classedash__packager_1_1media_1_1Demuxer-members.html +++ b/docs/d6/d80/classedash__packager_1_1media_1_1Demuxer-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d81/classedash__packager_1_1media_1_1LibcryptoThreading-members.html b/docs/d6/d81/classedash__packager_1_1media_1_1LibcryptoThreading-members.html index 1d9b19f1b2..65d5ecad7a 100644 --- a/docs/d6/d81/classedash__packager_1_1media_1_1LibcryptoThreading-members.html +++ b/docs/d6/d81/classedash__packager_1_1media_1_1LibcryptoThreading-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d86/bandwidth__estimator_8cc_source.html b/docs/d6/d86/bandwidth__estimator_8cc_source.html index fb1330e8bc..0d5fb3c123 100644 --- a/docs/d6/d86/bandwidth__estimator_8cc_source.html +++ b/docs/d6/d86/bandwidth__estimator_8cc_source.html @@ -154,7 +154,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d8a/vp9__parser_8cc_source.html b/docs/d6/d8a/vp9__parser_8cc_source.html index 397d476849..eec674a806 100644 --- a/docs/d6/d8a/vp9__parser_8cc_source.html +++ b/docs/d6/d8a/vp9__parser_8cc_source.html @@ -659,7 +659,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d8b/structedash__packager_1_1media_1_1mp4_1_1MovieExtends.html b/docs/d6/d8b/structedash__packager_1_1media_1_1mp4_1_1MovieExtends.html index 17e566a8a8..94f0e309b8 100644 --- a/docs/d6/d8b/structedash__packager_1_1media_1_1mp4_1_1MovieExtends.html +++ b/docs/d6/d8b/structedash__packager_1_1media_1_1mp4_1_1MovieExtends.html @@ -139,7 +139,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 544 of file box_definitions.h.

+

Definition at line 551 of file box_definitions.h.

Member Function Documentation

@@ -165,7 +165,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 1822 of file box_definitions.cc.

+

Definition at line 1843 of file box_definitions.cc.

@@ -176,7 +176,7 @@ Additional Inherited Members diff --git a/docs/d6/d8f/structedash__packager_1_1media_1_1mp4_1_1FullBox.html b/docs/d6/d8f/structedash__packager_1_1media_1_1mp4_1_1FullBox.html index 935ea7c887..8a9c4ec879 100644 --- a/docs/d6/d8f/structedash__packager_1_1media_1_1mp4_1_1FullBox.html +++ b/docs/d6/d8f/structedash__packager_1_1media_1_1mp4_1_1FullBox.html @@ -245,7 +245,7 @@ Protected Member Functions diff --git a/docs/d6/d92/classedash__packager_1_1media_1_1webm_1_1Segmenter-members.html b/docs/d6/d92/classedash__packager_1_1media_1_1webm_1_1Segmenter-members.html index b34c7c8132..aa93e021b0 100644 --- a/docs/d6/d92/classedash__packager_1_1media_1_1webm_1_1Segmenter-members.html +++ b/docs/d6/d92/classedash__packager_1_1media_1_1webm_1_1Segmenter-members.html @@ -121,7 +121,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d96/structedash__packager_1_1media_1_1mp4_1_1SampleDescription-members.html b/docs/d6/d96/structedash__packager_1_1media_1_1mp4_1_1SampleDescription-members.html index f25710fb86..0b371dcc66 100644 --- a/docs/d6/d96/structedash__packager_1_1media_1_1mp4_1_1SampleDescription-members.html +++ b/docs/d6/d96/structedash__packager_1_1media_1_1mp4_1_1SampleDescription-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d97/classedash__packager_1_1media_1_1UdpFile-members.html b/docs/d6/d97/classedash__packager_1_1media_1_1UdpFile-members.html index ff498d8d65..223f426ff5 100644 --- a/docs/d6/d97/classedash__packager_1_1media_1_1UdpFile-members.html +++ b/docs/d6/d97/classedash__packager_1_1media_1_1UdpFile-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d9b/h264__parser_8h_source.html b/docs/d6/d9b/h264__parser_8h_source.html index f8c4b777b0..1172544d7d 100644 --- a/docs/d6/d9b/h264__parser_8h_source.html +++ b/docs/d6/d9b/h264__parser_8h_source.html @@ -516,7 +516,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/d9c/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPes-members.html b/docs/d6/d9c/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPes-members.html index 99e1cda1b9..2b76b5cdc1 100644 --- a/docs/d6/d9c/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPes-members.html +++ b/docs/d6/d9c/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPes-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/da0/ts__section__pat_8h_source.html b/docs/d6/da0/ts__section__pat_8h_source.html index 64a75704ec..caeb363b99 100644 --- a/docs/d6/da0/ts__section__pat_8h_source.html +++ b/docs/d6/da0/ts__section__pat_8h_source.html @@ -135,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/da2/classedash__packager_1_1media_1_1AesCbcCtsEncryptor.html b/docs/d6/da2/classedash__packager_1_1media_1_1AesCbcCtsEncryptor.html index 968ae40bb1..e3cd1f9e89 100644 --- a/docs/d6/da2/classedash__packager_1_1media_1_1AesCbcCtsEncryptor.html +++ b/docs/d6/da2/classedash__packager_1_1media_1_1AesCbcCtsEncryptor.html @@ -258,7 +258,7 @@ const std::vector< uint8_t > &  diff --git a/docs/d6/da3/classedash__packager_1_1media_1_1H264Parser.html b/docs/d6/da3/classedash__packager_1_1media_1_1H264Parser.html index fb71d66d08..e76cae7cf7 100644 --- a/docs/d6/da3/classedash__packager_1_1media_1_1H264Parser.html +++ b/docs/d6/da3/classedash__packager_1_1media_1_1H264Parser.html @@ -154,7 +154,7 @@ static bool FindStartCode< diff --git a/docs/d6/da3/mpd__builder_8h_source.html b/docs/d6/da3/mpd__builder_8h_source.html index 83d3e9de9f..24e0cdecb0 100644 --- a/docs/d6/da3/mpd__builder_8h_source.html +++ b/docs/d6/da3/mpd__builder_8h_source.html @@ -383,133 +383,145 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
412 
416  public:
-
417  virtual ~Representation();
-
418 
-
422  bool Init();
-
423 
-
434  virtual void AddContentProtectionElement(
-
435  const ContentProtectionElement& element);
-
436 
-
448  virtual void UpdateContentProtectionPssh(const std::string& drm_uuid,
-
449  const std::string& pssh);
-
450 
-
459  virtual void AddNewSegment(uint64_t start_time,
-
460  uint64_t duration,
-
461  uint64_t size);
-
462 
-
468  virtual void SetSampleDuration(uint32_t sample_duration);
-
469 
-
471  xml::scoped_xml_ptr<xmlNode> GetXml();
-
472 
-
474  uint32_t id() const { return id_; }
+
417  enum SuppressFlag {
+
418  kSuppressWidth = 1,
+
419  kSuppressHeight = 2,
+
420  kSuppressFrameRate = 4,
+
421  };
+
422 
+
423  virtual ~Representation();
+
424 
+
428  bool Init();
+
429 
+
440  virtual void AddContentProtectionElement(
+
441  const ContentProtectionElement& element);
+
442 
+
454  virtual void UpdateContentProtectionPssh(const std::string& drm_uuid,
+
455  const std::string& pssh);
+
456 
+
465  virtual void AddNewSegment(uint64_t start_time,
+
466  uint64_t duration,
+
467  uint64_t size);
+
468 
+
474  virtual void SetSampleDuration(uint32_t sample_duration);
475 
-
476  protected:
- -
486  const MediaInfo& media_info,
-
487  const MpdOptions& mpd_options,
-
488  uint32_t representation_id,
-
489  scoped_ptr<RepresentationStateChangeListener> state_change_listener);
-
490 
-
491  private:
-
492  friend class AdaptationSet;
-
493  template <MpdBuilder::MpdType type>
-
494  friend class MpdBuilderTest;
-
495 
-
496  bool AddLiveInfo(xml::RepresentationXmlNode* representation);
-
497 
-
498  // Returns true if |media_info_| has required fields to generate a valid
-
499  // Representation. Otherwise returns false.
-
500  bool HasRequiredMediaInfoFields();
-
501 
-
502  // Return false if the segment should be considered a new segment. True if the
-
503  // segment is contiguous.
-
504  bool IsContiguous(uint64_t start_time,
-
505  uint64_t duration,
-
506  uint64_t size) const;
-
507 
-
508  // Remove elements from |segment_infos_| if
-
509  // mpd_options_.time_shift_buffer_depth is specified. Increments
-
510  // |start_number_| by the number of segments removed.
-
511  void SlideWindow();
-
512 
-
513  // Note: Because 'mimeType' is a required field for a valid MPD, these return
-
514  // strings.
-
515  std::string GetVideoMimeType() const;
-
516  std::string GetAudioMimeType() const;
-
517  std::string GetTextMimeType() const;
-
518 
-
519  // Gets the earliest, normalized segment timestamp. Returns true if
-
520  // successful, false otherwise.
-
521  bool GetEarliestTimestamp(double* timestamp_seconds);
-
522 
-
523  // Init() checks that only one of VideoInfo, AudioInfo, or TextInfo is set. So
-
524  // any logic using this can assume only one set.
-
525  MediaInfo media_info_;
-
526  std::list<ContentProtectionElement> content_protection_elements_;
-
527  std::list<SegmentInfo> segment_infos_;
+
477  xml::scoped_xml_ptr<xmlNode> GetXml();
+
478 
+
487  void SuppressOnce(SuppressFlag flag);
+
488 
+
490  uint32_t id() const { return id_; }
+
491 
+
492  protected:
+ +
502  const MediaInfo& media_info,
+
503  const MpdOptions& mpd_options,
+
504  uint32_t representation_id,
+
505  scoped_ptr<RepresentationStateChangeListener> state_change_listener);
+
506 
+
507  private:
+
508  friend class AdaptationSet;
+
509  template <MpdBuilder::MpdType type>
+
510  friend class MpdBuilderTest;
+
511 
+
512  bool AddLiveInfo(xml::RepresentationXmlNode* representation);
+
513 
+
514  // Returns true if |media_info_| has required fields to generate a valid
+
515  // Representation. Otherwise returns false.
+
516  bool HasRequiredMediaInfoFields();
+
517 
+
518  // Return false if the segment should be considered a new segment. True if the
+
519  // segment is contiguous.
+
520  bool IsContiguous(uint64_t start_time,
+
521  uint64_t duration,
+
522  uint64_t size) const;
+
523 
+
524  // Remove elements from |segment_infos_| if
+
525  // mpd_options_.time_shift_buffer_depth is specified. Increments
+
526  // |start_number_| by the number of segments removed.
+
527  void SlideWindow();
528 
-
529  const uint32_t id_;
-
530  std::string mime_type_;
-
531  std::string codecs_;
-
532  BandwidthEstimator bandwidth_estimator_;
-
533  const MpdOptions& mpd_options_;
+
529  // Note: Because 'mimeType' is a required field for a valid MPD, these return
+
530  // strings.
+
531  std::string GetVideoMimeType() const;
+
532  std::string GetAudioMimeType() const;
+
533  std::string GetTextMimeType() const;
534 
-
535  // startNumber attribute for SegmentTemplate.
-
536  // Starts from 1.
-
537  uint32_t start_number_;
+
535  // Gets the earliest, normalized segment timestamp. Returns true if
+
536  // successful, false otherwise.
+
537  bool GetEarliestTimestamp(double* timestamp_seconds);
538 
-
539  // If this is not null, then Representation is responsible for calling the
-
540  // right methods at right timings.
-
541  scoped_ptr<RepresentationStateChangeListener> state_change_listener_;
-
542 
-
543  DISALLOW_COPY_AND_ASSIGN(Representation);
-
544 };
-
545 
-
546 } // namespace edash_packager
-
547 
-
548 #endif // MPD_BASE_MPD_BUILDER_H_
+
539  // Init() checks that only one of VideoInfo, AudioInfo, or TextInfo is set. So
+
540  // any logic using this can assume only one set.
+
541  MediaInfo media_info_;
+
542  std::list<ContentProtectionElement> content_protection_elements_;
+
543  std::list<SegmentInfo> segment_infos_;
+
544 
+
545  const uint32_t id_;
+
546  std::string mime_type_;
+
547  std::string codecs_;
+
548  BandwidthEstimator bandwidth_estimator_;
+
549  const MpdOptions& mpd_options_;
+
550 
+
551  // startNumber attribute for SegmentTemplate.
+
552  // Starts from 1.
+
553  uint32_t start_number_;
+
554 
+
555  // If this is not null, then Representation is responsible for calling the
+
556  // right methods at right timings.
+
557  scoped_ptr<RepresentationStateChangeListener> state_change_listener_;
+
558 
+
559  // Bit vector for tracking witch attributes should not be output.
+
560  int output_suppression_flags_;
+
561 
+
562  DISALLOW_COPY_AND_ASSIGN(Representation);
+
563 };
+
564 
+
565 } // namespace edash_packager
+
566 
+
567 #endif // MPD_BASE_MPD_BUILDER_H_
MpdType type() const
Definition: mpd_builder.h:90
-
virtual void AddNewSegment(uint64_t start_time, uint64_t duration, uint64_t size)
-
AdaptationSet(uint32_t adaptation_set_id, const std::string &lang, const MpdOptions &mpd_options, MpdBuilder::MpdType mpd_type, base::AtomicSequenceNumber *representation_counter)
Definition: mpd_builder.cc:653
- +
virtual void AddNewSegment(uint64_t start_time, uint64_t duration, uint64_t size)
+
AdaptationSet(uint32_t adaptation_set_id, const std::string &lang, const MpdOptions &mpd_options, MpdBuilder::MpdType mpd_type, base::AtomicSequenceNumber *representation_counter)
Definition: mpd_builder.cc:654
+
Defines Mpd Options.
Definition: mpd_options.h:17
-
virtual int Group() const
Definition: mpd_builder.cc:813
-
virtual AdaptationSet * AddAdaptationSet(const std::string &lang)
Definition: mpd_builder.cc:407
-
xml::scoped_xml_ptr< xmlNode > GetXml()
+
virtual int Group() const
Definition: mpd_builder.cc:826
+
virtual AdaptationSet * AddAdaptationSet(const std::string &lang)
Definition: mpd_builder.cc:408
+
xml::scoped_xml_ptr< xmlNode > GetXml()
Define an abstract file interface.
Definition: file.h:23
-
static void MakePathsRelativeToMpd(const std::string &mpd_path, MediaInfo *media_info)
Definition: mpd_builder.cc:625
+
static void MakePathsRelativeToMpd(const std::string &mpd_path, MediaInfo *media_info)
Definition: mpd_builder.cc:626
This class generates DASH MPDs (Media Presentation Descriptions).
Definition: mpd_builder.h:55
-
virtual void ForceSetSegmentAlignment(bool segment_alignment)
Definition: mpd_builder.cc:803
-
virtual void SetSampleDuration(uint32_t sample_duration)
-
void AddBaseUrl(const std::string &base_url)
Definition: mpd_builder.cc:403
-
virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
-
Representation(const MediaInfo &media_info, const MpdOptions &mpd_options, uint32_t representation_id, scoped_ptr< RepresentationStateChangeListener > state_change_listener)
-
virtual void SetGroup(int group_number)
Definition: mpd_builder.cc:809
+
virtual void ForceSetSegmentAlignment(bool segment_alignment)
Definition: mpd_builder.cc:816
+
virtual void SetSampleDuration(uint32_t sample_duration)
+
void AddBaseUrl(const std::string &base_url)
Definition: mpd_builder.cc:404
+
virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
+
Representation(const MediaInfo &media_info, const MpdOptions &mpd_options, uint32_t representation_id, scoped_ptr< RepresentationStateChangeListener > state_change_listener)
+
virtual void SetGroup(int group_number)
Definition: mpd_builder.cc:822
virtual void OnNewSegmentForRepresentation(uint64_t start_time, uint64_t duration)=0
-
virtual void AddContentProtectionElement(const ContentProtectionElement &element)
+
virtual void AddContentProtectionElement(const ContentProtectionElement &element)
virtual void OnSetFrameRateForRepresentation(uint32_t frame_duration, uint32_t timescale)=0
RepresentationType in MPD.
Definition: xml_node.h:128
-
bool WriteMpdToFile(media::File *output_file)
Definition: mpd_builder.cc:417
-
void OnSetFrameRateForRepresentation(uint32_t representation_id, uint32_t frame_duration, uint32_t timescale)
Definition: mpd_builder.cc:835
-
virtual Representation * AddRepresentation(const MediaInfo &media_info)
Definition: mpd_builder.cc:672
+
bool WriteMpdToFile(media::File *output_file)
Definition: mpd_builder.cc:418
+
void OnSetFrameRateForRepresentation(uint32_t representation_id, uint32_t frame_duration, uint32_t timescale)
Definition: mpd_builder.cc:848
+
virtual Representation * AddRepresentation(const MediaInfo &media_info)
Definition: mpd_builder.cc:673
-
xml::scoped_xml_ptr< xmlNode > GetXml()
Definition: mpd_builder.cc:734
+
xml::scoped_xml_ptr< xmlNode > GetXml()
Definition: mpd_builder.cc:739
+
void SuppressOnce(SuppressFlag flag)
-
virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
Definition: mpd_builder.cc:722
-
virtual bool ToString(std::string *output)
Definition: mpd_builder.cc:422
-
virtual void AddRole(Role role)
Definition: mpd_builder.cc:728
-
MpdBuilder(MpdType type, const MpdOptions &mpd_options)
Definition: mpd_builder.cc:396
-
virtual void AddContentProtectionElement(const ContentProtectionElement &element)
Definition: mpd_builder.cc:716
+
virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
Definition: mpd_builder.cc:723
+
virtual bool ToString(std::string *output)
Definition: mpd_builder.cc:423
+
virtual void AddRole(Role role)
Definition: mpd_builder.cc:729
+
MpdBuilder(MpdType type, const MpdOptions &mpd_options)
Definition: mpd_builder.cc:397
+
virtual void AddContentProtectionElement(const ContentProtectionElement &element)
Definition: mpd_builder.cc:717
- -
void OnNewSegmentForRepresentation(uint32_t representation_id, uint64_t start_time, uint64_t duration)
Definition: mpd_builder.cc:824
+ +
void OnNewSegmentForRepresentation(uint32_t representation_id, uint64_t start_time, uint64_t duration)
Definition: mpd_builder.cc:837
diff --git a/docs/d6/da8/classedash__packager_1_1media_1_1WebMWebVTTParser-members.html b/docs/d6/da8/classedash__packager_1_1media_1_1WebMWebVTTParser-members.html index 470b699737..fc89fbf3cc 100644 --- a/docs/d6/da8/classedash__packager_1_1media_1_1WebMWebVTTParser-members.html +++ b/docs/d6/da8/classedash__packager_1_1media_1_1WebMWebVTTParser-members.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dba/classedash__packager_1_1media_1_1ThreadedIoFile-members.html b/docs/d6/dba/classedash__packager_1_1media_1_1ThreadedIoFile-members.html index be964092d4..cb56ce4656 100644 --- a/docs/d6/dba/classedash__packager_1_1media_1_1ThreadedIoFile-members.html +++ b/docs/d6/dba/classedash__packager_1_1media_1_1ThreadedIoFile-members.html @@ -110,8 +110,6 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); OpenWithNoBuffering(const char *file_name, const char *mode)edash_packager::media::Filestatic Read(void *buffer, uint64_t length) overrideedash_packager::media::ThreadedIoFilevirtual ReadFileToString(const char *file_name, std::string *contents)edash_packager::media::Filestatic - RunInInputMode() (defined in edash_packager::media::ThreadedIoFile)edash_packager::media::ThreadedIoFileprotected - RunInOutputMode() (defined in edash_packager::media::ThreadedIoFile)edash_packager::media::ThreadedIoFileprotected Seek(uint64_t position) overrideedash_packager::media::ThreadedIoFilevirtual Size() overrideedash_packager::media::ThreadedIoFilevirtual Tell(uint64_t *position) overrideedash_packager::media::ThreadedIoFilevirtual @@ -122,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dbb/structedash__packager_1_1media_1_1mp4_1_1CompositionOffset-members.html b/docs/d6/dbb/structedash__packager_1_1media_1_1mp4_1_1CompositionOffset-members.html index 7924571c38..fff135b8b3 100644 --- a/docs/d6/dbb/structedash__packager_1_1media_1_1mp4_1_1CompositionOffset-members.html +++ b/docs/d6/dbb/structedash__packager_1_1media_1_1mp4_1_1CompositionOffset-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dbd/structedash__packager_1_1media_1_1Cue-members.html b/docs/d6/dbd/structedash__packager_1_1media_1_1Cue-members.html index 8d6d7f30e2..3726037873 100644 --- a/docs/d6/dbd/structedash__packager_1_1media_1_1Cue-members.html +++ b/docs/d6/dbd/structedash__packager_1_1media_1_1Cue-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dc2/classedash__packager_1_1media_1_1TextTrackConfig-members.html b/docs/d6/dc2/classedash__packager_1_1media_1_1TextTrackConfig-members.html index 1f1b9561b4..a785aabdcb 100644 --- a/docs/d6/dc2/classedash__packager_1_1media_1_1TextTrackConfig-members.html +++ b/docs/d6/dc2/classedash__packager_1_1media_1_1TextTrackConfig-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dc4/classedash__packager_1_1media_1_1AesCbcPkcs5Encryptor.html b/docs/d6/dc4/classedash__packager_1_1media_1_1AesCbcPkcs5Encryptor.html index 5df2f3b5f6..8e704b5913 100644 --- a/docs/d6/dc4/classedash__packager_1_1media_1_1AesCbcPkcs5Encryptor.html +++ b/docs/d6/dc4/classedash__packager_1_1media_1_1AesCbcPkcs5Encryptor.html @@ -208,7 +208,7 @@ const std::vector< uint8_t > &  diff --git a/docs/d6/dc8/mkv__writer_8cc_source.html b/docs/d6/dc8/mkv__writer_8cc_source.html index b9482f05dc..e5e20e5a66 100644 --- a/docs/d6/dc8/mkv__writer_8cc_source.html +++ b/docs/d6/dc8/mkv__writer_8cc_source.html @@ -186,7 +186,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dd6/classedash__packager_1_1media_1_1WebMListParser.html b/docs/d6/dd6/classedash__packager_1_1media_1_1WebMListParser.html index 092fba7232..59943eb4b8 100644 --- a/docs/d6/dd6/classedash__packager_1_1media_1_1WebMListParser.html +++ b/docs/d6/dd6/classedash__packager_1_1media_1_1WebMListParser.html @@ -210,7 +210,7 @@ void  diff --git a/docs/d6/dd7/classedash__packager_1_1media_1_1TextStreamInfo.html b/docs/d6/dd7/classedash__packager_1_1media_1_1TextStreamInfo.html index 8a046da8b3..f6d5d54809 100644 --- a/docs/d6/dd7/classedash__packager_1_1media_1_1TextStreamInfo.html +++ b/docs/d6/dd7/classedash__packager_1_1media_1_1TextStreamInfo.html @@ -276,7 +276,7 @@ void set_language (con diff --git a/docs/d6/de6/classedash__packager_1_1media_1_1KeyFetcher-members.html b/docs/d6/de6/classedash__packager_1_1media_1_1KeyFetcher-members.html index 0223b302fa..7b4479fb37 100644 --- a/docs/d6/de6/classedash__packager_1_1media_1_1KeyFetcher-members.html +++ b/docs/d6/de6/classedash__packager_1_1media_1_1KeyFetcher-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/de7/classedash__packager_1_1media_1_1AesCbcPkcs5Encryptor-members.html b/docs/d6/de7/classedash__packager_1_1media_1_1AesCbcPkcs5Encryptor-members.html index 53e486b2a4..1c6d1f6796 100644 --- a/docs/d6/de7/classedash__packager_1_1media_1_1AesCbcPkcs5Encryptor-members.html +++ b/docs/d6/de7/classedash__packager_1_1media_1_1AesCbcPkcs5Encryptor-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/de8/local__file_8cc_source.html b/docs/d6/de8/local__file_8cc_source.html index f257cf858f..9a1c9557fa 100644 --- a/docs/d6/de8/local__file_8cc_source.html +++ b/docs/d6/de8/local__file_8cc_source.html @@ -191,7 +191,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/de8/network__util_8h_source.html b/docs/d6/de8/network__util_8h_source.html index 615fce4d26..e4d615a625 100644 --- a/docs/d6/de8/network__util_8h_source.html +++ b/docs/d6/de8/network__util_8h_source.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/dec/structedash__packager_1_1media_1_1mp4_1_1Movie.html b/docs/d6/dec/structedash__packager_1_1media_1_1mp4_1_1Movie.html index 26680b9720..13b859a50a 100644 --- a/docs/d6/dec/structedash__packager_1_1media_1_1mp4_1_1Movie.html +++ b/docs/d6/dec/structedash__packager_1_1media_1_1mp4_1_1Movie.html @@ -149,7 +149,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 551 of file box_definitions.h.

+

Definition at line 558 of file box_definitions.h.

Member Function Documentation

@@ -175,7 +175,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 1850 of file box_definitions.cc.

+

Definition at line 1871 of file box_definitions.cc.

@@ -186,7 +186,7 @@ Additional Inherited Members diff --git a/docs/d6/ded/ts__packet_8h_source.html b/docs/d6/ded/ts__packet_8h_source.html index f6ea3c6ffa..7078c0fba6 100644 --- a/docs/d6/ded/ts__packet_8h_source.html +++ b/docs/d6/ded/ts__packet_8h_source.html @@ -169,7 +169,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/def/sync__sample__iterator_8cc_source.html b/docs/d6/def/sync__sample__iterator_8cc_source.html index c80fc035fe..b1fd1b8ab4 100644 --- a/docs/d6/def/sync__sample__iterator_8cc_source.html +++ b/docs/d6/def/sync__sample__iterator_8cc_source.html @@ -134,13 +134,13 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
45 } // namespace media
46 } // namespace edash_packager
SyncSampleIterator(const SyncSample &sync_sample)
Create a new SyncSampleIterator from sync sample box.
- + diff --git a/docs/d6/df4/classedash__packager_1_1media_1_1webm_1_1MultiSegmentSegmenter-members.html b/docs/d6/df4/classedash__packager_1_1media_1_1webm_1_1MultiSegmentSegmenter-members.html index 822071527f..bb323e39ed 100644 --- a/docs/d6/df4/classedash__packager_1_1media_1_1webm_1_1MultiSegmentSegmenter-members.html +++ b/docs/d6/df4/classedash__packager_1_1media_1_1webm_1_1MultiSegmentSegmenter-members.html @@ -123,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d6/df9/classedash__packager_1_1media_1_1mp4_1_1MP4MediaParser-members.html b/docs/d6/df9/classedash__packager_1_1media_1_1mp4_1_1MP4MediaParser-members.html index 2611289b41..fed16a45ed 100644 --- a/docs/d6/df9/classedash__packager_1_1media_1_1mp4_1_1MP4MediaParser-members.html +++ b/docs/d6/df9/classedash__packager_1_1media_1_1mp4_1_1MP4MediaParser-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d0b/muxer__listener__test__helper_8h_source.html b/docs/d7/d0b/muxer__listener__test__helper_8h_source.html index 3e4d39a4f3..6aaae773cd 100644 --- a/docs/d7/d0b/muxer__listener__test__helper_8h_source.html +++ b/docs/d7/d0b/muxer__listener__test__helper_8h_source.html @@ -196,7 +196,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d0d/structedash__packager_1_1media_1_1mp4_1_1DataReference.html b/docs/d7/d0d/structedash__packager_1_1media_1_1mp4_1_1DataReference.html index f47dc00b73..e596a9ca05 100644 --- a/docs/d7/d0d/structedash__packager_1_1media_1_1mp4_1_1DataReference.html +++ b/docs/d7/d0d/structedash__packager_1_1media_1_1mp4_1_1DataReference.html @@ -145,7 +145,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 487 of file box_definitions.h.

+

Definition at line 494 of file box_definitions.h.

Member Function Documentation

@@ -171,7 +171,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 1642 of file box_definitions.cc.

+

Definition at line 1663 of file box_definitions.cc.

@@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d7/d12/media__parser_8h_source.html b/docs/d7/d12/media__parser_8h_source.html index 2eeaa17263..67f928a4f0 100644 --- a/docs/d7/d12/media__parser_8h_source.html +++ b/docs/d7/d12/media__parser_8h_source.html @@ -149,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d15/classedash__packager_1_1Representation.html b/docs/d7/d15/classedash__packager_1_1Representation.html index 9d583ab34c..b6bcc2dc7e 100644 --- a/docs/d7/d15/classedash__packager_1_1Representation.html +++ b/docs/d7/d15/classedash__packager_1_1Representation.html @@ -87,6 +87,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
@@ -105,6 +106,14 @@ Inheritance diagram for edash_packager::Representation:
+ + + +

+Public Types

enum  SuppressFlag { kSuppressWidth = 1, +kSuppressHeight = 2, +kSuppressFrameRate = 4 + }
 
@@ -126,6 +135,8 @@ template<MpdBuilder::MpdType type> + + @@ -189,7 +200,7 @@ template<MpdBuilder::MpdType type> -

Definition at line 1002 of file mpd_builder.cc.

+

Definition at line 1015 of file mpd_builder.cc.

@@ -223,7 +234,7 @@ template<MpdBuilder::MpdType type> -

Definition at line 1058 of file mpd_builder.cc.

+

Definition at line 1072 of file mpd_builder.cc.

@@ -274,7 +285,7 @@ template<MpdBuilder::MpdType type> -

Definition at line 1070 of file mpd_builder.cc.

+

Definition at line 1084 of file mpd_builder.cc.

@@ -292,7 +303,7 @@ template<MpdBuilder::MpdType type>
Returns
Copy of <Representation>.
-

Definition at line 1110 of file mpd_builder.cc.

+

Definition at line 1124 of file mpd_builder.cc.

@@ -318,7 +329,7 @@ template<MpdBuilder::MpdType type>
Returns
ID number for <Representation>.
-

Definition at line 474 of file mpd_builder.h.

+

Definition at line 490 of file mpd_builder.h.

@@ -337,7 +348,7 @@ template<MpdBuilder::MpdType type>

Tries to initialize the instance. If this does not succeed, the instance should not be used.

Returns
true on success, false otherwise.
-

Definition at line 1016 of file mpd_builder.cc.

+

Definition at line 1030 of file mpd_builder.cc.

@@ -370,7 +381,26 @@ template<MpdBuilder::MpdType type> -

Definition at line 1094 of file mpd_builder.cc.

+

Definition at line 1108 of file mpd_builder.cc.

+ + + + +
+
+

Public Member Functions

bool Init ()
 
xml::scoped_xml_ptr< xmlNode > GetXml ()
 
void SuppressOnce (SuppressFlag flag)
 
uint32_t id () const
 
 Representation (const MediaInfo &media_info, const MpdOptions &mpd_options, uint32_t representation_id, scoped_ptr< RepresentationStateChangeListener > state_change_listener)
+ + + + + + + +
void edash_packager::Representation::SuppressOnce (SuppressFlag flag)
+
+

By calling this methods, the next time GetXml() is called, the corresponding attributes will not be set. For example, if SuppressOnce(kSuppressWidth) is called, then GetXml() will return a <Representation> element without a attribute. Note that it only applies to the next call to GetXml(), calling GetXml() again without calling this methods will return a <Representation> element with the attribute. This may be called multiple times to set different (or the same) flags.

+ +

Definition at line 1187 of file mpd_builder.cc.

@@ -415,7 +445,7 @@ template<MpdBuilder::MpdType type>
Attention
This might get removed once DASH IF IOP specification makes a a clear guideline on how to handle key rotation. Also to get this working with shaka-player, this method DOES NOT update the PSSH element. Instead, it removes the element regardless of the content of pssh.
-

Definition at line 1064 of file mpd_builder.cc.

+

Definition at line 1078 of file mpd_builder.cc.

@@ -426,7 +456,7 @@ template<MpdBuilder::MpdType type> diff --git a/docs/d7/d15/mpd__notifier_8h_source.html b/docs/d7/d15/mpd__notifier_8h_source.html index dc2501a49c..d382aee8ca 100644 --- a/docs/d7/d15/mpd__notifier_8h_source.html +++ b/docs/d7/d15/mpd__notifier_8h_source.html @@ -169,7 +169,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d1c/structedash__packager_1_1media_1_1mp4_1_1DecodingTime.html b/docs/d7/d1c/structedash__packager_1_1media_1_1mp4_1_1DecodingTime.html index 9501c6361c..7727e691da 100644 --- a/docs/d7/d1c/structedash__packager_1_1media_1_1mp4_1_1DecodingTime.html +++ b/docs/d7/d1c/structedash__packager_1_1media_1_1mp4_1_1DecodingTime.html @@ -105,14 +105,14 @@ uint32_t sample_delta<

Detailed Description

-

Definition at line 361 of file box_definitions.h.

+

Definition at line 368 of file box_definitions.h.


The documentation for this struct was generated from the following file: diff --git a/docs/d7/d22/libcrypto__threading_8h_source.html b/docs/d7/d22/libcrypto__threading_8h_source.html index 3f0e78e41a..804d32c209 100644 --- a/docs/d7/d22/libcrypto__threading_8h_source.html +++ b/docs/d7/d22/libcrypto__threading_8h_source.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d2a/classedash__packager_1_1media_1_1DecryptorSource-members.html b/docs/d7/d2a/classedash__packager_1_1media_1_1DecryptorSource-members.html index 2d42957530..fcd56228d5 100644 --- a/docs/d7/d2a/classedash__packager_1_1media_1_1DecryptorSource-members.html +++ b/docs/d7/d2a/classedash__packager_1_1media_1_1DecryptorSource-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d39/structedash__packager_1_1media_1_1mp4_1_1Movie-members.html b/docs/d7/d39/structedash__packager_1_1media_1_1mp4_1_1Movie-members.html index 7587bcf9df..b1987b0985 100644 --- a/docs/d7/d39/structedash__packager_1_1media_1_1mp4_1_1Movie-members.html +++ b/docs/d7/d39/structedash__packager_1_1media_1_1mp4_1_1Movie-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d3a/classedash__packager_1_1media_1_1VideoStreamInfo.html b/docs/d7/d3a/classedash__packager_1_1media_1_1VideoStreamInfo.html index 2cb3bbcda8..1965c8c057 100644 --- a/docs/d7/d3a/classedash__packager_1_1media_1_1VideoStreamInfo.html +++ b/docs/d7/d3a/classedash__packager_1_1media_1_1VideoStreamInfo.html @@ -429,7 +429,7 @@ void set_language (con diff --git a/docs/d7/d40/classedash__packager_1_1media_1_1WebMClusterParser-members.html b/docs/d7/d40/classedash__packager_1_1media_1_1WebMClusterParser-members.html index 579cedbe49..0578d6bd57 100644 --- a/docs/d7/d40/classedash__packager_1_1media_1_1WebMClusterParser-members.html +++ b/docs/d7/d40/classedash__packager_1_1media_1_1WebMClusterParser-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d44/classedash__packager_1_1MockMpdNotifier.html b/docs/d7/d44/classedash__packager_1_1MockMpdNotifier.html index 63f6906b75..37b1feae9b 100644 --- a/docs/d7/d44/classedash__packager_1_1MockMpdNotifier.html +++ b/docs/d7/d44/classedash__packager_1_1MockMpdNotifier.html @@ -160,7 +160,7 @@ Public Member Functions diff --git a/docs/d7/d49/structedash__packager_1_1media_1_1mp4_1_1CuePayloadBox.html b/docs/d7/d49/structedash__packager_1_1media_1_1mp4_1_1CuePayloadBox.html index 3259cb31e8..63a8da62db 100644 --- a/docs/d7/d49/structedash__packager_1_1media_1_1mp4_1_1CuePayloadBox.html +++ b/docs/d7/d49/structedash__packager_1_1media_1_1mp4_1_1CuePayloadBox.html @@ -136,7 +136,7 @@ Additional Inherited Members

Detailed Description

-

Definition at line 738 of file box_definitions.h.

+

Definition at line 745 of file box_definitions.h.

Member Function Documentation

@@ -162,7 +162,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 2440 of file box_definitions.cc.

+

Definition at line 2461 of file box_definitions.cc.

@@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d7/d4f/structedash__packager_1_1media_1_1mp4_1_1Edit.html b/docs/d7/d4f/structedash__packager_1_1media_1_1mp4_1_1Edit.html index d58c6461a3..eec339abb9 100644 --- a/docs/d7/d4f/structedash__packager_1_1media_1_1mp4_1_1Edit.html +++ b/docs/d7/d4f/structedash__packager_1_1media_1_1mp4_1_1Edit.html @@ -162,7 +162,7 @@ Additional Inherited Members

Implements edash_packager::media::mp4::Box.

-

Definition at line 990 of file box_definitions.cc.

+

Definition at line 991 of file box_definitions.cc.

@@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d7/d50/classedash__packager_1_1media_1_1mp4_1_1EncryptingFragmenter-members.html b/docs/d7/d50/classedash__packager_1_1media_1_1mp4_1_1EncryptingFragmenter-members.html index f2bb2fbdbf..3e20db739d 100644 --- a/docs/d7/d50/classedash__packager_1_1media_1_1mp4_1_1EncryptingFragmenter-members.html +++ b/docs/d7/d50/classedash__packager_1_1media_1_1mp4_1_1EncryptingFragmenter-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d52/classedash__packager_1_1media_1_1WebMListParser-members.html b/docs/d7/d52/classedash__packager_1_1media_1_1WebMListParser-members.html index e3b60f9b0f..4c484a7de0 100644 --- a/docs/d7/d52/classedash__packager_1_1media_1_1WebMListParser-members.html +++ b/docs/d7/d52/classedash__packager_1_1media_1_1WebMListParser-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d55/structedash__packager_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry.html b/docs/d7/d55/structedash__packager_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry.html index 09dc85f6f5..c0d33e04bf 100644 --- a/docs/d7/d55/structedash__packager_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry.html +++ b/docs/d7/d55/structedash__packager_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry.html @@ -108,7 +108,7 @@ std::vector< uint8_t > 

Detailed Description

-

Definition at line 641 of file box_definitions.h.

+

Definition at line 648 of file box_definitions.h.


The documentation for this struct was generated from the following files:
  • media/formats/mp4/box_definitions.h
  • media/formats/mp4/box_definitions.cc
  • @@ -116,7 +116,7 @@ std::vector< uint8_t >  diff --git a/docs/d7/d79/structedash__packager_1_1media_1_1mp4_1_1MediaData-members.html b/docs/d7/d79/structedash__packager_1_1media_1_1mp4_1_1MediaData-members.html index 553eccbff9..02d11140e4 100644 --- a/docs/d7/d79/structedash__packager_1_1media_1_1mp4_1_1MediaData-members.html +++ b/docs/d7/d79/structedash__packager_1_1media_1_1mp4_1_1MediaData-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d7b/structedash__packager_1_1media_1_1mp4_1_1DecodingTime-members.html b/docs/d7/d7b/structedash__packager_1_1media_1_1mp4_1_1DecodingTime-members.html index 8b86a6ed63..0faba6b024 100644 --- a/docs/d7/d7b/structedash__packager_1_1media_1_1mp4_1_1DecodingTime-members.html +++ b/docs/d7/d7b/structedash__packager_1_1media_1_1mp4_1_1DecodingTime-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d7c/vlog__flags_8h_source.html b/docs/d7/d7c/vlog__flags_8h_source.html index 3c2b994991..ce4665b0be 100644 --- a/docs/d7/d7c/vlog__flags_8h_source.html +++ b/docs/d7/d7c/vlog__flags_8h_source.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d82/classedash__packager_1_1MpdBuilder-members.html b/docs/d7/d82/classedash__packager_1_1MpdBuilder-members.html index 6e27fe29bd..ebbfc2c5da 100644 --- a/docs/d7/d82/classedash__packager_1_1MpdBuilder-members.html +++ b/docs/d7/d82/classedash__packager_1_1MpdBuilder-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d85/classedash__packager_1_1media_1_1VPCodecConfiguration.html b/docs/d7/d85/classedash__packager_1_1media_1_1VPCodecConfiguration.html index 6f6d1ef535..df57f1d697 100644 --- a/docs/d7/d85/classedash__packager_1_1media_1_1VPCodecConfiguration.html +++ b/docs/d7/d85/classedash__packager_1_1media_1_1VPCodecConfiguration.html @@ -255,7 +255,7 @@ bool video_full_range_flag diff --git a/docs/d7/d87/video__stream__info_8h_source.html b/docs/d7/d87/video__stream__info_8h_source.html index 241cf2aee0..4e4d87a9f0 100644 --- a/docs/d7/d87/video__stream__info_8h_source.html +++ b/docs/d7/d87/video__stream__info_8h_source.html @@ -188,7 +188,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/d8a/structedash__packager_1_1media_1_1mp4_1_1Box.html b/docs/d7/d8a/structedash__packager_1_1media_1_1mp4_1_1Box.html index b6fda8d18a..84169c2fb8 100644 --- a/docs/d7/d8a/structedash__packager_1_1media_1_1mp4_1_1Box.html +++ b/docs/d7/d8a/structedash__packager_1_1media_1_1mp4_1_1Box.html @@ -103,38 +103,39 @@ Inheritance diagram for edash_packager::media::mp4::Box:
    -edash_packager::media::mp4::AudioSampleEntry -edash_packager::media::mp4::CodecConfigurationRecord -edash_packager::media::mp4::CueIDBox -edash_packager::media::mp4::CuePayloadBox -edash_packager::media::mp4::CueSettingsBox -edash_packager::media::mp4::CueSourceIDBox -edash_packager::media::mp4::CueTimeBox -edash_packager::media::mp4::DataInformation -edash_packager::media::mp4::DTSSpecific -edash_packager::media::mp4::Edit -edash_packager::media::mp4::FileType -edash_packager::media::mp4::FullBox -edash_packager::media::mp4::Media -edash_packager::media::mp4::MediaData -edash_packager::media::mp4::MediaInformation -edash_packager::media::mp4::Movie -edash_packager::media::mp4::MovieExtends -edash_packager::media::mp4::MovieFragment -edash_packager::media::mp4::OriginalFormat -edash_packager::media::mp4::PixelAspectRatio -edash_packager::media::mp4::ProtectionSchemeInfo -edash_packager::media::mp4::SampleTable -edash_packager::media::mp4::SchemeInfo -edash_packager::media::mp4::Track -edash_packager::media::mp4::TrackFragment -edash_packager::media::mp4::VideoSampleEntry -edash_packager::media::mp4::VTTAdditionalTextBox -edash_packager::media::mp4::VTTCueBox -edash_packager::media::mp4::VTTEmptyCueBox -edash_packager::media::mp4::WebVTTConfigurationBox -edash_packager::media::mp4::WebVTTSourceLabelBox -edash_packager::media::mp4::WVTTSampleEntry +edash_packager::media::mp4::AC3Specific +edash_packager::media::mp4::AudioSampleEntry +edash_packager::media::mp4::CodecConfigurationRecord +edash_packager::media::mp4::CueIDBox +edash_packager::media::mp4::CuePayloadBox +edash_packager::media::mp4::CueSettingsBox +edash_packager::media::mp4::CueSourceIDBox +edash_packager::media::mp4::CueTimeBox +edash_packager::media::mp4::DataInformation +edash_packager::media::mp4::DTSSpecific +edash_packager::media::mp4::Edit +edash_packager::media::mp4::FileType +edash_packager::media::mp4::FullBox +edash_packager::media::mp4::Media +edash_packager::media::mp4::MediaData +edash_packager::media::mp4::MediaInformation +edash_packager::media::mp4::Movie +edash_packager::media::mp4::MovieExtends +edash_packager::media::mp4::MovieFragment +edash_packager::media::mp4::OriginalFormat +edash_packager::media::mp4::PixelAspectRatio +edash_packager::media::mp4::ProtectionSchemeInfo +edash_packager::media::mp4::SampleTable +edash_packager::media::mp4::SchemeInfo +edash_packager::media::mp4::Track +edash_packager::media::mp4::TrackFragment +edash_packager::media::mp4::VideoSampleEntry +edash_packager::media::mp4::VTTAdditionalTextBox +edash_packager::media::mp4::VTTCueBox +edash_packager::media::mp4::VTTEmptyCueBox +edash_packager::media::mp4::WebVTTConfigurationBox +edash_packager::media::mp4::WebVTTSourceLabelBox +edash_packager::media::mp4::WVTTSampleEntry
    @@ -219,7 +220,7 @@ class 
    Returns
    box type.
    -

    Implemented in edash_packager::media::mp4::VTTCueBox, edash_packager::media::mp4::VTTAdditionalTextBox, edash_packager::media::mp4::VTTEmptyCueBox, edash_packager::media::mp4::CuePayloadBox, edash_packager::media::mp4::CueSettingsBox, edash_packager::media::mp4::CueIDBox, edash_packager::media::mp4::CueTimeBox, edash_packager::media::mp4::CueSourceIDBox, edash_packager::media::mp4::MediaData, edash_packager::media::mp4::SegmentIndex, edash_packager::media::mp4::MovieFragment, edash_packager::media::mp4::TrackFragment, edash_packager::media::mp4::SampleGroupDescription, edash_packager::media::mp4::SampleToGroup, edash_packager::media::mp4::TrackFragmentRun, edash_packager::media::mp4::TrackFragmentHeader, edash_packager::media::mp4::MovieFragmentHeader, edash_packager::media::mp4::TrackFragmentDecodeTime, edash_packager::media::mp4::Movie, edash_packager::media::mp4::MovieExtends, edash_packager::media::mp4::TrackExtends, edash_packager::media::mp4::MovieExtendsHeader, edash_packager::media::mp4::Track, edash_packager::media::mp4::Media, edash_packager::media::mp4::MediaInformation, edash_packager::media::mp4::DataInformation, edash_packager::media::mp4::DataReference, edash_packager::media::mp4::DataEntryUrl, edash_packager::media::mp4::SubtitleMediaHeader, edash_packager::media::mp4::SoundMediaHeader, edash_packager::media::mp4::VideoMediaHeader, edash_packager::media::mp4::MediaHeader, edash_packager::media::mp4::SampleTable, edash_packager::media::mp4::SyncSample, edash_packager::media::mp4::ChunkOffset, edash_packager::media::mp4::ChunkLargeOffset, edash_packager::media::mp4::CompactSampleSize, edash_packager::media::mp4::SampleSize, edash_packager::media::mp4::SampleToChunk, edash_packager::media::mp4::CompositionTimeToSample, edash_packager::media::mp4::DecodingTimeToSample, edash_packager::media::mp4::SampleDescription, edash_packager::media::mp4::WVTTSampleEntry, edash_packager::media::mp4::WebVTTSourceLabelBox, edash_packager::media::mp4::WebVTTConfigurationBox, edash_packager::media::mp4::AudioSampleEntry, edash_packager::media::mp4::DTSSpecific, edash_packager::media::mp4::ElementaryStreamDescriptor, edash_packager::media::mp4::VideoSampleEntry, edash_packager::media::mp4::PixelAspectRatio, edash_packager::media::mp4::CodecConfigurationRecord, edash_packager::media::mp4::Metadata, edash_packager::media::mp4::ID3v2, edash_packager::media::mp4::HandlerReference, edash_packager::media::mp4::Edit, edash_packager::media::mp4::EditList, edash_packager::media::mp4::TrackHeader, edash_packager::media::mp4::MovieHeader, edash_packager::media::mp4::ProtectionSchemeInfo, edash_packager::media::mp4::SchemeInfo, edash_packager::media::mp4::TrackEncryption, edash_packager::media::mp4::SchemeType, edash_packager::media::mp4::OriginalFormat, edash_packager::media::mp4::SampleEncryption, edash_packager::media::mp4::SampleAuxiliaryInformationSize, edash_packager::media::mp4::SampleAuxiliaryInformationOffset, edash_packager::media::mp4::ProtectionSystemSpecificHeader, edash_packager::media::mp4::SegmentType, and edash_packager::media::mp4::FileType.

    +

    Implemented in edash_packager::media::mp4::VTTCueBox, edash_packager::media::mp4::VTTAdditionalTextBox, edash_packager::media::mp4::VTTEmptyCueBox, edash_packager::media::mp4::CuePayloadBox, edash_packager::media::mp4::CueSettingsBox, edash_packager::media::mp4::CueIDBox, edash_packager::media::mp4::CueTimeBox, edash_packager::media::mp4::CueSourceIDBox, edash_packager::media::mp4::MediaData, edash_packager::media::mp4::SegmentIndex, edash_packager::media::mp4::MovieFragment, edash_packager::media::mp4::TrackFragment, edash_packager::media::mp4::SampleGroupDescription, edash_packager::media::mp4::SampleToGroup, edash_packager::media::mp4::TrackFragmentRun, edash_packager::media::mp4::TrackFragmentHeader, edash_packager::media::mp4::MovieFragmentHeader, edash_packager::media::mp4::TrackFragmentDecodeTime, edash_packager::media::mp4::Movie, edash_packager::media::mp4::MovieExtends, edash_packager::media::mp4::TrackExtends, edash_packager::media::mp4::MovieExtendsHeader, edash_packager::media::mp4::Track, edash_packager::media::mp4::Media, edash_packager::media::mp4::MediaInformation, edash_packager::media::mp4::DataInformation, edash_packager::media::mp4::DataReference, edash_packager::media::mp4::DataEntryUrl, edash_packager::media::mp4::SubtitleMediaHeader, edash_packager::media::mp4::SoundMediaHeader, edash_packager::media::mp4::VideoMediaHeader, edash_packager::media::mp4::MediaHeader, edash_packager::media::mp4::SampleTable, edash_packager::media::mp4::SyncSample, edash_packager::media::mp4::ChunkOffset, edash_packager::media::mp4::ChunkLargeOffset, edash_packager::media::mp4::CompactSampleSize, edash_packager::media::mp4::SampleSize, edash_packager::media::mp4::SampleToChunk, edash_packager::media::mp4::CompositionTimeToSample, edash_packager::media::mp4::DecodingTimeToSample, edash_packager::media::mp4::SampleDescription, edash_packager::media::mp4::WVTTSampleEntry, edash_packager::media::mp4::WebVTTSourceLabelBox, edash_packager::media::mp4::WebVTTConfigurationBox, edash_packager::media::mp4::AudioSampleEntry, edash_packager::media::mp4::AC3Specific, edash_packager::media::mp4::DTSSpecific, edash_packager::media::mp4::ElementaryStreamDescriptor, edash_packager::media::mp4::VideoSampleEntry, edash_packager::media::mp4::PixelAspectRatio, edash_packager::media::mp4::CodecConfigurationRecord, edash_packager::media::mp4::Metadata, edash_packager::media::mp4::ID3v2, edash_packager::media::mp4::HandlerReference, edash_packager::media::mp4::Edit, edash_packager::media::mp4::EditList, edash_packager::media::mp4::TrackHeader, edash_packager::media::mp4::MovieHeader, edash_packager::media::mp4::ProtectionSchemeInfo, edash_packager::media::mp4::SchemeInfo, edash_packager::media::mp4::TrackEncryption, edash_packager::media::mp4::SchemeType, edash_packager::media::mp4::OriginalFormat, edash_packager::media::mp4::SampleEncryption, edash_packager::media::mp4::SampleAuxiliaryInformationSize, edash_packager::media::mp4::SampleAuxiliaryInformationOffset, edash_packager::media::mp4::ProtectionSystemSpecificHeader, edash_packager::media::mp4::SegmentType, and edash_packager::media::mp4::FileType.

    @@ -382,7 +383,7 @@ class  diff --git a/docs/d7/d8a/structedash__packager_1_1media_1_1mp4_1_1Box.png b/docs/d7/d8a/structedash__packager_1_1media_1_1mp4_1_1Box.png index cac951484f..16383d5f3e 100644 Binary files a/docs/d7/d8a/structedash__packager_1_1media_1_1mp4_1_1Box.png and b/docs/d7/d8a/structedash__packager_1_1media_1_1mp4_1_1Box.png differ diff --git a/docs/d7/d8f/structedash__packager_1_1media_1_1mp4_1_1CueSourceIDBox-members.html b/docs/d7/d8f/structedash__packager_1_1media_1_1mp4_1_1CueSourceIDBox-members.html index cba931cdda..b400ba2f50 100644 --- a/docs/d7/d8f/structedash__packager_1_1media_1_1mp4_1_1CueSourceIDBox-members.html +++ b/docs/d7/d8f/structedash__packager_1_1media_1_1mp4_1_1CueSourceIDBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    BoxBuffer BoxBuffer
    diff --git a/docs/d7/d9d/progress__listener_8h_source.html b/docs/d7/d9d/progress__listener_8h_source.html index cd1b3fe806..991af7dba4 100644 --- a/docs/d7/d9d/progress__listener_8h_source.html +++ b/docs/d7/d9d/progress__listener_8h_source.html @@ -127,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/da4/track__run__iterator_8h_source.html b/docs/d7/da4/track__run__iterator_8h_source.html index 3b0bd254d5..c1731ee350 100644 --- a/docs/d7/da4/track__run__iterator_8h_source.html +++ b/docs/d7/da4/track__run__iterator_8h_source.html @@ -183,19 +183,19 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    const AudioSampleEntry & audio_description() const
    Only valid if is_audio() is true.
    - + - + - + diff --git a/docs/d7/da5/structedash__packager_1_1media_1_1mp4_1_1SampleSize.html b/docs/d7/da5/structedash__packager_1_1media_1_1mp4_1_1SampleSize.html index bf86666b98..a446e1c2a3 100644 --- a/docs/d7/da5/structedash__packager_1_1media_1_1mp4_1_1SampleSize.html +++ b/docs/d7/da5/structedash__packager_1_1media_1_1mp4_1_1SampleSize.html @@ -151,7 +151,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 402 of file box_definitions.h.

    +

    Definition at line 409 of file box_definitions.h.

    Member Function Documentation

    @@ -177,7 +177,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 744 of file box_definitions.cc.

    +

    Definition at line 745 of file box_definitions.cc.

    @@ -188,7 +188,7 @@ Additional Inherited Members diff --git a/docs/d7/db0/mpd__writer_8h_source.html b/docs/d7/db0/mpd__writer_8h_source.html index 7b1b303dd8..7c99640f94 100644 --- a/docs/d7/db0/mpd__writer_8h_source.html +++ b/docs/d7/db0/mpd__writer_8h_source.html @@ -184,7 +184,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/db3/structedash__packager_1_1Element-members.html b/docs/d7/db3/structedash__packager_1_1Element-members.html index 1238831df5..b67ac717a1 100644 --- a/docs/d7/db3/structedash__packager_1_1Element-members.html +++ b/docs/d7/db3/structedash__packager_1_1Element-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/dc6/byte__queue_8h_source.html b/docs/d7/dc6/byte__queue_8h_source.html index 45c322b89d..7b1e33075c 100644 --- a/docs/d7/dc6/byte__queue_8h_source.html +++ b/docs/d7/dc6/byte__queue_8h_source.html @@ -144,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/dcc/structedash__packager_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html b/docs/d7/dcc/structedash__packager_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html index 989eccbdd4..101948f87e 100644 --- a/docs/d7/dcc/structedash__packager_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html +++ b/docs/d7/dcc/structedash__packager_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html @@ -136,7 +136,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 330 of file box_definitions.h.

    +

    Definition at line 337 of file box_definitions.h.

    Member Function Documentation

    @@ -162,7 +162,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1485 of file box_definitions.cc.

    +

    Definition at line 1506 of file box_definitions.cc.

    @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/d7/dd0/mpd__notifier__util_8h_source.html b/docs/d7/dd0/mpd__notifier__util_8h_source.html index 1d7075aaf4..adfb17f26b 100644 --- a/docs/d7/dd0/mpd__notifier__util_8h_source.html +++ b/docs/d7/dd0/mpd__notifier__util_8h_source.html @@ -128,7 +128,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/dd2/classedash__packager_1_1media_1_1VPxParser-members.html b/docs/d7/dd2/classedash__packager_1_1media_1_1VPxParser-members.html index 87b32532b3..45ec10de7f 100644 --- a/docs/d7/dd2/classedash__packager_1_1media_1_1VPxParser-members.html +++ b/docs/d7/dd2/classedash__packager_1_1media_1_1VPxParser-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/dd4/request__signer_8h_source.html b/docs/d7/dd4/request__signer_8h_source.html index e7214e4935..429bee9916 100644 --- a/docs/d7/dd4/request__signer_8h_source.html +++ b/docs/d7/dd4/request__signer_8h_source.html @@ -178,7 +178,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/dd6/key__source_8cc_source.html b/docs/d7/dd6/key__source_8cc_source.html index 7b4d43d191..f5304b73d6 100644 --- a/docs/d7/dd6/key__source_8cc_source.html +++ b/docs/d7/dd6/key__source_8cc_source.html @@ -296,7 +296,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/de3/structedash__packager_1_1xml_1_1XmlDeleter.html b/docs/d7/de3/structedash__packager_1_1xml_1_1XmlDeleter.html index 584844b71d..b5f2dff1c8 100644 --- a/docs/d7/de3/structedash__packager_1_1xml_1_1XmlDeleter.html +++ b/docs/d7/de3/structedash__packager_1_1xml_1_1XmlDeleter.html @@ -127,7 +127,7 @@ void operator() (xmlCh diff --git a/docs/d7/dec/h264__byte__to__unit__stream__converter_8h_source.html b/docs/d7/dec/h264__byte__to__unit__stream__converter_8h_source.html index 0995b88d7d..7f5ab3a7d9 100644 --- a/docs/d7/dec/h264__byte__to__unit__stream__converter_8h_source.html +++ b/docs/d7/dec/h264__byte__to__unit__stream__converter_8h_source.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/dec/structedash__packager_1_1media_1_1mp4_1_1MediaHeader.html b/docs/d7/dec/structedash__packager_1_1media_1_1mp4_1_1MediaHeader.html index d53476b871..c5f6ab0c05 100644 --- a/docs/d7/dec/structedash__packager_1_1media_1_1mp4_1_1MediaHeader.html +++ b/docs/d7/dec/structedash__packager_1_1media_1_1mp4_1_1MediaHeader.html @@ -157,7 +157,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 452 of file box_definitions.h.

    +

    Definition at line 459 of file box_definitions.h.

    Member Function Documentation

    @@ -183,7 +183,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1547 of file box_definitions.cc.

    +

    Definition at line 1568 of file box_definitions.cc.

    @@ -194,7 +194,7 @@ Additional Inherited Members diff --git a/docs/d7/dee/mpd__generator_8cc_source.html b/docs/d7/dee/mpd__generator_8cc_source.html index b70d1a15cc..40f1e92adf 100644 --- a/docs/d7/dee/mpd__generator_8cc_source.html +++ b/docs/d7/dee/mpd__generator_8cc_source.html @@ -95,109 +95,111 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    6 
    7 #include "packager/app/mpd_generator_flags.h"
    8 #include "packager/app/vlog_flags.h"
    -
    9 #include "packager/base/command_line.h"
    -
    10 #include "packager/base/logging.h"
    -
    11 #include "packager/base/strings/string_split.h"
    -
    12 #include "packager/base/strings/stringprintf.h"
    -
    13 #include "packager/mpd/util/mpd_writer.h"
    -
    14 #include "packager/version/version.h"
    -
    15 
    -
    16 namespace edash_packager {
    -
    17 namespace {
    -
    18 const char kUsage[] =
    -
    19  "MPD generation driver program.\n"
    -
    20  "This program accepts MediaInfo files in human readable text "
    -
    21  "format and outputs an MPD.\n"
    -
    22  "The main use case for this is to output MPD for VOD.\n"
    -
    23  "Limitations:\n"
    -
    24  " Each MediaInfo can only have one of VideoInfo, AudioInfo, or TextInfo.\n"
    -
    25  " There will be at most 3 AdaptationSets in the MPD, i.e. 1 video, 1 "
    -
    26  "audio, and 1 text.\n"
    -
    27  "Sample Usage:\n"
    -
    28  "%s --input=\"video1.media_info,video2.media_info,audio1.media_info\" "
    -
    29  "--output=\"video_audio.mpd\"";
    -
    30 
    -
    31 enum ExitStatus {
    -
    32  kSuccess = 0,
    -
    33  kEmptyInputError,
    -
    34  kEmptyOutputError,
    -
    35  kFailedToWriteMpdToFileError
    -
    36 };
    -
    37 
    -
    38 ExitStatus CheckRequiredFlags() {
    -
    39  if (FLAGS_input.empty()) {
    -
    40  LOG(ERROR) << "--input is required.";
    -
    41  return kEmptyInputError;
    -
    42  }
    -
    43 
    -
    44  if (FLAGS_output.empty()) {
    -
    45  LOG(ERROR) << "--output is required.";
    -
    46  return kEmptyOutputError;
    -
    47  }
    -
    48 
    -
    49  return kSuccess;
    -
    50 }
    -
    51 
    -
    52 ExitStatus RunMpdGenerator() {
    -
    53  DCHECK_EQ(CheckRequiredFlags(), kSuccess);
    -
    54  std::vector<std::string> base_urls;
    -
    55  std::vector<std::string> input_files;
    -
    56  typedef std::vector<std::string>::const_iterator Iterator;
    -
    57 
    -
    58  base::SplitString(FLAGS_input, ',', &input_files);
    -
    59 
    -
    60  if (!FLAGS_base_urls.empty()) {
    -
    61  base::SplitString(FLAGS_base_urls, ',', &base_urls);
    -
    62  }
    -
    63 
    -
    64  edash_packager::MpdWriter mpd_writer;
    -
    65  for (Iterator it = base_urls.begin(); it != base_urls.end(); ++it)
    -
    66  mpd_writer.AddBaseUrl(*it);
    -
    67 
    -
    68  for (Iterator it = input_files.begin(); it != input_files.end(); ++it) {
    -
    69  if (!mpd_writer.AddFile(it->c_str(), FLAGS_output)) {
    -
    70  LOG(WARNING) << "MpdWriter failed to read " << *it << ", skipping.";
    -
    71  }
    -
    72  }
    -
    73 
    -
    74  if (!mpd_writer.WriteMpdToFile(FLAGS_output.c_str())) {
    -
    75  LOG(ERROR) << "Failed to write MPD to " << FLAGS_output;
    -
    76  return kFailedToWriteMpdToFileError;
    -
    77  }
    -
    78 
    -
    79  return kSuccess;
    -
    80 }
    -
    81 
    -
    82 int MpdMain(int argc, char** argv) {
    -
    83  // Needed to enable VLOG/DVLOG through --vmodule or --v.
    -
    84  base::CommandLine::Init(argc, argv);
    -
    85  CHECK(logging::InitLogging(logging::LoggingSettings()));
    -
    86 
    -
    87  google::SetUsageMessage(base::StringPrintf(kUsage, argv[0]));
    -
    88  google::ParseCommandLineFlags(&argc, &argv, true);
    -
    89 
    -
    90  ExitStatus status = CheckRequiredFlags();
    -
    91  if (status != kSuccess) {
    -
    92  std::string version_string =
    -
    93  base::StringPrintf("mpd_generator version %s", kPackagerVersion);
    -
    94  google::ShowUsageWithFlags(version_string.c_str());
    -
    95  return status;
    -
    96  }
    -
    97 
    -
    98  return RunMpdGenerator();
    -
    99 }
    -
    100 
    -
    101 } // namespace
    -
    102 } // namespace edash_packager
    -
    103 
    -
    104 int main(int argc, char** argv) {
    -
    105  return edash_packager::MpdMain(argc, argv);
    -
    106 }
    +
    9 #include "packager/base/at_exit.h"
    +
    10 #include "packager/base/command_line.h"
    +
    11 #include "packager/base/logging.h"
    +
    12 #include "packager/base/strings/string_split.h"
    +
    13 #include "packager/base/strings/stringprintf.h"
    +
    14 #include "packager/mpd/util/mpd_writer.h"
    +
    15 #include "packager/version/version.h"
    +
    16 
    +
    17 namespace edash_packager {
    +
    18 namespace {
    +
    19 const char kUsage[] =
    +
    20  "MPD generation driver program.\n"
    +
    21  "This program accepts MediaInfo files in human readable text "
    +
    22  "format and outputs an MPD.\n"
    +
    23  "The main use case for this is to output MPD for VOD.\n"
    +
    24  "Limitations:\n"
    +
    25  " Each MediaInfo can only have one of VideoInfo, AudioInfo, or TextInfo.\n"
    +
    26  " There will be at most 3 AdaptationSets in the MPD, i.e. 1 video, 1 "
    +
    27  "audio, and 1 text.\n"
    +
    28  "Sample Usage:\n"
    +
    29  "%s --input=\"video1.media_info,video2.media_info,audio1.media_info\" "
    +
    30  "--output=\"video_audio.mpd\"";
    +
    31 
    +
    32 enum ExitStatus {
    +
    33  kSuccess = 0,
    +
    34  kEmptyInputError,
    +
    35  kEmptyOutputError,
    +
    36  kFailedToWriteMpdToFileError
    +
    37 };
    +
    38 
    +
    39 ExitStatus CheckRequiredFlags() {
    +
    40  if (FLAGS_input.empty()) {
    +
    41  LOG(ERROR) << "--input is required.";
    +
    42  return kEmptyInputError;
    +
    43  }
    +
    44 
    +
    45  if (FLAGS_output.empty()) {
    +
    46  LOG(ERROR) << "--output is required.";
    +
    47  return kEmptyOutputError;
    +
    48  }
    +
    49 
    +
    50  return kSuccess;
    +
    51 }
    +
    52 
    +
    53 ExitStatus RunMpdGenerator() {
    +
    54  DCHECK_EQ(CheckRequiredFlags(), kSuccess);
    +
    55  std::vector<std::string> base_urls;
    +
    56  std::vector<std::string> input_files;
    +
    57  typedef std::vector<std::string>::const_iterator Iterator;
    +
    58 
    +
    59  base::SplitString(FLAGS_input, ',', &input_files);
    +
    60 
    +
    61  if (!FLAGS_base_urls.empty()) {
    +
    62  base::SplitString(FLAGS_base_urls, ',', &base_urls);
    +
    63  }
    +
    64 
    +
    65  edash_packager::MpdWriter mpd_writer;
    +
    66  for (Iterator it = base_urls.begin(); it != base_urls.end(); ++it)
    +
    67  mpd_writer.AddBaseUrl(*it);
    +
    68 
    +
    69  for (Iterator it = input_files.begin(); it != input_files.end(); ++it) {
    +
    70  if (!mpd_writer.AddFile(it->c_str(), FLAGS_output)) {
    +
    71  LOG(WARNING) << "MpdWriter failed to read " << *it << ", skipping.";
    +
    72  }
    +
    73  }
    +
    74 
    +
    75  if (!mpd_writer.WriteMpdToFile(FLAGS_output.c_str())) {
    +
    76  LOG(ERROR) << "Failed to write MPD to " << FLAGS_output;
    +
    77  return kFailedToWriteMpdToFileError;
    +
    78  }
    +
    79 
    +
    80  return kSuccess;
    +
    81 }
    +
    82 
    +
    83 int MpdMain(int argc, char** argv) {
    +
    84  base::AtExitManager exit;
    +
    85  // Needed to enable VLOG/DVLOG through --vmodule or --v.
    +
    86  base::CommandLine::Init(argc, argv);
    +
    87  CHECK(logging::InitLogging(logging::LoggingSettings()));
    +
    88 
    +
    89  google::SetUsageMessage(base::StringPrintf(kUsage, argv[0]));
    +
    90  google::ParseCommandLineFlags(&argc, &argv, true);
    +
    91 
    +
    92  ExitStatus status = CheckRequiredFlags();
    +
    93  if (status != kSuccess) {
    +
    94  std::string version_string =
    +
    95  base::StringPrintf("mpd_generator version %s", kPackagerVersion);
    +
    96  google::ShowUsageWithFlags(version_string.c_str());
    +
    97  return status;
    +
    98  }
    +
    99 
    +
    100  return RunMpdGenerator();
    +
    101 }
    +
    102 
    +
    103 } // namespace
    +
    104 } // namespace edash_packager
    +
    105 
    +
    106 int main(int argc, char** argv) {
    +
    107  return edash_packager::MpdMain(argc, argv);
    +
    108 }
    diff --git a/docs/d7/def/mp4__media__parser_8cc_source.html b/docs/d7/def/mp4__media__parser_8cc_source.html index af2689c91d..6016579540 100644 --- a/docs/d7/def/mp4__media__parser_8cc_source.html +++ b/docs/d7/def/mp4__media__parser_8cc_source.html @@ -163,8 +163,8 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    74  return kCodecDTSP;
    75  case FOURCC_DTSM:
    76  return kCodecDTSM;
    -
    77  case FOURCC_EAC3:
    -
    78  return kCodecEAC3;
    +
    77  case FOURCC_AC3:
    +
    78  return kCodecAC3;
    79  default:
    80  return kUnknownAudioCodec;
    81  }
    @@ -499,372 +499,373 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    410  num_channels = entry.channelcount;
    411  sampling_frequency = entry.samplerate;
    412  break;
    -
    413  case FOURCC_EAC3:
    -
    414  num_channels = entry.channelcount;
    -
    415  sampling_frequency = entry.samplerate;
    -
    416  break;
    -
    417  default:
    -
    418  LOG(ERROR) << "Unsupported audio format 0x" << std::hex
    -
    419  << actual_format << " in stsd box.";
    -
    420  return false;
    -
    421  }
    -
    422 
    -
    423  bool is_encrypted = entry.sinf.info.track_encryption.is_encrypted;
    -
    424  DVLOG(1) << "is_audio_track_encrypted_: " << is_encrypted;
    -
    425  streams.push_back(new AudioStreamInfo(
    -
    426  track->header.track_id,
    -
    427  timescale,
    -
    428  duration,
    -
    429  codec,
    -
    430  AudioStreamInfo::GetCodecString(codec, audio_object_type),
    -
    431  track->media.header.language.code,
    -
    432  entry.samplesize,
    -
    433  num_channels,
    -
    434  sampling_frequency,
    -
    435  max_bitrate,
    -
    436  avg_bitrate,
    -
    437  vector_as_array(&extra_data),
    -
    438  extra_data.size(),
    -
    439  is_encrypted));
    -
    440  }
    -
    441 
    -
    442  if (samp_descr.type == kVideo) {
    -
    443  RCHECK(!samp_descr.video_entries.empty());
    -
    444  if (desc_idx >= samp_descr.video_entries.size())
    -
    445  desc_idx = 0;
    -
    446  const VideoSampleEntry& entry = samp_descr.video_entries[desc_idx];
    -
    447 
    -
    448  uint32_t coded_width = entry.width;
    -
    449  uint32_t coded_height = entry.height;
    -
    450  uint32_t pixel_width = entry.pixel_aspect.h_spacing;
    -
    451  uint32_t pixel_height = entry.pixel_aspect.v_spacing;
    -
    452  if (pixel_width == 0 && pixel_height == 0) {
    -
    453  pixel_width = 1;
    -
    454  pixel_height = 1;
    -
    455  }
    -
    456  std::string codec_string;
    -
    457  uint8_t nalu_length_size = 0;
    -
    458 
    -
    459  const FourCC actual_format = entry.GetActualFormat();
    -
    460  const VideoCodec video_codec = FourCCToVideoCodec(actual_format);
    -
    461  switch (actual_format) {
    -
    462  case FOURCC_AVC1: {
    -
    463  AVCDecoderConfiguration avc_config;
    -
    464  if (!avc_config.Parse(entry.codec_config_record.data)) {
    -
    465  LOG(ERROR) << "Failed to parse avcc.";
    -
    466  return false;
    -
    467  }
    -
    468  codec_string = avc_config.GetCodecString();
    -
    469  nalu_length_size = avc_config.length_size();
    -
    470 
    -
    471  if (coded_width != avc_config.coded_width() ||
    -
    472  coded_height != avc_config.coded_height()) {
    -
    473  LOG(WARNING) << "Resolution in VisualSampleEntry (" << coded_width
    -
    474  << "," << coded_height
    -
    475  << ") does not match with resolution in "
    -
    476  "AVCDecoderConfigurationRecord ("
    -
    477  << avc_config.coded_width() << ","
    -
    478  << avc_config.coded_height()
    -
    479  << "). Use AVCDecoderConfigurationRecord.";
    -
    480  coded_width = avc_config.coded_width();
    -
    481  coded_height = avc_config.coded_height();
    -
    482  }
    -
    483 
    -
    484  if (pixel_width != avc_config.pixel_width() ||
    -
    485  pixel_height != avc_config.pixel_height()) {
    -
    486  LOG_IF(WARNING, pixel_width != 1 || pixel_height != 1)
    -
    487  << "Pixel aspect ratio in PASP box (" << pixel_width << ","
    -
    488  << pixel_height
    -
    489  << ") does not match with SAR in AVCDecoderConfigurationRecord "
    -
    490  "("
    -
    491  << avc_config.pixel_width() << "," << avc_config.pixel_height()
    -
    492  << "). Use AVCDecoderConfigurationRecord.";
    -
    493  pixel_width = avc_config.pixel_width();
    -
    494  pixel_height = avc_config.pixel_height();
    -
    495  }
    -
    496  break;
    -
    497  }
    -
    498  case FOURCC_HEV1:
    -
    499  case FOURCC_HVC1: {
    -
    500  HEVCDecoderConfiguration hevc_config;
    -
    501  if (!hevc_config.Parse(entry.codec_config_record.data)) {
    -
    502  LOG(ERROR) << "Failed to parse hevc.";
    -
    503  return false;
    -
    504  }
    -
    505  codec_string = hevc_config.GetCodecString(video_codec);
    -
    506  nalu_length_size = hevc_config.length_size();
    -
    507  break;
    -
    508  }
    -
    509  case FOURCC_VP08:
    -
    510  case FOURCC_VP09:
    -
    511  case FOURCC_VP10: {
    -
    512  VPCodecConfiguration vp_config;
    -
    513  if (!vp_config.Parse(entry.codec_config_record.data)) {
    -
    514  LOG(ERROR) << "Failed to parse vpcc.";
    -
    515  return false;
    -
    516  }
    -
    517  codec_string = vp_config.GetCodecString(video_codec);
    -
    518  break;
    -
    519  }
    -
    520  default:
    -
    521  LOG(ERROR) << "Unsupported video format "
    -
    522  << FourCCToString(actual_format) << " in stsd box.";
    -
    523  return false;
    -
    524  }
    -
    525 
    -
    526  bool is_encrypted = entry.sinf.info.track_encryption.is_encrypted;
    -
    527  DVLOG(1) << "is_video_track_encrypted_: " << is_encrypted;
    -
    528  streams.push_back(new VideoStreamInfo(
    -
    529  track->header.track_id, timescale, duration, video_codec,
    -
    530  codec_string, track->media.header.language.code, coded_width,
    -
    531  coded_height, pixel_width, pixel_height,
    -
    532  0, // trick_play_rate
    -
    533  nalu_length_size, vector_as_array(&entry.codec_config_record.data),
    -
    534  entry.codec_config_record.data.size(), is_encrypted));
    -
    535  }
    -
    536  }
    -
    537 
    -
    538  init_cb_.Run(streams);
    -
    539  if (!FetchKeysIfNecessary(moov_->pssh))
    -
    540  return false;
    -
    541  runs_.reset(new TrackRunIterator(moov_.get()));
    -
    542  RCHECK(runs_->Init());
    -
    543  ChangeState(kEmittingSamples);
    -
    544  return true;
    -
    545 }
    -
    546 
    -
    547 bool MP4MediaParser::ParseMoof(BoxReader* reader) {
    -
    548  // Must already have initialization segment.
    -
    549  RCHECK(moov_.get());
    -
    550  MovieFragment moof;
    -
    551  RCHECK(moof.Parse(reader));
    -
    552  if (!runs_)
    -
    553  runs_.reset(new TrackRunIterator(moov_.get()));
    -
    554  RCHECK(runs_->Init(moof));
    -
    555  if (!FetchKeysIfNecessary(moof.pssh))
    -
    556  return false;
    -
    557  ChangeState(kEmittingSamples);
    -
    558  return true;
    -
    559 }
    -
    560 
    -
    561 bool MP4MediaParser::FetchKeysIfNecessary(
    -
    562  const std::vector<ProtectionSystemSpecificHeader>& headers) {
    -
    563  if (headers.empty())
    -
    564  return true;
    -
    565 
    -
    566  // An error will be returned later if the samples need to be decrypted.
    -
    567  if (!decryption_key_source_)
    -
    568  return true;
    -
    569 
    -
    570  // TODO(tinskip): Pass in raw 'pssh' boxes to FetchKeys. This will allow
    -
    571  // supporting multiple keysystems. Move this to KeySource.
    -
    572  std::vector<uint8_t> widevine_system_id;
    -
    573  base::HexStringToBytes(kWidevineKeySystemId, &widevine_system_id);
    -
    574  for (std::vector<ProtectionSystemSpecificHeader>::const_iterator iter =
    -
    575  headers.begin(); iter != headers.end(); ++iter) {
    -
    576  if (iter->system_id == widevine_system_id) {
    -
    577  Status status = decryption_key_source_->FetchKeys(iter->data);
    -
    578  if (!status.ok()) {
    -
    579  LOG(ERROR) << "Error fetching decryption keys: " << status;
    -
    580  return false;
    -
    581  }
    -
    582  return true;
    -
    583  }
    -
    584  }
    -
    585 
    -
    586  LOG(ERROR) << "No viable 'pssh' box found for content decryption.";
    -
    587  return false;
    -
    588 }
    -
    589 
    -
    590 bool MP4MediaParser::EnqueueSample(bool* err) {
    -
    591  if (!runs_->IsRunValid()) {
    -
    592  // Remain in kEnqueueingSamples state, discarding data, until the end of
    -
    593  // the current 'mdat' box has been appended to the queue.
    -
    594  if (!queue_.Trim(mdat_tail_))
    -
    595  return false;
    -
    596 
    -
    597  ChangeState(kParsingBoxes);
    -
    598  return true;
    -
    599  }
    -
    600 
    -
    601  if (!runs_->IsSampleValid()) {
    -
    602  runs_->AdvanceRun();
    -
    603  return true;
    -
    604  }
    -
    605 
    -
    606  DCHECK(!(*err));
    -
    607 
    -
    608  const uint8_t* buf;
    -
    609  int buf_size;
    -
    610  queue_.Peek(&buf, &buf_size);
    -
    611  if (!buf_size)
    -
    612  return false;
    -
    613 
    -
    614  // Skip this entire track if it is not audio nor video.
    -
    615  if (!runs_->is_audio() && !runs_->is_video())
    -
    616  runs_->AdvanceRun();
    -
    617 
    -
    618  // Attempt to cache the auxiliary information first. Aux info is usually
    -
    619  // placed in a contiguous block before the sample data, rather than being
    -
    620  // interleaved. If we didn't cache it, this would require that we retain the
    -
    621  // start of the segment buffer while reading samples. Aux info is typically
    -
    622  // quite small compared to sample data, so this pattern is useful on
    -
    623  // memory-constrained devices where the source buffer consumes a substantial
    -
    624  // portion of the total system memory.
    -
    625  if (runs_->AuxInfoNeedsToBeCached()) {
    -
    626  queue_.PeekAt(runs_->aux_info_offset() + moof_head_, &buf, &buf_size);
    -
    627  if (buf_size < runs_->aux_info_size())
    -
    628  return false;
    -
    629  *err = !runs_->CacheAuxInfo(buf, buf_size);
    -
    630  return !*err;
    -
    631  }
    -
    632 
    -
    633  int64_t sample_offset = runs_->sample_offset() + moof_head_;
    -
    634  queue_.PeekAt(sample_offset, &buf, &buf_size);
    -
    635  if (buf_size < runs_->sample_size()) {
    -
    636  if (sample_offset < queue_.head()) {
    -
    637  LOG(ERROR) << "Incorrect sample offset " << sample_offset
    -
    638  << " < " << queue_.head();
    -
    639  *err = true;
    -
    640  }
    -
    641  return false;
    -
    642  }
    -
    643 
    -
    644  scoped_refptr<MediaSample> stream_sample(MediaSample::CopyFrom(
    -
    645  buf, runs_->sample_size(), runs_->is_keyframe()));
    -
    646  if (runs_->is_encrypted()) {
    -
    647  scoped_ptr<DecryptConfig> decrypt_config = runs_->GetDecryptConfig();
    -
    648  if (!decrypt_config ||
    -
    649  !DecryptSampleBuffer(decrypt_config.get(),
    -
    650  stream_sample->writable_data(),
    -
    651  stream_sample->data_size())) {
    -
    652  *err = true;
    -
    653  LOG(ERROR) << "Cannot decrypt samples.";
    -
    654  return false;
    -
    655  }
    -
    656  }
    -
    657 
    -
    658  stream_sample->set_dts(runs_->dts());
    -
    659  stream_sample->set_pts(runs_->cts());
    -
    660  stream_sample->set_duration(runs_->duration());
    -
    661 
    -
    662  DVLOG(3) << "Pushing frame: "
    -
    663  << ", key=" << runs_->is_keyframe()
    -
    664  << ", dur=" << runs_->duration()
    -
    665  << ", dts=" << runs_->dts()
    -
    666  << ", cts=" << runs_->cts()
    -
    667  << ", size=" << runs_->sample_size();
    -
    668 
    -
    669  if (!new_sample_cb_.Run(runs_->track_id(), stream_sample)) {
    -
    670  *err = true;
    -
    671  LOG(ERROR) << "Failed to process the sample.";
    -
    672  return false;
    -
    673  }
    -
    674 
    -
    675  runs_->AdvanceSample();
    -
    676  return true;
    -
    677 }
    -
    678 
    -
    679 bool MP4MediaParser::DecryptSampleBuffer(const DecryptConfig* decrypt_config,
    -
    680  uint8_t* buffer,
    -
    681  size_t buffer_size) {
    -
    682  DCHECK(decrypt_config);
    -
    683  DCHECK(buffer);
    -
    684 
    -
    685  if (!decryption_key_source_) {
    -
    686  LOG(ERROR) << "Encrypted media sample encountered, but decryption is not "
    -
    687  "enabled";
    -
    688  return false;
    -
    689  }
    -
    690 
    -
    691  // Get the encryptor object.
    -
    692  AesCtrEncryptor* encryptor;
    -
    693  DecryptorMap::iterator found = decryptor_map_.find(decrypt_config->key_id());
    -
    694  if (found == decryptor_map_.end()) {
    -
    695  // Create new AesCtrEncryptor
    -
    696  EncryptionKey key;
    -
    697  Status status(decryption_key_source_->GetKey(decrypt_config->key_id(),
    -
    698  &key));
    -
    699  if (!status.ok()) {
    -
    700  LOG(ERROR) << "Error retrieving decryption key: " << status;
    -
    701  return false;
    -
    702  }
    -
    703  scoped_ptr<AesCtrEncryptor> new_encryptor(new AesCtrEncryptor);
    -
    704  if (!new_encryptor->InitializeWithIv(key.key, decrypt_config->iv())) {
    -
    705  LOG(ERROR) << "Failed to initialize AesCtrEncryptor for decryption.";
    -
    706  return false;
    -
    707  }
    -
    708  encryptor = new_encryptor.release();
    -
    709  decryptor_map_[decrypt_config->key_id()] = encryptor;
    -
    710  } else {
    -
    711  encryptor = found->second;
    -
    712  }
    -
    713  if (!encryptor->SetIv(decrypt_config->iv())) {
    -
    714  LOG(ERROR) << "Invalid initialization vector.";
    -
    715  return false;
    -
    716  }
    -
    717 
    -
    718  if (decrypt_config->subsamples().empty()) {
    -
    719  // Sample not encrypted using subsample encryption. Decrypt whole.
    -
    720  if (!encryptor->Decrypt(buffer, buffer_size, buffer)) {
    -
    721  LOG(ERROR) << "Error during bulk sample decryption.";
    -
    722  return false;
    -
    723  }
    -
    724  return true;
    -
    725  }
    -
    726 
    -
    727  // Subsample decryption.
    -
    728  const std::vector<SubsampleEntry>& subsamples = decrypt_config->subsamples();
    -
    729  uint8_t* current_ptr = buffer;
    -
    730  const uint8_t* buffer_end = buffer + buffer_size;
    -
    731  current_ptr += decrypt_config->data_offset();
    -
    732  if (current_ptr > buffer_end) {
    -
    733  LOG(ERROR) << "Subsample data_offset too large.";
    -
    734  return false;
    -
    735  }
    -
    736  for (std::vector<SubsampleEntry>::const_iterator iter = subsamples.begin();
    -
    737  iter != subsamples.end();
    -
    738  ++iter) {
    -
    739  if ((current_ptr + iter->clear_bytes + iter->cipher_bytes) > buffer_end) {
    -
    740  LOG(ERROR) << "Subsamples overflow sample buffer.";
    -
    741  return false;
    -
    742  }
    -
    743  current_ptr += iter->clear_bytes;
    -
    744  if (!encryptor->Decrypt(current_ptr, iter->cipher_bytes, current_ptr)) {
    -
    745  LOG(ERROR) << "Error decrypting subsample buffer.";
    -
    746  return false;
    -
    747  }
    -
    748  current_ptr += iter->cipher_bytes;
    -
    749  }
    -
    750  return true;
    -
    751 }
    -
    752 
    -
    753 bool MP4MediaParser::ReadAndDiscardMDATsUntil(const int64_t offset) {
    -
    754  bool err = false;
    -
    755  while (mdat_tail_ < offset) {
    -
    756  const uint8_t* buf;
    -
    757  int size;
    -
    758  queue_.PeekAt(mdat_tail_, &buf, &size);
    -
    759 
    -
    760  FourCC type;
    -
    761  uint64_t box_sz;
    -
    762  if (!BoxReader::StartTopLevelBox(buf, size, &type, &box_sz, &err))
    -
    763  break;
    -
    764 
    -
    765  mdat_tail_ += box_sz;
    -
    766  }
    -
    767  queue_.Trim(std::min(mdat_tail_, offset));
    -
    768  return !err;
    -
    769 }
    -
    770 
    -
    771 void MP4MediaParser::ChangeState(State new_state) {
    -
    772  DVLOG(2) << "Changing state: " << new_state;
    -
    773  state_ = new_state;
    -
    774 }
    -
    775 
    -
    776 } // namespace mp4
    -
    777 } // namespace media
    -
    778 } // namespace edash_packager
    +
    413  case FOURCC_AC3:
    +
    414  extra_data = entry.dac3.data;
    +
    415  num_channels = entry.channelcount;
    +
    416  sampling_frequency = entry.samplerate;
    +
    417  break;
    +
    418  default:
    +
    419  LOG(ERROR) << "Unsupported audio format 0x" << std::hex
    +
    420  << actual_format << " in stsd box.";
    +
    421  return false;
    +
    422  }
    +
    423 
    +
    424  bool is_encrypted = entry.sinf.info.track_encryption.is_encrypted;
    +
    425  DVLOG(1) << "is_audio_track_encrypted_: " << is_encrypted;
    +
    426  streams.push_back(new AudioStreamInfo(
    +
    427  track->header.track_id,
    +
    428  timescale,
    +
    429  duration,
    +
    430  codec,
    +
    431  AudioStreamInfo::GetCodecString(codec, audio_object_type),
    +
    432  track->media.header.language.code,
    +
    433  entry.samplesize,
    +
    434  num_channels,
    +
    435  sampling_frequency,
    +
    436  max_bitrate,
    +
    437  avg_bitrate,
    +
    438  vector_as_array(&extra_data),
    +
    439  extra_data.size(),
    +
    440  is_encrypted));
    +
    441  }
    +
    442 
    +
    443  if (samp_descr.type == kVideo) {
    +
    444  RCHECK(!samp_descr.video_entries.empty());
    +
    445  if (desc_idx >= samp_descr.video_entries.size())
    +
    446  desc_idx = 0;
    +
    447  const VideoSampleEntry& entry = samp_descr.video_entries[desc_idx];
    +
    448 
    +
    449  uint32_t coded_width = entry.width;
    +
    450  uint32_t coded_height = entry.height;
    +
    451  uint32_t pixel_width = entry.pixel_aspect.h_spacing;
    +
    452  uint32_t pixel_height = entry.pixel_aspect.v_spacing;
    +
    453  if (pixel_width == 0 && pixel_height == 0) {
    +
    454  pixel_width = 1;
    +
    455  pixel_height = 1;
    +
    456  }
    +
    457  std::string codec_string;
    +
    458  uint8_t nalu_length_size = 0;
    +
    459 
    +
    460  const FourCC actual_format = entry.GetActualFormat();
    +
    461  const VideoCodec video_codec = FourCCToVideoCodec(actual_format);
    +
    462  switch (actual_format) {
    +
    463  case FOURCC_AVC1: {
    +
    464  AVCDecoderConfiguration avc_config;
    +
    465  if (!avc_config.Parse(entry.codec_config_record.data)) {
    +
    466  LOG(ERROR) << "Failed to parse avcc.";
    +
    467  return false;
    +
    468  }
    +
    469  codec_string = avc_config.GetCodecString();
    +
    470  nalu_length_size = avc_config.length_size();
    +
    471 
    +
    472  if (coded_width != avc_config.coded_width() ||
    +
    473  coded_height != avc_config.coded_height()) {
    +
    474  LOG(WARNING) << "Resolution in VisualSampleEntry (" << coded_width
    +
    475  << "," << coded_height
    +
    476  << ") does not match with resolution in "
    +
    477  "AVCDecoderConfigurationRecord ("
    +
    478  << avc_config.coded_width() << ","
    +
    479  << avc_config.coded_height()
    +
    480  << "). Use AVCDecoderConfigurationRecord.";
    +
    481  coded_width = avc_config.coded_width();
    +
    482  coded_height = avc_config.coded_height();
    +
    483  }
    +
    484 
    +
    485  if (pixel_width != avc_config.pixel_width() ||
    +
    486  pixel_height != avc_config.pixel_height()) {
    +
    487  LOG_IF(WARNING, pixel_width != 1 || pixel_height != 1)
    +
    488  << "Pixel aspect ratio in PASP box (" << pixel_width << ","
    +
    489  << pixel_height
    +
    490  << ") does not match with SAR in AVCDecoderConfigurationRecord "
    +
    491  "("
    +
    492  << avc_config.pixel_width() << "," << avc_config.pixel_height()
    +
    493  << "). Use AVCDecoderConfigurationRecord.";
    +
    494  pixel_width = avc_config.pixel_width();
    +
    495  pixel_height = avc_config.pixel_height();
    +
    496  }
    +
    497  break;
    +
    498  }
    +
    499  case FOURCC_HEV1:
    +
    500  case FOURCC_HVC1: {
    +
    501  HEVCDecoderConfiguration hevc_config;
    +
    502  if (!hevc_config.Parse(entry.codec_config_record.data)) {
    +
    503  LOG(ERROR) << "Failed to parse hevc.";
    +
    504  return false;
    +
    505  }
    +
    506  codec_string = hevc_config.GetCodecString(video_codec);
    +
    507  nalu_length_size = hevc_config.length_size();
    +
    508  break;
    +
    509  }
    +
    510  case FOURCC_VP08:
    +
    511  case FOURCC_VP09:
    +
    512  case FOURCC_VP10: {
    +
    513  VPCodecConfiguration vp_config;
    +
    514  if (!vp_config.Parse(entry.codec_config_record.data)) {
    +
    515  LOG(ERROR) << "Failed to parse vpcc.";
    +
    516  return false;
    +
    517  }
    +
    518  codec_string = vp_config.GetCodecString(video_codec);
    +
    519  break;
    +
    520  }
    +
    521  default:
    +
    522  LOG(ERROR) << "Unsupported video format "
    +
    523  << FourCCToString(actual_format) << " in stsd box.";
    +
    524  return false;
    +
    525  }
    +
    526 
    +
    527  bool is_encrypted = entry.sinf.info.track_encryption.is_encrypted;
    +
    528  DVLOG(1) << "is_video_track_encrypted_: " << is_encrypted;
    +
    529  streams.push_back(new VideoStreamInfo(
    +
    530  track->header.track_id, timescale, duration, video_codec,
    +
    531  codec_string, track->media.header.language.code, coded_width,
    +
    532  coded_height, pixel_width, pixel_height,
    +
    533  0, // trick_play_rate
    +
    534  nalu_length_size, vector_as_array(&entry.codec_config_record.data),
    +
    535  entry.codec_config_record.data.size(), is_encrypted));
    +
    536  }
    +
    537  }
    +
    538 
    +
    539  init_cb_.Run(streams);
    +
    540  if (!FetchKeysIfNecessary(moov_->pssh))
    +
    541  return false;
    +
    542  runs_.reset(new TrackRunIterator(moov_.get()));
    +
    543  RCHECK(runs_->Init());
    +
    544  ChangeState(kEmittingSamples);
    +
    545  return true;
    +
    546 }
    +
    547 
    +
    548 bool MP4MediaParser::ParseMoof(BoxReader* reader) {
    +
    549  // Must already have initialization segment.
    +
    550  RCHECK(moov_.get());
    +
    551  MovieFragment moof;
    +
    552  RCHECK(moof.Parse(reader));
    +
    553  if (!runs_)
    +
    554  runs_.reset(new TrackRunIterator(moov_.get()));
    +
    555  RCHECK(runs_->Init(moof));
    +
    556  if (!FetchKeysIfNecessary(moof.pssh))
    +
    557  return false;
    +
    558  ChangeState(kEmittingSamples);
    +
    559  return true;
    +
    560 }
    +
    561 
    +
    562 bool MP4MediaParser::FetchKeysIfNecessary(
    +
    563  const std::vector<ProtectionSystemSpecificHeader>& headers) {
    +
    564  if (headers.empty())
    +
    565  return true;
    +
    566 
    +
    567  // An error will be returned later if the samples need to be decrypted.
    +
    568  if (!decryption_key_source_)
    +
    569  return true;
    +
    570 
    +
    571  // TODO(tinskip): Pass in raw 'pssh' boxes to FetchKeys. This will allow
    +
    572  // supporting multiple keysystems. Move this to KeySource.
    +
    573  std::vector<uint8_t> widevine_system_id;
    +
    574  base::HexStringToBytes(kWidevineKeySystemId, &widevine_system_id);
    +
    575  for (std::vector<ProtectionSystemSpecificHeader>::const_iterator iter =
    +
    576  headers.begin(); iter != headers.end(); ++iter) {
    +
    577  if (iter->system_id == widevine_system_id) {
    +
    578  Status status = decryption_key_source_->FetchKeys(iter->data);
    +
    579  if (!status.ok()) {
    +
    580  LOG(ERROR) << "Error fetching decryption keys: " << status;
    +
    581  return false;
    +
    582  }
    +
    583  return true;
    +
    584  }
    +
    585  }
    +
    586 
    +
    587  LOG(ERROR) << "No viable 'pssh' box found for content decryption.";
    +
    588  return false;
    +
    589 }
    +
    590 
    +
    591 bool MP4MediaParser::EnqueueSample(bool* err) {
    +
    592  if (!runs_->IsRunValid()) {
    +
    593  // Remain in kEnqueueingSamples state, discarding data, until the end of
    +
    594  // the current 'mdat' box has been appended to the queue.
    +
    595  if (!queue_.Trim(mdat_tail_))
    +
    596  return false;
    +
    597 
    +
    598  ChangeState(kParsingBoxes);
    +
    599  return true;
    +
    600  }
    +
    601 
    +
    602  if (!runs_->IsSampleValid()) {
    +
    603  runs_->AdvanceRun();
    +
    604  return true;
    +
    605  }
    +
    606 
    +
    607  DCHECK(!(*err));
    +
    608 
    +
    609  const uint8_t* buf;
    +
    610  int buf_size;
    +
    611  queue_.Peek(&buf, &buf_size);
    +
    612  if (!buf_size)
    +
    613  return false;
    +
    614 
    +
    615  // Skip this entire track if it is not audio nor video.
    +
    616  if (!runs_->is_audio() && !runs_->is_video())
    +
    617  runs_->AdvanceRun();
    +
    618 
    +
    619  // Attempt to cache the auxiliary information first. Aux info is usually
    +
    620  // placed in a contiguous block before the sample data, rather than being
    +
    621  // interleaved. If we didn't cache it, this would require that we retain the
    +
    622  // start of the segment buffer while reading samples. Aux info is typically
    +
    623  // quite small compared to sample data, so this pattern is useful on
    +
    624  // memory-constrained devices where the source buffer consumes a substantial
    +
    625  // portion of the total system memory.
    +
    626  if (runs_->AuxInfoNeedsToBeCached()) {
    +
    627  queue_.PeekAt(runs_->aux_info_offset() + moof_head_, &buf, &buf_size);
    +
    628  if (buf_size < runs_->aux_info_size())
    +
    629  return false;
    +
    630  *err = !runs_->CacheAuxInfo(buf, buf_size);
    +
    631  return !*err;
    +
    632  }
    +
    633 
    +
    634  int64_t sample_offset = runs_->sample_offset() + moof_head_;
    +
    635  queue_.PeekAt(sample_offset, &buf, &buf_size);
    +
    636  if (buf_size < runs_->sample_size()) {
    +
    637  if (sample_offset < queue_.head()) {
    +
    638  LOG(ERROR) << "Incorrect sample offset " << sample_offset
    +
    639  << " < " << queue_.head();
    +
    640  *err = true;
    +
    641  }
    +
    642  return false;
    +
    643  }
    +
    644 
    +
    645  scoped_refptr<MediaSample> stream_sample(MediaSample::CopyFrom(
    +
    646  buf, runs_->sample_size(), runs_->is_keyframe()));
    +
    647  if (runs_->is_encrypted()) {
    +
    648  scoped_ptr<DecryptConfig> decrypt_config = runs_->GetDecryptConfig();
    +
    649  if (!decrypt_config ||
    +
    650  !DecryptSampleBuffer(decrypt_config.get(),
    +
    651  stream_sample->writable_data(),
    +
    652  stream_sample->data_size())) {
    +
    653  *err = true;
    +
    654  LOG(ERROR) << "Cannot decrypt samples.";
    +
    655  return false;
    +
    656  }
    +
    657  }
    +
    658 
    +
    659  stream_sample->set_dts(runs_->dts());
    +
    660  stream_sample->set_pts(runs_->cts());
    +
    661  stream_sample->set_duration(runs_->duration());
    +
    662 
    +
    663  DVLOG(3) << "Pushing frame: "
    +
    664  << ", key=" << runs_->is_keyframe()
    +
    665  << ", dur=" << runs_->duration()
    +
    666  << ", dts=" << runs_->dts()
    +
    667  << ", cts=" << runs_->cts()
    +
    668  << ", size=" << runs_->sample_size();
    +
    669 
    +
    670  if (!new_sample_cb_.Run(runs_->track_id(), stream_sample)) {
    +
    671  *err = true;
    +
    672  LOG(ERROR) << "Failed to process the sample.";
    +
    673  return false;
    +
    674  }
    +
    675 
    +
    676  runs_->AdvanceSample();
    +
    677  return true;
    +
    678 }
    +
    679 
    +
    680 bool MP4MediaParser::DecryptSampleBuffer(const DecryptConfig* decrypt_config,
    +
    681  uint8_t* buffer,
    +
    682  size_t buffer_size) {
    +
    683  DCHECK(decrypt_config);
    +
    684  DCHECK(buffer);
    +
    685 
    +
    686  if (!decryption_key_source_) {
    +
    687  LOG(ERROR) << "Encrypted media sample encountered, but decryption is not "
    +
    688  "enabled";
    +
    689  return false;
    +
    690  }
    +
    691 
    +
    692  // Get the encryptor object.
    +
    693  AesCtrEncryptor* encryptor;
    +
    694  DecryptorMap::iterator found = decryptor_map_.find(decrypt_config->key_id());
    +
    695  if (found == decryptor_map_.end()) {
    +
    696  // Create new AesCtrEncryptor
    +
    697  EncryptionKey key;
    +
    698  Status status(decryption_key_source_->GetKey(decrypt_config->key_id(),
    +
    699  &key));
    +
    700  if (!status.ok()) {
    +
    701  LOG(ERROR) << "Error retrieving decryption key: " << status;
    +
    702  return false;
    +
    703  }
    +
    704  scoped_ptr<AesCtrEncryptor> new_encryptor(new AesCtrEncryptor);
    +
    705  if (!new_encryptor->InitializeWithIv(key.key, decrypt_config->iv())) {
    +
    706  LOG(ERROR) << "Failed to initialize AesCtrEncryptor for decryption.";
    +
    707  return false;
    +
    708  }
    +
    709  encryptor = new_encryptor.release();
    +
    710  decryptor_map_[decrypt_config->key_id()] = encryptor;
    +
    711  } else {
    +
    712  encryptor = found->second;
    +
    713  }
    +
    714  if (!encryptor->SetIv(decrypt_config->iv())) {
    +
    715  LOG(ERROR) << "Invalid initialization vector.";
    +
    716  return false;
    +
    717  }
    +
    718 
    +
    719  if (decrypt_config->subsamples().empty()) {
    +
    720  // Sample not encrypted using subsample encryption. Decrypt whole.
    +
    721  if (!encryptor->Decrypt(buffer, buffer_size, buffer)) {
    +
    722  LOG(ERROR) << "Error during bulk sample decryption.";
    +
    723  return false;
    +
    724  }
    +
    725  return true;
    +
    726  }
    +
    727 
    +
    728  // Subsample decryption.
    +
    729  const std::vector<SubsampleEntry>& subsamples = decrypt_config->subsamples();
    +
    730  uint8_t* current_ptr = buffer;
    +
    731  const uint8_t* buffer_end = buffer + buffer_size;
    +
    732  current_ptr += decrypt_config->data_offset();
    +
    733  if (current_ptr > buffer_end) {
    +
    734  LOG(ERROR) << "Subsample data_offset too large.";
    +
    735  return false;
    +
    736  }
    +
    737  for (std::vector<SubsampleEntry>::const_iterator iter = subsamples.begin();
    +
    738  iter != subsamples.end();
    +
    739  ++iter) {
    +
    740  if ((current_ptr + iter->clear_bytes + iter->cipher_bytes) > buffer_end) {
    +
    741  LOG(ERROR) << "Subsamples overflow sample buffer.";
    +
    742  return false;
    +
    743  }
    +
    744  current_ptr += iter->clear_bytes;
    +
    745  if (!encryptor->Decrypt(current_ptr, iter->cipher_bytes, current_ptr)) {
    +
    746  LOG(ERROR) << "Error decrypting subsample buffer.";
    +
    747  return false;
    +
    748  }
    +
    749  current_ptr += iter->cipher_bytes;
    +
    750  }
    +
    751  return true;
    +
    752 }
    +
    753 
    +
    754 bool MP4MediaParser::ReadAndDiscardMDATsUntil(const int64_t offset) {
    +
    755  bool err = false;
    +
    756  while (mdat_tail_ < offset) {
    +
    757  const uint8_t* buf;
    +
    758  int size;
    +
    759  queue_.PeekAt(mdat_tail_, &buf, &size);
    +
    760 
    +
    761  FourCC type;
    +
    762  uint64_t box_sz;
    +
    763  if (!BoxReader::StartTopLevelBox(buf, size, &type, &box_sz, &err))
    +
    764  break;
    +
    765 
    +
    766  mdat_tail_ += box_sz;
    +
    767  }
    +
    768  queue_.Trim(std::min(mdat_tail_, offset));
    +
    769  return !err;
    +
    770 }
    +
    771 
    +
    772 void MP4MediaParser::ChangeState(State new_state) {
    +
    773  DVLOG(2) << "Changing state: " << new_state;
    +
    774  state_ = new_state;
    +
    775 }
    +
    776 
    +
    777 } // namespace mp4
    +
    778 } // namespace media
    +
    779 } // namespace edash_packager
    static BoxReader * ReadTopLevelBox(const uint8_t *buf, const size_t buf_size, bool *err)
    Definition: box_reader.cc:37
    virtual Status GetKey(TrackType track_type, EncryptionKey *key)
    Definition: key_source.cc:46
    @@ -879,11 +880,11 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    void Init(const InitCB &init_cb, const NewSampleCB &new_sample_cb, KeySource *decryption_key_source) override
    static File * OpenWithNoBuffering(const char *file_name, const char *mode)
    Definition: file.cc:151
    -
    static std::string GetCodecString(AudioCodec codec, uint8_t audio_object_type)
    +
    static std::string GetCodecString(AudioCodec codec, uint8_t audio_object_type)
    diff --git a/docs/d7/df1/structedash__packager_1_1media_1_1mp4_1_1SegmentIndex-members.html b/docs/d7/df1/structedash__packager_1_1media_1_1mp4_1_1SegmentIndex-members.html index 6f43b43dee..a3fffa0386 100644 --- a/docs/d7/df1/structedash__packager_1_1media_1_1mp4_1_1SegmentIndex-members.html +++ b/docs/d7/df1/structedash__packager_1_1media_1_1mp4_1_1SegmentIndex-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/df3/classedash__packager_1_1media_1_1File-members.html b/docs/d7/df3/classedash__packager_1_1media_1_1File-members.html index fa016b5652..258fb7b20c 100644 --- a/docs/d7/df3/classedash__packager_1_1media_1_1File-members.html +++ b/docs/d7/df3/classedash__packager_1_1media_1_1File-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/df9/byte__queue_8cc_source.html b/docs/d7/df9/byte__queue_8cc_source.html index 607e47ec57..77832fb0cf 100644 --- a/docs/d7/df9/byte__queue_8cc_source.html +++ b/docs/d7/df9/byte__queue_8cc_source.html @@ -182,7 +182,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d7/dfa/classedash__packager_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter.html b/docs/d7/dfa/classedash__packager_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter.html index 0a654a8372..c8337b3110 100644 --- a/docs/d7/dfa/classedash__packager_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter.html +++ b/docs/d7/dfa/classedash__packager_1_1media_1_1webm_1_1TwoPassSingleSegmentSegmenter.html @@ -214,7 +214,7 @@ double cluster_length_sec< diff --git a/docs/d8/d0d/classedash__packager_1_1media_1_1mp4_1_1MP4MediaParser.html b/docs/d8/d0d/classedash__packager_1_1media_1_1mp4_1_1MP4MediaParser.html index aca0613f6a..6a29fb43e3 100644 --- a/docs/d8/d0d/classedash__packager_1_1media_1_1mp4_1_1MP4MediaParser.html +++ b/docs/d8/d0d/classedash__packager_1_1media_1_1mp4_1_1MP4MediaParser.html @@ -284,7 +284,7 @@ track_id, const scoped_refptr
    diff --git a/docs/d8/d0d/media__sample_8cc_source.html b/docs/d8/d0d/media__sample_8cc_source.html index b1603659f3..e6b4c17234 100644 --- a/docs/d8/d0d/media__sample_8cc_source.html +++ b/docs/d8/d0d/media__sample_8cc_source.html @@ -195,7 +195,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d19/bandwidth__estimator_8h_source.html b/docs/d8/d19/bandwidth__estimator_8h_source.html index a98d7baf91..52af36add8 100644 --- a/docs/d8/d19/bandwidth__estimator_8h_source.html +++ b/docs/d8/d19/bandwidth__estimator_8h_source.html @@ -133,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d1e/classedash__packager_1_1media_1_1mp4_1_1EncryptingFragmenter.html b/docs/d8/d1e/classedash__packager_1_1media_1_1mp4_1_1EncryptingFragmenter.html index d44de192ce..889a330ea6 100644 --- a/docs/d8/d1e/classedash__packager_1_1media_1_1mp4_1_1EncryptingFragmenter.html +++ b/docs/d8/d1e/classedash__packager_1_1media_1_1mp4_1_1EncryptingFragmenter.html @@ -374,7 +374,7 @@ void set_encryption_key diff --git a/docs/d8/d21/structedash__packager_1_1media_1_1mp4_1_1ChunkInfo.html b/docs/d8/d21/structedash__packager_1_1media_1_1mp4_1_1ChunkInfo.html index 9ac898f040..4142521518 100644 --- a/docs/d8/d21/structedash__packager_1_1media_1_1mp4_1_1ChunkInfo.html +++ b/docs/d8/d21/structedash__packager_1_1media_1_1mp4_1_1ChunkInfo.html @@ -108,14 +108,14 @@ uint32_t sample_descriptio

    Detailed Description

    -

    Definition at line 388 of file box_definitions.h.

    +

    Definition at line 395 of file box_definitions.h.


    The documentation for this struct was generated from the following file: diff --git a/docs/d8/d22/classedash__packager_1_1media_1_1HttpKeyFetcher-members.html b/docs/d8/d22/classedash__packager_1_1media_1_1HttpKeyFetcher-members.html index eb793479a7..52df9accfe 100644 --- a/docs/d8/d22/classedash__packager_1_1media_1_1HttpKeyFetcher-members.html +++ b/docs/d8/d22/classedash__packager_1_1media_1_1HttpKeyFetcher-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d25/classedash__packager_1_1media_1_1ProducerConsumerQueue-members.html b/docs/d8/d25/classedash__packager_1_1media_1_1ProducerConsumerQueue-members.html index 8441b9f2ce..abf2f8e465 100644 --- a/docs/d8/d25/classedash__packager_1_1media_1_1ProducerConsumerQueue-members.html +++ b/docs/d8/d25/classedash__packager_1_1media_1_1ProducerConsumerQueue-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d26/structedash__packager_1_1media_1_1mp4_1_1SegmentType-members.html b/docs/d8/d26/structedash__packager_1_1media_1_1mp4_1_1SegmentType-members.html index 5ae435721a..ba042df977 100644 --- a/docs/d8/d26/structedash__packager_1_1media_1_1mp4_1_1SegmentType-members.html +++ b/docs/d8/d26/structedash__packager_1_1media_1_1mp4_1_1SegmentType-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d2e/classedash__packager_1_1media_1_1ByteQueue.html b/docs/d8/d2e/classedash__packager_1_1media_1_1ByteQueue.html index cb02cfa4b4..3b6186c074 100644 --- a/docs/d8/d2e/classedash__packager_1_1media_1_1ByteQueue.html +++ b/docs/d8/d2e/classedash__packager_1_1media_1_1ByteQueue.html @@ -177,7 +177,7 @@ void  diff --git a/docs/d8/d32/structedash__packager_1_1media_1_1mp4_1_1CompactSampleSize-members.html b/docs/d8/d32/structedash__packager_1_1media_1_1mp4_1_1CompactSampleSize-members.html index 0d77702821..96d639cc1f 100644 --- a/docs/d8/d32/structedash__packager_1_1media_1_1mp4_1_1CompactSampleSize-members.html +++ b/docs/d8/d32/structedash__packager_1_1media_1_1mp4_1_1CompactSampleSize-members.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d33/webm__content__encodings__client_8h_source.html b/docs/d8/d33/webm__content__encodings__client_8h_source.html index f059a94429..947bafdcd9 100644 --- a/docs/d8/d33/webm__content__encodings__client_8h_source.html +++ b/docs/d8/d33/webm__content__encodings__client_8h_source.html @@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d34/structedash__packager_1_1media_1_1mp4_1_1ElementaryStreamDescriptor-members.html b/docs/d8/d34/structedash__packager_1_1media_1_1mp4_1_1ElementaryStreamDescriptor-members.html index cc213466be..94cdde1e95 100644 --- a/docs/d8/d34/structedash__packager_1_1media_1_1mp4_1_1ElementaryStreamDescriptor-members.html +++ b/docs/d8/d34/structedash__packager_1_1media_1_1mp4_1_1ElementaryStreamDescriptor-members.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d4a/structedash__packager_1_1media_1_1mp4_1_1EditList.html b/docs/d8/d4a/structedash__packager_1_1media_1_1mp4_1_1EditList.html index aa1e25d2bc..6f92ccd015 100644 --- a/docs/d8/d4a/structedash__packager_1_1media_1_1mp4_1_1EditList.html +++ b/docs/d8/d4a/structedash__packager_1_1media_1_1mp4_1_1EditList.html @@ -171,7 +171,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 953 of file box_definitions.cc.

    +

    Definition at line 954 of file box_definitions.cc.

    @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d8/d6a/classedash__packager_1_1media_1_1AudioStreamInfo-members.html b/docs/d8/d6a/classedash__packager_1_1media_1_1AudioStreamInfo-members.html index 01acd232af..421366227e 100644 --- a/docs/d8/d6a/classedash__packager_1_1media_1_1AudioStreamInfo-members.html +++ b/docs/d8/d6a/classedash__packager_1_1media_1_1AudioStreamInfo-members.html @@ -124,7 +124,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d6c/classedash__packager_1_1media_1_1MediaSample.html b/docs/d8/d6c/classedash__packager_1_1media_1_1MediaSample.html index 017e2d61de..da5565714c 100644 --- a/docs/d8/d6c/classedash__packager_1_1media_1_1MediaSample.html +++ b/docs/d8/d6c/classedash__packager_1_1media_1_1MediaSample.html @@ -408,7 +408,7 @@ class base::RefCountedThre diff --git a/docs/d8/d6f/classedash__packager_1_1MockAdaptationSet-members.html b/docs/d8/d6f/classedash__packager_1_1MockAdaptationSet-members.html index 888673c4ba..7174d86b73 100644 --- a/docs/d8/d6f/classedash__packager_1_1MockAdaptationSet-members.html +++ b/docs/d8/d6f/classedash__packager_1_1MockAdaptationSet-members.html @@ -126,7 +126,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d6f/structedash__packager_1_1media_1_1mp4_1_1TrackFragment-members.html b/docs/d8/d6f/structedash__packager_1_1media_1_1mp4_1_1TrackFragment-members.html index a93ebe3ce7..142ba85966 100644 --- a/docs/d8/d6f/structedash__packager_1_1media_1_1mp4_1_1TrackFragment-members.html +++ b/docs/d8/d6f/structedash__packager_1_1media_1_1mp4_1_1TrackFragment-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d71/classedash__packager_1_1media_1_1mp4_1_1ChunkInfoIterator.html b/docs/d8/d71/classedash__packager_1_1media_1_1mp4_1_1ChunkInfoIterator.html index 40408b241e..8d20b54c70 100644 --- a/docs/d8/d71/classedash__packager_1_1media_1_1mp4_1_1ChunkInfoIterator.html +++ b/docs/d8/d71/classedash__packager_1_1media_1_1mp4_1_1ChunkInfoIterator.html @@ -320,7 +320,7 @@ Public Member Functions diff --git a/docs/d8/d74/classedash__packager_1_1Representation-members.html b/docs/d8/d74/classedash__packager_1_1Representation-members.html index d5051660c4..13504382c6 100644 --- a/docs/d8/d74/classedash__packager_1_1Representation-members.html +++ b/docs/d8/d74/classedash__packager_1_1Representation-members.html @@ -99,15 +99,20 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); GetXml()edash_packager::Representation id() const edash_packager::Representationinline Init()edash_packager::Representation - MpdBuilderTest (defined in edash_packager::Representation)edash_packager::Representationfriend - Representation(const MediaInfo &media_info, const MpdOptions &mpd_options, uint32_t representation_id, scoped_ptr< RepresentationStateChangeListener > state_change_listener)edash_packager::Representationprotected - SetSampleDuration(uint32_t sample_duration)edash_packager::Representationvirtual - UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)edash_packager::Representationvirtual - ~Representation() (defined in edash_packager::Representation)edash_packager::Representationvirtual + kSuppressFrameRate enum value (defined in edash_packager::Representation)edash_packager::Representation + kSuppressHeight enum value (defined in edash_packager::Representation)edash_packager::Representation + kSuppressWidth enum value (defined in edash_packager::Representation)edash_packager::Representation + MpdBuilderTest (defined in edash_packager::Representation)edash_packager::Representationfriend + Representation(const MediaInfo &media_info, const MpdOptions &mpd_options, uint32_t representation_id, scoped_ptr< RepresentationStateChangeListener > state_change_listener)edash_packager::Representationprotected + SetSampleDuration(uint32_t sample_duration)edash_packager::Representationvirtual + SuppressFlag enum name (defined in edash_packager::Representation)edash_packager::Representation + SuppressOnce(SuppressFlag flag)edash_packager::Representation + UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)edash_packager::Representationvirtual + ~Representation() (defined in edash_packager::Representation)edash_packager::Representationvirtual diff --git a/docs/d8/d75/structedash__packager_1_1media_1_1mp4_1_1ProtectionSchemeInfo-members.html b/docs/d8/d75/structedash__packager_1_1media_1_1mp4_1_1ProtectionSchemeInfo-members.html index 88ae529049..f09b69970a 100644 --- a/docs/d8/d75/structedash__packager_1_1media_1_1mp4_1_1ProtectionSchemeInfo-members.html +++ b/docs/d8/d75/structedash__packager_1_1media_1_1mp4_1_1ProtectionSchemeInfo-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d78/classedash__packager_1_1MockAdaptationSet.html b/docs/d8/d78/classedash__packager_1_1MockAdaptationSet.html index 7961f79e9d..0d4b602b61 100644 --- a/docs/d8/d78/classedash__packager_1_1MockAdaptationSet.html +++ b/docs/d8/d78/classedash__packager_1_1MockAdaptationSet.html @@ -183,7 +183,7 @@ Additional Inherited Members diff --git a/docs/d8/d78/classedash__packager_1_1media_1_1WebMContentEncodingsClient.html b/docs/d8/d78/classedash__packager_1_1media_1_1WebMContentEncodingsClient.html index 266b227e17..8d93f918bc 100644 --- a/docs/d8/d78/classedash__packager_1_1media_1_1WebMContentEncodingsClient.html +++ b/docs/d8/d78/classedash__packager_1_1media_1_1WebMContentEncodingsClient.html @@ -152,7 +152,7 @@ Additional Inherited Members diff --git a/docs/d8/d82/classedash__packager_1_1media_1_1MpdNotifyMuxerListener-members.html b/docs/d8/d82/classedash__packager_1_1media_1_1MpdNotifyMuxerListener-members.html index 832dabd993..f73122a4c8 100644 --- a/docs/d8/d82/classedash__packager_1_1media_1_1MpdNotifyMuxerListener-members.html +++ b/docs/d8/d82/classedash__packager_1_1media_1_1MpdNotifyMuxerListener-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d8e/classedash__packager_1_1media_1_1mp2t_1_1TsSection.html b/docs/d8/d8e/classedash__packager_1_1media_1_1mp2t_1_1TsSection.html index b8f6f79095..28390c9201 100644 --- a/docs/d8/d8e/classedash__packager_1_1media_1_1mp2t_1_1TsSection.html +++ b/docs/d8/d8e/classedash__packager_1_1media_1_1mp2t_1_1TsSection.html @@ -141,7 +141,7 @@ virtual void Reset ()= diff --git a/docs/d8/d94/adts__constants_8cc_source.html b/docs/d8/d94/adts__constants_8cc_source.html index 8886e1e55d..f4b01a3bac 100644 --- a/docs/d8/d94/adts__constants_8cc_source.html +++ b/docs/d8/d94/adts__constants_8cc_source.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d97/structedash__packager_1_1ContentProtectionElement-members.html b/docs/d8/d97/structedash__packager_1_1ContentProtectionElement-members.html index 4e12de7b47..15bd7d2d35 100644 --- a/docs/d8/d97/structedash__packager_1_1ContentProtectionElement-members.html +++ b/docs/d8/d97/structedash__packager_1_1ContentProtectionElement-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d9a/fragmenter_8cc_source.html b/docs/d8/d9a/fragmenter_8cc_source.html index 879e54e204..53e2cd17d4 100644 --- a/docs/d8/d9a/fragmenter_8cc_source.html +++ b/docs/d8/d9a/fragmenter_8cc_source.html @@ -132,123 +132,126 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    43  return status;
    44  }
    45 
    -
    46  // Fill in sample parameters. It will be optimized later.
    -
    47  traf_->runs[0].sample_sizes.push_back(sample->data_size());
    -
    48  traf_->runs[0].sample_durations.push_back(sample->duration());
    -
    49  traf_->runs[0].sample_flags.push_back(
    -
    50  sample->is_key_frame() ? 0 : TrackFragmentHeader::kNonKeySampleMask);
    -
    51 
    -
    52  data_->AppendArray(sample->data(), sample->data_size());
    -
    53  fragment_duration_ += sample->duration();
    +
    46  if (sample->side_data_size() > 0)
    +
    47  LOG(WARNING) << "MP4 samples do not support side data. Side data ignored.";
    +
    48 
    +
    49  // Fill in sample parameters. It will be optimized later.
    +
    50  traf_->runs[0].sample_sizes.push_back(sample->data_size());
    +
    51  traf_->runs[0].sample_durations.push_back(sample->duration());
    +
    52  traf_->runs[0].sample_flags.push_back(
    +
    53  sample->is_key_frame() ? 0 : TrackFragmentHeader::kNonKeySampleMask);
    54 
    -
    55  int64_t pts = sample->pts();
    -
    56 
    -
    57  // Set |earliest_presentation_time_| to |pts| if |pts| is smaller or if it is
    -
    58  // not yet initialized (kInvalidTime > pts is always true).
    -
    59  if (earliest_presentation_time_ > pts)
    -
    60  earliest_presentation_time_ = pts;
    -
    61 
    -
    62  traf_->runs[0].sample_composition_time_offsets.push_back(pts - sample->dts());
    -
    63  if (pts != sample->dts())
    -
    64  traf_->runs[0].flags |= TrackFragmentRun::kSampleCompTimeOffsetsPresentMask;
    -
    65 
    -
    66  if (sample->is_key_frame()) {
    -
    67  if (first_sap_time_ == kInvalidTime)
    -
    68  first_sap_time_ = pts;
    -
    69  }
    -
    70  return Status::OK;
    -
    71 }
    -
    72 
    -
    73 Status Fragmenter::InitializeFragment(int64_t first_sample_dts) {
    -
    74  fragment_initialized_ = true;
    -
    75  fragment_finalized_ = false;
    -
    76  traf_->decode_time.decode_time = first_sample_dts;
    -
    77  traf_->runs.clear();
    -
    78  traf_->runs.resize(1);
    -
    79  traf_->runs[0].flags = TrackFragmentRun::kDataOffsetPresentMask;
    -
    80  traf_->header.sample_description_index = 1; // 1-based.
    -
    81  traf_->header.flags = TrackFragmentHeader::kDefaultBaseIsMoofMask |
    -
    82  TrackFragmentHeader::kSampleDescriptionIndexPresentMask;
    -
    83  fragment_duration_ = 0;
    -
    84  earliest_presentation_time_ = kInvalidTime;
    -
    85  first_sap_time_ = kInvalidTime;
    -
    86  data_.reset(new BufferWriter());
    -
    87  return Status::OK;
    -
    88 }
    -
    89 
    - -
    91  // Optimize trun box.
    -
    92  traf_->runs[0].sample_count = traf_->runs[0].sample_sizes.size();
    -
    93  if (OptimizeSampleEntries(&traf_->runs[0].sample_durations,
    -
    94  &traf_->header.default_sample_duration)) {
    -
    95  traf_->header.flags |=
    -
    96  TrackFragmentHeader::kDefaultSampleDurationPresentMask;
    -
    97  } else {
    -
    98  traf_->runs[0].flags |= TrackFragmentRun::kSampleDurationPresentMask;
    -
    99  }
    -
    100  if (OptimizeSampleEntries(&traf_->runs[0].sample_sizes,
    -
    101  &traf_->header.default_sample_size)) {
    -
    102  traf_->header.flags |= TrackFragmentHeader::kDefaultSampleSizePresentMask;
    -
    103  } else {
    -
    104  traf_->runs[0].flags |= TrackFragmentRun::kSampleSizePresentMask;
    -
    105  }
    -
    106  if (OptimizeSampleEntries(&traf_->runs[0].sample_flags,
    -
    107  &traf_->header.default_sample_flags)) {
    -
    108  traf_->header.flags |= TrackFragmentHeader::kDefaultSampleFlagsPresentMask;
    -
    109  } else {
    -
    110  traf_->runs[0].flags |= TrackFragmentRun::kSampleFlagsPresentMask;
    -
    111  }
    -
    112 
    -
    113  fragment_finalized_ = true;
    -
    114  fragment_initialized_ = false;
    -
    115 }
    -
    116 
    - -
    118  // NOTE: Daisy chain is not supported currently.
    -
    119  reference->reference_type = false;
    -
    120  reference->subsegment_duration = fragment_duration_;
    -
    121  reference->starts_with_sap = StartsWithSAP();
    -
    122  if (kInvalidTime == first_sap_time_) {
    -
    123  reference->sap_type = SegmentReference::TypeUnknown;
    -
    124  reference->sap_delta_time = 0;
    -
    125  } else {
    -
    126  reference->sap_type = SegmentReference::Type1;
    -
    127  reference->sap_delta_time = first_sap_time_ - earliest_presentation_time_;
    -
    128  }
    -
    129  reference->earliest_presentation_time = earliest_presentation_time_;
    -
    130 }
    -
    131 
    -
    132 bool Fragmenter::StartsWithSAP() {
    -
    133  DCHECK(!traf_->runs.empty());
    -
    134  uint32_t start_sample_flag;
    -
    135  if (traf_->runs[0].flags & TrackFragmentRun::kSampleFlagsPresentMask) {
    -
    136  DCHECK(!traf_->runs[0].sample_flags.empty());
    -
    137  start_sample_flag = traf_->runs[0].sample_flags[0];
    -
    138  } else {
    -
    139  DCHECK(traf_->header.flags &
    -
    140  TrackFragmentHeader::kDefaultSampleFlagsPresentMask);
    -
    141  start_sample_flag = traf_->header.default_sample_flags;
    -
    142  }
    -
    143  return (start_sample_flag & TrackFragmentHeader::kNonKeySampleMask) == 0;
    -
    144 }
    -
    145 
    -
    146 } // namespace mp4
    -
    147 } // namespace media
    -
    148 } // namespace edash_packager
    +
    55  data_->AppendArray(sample->data(), sample->data_size());
    +
    56  fragment_duration_ += sample->duration();
    +
    57 
    +
    58  int64_t pts = sample->pts();
    +
    59 
    +
    60  // Set |earliest_presentation_time_| to |pts| if |pts| is smaller or if it is
    +
    61  // not yet initialized (kInvalidTime > pts is always true).
    +
    62  if (earliest_presentation_time_ > pts)
    +
    63  earliest_presentation_time_ = pts;
    +
    64 
    +
    65  traf_->runs[0].sample_composition_time_offsets.push_back(pts - sample->dts());
    +
    66  if (pts != sample->dts())
    +
    67  traf_->runs[0].flags |= TrackFragmentRun::kSampleCompTimeOffsetsPresentMask;
    +
    68 
    +
    69  if (sample->is_key_frame()) {
    +
    70  if (first_sap_time_ == kInvalidTime)
    +
    71  first_sap_time_ = pts;
    +
    72  }
    +
    73  return Status::OK;
    +
    74 }
    +
    75 
    +
    76 Status Fragmenter::InitializeFragment(int64_t first_sample_dts) {
    +
    77  fragment_initialized_ = true;
    +
    78  fragment_finalized_ = false;
    +
    79  traf_->decode_time.decode_time = first_sample_dts;
    +
    80  traf_->runs.clear();
    +
    81  traf_->runs.resize(1);
    +
    82  traf_->runs[0].flags = TrackFragmentRun::kDataOffsetPresentMask;
    +
    83  traf_->header.sample_description_index = 1; // 1-based.
    +
    84  traf_->header.flags = TrackFragmentHeader::kDefaultBaseIsMoofMask |
    +
    85  TrackFragmentHeader::kSampleDescriptionIndexPresentMask;
    +
    86  fragment_duration_ = 0;
    +
    87  earliest_presentation_time_ = kInvalidTime;
    +
    88  first_sap_time_ = kInvalidTime;
    +
    89  data_.reset(new BufferWriter());
    +
    90  return Status::OK;
    +
    91 }
    +
    92 
    + +
    94  // Optimize trun box.
    +
    95  traf_->runs[0].sample_count = traf_->runs[0].sample_sizes.size();
    +
    96  if (OptimizeSampleEntries(&traf_->runs[0].sample_durations,
    +
    97  &traf_->header.default_sample_duration)) {
    +
    98  traf_->header.flags |=
    +
    99  TrackFragmentHeader::kDefaultSampleDurationPresentMask;
    +
    100  } else {
    +
    101  traf_->runs[0].flags |= TrackFragmentRun::kSampleDurationPresentMask;
    +
    102  }
    +
    103  if (OptimizeSampleEntries(&traf_->runs[0].sample_sizes,
    +
    104  &traf_->header.default_sample_size)) {
    +
    105  traf_->header.flags |= TrackFragmentHeader::kDefaultSampleSizePresentMask;
    +
    106  } else {
    +
    107  traf_->runs[0].flags |= TrackFragmentRun::kSampleSizePresentMask;
    +
    108  }
    +
    109  if (OptimizeSampleEntries(&traf_->runs[0].sample_flags,
    +
    110  &traf_->header.default_sample_flags)) {
    +
    111  traf_->header.flags |= TrackFragmentHeader::kDefaultSampleFlagsPresentMask;
    +
    112  } else {
    +
    113  traf_->runs[0].flags |= TrackFragmentRun::kSampleFlagsPresentMask;
    +
    114  }
    +
    115 
    +
    116  fragment_finalized_ = true;
    +
    117  fragment_initialized_ = false;
    +
    118 }
    +
    119 
    + +
    121  // NOTE: Daisy chain is not supported currently.
    +
    122  reference->reference_type = false;
    +
    123  reference->subsegment_duration = fragment_duration_;
    +
    124  reference->starts_with_sap = StartsWithSAP();
    +
    125  if (kInvalidTime == first_sap_time_) {
    +
    126  reference->sap_type = SegmentReference::TypeUnknown;
    +
    127  reference->sap_delta_time = 0;
    +
    128  } else {
    +
    129  reference->sap_type = SegmentReference::Type1;
    +
    130  reference->sap_delta_time = first_sap_time_ - earliest_presentation_time_;
    +
    131  }
    +
    132  reference->earliest_presentation_time = earliest_presentation_time_;
    +
    133 }
    +
    134 
    +
    135 bool Fragmenter::StartsWithSAP() {
    +
    136  DCHECK(!traf_->runs.empty());
    +
    137  uint32_t start_sample_flag;
    +
    138  if (traf_->runs[0].flags & TrackFragmentRun::kSampleFlagsPresentMask) {
    +
    139  DCHECK(!traf_->runs[0].sample_flags.empty());
    +
    140  start_sample_flag = traf_->runs[0].sample_flags[0];
    +
    141  } else {
    +
    142  DCHECK(traf_->header.flags &
    +
    143  TrackFragmentHeader::kDefaultSampleFlagsPresentMask);
    +
    144  start_sample_flag = traf_->header.default_sample_flags;
    +
    145  }
    +
    146  return (start_sample_flag & TrackFragmentHeader::kNonKeySampleMask) == 0;
    +
    147 }
    +
    148 
    +
    149 } // namespace mp4
    +
    150 } // namespace media
    +
    151 } // namespace edash_packager
    -
    void GenerateSegmentReference(SegmentReference *reference)
    Fill reference with current fragment information.
    Definition: fragmenter.cc:117
    +
    void GenerateSegmentReference(SegmentReference *reference)
    Fill reference with current fragment information.
    Definition: fragmenter.cc:120
    -
    virtual Status InitializeFragment(int64_t first_sample_dts)
    Definition: fragmenter.cc:73
    +
    virtual Status InitializeFragment(int64_t first_sample_dts)
    Definition: fragmenter.cc:76
    virtual Status AddSample(scoped_refptr< MediaSample > sample)
    Definition: fragmenter.cc:36
    - +
    bool OptimizeSampleEntries(std::vector< T > *entries, T *default_value)
    Definition: fragmenter.h:89
    - -
    virtual void FinalizeFragment()
    Finalize and optimize the fragment.
    Definition: fragmenter.cc:90
    + +
    virtual void FinalizeFragment()
    Finalize and optimize the fragment.
    Definition: fragmenter.cc:93
    diff --git a/docs/d8/d9c/webm__tracks__parser_8cc_source.html b/docs/d8/d9c/webm__tracks__parser_8cc_source.html index 96f76091ba..b90f801e21 100644 --- a/docs/d8/d9c/webm__tracks__parser_8cc_source.html +++ b/docs/d8/d9c/webm__tracks__parser_8cc_source.html @@ -440,7 +440,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/d9f/udp__file_8h_source.html b/docs/d8/d9f/udp__file_8h_source.html index d83fdb9112..f2e134bff0 100644 --- a/docs/d8/d9f/udp__file_8h_source.html +++ b/docs/d8/d9f/udp__file_8h_source.html @@ -147,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/da0/classedash__packager_1_1media_1_1wvm_1_1WvmMediaParser.html b/docs/d8/da0/classedash__packager_1_1media_1_1wvm_1_1WvmMediaParser.html index 98202545b3..df45d9d9a0 100644 --- a/docs/d8/da0/classedash__packager_1_1media_1_1wvm_1_1WvmMediaParser.html +++ b/docs/d8/da0/classedash__packager_1_1media_1_1wvm_1_1WvmMediaParser.html @@ -255,7 +255,7 @@ track_id, const scoped_refptr
    diff --git a/docs/d8/da1/classedash__packager_1_1media_1_1WidevineKeySource-members.html b/docs/d8/da1/classedash__packager_1_1media_1_1WidevineKeySource-members.html index 0ba2ca9274..57701a5fc5 100644 --- a/docs/d8/da1/classedash__packager_1_1media_1_1WidevineKeySource-members.html +++ b/docs/d8/da1/classedash__packager_1_1media_1_1WidevineKeySource-members.html @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/da6/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader-members.html b/docs/d8/da6/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader-members.html index 3ae8c048c2..21dbb1f30f 100644 --- a/docs/d8/da6/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader-members.html +++ b/docs/d8/da6/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/daa/stream__info_8h_source.html b/docs/d8/daa/stream__info_8h_source.html index 92cd94886d..bd46992f1d 100644 --- a/docs/d8/daa/stream__info_8h_source.html +++ b/docs/d8/daa/stream__info_8h_source.html @@ -185,7 +185,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/db0/structedash__packager_1_1media_1_1H264SPS.html b/docs/d8/db0/structedash__packager_1_1media_1_1H264SPS.html index 57bd1c3563..2900a3aadc 100644 --- a/docs/d8/db0/structedash__packager_1_1media_1_1H264SPS.html +++ b/docs/d8/db0/structedash__packager_1_1media_1_1H264SPS.html @@ -242,7 +242,7 @@ int chroma_array_type< diff --git a/docs/d8/dbb/structedash__packager_1_1media_1_1wvm_1_1PrevSampleData-members.html b/docs/d8/dbb/structedash__packager_1_1media_1_1wvm_1_1PrevSampleData-members.html index c46cf2bb5d..83c03ecf2a 100644 --- a/docs/d8/dbb/structedash__packager_1_1media_1_1wvm_1_1PrevSampleData-members.html +++ b/docs/d8/dbb/structedash__packager_1_1media_1_1wvm_1_1PrevSampleData-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/dc7/classedash__packager_1_1media_1_1UdpFile.html b/docs/d8/dc7/classedash__packager_1_1media_1_1UdpFile.html index a2716519ec..adf0d5eed4 100644 --- a/docs/d8/dc7/classedash__packager_1_1media_1_1UdpFile.html +++ b/docs/d8/dc7/classedash__packager_1_1media_1_1UdpFile.html @@ -463,7 +463,7 @@ Additional Inherited Members diff --git a/docs/d8/dca/classedash__packager_1_1media_1_1AesCbcPkcs5Decryptor-members.html b/docs/d8/dca/classedash__packager_1_1media_1_1AesCbcPkcs5Decryptor-members.html index 534024ef9b..1028a1b56f 100644 --- a/docs/d8/dca/classedash__packager_1_1media_1_1AesCbcPkcs5Decryptor-members.html +++ b/docs/d8/dca/classedash__packager_1_1media_1_1AesCbcPkcs5Decryptor-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/dcc/classedash__packager_1_1media_1_1AesRequestSigner.html b/docs/d8/dcc/classedash__packager_1_1media_1_1AesRequestSigner.html index ff7c04eee0..b0e6ac14cc 100644 --- a/docs/d8/dcc/classedash__packager_1_1media_1_1AesRequestSigner.html +++ b/docs/d8/dcc/classedash__packager_1_1media_1_1AesRequestSigner.html @@ -188,7 +188,7 @@ Additional Inherited Members diff --git a/docs/d8/dcf/classedash__packager_1_1media_1_1RsaRequestSigner-members.html b/docs/d8/dcf/classedash__packager_1_1media_1_1RsaRequestSigner-members.html index 43b0619155..19534992df 100644 --- a/docs/d8/dcf/classedash__packager_1_1media_1_1RsaRequestSigner-members.html +++ b/docs/d8/dcf/classedash__packager_1_1media_1_1RsaRequestSigner-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/de5/structedash__packager_1_1media_1_1mp4_1_1SampleEncryptionEntry.html b/docs/d8/de5/structedash__packager_1_1media_1_1mp4_1_1SampleEncryptionEntry.html index c48780d599..9736cae3fb 100644 --- a/docs/d8/de5/structedash__packager_1_1media_1_1mp4_1_1SampleEncryptionEntry.html +++ b/docs/d8/de5/structedash__packager_1_1media_1_1mp4_1_1SampleEncryptionEntry.html @@ -133,7 +133,7 @@ std::vector<
    Returns
    The size of the structure in bytes when it is stored.
    -

    Definition at line 295 of file box_definitions.cc.

    +

    Definition at line 296 of file box_definitions.cc.

    @@ -151,7 +151,7 @@ std::vector<
    Returns
    The accumulated size of subsamples. Returns 0 if there is no subsamples.
    -

    Definition at line 304 of file box_definitions.cc.

    +

    Definition at line 305 of file box_definitions.cc.

    @@ -195,7 +195,7 @@ std::vector<
    Returns
    true on success, false otherwise.
    -

    Definition at line 270 of file box_definitions.cc.

    +

    Definition at line 271 of file box_definitions.cc.

    @@ -239,7 +239,7 @@ std::vector<
    Returns
    true on success, false otherwise.
    -

    Definition at line 246 of file box_definitions.cc.

    +

    Definition at line 247 of file box_definitions.cc.

    @@ -250,7 +250,7 @@ std::vector< diff --git a/docs/d8/de6/webm__crypto__helpers_8h_source.html b/docs/d8/de6/webm__crypto__helpers_8h_source.html index 6b5230b45b..d5ea8528bc 100644 --- a/docs/d8/de6/webm__crypto__helpers_8h_source.html +++ b/docs/d8/de6/webm__crypto__helpers_8h_source.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/df0/webm_2single__segment__segmenter_8cc_source.html b/docs/d8/df0/webm_2single__segment__segmenter_8cc_source.html index 8b60b5fa5b..f590e25caa 100644 --- a/docs/d8/df0/webm_2single__segment__segmenter_8cc_source.html +++ b/docs/d8/df0/webm_2single__segment__segmenter_8cc_source.html @@ -180,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/df1/classedash__packager_1_1MpdWriter-members.html b/docs/d8/df1/classedash__packager_1_1MpdWriter-members.html index 216e1caea9..d2aecd6e8f 100644 --- a/docs/d8/df1/classedash__packager_1_1MpdWriter-members.html +++ b/docs/d8/df1/classedash__packager_1_1MpdWriter-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d8/dfd/structedash__packager_1_1media_1_1VPxFrameInfo.html b/docs/d8/dfd/structedash__packager_1_1media_1_1VPxFrameInfo.html index f8d719c99b..e308c31233 100644 --- a/docs/d8/dfd/structedash__packager_1_1media_1_1VPxFrameInfo.html +++ b/docs/d8/dfd/structedash__packager_1_1media_1_1VPxFrameInfo.html @@ -121,7 +121,7 @@ uint32_t height diff --git a/docs/d9/d01/mp4_2single__segment__segmenter_8h_source.html b/docs/d9/d01/mp4_2single__segment__segmenter_8h_source.html index dcaa9f29f5..621363900b 100644 --- a/docs/d9/d01/mp4_2single__segment__segmenter_8h_source.html +++ b/docs/d9/d01/mp4_2single__segment__segmenter_8h_source.html @@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d08/mock__mpd__builder_8h_source.html b/docs/d9/d08/mock__mpd__builder_8h_source.html index db78ac4ab0..e2ba363035 100644 --- a/docs/d9/d08/mock__mpd__builder_8h_source.html +++ b/docs/d9/d08/mock__mpd__builder_8h_source.html @@ -157,30 +157,30 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    68 
    69 #endif // MPD_BASE_MOCK_MPD_BUILDER_H_
    MpdType type() const
    Definition: mpd_builder.h:90
    -
    virtual void AddNewSegment(uint64_t start_time, uint64_t duration, uint64_t size)
    +
    virtual void AddNewSegment(uint64_t start_time, uint64_t duration, uint64_t size)
    -
    virtual int Group() const
    Definition: mpd_builder.cc:813
    -
    virtual AdaptationSet * AddAdaptationSet(const std::string &lang)
    Definition: mpd_builder.cc:407
    +
    virtual int Group() const
    Definition: mpd_builder.cc:826
    +
    virtual AdaptationSet * AddAdaptationSet(const std::string &lang)
    Definition: mpd_builder.cc:408
    This class generates DASH MPDs (Media Presentation Descriptions).
    Definition: mpd_builder.h:55
    -
    virtual void ForceSetSegmentAlignment(bool segment_alignment)
    Definition: mpd_builder.cc:803
    +
    virtual void ForceSetSegmentAlignment(bool segment_alignment)
    Definition: mpd_builder.cc:816
    -
    virtual void SetSampleDuration(uint32_t sample_duration)
    -
    virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
    -
    virtual void SetGroup(int group_number)
    Definition: mpd_builder.cc:809
    -
    virtual void AddContentProtectionElement(const ContentProtectionElement &element)
    +
    virtual void SetSampleDuration(uint32_t sample_duration)
    +
    virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
    +
    virtual void SetGroup(int group_number)
    Definition: mpd_builder.cc:822
    +
    virtual void AddContentProtectionElement(const ContentProtectionElement &element)
    -
    virtual Representation * AddRepresentation(const MediaInfo &media_info)
    Definition: mpd_builder.cc:672
    +
    virtual Representation * AddRepresentation(const MediaInfo &media_info)
    Definition: mpd_builder.cc:673
    -
    virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
    Definition: mpd_builder.cc:722
    -
    virtual bool ToString(std::string *output)
    Definition: mpd_builder.cc:422
    -
    virtual void AddRole(Role role)
    Definition: mpd_builder.cc:728
    -
    virtual void AddContentProtectionElement(const ContentProtectionElement &element)
    Definition: mpd_builder.cc:716
    +
    virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
    Definition: mpd_builder.cc:723
    +
    virtual bool ToString(std::string *output)
    Definition: mpd_builder.cc:423
    +
    virtual void AddRole(Role role)
    Definition: mpd_builder.cc:729
    +
    virtual void AddContentProtectionElement(const ContentProtectionElement &element)
    Definition: mpd_builder.cc:717
    diff --git a/docs/d9/d15/key__rotation__fragmenter_8cc_source.html b/docs/d9/d15/key__rotation__fragmenter_8cc_source.html index 62afa0eb42..cd9f41472e 100644 --- a/docs/d9/d15/key__rotation__fragmenter_8cc_source.html +++ b/docs/d9/d15/key__rotation__fragmenter_8cc_source.html @@ -222,15 +222,15 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    virtual std::string UUID()
    Definition: key_source.cc:92
    KeySource is responsible for encryption key acquisition.
    Definition: key_source.h:29
    - - + +
    KeyRotationFragmenter(MovieFragment *moof, TrackFragment *traf, KeySource *encryption_key_source, KeySource::TrackType track_type, int64_t crypto_period_duration, int64_t clear_time, VideoCodec video_codec, uint8_t nalu_length_size, MuxerListener *muxer_listener)
    virtual std::string SystemName()
    Definition: key_source.cc:96
    virtual void FinalizeFragmentForEncryption()
    Finalize current fragment for encryption.
    diff --git a/docs/d9/d17/classedash__packager_1_1DashIopMpdNotifier-members.html b/docs/d9/d17/classedash__packager_1_1DashIopMpdNotifier-members.html index 01c76adb66..dc0021ee96 100644 --- a/docs/d9/d17/classedash__packager_1_1DashIopMpdNotifier-members.html +++ b/docs/d9/d17/classedash__packager_1_1DashIopMpdNotifier-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d18/structedash__packager_1_1media_1_1mp4_1_1SyncSample.html b/docs/d9/d18/structedash__packager_1_1media_1_1mp4_1_1SyncSample.html index 6b833b51f4..ab6b9694cc 100644 --- a/docs/d9/d18/structedash__packager_1_1media_1_1mp4_1_1SyncSample.html +++ b/docs/d9/d18/structedash__packager_1_1media_1_1mp4_1_1SyncSample.html @@ -145,7 +145,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 431 of file box_definitions.h.

    +

    Definition at line 438 of file box_definitions.h.

    Member Function Documentation

    @@ -171,7 +171,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 879 of file box_definitions.cc.

    +

    Definition at line 880 of file box_definitions.cc.

    @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/d9/d21/structedash__packager_1_1media_1_1mp4_1_1ID3v2.html b/docs/d9/d21/structedash__packager_1_1media_1_1mp4_1_1ID3v2.html index bdf1b54ffe..f1a6e315dc 100644 --- a/docs/d9/d21/structedash__packager_1_1media_1_1mp4_1_1ID3v2.html +++ b/docs/d9/d21/structedash__packager_1_1media_1_1mp4_1_1ID3v2.html @@ -178,7 +178,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1144 of file box_definitions.cc.

    +

    Definition at line 1145 of file box_definitions.cc.

    @@ -189,7 +189,7 @@ Additional Inherited Members diff --git a/docs/d9/d2c/classedash__packager_1_1media_1_1ProgressListener.html b/docs/d9/d2c/classedash__packager_1_1media_1_1ProgressListener.html index be6a48c201..47b9164db3 100644 --- a/docs/d9/d2c/classedash__packager_1_1media_1_1ProgressListener.html +++ b/docs/d9/d2c/classedash__packager_1_1media_1_1ProgressListener.html @@ -146,7 +146,7 @@ Public Member Functions diff --git a/docs/d9/d3b/classedash__packager_1_1media_1_1MemoryFile-members.html b/docs/d9/d3b/classedash__packager_1_1media_1_1MemoryFile-members.html index 3ee279fd4e..77d7a03cff 100644 --- a/docs/d9/d3b/classedash__packager_1_1media_1_1MemoryFile-members.html +++ b/docs/d9/d3b/classedash__packager_1_1media_1_1MemoryFile-members.html @@ -119,7 +119,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d3b/webm__content__encodings_8h_source.html b/docs/d9/d3b/webm__content__encodings_8h_source.html index d17feb3894..77f2383f0b 100644 --- a/docs/d9/d3b/webm__content__encodings_8h_source.html +++ b/docs/d9/d3b/webm__content__encodings_8h_source.html @@ -179,7 +179,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d46/classedash__packager_1_1media_1_1BufferReader.html b/docs/d9/d46/classedash__packager_1_1media_1_1BufferReader.html index c9e531e497..fb2189809b 100644 --- a/docs/d9/d46/classedash__packager_1_1media_1_1BufferReader.html +++ b/docs/d9/d46/classedash__packager_1_1media_1_1BufferReader.html @@ -276,7 +276,7 @@ bool ReadNBytesInto8s diff --git a/docs/d9/d47/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentHeader.html b/docs/d9/d47/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentHeader.html index 4ac1c23c00..44051dff99 100644 --- a/docs/d9/d47/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentHeader.html +++ b/docs/d9/d47/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentHeader.html @@ -185,7 +185,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 573 of file box_definitions.h.

    +

    Definition at line 580 of file box_definitions.h.

    Member Function Documentation

    @@ -211,7 +211,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1919 of file box_definitions.cc.

    +

    Definition at line 1940 of file box_definitions.cc.

    @@ -222,7 +222,7 @@ Additional Inherited Members diff --git a/docs/d9/d5b/structedash__packager_1_1SegmentInfo-members.html b/docs/d9/d5b/structedash__packager_1_1SegmentInfo-members.html index 2add6a17d5..4a59e7b31e 100644 --- a/docs/d9/d5b/structedash__packager_1_1SegmentInfo-members.html +++ b/docs/d9/d5b/structedash__packager_1_1SegmentInfo-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d65/classedash__packager_1_1media_1_1TextTrack-members.html b/docs/d9/d65/classedash__packager_1_1media_1_1TextTrack-members.html index 17e9b2531d..19379bd13a 100644 --- a/docs/d9/d65/classedash__packager_1_1media_1_1TextTrack-members.html +++ b/docs/d9/d65/classedash__packager_1_1media_1_1TextTrack-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d76/structedash__packager_1_1media_1_1H264ModificationOfPicNum.html b/docs/d9/d76/structedash__packager_1_1media_1_1H264ModificationOfPicNum.html index 8d80a2bb2f..5ba686bbbc 100644 --- a/docs/d9/d76/structedash__packager_1_1media_1_1H264ModificationOfPicNum.html +++ b/docs/d9/d76/structedash__packager_1_1media_1_1H264ModificationOfPicNum.html @@ -119,7 +119,7 @@ union { diff --git a/docs/d9/d7b/structedash__packager_1_1media_1_1wvm_1_1PrevSampleData.html b/docs/d9/d7b/structedash__packager_1_1media_1_1wvm_1_1PrevSampleData.html index 66495bdfb1..46d806f311 100644 --- a/docs/d9/d7b/structedash__packager_1_1media_1_1wvm_1_1PrevSampleData.html +++ b/docs/d9/d7b/structedash__packager_1_1media_1_1wvm_1_1PrevSampleData.html @@ -132,7 +132,7 @@ int64_t video_sample_durat diff --git a/docs/d9/d86/limits_8h_source.html b/docs/d9/d86/limits_8h_source.html index d9ea1446d9..daaba1991a 100644 --- a/docs/d9/d86/limits_8h_source.html +++ b/docs/d9/d86/limits_8h_source.html @@ -141,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d8b/classedash__packager_1_1media_1_1KeySource.html b/docs/d9/d8b/classedash__packager_1_1media_1_1KeySource.html index 56829c58ca..71d5ab1ec4 100644 --- a/docs/d9/d8b/classedash__packager_1_1media_1_1KeySource.html +++ b/docs/d9/d8b/classedash__packager_1_1media_1_1KeySource.html @@ -582,7 +582,7 @@ Static Protected Member Functions diff --git a/docs/d9/d90/text__track_8h_source.html b/docs/d9/d90/text__track_8h_source.html index 8728976220..9f88c954f7 100644 --- a/docs/d9/d90/text__track_8h_source.html +++ b/docs/d9/d90/text__track_8h_source.html @@ -134,7 +134,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d91/h264__bit__reader_8h_source.html b/docs/d9/d91/h264__bit__reader_8h_source.html index f0422f7e9f..e3b7676c30 100644 --- a/docs/d9/d91/h264__bit__reader_8h_source.html +++ b/docs/d9/d91/h264__bit__reader_8h_source.html @@ -170,7 +170,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d93/media__stream_8h_source.html b/docs/d9/d93/media__stream_8h_source.html index 3e760493d5..0ab87c7df5 100644 --- a/docs/d9/d93/media__stream_8h_source.html +++ b/docs/d9/d93/media__stream_8h_source.html @@ -170,7 +170,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d95/classedash__packager_1_1media_1_1MediaStream-members.html b/docs/d9/d95/classedash__packager_1_1media_1_1MediaStream-members.html index eaa759847b..8253fda08e 100644 --- a/docs/d9/d95/classedash__packager_1_1media_1_1MediaStream-members.html +++ b/docs/d9/d95/classedash__packager_1_1media_1_1MediaStream-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d99/classedash__packager_1_1media_1_1DecryptConfig-members.html b/docs/d9/d99/classedash__packager_1_1media_1_1DecryptConfig-members.html index 090df0604a..a93b6eabd9 100644 --- a/docs/d9/d99/classedash__packager_1_1media_1_1DecryptConfig-members.html +++ b/docs/d9/d99/classedash__packager_1_1media_1_1DecryptConfig-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/d9b/structedash__packager_1_1SegmentInfo.html b/docs/d9/d9b/structedash__packager_1_1SegmentInfo.html index 615f1adef7..1aba2d35a9 100644 --- a/docs/d9/d9b/structedash__packager_1_1SegmentInfo.html +++ b/docs/d9/d9b/structedash__packager_1_1SegmentInfo.html @@ -118,7 +118,7 @@ uint64_t repeat diff --git a/docs/d9/da4/stream__descriptor_8h_source.html b/docs/d9/da4/stream__descriptor_8h_source.html index 3dcdc78440..2fb735db0d 100644 --- a/docs/d9/da4/stream__descriptor_8h_source.html +++ b/docs/d9/da4/stream__descriptor_8h_source.html @@ -141,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/db4/classedash__packager_1_1media_1_1VodMediaInfoDumpMuxerListener.html b/docs/d9/db4/classedash__packager_1_1media_1_1VodMediaInfoDumpMuxerListener.html index b80f53ef3c..1de9209e40 100644 --- a/docs/d9/db4/classedash__packager_1_1media_1_1VodMediaInfoDumpMuxerListener.html +++ b/docs/d9/db4/classedash__packager_1_1media_1_1VodMediaInfoDumpMuxerListener.html @@ -252,7 +252,7 @@ Additional Inherited Members diff --git a/docs/d9/db9/content__protection__element_8cc_source.html b/docs/d9/db9/content__protection__element_8cc_source.html index dc53640e50..b67e216919 100644 --- a/docs/d9/db9/content__protection__element_8cc_source.html +++ b/docs/d9/db9/content__protection__element_8cc_source.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/db9/muxer_8cc_source.html b/docs/d9/db9/muxer_8cc_source.html index 91cc39db7f..bb5e006922 100644 --- a/docs/d9/db9/muxer_8cc_source.html +++ b/docs/d9/db9/muxer_8cc_source.html @@ -214,7 +214,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/dbf/classedash__packager_1_1media_1_1TextStreamInfo-members.html b/docs/d9/dbf/classedash__packager_1_1media_1_1TextStreamInfo-members.html index 17096415fe..fc33c038e1 100644 --- a/docs/d9/dbf/classedash__packager_1_1media_1_1TextStreamInfo-members.html +++ b/docs/d9/dbf/classedash__packager_1_1media_1_1TextStreamInfo-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/dc8/webm__constants_8cc_source.html b/docs/d9/dc8/webm__constants_8cc_source.html index 65bf15e04f..f38e8d0f3b 100644 --- a/docs/d9/dc8/webm__constants_8cc_source.html +++ b/docs/d9/dc8/webm__constants_8cc_source.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/dcc/structedash__packager_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html b/docs/d9/dcc/structedash__packager_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html index 44fa5ecb20..df63fee3a3 100644 --- a/docs/d9/dcc/structedash__packager_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html +++ b/docs/d9/dcc/structedash__packager_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html @@ -174,7 +174,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1356 of file box_definitions.cc.

    +

    Definition at line 1357 of file box_definitions.cc.

    @@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/d9/dcc/webm__video__client_8h_source.html b/docs/d9/dcc/webm__video__client_8h_source.html index bfa0428778..0b3eccb65f 100644 --- a/docs/d9/dcc/webm__video__client_8h_source.html +++ b/docs/d9/dcc/webm__video__client_8h_source.html @@ -149,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/de3/muxer__listener__internal_8cc_source.html b/docs/d9/de3/muxer__listener__internal_8cc_source.html index e6f47e1e84..6984a4e1c5 100644 --- a/docs/d9/de3/muxer__listener__internal_8cc_source.html +++ b/docs/d9/de3/muxer__listener__internal_8cc_source.html @@ -326,7 +326,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/dec/classedash__packager_1_1media_1_1RequestSigner-members.html b/docs/d9/dec/classedash__packager_1_1media_1_1RequestSigner-members.html index b8304520e7..9e4da819d2 100644 --- a/docs/d9/dec/classedash__packager_1_1media_1_1RequestSigner-members.html +++ b/docs/d9/dec/classedash__packager_1_1media_1_1RequestSigner-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/d9/ded/aac__audio__specific__config_8cc_source.html b/docs/d9/ded/aac__audio__specific__config_8cc_source.html index 7c4438c694..3879db5853 100644 --- a/docs/d9/ded/aac__audio__specific__config_8cc_source.html +++ b/docs/d9/ded/aac__audio__specific__config_8cc_source.html @@ -357,7 +357,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d00/structedash__packager_1_1media_1_1mp4_1_1SubtitleMediaHeader-members.html b/docs/da/d00/structedash__packager_1_1media_1_1mp4_1_1SubtitleMediaHeader-members.html index 2e44299f46..2c04e8578c 100644 --- a/docs/da/d00/structedash__packager_1_1media_1_1mp4_1_1SubtitleMediaHeader-members.html +++ b/docs/da/d00/structedash__packager_1_1media_1_1mp4_1_1SubtitleMediaHeader-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d02/structedash__packager_1_1media_1_1H264WeightingFactors-members.html b/docs/da/d02/structedash__packager_1_1media_1_1H264WeightingFactors-members.html index 7f94ca51c2..05cf21e7e8 100644 --- a/docs/da/d02/structedash__packager_1_1media_1_1H264WeightingFactors-members.html +++ b/docs/da/d02/structedash__packager_1_1media_1_1H264WeightingFactors-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d02/structedash__packager_1_1media_1_1mp4_1_1SyncSample-members.html b/docs/da/d02/structedash__packager_1_1media_1_1mp4_1_1SyncSample-members.html index 332240d4e5..ab1dad56ca 100644 --- a/docs/da/d02/structedash__packager_1_1media_1_1mp4_1_1SyncSample-members.html +++ b/docs/da/d02/structedash__packager_1_1media_1_1mp4_1_1SyncSample-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d04/audio__stream__info_8cc_source.html b/docs/da/d04/audio__stream__info_8cc_source.html index dd0927705b..14f893118a 100644 --- a/docs/da/d04/audio__stream__info_8cc_source.html +++ b/docs/da/d04/audio__stream__info_8cc_source.html @@ -108,136 +108,120 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    19  switch (audio_codec) {
    20  case kCodecAAC:
    21  return "AAC";
    -
    22  case kCodecMP3:
    -
    23  return "MP3";
    -
    24  case kCodecPCM:
    -
    25  return "PCM";
    -
    26  case kCodecVorbis:
    -
    27  return "Vorbis";
    -
    28  case kCodecFLAC:
    -
    29  return "FLAC";
    -
    30  case kCodecAMR_NB:
    -
    31  return "AMR_NB";
    -
    32  case kCodecAMR_WB:
    -
    33  return "AMR_WB";
    -
    34  case kCodecPCM_MULAW:
    -
    35  return "PCM_MULAW";
    -
    36  case kCodecGSM_MS:
    -
    37  return "GSM_MS";
    -
    38  case kCodecPCM_S16BE:
    -
    39  return "PCM_S16BE";
    -
    40  case kCodecPCM_S24BE:
    -
    41  return "PCM_S24BE";
    -
    42  case kCodecOpus:
    -
    43  return "Opus";
    -
    44  case kCodecEAC3:
    -
    45  return "EAC3";
    -
    46  case kCodecDTSC:
    -
    47  return "DTSC";
    -
    48  case kCodecDTSH:
    -
    49  return "DTSH";
    -
    50  case kCodecDTSL:
    -
    51  return "DTSL";
    -
    52  case kCodecDTSE:
    -
    53  return "DTSE";
    -
    54  case kCodecDTSP:
    -
    55  return "DTS+";
    -
    56  case kCodecDTSM:
    -
    57  return "DTS-";
    -
    58  default:
    -
    59  NOTIMPLEMENTED() << "Unknown Audio Codec: " << audio_codec;
    -
    60  return "UnknownAudioCodec";
    -
    61  }
    -
    62 }
    -
    63 } // namespace
    -
    64 
    - -
    66  uint32_t time_scale,
    -
    67  uint64_t duration,
    -
    68  AudioCodec codec,
    -
    69  const std::string& codec_string,
    -
    70  const std::string& language,
    -
    71  uint8_t sample_bits,
    -
    72  uint8_t num_channels,
    -
    73  uint32_t sampling_frequency,
    -
    74  uint32_t max_bitrate,
    -
    75  uint32_t avg_bitrate,
    -
    76  const uint8_t* extra_data,
    -
    77  size_t extra_data_size,
    -
    78  bool is_encrypted)
    -
    79  : StreamInfo(kStreamAudio,
    -
    80  track_id,
    -
    81  time_scale,
    -
    82  duration,
    -
    83  codec_string,
    -
    84  language,
    -
    85  extra_data,
    -
    86  extra_data_size,
    -
    87  is_encrypted),
    -
    88  codec_(codec),
    -
    89  sample_bits_(sample_bits),
    -
    90  num_channels_(num_channels),
    -
    91  sampling_frequency_(sampling_frequency),
    -
    92  max_bitrate_(max_bitrate),
    -
    93  avg_bitrate_(avg_bitrate) {}
    +
    22  case kCodecAC3:
    +
    23  return "AC3";
    +
    24  case kCodecDTSC:
    +
    25  return "DTSC";
    +
    26  case kCodecDTSE:
    +
    27  return "DTSE";
    +
    28  case kCodecDTSH:
    +
    29  return "DTSH";
    +
    30  case kCodecDTSL:
    +
    31  return "DTSL";
    +
    32  case kCodecDTSM:
    +
    33  return "DTS-";
    +
    34  case kCodecDTSP:
    +
    35  return "DTS+";
    +
    36  case kCodecOpus:
    +
    37  return "Opus";
    +
    38  case kCodecVorbis:
    +
    39  return "Vorbis";
    +
    40  default:
    +
    41  NOTIMPLEMENTED() << "Unknown Audio Codec: " << audio_codec;
    +
    42  return "UnknownAudioCodec";
    +
    43  }
    +
    44 }
    +
    45 } // namespace
    +
    46 
    + +
    48  uint32_t time_scale,
    +
    49  uint64_t duration,
    +
    50  AudioCodec codec,
    +
    51  const std::string& codec_string,
    +
    52  const std::string& language,
    +
    53  uint8_t sample_bits,
    +
    54  uint8_t num_channels,
    +
    55  uint32_t sampling_frequency,
    +
    56  uint32_t max_bitrate,
    +
    57  uint32_t avg_bitrate,
    +
    58  const uint8_t* extra_data,
    +
    59  size_t extra_data_size,
    +
    60  bool is_encrypted)
    +
    61  : StreamInfo(kStreamAudio,
    +
    62  track_id,
    +
    63  time_scale,
    +
    64  duration,
    +
    65  codec_string,
    +
    66  language,
    +
    67  extra_data,
    +
    68  extra_data_size,
    +
    69  is_encrypted),
    +
    70  codec_(codec),
    +
    71  sample_bits_(sample_bits),
    +
    72  num_channels_(num_channels),
    +
    73  sampling_frequency_(sampling_frequency),
    +
    74  max_bitrate_(max_bitrate),
    +
    75  avg_bitrate_(avg_bitrate) {}
    +
    76 
    +
    77 AudioStreamInfo::~AudioStreamInfo() {}
    +
    78 
    + +
    80  return codec_ != kUnknownAudioCodec && num_channels_ != 0 &&
    +
    81  num_channels_ <= limits::kMaxChannels && sample_bits_ > 0 &&
    +
    82  sample_bits_ <= limits::kMaxBitsPerSample &&
    +
    83  sampling_frequency_ > 0 &&
    +
    84  sampling_frequency_ <= limits::kMaxSampleRate;
    +
    85 }
    +
    86 
    +
    87 std::string AudioStreamInfo::ToString() const {
    +
    88  return base::StringPrintf(
    +
    89  "%s codec: %s\n sample_bits: %d\n num_channels: %d\n "
    +
    90  "sampling_frequency: %d\n language: %s\n",
    +
    91  StreamInfo::ToString().c_str(), AudioCodecToString(codec_).c_str(),
    +
    92  sample_bits_, num_channels_, sampling_frequency_, language().c_str());
    +
    93 }
    94 
    -
    95 AudioStreamInfo::~AudioStreamInfo() {}
    -
    96 
    - -
    98  return codec_ != kUnknownAudioCodec && num_channels_ != 0 &&
    -
    99  num_channels_ <= limits::kMaxChannels && sample_bits_ > 0 &&
    -
    100  sample_bits_ <= limits::kMaxBitsPerSample &&
    -
    101  sampling_frequency_ > 0 &&
    -
    102  sampling_frequency_ <= limits::kMaxSampleRate;
    -
    103 }
    -
    104 
    -
    105 std::string AudioStreamInfo::ToString() const {
    -
    106  return base::StringPrintf(
    -
    107  "%s codec: %s\n sample_bits: %d\n num_channels: %d\n "
    -
    108  "sampling_frequency: %d\n language: %s\n",
    -
    109  StreamInfo::ToString().c_str(), AudioCodecToString(codec_).c_str(),
    -
    110  sample_bits_, num_channels_, sampling_frequency_, language().c_str());
    -
    111 }
    -
    112 
    -
    113 std::string AudioStreamInfo::GetCodecString(AudioCodec codec,
    -
    114  uint8_t audio_object_type) {
    -
    115  switch (codec) {
    -
    116  case kCodecVorbis:
    -
    117  return "vorbis";
    -
    118  case kCodecOpus:
    -
    119  return "opus";
    -
    120  case kCodecAAC:
    -
    121  return "mp4a.40." + base::UintToString(audio_object_type);
    -
    122  case kCodecDTSC:
    -
    123  return "dtsc";
    -
    124  case kCodecDTSH:
    -
    125  return "dtsh";
    -
    126  case kCodecDTSL:
    -
    127  return "dtsl";
    -
    128  case kCodecDTSE:
    -
    129  return "dtse";
    -
    130  case kCodecDTSP:
    -
    131  return "dts+";
    -
    132  case kCodecDTSM:
    -
    133  return "dts-";
    -
    134  default:
    -
    135  NOTIMPLEMENTED() << "Codec: " << codec;
    -
    136  return "unknown";
    -
    137  }
    -
    138 }
    -
    139 
    -
    140 } // namespace media
    -
    141 } // namespace edash_packager
    -
    std::string ToString() const override
    +
    95 std::string AudioStreamInfo::GetCodecString(AudioCodec codec,
    +
    96  uint8_t audio_object_type) {
    +
    97  switch (codec) {
    +
    98  case kCodecVorbis:
    +
    99  return "vorbis";
    +
    100  case kCodecOpus:
    +
    101  return "opus";
    +
    102  case kCodecAAC:
    +
    103  return "mp4a.40." + base::UintToString(audio_object_type);
    +
    104  case kCodecDTSC:
    +
    105  return "dtsc";
    +
    106  case kCodecDTSH:
    +
    107  return "dtsh";
    +
    108  case kCodecDTSL:
    +
    109  return "dtsl";
    +
    110  case kCodecDTSE:
    +
    111  return "dtse";
    +
    112  case kCodecDTSP:
    +
    113  return "dts+";
    +
    114  case kCodecDTSM:
    +
    115  return "dts-";
    +
    116  case kCodecAC3:
    +
    117  return "ac-3";
    +
    118  default:
    +
    119  NOTIMPLEMENTED() << "Codec: " << codec;
    +
    120  return "unknown";
    +
    121  }
    +
    122 }
    +
    123 
    +
    124 } // namespace media
    +
    125 } // namespace edash_packager
    +
    std::string ToString() const override
    Abstract class holds stream information.
    Definition: stream_info.h:26
    -
    AudioStreamInfo(int track_id, uint32_t time_scale, uint64_t duration, AudioCodec codec, const std::string &codec_string, const std::string &language, uint8_t sample_bits, uint8_t num_channels, uint32_t sampling_frequency, uint32_t max_bitrate, uint32_t avg_bitrate, const uint8_t *extra_data, size_t extra_data_size, bool is_encrypted)
    Construct an initialized audio stream info object.
    +
    AudioStreamInfo(int track_id, uint32_t time_scale, uint64_t duration, AudioCodec codec, const std::string &codec_string, const std::string &language, uint8_t sample_bits, uint8_t num_channels, uint32_t sampling_frequency, uint32_t max_bitrate, uint32_t avg_bitrate, const uint8_t *extra_data, size_t extra_data_size, bool is_encrypted)
    Construct an initialized audio stream info object.
    virtual std::string ToString() const
    Definition: stream_info.cc:40
    - -
    static std::string GetCodecString(AudioCodec codec, uint8_t audio_object_type)
    + +
    static std::string GetCodecString(AudioCodec codec, uint8_t audio_object_type)
    diff --git a/docs/da/d09/classedash__packager_1_1media_1_1SegmentTestBase-members.html b/docs/da/d09/classedash__packager_1_1media_1_1SegmentTestBase-members.html index 6af61838c0..8f248d943b 100644 --- a/docs/da/d09/classedash__packager_1_1media_1_1SegmentTestBase-members.html +++ b/docs/da/d09/classedash__packager_1_1media_1_1SegmentTestBase-members.html @@ -95,21 +95,27 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - + - - - - - + + + + + + + + + + +
    CreateAndInitializeSegmenter(const MuxerOptions &options, StreamInfo *info, scoped_ptr< webm::Segmenter > *result) const edash_packager::media::SegmentTestBaseinlineprotected
    CreateMuxerOptions() const edash_packager::media::SegmentTestBaseprotected
    CreateSample(bool is_key_frame, uint64_t duration)edash_packager::media::SegmentTestBaseprotected
    CreateSample(KeyFrameFlag key_frame_flag, uint64_t duration, SideDataFlag side_data_flag)edash_packager::media::SegmentTestBaseprotected
    CreateVideoStreamInfo() const edash_packager::media::SegmentTestBaseprotected
    cur_time_timescale_ (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBaseprotected
    output_file_name_ (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBaseprotected
    OutputFileName() const edash_packager::media::SegmentTestBaseprotected
    segment_template_ (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBaseprotected
    SegmentTestBase() (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBaseprotected
    SetUp() override (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBaseprotected
    KeyFrameFlag enum name (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBase
    kGenerateSideData enum value (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBase
    kKeyFrame enum value (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBase
    kNoSideData enum value (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBase
    kNotKeyFrame enum value (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBase
    output_file_name_ (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBaseprotected
    OutputFileName() const edash_packager::media::SegmentTestBaseprotected
    segment_template_ (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBaseprotected
    SegmentTestBase() (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBaseprotected
    SetUp() override (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBaseprotected
    SideDataFlag enum name (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBase
    single_segment_ (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBaseprotected
    TearDown() override (defined in edash_packager::media::SegmentTestBase)edash_packager::media::SegmentTestBaseprotected
    TemplateFileName(int number) const edash_packager::media::SegmentTestBaseprotected
    diff --git a/docs/da/d14/classedash__packager_1_1media_1_1webm_1_1Segmenter.html b/docs/da/d14/classedash__packager_1_1media_1_1webm_1_1Segmenter.html index a3e483c90a..fc5cf68722 100644 --- a/docs/da/d14/classedash__packager_1_1media_1_1webm_1_1Segmenter.html +++ b/docs/da/d14/classedash__packager_1_1media_1_1webm_1_1Segmenter.html @@ -253,7 +253,7 @@ virtual

    Converts the given time in ISO BMFF timescale to the current WebM timecode.

    -

    Definition at line 144 of file segmenter.cc.

    +

    Definition at line 161 of file segmenter.cc.

    @@ -271,7 +271,7 @@ virtual
    Returns
    The total length, in seconds, of segmented media files.
    -

    Definition at line 139 of file segmenter.cc.

    +

    Definition at line 156 of file segmenter.cc.

    @@ -413,7 +413,7 @@ virtual diff --git a/docs/da/d15/structedash__packager_1_1media_1_1mp4_1_1HandlerReference-members.html b/docs/da/d15/structedash__packager_1_1media_1_1mp4_1_1HandlerReference-members.html index 74f73a741b..dbedbcf890 100644 --- a/docs/da/d15/structedash__packager_1_1media_1_1mp4_1_1HandlerReference-members.html +++ b/docs/da/d15/structedash__packager_1_1media_1_1mp4_1_1HandlerReference-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d17/structedash__packager_1_1media_1_1mp4_1_1MovieExtendsHeader.html b/docs/da/d17/structedash__packager_1_1media_1_1mp4_1_1MovieExtendsHeader.html index 1b31440807..cf913f1d6f 100644 --- a/docs/da/d17/structedash__packager_1_1media_1_1mp4_1_1MovieExtendsHeader.html +++ b/docs/da/d17/structedash__packager_1_1media_1_1mp4_1_1MovieExtendsHeader.html @@ -145,7 +145,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 528 of file box_definitions.h.

    +

    Definition at line 535 of file box_definitions.h.

    Member Function Documentation

    @@ -171,7 +171,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1777 of file box_definitions.cc.

    +

    Definition at line 1798 of file box_definitions.cc.

    @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/da/d1e/classedash__packager_1_1media_1_1StreamInfo-members.html b/docs/da/d1e/classedash__packager_1_1media_1_1StreamInfo-members.html index b50bc1579d..e82d15929d 100644 --- a/docs/da/d1e/classedash__packager_1_1media_1_1StreamInfo-members.html +++ b/docs/da/d1e/classedash__packager_1_1media_1_1StreamInfo-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d22/key__rotation__fragmenter_8h_source.html b/docs/da/d22/key__rotation__fragmenter_8h_source.html index 598d1cec07..0acab376dc 100644 --- a/docs/da/d22/key__rotation__fragmenter_8h_source.html +++ b/docs/da/d22/key__rotation__fragmenter_8h_source.html @@ -149,13 +149,13 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    KeySource is responsible for encryption key acquisition.
    Definition: key_source.h:29
    - - + +
    KeyRotationFragmenter(MovieFragment *moof, TrackFragment *traf, KeySource *encryption_key_source, KeySource::TrackType track_type, int64_t crypto_period_duration, int64_t clear_time, VideoCodec video_codec, uint8_t nalu_length_size, MuxerListener *muxer_listener)
    diff --git a/docs/da/d27/classedash__packager_1_1media_1_1AudioStreamInfo.html b/docs/da/d27/classedash__packager_1_1media_1_1AudioStreamInfo.html index fdcdc4619a..28e0a1b985 100644 --- a/docs/da/d27/classedash__packager_1_1media_1_1AudioStreamInfo.html +++ b/docs/da/d27/classedash__packager_1_1media_1_1AudioStreamInfo.html @@ -199,7 +199,7 @@ Static Public Member Functions

    Detailed Description

    Holds audio stream information.

    -

    Definition at line 43 of file audio_stream_info.h.

    +

    Definition at line 34 of file audio_stream_info.h.

    Member Function Documentation

    @@ -240,7 +240,7 @@ Static Public Member Functions
    Returns
    The codec string.
    -

    Definition at line 113 of file audio_stream_info.cc.

    +

    Definition at line 95 of file audio_stream_info.cc.

    @@ -268,7 +268,7 @@ Static Public Member Functions

    Implements edash_packager::media::StreamInfo.

    -

    Definition at line 97 of file audio_stream_info.cc.

    +

    Definition at line 79 of file audio_stream_info.cc.

    @@ -296,7 +296,7 @@ Static Public Member Functions

    Reimplemented from edash_packager::media::StreamInfo.

    -

    Definition at line 105 of file audio_stream_info.cc.

    +

    Definition at line 87 of file audio_stream_info.cc.

    @@ -307,7 +307,7 @@ Static Public Member Functions diff --git a/docs/da/d2a/structedash__packager_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html b/docs/da/d2a/structedash__packager_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html index e38635c317..61c15263c9 100644 --- a/docs/da/d2a/structedash__packager_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html +++ b/docs/da/d2a/structedash__packager_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html @@ -177,7 +177,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 156 of file box_definitions.cc.

    +

    Definition at line 157 of file box_definitions.cc.

    @@ -188,7 +188,7 @@ Additional Inherited Members diff --git a/docs/da/d2a/text__stream__info_8h_source.html b/docs/da/d2a/text__stream__info_8h_source.html index 178fca7bd7..11c3285bf5 100644 --- a/docs/da/d2a/text__stream__info_8h_source.html +++ b/docs/da/d2a/text__stream__info_8h_source.html @@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d37/classedash__packager_1_1media_1_1IoCache-members.html b/docs/da/d37/classedash__packager_1_1media_1_1IoCache-members.html index 579f2d2fc0..640b0825c3 100644 --- a/docs/da/d37/classedash__packager_1_1media_1_1IoCache-members.html +++ b/docs/da/d37/classedash__packager_1_1media_1_1IoCache-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d38/classedash__packager_1_1MpdNotifier.html b/docs/da/d38/classedash__packager_1_1MpdNotifier.html index 86530a50b6..941b616376 100644 --- a/docs/da/d38/classedash__packager_1_1MpdNotifier.html +++ b/docs/da/d38/classedash__packager_1_1MpdNotifier.html @@ -472,7 +472,7 @@ Public Member Functions diff --git a/docs/da/d40/classedash__packager_1_1media_1_1RsaPrivateKey-members.html b/docs/da/d40/classedash__packager_1_1media_1_1RsaPrivateKey-members.html index 6b6172e271..0a550a4f68 100644 --- a/docs/da/d40/classedash__packager_1_1media_1_1RsaPrivateKey-members.html +++ b/docs/da/d40/classedash__packager_1_1media_1_1RsaPrivateKey-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d41/mp4_2multi__segment__segmenter_8h_source.html b/docs/da/d41/mp4_2multi__segment__segmenter_8h_source.html index d33208d366..4e119bb8bb 100644 --- a/docs/da/d41/mp4_2multi__segment__segmenter_8h_source.html +++ b/docs/da/d41/mp4_2multi__segment__segmenter_8h_source.html @@ -143,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d47/structedash__packager_1_1media_1_1H264PPS-members.html b/docs/da/d47/structedash__packager_1_1media_1_1H264PPS-members.html index e50fd44611..229cbd5008 100644 --- a/docs/da/d47/structedash__packager_1_1media_1_1H264PPS-members.html +++ b/docs/da/d47/structedash__packager_1_1media_1_1H264PPS-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d49/classedash__packager_1_1DashIopMpdNotifier.html b/docs/da/d49/classedash__packager_1_1DashIopMpdNotifier.html index 4d90a507a8..342e90fa76 100644 --- a/docs/da/d49/classedash__packager_1_1DashIopMpdNotifier.html +++ b/docs/da/d49/classedash__packager_1_1DashIopMpdNotifier.html @@ -473,7 +473,7 @@ class DashIopMpdNotifierTe diff --git a/docs/da/d4b/structedash__packager_1_1media_1_1mp4_1_1OriginalFormat.html b/docs/da/d4b/structedash__packager_1_1media_1_1mp4_1_1OriginalFormat.html index aad745a2bc..d612d2fb7e 100644 --- a/docs/da/d4b/structedash__packager_1_1media_1_1mp4_1_1OriginalFormat.html +++ b/docs/da/d4b/structedash__packager_1_1media_1_1mp4_1_1OriginalFormat.html @@ -162,7 +162,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 382 of file box_definitions.cc.

    +

    Definition at line 383 of file box_definitions.cc.

    @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/da/d54/structedash__packager_1_1media_1_1mp4_1_1CompositionTimeToSample.html b/docs/da/d54/structedash__packager_1_1media_1_1mp4_1_1CompositionTimeToSample.html index 2ef26e97fe..d3d822ff09 100644 --- a/docs/da/d54/structedash__packager_1_1media_1_1mp4_1_1CompositionTimeToSample.html +++ b/docs/da/d54/structedash__packager_1_1media_1_1mp4_1_1CompositionTimeToSample.html @@ -145,7 +145,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 382 of file box_definitions.h.

    +

    Definition at line 389 of file box_definitions.h.

    Member Function Documentation

    @@ -171,7 +171,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 667 of file box_definitions.cc.

    +

    Definition at line 668 of file box_definitions.cc.

    @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/da/d5c/widevine__key__source_8h_source.html b/docs/da/d5c/widevine__key__source_8h_source.html index d5289f1893..0368c48798 100644 --- a/docs/da/d5c/widevine__key__source_8h_source.html +++ b/docs/da/d5c/widevine__key__source_8h_source.html @@ -217,7 +217,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d5f/classedash__packager_1_1media_1_1VP9Parser.html b/docs/da/d5f/classedash__packager_1_1media_1_1VP9Parser.html index 8dd8fdfaa1..30d9cb9ec9 100644 --- a/docs/da/d5f/classedash__packager_1_1media_1_1VP9Parser.html +++ b/docs/da/d5f/classedash__packager_1_1media_1_1VP9Parser.html @@ -238,7 +238,7 @@ Additional Inherited Members diff --git a/docs/da/d60/structedash__packager_1_1media_1_1EncryptionKey-members.html b/docs/da/d60/structedash__packager_1_1media_1_1EncryptionKey-members.html index a494e51179..f82ddbcc09 100644 --- a/docs/da/d60/structedash__packager_1_1media_1_1EncryptionKey-members.html +++ b/docs/da/d60/structedash__packager_1_1media_1_1EncryptionKey-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d72/classedash__packager_1_1media_1_1mp2t_1_1EsParser-members.html b/docs/da/d72/classedash__packager_1_1media_1_1mp2t_1_1EsParser-members.html index 2530e6a6de..a7b284f1f2 100644 --- a/docs/da/d72/classedash__packager_1_1media_1_1mp2t_1_1EsParser-members.html +++ b/docs/da/d72/classedash__packager_1_1media_1_1mp2t_1_1EsParser-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d75/classedash__packager_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html b/docs/da/d75/classedash__packager_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html index d54fd5664e..ed71cf3b54 100644 --- a/docs/da/d75/classedash__packager_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html +++ b/docs/da/d75/classedash__packager_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html @@ -259,7 +259,7 @@ void set_progress_target diff --git a/docs/da/d78/structedash__packager_1_1media_1_1mp4_1_1Metadata-members.html b/docs/da/d78/structedash__packager_1_1media_1_1mp4_1_1Metadata-members.html index 1dade844f5..d577f27d12 100644 --- a/docs/da/d78/structedash__packager_1_1media_1_1mp4_1_1Metadata-members.html +++ b/docs/da/d78/structedash__packager_1_1media_1_1mp4_1_1Metadata-members.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d7a/classedash__packager_1_1media_1_1AVCDecoderConfiguration-members.html b/docs/da/d7a/classedash__packager_1_1media_1_1AVCDecoderConfiguration-members.html index fb7ac1add9..f4290e6f4f 100644 --- a/docs/da/d7a/classedash__packager_1_1media_1_1AVCDecoderConfiguration-members.html +++ b/docs/da/d7a/classedash__packager_1_1media_1_1AVCDecoderConfiguration-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d7a/fixed__key__encryption__flags_8h_source.html b/docs/da/d7a/fixed__key__encryption__flags_8h_source.html index 04180d7f3c..461b8478c2 100644 --- a/docs/da/d7a/fixed__key__encryption__flags_8h_source.html +++ b/docs/da/d7a/fixed__key__encryption__flags_8h_source.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d7d/classedash__packager_1_1media_1_1StreamDescriptorCompareFn.html b/docs/da/d7d/classedash__packager_1_1media_1_1StreamDescriptorCompareFn.html index 4dee5ace41..38246abc6c 100644 --- a/docs/da/d7d/classedash__packager_1_1media_1_1StreamDescriptorCompareFn.html +++ b/docs/da/d7d/classedash__packager_1_1media_1_1StreamDescriptorCompareFn.html @@ -109,7 +109,7 @@ bool operator() (const diff --git a/docs/da/d7f/hevc__decoder__configuration_8h_source.html b/docs/da/d7f/hevc__decoder__configuration_8h_source.html index f2a1588465..1a250e14c3 100644 --- a/docs/da/d7f/hevc__decoder__configuration_8h_source.html +++ b/docs/da/d7f/hevc__decoder__configuration_8h_source.html @@ -141,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d81/structedash__packager_1_1media_1_1mp4_1_1ChunkLargeOffset.html b/docs/da/d81/structedash__packager_1_1media_1_1mp4_1_1ChunkLargeOffset.html index 7d8bf3f266..b3fe4fff0d 100644 --- a/docs/da/d81/structedash__packager_1_1media_1_1mp4_1_1ChunkLargeOffset.html +++ b/docs/da/d81/structedash__packager_1_1media_1_1mp4_1_1ChunkLargeOffset.html @@ -146,7 +146,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 419 of file box_definitions.h.

    +

    Definition at line 426 of file box_definitions.h.

    Member Function Documentation

    @@ -174,7 +174,7 @@ Additional Inherited Members

    Reimplemented in edash_packager::media::mp4::ChunkOffset.

    -

    Definition at line 843 of file box_definitions.cc.

    +

    Definition at line 844 of file box_definitions.cc.

    @@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/da/d88/mp4__muxer_8cc_source.html b/docs/da/d88/mp4__muxer_8cc_source.html index 2c5325f44a..55881802f5 100644 --- a/docs/da/d88/mp4__muxer_8cc_source.html +++ b/docs/da/d88/mp4__muxer_8cc_source.html @@ -152,306 +152,311 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    63  switch (codec) {
    64  case kCodecAAC:
    65  return FOURCC_MP4A;
    -
    66  case kCodecDTSC:
    -
    67  return FOURCC_DTSC;
    -
    68  case kCodecDTSH:
    -
    69  return FOURCC_DTSH;
    -
    70  case kCodecDTSL:
    -
    71  return FOURCC_DTSL;
    -
    72  case kCodecDTSE:
    -
    73  return FOURCC_DTSE;
    -
    74  case kCodecDTSM:
    -
    75  return FOURCC_DTSM;
    -
    76  default:
    -
    77  return FOURCC_NULL;
    -
    78  }
    -
    79 }
    -
    80 
    -
    81 } // namespace
    +
    66  case kCodecAC3:
    +
    67  return FOURCC_AC3;
    +
    68  case kCodecDTSC:
    +
    69  return FOURCC_DTSC;
    +
    70  case kCodecDTSH:
    +
    71  return FOURCC_DTSH;
    +
    72  case kCodecDTSL:
    +
    73  return FOURCC_DTSL;
    +
    74  case kCodecDTSE:
    +
    75  return FOURCC_DTSE;
    +
    76  case kCodecDTSM:
    +
    77  return FOURCC_DTSM;
    +
    78  default:
    +
    79  return FOURCC_NULL;
    +
    80  }
    +
    81 }
    82 
    -
    83 MP4Muxer::MP4Muxer(const MuxerOptions& options) : Muxer(options) {}
    -
    84 MP4Muxer::~MP4Muxer() {}
    -
    85 
    -
    86 Status MP4Muxer::Initialize() {
    -
    87  DCHECK(!streams().empty());
    -
    88 
    -
    89  scoped_ptr<FileType> ftyp(new FileType);
    -
    90  scoped_ptr<Movie> moov(new Movie);
    -
    91 
    -
    92  ftyp->major_brand = FOURCC_DASH;
    -
    93  ftyp->compatible_brands.push_back(FOURCC_ISO6);
    -
    94  ftyp->compatible_brands.push_back(FOURCC_MP41);
    -
    95  if (streams().size() == 1 &&
    -
    96  streams()[0]->info()->stream_type() == kStreamVideo) {
    -
    97  const FourCC codec_fourcc = VideoCodecToFourCC(
    -
    98  static_cast<VideoStreamInfo*>(streams()[0]->info().get())->codec());
    -
    99  if (codec_fourcc != FOURCC_NULL)
    -
    100  ftyp->compatible_brands.push_back(codec_fourcc);
    -
    101  }
    -
    102 
    -
    103  moov->header.creation_time = IsoTimeNow();
    -
    104  moov->header.modification_time = IsoTimeNow();
    -
    105  moov->header.next_track_id = streams().size() + 1;
    -
    106 
    -
    107  moov->tracks.resize(streams().size());
    -
    108  moov->extends.tracks.resize(streams().size());
    -
    109 
    -
    110  // Initialize tracks.
    -
    111  for (uint32_t i = 0; i < streams().size(); ++i) {
    -
    112  Track& trak = moov->tracks[i];
    -
    113  trak.header.track_id = i + 1;
    -
    114 
    -
    115  TrackExtends& trex = moov->extends.tracks[i];
    -
    116  trex.track_id = trak.header.track_id;
    -
    117  trex.default_sample_description_index = 1;
    -
    118 
    -
    119  switch (streams()[i]->info()->stream_type()) {
    -
    120  case kStreamVideo:
    -
    121  GenerateVideoTrak(
    -
    122  static_cast<VideoStreamInfo*>(streams()[i]->info().get()),
    -
    123  &trak,
    -
    124  i + 1);
    -
    125  break;
    -
    126  case kStreamAudio:
    -
    127  GenerateAudioTrak(
    -
    128  static_cast<AudioStreamInfo*>(streams()[i]->info().get()),
    -
    129  &trak,
    -
    130  i + 1);
    -
    131  break;
    -
    132  default:
    -
    133  NOTIMPLEMENTED() << "Not implemented for stream type: "
    -
    134  << streams()[i]->info()->stream_type();
    -
    135  }
    -
    136  }
    -
    137 
    -
    138  if (options().single_segment) {
    -
    139  segmenter_.reset(
    -
    140  new SingleSegmentSegmenter(options(), ftyp.Pass(), moov.Pass()));
    -
    141  } else {
    -
    142  segmenter_.reset(
    -
    143  new MultiSegmentSegmenter(options(), ftyp.Pass(), moov.Pass()));
    -
    144  }
    -
    145 
    -
    146  Status segmenter_initialized =
    -
    147  segmenter_->Initialize(streams(),
    -
    148  muxer_listener(),
    -
    149  progress_listener(),
    -
    150  encryption_key_source(),
    -
    151  max_sd_pixels(),
    -
    152  clear_lead_in_seconds(),
    -
    153  crypto_period_duration_in_seconds());
    -
    154 
    -
    155  if (!segmenter_initialized.ok())
    -
    156  return segmenter_initialized;
    -
    157 
    -
    158  FireOnMediaStartEvent();
    -
    159  return Status::OK;
    -
    160 }
    -
    161 
    -
    162 Status MP4Muxer::Finalize() {
    -
    163  DCHECK(segmenter_);
    -
    164  Status segmenter_finalized = segmenter_->Finalize();
    -
    165 
    -
    166  if (!segmenter_finalized.ok())
    -
    167  return segmenter_finalized;
    -
    168 
    -
    169  FireOnMediaEndEvent();
    -
    170  LOG(INFO) << "MP4 file '" << options().output_file_name << "' finalized.";
    -
    171  return Status::OK;
    -
    172 }
    -
    173 
    -
    174 Status MP4Muxer::DoAddSample(const MediaStream* stream,
    -
    175  scoped_refptr<MediaSample> sample) {
    -
    176  DCHECK(segmenter_);
    -
    177  return segmenter_->AddSample(stream, sample);
    -
    178 }
    -
    179 
    -
    180 void MP4Muxer::InitializeTrak(const StreamInfo* info, Track* trak) {
    -
    181  int64_t now = IsoTimeNow();
    -
    182  trak->header.creation_time = now;
    -
    183  trak->header.modification_time = now;
    -
    184  trak->header.duration = 0;
    -
    185  trak->media.header.creation_time = now;
    -
    186  trak->media.header.modification_time = now;
    -
    187  trak->media.header.timescale = info->time_scale();
    -
    188  trak->media.header.duration = 0;
    -
    189  if (!info->language().empty()) {
    -
    190  // ISO-639-2/T language code should be 3 characters..
    -
    191  if (info->language().size() != 3) {
    -
    192  LOG(WARNING) << "'" << info->language() << "' is not a valid ISO-639-2 "
    -
    193  << "language code, ignoring.";
    -
    194  } else {
    -
    195  trak->media.header.language.code = info->language();
    -
    196  }
    -
    197  }
    -
    198 }
    -
    199 
    -
    200 void MP4Muxer::GenerateVideoTrak(const VideoStreamInfo* video_info,
    -
    201  Track* trak,
    -
    202  uint32_t track_id) {
    -
    203  InitializeTrak(video_info, trak);
    -
    204 
    -
    205  // width and height specify the track's visual presentation size as
    -
    206  // fixed-point 16.16 values.
    -
    207  uint32_t pixel_width = video_info->pixel_width();
    -
    208  uint32_t pixel_height = video_info->pixel_height();
    -
    209  if (pixel_width == 0 || pixel_height == 0) {
    -
    210  LOG(WARNING) << "pixel width/height are not set. Assuming 1:1.";
    -
    211  pixel_width = 1;
    -
    212  pixel_height = 1;
    -
    213  }
    -
    214  const double sample_aspect_ratio =
    -
    215  static_cast<double>(pixel_width) / pixel_height;
    -
    216  trak->header.width = video_info->width() * sample_aspect_ratio * 0x10000;
    -
    217  trak->header.height = video_info->height() * 0x10000;
    -
    218 
    -
    219  VideoSampleEntry video;
    -
    220  video.format = VideoCodecToFourCC(video_info->codec());
    -
    221  video.width = video_info->width();
    -
    222  video.height = video_info->height();
    -
    223  video.codec_config_record.data = video_info->extra_data();
    -
    224  if (pixel_width != 1 || pixel_height != 1) {
    -
    225  video.pixel_aspect.h_spacing = pixel_width;
    -
    226  video.pixel_aspect.v_spacing = pixel_height;
    -
    227  }
    -
    228 
    -
    229  SampleDescription& sample_description =
    -
    230  trak->media.information.sample_table.description;
    -
    231  sample_description.type = kVideo;
    -
    232  sample_description.video_entries.push_back(video);
    -
    233 }
    -
    234 
    -
    235 void MP4Muxer::GenerateAudioTrak(const AudioStreamInfo* audio_info,
    -
    236  Track* trak,
    -
    237  uint32_t track_id) {
    -
    238  InitializeTrak(audio_info, trak);
    -
    239 
    -
    240  trak->header.volume = 0x100;
    +
    83 } // namespace
    +
    84 
    +
    85 MP4Muxer::MP4Muxer(const MuxerOptions& options) : Muxer(options) {}
    +
    86 MP4Muxer::~MP4Muxer() {}
    +
    87 
    +
    88 Status MP4Muxer::Initialize() {
    +
    89  DCHECK(!streams().empty());
    +
    90 
    +
    91  scoped_ptr<FileType> ftyp(new FileType);
    +
    92  scoped_ptr<Movie> moov(new Movie);
    +
    93 
    +
    94  ftyp->major_brand = FOURCC_DASH;
    +
    95  ftyp->compatible_brands.push_back(FOURCC_ISO6);
    +
    96  ftyp->compatible_brands.push_back(FOURCC_MP41);
    +
    97  if (streams().size() == 1 &&
    +
    98  streams()[0]->info()->stream_type() == kStreamVideo) {
    +
    99  const FourCC codec_fourcc = VideoCodecToFourCC(
    +
    100  static_cast<VideoStreamInfo*>(streams()[0]->info().get())->codec());
    +
    101  if (codec_fourcc != FOURCC_NULL)
    +
    102  ftyp->compatible_brands.push_back(codec_fourcc);
    +
    103  }
    +
    104 
    +
    105  moov->header.creation_time = IsoTimeNow();
    +
    106  moov->header.modification_time = IsoTimeNow();
    +
    107  moov->header.next_track_id = streams().size() + 1;
    +
    108 
    +
    109  moov->tracks.resize(streams().size());
    +
    110  moov->extends.tracks.resize(streams().size());
    +
    111 
    +
    112  // Initialize tracks.
    +
    113  for (uint32_t i = 0; i < streams().size(); ++i) {
    +
    114  Track& trak = moov->tracks[i];
    +
    115  trak.header.track_id = i + 1;
    +
    116 
    +
    117  TrackExtends& trex = moov->extends.tracks[i];
    +
    118  trex.track_id = trak.header.track_id;
    +
    119  trex.default_sample_description_index = 1;
    +
    120 
    +
    121  switch (streams()[i]->info()->stream_type()) {
    +
    122  case kStreamVideo:
    +
    123  GenerateVideoTrak(
    +
    124  static_cast<VideoStreamInfo*>(streams()[i]->info().get()),
    +
    125  &trak,
    +
    126  i + 1);
    +
    127  break;
    +
    128  case kStreamAudio:
    +
    129  GenerateAudioTrak(
    +
    130  static_cast<AudioStreamInfo*>(streams()[i]->info().get()),
    +
    131  &trak,
    +
    132  i + 1);
    +
    133  break;
    +
    134  default:
    +
    135  NOTIMPLEMENTED() << "Not implemented for stream type: "
    +
    136  << streams()[i]->info()->stream_type();
    +
    137  }
    +
    138  }
    +
    139 
    +
    140  if (options().single_segment) {
    +
    141  segmenter_.reset(
    +
    142  new SingleSegmentSegmenter(options(), ftyp.Pass(), moov.Pass()));
    +
    143  } else {
    +
    144  segmenter_.reset(
    +
    145  new MultiSegmentSegmenter(options(), ftyp.Pass(), moov.Pass()));
    +
    146  }
    +
    147 
    +
    148  Status segmenter_initialized =
    +
    149  segmenter_->Initialize(streams(),
    +
    150  muxer_listener(),
    +
    151  progress_listener(),
    +
    152  encryption_key_source(),
    +
    153  max_sd_pixels(),
    +
    154  clear_lead_in_seconds(),
    +
    155  crypto_period_duration_in_seconds());
    +
    156 
    +
    157  if (!segmenter_initialized.ok())
    +
    158  return segmenter_initialized;
    +
    159 
    +
    160  FireOnMediaStartEvent();
    +
    161  return Status::OK;
    +
    162 }
    +
    163 
    +
    164 Status MP4Muxer::Finalize() {
    +
    165  DCHECK(segmenter_);
    +
    166  Status segmenter_finalized = segmenter_->Finalize();
    +
    167 
    +
    168  if (!segmenter_finalized.ok())
    +
    169  return segmenter_finalized;
    +
    170 
    +
    171  FireOnMediaEndEvent();
    +
    172  LOG(INFO) << "MP4 file '" << options().output_file_name << "' finalized.";
    +
    173  return Status::OK;
    +
    174 }
    +
    175 
    +
    176 Status MP4Muxer::DoAddSample(const MediaStream* stream,
    +
    177  scoped_refptr<MediaSample> sample) {
    +
    178  DCHECK(segmenter_);
    +
    179  return segmenter_->AddSample(stream, sample);
    +
    180 }
    +
    181 
    +
    182 void MP4Muxer::InitializeTrak(const StreamInfo* info, Track* trak) {
    +
    183  int64_t now = IsoTimeNow();
    +
    184  trak->header.creation_time = now;
    +
    185  trak->header.modification_time = now;
    +
    186  trak->header.duration = 0;
    +
    187  trak->media.header.creation_time = now;
    +
    188  trak->media.header.modification_time = now;
    +
    189  trak->media.header.timescale = info->time_scale();
    +
    190  trak->media.header.duration = 0;
    +
    191  if (!info->language().empty()) {
    +
    192  // ISO-639-2/T language code should be 3 characters..
    +
    193  if (info->language().size() != 3) {
    +
    194  LOG(WARNING) << "'" << info->language() << "' is not a valid ISO-639-2 "
    +
    195  << "language code, ignoring.";
    +
    196  } else {
    +
    197  trak->media.header.language.code = info->language();
    +
    198  }
    +
    199  }
    +
    200 }
    +
    201 
    +
    202 void MP4Muxer::GenerateVideoTrak(const VideoStreamInfo* video_info,
    +
    203  Track* trak,
    +
    204  uint32_t track_id) {
    +
    205  InitializeTrak(video_info, trak);
    +
    206 
    +
    207  // width and height specify the track's visual presentation size as
    +
    208  // fixed-point 16.16 values.
    +
    209  uint32_t pixel_width = video_info->pixel_width();
    +
    210  uint32_t pixel_height = video_info->pixel_height();
    +
    211  if (pixel_width == 0 || pixel_height == 0) {
    +
    212  LOG(WARNING) << "pixel width/height are not set. Assuming 1:1.";
    +
    213  pixel_width = 1;
    +
    214  pixel_height = 1;
    +
    215  }
    +
    216  const double sample_aspect_ratio =
    +
    217  static_cast<double>(pixel_width) / pixel_height;
    +
    218  trak->header.width = video_info->width() * sample_aspect_ratio * 0x10000;
    +
    219  trak->header.height = video_info->height() * 0x10000;
    +
    220 
    +
    221  VideoSampleEntry video;
    +
    222  video.format = VideoCodecToFourCC(video_info->codec());
    +
    223  video.width = video_info->width();
    +
    224  video.height = video_info->height();
    +
    225  video.codec_config_record.data = video_info->extra_data();
    +
    226  if (pixel_width != 1 || pixel_height != 1) {
    +
    227  video.pixel_aspect.h_spacing = pixel_width;
    +
    228  video.pixel_aspect.v_spacing = pixel_height;
    +
    229  }
    +
    230 
    +
    231  SampleDescription& sample_description =
    +
    232  trak->media.information.sample_table.description;
    +
    233  sample_description.type = kVideo;
    +
    234  sample_description.video_entries.push_back(video);
    +
    235 }
    +
    236 
    +
    237 void MP4Muxer::GenerateAudioTrak(const AudioStreamInfo* audio_info,
    +
    238  Track* trak,
    +
    239  uint32_t track_id) {
    +
    240  InitializeTrak(audio_info, trak);
    241 
    -
    242  AudioSampleEntry audio;
    -
    243  audio.format = AudioCodecToFourCC(audio_info->codec());
    -
    244  switch(audio_info->codec()){
    -
    245  case kCodecAAC:
    -
    246  audio.esds.es_descriptor.set_object_type(kISO_14496_3); // MPEG4 AAC.
    -
    247  audio.esds.es_descriptor.set_esid(track_id);
    -
    248  audio.esds.es_descriptor.set_decoder_specific_info(
    -
    249  audio_info->extra_data());
    -
    250  audio.esds.es_descriptor.set_max_bitrate(audio_info->max_bitrate());
    -
    251  audio.esds.es_descriptor.set_avg_bitrate(audio_info->avg_bitrate());
    -
    252  break;
    -
    253  case kCodecDTSC:
    -
    254  case kCodecDTSH:
    -
    255  case kCodecDTSL:
    -
    256  case kCodecDTSE:
    -
    257  case kCodecDTSM:
    -
    258  audio.ddts.extra_data = audio_info->extra_data();
    -
    259  audio.ddts.max_bitrate = audio_info->max_bitrate();
    -
    260  audio.ddts.avg_bitrate = audio_info->avg_bitrate();
    -
    261  audio.ddts.sampling_frequency = audio_info->sampling_frequency();
    -
    262  audio.ddts.pcm_sample_depth = audio_info->sample_bits();
    -
    263  break;
    -
    264  default:
    -
    265  NOTIMPLEMENTED();
    -
    266  break;
    -
    267  }
    -
    268 
    -
    269  audio.channelcount = audio_info->num_channels();
    -
    270  audio.samplesize = audio_info->sample_bits();
    -
    271  audio.samplerate = audio_info->sampling_frequency();
    -
    272  SampleDescription& sample_description =
    -
    273  trak->media.information.sample_table.description;
    -
    274  sample_description.type = kAudio;
    -
    275  sample_description.audio_entries.push_back(audio);
    -
    276 }
    -
    277 
    -
    278 bool MP4Muxer::GetInitRangeStartAndEnd(uint32_t* start, uint32_t* end) {
    -
    279  DCHECK(start && end);
    -
    280  size_t range_offset = 0;
    -
    281  size_t range_size = 0;
    -
    282  const bool has_range = segmenter_->GetInitRange(&range_offset, &range_size);
    -
    283 
    -
    284  if (!has_range)
    -
    285  return false;
    -
    286 
    -
    287  SetStartAndEndFromOffsetAndSize(range_offset, range_size, start, end);
    -
    288  return true;
    -
    289 }
    -
    290 
    -
    291 bool MP4Muxer::GetIndexRangeStartAndEnd(uint32_t* start, uint32_t* end) {
    -
    292  DCHECK(start && end);
    -
    293  size_t range_offset = 0;
    -
    294  size_t range_size = 0;
    -
    295  const bool has_range = segmenter_->GetIndexRange(&range_offset, &range_size);
    -
    296 
    -
    297  if (!has_range)
    -
    298  return false;
    -
    299 
    -
    300  SetStartAndEndFromOffsetAndSize(range_offset, range_size, start, end);
    -
    301  return true;
    -
    302 }
    -
    303 
    -
    304 void MP4Muxer::FireOnMediaStartEvent() {
    -
    305  if (!muxer_listener())
    -
    306  return;
    -
    307 
    -
    308  if (streams().size() > 1) {
    -
    309  LOG(ERROR) << "MuxerListener cannot take more than 1 stream.";
    -
    310  return;
    -
    311  }
    -
    312  DCHECK(!streams().empty()) << "Media started without a stream.";
    -
    313 
    -
    314  const uint32_t timescale = segmenter_->GetReferenceTimeScale();
    -
    315  muxer_listener()->OnMediaStart(options(),
    -
    316  *streams().front()->info(),
    -
    317  timescale,
    -
    318  MuxerListener::kContainerMp4);
    -
    319 }
    -
    320 
    -
    321 void MP4Muxer::FireOnMediaEndEvent() {
    -
    322  if (!muxer_listener())
    -
    323  return;
    -
    324 
    -
    325  uint32_t init_range_start = 0;
    -
    326  uint32_t init_range_end = 0;
    -
    327  const bool has_init_range =
    -
    328  GetInitRangeStartAndEnd(&init_range_start, &init_range_end);
    +
    242  trak->header.volume = 0x100;
    +
    243 
    +
    244  AudioSampleEntry audio;
    +
    245  audio.format = AudioCodecToFourCC(audio_info->codec());
    +
    246  switch(audio_info->codec()){
    +
    247  case kCodecAAC:
    +
    248  audio.esds.es_descriptor.set_object_type(kISO_14496_3); // MPEG4 AAC.
    +
    249  audio.esds.es_descriptor.set_esid(track_id);
    +
    250  audio.esds.es_descriptor.set_decoder_specific_info(
    +
    251  audio_info->extra_data());
    +
    252  audio.esds.es_descriptor.set_max_bitrate(audio_info->max_bitrate());
    +
    253  audio.esds.es_descriptor.set_avg_bitrate(audio_info->avg_bitrate());
    +
    254  break;
    +
    255  case kCodecDTSC:
    +
    256  case kCodecDTSH:
    +
    257  case kCodecDTSL:
    +
    258  case kCodecDTSE:
    +
    259  case kCodecDTSM:
    +
    260  audio.ddts.extra_data = audio_info->extra_data();
    +
    261  audio.ddts.max_bitrate = audio_info->max_bitrate();
    +
    262  audio.ddts.avg_bitrate = audio_info->avg_bitrate();
    +
    263  audio.ddts.sampling_frequency = audio_info->sampling_frequency();
    +
    264  audio.ddts.pcm_sample_depth = audio_info->sample_bits();
    +
    265  break;
    +
    266  case kCodecAC3:
    +
    267  audio.dac3.data = audio_info->extra_data();
    +
    268  break;
    +
    269  default:
    +
    270  NOTIMPLEMENTED();
    +
    271  break;
    +
    272  }
    +
    273 
    +
    274  audio.channelcount = audio_info->num_channels();
    +
    275  audio.samplesize = audio_info->sample_bits();
    +
    276  audio.samplerate = audio_info->sampling_frequency();
    +
    277  SampleDescription& sample_description =
    +
    278  trak->media.information.sample_table.description;
    +
    279  sample_description.type = kAudio;
    +
    280  sample_description.audio_entries.push_back(audio);
    +
    281 }
    +
    282 
    +
    283 bool MP4Muxer::GetInitRangeStartAndEnd(uint32_t* start, uint32_t* end) {
    +
    284  DCHECK(start && end);
    +
    285  size_t range_offset = 0;
    +
    286  size_t range_size = 0;
    +
    287  const bool has_range = segmenter_->GetInitRange(&range_offset, &range_size);
    +
    288 
    +
    289  if (!has_range)
    +
    290  return false;
    +
    291 
    +
    292  SetStartAndEndFromOffsetAndSize(range_offset, range_size, start, end);
    +
    293  return true;
    +
    294 }
    +
    295 
    +
    296 bool MP4Muxer::GetIndexRangeStartAndEnd(uint32_t* start, uint32_t* end) {
    +
    297  DCHECK(start && end);
    +
    298  size_t range_offset = 0;
    +
    299  size_t range_size = 0;
    +
    300  const bool has_range = segmenter_->GetIndexRange(&range_offset, &range_size);
    +
    301 
    +
    302  if (!has_range)
    +
    303  return false;
    +
    304 
    +
    305  SetStartAndEndFromOffsetAndSize(range_offset, range_size, start, end);
    +
    306  return true;
    +
    307 }
    +
    308 
    +
    309 void MP4Muxer::FireOnMediaStartEvent() {
    +
    310  if (!muxer_listener())
    +
    311  return;
    +
    312 
    +
    313  if (streams().size() > 1) {
    +
    314  LOG(ERROR) << "MuxerListener cannot take more than 1 stream.";
    +
    315  return;
    +
    316  }
    +
    317  DCHECK(!streams().empty()) << "Media started without a stream.";
    +
    318 
    +
    319  const uint32_t timescale = segmenter_->GetReferenceTimeScale();
    +
    320  muxer_listener()->OnMediaStart(options(),
    +
    321  *streams().front()->info(),
    +
    322  timescale,
    +
    323  MuxerListener::kContainerMp4);
    +
    324 }
    +
    325 
    +
    326 void MP4Muxer::FireOnMediaEndEvent() {
    +
    327  if (!muxer_listener())
    +
    328  return;
    329 
    -
    330  uint32_t index_range_start = 0;
    -
    331  uint32_t index_range_end = 0;
    -
    332  const bool has_index_range =
    -
    333  GetIndexRangeStartAndEnd(&index_range_start, &index_range_end);
    +
    330  uint32_t init_range_start = 0;
    +
    331  uint32_t init_range_end = 0;
    +
    332  const bool has_init_range =
    +
    333  GetInitRangeStartAndEnd(&init_range_start, &init_range_end);
    334 
    -
    335  const float duration_seconds = static_cast<float>(segmenter_->GetDuration());
    -
    336 
    -
    337  const int64_t file_size =
    -
    338  File::GetFileSize(options().output_file_name.c_str());
    -
    339  if (file_size <= 0) {
    -
    340  LOG(ERROR) << "Invalid file size: " << file_size;
    -
    341  return;
    -
    342  }
    -
    343 
    -
    344  muxer_listener()->OnMediaEnd(has_init_range,
    -
    345  init_range_start,
    -
    346  init_range_end,
    -
    347  has_index_range,
    -
    348  index_range_start,
    -
    349  index_range_end,
    -
    350  duration_seconds,
    -
    351  file_size);
    -
    352 }
    -
    353 
    -
    354 uint64_t MP4Muxer::IsoTimeNow() {
    -
    355  // Time in seconds from Jan. 1, 1904 to epoch time, i.e. Jan. 1, 1970.
    -
    356  const uint64_t kIsomTimeOffset = 2082844800l;
    -
    357  return kIsomTimeOffset +
    -
    358  (clock() ? clock()->Now() : base::Time::Now()).ToDoubleT();
    -
    359 }
    -
    360 
    -
    361 } // namespace mp4
    -
    362 } // namespace media
    -
    363 } // namespace edash_packager
    +
    335  uint32_t index_range_start = 0;
    +
    336  uint32_t index_range_end = 0;
    +
    337  const bool has_index_range =
    +
    338  GetIndexRangeStartAndEnd(&index_range_start, &index_range_end);
    +
    339 
    +
    340  const float duration_seconds = static_cast<float>(segmenter_->GetDuration());
    +
    341 
    +
    342  const int64_t file_size =
    +
    343  File::GetFileSize(options().output_file_name.c_str());
    +
    344  if (file_size <= 0) {
    +
    345  LOG(ERROR) << "Invalid file size: " << file_size;
    +
    346  return;
    +
    347  }
    +
    348 
    +
    349  muxer_listener()->OnMediaEnd(has_init_range,
    +
    350  init_range_start,
    +
    351  init_range_end,
    +
    352  has_index_range,
    +
    353  index_range_start,
    +
    354  index_range_end,
    +
    355  duration_seconds,
    +
    356  file_size);
    +
    357 }
    +
    358 
    +
    359 uint64_t MP4Muxer::IsoTimeNow() {
    +
    360  // Time in seconds from Jan. 1, 1904 to epoch time, i.e. Jan. 1, 1970.
    +
    361  const uint64_t kIsomTimeOffset = 2082844800l;
    +
    362  return kIsomTimeOffset +
    +
    363  (clock() ? clock()->Now() : base::Time::Now()).ToDoubleT();
    +
    364 }
    +
    365 
    +
    366 } // namespace mp4
    +
    367 } // namespace media
    +
    368 } // namespace edash_packager
    -
    MP4Muxer(const MuxerOptions &options)
    Create a MP4Muxer object from MuxerOptions.
    Definition: mp4_muxer.cc:83
    +
    MP4Muxer(const MuxerOptions &options)
    Create a MP4Muxer object from MuxerOptions.
    Definition: mp4_muxer.cc:85
    This structure contains the list of configuration options for Muxer.
    Definition: muxer_options.h:18
    @@ -459,7 +464,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d8e/container__names_8cc_source.html b/docs/da/d8e/container__names_8cc_source.html index 47a2c3e344..9f321d7d40 100644 --- a/docs/da/d8e/container__names_8cc_source.html +++ b/docs/da/d8e/container__names_8cc_source.html @@ -1840,7 +1840,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/d95/classedash__packager_1_1media_1_1MkvWriter-members.html b/docs/da/d95/classedash__packager_1_1media_1_1MkvWriter-members.html index c394fa4907..7c3e25cef1 100644 --- a/docs/da/d95/classedash__packager_1_1media_1_1MkvWriter-members.html +++ b/docs/da/d95/classedash__packager_1_1media_1_1MkvWriter-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/db0/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader.html b/docs/da/db0/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader.html index 38f251147f..34bb472681 100644 --- a/docs/da/db0/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader.html +++ b/docs/da/db0/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader.html @@ -145,7 +145,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 471 of file box_definitions.h.

    +

    Definition at line 478 of file box_definitions.h.

    Member Function Documentation

    @@ -171,7 +171,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1592 of file box_definitions.cc.

    +

    Definition at line 1613 of file box_definitions.cc.

    @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/da/dc3/status_8cc_source.html b/docs/da/dc3/status_8cc_source.html index 48043501c7..cf57d30fc5 100644 --- a/docs/da/dc3/status_8cc_source.html +++ b/docs/da/dc3/status_8cc_source.html @@ -168,7 +168,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dcb/es__descriptor_8h_source.html b/docs/da/dcb/es__descriptor_8h_source.html index fbbc8177c9..a47e141a7d 100644 --- a/docs/da/dcb/es__descriptor_8h_source.html +++ b/docs/da/dcb/es__descriptor_8h_source.html @@ -187,7 +187,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dd0/webm__info__parser_8h_source.html b/docs/da/dd0/webm__info__parser_8h_source.html index 62d9eee106..9545e8bf35 100644 --- a/docs/da/dd0/webm__info__parser_8h_source.html +++ b/docs/da/dd0/webm__info__parser_8h_source.html @@ -138,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/dd1/fragmenter_8h_source.html b/docs/da/dd1/fragmenter_8h_source.html index 0393ea86c2..dbaa8e6e24 100644 --- a/docs/da/dd1/fragmenter_8h_source.html +++ b/docs/da/dd1/fragmenter_8h_source.html @@ -185,19 +185,19 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    111 #endif // MEDIA_FORMATS_MP4_FRAGMENTER_H_
    -
    void GenerateSegmentReference(SegmentReference *reference)
    Fill reference with current fragment information.
    Definition: fragmenter.cc:117
    +
    void GenerateSegmentReference(SegmentReference *reference)
    Fill reference with current fragment information.
    Definition: fragmenter.cc:120
    -
    virtual Status InitializeFragment(int64_t first_sample_dts)
    Definition: fragmenter.cc:73
    +
    virtual Status InitializeFragment(int64_t first_sample_dts)
    Definition: fragmenter.cc:76
    virtual Status AddSample(scoped_refptr< MediaSample > sample)
    Definition: fragmenter.cc:36
    - +
    bool OptimizeSampleEntries(std::vector< T > *entries, T *default_value)
    Definition: fragmenter.h:89
    - -
    virtual void FinalizeFragment()
    Finalize and optimize the fragment.
    Definition: fragmenter.cc:90
    + +
    virtual void FinalizeFragment()
    Finalize and optimize the fragment.
    Definition: fragmenter.cc:93
    diff --git a/docs/da/de2/mock__mpd__builder_8cc_source.html b/docs/da/de2/mock__mpd__builder_8cc_source.html index 10c2172975..cc076c0bb1 100644 --- a/docs/da/de2/mock__mpd__builder_8cc_source.html +++ b/docs/da/de2/mock__mpd__builder_8cc_source.html @@ -123,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/da/de4/classedash__packager_1_1media_1_1AudioTimestampHelper.html b/docs/da/de4/classedash__packager_1_1media_1_1AudioTimestampHelper.html index 7f1d982ca6..f7b2157c46 100644 --- a/docs/da/de4/classedash__packager_1_1media_1_1AudioTimestampHelper.html +++ b/docs/da/de4/classedash__packager_1_1media_1_1AudioTimestampHelper.html @@ -131,7 +131,7 @@ int64_t GetFramesToTarget< diff --git a/docs/da/dfe/structedash__packager_1_1media_1_1mp4_1_1CompositionOffset.html b/docs/da/dfe/structedash__packager_1_1media_1_1mp4_1_1CompositionOffset.html index 94964210a0..5122033aa6 100644 --- a/docs/da/dfe/structedash__packager_1_1media_1_1mp4_1_1CompositionOffset.html +++ b/docs/da/dfe/structedash__packager_1_1media_1_1mp4_1_1CompositionOffset.html @@ -105,14 +105,14 @@ int64_t sample_offset<

    Detailed Description

    -

    Definition at line 373 of file box_definitions.h.

    +

    Definition at line 380 of file box_definitions.h.


    The documentation for this struct was generated from the following file: diff --git a/docs/db/d01/avc__decoder__configuration_8cc_source.html b/docs/db/d01/avc__decoder__configuration_8cc_source.html index f1a16539e6..9ca051698d 100644 --- a/docs/db/d01/avc__decoder__configuration_8cc_source.html +++ b/docs/db/d01/avc__decoder__configuration_8cc_source.html @@ -171,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d01/classedash__packager_1_1media_1_1mp4_1_1SyncSampleIterator.html b/docs/db/d01/classedash__packager_1_1media_1_1mp4_1_1SyncSampleIterator.html index 8a0d614090..aa49919783 100644 --- a/docs/db/d01/classedash__packager_1_1media_1_1mp4_1_1SyncSampleIterator.html +++ b/docs/db/d01/classedash__packager_1_1media_1_1mp4_1_1SyncSampleIterator.html @@ -177,7 +177,7 @@ Public Member Functions diff --git a/docs/db/d09/namespaceedash__packager.html b/docs/db/d09/namespaceedash__packager.html index 4d5f324340..999be038c9 100644 --- a/docs/db/d09/namespaceedash__packager.html +++ b/docs/db/d09/namespaceedash__packager.html @@ -550,7 +550,7 @@ const char kEncryptedMp4Va diff --git a/docs/db/d11/classedash__packager_1_1media_1_1ContentEncoding-members.html b/docs/db/d11/classedash__packager_1_1media_1_1ContentEncoding-members.html index 14dbe068fe..5c7ed4b99d 100644 --- a/docs/db/d11/classedash__packager_1_1media_1_1ContentEncoding-members.html +++ b/docs/db/d11/classedash__packager_1_1media_1_1ContentEncoding-members.html @@ -132,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d15/structedash__packager_1_1media_1_1mp4_1_1DecodingTimeToSample-members.html b/docs/db/d15/structedash__packager_1_1media_1_1mp4_1_1DecodingTimeToSample-members.html index 1d05f70cf1..2d57f5fc21 100644 --- a/docs/db/d15/structedash__packager_1_1media_1_1mp4_1_1DecodingTimeToSample-members.html +++ b/docs/db/d15/structedash__packager_1_1media_1_1mp4_1_1DecodingTimeToSample-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d23/classedash__packager_1_1media_1_1WebMTracksParser.html b/docs/db/d23/classedash__packager_1_1media_1_1WebMTracksParser.html index 5634abe98e..b45e12090c 100644 --- a/docs/db/d23/classedash__packager_1_1media_1_1WebMTracksParser.html +++ b/docs/db/d23/classedash__packager_1_1media_1_1WebMTracksParser.html @@ -225,7 +225,7 @@ The number of bytes parsed on success. diff --git a/docs/db/d26/classedash__packager_1_1media_1_1mp4_1_1TrackRunIterator.html b/docs/db/d26/classedash__packager_1_1media_1_1mp4_1_1TrackRunIterator.html index 96460f4faa..aaf75396df 100644 --- a/docs/db/d26/classedash__packager_1_1media_1_1mp4_1_1TrackRunIterator.html +++ b/docs/db/d26/classedash__packager_1_1media_1_1mp4_1_1TrackRunIterator.html @@ -412,7 +412,7 @@ bool is_keyframe () co diff --git a/docs/db/d2e/classedash__packager_1_1MockMpdBuilder.html b/docs/db/d2e/classedash__packager_1_1MockMpdBuilder.html index 8eb758f3bd..bfae0ea433 100644 --- a/docs/db/d2e/classedash__packager_1_1MockMpdBuilder.html +++ b/docs/db/d2e/classedash__packager_1_1MockMpdBuilder.html @@ -149,7 +149,7 @@ Additional Inherited Members diff --git a/docs/db/d31/track__run__iterator_8cc_source.html b/docs/db/d31/track__run__iterator_8cc_source.html index 14e68ab03f..5952ea7223 100644 --- a/docs/db/d31/track__run__iterator_8cc_source.html +++ b/docs/db/d31/track__run__iterator_8cc_source.html @@ -701,9 +701,9 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - +
    scoped_ptr< DecryptConfig > GetDecryptConfig()
    -
    bool ParseFromSampleEncryptionData(size_t iv_size, std::vector< SampleEncryptionEntry > *sample_encryption_entries) const
    +
    bool ParseFromSampleEncryptionData(size_t iv_size, std::vector< SampleEncryptionEntry > *sample_encryption_entries) const
    bool CacheAuxInfo(const uint8_t *buf, int size)
    @@ -714,12 +714,12 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - +
    uint32_t NumSamples(uint32_t start_chunk, uint32_t end_chunk) const
    - + @@ -728,26 +728,26 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - - + + - + - + - - + + diff --git a/docs/db/d44/structedash__packager_1_1media_1_1mp4_1_1DataReference-members.html b/docs/db/d44/structedash__packager_1_1media_1_1mp4_1_1DataReference-members.html index bf181ecc19..5eb9b78860 100644 --- a/docs/db/d44/structedash__packager_1_1media_1_1mp4_1_1DataReference-members.html +++ b/docs/db/d44/structedash__packager_1_1media_1_1mp4_1_1DataReference-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d45/mpd__notify__muxer__listener_8h_source.html b/docs/db/d45/mpd__notify__muxer__listener_8h_source.html index e0a969b41f..0b978e4d43 100644 --- a/docs/db/d45/mpd__notify__muxer__listener_8h_source.html +++ b/docs/db/d45/mpd__notify__muxer__listener_8h_source.html @@ -186,7 +186,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d4e/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPsi.html b/docs/db/d4e/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPsi.html index 695fa9afe6..c07b9cb060 100644 --- a/docs/db/d4e/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPsi.html +++ b/docs/db/d4e/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPsi.html @@ -147,7 +147,7 @@ Additional Inherited Members diff --git a/docs/db/d51/mp2t__media__parser_8h_source.html b/docs/db/d51/mp2t__media__parser_8h_source.html index c38320fa88..6a200c72a4 100644 --- a/docs/db/d51/mp2t__media__parser_8h_source.html +++ b/docs/db/d51/mp2t__media__parser_8h_source.html @@ -195,7 +195,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d51/two__pass__single__segment__segmenter_8h_source.html b/docs/db/d51/two__pass__single__segment__segmenter_8h_source.html index 13262db6c8..8f1308d65c 100644 --- a/docs/db/d51/two__pass__single__segment__segmenter_8h_source.html +++ b/docs/db/d51/two__pass__single__segment__segmenter_8h_source.html @@ -145,7 +145,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d56/classedash__packager_1_1SimpleMpdNotifier.html b/docs/db/d56/classedash__packager_1_1SimpleMpdNotifier.html index 22aa362ec3..36404a4c1b 100644 --- a/docs/db/d56/classedash__packager_1_1SimpleMpdNotifier.html +++ b/docs/db/d56/classedash__packager_1_1SimpleMpdNotifier.html @@ -471,7 +471,7 @@ class SimpleMpdNotifierTes diff --git a/docs/db/d5a/structedash__packager_1_1media_1_1mp4_1_1SampleEncryptionEntry-members.html b/docs/db/d5a/structedash__packager_1_1media_1_1mp4_1_1SampleEncryptionEntry-members.html index d0fe3ecf59..d82f867c37 100644 --- a/docs/db/d5a/structedash__packager_1_1media_1_1mp4_1_1SampleEncryptionEntry-members.html +++ b/docs/db/d5a/structedash__packager_1_1media_1_1mp4_1_1SampleEncryptionEntry-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d5b/classedash__packager_1_1media_1_1HEVCDecoderConfiguration-members.html b/docs/db/d5b/classedash__packager_1_1media_1_1HEVCDecoderConfiguration-members.html index 4832543eb6..c69e055339 100644 --- a/docs/db/d5b/classedash__packager_1_1media_1_1HEVCDecoderConfiguration-members.html +++ b/docs/db/d5b/classedash__packager_1_1media_1_1HEVCDecoderConfiguration-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d60/mpd__options_8h_source.html b/docs/db/d60/mpd__options_8h_source.html index 424536d4a9..5da5eb2e96 100644 --- a/docs/db/d60/mpd__options_8h_source.html +++ b/docs/db/d60/mpd__options_8h_source.html @@ -130,7 +130,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d61/classedash__packager_1_1media_1_1mp4_1_1SingleSegmentSegmenter-members.html b/docs/db/d61/classedash__packager_1_1media_1_1mp4_1_1SingleSegmentSegmenter-members.html index 8699d82fdd..cd1fc927c3 100644 --- a/docs/db/d61/classedash__packager_1_1media_1_1mp4_1_1SingleSegmentSegmenter-members.html +++ b/docs/db/d61/classedash__packager_1_1media_1_1mp4_1_1SingleSegmentSegmenter-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d64/webvtt__media__parser_8h_source.html b/docs/db/d64/webvtt__media__parser_8h_source.html index 380541126b..452244c708 100644 --- a/docs/db/d64/webvtt__media__parser_8h_source.html +++ b/docs/db/d64/webvtt__media__parser_8h_source.html @@ -180,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d69/classedash__packager_1_1media_1_1mp2t_1_1AdtsHeader.html b/docs/db/d69/classedash__packager_1_1media_1_1mp2t_1_1AdtsHeader.html index 638d4856e0..271aaff768 100644 --- a/docs/db/d69/classedash__packager_1_1media_1_1mp2t_1_1AdtsHeader.html +++ b/docs/db/d69/classedash__packager_1_1media_1_1mp2t_1_1AdtsHeader.html @@ -336,7 +336,7 @@ Static Public Member Functions diff --git a/docs/db/d6b/structedash__packager_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html b/docs/db/d6b/structedash__packager_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html index 99ea1ea316..58c2a7b123 100644 --- a/docs/db/d6b/structedash__packager_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html +++ b/docs/db/d6b/structedash__packager_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html @@ -136,7 +136,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 747 of file box_definitions.h.

    +

    Definition at line 754 of file box_definitions.h.

    Member Function Documentation

    @@ -162,7 +162,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 2472 of file box_definitions.cc.

    +

    Definition at line 2493 of file box_definitions.cc.

    @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/db/d6c/classedash__packager_1_1media_1_1mp4_1_1BoxReader.html b/docs/db/d6c/classedash__packager_1_1media_1_1mp4_1_1BoxReader.html index e8e2bfa135..eea66feab2 100644 --- a/docs/db/d6c/classedash__packager_1_1media_1_1mp4_1_1BoxReader.html +++ b/docs/db/d6c/classedash__packager_1_1media_1_1mp4_1_1BoxReader.html @@ -497,7 +497,7 @@ template<typename T > diff --git a/docs/db/d71/http__key__fetcher_8h_source.html b/docs/db/d71/http__key__fetcher_8h_source.html index d212c138b3..bc725c9900 100644 --- a/docs/db/d71/http__key__fetcher_8h_source.html +++ b/docs/db/d71/http__key__fetcher_8h_source.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d79/structedash__packager_1_1media_1_1mp4_1_1EditListEntry-members.html b/docs/db/d79/structedash__packager_1_1media_1_1mp4_1_1EditListEntry-members.html index 2ba1f5b39c..f545a27fd1 100644 --- a/docs/db/d79/structedash__packager_1_1media_1_1mp4_1_1EditListEntry-members.html +++ b/docs/db/d79/structedash__packager_1_1media_1_1mp4_1_1EditListEntry-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d7e/muxer__options_8cc_source.html b/docs/db/d7e/muxer__options_8cc_source.html index d66eb6b1a6..9d7d5f23a8 100644 --- a/docs/db/d7e/muxer__options_8cc_source.html +++ b/docs/db/d7e/muxer__options_8cc_source.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d89/structedash__packager_1_1media_1_1mp4_1_1CompactSampleSize.html b/docs/db/d89/structedash__packager_1_1media_1_1mp4_1_1CompactSampleSize.html index d53a4c7a02..ced6308b8e 100644 --- a/docs/db/d89/structedash__packager_1_1media_1_1mp4_1_1CompactSampleSize.html +++ b/docs/db/d89/structedash__packager_1_1media_1_1mp4_1_1CompactSampleSize.html @@ -148,7 +148,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 411 of file box_definitions.h.

    +

    Definition at line 418 of file box_definitions.h.

    Member Function Documentation

    @@ -174,7 +174,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 769 of file box_definitions.cc.

    +

    Definition at line 770 of file box_definitions.cc.

    @@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/db/d8f/mp4__muxer_8h_source.html b/docs/db/d8f/mp4__muxer_8h_source.html index 20dc3b3ae9..a7383f6610 100644 --- a/docs/db/d8f/mp4__muxer_8h_source.html +++ b/docs/db/d8f/mp4__muxer_8h_source.html @@ -162,20 +162,20 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    76 } // namespace edash_packager
    77 
    78 #endif // MEDIA_FORMATS_MP4_MP4_MUXER_H_
    -
    MP4Muxer(const MuxerOptions &options)
    Create a MP4Muxer object from MuxerOptions.
    Definition: mp4_muxer.cc:83
    -
    Holds audio stream information.
    +
    MP4Muxer(const MuxerOptions &options)
    Create a MP4Muxer object from MuxerOptions.
    Definition: mp4_muxer.cc:85
    +
    Holds audio stream information.
    Abstract class holds stream information.
    Definition: stream_info.h:26
    Holds video stream information.
    - +
    This structure contains the list of configuration options for Muxer.
    Definition: muxer_options.h:18
    diff --git a/docs/db/d96/wvm__media__parser_8h_source.html b/docs/db/d96/wvm__media__parser_8h_source.html index 6b76614093..50a5b32531 100644 --- a/docs/db/d96/wvm__media__parser_8h_source.html +++ b/docs/db/d96/wvm__media__parser_8h_source.html @@ -365,7 +365,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/d97/classedash__packager_1_1media_1_1WebMContentEncodingsClient-members.html b/docs/db/d97/classedash__packager_1_1media_1_1WebMContentEncodingsClient-members.html index 59ddf0c8fb..acb0b7733a 100644 --- a/docs/db/d97/classedash__packager_1_1media_1_1WebMContentEncodingsClient-members.html +++ b/docs/db/d97/classedash__packager_1_1media_1_1WebMContentEncodingsClient-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/da0/classedash__packager_1_1media_1_1WebMClusterParser.html b/docs/db/da0/classedash__packager_1_1media_1_1WebMClusterParser.html index 8072062372..ec7879c385 100644 --- a/docs/db/da0/classedash__packager_1_1media_1_1WebMClusterParser.html +++ b/docs/db/da0/classedash__packager_1_1media_1_1WebMClusterParser.html @@ -292,7 +292,7 @@ The number of bytes parsed on success. diff --git a/docs/db/da4/classBandwidthEstimator-members.html b/docs/db/da4/classBandwidthEstimator-members.html index 18f9199a1a..39220945a9 100644 --- a/docs/db/da4/classBandwidthEstimator-members.html +++ b/docs/db/da4/classBandwidthEstimator-members.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/da4/classedash__packager_1_1media_1_1WidevineKeySource.html b/docs/db/da4/classedash__packager_1_1media_1_1WidevineKeySource.html index 88559bedc6..22e32f5635 100644 --- a/docs/db/da4/classedash__packager_1_1media_1_1WidevineKeySource.html +++ b/docs/db/da4/classedash__packager_1_1media_1_1WidevineKeySource.html @@ -559,7 +559,7 @@ static std::string  diff --git a/docs/db/da5/structedash__packager_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry-members.html b/docs/db/da5/structedash__packager_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry-members.html index 7126fcd5dd..6aaaabdbd6 100644 --- a/docs/db/da5/structedash__packager_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry-members.html +++ b/docs/db/da5/structedash__packager_1_1media_1_1mp4_1_1CencSampleEncryptionInfoEntry-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/da6/memory__file_8h_source.html b/docs/db/da6/memory__file_8h_source.html index f241593020..f090a92dc6 100644 --- a/docs/db/da6/memory__file_8h_source.html +++ b/docs/db/da6/memory__file_8h_source.html @@ -154,7 +154,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dae/classedash__packager_1_1media_1_1mp4_1_1Fragmenter.html b/docs/db/dae/classedash__packager_1_1media_1_1mp4_1_1Fragmenter.html index 5f5676baa6..b4ed2b2359 100644 --- a/docs/db/dae/classedash__packager_1_1media_1_1mp4_1_1Fragmenter.html +++ b/docs/db/dae/classedash__packager_1_1media_1_1mp4_1_1Fragmenter.html @@ -249,7 +249,7 @@ Protected Member Functions

    Reimplemented in edash_packager::media::mp4::EncryptingFragmenter.

    -

    Definition at line 73 of file fragmenter.cc.

    +

    Definition at line 76 of file fragmenter.cc.

    @@ -299,7 +299,7 @@ template<typename T > diff --git a/docs/db/db8/structedash__packager_1_1media_1_1mp4_1_1ID3v2-members.html b/docs/db/db8/structedash__packager_1_1media_1_1mp4_1_1ID3v2-members.html index 6866d2a3a1..fa621da153 100644 --- a/docs/db/db8/structedash__packager_1_1media_1_1mp4_1_1ID3v2-members.html +++ b/docs/db/db8/structedash__packager_1_1media_1_1mp4_1_1ID3v2-members.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dc8/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPmt-members.html b/docs/db/dc8/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPmt-members.html index 1301f1841f..9730dc6c8b 100644 --- a/docs/db/dc8/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPmt-members.html +++ b/docs/db/dc8/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPmt-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dd1/structedash__packager_1_1media_1_1mp4_1_1SampleEncryption-members.html b/docs/db/dd1/structedash__packager_1_1media_1_1mp4_1_1SampleEncryption-members.html index 2e418ec983..7f519b3a13 100644 --- a/docs/db/dd1/structedash__packager_1_1media_1_1mp4_1_1SampleEncryption-members.html +++ b/docs/db/dd1/structedash__packager_1_1media_1_1mp4_1_1SampleEncryption-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dd2/chunk__info__iterator_8h_source.html b/docs/db/dd2/chunk__info__iterator_8h_source.html index e808fd38f8..bd0c8b740f 100644 --- a/docs/db/dd2/chunk__info__iterator_8h_source.html +++ b/docs/db/dd2/chunk__info__iterator_8h_source.html @@ -148,7 +148,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    74 
    75 #endif // MEDIA_FORMATS_MP4_CHUNK_INFO_ITERATOR_H_
    - +
    uint32_t NumSamples(uint32_t start_chunk, uint32_t end_chunk) const
    @@ -161,7 +161,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dd9/sync__sample__iterator_8h_source.html b/docs/db/dd9/sync__sample__iterator_8h_source.html index 3e993e9e03..fb0fd10296 100644 --- a/docs/db/dd9/sync__sample__iterator_8h_source.html +++ b/docs/db/dd9/sync__sample__iterator_8h_source.html @@ -133,14 +133,14 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    51 
    52 #endif // MEDIA_FORMATS_MP4_SYNC_SAMPLE_ITERATOR_H_
    SyncSampleIterator(const SyncSample &sync_sample)
    Create a new SyncSampleIterator from sync sample box.
    - + diff --git a/docs/db/de4/classedash__packager_1_1AdaptationSet.html b/docs/db/de4/classedash__packager_1_1AdaptationSet.html index d2e9c11c40..c957567009 100644 --- a/docs/db/de4/classedash__packager_1_1AdaptationSet.html +++ b/docs/db/de4/classedash__packager_1_1AdaptationSet.html @@ -229,7 +229,7 @@ template<MpdBuilder::MpdType type> -

    Definition at line 653 of file mpd_builder.cc.

    +

    Definition at line 654 of file mpd_builder.cc.

    @@ -263,7 +263,7 @@ template<MpdBuilder::MpdType type> -

    Definition at line 716 of file mpd_builder.cc.

    +

    Definition at line 717 of file mpd_builder.cc.

    @@ -297,7 +297,7 @@ template<MpdBuilder::MpdType type>
    Returns
    On success, returns a pointer to Representation. Otherwise returns NULL. The returned pointer is owned by the AdaptationSet instance.
    -

    Definition at line 672 of file mpd_builder.cc.

    +

    Definition at line 673 of file mpd_builder.cc.

    @@ -330,7 +330,7 @@ template<MpdBuilder::MpdType type> -

    Definition at line 728 of file mpd_builder.cc.

    +

    Definition at line 729 of file mpd_builder.cc.

    @@ -363,7 +363,7 @@ template<MpdBuilder::MpdType type> -

    Definition at line 803 of file mpd_builder.cc.

    +

    Definition at line 816 of file mpd_builder.cc.

    @@ -382,7 +382,7 @@ template<MpdBuilder::MpdType type>

    Makes a copy of AdaptationSet xml element with its child Representation and ContentProtection elements.

    Returns
    On success returns a non-NULL scoped_xml_ptr. Otherwise returns a NULL scoped_xml_ptr.
    -

    Definition at line 734 of file mpd_builder.cc.

    +

    Definition at line 739 of file mpd_builder.cc.

    @@ -408,7 +408,7 @@ template<MpdBuilder::MpdType type>
    Returns
    Returns the value for group. If not set, returns a negative value.
    -

    Definition at line 813 of file mpd_builder.cc.

    +

    Definition at line 826 of file mpd_builder.cc.

    @@ -451,7 +451,7 @@ template<MpdBuilder::MpdType type> -

    Definition at line 824 of file mpd_builder.cc.

    +

    Definition at line 837 of file mpd_builder.cc.

    @@ -493,7 +493,7 @@ template<MpdBuilder::MpdType type> -

    Definition at line 835 of file mpd_builder.cc.

    +

    Definition at line 848 of file mpd_builder.cc.

    @@ -526,7 +526,7 @@ template<MpdBuilder::MpdType type> -

    Definition at line 809 of file mpd_builder.cc.

    +

    Definition at line 822 of file mpd_builder.cc.

    @@ -571,7 +571,7 @@ template<MpdBuilder::MpdType type>
    Attention
    This might get removed once DASH IF IOP specification makes a a clear guideline on how to handle key rotation. Also to get this working with shaka-player, this method DOES NOT update the PSSH element. Instead, it removes the element regardless of the content of pssh.
    -

    Definition at line 722 of file mpd_builder.cc.

    +

    Definition at line 723 of file mpd_builder.cc.

    @@ -582,7 +582,7 @@ template<MpdBuilder::MpdType type> diff --git a/docs/db/de9/classedash__packager_1_1media_1_1StreamDescriptorCompareFn-members.html b/docs/db/de9/classedash__packager_1_1media_1_1StreamDescriptorCompareFn-members.html index 2d1a9ad5f0..c2a1d839b1 100644 --- a/docs/db/de9/classedash__packager_1_1media_1_1StreamDescriptorCompareFn-members.html +++ b/docs/db/de9/classedash__packager_1_1media_1_1StreamDescriptorCompareFn-members.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dec/audio__timestamp__helper_8cc_source.html b/docs/db/dec/audio__timestamp__helper_8cc_source.html index ec00f03fb8..331ee860e9 100644 --- a/docs/db/dec/audio__timestamp__helper_8cc_source.html +++ b/docs/db/dec/audio__timestamp__helper_8cc_source.html @@ -165,7 +165,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/ded/opus__packet__builder_8cc_source.html b/docs/db/ded/opus__packet__builder_8cc_source.html index 299afb552b..9af0fef789 100644 --- a/docs/db/ded/opus__packet__builder_8cc_source.html +++ b/docs/db/ded/opus__packet__builder_8cc_source.html @@ -182,7 +182,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/df2/classedash__packager_1_1media_1_1mp2t_1_1EsParser.html b/docs/db/df2/classedash__packager_1_1media_1_1mp2t_1_1EsParser.html index dc9594801c..fd4969a15e 100644 --- a/docs/db/df2/classedash__packager_1_1media_1_1mp2t_1_1EsParser.html +++ b/docs/db/df2/classedash__packager_1_1media_1_1mp2t_1_1EsParser.html @@ -144,7 +144,7 @@ uint32_t pid () diff --git a/docs/db/df6/muxer_8h_source.html b/docs/db/df6/muxer_8h_source.html index 2d985830ff..7511661885 100644 --- a/docs/db/df6/muxer_8h_source.html +++ b/docs/db/df6/muxer_8h_source.html @@ -208,7 +208,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/df7/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPsi-members.html b/docs/db/df7/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPsi-members.html index d2025b48fe..bc7eefeada 100644 --- a/docs/db/df7/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPsi-members.html +++ b/docs/db/df7/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPsi-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/df7/structedash__packager_1_1media_1_1mp4_1_1VideoMediaHeader.html b/docs/db/df7/structedash__packager_1_1media_1_1mp4_1_1VideoMediaHeader.html index d730f1f311..73173ff8f2 100644 --- a/docs/db/df7/structedash__packager_1_1media_1_1mp4_1_1VideoMediaHeader.html +++ b/docs/db/df7/structedash__packager_1_1media_1_1mp4_1_1VideoMediaHeader.html @@ -154,7 +154,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 462 of file box_definitions.h.

    +

    Definition at line 469 of file box_definitions.h.

    Member Function Documentation

    @@ -180,7 +180,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1575 of file box_definitions.cc.

    +

    Definition at line 1596 of file box_definitions.cc.

    @@ -191,7 +191,7 @@ Additional Inherited Members diff --git a/docs/db/dfb/mpd__utils_8cc_source.html b/docs/db/dfb/mpd__utils_8cc_source.html index 623bbe18ba..56a937c6b6 100644 --- a/docs/db/dfb/mpd__utils_8cc_source.html +++ b/docs/db/dfb/mpd__utils_8cc_source.html @@ -373,7 +373,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dfc/mpd__notify__muxer__listener_8cc_source.html b/docs/db/dfc/mpd__notify__muxer__listener_8cc_source.html index f6e1928b4f..fc6c763c91 100644 --- a/docs/db/dfc/mpd__notify__muxer__listener_8cc_source.html +++ b/docs/db/dfc/mpd__notify__muxer__listener_8cc_source.html @@ -265,7 +265,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/db/dfe/classedash__packager_1_1media_1_1AesCbcPkcs5Decryptor.html b/docs/db/dfe/classedash__packager_1_1media_1_1AesCbcPkcs5Decryptor.html index b0d5a06fa2..0d7fdaca5f 100644 --- a/docs/db/dfe/classedash__packager_1_1media_1_1AesCbcPkcs5Decryptor.html +++ b/docs/db/dfe/classedash__packager_1_1media_1_1AesCbcPkcs5Decryptor.html @@ -209,7 +209,7 @@ const std::vector< uint8_t > &  diff --git a/docs/dc/d05/classedash__packager_1_1xml_1_1RepresentationXmlNode.html b/docs/dc/d05/classedash__packager_1_1xml_1_1RepresentationXmlNode.html index e12647cc8c..b9d8b606b4 100644 --- a/docs/dc/d05/classedash__packager_1_1xml_1_1RepresentationXmlNode.html +++ b/docs/dc/d05/classedash__packager_1_1xml_1_1RepresentationXmlNode.html @@ -111,8 +111,8 @@ Inheritance diagram for edash_packager::xml::RepresentationXmlNode: - - + + @@ -183,7 +183,7 @@ Additional Inherited Members
    Returns
    true if successfully set attributes and children elements (if applicable), false otherwise.
    -

    Definition at line 238 of file xml_node.cc.

    +

    Definition at line 245 of file xml_node.cc.

    @@ -223,11 +223,11 @@ Additional Inherited Members -

    Definition at line 293 of file xml_node.cc.

    +

    Definition at line 300 of file xml_node.cc.

    - +

    Public Member Functions

    bool AddVideoInfo (const MediaInfo::VideoInfo &video_info)
     
    bool AddVideoInfo (const MediaInfo::VideoInfo &video_info, bool set_width, bool set_height, bool set_frame_rate)
     
    bool AddAudioInfo (const MediaInfo::AudioInfo &audio_info)
     
    bool AddVODOnlyInfo (const MediaInfo &media_info)
    @@ -235,8 +235,30 @@ Additional Inherited Members - + + + + + + + + + + + + + + + + + + + + + + +
    bool edash_packager::xml::RepresentationXmlNode::AddVideoInfo ( const MediaInfo::VideoInfo & video_info)video_info,
    bool set_width,
    bool set_height,
    bool set_frame_rate 
    )
    @@ -244,6 +266,9 @@ Additional Inherited Members
    Parameters
    + + +
    video_infoconstains the VideoInfo for a Representation.
    set_widthis a flag for setting the width attribute.
    set_heightis a flag for setting the height attribute.
    set_frame_rateis a flag for setting the frameRate attribute.
    @@ -275,7 +300,7 @@ Additional Inherited Members
    Returns
    true on success, false otherwise.
    -

    Definition at line 246 of file xml_node.cc.

    +

    Definition at line 253 of file xml_node.cc.

    @@ -286,7 +311,7 @@ Additional Inherited Members diff --git a/docs/dc/d0c/classedash__packager_1_1media_1_1WebMVideoClient.html b/docs/dc/d0c/classedash__packager_1_1media_1_1WebMVideoClient.html index 5cc2c6bb4b..0b54c69cfc 100644 --- a/docs/dc/d0c/classedash__packager_1_1media_1_1WebMVideoClient.html +++ b/docs/dc/d0c/classedash__packager_1_1media_1_1WebMVideoClient.html @@ -190,7 +190,7 @@ An empty scoped_refptr if there was unexpected values in the provided parameters diff --git a/docs/dc/d0d/structedash__packager_1_1media_1_1mp4_1_1EditListEntry.html b/docs/dc/d0d/structedash__packager_1_1media_1_1mp4_1_1EditListEntry.html index 51992003c4..567f897cc1 100644 --- a/docs/dc/d0d/structedash__packager_1_1media_1_1mp4_1_1EditListEntry.html +++ b/docs/dc/d0d/structedash__packager_1_1media_1_1mp4_1_1EditListEntry.html @@ -118,7 +118,7 @@ int16_t media_rate_fractio diff --git a/docs/dc/d0e/structedash__packager_1_1media_1_1mp4_1_1WVTTSampleEntry.html b/docs/dc/d0e/structedash__packager_1_1media_1_1mp4_1_1WVTTSampleEntry.html index deb3347679..b56899ca2f 100644 --- a/docs/dc/d0e/structedash__packager_1_1media_1_1mp4_1_1WVTTSampleEntry.html +++ b/docs/dc/d0e/structedash__packager_1_1media_1_1mp4_1_1WVTTSampleEntry.html @@ -142,7 +142,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 340 of file box_definitions.h.

    +

    Definition at line 347 of file box_definitions.h.

    Member Function Documentation

    @@ -168,7 +168,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1523 of file box_definitions.cc.

    +

    Definition at line 1544 of file box_definitions.cc.

    @@ -179,7 +179,7 @@ Additional Inherited Members diff --git a/docs/dc/d19/box_8h_source.html b/docs/dc/d19/box_8h_source.html index e1d60f3118..3f6cf6bbd3 100644 --- a/docs/dc/d19/box_8h_source.html +++ b/docs/dc/d19/box_8h_source.html @@ -184,7 +184,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d22/dash__iop__mpd__notifier_8cc_source.html b/docs/dc/d22/dash__iop__mpd__notifier_8cc_source.html index bb69819ea6..9a15abeba6 100644 --- a/docs/dc/d22/dash__iop__mpd__notifier_8cc_source.html +++ b/docs/dc/d22/dash__iop__mpd__notifier_8cc_source.html @@ -388,26 +388,26 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    bool AddContentProtectionElement(uint32_t id, const ContentProtectionElement &content_protection_element) override
    void AddContentProtectionElements(const MediaInfo &media_info, Representation *parent)
    Definition: mpd_utils.cc:268
    -
    static void MakePathsRelativeToMpd(const std::string &mpd_path, MediaInfo *media_info)
    Definition: mpd_builder.cc:625
    -
    virtual void ForceSetSegmentAlignment(bool segment_alignment)
    Definition: mpd_builder.cc:803
    +
    static void MakePathsRelativeToMpd(const std::string &mpd_path, MediaInfo *media_info)
    Definition: mpd_builder.cc:626
    +
    virtual void ForceSetSegmentAlignment(bool segment_alignment)
    Definition: mpd_builder.cc:816
    std::string Uint8VectorToBase64(const std::vector< uint8_t > &input)
    Converts uint8 vector into base64 encoded string.
    -
    virtual Representation * AddRepresentation(const MediaInfo &media_info)
    Definition: mpd_builder.cc:672
    +
    virtual Representation * AddRepresentation(const MediaInfo &media_info)
    Definition: mpd_builder.cc:673
    bool NotifyNewContainer(const MediaInfo &media_info, uint32_t *id) override
    bool NotifyEncryptionUpdate(uint32_t container_id, const std::string &drm_uuid, const std::vector< uint8_t > &new_key_id, const std::vector< uint8_t > &new_pssh) override
    bool WriteMpdToFile(const std::string &output_path, MpdBuilder *mpd_builder)
    -
    virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
    Definition: mpd_builder.cc:722
    +
    virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
    Definition: mpd_builder.cc:723
    bool NotifySampleDuration(uint32_t container_id, uint32_t sample_duration) override
    - +
    ContentType GetContentType(const MediaInfo &media_info)
    bool NotifyNewSegment(uint32_t id, uint64_t start_time, uint64_t duration, uint64_t size) override
    diff --git a/docs/dc/d23/classedash__packager_1_1MockMpdNotifier-members.html b/docs/dc/d23/classedash__packager_1_1MockMpdNotifier-members.html index 39d6afdf8a..76cb87622c 100644 --- a/docs/dc/d23/classedash__packager_1_1MockMpdNotifier-members.html +++ b/docs/dc/d23/classedash__packager_1_1MockMpdNotifier-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d2f/classedash__packager_1_1media_1_1KeySource-members.html b/docs/dc/d2f/classedash__packager_1_1media_1_1KeySource-members.html index 834f6ec885..21d3099dde 100644 --- a/docs/dc/d2f/classedash__packager_1_1media_1_1KeySource-members.html +++ b/docs/dc/d2f/classedash__packager_1_1media_1_1KeySource-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d31/classedash__packager_1_1media_1_1ClusterBuilder-members.html b/docs/dc/d31/classedash__packager_1_1media_1_1ClusterBuilder-members.html index 5cbe2d6144..44e8d07e81 100644 --- a/docs/dc/d31/classedash__packager_1_1media_1_1ClusterBuilder-members.html +++ b/docs/dc/d31/classedash__packager_1_1media_1_1ClusterBuilder-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d35/classedash__packager_1_1media_1_1mp2t_1_1Mp2tMediaParser-members.html b/docs/dc/d35/classedash__packager_1_1media_1_1mp2t_1_1Mp2tMediaParser-members.html index 8df2fba272..3b680828e0 100644 --- a/docs/dc/d35/classedash__packager_1_1media_1_1mp2t_1_1Mp2tMediaParser-members.html +++ b/docs/dc/d35/classedash__packager_1_1media_1_1mp2t_1_1Mp2tMediaParser-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d3b/fixed__key__encryption__flags_8cc_source.html b/docs/dc/d3b/fixed__key__encryption__flags_8cc_source.html index af0b645ddf..3c716d66a4 100644 --- a/docs/dc/d3b/fixed__key__encryption__flags_8cc_source.html +++ b/docs/dc/d3b/fixed__key__encryption__flags_8cc_source.html @@ -153,7 +153,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d3c/webm__cluster__parser_8h_source.html b/docs/dc/d3c/webm__cluster__parser_8h_source.html index 0a4fbb089e..29f6e81afb 100644 --- a/docs/dc/d3c/webm__cluster__parser_8h_source.html +++ b/docs/dc/d3c/webm__cluster__parser_8h_source.html @@ -315,7 +315,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d3f/key__source_8h_source.html b/docs/dc/d3f/key__source_8h_source.html index 393b650ffd..d14f2500dd 100644 --- a/docs/dc/d3f/key__source_8h_source.html +++ b/docs/dc/d3f/key__source_8h_source.html @@ -189,7 +189,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d41/classedash__packager_1_1xml_1_1RepresentationXmlNode-members.html b/docs/dc/d41/classedash__packager_1_1xml_1_1RepresentationXmlNode-members.html index 92ef32ca71..813904eaa4 100644 --- a/docs/dc/d41/classedash__packager_1_1xml_1_1RepresentationXmlNode-members.html +++ b/docs/dc/d41/classedash__packager_1_1xml_1_1RepresentationXmlNode-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); AddContentProtectionElements(const std::list< ContentProtectionElement > &content_protection_elements) (defined in edash_packager::xml::RepresentationBaseXmlNode)edash_packager::xml::RepresentationBaseXmlNode AddElements(const std::vector< Element > &elements)edash_packager::xml::XmlNode AddLiveOnlyInfo(const MediaInfo &media_info, const std::list< SegmentInfo > &segment_infos, uint32_t start_number)edash_packager::xml::RepresentationXmlNode - AddVideoInfo(const MediaInfo::VideoInfo &video_info)edash_packager::xml::RepresentationXmlNode + AddVideoInfo(const MediaInfo::VideoInfo &video_info, bool set_width, bool set_height, bool set_frame_rate)edash_packager::xml::RepresentationXmlNode AddVODOnlyInfo(const MediaInfo &media_info)edash_packager::xml::RepresentationXmlNode GetRawPtr()edash_packager::xml::XmlNode PassScopedPtr()edash_packager::xml::XmlNode @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d44/classedash__packager_1_1xml_1_1XmlNode-members.html b/docs/dc/d44/classedash__packager_1_1xml_1_1XmlNode-members.html index e5c497148b..8729154915 100644 --- a/docs/dc/d44/classedash__packager_1_1xml_1_1XmlNode-members.html +++ b/docs/dc/d44/classedash__packager_1_1xml_1_1XmlNode-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d46/classedash__packager_1_1media_1_1Cluster-members.html b/docs/dc/d46/classedash__packager_1_1media_1_1Cluster-members.html index 6f20cb7a65..b26e02f644 100644 --- a/docs/dc/d46/classedash__packager_1_1media_1_1Cluster-members.html +++ b/docs/dc/d46/classedash__packager_1_1media_1_1Cluster-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d48/classedash__packager_1_1media_1_1MediaParser.html b/docs/dc/d48/classedash__packager_1_1media_1_1MediaParser.html index 57f46b2a17..208e0003f7 100644 --- a/docs/dc/d48/classedash__packager_1_1media_1_1MediaParser.html +++ b/docs/dc/d48/classedash__packager_1_1media_1_1MediaParser.html @@ -297,7 +297,7 @@ Public Member Functions diff --git a/docs/dc/d4a/structedash__packager_1_1media_1_1mp4_1_1WebVTTConfigurationBox-members.html b/docs/dc/d4a/structedash__packager_1_1media_1_1mp4_1_1WebVTTConfigurationBox-members.html index b28e2bc8f6..6a65fe0bef 100644 --- a/docs/dc/d4a/structedash__packager_1_1media_1_1mp4_1_1WebVTTConfigurationBox-members.html +++ b/docs/dc/d4a/structedash__packager_1_1media_1_1mp4_1_1WebVTTConfigurationBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d51/structedash__packager_1_1media_1_1mp4_1_1WVTTSampleEntry-members.html b/docs/dc/d51/structedash__packager_1_1media_1_1mp4_1_1WVTTSampleEntry-members.html index edd9ca808e..e1aa501597 100644 --- a/docs/dc/d51/structedash__packager_1_1media_1_1mp4_1_1WVTTSampleEntry-members.html +++ b/docs/dc/d51/structedash__packager_1_1media_1_1mp4_1_1WVTTSampleEntry-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d52/decoding__time__iterator_8h_source.html b/docs/dc/d52/decoding__time__iterator_8h_source.html index d728d7f2e7..6e252e3a14 100644 --- a/docs/dc/d52/decoding__time__iterator_8h_source.html +++ b/docs/dc/d52/decoding__time__iterator_8h_source.html @@ -142,12 +142,12 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); - +
    uint64_t Duration(uint32_t start_sample, uint32_t end_sample) const
    diff --git a/docs/dc/d53/webm_2segmenter_8cc_source.html b/docs/dc/d53/webm_2segmenter_8cc_source.html index 5e78da0dbb..54d8f13225 100644 --- a/docs/dc/d53/webm_2segmenter_8cc_source.html +++ b/docs/dc/d53/webm_2segmenter_8cc_source.html @@ -211,160 +211,177 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    122 
    123  const int64_t time_ns =
    124  sample->pts() * kSecondsToNs / info_->time_scale();
    -
    125  if (!cluster_->AddFrame(sample->data(), sample->data_size(), track_id_,
    -
    126  time_ns, sample->is_key_frame())) {
    -
    127  LOG(ERROR) << "Error adding sample to segment.";
    -
    128  return Status(error::FILE_FAILURE, "Error adding sample to segment.");
    -
    129  }
    -
    130  const double duration_sec =
    -
    131  static_cast<double>(sample->duration()) / info_->time_scale();
    -
    132  cluster_length_sec_ += duration_sec;
    -
    133  segment_length_sec_ += duration_sec;
    -
    134  total_duration_ += sample->duration();
    -
    135 
    -
    136  return Status::OK;
    -
    137 }
    -
    138 
    -
    139 float Segmenter::GetDuration() const {
    -
    140  return static_cast<float>(segment_info_.duration()) *
    -
    141  segment_info_.timecode_scale() / kSecondsToNs;
    -
    142 }
    -
    143 
    -
    144 uint64_t Segmenter::FromBMFFTimescale(uint64_t time_timescale) {
    -
    145  // Convert the time from BMFF time_code to WebM timecode scale.
    -
    146  const int64_t time_ns =
    -
    147  kSecondsToNs * time_timescale / info_->time_scale();
    -
    148  return time_ns / segment_info_.timecode_scale();
    -
    149 }
    -
    150 
    -
    151 uint64_t Segmenter::FromWebMTimecode(uint64_t time_webm_timecode) {
    -
    152  // Convert the time to BMFF time_code from WebM timecode scale.
    -
    153  const int64_t time_ns = time_webm_timecode * segment_info_.timecode_scale();
    -
    154  return time_ns * info_->time_scale() / kSecondsToNs;
    -
    155 }
    -
    156 
    -
    157 Status Segmenter::WriteSegmentHeader(uint64_t file_size, MkvWriter* writer) {
    -
    158  Status error_status(error::FILE_FAILURE, "Error writing segment header.");
    -
    159 
    -
    160  if (!WriteEbmlHeader(writer))
    -
    161  return error_status;
    -
    162 
    -
    163  if (WriteID(writer, mkvmuxer::kMkvSegment) != 0)
    -
    164  return error_status;
    -
    165 
    -
    166  const uint64_t segment_size_size = 8;
    -
    167  segment_payload_pos_ = writer->Position() + segment_size_size;
    -
    168  if (file_size > 0) {
    -
    169  // We want the size of the segment element, so subtract the header.
    -
    170  if (WriteUIntSize(writer, file_size - segment_payload_pos_,
    -
    171  segment_size_size) != 0)
    -
    172  return error_status;
    -
    173  if (!seek_head_.Write(writer))
    -
    174  return error_status;
    -
    175  } else {
    -
    176  if (SerializeInt(writer, mkvmuxer::kEbmlUnknownValue, segment_size_size) !=
    -
    177  0)
    -
    178  return error_status;
    -
    179  // We don't know the header size, so write a placeholder.
    -
    180  if (!seek_head_.WriteVoid(writer))
    -
    181  return error_status;
    -
    182  }
    -
    183 
    -
    184  if (!segment_info_.Write(writer))
    -
    185  return error_status;
    -
    186 
    -
    187  if (!tracks_.Write(writer))
    -
    188  return error_status;
    -
    189 
    -
    190  return Status::OK;
    -
    191 }
    -
    192 
    -
    193 Status Segmenter::SetCluster(uint64_t start_webm_timecode,
    -
    194  uint64_t position,
    -
    195  MkvWriter* writer) {
    -
    196  const uint64_t scale = segment_info_.timecode_scale();
    -
    197  cluster_.reset(new mkvmuxer::Cluster(start_webm_timecode, position, scale));
    -
    198  cluster_->Init(writer);
    -
    199  return Status::OK;
    -
    200 }
    -
    201 
    -
    202 void Segmenter::UpdateProgress(uint64_t progress) {
    -
    203  accumulated_progress_ += progress;
    -
    204  if (!progress_listener_ || progress_target_ == 0)
    -
    205  return;
    -
    206  // It might happen that accumulated progress exceeds progress_target due to
    -
    207  // computation errors, e.g. rounding error. Cap it so it never reports > 100%
    -
    208  // progress.
    -
    209  if (accumulated_progress_ >= progress_target_) {
    -
    210  progress_listener_->OnProgress(1.0);
    -
    211  } else {
    -
    212  progress_listener_->OnProgress(static_cast<double>(accumulated_progress_) /
    -
    213  progress_target_);
    -
    214  }
    -
    215 }
    -
    216 
    -
    217 Status Segmenter::CreateVideoTrack(VideoStreamInfo* info) {
    -
    218  // The seed is only used to create a UID which we overwrite later.
    -
    219  unsigned int seed = 0;
    -
    220  mkvmuxer::VideoTrack* track = new mkvmuxer::VideoTrack(&seed);
    -
    221  if (!track)
    -
    222  return Status(error::INTERNAL_ERROR, "Failed to create video track.");
    -
    223 
    -
    224  if (info->codec() == kCodecVP8) {
    -
    225  track->set_codec_id(mkvmuxer::Tracks::kVp8CodecId);
    -
    226  } else if (info->codec() == kCodecVP9) {
    -
    227  track->set_codec_id(mkvmuxer::Tracks::kVp9CodecId);
    +
    125  bool addframe_result;
    +
    126  if (sample->side_data_size() > 0) {
    +
    127  uint64_t block_add_id;
    +
    128  // First 8 bytes of side_data is the BlockAddID element's value, which is
    +
    129  // done to mimic ffmpeg behavior. See webm_cluster_parser.cc for details.
    +
    130  CHECK_GT(sample->side_data_size(), sizeof(block_add_id));
    +
    131  memcpy(&block_add_id, sample->side_data(), sizeof(block_add_id));
    +
    132  addframe_result = cluster_->AddFrameWithAdditional(
    +
    133  sample->data(), sample->data_size(),
    +
    134  sample->side_data() + sizeof(block_add_id),
    +
    135  sample->side_data_size() - sizeof(block_add_id), block_add_id,
    +
    136  track_id_, time_ns, sample->is_key_frame());
    +
    137  } else {
    +
    138  addframe_result =
    +
    139  cluster_->AddFrame(sample->data(), sample->data_size(), track_id_,
    +
    140  time_ns, sample->is_key_frame());
    +
    141  }
    +
    142  if (!addframe_result) {
    +
    143  LOG(ERROR) << "Error adding sample to segment.";
    +
    144  return Status(error::FILE_FAILURE, "Error adding sample to segment.");
    +
    145  }
    +
    146 
    +
    147  const double duration_sec =
    +
    148  static_cast<double>(sample->duration()) / info_->time_scale();
    +
    149  cluster_length_sec_ += duration_sec;
    +
    150  segment_length_sec_ += duration_sec;
    +
    151  total_duration_ += sample->duration();
    +
    152 
    +
    153  return Status::OK;
    +
    154 }
    +
    155 
    +
    156 float Segmenter::GetDuration() const {
    +
    157  return static_cast<float>(segment_info_.duration()) *
    +
    158  segment_info_.timecode_scale() / kSecondsToNs;
    +
    159 }
    +
    160 
    +
    161 uint64_t Segmenter::FromBMFFTimescale(uint64_t time_timescale) {
    +
    162  // Convert the time from BMFF time_code to WebM timecode scale.
    +
    163  const int64_t time_ns =
    +
    164  kSecondsToNs * time_timescale / info_->time_scale();
    +
    165  return time_ns / segment_info_.timecode_scale();
    +
    166 }
    +
    167 
    +
    168 uint64_t Segmenter::FromWebMTimecode(uint64_t time_webm_timecode) {
    +
    169  // Convert the time to BMFF time_code from WebM timecode scale.
    +
    170  const int64_t time_ns = time_webm_timecode * segment_info_.timecode_scale();
    +
    171  return time_ns * info_->time_scale() / kSecondsToNs;
    +
    172 }
    +
    173 
    +
    174 Status Segmenter::WriteSegmentHeader(uint64_t file_size, MkvWriter* writer) {
    +
    175  Status error_status(error::FILE_FAILURE, "Error writing segment header.");
    +
    176 
    +
    177  if (!WriteEbmlHeader(writer))
    +
    178  return error_status;
    +
    179 
    +
    180  if (WriteID(writer, mkvmuxer::kMkvSegment) != 0)
    +
    181  return error_status;
    +
    182 
    +
    183  const uint64_t segment_size_size = 8;
    +
    184  segment_payload_pos_ = writer->Position() + segment_size_size;
    +
    185  if (file_size > 0) {
    +
    186  // We want the size of the segment element, so subtract the header.
    +
    187  if (WriteUIntSize(writer, file_size - segment_payload_pos_,
    +
    188  segment_size_size) != 0)
    +
    189  return error_status;
    +
    190  if (!seek_head_.Write(writer))
    +
    191  return error_status;
    +
    192  } else {
    +
    193  if (SerializeInt(writer, mkvmuxer::kEbmlUnknownValue, segment_size_size) !=
    +
    194  0)
    +
    195  return error_status;
    +
    196  // We don't know the header size, so write a placeholder.
    +
    197  if (!seek_head_.WriteVoid(writer))
    +
    198  return error_status;
    +
    199  }
    +
    200 
    +
    201  if (!segment_info_.Write(writer))
    +
    202  return error_status;
    +
    203 
    +
    204  if (!tracks_.Write(writer))
    +
    205  return error_status;
    +
    206 
    +
    207  return Status::OK;
    +
    208 }
    +
    209 
    +
    210 Status Segmenter::SetCluster(uint64_t start_webm_timecode,
    +
    211  uint64_t position,
    +
    212  MkvWriter* writer) {
    +
    213  const uint64_t scale = segment_info_.timecode_scale();
    +
    214  cluster_.reset(new mkvmuxer::Cluster(start_webm_timecode, position, scale));
    +
    215  cluster_->Init(writer);
    +
    216  return Status::OK;
    +
    217 }
    +
    218 
    +
    219 void Segmenter::UpdateProgress(uint64_t progress) {
    +
    220  accumulated_progress_ += progress;
    +
    221  if (!progress_listener_ || progress_target_ == 0)
    +
    222  return;
    +
    223  // It might happen that accumulated progress exceeds progress_target due to
    +
    224  // computation errors, e.g. rounding error. Cap it so it never reports > 100%
    +
    225  // progress.
    +
    226  if (accumulated_progress_ >= progress_target_) {
    +
    227  progress_listener_->OnProgress(1.0);
    228  } else {
    -
    229  LOG(ERROR) << "Only VP8 and VP9 video codec is supported.";
    -
    230  return Status(error::UNIMPLEMENTED,
    -
    231  "Only VP8 and VP9 video codecs are supported.");
    -
    232  }
    +
    229  progress_listener_->OnProgress(static_cast<double>(accumulated_progress_) /
    +
    230  progress_target_);
    +
    231  }
    +
    232 }
    233 
    -
    234  track->set_uid(info->track_id());
    -
    235  track->set_type(mkvmuxer::Tracks::kVideo);
    -
    236  track->set_width(info->width());
    -
    237  track->set_height(info->height());
    -
    238  track->set_display_height(info->height());
    -
    239  track->set_display_width(info->width() * info->pixel_width() /
    -
    240  info->pixel_height());
    -
    241  track->set_language(info->language().c_str());
    -
    242 
    -
    243  tracks_.AddTrack(track, info->track_id());
    -
    244  track_id_ = track->number();
    -
    245  return Status::OK;
    -
    246 }
    -
    247 
    -
    248 Status Segmenter::CreateAudioTrack(AudioStreamInfo* info) {
    -
    249  // The seed is only used to create a UID which we overwrite later.
    -
    250  unsigned int seed = 0;
    -
    251  mkvmuxer::AudioTrack* track = new mkvmuxer::AudioTrack(&seed);
    -
    252  if (!track)
    -
    253  return Status(error::INTERNAL_ERROR, "Failed to create audio track.");
    -
    254 
    -
    255  if (info->codec() == kCodecOpus) {
    -
    256  track->set_codec_id(mkvmuxer::Tracks::kOpusCodecId);
    -
    257  } else if (info->codec() == kCodecVorbis) {
    -
    258  track->set_codec_id(mkvmuxer::Tracks::kVorbisCodecId);
    -
    259  } else {
    -
    260  LOG(ERROR) << "Only Vorbis and Opus audio codec is supported.";
    -
    261  return Status(error::UNIMPLEMENTED,
    -
    262  "Only Vorbis and Opus audio codecs are supported.");
    -
    263  }
    +
    234 Status Segmenter::CreateVideoTrack(VideoStreamInfo* info) {
    +
    235  // The seed is only used to create a UID which we overwrite later.
    +
    236  unsigned int seed = 0;
    +
    237  mkvmuxer::VideoTrack* track = new mkvmuxer::VideoTrack(&seed);
    +
    238  if (!track)
    +
    239  return Status(error::INTERNAL_ERROR, "Failed to create video track.");
    +
    240 
    +
    241  if (info->codec() == kCodecVP8) {
    +
    242  track->set_codec_id(mkvmuxer::Tracks::kVp8CodecId);
    +
    243  } else if (info->codec() == kCodecVP9) {
    +
    244  track->set_codec_id(mkvmuxer::Tracks::kVp9CodecId);
    +
    245  } else {
    +
    246  LOG(ERROR) << "Only VP8 and VP9 video codec is supported.";
    +
    247  return Status(error::UNIMPLEMENTED,
    +
    248  "Only VP8 and VP9 video codecs are supported.");
    +
    249  }
    +
    250 
    +
    251  track->set_uid(info->track_id());
    +
    252  track->set_type(mkvmuxer::Tracks::kVideo);
    +
    253  track->set_width(info->width());
    +
    254  track->set_height(info->height());
    +
    255  track->set_display_height(info->height());
    +
    256  track->set_display_width(info->width() * info->pixel_width() /
    +
    257  info->pixel_height());
    +
    258  track->set_language(info->language().c_str());
    +
    259 
    +
    260  tracks_.AddTrack(track, info->track_id());
    +
    261  track_id_ = track->number();
    +
    262  return Status::OK;
    +
    263 }
    264 
    -
    265  track->set_uid(info->track_id());
    -
    266  track->set_language(info->language().c_str());
    -
    267  track->set_type(mkvmuxer::Tracks::kAudio);
    -
    268  track->set_sample_rate(info->sampling_frequency());
    -
    269  track->set_channels(info->num_channels());
    -
    270 
    -
    271  tracks_.AddTrack(track, info->track_id());
    -
    272  track_id_ = track->number();
    -
    273  return Status::OK;
    -
    274 }
    -
    275 
    -
    276 } // namespace webm
    -
    277 } // namespace media
    -
    278 } // namespace edash_packager
    +
    265 Status Segmenter::CreateAudioTrack(AudioStreamInfo* info) {
    +
    266  // The seed is only used to create a UID which we overwrite later.
    +
    267  unsigned int seed = 0;
    +
    268  mkvmuxer::AudioTrack* track = new mkvmuxer::AudioTrack(&seed);
    +
    269  if (!track)
    +
    270  return Status(error::INTERNAL_ERROR, "Failed to create audio track.");
    +
    271 
    +
    272  if (info->codec() == kCodecOpus) {
    +
    273  track->set_codec_id(mkvmuxer::Tracks::kOpusCodecId);
    +
    274  } else if (info->codec() == kCodecVorbis) {
    +
    275  track->set_codec_id(mkvmuxer::Tracks::kVorbisCodecId);
    +
    276  } else {
    +
    277  LOG(ERROR) << "Only Vorbis and Opus audio codec is supported.";
    +
    278  return Status(error::UNIMPLEMENTED,
    +
    279  "Only Vorbis and Opus audio codecs are supported.");
    +
    280  }
    +
    281 
    +
    282  track->set_uid(info->track_id());
    +
    283  track->set_language(info->language().c_str());
    +
    284  track->set_type(mkvmuxer::Tracks::kAudio);
    +
    285  track->set_sample_rate(info->sampling_frequency());
    +
    286  track->set_channels(info->num_channels());
    +
    287 
    +
    288  tracks_.AddTrack(track, info->track_id());
    +
    289  track_id_ = track->number();
    +
    290  return Status::OK;
    +
    291 }
    +
    292 
    +
    293 } // namespace webm
    +
    294 } // namespace media
    +
    295 } // namespace edash_packager
    An implementation of IMkvWriter using our File type.
    Definition: mkv_writer.h:21
    mkvmuxer::int64 Position() const override
    Definition: mkv_writer.cc:63
    @@ -391,7 +408,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d55/structedash__packager_1_1media_1_1H264SEIMessage-members.html b/docs/dc/d55/structedash__packager_1_1media_1_1H264SEIMessage-members.html index 2c5ececc28..26014bbbea 100644 --- a/docs/dc/d55/structedash__packager_1_1media_1_1H264SEIMessage-members.html +++ b/docs/dc/d55/structedash__packager_1_1media_1_1H264SEIMessage-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d58/webm__media__parser_8h_source.html b/docs/dc/d58/webm__media__parser_8h_source.html index 6c2b65acf1..ab14323cb9 100644 --- a/docs/dc/d58/webm__media__parser_8h_source.html +++ b/docs/dc/d58/webm__media__parser_8h_source.html @@ -177,7 +177,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d73/classedash__packager_1_1media_1_1RequestSigner.html b/docs/dc/d73/classedash__packager_1_1media_1_1RequestSigner.html index b91b2abd94..e8f957ba70 100644 --- a/docs/dc/d73/classedash__packager_1_1media_1_1RequestSigner.html +++ b/docs/dc/d73/classedash__packager_1_1media_1_1RequestSigner.html @@ -180,7 +180,7 @@ Protected Member Functions diff --git a/docs/dc/d7a/classedash__packager_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html b/docs/dc/d7a/classedash__packager_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html index 91c9935903..5b9d6a0209 100644 --- a/docs/dc/d7a/classedash__packager_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html +++ b/docs/dc/d7a/classedash__packager_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html @@ -259,7 +259,7 @@ void set_progress_target diff --git a/docs/dc/d7b/closure__thread_8cc_source.html b/docs/dc/d7b/closure__thread_8cc_source.html index a9a46aa32d..b5b051646f 100644 --- a/docs/dc/d7b/closure__thread_8cc_source.html +++ b/docs/dc/d7b/closure__thread_8cc_source.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d7b/h264__parser_8cc_source.html b/docs/dc/d7b/h264__parser_8cc_source.html index b7fc1b2265..754050e1e3 100644 --- a/docs/dc/d7b/h264__parser_8cc_source.html +++ b/docs/dc/d7b/h264__parser_8cc_source.html @@ -1446,7 +1446,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/d81/classedash__packager_1_1MpdWriter.html b/docs/dc/d81/classedash__packager_1_1MpdWriter.html index 14130ad130..8dce998674 100644 --- a/docs/dc/d81/classedash__packager_1_1MpdWriter.html +++ b/docs/dc/d81/classedash__packager_1_1MpdWriter.html @@ -123,7 +123,7 @@ class MpdWriterTest diff --git a/docs/dc/d8a/classedash__packager_1_1media_1_1mp4_1_1KeyRotationFragmenter.html b/docs/dc/d8a/classedash__packager_1_1media_1_1mp4_1_1KeyRotationFragmenter.html index 02f4aa0fdb..35bb23f8f4 100644 --- a/docs/dc/d8a/classedash__packager_1_1media_1_1mp4_1_1KeyRotationFragmenter.html +++ b/docs/dc/d8a/classedash__packager_1_1media_1_1mp4_1_1KeyRotationFragmenter.html @@ -303,7 +303,7 @@ void set_encryption_key diff --git a/docs/dc/dab/classedash__packager_1_1media_1_1mp2t_1_1Mp2tMediaParser.html b/docs/dc/dab/classedash__packager_1_1media_1_1mp2t_1_1Mp2tMediaParser.html index f9f3c11c5f..d2f6318247 100644 --- a/docs/dc/dab/classedash__packager_1_1media_1_1mp2t_1_1Mp2tMediaParser.html +++ b/docs/dc/dab/classedash__packager_1_1media_1_1mp2t_1_1Mp2tMediaParser.html @@ -255,7 +255,7 @@ track_id, const scoped_refptr
    diff --git a/docs/dc/db7/structedash__packager_1_1media_1_1mp4_1_1DecodingTimeToSample.html b/docs/dc/db7/structedash__packager_1_1media_1_1mp4_1_1DecodingTimeToSample.html index a52fff56da..656e1a644c 100644 --- a/docs/dc/db7/structedash__packager_1_1media_1_1mp4_1_1DecodingTimeToSample.html +++ b/docs/dc/db7/structedash__packager_1_1media_1_1mp4_1_1DecodingTimeToSample.html @@ -145,7 +145,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 367 of file box_definitions.h.

    +

    Definition at line 374 of file box_definitions.h.

    Member Function Documentation

    @@ -171,7 +171,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 645 of file box_definitions.cc.

    +

    Definition at line 646 of file box_definitions.cc.

    @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/dc/dbf/box__buffer_8h_source.html b/docs/dc/dbf/box__buffer_8h_source.html index bf0b2eb9b3..3e4ca9385c 100644 --- a/docs/dc/dbf/box__buffer_8h_source.html +++ b/docs/dc/dbf/box__buffer_8h_source.html @@ -294,7 +294,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/dc6/classedash__packager_1_1media_1_1mp4_1_1AACAudioSpecificConfig.html b/docs/dc/dc6/classedash__packager_1_1media_1_1mp4_1_1AACAudioSpecificConfig.html index 956db303ca..cf9db6abd8 100644 --- a/docs/dc/dc6/classedash__packager_1_1media_1_1mp4_1_1AACAudioSpecificConfig.html +++ b/docs/dc/dc6/classedash__packager_1_1media_1_1mp4_1_1AACAudioSpecificConfig.html @@ -313,7 +313,7 @@ static const size_t  diff --git a/docs/dc/dc8/classedash__packager_1_1media_1_1WebMWebVTTParser.html b/docs/dc/dc8/classedash__packager_1_1media_1_1WebMWebVTTParser.html index 3c8156e680..7294f01347 100644 --- a/docs/dc/dc8/classedash__packager_1_1media_1_1WebMWebVTTParser.html +++ b/docs/dc/dc8/classedash__packager_1_1media_1_1WebMWebVTTParser.html @@ -111,7 +111,7 @@ static void  diff --git a/docs/dc/dd4/structedash__packager_1_1media_1_1mp4_1_1SampleToGroupEntry-members.html b/docs/dc/dd4/structedash__packager_1_1media_1_1mp4_1_1SampleToGroupEntry-members.html index 38d3fdcb89..c9f6b491d6 100644 --- a/docs/dc/dd4/structedash__packager_1_1media_1_1mp4_1_1SampleToGroupEntry-members.html +++ b/docs/dc/dd4/structedash__packager_1_1media_1_1mp4_1_1SampleToGroupEntry-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/dd9/rsa__key_8cc_source.html b/docs/dc/dd9/rsa__key_8cc_source.html index 2a433db984..770a73f2c0 100644 --- a/docs/dc/dd9/rsa__key_8cc_source.html +++ b/docs/dc/dd9/rsa__key_8cc_source.html @@ -350,7 +350,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/ddf/classedash__packager_1_1media_1_1WebMInfoParser-members.html b/docs/dc/ddf/classedash__packager_1_1media_1_1WebMInfoParser-members.html index 72a336b3d9..34d25c52e9 100644 --- a/docs/dc/ddf/classedash__packager_1_1media_1_1WebMInfoParser-members.html +++ b/docs/dc/ddf/classedash__packager_1_1media_1_1WebMInfoParser-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/ddf/udp__file__posix_8cc_source.html b/docs/dc/ddf/udp__file__posix_8cc_source.html index 07241b5965..0804e83e67 100644 --- a/docs/dc/ddf/udp__file__posix_8cc_source.html +++ b/docs/dc/ddf/udp__file__posix_8cc_source.html @@ -322,7 +322,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/de1/classedash__packager_1_1media_1_1mp4_1_1Segmenter.html b/docs/dc/de1/classedash__packager_1_1media_1_1mp4_1_1Segmenter.html index 8ce7b26e06..a8427a524d 100644 --- a/docs/dc/de1/classedash__packager_1_1media_1_1mp4_1_1Segmenter.html +++ b/docs/dc/de1/classedash__packager_1_1media_1_1mp4_1_1Segmenter.html @@ -423,7 +423,7 @@ void set_progress_target diff --git a/docs/dc/dec/ts__section__pmt_8cc_source.html b/docs/dc/dec/ts__section__pmt_8cc_source.html index 45dac20ce0..93c1fd649c 100644 --- a/docs/dc/dec/ts__section__pmt_8cc_source.html +++ b/docs/dc/dec/ts__section__pmt_8cc_source.html @@ -207,7 +207,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/def/structedash__packager_1_1media_1_1mp4_1_1DataInformation-members.html b/docs/dc/def/structedash__packager_1_1media_1_1mp4_1_1DataInformation-members.html index 7e0612ea6e..156e298e78 100644 --- a/docs/dc/def/structedash__packager_1_1media_1_1mp4_1_1DataInformation-members.html +++ b/docs/dc/def/structedash__packager_1_1media_1_1mp4_1_1DataInformation-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/df1/classedash__packager_1_1media_1_1DecryptorSource.html b/docs/dc/df1/classedash__packager_1_1media_1_1DecryptorSource.html index 2312925c1f..f5c10273b7 100644 --- a/docs/dc/df1/classedash__packager_1_1media_1_1DecryptorSource.html +++ b/docs/dc/df1/classedash__packager_1_1media_1_1DecryptorSource.html @@ -158,7 +158,7 @@ Public Member Functions diff --git a/docs/dc/df8/closure__thread_8h_source.html b/docs/dc/df8/closure__thread_8h_source.html index 9ae4036ed8..7b5f38b8f4 100644 --- a/docs/dc/df8/closure__thread_8h_source.html +++ b/docs/dc/df8/closure__thread_8h_source.html @@ -127,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dc/dfa/classedash__packager_1_1media_1_1ThreadedIoFile.html b/docs/dc/dfa/classedash__packager_1_1media_1_1ThreadedIoFile.html index dd2a6e09d3..e9488a674c 100644 --- a/docs/dc/dfa/classedash__packager_1_1media_1_1ThreadedIoFile.html +++ b/docs/dc/dfa/classedash__packager_1_1media_1_1ThreadedIoFile.html @@ -147,12 +147,6 @@ Protected Member Functions bool Open () override  Internal open. Should not be used directly.
      - -void RunInInputMode () -  - -void RunInOutputMode () -  - Protected Member Functions inherited from edash_packager::media::File  File (const std::string &file_name) @@ -183,7 +177,7 @@ Additional Inherited Members

    Detailed Description

    Declaration of class which implements a thread-safe circular buffer.

    -

    Definition at line 24 of file threaded_io_file.h.

    +

    Definition at line 21 of file threaded_io_file.h.

    Member Function Documentation

    @@ -210,7 +204,7 @@ Additional Inherited Members

    Implements edash_packager::media::File.

    -

    Definition at line 58 of file threaded_io_file.cc.

    +

    Definition at line 56 of file threaded_io_file.cc.

    @@ -239,7 +233,7 @@ Additional Inherited Members

    Implements edash_packager::media::File.

    -

    Definition at line 114 of file threaded_io_file.cc.

    +

    Definition at line 108 of file threaded_io_file.cc.

    @@ -286,7 +280,7 @@ Additional Inherited Members

    Implements edash_packager::media::File.

    -

    Definition at line 73 of file threaded_io_file.cc.

    +

    Definition at line 70 of file threaded_io_file.cc.

    @@ -322,7 +316,7 @@ Additional Inherited Members

    Implements edash_packager::media::File.

    -

    Definition at line 125 of file threaded_io_file.cc.

    +

    Definition at line 118 of file threaded_io_file.cc.

    @@ -350,7 +344,7 @@ Additional Inherited Members

    Implements edash_packager::media::File.

    -

    Definition at line 107 of file threaded_io_file.cc.

    +

    Definition at line 102 of file threaded_io_file.cc.

    @@ -386,7 +380,7 @@ Additional Inherited Members

    Implements edash_packager::media::File.

    -

    Definition at line 154 of file threaded_io_file.cc.

    +

    Definition at line 147 of file threaded_io_file.cc.

    @@ -433,7 +427,7 @@ Additional Inherited Members

    Implements edash_packager::media::File.

    -

    Definition at line 91 of file threaded_io_file.cc.

    +

    Definition at line 87 of file threaded_io_file.cc.

    @@ -444,7 +438,7 @@ Additional Inherited Members diff --git a/docs/dc/dfc/classedash__packager_1_1media_1_1Muxer-members.html b/docs/dc/dfc/classedash__packager_1_1media_1_1Muxer-members.html index d12d9ed5e8..b4753ddb15 100644 --- a/docs/dc/dfc/classedash__packager_1_1media_1_1Muxer-members.html +++ b/docs/dc/dfc/classedash__packager_1_1media_1_1Muxer-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d0c/classedash__packager_1_1media_1_1SegmentTestBase_1_1ClusterParser-members.html b/docs/dd/d0c/classedash__packager_1_1media_1_1SegmentTestBase_1_1ClusterParser-members.html index a83e960335..840e1051ed 100644 --- a/docs/dd/d0c/classedash__packager_1_1media_1_1SegmentTestBase_1_1ClusterParser-members.html +++ b/docs/dd/d0c/classedash__packager_1_1media_1_1SegmentTestBase_1_1ClusterParser-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d0e/classedash__packager_1_1media_1_1mp2t_1_1EsParserH264.html b/docs/dd/d0e/classedash__packager_1_1media_1_1mp2t_1_1EsParserH264.html index a61eba5f5e..ce00a02a0f 100644 --- a/docs/dd/d0e/classedash__packager_1_1media_1_1mp2t_1_1EsParserH264.html +++ b/docs/dd/d0e/classedash__packager_1_1media_1_1mp2t_1_1EsParserH264.html @@ -149,7 +149,7 @@ const scoped_refptr
    diff --git a/docs/dd/d0e/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPat.html b/docs/dd/d0e/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPat.html index 9622443ec5..89e91e0f75 100644 --- a/docs/dd/d0e/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPat.html +++ b/docs/dd/d0e/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPat.html @@ -155,7 +155,7 @@ void Reset () override diff --git a/docs/dd/d11/mpd__builder_8cc_source.html b/docs/dd/d11/mpd__builder_8cc_source.html index aee3bd5385..85017112f9 100644 --- a/docs/dd/d11/mpd__builder_8cc_source.html +++ b/docs/dd/d11/mpd__builder_8cc_source.html @@ -128,1343 +128,1367 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    39 
    40 const int kAdaptationSetGroupNotSet = -1;
    41 
    -
    42 AdaptationSet::Role MediaInfoTextTypeToRole(MediaInfo::TextInfo::TextType type) {
    -
    43  switch (type) {
    -
    44  case MediaInfo::TextInfo::UNKNOWN:
    -
    45  LOG(WARNING) << "Unknown text type, assuming subtitle.";
    -
    46  return AdaptationSet::kRoleSubtitle;
    -
    47  case MediaInfo::TextInfo::CAPTION:
    -
    48  return AdaptationSet::kRoleCaption;
    -
    49  case MediaInfo::TextInfo::SUBTITLE:
    -
    50  return AdaptationSet::kRoleSubtitle;
    -
    51  default:
    -
    52  NOTREACHED() << "Unknown MediaInfo TextType: " << type
    -
    53  << " assuming subtitle.";
    -
    54  return AdaptationSet::kRoleSubtitle;
    -
    55  }
    -
    56 }
    -
    57 
    -
    58 std::string GetMimeType(const std::string& prefix,
    -
    59  MediaInfo::ContainerType container_type) {
    -
    60  switch (container_type) {
    -
    61  case MediaInfo::CONTAINER_MP4:
    -
    62  return prefix + "/mp4";
    -
    63  case MediaInfo::CONTAINER_MPEG2_TS:
    -
    64  // NOTE: DASH MPD spec uses lowercase but RFC3555 says uppercase.
    -
    65  return prefix + "/MP2T";
    -
    66  case MediaInfo::CONTAINER_WEBM:
    -
    67  return prefix + "/webm";
    -
    68  default:
    -
    69  break;
    -
    70  }
    -
    71 
    -
    72  // Unsupported container types should be rejected/handled by the caller.
    -
    73  LOG(ERROR) << "Unrecognized container type: " << container_type;
    -
    74  return std::string();
    -
    75 }
    -
    76 
    -
    77 void AddMpdNameSpaceInfo(XmlNode* mpd) {
    -
    78  DCHECK(mpd);
    -
    79 
    -
    80  static const char kXmlNamespace[] = "urn:mpeg:dash:schema:mpd:2011";
    -
    81  static const char kXmlNamespaceXsi[] =
    -
    82  "http://www.w3.org/2001/XMLSchema-instance";
    -
    83  static const char kXmlNamespaceXlink[] = "http://www.w3.org/1999/xlink";
    -
    84  static const char kDashSchemaMpd2011[] =
    -
    85  "urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd";
    -
    86  static const char kCencNamespace[] = "urn:mpeg:cenc:2013";
    -
    87 
    -
    88  mpd->SetStringAttribute("xmlns", kXmlNamespace);
    -
    89  mpd->SetStringAttribute("xmlns:xsi", kXmlNamespaceXsi);
    -
    90  mpd->SetStringAttribute("xmlns:xlink", kXmlNamespaceXlink);
    -
    91  mpd->SetStringAttribute("xsi:schemaLocation", kDashSchemaMpd2011);
    -
    92  mpd->SetStringAttribute("xmlns:cenc", kCencNamespace);
    -
    93 }
    -
    94 
    -
    95 bool IsPeriodNode(xmlNodePtr node) {
    -
    96  DCHECK(node);
    -
    97  int kEqual = 0;
    -
    98  return xmlStrcmp(node->name, reinterpret_cast<const xmlChar*>("Period")) ==
    -
    99  kEqual;
    -
    100 }
    -
    101 
    -
    102 // Find the first <Period> element. This does not recurse down the tree,
    -
    103 // only checks direct children. Returns the pointer to Period element on
    -
    104 // success, otherwise returns false.
    -
    105 // As noted here, we must traverse.
    -
    106 // http://www.xmlsoft.org/tutorial/ar01s04.html
    -
    107 xmlNodePtr FindPeriodNode(XmlNode* xml_node) {
    -
    108  for (xmlNodePtr node = xml_node->GetRawPtr()->xmlChildrenNode; node != NULL;
    -
    109  node = node->next) {
    -
    110  if (IsPeriodNode(node))
    -
    111  return node;
    -
    112  }
    -
    113 
    -
    114  return NULL;
    -
    115 }
    -
    116 
    -
    117 bool Positive(double d) {
    -
    118  return d > 0.0;
    -
    119 }
    -
    120 
    -
    121 // Return current time in XML DateTime format. The value is in UTC, so the
    -
    122 // string ends with a 'Z'.
    -
    123 std::string XmlDateTimeNowWithOffset(int32_t offset_seconds) {
    -
    124  base::Time time = base::Time::Now();
    -
    125  time += base::TimeDelta::FromSeconds(offset_seconds);
    -
    126  base::Time::Exploded time_exploded;
    -
    127  time.UTCExplode(&time_exploded);
    -
    128 
    -
    129  return base::StringPrintf("%4d-%02d-%02dT%02d:%02d:%02dZ", time_exploded.year,
    -
    130  time_exploded.month, time_exploded.day_of_month,
    -
    131  time_exploded.hour, time_exploded.minute,
    -
    132  time_exploded.second);
    -
    133 }
    -
    134 
    -
    135 void SetIfPositive(const char* attr_name, double value, XmlNode* mpd) {
    -
    136  if (Positive(value)) {
    -
    137  mpd->SetStringAttribute(attr_name, SecondsToXmlDuration(value));
    -
    138  }
    -
    139 }
    -
    140 
    -
    141 uint32_t GetTimeScale(const MediaInfo& media_info) {
    -
    142  if (media_info.has_reference_time_scale()) {
    -
    143  return media_info.reference_time_scale();
    -
    144  }
    -
    145 
    -
    146  if (media_info.has_video_info()) {
    -
    147  return media_info.video_info().time_scale();
    -
    148  }
    -
    149 
    -
    150  if (media_info.has_audio_info()) {
    -
    151  return media_info.audio_info().time_scale();
    -
    152  }
    -
    153 
    -
    154  LOG(WARNING) << "No timescale specified, using 1 as timescale.";
    -
    155  return 1;
    -
    156 }
    -
    157 
    -
    158 uint64_t LastSegmentStartTime(const SegmentInfo& segment_info) {
    -
    159  return segment_info.start_time + segment_info.duration * segment_info.repeat;
    -
    160 }
    -
    161 
    -
    162 // This is equal to |segment_info| end time
    -
    163 uint64_t LastSegmentEndTime(const SegmentInfo& segment_info) {
    -
    164  return segment_info.start_time +
    -
    165  segment_info.duration * (segment_info.repeat + 1);
    -
    166 }
    -
    167 
    -
    168 uint64_t LatestSegmentStartTime(const std::list<SegmentInfo>& segments) {
    -
    169  DCHECK(!segments.empty());
    -
    170  const SegmentInfo& latest_segment = segments.back();
    -
    171  return LastSegmentStartTime(latest_segment);
    -
    172 }
    -
    173 
    -
    174 // Given |timeshift_limit|, finds out the number of segments that are no longer
    -
    175 // valid and should be removed from |segment_info|.
    -
    176 int SearchTimedOutRepeatIndex(uint64_t timeshift_limit,
    -
    177  const SegmentInfo& segment_info) {
    -
    178  DCHECK_LE(timeshift_limit, LastSegmentEndTime(segment_info));
    -
    179  if (timeshift_limit < segment_info.start_time)
    -
    180  return 0;
    -
    181 
    -
    182  return (timeshift_limit - segment_info.start_time) / segment_info.duration;
    -
    183 }
    -
    184 
    -
    185 // Overload this function to support different types of |output|.
    -
    186 // Note that this could be done by call MpdBuilder::ToString() and use the
    -
    187 // result to write to a file, it requires an extra copy.
    -
    188 bool WriteXmlCharArrayToOutput(xmlChar* doc,
    -
    189  int doc_size,
    -
    190  std::string* output) {
    -
    191  DCHECK(doc);
    -
    192  DCHECK(output);
    -
    193  output->assign(doc, doc + doc_size);
    -
    194  return true;
    -
    195 }
    -
    196 
    -
    197 bool WriteXmlCharArrayToOutput(xmlChar* doc,
    -
    198  int doc_size,
    -
    199  media::File* output) {
    -
    200  DCHECK(doc);
    -
    201  DCHECK(output);
    -
    202  if (output->Write(doc, doc_size) < doc_size)
    -
    203  return false;
    -
    204 
    -
    205  return output->Flush();
    -
    206 }
    -
    207 
    -
    208 std::string MakePathRelative(const std::string& path,
    -
    209  const std::string& mpd_dir) {
    -
    210  return (path.find(mpd_dir) == 0) ? path.substr(mpd_dir.size()) : path;
    -
    211 }
    -
    212 
    -
    213 // Check whether the video info has width and height.
    -
    214 // DASH IOP also requires several other fields for video representations, namely
    -
    215 // width, height, framerate, and sar.
    -
    216 bool HasRequiredVideoFields(const MediaInfo_VideoInfo& video_info) {
    -
    217  if (!video_info.has_height() || !video_info.has_width()) {
    -
    218  LOG(ERROR)
    -
    219  << "Width and height are required fields for generating a valid MPD.";
    -
    220  return false;
    -
    221  }
    -
    222  // These fields are not required for a valid MPD, but required for DASH IOP
    -
    223  // compliant MPD. MpdBuilder can keep generating MPDs without these fields.
    -
    224  LOG_IF(WARNING, !video_info.has_time_scale())
    -
    225  << "Video info does not contain timescale required for "
    -
    226  "calculating framerate. @frameRate is required for DASH IOP.";
    -
    227  LOG_IF(WARNING, !video_info.has_frame_duration())
    -
    228  << "Video info does not contain frame duration required "
    -
    229  "for calculating framerate. @frameRate is required for DASH IOP.";
    -
    230  LOG_IF(WARNING, !video_info.has_pixel_width())
    -
    231  << "Video info does not contain pixel_width to calculate the sample "
    -
    232  "aspect ratio required for DASH IOP.";
    -
    233  LOG_IF(WARNING, !video_info.has_pixel_height())
    -
    234  << "Video info does not contain pixel_height to calculate the sample "
    -
    235  "aspect ratio required for DASH IOP.";
    -
    236  return true;
    -
    237 }
    -
    238 
    -
    239 // Returns the picture aspect ratio string e.g. "16:9", "4:3".
    -
    240 // "Reducing the quotient to minimal form" does not work well in practice as
    -
    241 // there may be some rounding performed in the input, e.g. the resolution of
    -
    242 // 480p is 854:480 for 16:9 aspect ratio, can only be reduced to 427:240.
    -
    243 // The algorithm finds out the pair of integers, num and den, where num / den is
    -
    244 // the closest ratio to scaled_width / scaled_height, by looping den through
    -
    245 // common values.
    -
    246 std::string GetPictureAspectRatio(uint32_t width,
    -
    247  uint32_t height,
    -
    248  uint32_t pixel_width,
    -
    249  uint32_t pixel_height) {
    -
    250  const uint32_t scaled_width = pixel_width * width;
    -
    251  const uint32_t scaled_height = pixel_height * height;
    -
    252  const double par = static_cast<double>(scaled_width) / scaled_height;
    -
    253 
    -
    254  // Typical aspect ratios have par_y less than or equal to 19:
    -
    255  // https://en.wikipedia.org/wiki/List_of_common_resolutions
    -
    256  const uint32_t kLargestPossibleParY = 19;
    -
    257 
    -
    258  uint32_t par_num = 0;
    -
    259  uint32_t par_den = 0;
    -
    260  double min_error = 1.0;
    -
    261  for (uint32_t den = 1; den <= kLargestPossibleParY; ++den) {
    -
    262  uint32_t num = par * den + 0.5;
    -
    263  double error = fabs(par - static_cast<double>(num) / den);
    -
    264  if (error < min_error) {
    -
    265  min_error = error;
    -
    266  par_num = num;
    -
    267  par_den = den;
    -
    268  if (error == 0) break;
    -
    269  }
    -
    270  }
    -
    271  VLOG(2) << "width*pix_width : height*pixel_height (" << scaled_width << ":"
    -
    272  << scaled_height << ") reduced to " << par_num << ":" << par_den
    -
    273  << " with error " << min_error << ".";
    -
    274 
    -
    275  return base::IntToString(par_num) + ":" + base::IntToString(par_den);
    -
    276 }
    -
    277 
    -
    278 // Adds an entry to picture_aspect_ratio if the size of picture_aspect_ratio is
    -
    279 // less than 2 and video_info has both pixel width and pixel height.
    -
    280 void AddPictureAspectRatio(
    -
    281  const MediaInfo::VideoInfo& video_info,
    -
    282  std::set<std::string>* picture_aspect_ratio) {
    -
    283  // If there are more than one entries in picture_aspect_ratio, the @par
    -
    284  // attribute cannot be set, so skip.
    -
    285  if (picture_aspect_ratio->size() > 1)
    -
    286  return;
    -
    287 
    -
    288  if (video_info.width() == 0 || video_info.height() == 0 ||
    -
    289  video_info.pixel_width() == 0 || video_info.pixel_height() == 0) {
    -
    290  // If there is even one Representation without a @sar attribute, @par cannot
    -
    291  // be calculated.
    -
    292  // Just populate the set with at least 2 bogus strings so that further call
    -
    293  // to this function will bail out immediately.
    -
    294  picture_aspect_ratio->insert("bogus");
    -
    295  picture_aspect_ratio->insert("entries");
    -
    296  return;
    -
    297  }
    -
    298 
    -
    299  const std::string par = GetPictureAspectRatio(
    -
    300  video_info.width(), video_info.height(),
    -
    301  video_info.pixel_width(), video_info.pixel_height());
    -
    302  DVLOG(1) << "Setting par as: " << par
    -
    303  << " for video with width: " << video_info.width()
    -
    304  << " height: " << video_info.height()
    -
    305  << " pixel_width: " << video_info.pixel_width() << " pixel_height; "
    -
    306  << video_info.pixel_height();
    -
    307  picture_aspect_ratio->insert(par);
    -
    308 }
    -
    309 
    -
    310 std::string RoleToText(AdaptationSet::Role role) {
    -
    311  // Using switch so that the compiler can detect whether there is a case that's
    -
    312  // not being handled.
    -
    313  switch (role) {
    -
    314  case AdaptationSet::kRoleCaption:
    -
    315  return "caption";
    -
    316  case AdaptationSet::kRoleSubtitle:
    -
    317  return "subtitle";
    -
    318  case AdaptationSet::kRoleMain:
    -
    319  return "main";
    -
    320  case AdaptationSet::kRoleAlternate:
    -
    321  return "alternate";
    -
    322  case AdaptationSet::kRoleSupplementary:
    -
    323  return "supplementary";
    -
    324  case AdaptationSet::kRoleCommentary:
    -
    325  return "commentary";
    -
    326  case AdaptationSet::kRoleDub:
    -
    327  return "dub";
    -
    328  default:
    -
    329  NOTREACHED();
    -
    330  return "";
    -
    331  }
    -
    332 
    -
    333  NOTREACHED();
    -
    334  return "";
    -
    335 }
    -
    336 
    -
    337 // Spooky static initialization/cleanup of libxml.
    -
    338 class LibXmlInitializer {
    -
    339  public:
    -
    340  LibXmlInitializer() : initialized_(false) {
    -
    341  base::AutoLock lock(lock_);
    -
    342  if (!initialized_) {
    -
    343  xmlInitParser();
    -
    344  initialized_ = true;
    -
    345  }
    -
    346  }
    -
    347 
    -
    348  ~LibXmlInitializer() {
    -
    349  base::AutoLock lock(lock_);
    -
    350  if (initialized_) {
    -
    351  xmlCleanupParser();
    -
    352  initialized_ = false;
    -
    353  }
    -
    354  }
    -
    355 
    -
    356  private:
    -
    357  base::Lock lock_;
    -
    358  bool initialized_;
    -
    359 
    -
    360  DISALLOW_COPY_AND_ASSIGN(LibXmlInitializer);
    -
    361 };
    -
    362 
    -
    363 class RepresentationStateChangeListenerImpl
    -
    364  : public RepresentationStateChangeListener {
    -
    365  public:
    -
    366  // |adaptation_set| is not owned by this class.
    -
    367  RepresentationStateChangeListenerImpl(uint32_t representation_id,
    -
    368  AdaptationSet* adaptation_set)
    -
    369  : representation_id_(representation_id), adaptation_set_(adaptation_set) {
    -
    370  DCHECK(adaptation_set_);
    -
    371  }
    -
    372  ~RepresentationStateChangeListenerImpl() override {}
    -
    373 
    -
    374  // RepresentationStateChangeListener implementation.
    -
    375  void OnNewSegmentForRepresentation(uint64_t start_time,
    -
    376  uint64_t duration) override {
    -
    377  adaptation_set_->OnNewSegmentForRepresentation(representation_id_,
    -
    378  start_time, duration);
    -
    379  }
    -
    380 
    -
    381  void OnSetFrameRateForRepresentation(uint32_t frame_duration,
    -
    382  uint32_t timescale) override {
    -
    383  adaptation_set_->OnSetFrameRateForRepresentation(representation_id_,
    -
    384  frame_duration, timescale);
    -
    385  }
    -
    386 
    -
    387  private:
    -
    388  const uint32_t representation_id_;
    -
    389  AdaptationSet* const adaptation_set_;
    -
    390 
    -
    391  DISALLOW_COPY_AND_ASSIGN(RepresentationStateChangeListenerImpl);
    -
    392 };
    -
    393 
    -
    394 } // namespace
    -
    395 
    -
    396 MpdBuilder::MpdBuilder(MpdType type, const MpdOptions& mpd_options)
    -
    397  : type_(type),
    -
    398  mpd_options_(mpd_options),
    -
    399  adaptation_sets_deleter_(&adaptation_sets_) {}
    -
    400 
    -
    401 MpdBuilder::~MpdBuilder() {}
    -
    402 
    -
    403 void MpdBuilder::AddBaseUrl(const std::string& base_url) {
    -
    404  base_urls_.push_back(base_url);
    -
    405 }
    -
    406 
    -
    407 AdaptationSet* MpdBuilder::AddAdaptationSet(const std::string& lang) {
    -
    408  scoped_ptr<AdaptationSet> adaptation_set(
    -
    409  new AdaptationSet(adaptation_set_counter_.GetNext(), lang, mpd_options_,
    -
    410  type_, &representation_counter_));
    -
    411 
    -
    412  DCHECK(adaptation_set);
    -
    413  adaptation_sets_.push_back(adaptation_set.get());
    -
    414  return adaptation_set.release();
    -
    415 }
    -
    416 
    - -
    418  DCHECK(output_file);
    -
    419  return WriteMpdToOutput(output_file);
    -
    420 }
    -
    421 
    -
    422 bool MpdBuilder::ToString(std::string* output) {
    -
    423  DCHECK(output);
    -
    424  return WriteMpdToOutput(output);
    -
    425 }
    -
    426 template <typename OutputType>
    -
    427 bool MpdBuilder::WriteMpdToOutput(OutputType* output) {
    -
    428  static LibXmlInitializer lib_xml_initializer;
    -
    429 
    -
    430  xml::scoped_xml_ptr<xmlDoc> doc(GenerateMpd());
    -
    431  if (!doc.get())
    -
    432  return false;
    -
    433 
    -
    434  static const int kNiceFormat = 1;
    -
    435  int doc_str_size = 0;
    -
    436  xmlChar* doc_str = NULL;
    -
    437  xmlDocDumpFormatMemoryEnc(doc.get(), &doc_str, &doc_str_size, "UTF-8",
    -
    438  kNiceFormat);
    -
    439 
    -
    440  bool result = WriteXmlCharArrayToOutput(doc_str, doc_str_size, output);
    -
    441  xmlFree(doc_str);
    -
    442 
    -
    443  // Cleanup, free the doc.
    -
    444  doc.reset();
    -
    445  return result;
    -
    446 }
    -
    447 
    -
    448 xmlDocPtr MpdBuilder::GenerateMpd() {
    -
    449  // Setup nodes.
    -
    450  static const char kXmlVersion[] = "1.0";
    -
    451  xml::scoped_xml_ptr<xmlDoc> doc(xmlNewDoc(BAD_CAST kXmlVersion));
    -
    452  XmlNode mpd("MPD");
    -
    453 
    -
    454  // Iterate thru AdaptationSets and add them to one big Period element.
    -
    455  XmlNode period("Period");
    -
    456  std::list<AdaptationSet*>::iterator adaptation_sets_it =
    -
    457  adaptation_sets_.begin();
    -
    458  for (; adaptation_sets_it != adaptation_sets_.end(); ++adaptation_sets_it) {
    -
    459  xml::scoped_xml_ptr<xmlNode> child((*adaptation_sets_it)->GetXml());
    -
    460  if (!child.get() || !period.AddChild(child.Pass()))
    -
    461  return NULL;
    -
    462  }
    -
    463 
    -
    464  // Add baseurls to MPD.
    -
    465  std::list<std::string>::const_iterator base_urls_it = base_urls_.begin();
    -
    466  for (; base_urls_it != base_urls_.end(); ++base_urls_it) {
    -
    467  XmlNode base_url("BaseURL");
    -
    468  base_url.SetContent(*base_urls_it);
    -
    469 
    -
    470  if (!mpd.AddChild(base_url.PassScopedPtr()))
    -
    471  return NULL;
    -
    472  }
    -
    473 
    -
    474  if (type_ == kDynamic) {
    -
    475  // This is the only Period and it is a regular period.
    -
    476  period.SetStringAttribute("start", "PT0S");
    -
    477  }
    -
    478 
    -
    479  if (!mpd.AddChild(period.PassScopedPtr()))
    -
    480  return NULL;
    -
    481 
    -
    482  AddMpdNameSpaceInfo(&mpd);
    -
    483  AddCommonMpdInfo(&mpd);
    -
    484  switch (type_) {
    -
    485  case kStatic:
    -
    486  AddStaticMpdInfo(&mpd);
    -
    487  break;
    -
    488  case kDynamic:
    -
    489  AddDynamicMpdInfo(&mpd);
    -
    490  break;
    -
    491  default:
    -
    492  NOTREACHED() << "Unknown MPD type: " << type_;
    -
    493  break;
    -
    494  }
    -
    495 
    -
    496  DCHECK(doc);
    -
    497  std::string version_string =
    -
    498  "Generated with https://github.com/google/edash-packager version " +
    -
    499  mpd_options_.packager_version_string;
    -
    500  xml::scoped_xml_ptr<xmlNode> comment(
    -
    501  xmlNewDocComment(doc.get(), BAD_CAST version_string.c_str()));
    -
    502  xmlDocSetRootElement(doc.get(), comment.get());
    -
    503  xmlAddSibling(comment.release(), mpd.Release());
    -
    504  return doc.release();
    -
    505 }
    -
    506 
    -
    507 void MpdBuilder::AddCommonMpdInfo(XmlNode* mpd_node) {
    -
    508  if (Positive(mpd_options_.min_buffer_time)) {
    -
    509  mpd_node->SetStringAttribute(
    -
    510  "minBufferTime", SecondsToXmlDuration(mpd_options_.min_buffer_time));
    -
    511  } else {
    -
    512  LOG(ERROR) << "minBufferTime value not specified.";
    -
    513  // TODO(tinskip): Propagate error.
    -
    514  }
    -
    515 }
    -
    516 
    -
    517 void MpdBuilder::AddStaticMpdInfo(XmlNode* mpd_node) {
    -
    518  DCHECK(mpd_node);
    -
    519  DCHECK_EQ(MpdBuilder::kStatic, type_);
    -
    520 
    -
    521  static const char kStaticMpdType[] = "static";
    -
    522  static const char kStaticMpdProfile[] =
    -
    523  "urn:mpeg:dash:profile:isoff-on-demand:2011";
    -
    524  mpd_node->SetStringAttribute("type", kStaticMpdType);
    -
    525  mpd_node->SetStringAttribute("profiles", kStaticMpdProfile);
    -
    526  mpd_node->SetStringAttribute(
    -
    527  "mediaPresentationDuration",
    -
    528  SecondsToXmlDuration(GetStaticMpdDuration(mpd_node)));
    -
    529 }
    -
    530 
    -
    531 void MpdBuilder::AddDynamicMpdInfo(XmlNode* mpd_node) {
    -
    532  DCHECK(mpd_node);
    -
    533  DCHECK_EQ(MpdBuilder::kDynamic, type_);
    -
    534 
    -
    535  static const char kDynamicMpdType[] = "dynamic";
    -
    536  static const char kDynamicMpdProfile[] =
    -
    537  "urn:mpeg:dash:profile:isoff-live:2011";
    -
    538  mpd_node->SetStringAttribute("type", kDynamicMpdType);
    -
    539  mpd_node->SetStringAttribute("profiles", kDynamicMpdProfile);
    -
    540 
    -
    541  // 'availabilityStartTime' is required for dynamic profile. Calculate if
    -
    542  // not already calculated.
    -
    543  if (availability_start_time_.empty()) {
    -
    544  double earliest_presentation_time;
    -
    545  if (GetEarliestTimestamp(&earliest_presentation_time)) {
    -
    546  availability_start_time_ =
    -
    547  XmlDateTimeNowWithOffset(mpd_options_.availability_time_offset -
    -
    548  std::ceil(earliest_presentation_time));
    -
    549  } else {
    -
    550  LOG(ERROR) << "Could not determine the earliest segment presentation "
    -
    551  "time for availabilityStartTime calculation.";
    -
    552  // TODO(tinskip). Propagate an error.
    -
    553  }
    -
    554  }
    -
    555  if (!availability_start_time_.empty())
    -
    556  mpd_node->SetStringAttribute("availabilityStartTime",
    -
    557  availability_start_time_);
    -
    558 
    -
    559  if (Positive(mpd_options_.minimum_update_period)) {
    -
    560  mpd_node->SetStringAttribute(
    -
    561  "minimumUpdatePeriod",
    -
    562  SecondsToXmlDuration(mpd_options_.minimum_update_period));
    -
    563  } else {
    -
    564  LOG(WARNING) << "The profile is dynamic but no minimumUpdatePeriod "
    -
    565  "specified.";
    -
    566  }
    -
    567 
    -
    568  SetIfPositive("timeShiftBufferDepth", mpd_options_.time_shift_buffer_depth,
    -
    569  mpd_node);
    -
    570  SetIfPositive("suggestedPresentationDelay",
    -
    571  mpd_options_.suggested_presentation_delay, mpd_node);
    -
    572 }
    -
    573 
    -
    574 float MpdBuilder::GetStaticMpdDuration(XmlNode* mpd_node) {
    -
    575  DCHECK(mpd_node);
    -
    576  DCHECK_EQ(MpdBuilder::kStatic, type_);
    -
    577 
    -
    578  xmlNodePtr period_node = FindPeriodNode(mpd_node);
    -
    579  DCHECK(period_node) << "Period element must be a child of mpd_node.";
    -
    580  DCHECK(IsPeriodNode(period_node));
    -
    581 
    -
    582  // Attribute mediaPresentationDuration must be present for 'static' MPD. So
    -
    583  // setting "PT0S" is required even if none of the representaions have duration
    -
    584  // attribute.
    -
    585  float max_duration = 0.0f;
    -
    586  for (xmlNodePtr adaptation_set = xmlFirstElementChild(period_node);
    -
    587  adaptation_set; adaptation_set = xmlNextElementSibling(adaptation_set)) {
    -
    588  for (xmlNodePtr representation = xmlFirstElementChild(adaptation_set);
    -
    589  representation;
    -
    590  representation = xmlNextElementSibling(representation)) {
    -
    591  float duration = 0.0f;
    -
    592  if (GetDurationAttribute(representation, &duration)) {
    -
    593  max_duration = max_duration > duration ? max_duration : duration;
    -
    594 
    -
    595  // 'duration' attribute is there only to help generate MPD, not
    -
    596  // necessary for MPD, remove the attribute.
    -
    597  xmlUnsetProp(representation, BAD_CAST "duration");
    -
    598  }
    -
    599  }
    -
    600  }
    -
    601 
    -
    602  return max_duration;
    -
    603 }
    -
    604 
    -
    605 bool MpdBuilder::GetEarliestTimestamp(double* timestamp_seconds) {
    -
    606  DCHECK(timestamp_seconds);
    -
    607 
    -
    608  double earliest_timestamp(-1);
    -
    609  for (std::list<AdaptationSet*>::const_iterator iter =
    -
    610  adaptation_sets_.begin();
    -
    611  iter != adaptation_sets_.end(); ++iter) {
    -
    612  double timestamp;
    -
    613  if ((*iter)->GetEarliestTimestamp(&timestamp) &&
    -
    614  ((earliest_timestamp < 0) || (timestamp < earliest_timestamp))) {
    -
    615  earliest_timestamp = timestamp;
    -
    616  }
    -
    617  }
    -
    618  if (earliest_timestamp < 0)
    -
    619  return false;
    -
    620 
    -
    621  *timestamp_seconds = earliest_timestamp;
    -
    622  return true;
    -
    623 }
    -
    624 
    -
    625 void MpdBuilder::MakePathsRelativeToMpd(const std::string& mpd_path,
    -
    626  MediaInfo* media_info) {
    -
    627  DCHECK(media_info);
    -
    628  const std::string kFileProtocol("file://");
    -
    629  std::string mpd_file_path = (mpd_path.find(kFileProtocol) == 0)
    -
    630  ? mpd_path.substr(kFileProtocol.size())
    -
    631  : mpd_path;
    -
    632 
    -
    633  if (!mpd_file_path.empty()) {
    -
    634  std::string mpd_dir(
    -
    635  FilePath(mpd_file_path).DirName().AsEndingWithSeparator().value());
    -
    636  if (!mpd_dir.empty()) {
    -
    637  if (media_info->has_media_file_name()) {
    -
    638  media_info->set_media_file_name(
    -
    639  MakePathRelative(media_info->media_file_name(), mpd_dir));
    -
    640  }
    -
    641  if (media_info->has_init_segment_name()) {
    -
    642  media_info->set_init_segment_name(
    -
    643  MakePathRelative(media_info->init_segment_name(), mpd_dir));
    -
    644  }
    -
    645  if (media_info->has_segment_template()) {
    -
    646  media_info->set_segment_template(
    -
    647  MakePathRelative(media_info->segment_template(), mpd_dir));
    -
    648  }
    -
    649  }
    -
    650  }
    -
    651 }
    -
    652 
    -
    653 AdaptationSet::AdaptationSet(uint32_t adaptation_set_id,
    -
    654  const std::string& lang,
    -
    655  const MpdOptions& mpd_options,
    -
    656  MpdBuilder::MpdType mpd_type,
    -
    657  base::AtomicSequenceNumber* counter)
    -
    658  : representations_deleter_(&representations_),
    -
    659  representation_counter_(counter),
    -
    660  id_(adaptation_set_id),
    -
    661  lang_(lang),
    -
    662  mpd_options_(mpd_options),
    -
    663  mpd_type_(mpd_type),
    -
    664  group_(kAdaptationSetGroupNotSet),
    -
    665  segments_aligned_(kSegmentAlignmentUnknown),
    -
    666  force_set_segment_alignment_(false) {
    -
    667  DCHECK(counter);
    -
    668 }
    -
    669 
    -
    670 AdaptationSet::~AdaptationSet() {}
    -
    671 
    -
    672 Representation* AdaptationSet::AddRepresentation(const MediaInfo& media_info) {
    -
    673  const uint32_t representation_id = representation_counter_->GetNext();
    -
    674  // Note that AdaptationSet outlive Representation, so this object
    -
    675  // will die before AdaptationSet.
    -
    676  scoped_ptr<RepresentationStateChangeListener> listener(
    -
    677  new RepresentationStateChangeListenerImpl(representation_id, this));
    -
    678  scoped_ptr<Representation> representation(new Representation(
    -
    679  media_info, mpd_options_, representation_id, listener.Pass()));
    -
    680 
    -
    681  if (!representation->Init())
    -
    682  return NULL;
    -
    683 
    -
    684  // For videos, record the width, height, and the frame rate to calculate the
    -
    685  // max {width,height,framerate} required for DASH IOP.
    -
    686  if (media_info.has_video_info()) {
    -
    687  const MediaInfo::VideoInfo& video_info = media_info.video_info();
    -
    688  DCHECK(video_info.has_width());
    -
    689  DCHECK(video_info.has_height());
    -
    690  video_widths_.insert(video_info.width());
    -
    691  video_heights_.insert(video_info.height());
    -
    692 
    -
    693  if (video_info.has_time_scale() && video_info.has_frame_duration())
    -
    694  RecordFrameRate(video_info.frame_duration(), video_info.time_scale());
    -
    695 
    -
    696  AddPictureAspectRatio(video_info, &picture_aspect_ratio_);
    -
    697  }
    -
    698 
    -
    699  if (media_info.has_video_info()) {
    -
    700  content_type_ = "video";
    -
    701  } else if (media_info.has_audio_info()) {
    -
    702  content_type_ = "audio";
    -
    703  } else if (media_info.has_text_info()) {
    -
    704  content_type_ = "text";
    -
    705 
    -
    706  if (media_info.text_info().has_type() &&
    -
    707  (media_info.text_info().type() != MediaInfo::TextInfo::UNKNOWN)) {
    -
    708  roles_.insert(MediaInfoTextTypeToRole(media_info.text_info().type()));
    -
    709  }
    -
    710  }
    -
    711 
    -
    712  representations_.push_back(representation.get());
    -
    713  return representation.release();
    -
    714 }
    -
    715 
    - -
    717  const ContentProtectionElement& content_protection_element) {
    -
    718  content_protection_elements_.push_back(content_protection_element);
    -
    719  RemoveDuplicateAttributes(&content_protection_elements_.back());
    -
    720 }
    -
    721 
    -
    722 void AdaptationSet::UpdateContentProtectionPssh(const std::string& drm_uuid,
    -
    723  const std::string& pssh) {
    -
    724  UpdateContentProtectionPsshHelper(drm_uuid, pssh,
    -
    725  &content_protection_elements_);
    -
    726 }
    -
    727 
    -
    728 void AdaptationSet::AddRole(Role role) {
    -
    729  roles_.insert(role);
    -
    730 }
    -
    731 
    -
    732 // Creates a copy of <AdaptationSet> xml element, iterate thru all the
    -
    733 // <Representation> (child) elements and add them to the copy.
    -
    734 xml::scoped_xml_ptr<xmlNode> AdaptationSet::GetXml() {
    -
    735  AdaptationSetXmlNode adaptation_set;
    -
    736 
    -
    737  if (!adaptation_set.AddContentProtectionElements(
    -
    738  content_protection_elements_)) {
    -
    739  return xml::scoped_xml_ptr<xmlNode>();
    -
    740  }
    -
    741  for (std::set<Role>::const_iterator role_it = roles_.begin();
    -
    742  role_it != roles_.end(); ++role_it) {
    -
    743  adaptation_set.AddRoleElement("urn:mpeg:dash:role:2011",
    -
    744  RoleToText(*role_it));
    -
    745  }
    -
    746 
    -
    747  std::list<Representation*>::iterator representation_it =
    -
    748  representations_.begin();
    -
    749 
    -
    750  for (; representation_it != representations_.end(); ++representation_it) {
    -
    751  xml::scoped_xml_ptr<xmlNode> child((*representation_it)->GetXml());
    -
    752  if (!child || !adaptation_set.AddChild(child.Pass()))
    -
    753  return xml::scoped_xml_ptr<xmlNode>();
    -
    754  }
    -
    755 
    -
    756  adaptation_set.SetId(id_);
    -
    757  adaptation_set.SetStringAttribute("contentType", content_type_);
    -
    758  if (!lang_.empty() && lang_ != "und") {
    -
    759  adaptation_set.SetStringAttribute("lang", LanguageToShortestForm(lang_));
    -
    760  }
    -
    761 
    -
    762  // Note that std::{set,map} are ordered, so the last element is the max value.
    -
    763  if (video_widths_.size() == 1) {
    -
    764  adaptation_set.SetIntegerAttribute("width", *video_widths_.begin());
    -
    765  } else if (video_widths_.size() > 1) {
    -
    766  adaptation_set.SetIntegerAttribute("maxWidth", *video_widths_.rbegin());
    -
    767  }
    -
    768  if (video_heights_.size() == 1) {
    -
    769  adaptation_set.SetIntegerAttribute("height", *video_heights_.begin());
    -
    770  } else if (video_heights_.size() > 1) {
    -
    771  adaptation_set.SetIntegerAttribute("maxHeight", *video_heights_.rbegin());
    -
    772  }
    -
    773 
    -
    774  if (video_frame_rates_.size() == 1) {
    -
    775  adaptation_set.SetStringAttribute("frameRate",
    -
    776  video_frame_rates_.begin()->second);
    -
    777  } else if (video_frame_rates_.size() > 1) {
    -
    778  adaptation_set.SetStringAttribute("maxFrameRate",
    -
    779  video_frame_rates_.rbegin()->second);
    -
    780  }
    -
    781 
    -
    782  // Note: must be checked before checking segments_aligned_ (below).
    -
    783  if (mpd_type_ == MpdBuilder::kStatic) {
    -
    784  CheckVodSegmentAlignment();
    -
    785  }
    -
    786 
    -
    787  if (segments_aligned_ == kSegmentAlignmentTrue) {
    -
    788  adaptation_set.SetStringAttribute(mpd_type_ == MpdBuilder::kStatic
    -
    789  ? "subsegmentAlignment"
    -
    790  : "segmentAlignment",
    -
    791  "true");
    -
    792  }
    +
    42 AdaptationSet::Role MediaInfoTextTypeToRole(
    +
    43  MediaInfo::TextInfo::TextType type) {
    +
    44  switch (type) {
    +
    45  case MediaInfo::TextInfo::UNKNOWN:
    +
    46  LOG(WARNING) << "Unknown text type, assuming subtitle.";
    +
    47  return AdaptationSet::kRoleSubtitle;
    +
    48  case MediaInfo::TextInfo::CAPTION:
    +
    49  return AdaptationSet::kRoleCaption;
    +
    50  case MediaInfo::TextInfo::SUBTITLE:
    +
    51  return AdaptationSet::kRoleSubtitle;
    +
    52  default:
    +
    53  NOTREACHED() << "Unknown MediaInfo TextType: " << type
    +
    54  << " assuming subtitle.";
    +
    55  return AdaptationSet::kRoleSubtitle;
    +
    56  }
    +
    57 }
    +
    58 
    +
    59 std::string GetMimeType(const std::string& prefix,
    +
    60  MediaInfo::ContainerType container_type) {
    +
    61  switch (container_type) {
    +
    62  case MediaInfo::CONTAINER_MP4:
    +
    63  return prefix + "/mp4";
    +
    64  case MediaInfo::CONTAINER_MPEG2_TS:
    +
    65  // NOTE: DASH MPD spec uses lowercase but RFC3555 says uppercase.
    +
    66  return prefix + "/MP2T";
    +
    67  case MediaInfo::CONTAINER_WEBM:
    +
    68  return prefix + "/webm";
    +
    69  default:
    +
    70  break;
    +
    71  }
    +
    72 
    +
    73  // Unsupported container types should be rejected/handled by the caller.
    +
    74  LOG(ERROR) << "Unrecognized container type: " << container_type;
    +
    75  return std::string();
    +
    76 }
    +
    77 
    +
    78 void AddMpdNameSpaceInfo(XmlNode* mpd) {
    +
    79  DCHECK(mpd);
    +
    80 
    +
    81  static const char kXmlNamespace[] = "urn:mpeg:dash:schema:mpd:2011";
    +
    82  static const char kXmlNamespaceXsi[] =
    +
    83  "http://www.w3.org/2001/XMLSchema-instance";
    +
    84  static const char kXmlNamespaceXlink[] = "http://www.w3.org/1999/xlink";
    +
    85  static const char kDashSchemaMpd2011[] =
    +
    86  "urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd";
    +
    87  static const char kCencNamespace[] = "urn:mpeg:cenc:2013";
    +
    88 
    +
    89  mpd->SetStringAttribute("xmlns", kXmlNamespace);
    +
    90  mpd->SetStringAttribute("xmlns:xsi", kXmlNamespaceXsi);
    +
    91  mpd->SetStringAttribute("xmlns:xlink", kXmlNamespaceXlink);
    +
    92  mpd->SetStringAttribute("xsi:schemaLocation", kDashSchemaMpd2011);
    +
    93  mpd->SetStringAttribute("xmlns:cenc", kCencNamespace);
    +
    94 }
    +
    95 
    +
    96 bool IsPeriodNode(xmlNodePtr node) {
    +
    97  DCHECK(node);
    +
    98  int kEqual = 0;
    +
    99  return xmlStrcmp(node->name, reinterpret_cast<const xmlChar*>("Period")) ==
    +
    100  kEqual;
    +
    101 }
    +
    102 
    +
    103 // Find the first <Period> element. This does not recurse down the tree,
    +
    104 // only checks direct children. Returns the pointer to Period element on
    +
    105 // success, otherwise returns false.
    +
    106 // As noted here, we must traverse.
    +
    107 // http://www.xmlsoft.org/tutorial/ar01s04.html
    +
    108 xmlNodePtr FindPeriodNode(XmlNode* xml_node) {
    +
    109  for (xmlNodePtr node = xml_node->GetRawPtr()->xmlChildrenNode; node != NULL;
    +
    110  node = node->next) {
    +
    111  if (IsPeriodNode(node))
    +
    112  return node;
    +
    113  }
    +
    114 
    +
    115  return NULL;
    +
    116 }
    +
    117 
    +
    118 bool Positive(double d) {
    +
    119  return d > 0.0;
    +
    120 }
    +
    121 
    +
    122 // Return current time in XML DateTime format. The value is in UTC, so the
    +
    123 // string ends with a 'Z'.
    +
    124 std::string XmlDateTimeNowWithOffset(int32_t offset_seconds) {
    +
    125  base::Time time = base::Time::Now();
    +
    126  time += base::TimeDelta::FromSeconds(offset_seconds);
    +
    127  base::Time::Exploded time_exploded;
    +
    128  time.UTCExplode(&time_exploded);
    +
    129 
    +
    130  return base::StringPrintf("%4d-%02d-%02dT%02d:%02d:%02dZ", time_exploded.year,
    +
    131  time_exploded.month, time_exploded.day_of_month,
    +
    132  time_exploded.hour, time_exploded.minute,
    +
    133  time_exploded.second);
    +
    134 }
    +
    135 
    +
    136 void SetIfPositive(const char* attr_name, double value, XmlNode* mpd) {
    +
    137  if (Positive(value)) {
    +
    138  mpd->SetStringAttribute(attr_name, SecondsToXmlDuration(value));
    +
    139  }
    +
    140 }
    +
    141 
    +
    142 uint32_t GetTimeScale(const MediaInfo& media_info) {
    +
    143  if (media_info.has_reference_time_scale()) {
    +
    144  return media_info.reference_time_scale();
    +
    145  }
    +
    146 
    +
    147  if (media_info.has_video_info()) {
    +
    148  return media_info.video_info().time_scale();
    +
    149  }
    +
    150 
    +
    151  if (media_info.has_audio_info()) {
    +
    152  return media_info.audio_info().time_scale();
    +
    153  }
    +
    154 
    +
    155  LOG(WARNING) << "No timescale specified, using 1 as timescale.";
    +
    156  return 1;
    +
    157 }
    +
    158 
    +
    159 uint64_t LastSegmentStartTime(const SegmentInfo& segment_info) {
    +
    160  return segment_info.start_time + segment_info.duration * segment_info.repeat;
    +
    161 }
    +
    162 
    +
    163 // This is equal to |segment_info| end time
    +
    164 uint64_t LastSegmentEndTime(const SegmentInfo& segment_info) {
    +
    165  return segment_info.start_time +
    +
    166  segment_info.duration * (segment_info.repeat + 1);
    +
    167 }
    +
    168 
    +
    169 uint64_t LatestSegmentStartTime(const std::list<SegmentInfo>& segments) {
    +
    170  DCHECK(!segments.empty());
    +
    171  const SegmentInfo& latest_segment = segments.back();
    +
    172  return LastSegmentStartTime(latest_segment);
    +
    173 }
    +
    174 
    +
    175 // Given |timeshift_limit|, finds out the number of segments that are no longer
    +
    176 // valid and should be removed from |segment_info|.
    +
    177 int SearchTimedOutRepeatIndex(uint64_t timeshift_limit,
    +
    178  const SegmentInfo& segment_info) {
    +
    179  DCHECK_LE(timeshift_limit, LastSegmentEndTime(segment_info));
    +
    180  if (timeshift_limit < segment_info.start_time)
    +
    181  return 0;
    +
    182 
    +
    183  return (timeshift_limit - segment_info.start_time) / segment_info.duration;
    +
    184 }
    +
    185 
    +
    186 // Overload this function to support different types of |output|.
    +
    187 // Note that this could be done by call MpdBuilder::ToString() and use the
    +
    188 // result to write to a file, it requires an extra copy.
    +
    189 bool WriteXmlCharArrayToOutput(xmlChar* doc,
    +
    190  int doc_size,
    +
    191  std::string* output) {
    +
    192  DCHECK(doc);
    +
    193  DCHECK(output);
    +
    194  output->assign(doc, doc + doc_size);
    +
    195  return true;
    +
    196 }
    +
    197 
    +
    198 bool WriteXmlCharArrayToOutput(xmlChar* doc,
    +
    199  int doc_size,
    +
    200  media::File* output) {
    +
    201  DCHECK(doc);
    +
    202  DCHECK(output);
    +
    203  if (output->Write(doc, doc_size) < doc_size)
    +
    204  return false;
    +
    205 
    +
    206  return output->Flush();
    +
    207 }
    +
    208 
    +
    209 std::string MakePathRelative(const std::string& path,
    +
    210  const std::string& mpd_dir) {
    +
    211  return (path.find(mpd_dir) == 0) ? path.substr(mpd_dir.size()) : path;
    +
    212 }
    +
    213 
    +
    214 // Check whether the video info has width and height.
    +
    215 // DASH IOP also requires several other fields for video representations, namely
    +
    216 // width, height, framerate, and sar.
    +
    217 bool HasRequiredVideoFields(const MediaInfo_VideoInfo& video_info) {
    +
    218  if (!video_info.has_height() || !video_info.has_width()) {
    +
    219  LOG(ERROR)
    +
    220  << "Width and height are required fields for generating a valid MPD.";
    +
    221  return false;
    +
    222  }
    +
    223  // These fields are not required for a valid MPD, but required for DASH IOP
    +
    224  // compliant MPD. MpdBuilder can keep generating MPDs without these fields.
    +
    225  LOG_IF(WARNING, !video_info.has_time_scale())
    +
    226  << "Video info does not contain timescale required for "
    +
    227  "calculating framerate. @frameRate is required for DASH IOP.";
    +
    228  LOG_IF(WARNING, !video_info.has_frame_duration())
    +
    229  << "Video info does not contain frame duration required "
    +
    230  "for calculating framerate. @frameRate is required for DASH IOP.";
    +
    231  LOG_IF(WARNING, !video_info.has_pixel_width())
    +
    232  << "Video info does not contain pixel_width to calculate the sample "
    +
    233  "aspect ratio required for DASH IOP.";
    +
    234  LOG_IF(WARNING, !video_info.has_pixel_height())
    +
    235  << "Video info does not contain pixel_height to calculate the sample "
    +
    236  "aspect ratio required for DASH IOP.";
    +
    237  return true;
    +
    238 }
    +
    239 
    +
    240 // Returns the picture aspect ratio string e.g. "16:9", "4:3".
    +
    241 // "Reducing the quotient to minimal form" does not work well in practice as
    +
    242 // there may be some rounding performed in the input, e.g. the resolution of
    +
    243 // 480p is 854:480 for 16:9 aspect ratio, can only be reduced to 427:240.
    +
    244 // The algorithm finds out the pair of integers, num and den, where num / den is
    +
    245 // the closest ratio to scaled_width / scaled_height, by looping den through
    +
    246 // common values.
    +
    247 std::string GetPictureAspectRatio(uint32_t width,
    +
    248  uint32_t height,
    +
    249  uint32_t pixel_width,
    +
    250  uint32_t pixel_height) {
    +
    251  const uint32_t scaled_width = pixel_width * width;
    +
    252  const uint32_t scaled_height = pixel_height * height;
    +
    253  const double par = static_cast<double>(scaled_width) / scaled_height;
    +
    254 
    +
    255  // Typical aspect ratios have par_y less than or equal to 19:
    +
    256  // https://en.wikipedia.org/wiki/List_of_common_resolutions
    +
    257  const uint32_t kLargestPossibleParY = 19;
    +
    258 
    +
    259  uint32_t par_num = 0;
    +
    260  uint32_t par_den = 0;
    +
    261  double min_error = 1.0;
    +
    262  for (uint32_t den = 1; den <= kLargestPossibleParY; ++den) {
    +
    263  uint32_t num = par * den + 0.5;
    +
    264  double error = fabs(par - static_cast<double>(num) / den);
    +
    265  if (error < min_error) {
    +
    266  min_error = error;
    +
    267  par_num = num;
    +
    268  par_den = den;
    +
    269  if (error == 0) break;
    +
    270  }
    +
    271  }
    +
    272  VLOG(2) << "width*pix_width : height*pixel_height (" << scaled_width << ":"
    +
    273  << scaled_height << ") reduced to " << par_num << ":" << par_den
    +
    274  << " with error " << min_error << ".";
    +
    275 
    +
    276  return base::IntToString(par_num) + ":" + base::IntToString(par_den);
    +
    277 }
    +
    278 
    +
    279 // Adds an entry to picture_aspect_ratio if the size of picture_aspect_ratio is
    +
    280 // less than 2 and video_info has both pixel width and pixel height.
    +
    281 void AddPictureAspectRatio(
    +
    282  const MediaInfo::VideoInfo& video_info,
    +
    283  std::set<std::string>* picture_aspect_ratio) {
    +
    284  // If there are more than one entries in picture_aspect_ratio, the @par
    +
    285  // attribute cannot be set, so skip.
    +
    286  if (picture_aspect_ratio->size() > 1)
    +
    287  return;
    +
    288 
    +
    289  if (video_info.width() == 0 || video_info.height() == 0 ||
    +
    290  video_info.pixel_width() == 0 || video_info.pixel_height() == 0) {
    +
    291  // If there is even one Representation without a @sar attribute, @par cannot
    +
    292  // be calculated.
    +
    293  // Just populate the set with at least 2 bogus strings so that further call
    +
    294  // to this function will bail out immediately.
    +
    295  picture_aspect_ratio->insert("bogus");
    +
    296  picture_aspect_ratio->insert("entries");
    +
    297  return;
    +
    298  }
    +
    299 
    +
    300  const std::string par = GetPictureAspectRatio(
    +
    301  video_info.width(), video_info.height(),
    +
    302  video_info.pixel_width(), video_info.pixel_height());
    +
    303  DVLOG(1) << "Setting par as: " << par
    +
    304  << " for video with width: " << video_info.width()
    +
    305  << " height: " << video_info.height()
    +
    306  << " pixel_width: " << video_info.pixel_width() << " pixel_height; "
    +
    307  << video_info.pixel_height();
    +
    308  picture_aspect_ratio->insert(par);
    +
    309 }
    +
    310 
    +
    311 std::string RoleToText(AdaptationSet::Role role) {
    +
    312  // Using switch so that the compiler can detect whether there is a case that's
    +
    313  // not being handled.
    +
    314  switch (role) {
    +
    315  case AdaptationSet::kRoleCaption:
    +
    316  return "caption";
    +
    317  case AdaptationSet::kRoleSubtitle:
    +
    318  return "subtitle";
    +
    319  case AdaptationSet::kRoleMain:
    +
    320  return "main";
    +
    321  case AdaptationSet::kRoleAlternate:
    +
    322  return "alternate";
    +
    323  case AdaptationSet::kRoleSupplementary:
    +
    324  return "supplementary";
    +
    325  case AdaptationSet::kRoleCommentary:
    +
    326  return "commentary";
    +
    327  case AdaptationSet::kRoleDub:
    +
    328  return "dub";
    +
    329  default:
    +
    330  NOTREACHED();
    +
    331  return "";
    +
    332  }
    +
    333 
    +
    334  NOTREACHED();
    +
    335  return "";
    +
    336 }
    +
    337 
    +
    338 // Spooky static initialization/cleanup of libxml.
    +
    339 class LibXmlInitializer {
    +
    340  public:
    +
    341  LibXmlInitializer() : initialized_(false) {
    +
    342  base::AutoLock lock(lock_);
    +
    343  if (!initialized_) {
    +
    344  xmlInitParser();
    +
    345  initialized_ = true;
    +
    346  }
    +
    347  }
    +
    348 
    +
    349  ~LibXmlInitializer() {
    +
    350  base::AutoLock lock(lock_);
    +
    351  if (initialized_) {
    +
    352  xmlCleanupParser();
    +
    353  initialized_ = false;
    +
    354  }
    +
    355  }
    +
    356 
    +
    357  private:
    +
    358  base::Lock lock_;
    +
    359  bool initialized_;
    +
    360 
    +
    361  DISALLOW_COPY_AND_ASSIGN(LibXmlInitializer);
    +
    362 };
    +
    363 
    +
    364 class RepresentationStateChangeListenerImpl
    +
    365  : public RepresentationStateChangeListener {
    +
    366  public:
    +
    367  // |adaptation_set| is not owned by this class.
    +
    368  RepresentationStateChangeListenerImpl(uint32_t representation_id,
    +
    369  AdaptationSet* adaptation_set)
    +
    370  : representation_id_(representation_id), adaptation_set_(adaptation_set) {
    +
    371  DCHECK(adaptation_set_);
    +
    372  }
    +
    373  ~RepresentationStateChangeListenerImpl() override {}
    +
    374 
    +
    375  // RepresentationStateChangeListener implementation.
    +
    376  void OnNewSegmentForRepresentation(uint64_t start_time,
    +
    377  uint64_t duration) override {
    +
    378  adaptation_set_->OnNewSegmentForRepresentation(representation_id_,
    +
    379  start_time, duration);
    +
    380  }
    +
    381 
    +
    382  void OnSetFrameRateForRepresentation(uint32_t frame_duration,
    +
    383  uint32_t timescale) override {
    +
    384  adaptation_set_->OnSetFrameRateForRepresentation(representation_id_,
    +
    385  frame_duration, timescale);
    +
    386  }
    +
    387 
    +
    388  private:
    +
    389  const uint32_t representation_id_;
    +
    390  AdaptationSet* const adaptation_set_;
    +
    391 
    +
    392  DISALLOW_COPY_AND_ASSIGN(RepresentationStateChangeListenerImpl);
    +
    393 };
    +
    394 
    +
    395 } // namespace
    +
    396 
    +
    397 MpdBuilder::MpdBuilder(MpdType type, const MpdOptions& mpd_options)
    +
    398  : type_(type),
    +
    399  mpd_options_(mpd_options),
    +
    400  adaptation_sets_deleter_(&adaptation_sets_) {}
    +
    401 
    +
    402 MpdBuilder::~MpdBuilder() {}
    +
    403 
    +
    404 void MpdBuilder::AddBaseUrl(const std::string& base_url) {
    +
    405  base_urls_.push_back(base_url);
    +
    406 }
    +
    407 
    +
    408 AdaptationSet* MpdBuilder::AddAdaptationSet(const std::string& lang) {
    +
    409  scoped_ptr<AdaptationSet> adaptation_set(
    +
    410  new AdaptationSet(adaptation_set_counter_.GetNext(), lang, mpd_options_,
    +
    411  type_, &representation_counter_));
    +
    412 
    +
    413  DCHECK(adaptation_set);
    +
    414  adaptation_sets_.push_back(adaptation_set.get());
    +
    415  return adaptation_set.release();
    +
    416 }
    +
    417 
    + +
    419  DCHECK(output_file);
    +
    420  return WriteMpdToOutput(output_file);
    +
    421 }
    +
    422 
    +
    423 bool MpdBuilder::ToString(std::string* output) {
    +
    424  DCHECK(output);
    +
    425  return WriteMpdToOutput(output);
    +
    426 }
    +
    427 template <typename OutputType>
    +
    428 bool MpdBuilder::WriteMpdToOutput(OutputType* output) {
    +
    429  static LibXmlInitializer lib_xml_initializer;
    +
    430 
    +
    431  xml::scoped_xml_ptr<xmlDoc> doc(GenerateMpd());
    +
    432  if (!doc.get())
    +
    433  return false;
    +
    434 
    +
    435  static const int kNiceFormat = 1;
    +
    436  int doc_str_size = 0;
    +
    437  xmlChar* doc_str = NULL;
    +
    438  xmlDocDumpFormatMemoryEnc(doc.get(), &doc_str, &doc_str_size, "UTF-8",
    +
    439  kNiceFormat);
    +
    440 
    +
    441  bool result = WriteXmlCharArrayToOutput(doc_str, doc_str_size, output);
    +
    442  xmlFree(doc_str);
    +
    443 
    +
    444  // Cleanup, free the doc.
    +
    445  doc.reset();
    +
    446  return result;
    +
    447 }
    +
    448 
    +
    449 xmlDocPtr MpdBuilder::GenerateMpd() {
    +
    450  // Setup nodes.
    +
    451  static const char kXmlVersion[] = "1.0";
    +
    452  xml::scoped_xml_ptr<xmlDoc> doc(xmlNewDoc(BAD_CAST kXmlVersion));
    +
    453  XmlNode mpd("MPD");
    +
    454 
    +
    455  // Iterate thru AdaptationSets and add them to one big Period element.
    +
    456  XmlNode period("Period");
    +
    457  std::list<AdaptationSet*>::iterator adaptation_sets_it =
    +
    458  adaptation_sets_.begin();
    +
    459  for (; adaptation_sets_it != adaptation_sets_.end(); ++adaptation_sets_it) {
    +
    460  xml::scoped_xml_ptr<xmlNode> child((*adaptation_sets_it)->GetXml());
    +
    461  if (!child.get() || !period.AddChild(child.Pass()))
    +
    462  return NULL;
    +
    463  }
    +
    464 
    +
    465  // Add baseurls to MPD.
    +
    466  std::list<std::string>::const_iterator base_urls_it = base_urls_.begin();
    +
    467  for (; base_urls_it != base_urls_.end(); ++base_urls_it) {
    +
    468  XmlNode base_url("BaseURL");
    +
    469  base_url.SetContent(*base_urls_it);
    +
    470 
    +
    471  if (!mpd.AddChild(base_url.PassScopedPtr()))
    +
    472  return NULL;
    +
    473  }
    +
    474 
    +
    475  if (type_ == kDynamic) {
    +
    476  // This is the only Period and it is a regular period.
    +
    477  period.SetStringAttribute("start", "PT0S");
    +
    478  }
    +
    479 
    +
    480  if (!mpd.AddChild(period.PassScopedPtr()))
    +
    481  return NULL;
    +
    482 
    +
    483  AddMpdNameSpaceInfo(&mpd);
    +
    484  AddCommonMpdInfo(&mpd);
    +
    485  switch (type_) {
    +
    486  case kStatic:
    +
    487  AddStaticMpdInfo(&mpd);
    +
    488  break;
    +
    489  case kDynamic:
    +
    490  AddDynamicMpdInfo(&mpd);
    +
    491  break;
    +
    492  default:
    +
    493  NOTREACHED() << "Unknown MPD type: " << type_;
    +
    494  break;
    +
    495  }
    +
    496 
    +
    497  DCHECK(doc);
    +
    498  std::string version_string =
    +
    499  "Generated with https://github.com/google/edash-packager version " +
    +
    500  mpd_options_.packager_version_string;
    +
    501  xml::scoped_xml_ptr<xmlNode> comment(
    +
    502  xmlNewDocComment(doc.get(), BAD_CAST version_string.c_str()));
    +
    503  xmlDocSetRootElement(doc.get(), comment.get());
    +
    504  xmlAddSibling(comment.release(), mpd.Release());
    +
    505  return doc.release();
    +
    506 }
    +
    507 
    +
    508 void MpdBuilder::AddCommonMpdInfo(XmlNode* mpd_node) {
    +
    509  if (Positive(mpd_options_.min_buffer_time)) {
    +
    510  mpd_node->SetStringAttribute(
    +
    511  "minBufferTime", SecondsToXmlDuration(mpd_options_.min_buffer_time));
    +
    512  } else {
    +
    513  LOG(ERROR) << "minBufferTime value not specified.";
    +
    514  // TODO(tinskip): Propagate error.
    +
    515  }
    +
    516 }
    +
    517 
    +
    518 void MpdBuilder::AddStaticMpdInfo(XmlNode* mpd_node) {
    +
    519  DCHECK(mpd_node);
    +
    520  DCHECK_EQ(MpdBuilder::kStatic, type_);
    +
    521 
    +
    522  static const char kStaticMpdType[] = "static";
    +
    523  static const char kStaticMpdProfile[] =
    +
    524  "urn:mpeg:dash:profile:isoff-on-demand:2011";
    +
    525  mpd_node->SetStringAttribute("type", kStaticMpdType);
    +
    526  mpd_node->SetStringAttribute("profiles", kStaticMpdProfile);
    +
    527  mpd_node->SetStringAttribute(
    +
    528  "mediaPresentationDuration",
    +
    529  SecondsToXmlDuration(GetStaticMpdDuration(mpd_node)));
    +
    530 }
    +
    531 
    +
    532 void MpdBuilder::AddDynamicMpdInfo(XmlNode* mpd_node) {
    +
    533  DCHECK(mpd_node);
    +
    534  DCHECK_EQ(MpdBuilder::kDynamic, type_);
    +
    535 
    +
    536  static const char kDynamicMpdType[] = "dynamic";
    +
    537  static const char kDynamicMpdProfile[] =
    +
    538  "urn:mpeg:dash:profile:isoff-live:2011";
    +
    539  mpd_node->SetStringAttribute("type", kDynamicMpdType);
    +
    540  mpd_node->SetStringAttribute("profiles", kDynamicMpdProfile);
    +
    541 
    +
    542  // 'availabilityStartTime' is required for dynamic profile. Calculate if
    +
    543  // not already calculated.
    +
    544  if (availability_start_time_.empty()) {
    +
    545  double earliest_presentation_time;
    +
    546  if (GetEarliestTimestamp(&earliest_presentation_time)) {
    +
    547  availability_start_time_ =
    +
    548  XmlDateTimeNowWithOffset(mpd_options_.availability_time_offset -
    +
    549  std::ceil(earliest_presentation_time));
    +
    550  } else {
    +
    551  LOG(ERROR) << "Could not determine the earliest segment presentation "
    +
    552  "time for availabilityStartTime calculation.";
    +
    553  // TODO(tinskip). Propagate an error.
    +
    554  }
    +
    555  }
    +
    556  if (!availability_start_time_.empty())
    +
    557  mpd_node->SetStringAttribute("availabilityStartTime",
    +
    558  availability_start_time_);
    +
    559 
    +
    560  if (Positive(mpd_options_.minimum_update_period)) {
    +
    561  mpd_node->SetStringAttribute(
    +
    562  "minimumUpdatePeriod",
    +
    563  SecondsToXmlDuration(mpd_options_.minimum_update_period));
    +
    564  } else {
    +
    565  LOG(WARNING) << "The profile is dynamic but no minimumUpdatePeriod "
    +
    566  "specified.";
    +
    567  }
    +
    568 
    +
    569  SetIfPositive("timeShiftBufferDepth", mpd_options_.time_shift_buffer_depth,
    +
    570  mpd_node);
    +
    571  SetIfPositive("suggestedPresentationDelay",
    +
    572  mpd_options_.suggested_presentation_delay, mpd_node);
    +
    573 }
    +
    574 
    +
    575 float MpdBuilder::GetStaticMpdDuration(XmlNode* mpd_node) {
    +
    576  DCHECK(mpd_node);
    +
    577  DCHECK_EQ(MpdBuilder::kStatic, type_);
    +
    578 
    +
    579  xmlNodePtr period_node = FindPeriodNode(mpd_node);
    +
    580  DCHECK(period_node) << "Period element must be a child of mpd_node.";
    +
    581  DCHECK(IsPeriodNode(period_node));
    +
    582 
    +
    583  // Attribute mediaPresentationDuration must be present for 'static' MPD. So
    +
    584  // setting "PT0S" is required even if none of the representaions have duration
    +
    585  // attribute.
    +
    586  float max_duration = 0.0f;
    +
    587  for (xmlNodePtr adaptation_set = xmlFirstElementChild(period_node);
    +
    588  adaptation_set; adaptation_set = xmlNextElementSibling(adaptation_set)) {
    +
    589  for (xmlNodePtr representation = xmlFirstElementChild(adaptation_set);
    +
    590  representation;
    +
    591  representation = xmlNextElementSibling(representation)) {
    +
    592  float duration = 0.0f;
    +
    593  if (GetDurationAttribute(representation, &duration)) {
    +
    594  max_duration = max_duration > duration ? max_duration : duration;
    +
    595 
    +
    596  // 'duration' attribute is there only to help generate MPD, not
    +
    597  // necessary for MPD, remove the attribute.
    +
    598  xmlUnsetProp(representation, BAD_CAST "duration");
    +
    599  }
    +
    600  }
    +
    601  }
    +
    602 
    +
    603  return max_duration;
    +
    604 }
    +
    605 
    +
    606 bool MpdBuilder::GetEarliestTimestamp(double* timestamp_seconds) {
    +
    607  DCHECK(timestamp_seconds);
    +
    608 
    +
    609  double earliest_timestamp(-1);
    +
    610  for (std::list<AdaptationSet*>::const_iterator iter =
    +
    611  adaptation_sets_.begin();
    +
    612  iter != adaptation_sets_.end(); ++iter) {
    +
    613  double timestamp;
    +
    614  if ((*iter)->GetEarliestTimestamp(&timestamp) &&
    +
    615  ((earliest_timestamp < 0) || (timestamp < earliest_timestamp))) {
    +
    616  earliest_timestamp = timestamp;
    +
    617  }
    +
    618  }
    +
    619  if (earliest_timestamp < 0)
    +
    620  return false;
    +
    621 
    +
    622  *timestamp_seconds = earliest_timestamp;
    +
    623  return true;
    +
    624 }
    +
    625 
    +
    626 void MpdBuilder::MakePathsRelativeToMpd(const std::string& mpd_path,
    +
    627  MediaInfo* media_info) {
    +
    628  DCHECK(media_info);
    +
    629  const std::string kFileProtocol("file://");
    +
    630  std::string mpd_file_path = (mpd_path.find(kFileProtocol) == 0)
    +
    631  ? mpd_path.substr(kFileProtocol.size())
    +
    632  : mpd_path;
    +
    633 
    +
    634  if (!mpd_file_path.empty()) {
    +
    635  std::string mpd_dir(
    +
    636  FilePath(mpd_file_path).DirName().AsEndingWithSeparator().value());
    +
    637  if (!mpd_dir.empty()) {
    +
    638  if (media_info->has_media_file_name()) {
    +
    639  media_info->set_media_file_name(
    +
    640  MakePathRelative(media_info->media_file_name(), mpd_dir));
    +
    641  }
    +
    642  if (media_info->has_init_segment_name()) {
    +
    643  media_info->set_init_segment_name(
    +
    644  MakePathRelative(media_info->init_segment_name(), mpd_dir));
    +
    645  }
    +
    646  if (media_info->has_segment_template()) {
    +
    647  media_info->set_segment_template(
    +
    648  MakePathRelative(media_info->segment_template(), mpd_dir));
    +
    649  }
    +
    650  }
    +
    651  }
    +
    652 }
    +
    653 
    +
    654 AdaptationSet::AdaptationSet(uint32_t adaptation_set_id,
    +
    655  const std::string& lang,
    +
    656  const MpdOptions& mpd_options,
    +
    657  MpdBuilder::MpdType mpd_type,
    +
    658  base::AtomicSequenceNumber* counter)
    +
    659  : representations_deleter_(&representations_),
    +
    660  representation_counter_(counter),
    +
    661  id_(adaptation_set_id),
    +
    662  lang_(lang),
    +
    663  mpd_options_(mpd_options),
    +
    664  mpd_type_(mpd_type),
    +
    665  group_(kAdaptationSetGroupNotSet),
    +
    666  segments_aligned_(kSegmentAlignmentUnknown),
    +
    667  force_set_segment_alignment_(false) {
    +
    668  DCHECK(counter);
    +
    669 }
    +
    670 
    +
    671 AdaptationSet::~AdaptationSet() {}
    +
    672 
    +
    673 Representation* AdaptationSet::AddRepresentation(const MediaInfo& media_info) {
    +
    674  const uint32_t representation_id = representation_counter_->GetNext();
    +
    675  // Note that AdaptationSet outlive Representation, so this object
    +
    676  // will die before AdaptationSet.
    +
    677  scoped_ptr<RepresentationStateChangeListener> listener(
    +
    678  new RepresentationStateChangeListenerImpl(representation_id, this));
    +
    679  scoped_ptr<Representation> representation(new Representation(
    +
    680  media_info, mpd_options_, representation_id, listener.Pass()));
    +
    681 
    +
    682  if (!representation->Init())
    +
    683  return NULL;
    +
    684 
    +
    685  // For videos, record the width, height, and the frame rate to calculate the
    +
    686  // max {width,height,framerate} required for DASH IOP.
    +
    687  if (media_info.has_video_info()) {
    +
    688  const MediaInfo::VideoInfo& video_info = media_info.video_info();
    +
    689  DCHECK(video_info.has_width());
    +
    690  DCHECK(video_info.has_height());
    +
    691  video_widths_.insert(video_info.width());
    +
    692  video_heights_.insert(video_info.height());
    +
    693 
    +
    694  if (video_info.has_time_scale() && video_info.has_frame_duration())
    +
    695  RecordFrameRate(video_info.frame_duration(), video_info.time_scale());
    +
    696 
    +
    697  AddPictureAspectRatio(video_info, &picture_aspect_ratio_);
    +
    698  }
    +
    699 
    +
    700  if (media_info.has_video_info()) {
    +
    701  content_type_ = "video";
    +
    702  } else if (media_info.has_audio_info()) {
    +
    703  content_type_ = "audio";
    +
    704  } else if (media_info.has_text_info()) {
    +
    705  content_type_ = "text";
    +
    706 
    +
    707  if (media_info.text_info().has_type() &&
    +
    708  (media_info.text_info().type() != MediaInfo::TextInfo::UNKNOWN)) {
    +
    709  roles_.insert(MediaInfoTextTypeToRole(media_info.text_info().type()));
    +
    710  }
    +
    711  }
    +
    712 
    +
    713  representations_.push_back(representation.get());
    +
    714  return representation.release();
    +
    715 }
    +
    716 
    + +
    718  const ContentProtectionElement& content_protection_element) {
    +
    719  content_protection_elements_.push_back(content_protection_element);
    +
    720  RemoveDuplicateAttributes(&content_protection_elements_.back());
    +
    721 }
    +
    722 
    +
    723 void AdaptationSet::UpdateContentProtectionPssh(const std::string& drm_uuid,
    +
    724  const std::string& pssh) {
    +
    725  UpdateContentProtectionPsshHelper(drm_uuid, pssh,
    +
    726  &content_protection_elements_);
    +
    727 }
    +
    728 
    +
    729 void AdaptationSet::AddRole(Role role) {
    +
    730  roles_.insert(role);
    +
    731 }
    +
    732 
    +
    733 // Creates a copy of <AdaptationSet> xml element, iterate thru all the
    +
    734 // <Representation> (child) elements and add them to the copy.
    +
    735 // Set all the attributes first and then add the children elements so that flags
    +
    736 // can be passed to Representation to avoid setting redundant attributes. For
    +
    737 // example, if AdaptationSet@width is set, then Representation@width is
    +
    738 // redundant and should not be set.
    +
    739 xml::scoped_xml_ptr<xmlNode> AdaptationSet::GetXml() {
    +
    740  AdaptationSetXmlNode adaptation_set;
    +
    741 
    +
    742  bool suppress_representation_width = false;
    +
    743  bool suppress_representation_height = false;
    +
    744  bool suppress_representation_frame_rate = false;
    +
    745 
    +
    746  adaptation_set.SetId(id_);
    +
    747  adaptation_set.SetStringAttribute("contentType", content_type_);
    +
    748  if (!lang_.empty() && lang_ != "und") {
    +
    749  adaptation_set.SetStringAttribute("lang", LanguageToShortestForm(lang_));
    +
    750  }
    +
    751 
    +
    752  // Note that std::{set,map} are ordered, so the last element is the max value.
    +
    753  if (video_widths_.size() == 1) {
    +
    754  suppress_representation_width = true;
    +
    755  adaptation_set.SetIntegerAttribute("width", *video_widths_.begin());
    +
    756  } else if (video_widths_.size() > 1) {
    +
    757  adaptation_set.SetIntegerAttribute("maxWidth", *video_widths_.rbegin());
    +
    758  }
    +
    759  if (video_heights_.size() == 1) {
    +
    760  suppress_representation_height = true;
    +
    761  adaptation_set.SetIntegerAttribute("height", *video_heights_.begin());
    +
    762  } else if (video_heights_.size() > 1) {
    +
    763  adaptation_set.SetIntegerAttribute("maxHeight", *video_heights_.rbegin());
    +
    764  }
    +
    765 
    +
    766  if (video_frame_rates_.size() == 1) {
    +
    767  suppress_representation_frame_rate = true;
    +
    768  adaptation_set.SetStringAttribute("frameRate",
    +
    769  video_frame_rates_.begin()->second);
    +
    770  } else if (video_frame_rates_.size() > 1) {
    +
    771  adaptation_set.SetStringAttribute("maxFrameRate",
    +
    772  video_frame_rates_.rbegin()->second);
    +
    773  }
    +
    774 
    +
    775  // Note: must be checked before checking segments_aligned_ (below). So that
    +
    776  // segments_aligned_ is set before checking below.
    +
    777  if (mpd_type_ == MpdBuilder::kStatic) {
    +
    778  CheckVodSegmentAlignment();
    +
    779  }
    +
    780 
    +
    781  if (segments_aligned_ == kSegmentAlignmentTrue) {
    +
    782  adaptation_set.SetStringAttribute(mpd_type_ == MpdBuilder::kStatic
    +
    783  ? "subsegmentAlignment"
    +
    784  : "segmentAlignment",
    +
    785  "true");
    +
    786  }
    +
    787 
    +
    788  if (picture_aspect_ratio_.size() == 1)
    +
    789  adaptation_set.SetStringAttribute("par", *picture_aspect_ratio_.begin());
    +
    790 
    +
    791  if (group_ >= 0)
    +
    792  adaptation_set.SetIntegerAttribute("group", group_);
    793 
    -
    794  if (picture_aspect_ratio_.size() == 1)
    -
    795  adaptation_set.SetStringAttribute("par", *picture_aspect_ratio_.begin());
    -
    796 
    -
    797  if (group_ >= 0)
    -
    798  adaptation_set.SetIntegerAttribute("group", group_);
    -
    799 
    -
    800  return adaptation_set.PassScopedPtr();
    -
    801 }
    -
    802 
    -
    803 void AdaptationSet::ForceSetSegmentAlignment(bool segment_alignment) {
    -
    804  segments_aligned_ =
    -
    805  segment_alignment ? kSegmentAlignmentTrue : kSegmentAlignmentFalse;
    -
    806  force_set_segment_alignment_ = true;
    -
    807 }
    -
    808 
    -
    809 void AdaptationSet::SetGroup(int group_number) {
    -
    810  group_ = group_number;
    -
    811 }
    +
    794  if (!adaptation_set.AddContentProtectionElements(
    +
    795  content_protection_elements_)) {
    +
    796  return xml::scoped_xml_ptr<xmlNode>();
    +
    797  }
    +
    798  for (AdaptationSet::Role role : roles_)
    +
    799  adaptation_set.AddRoleElement("urn:mpeg:dash:role:2011", RoleToText(role));
    +
    800 
    +
    801  for (Representation* representation : representations_) {
    +
    802  if (suppress_representation_width)
    +
    803  representation->SuppressOnce(Representation::kSuppressWidth);
    +
    804  if (suppress_representation_height)
    +
    805  representation->SuppressOnce(Representation::kSuppressHeight);
    +
    806  if (suppress_representation_frame_rate)
    +
    807  representation->SuppressOnce(Representation::kSuppressFrameRate);
    +
    808  xml::scoped_xml_ptr<xmlNode> child(representation->GetXml());
    +
    809  if (!child || !adaptation_set.AddChild(child.Pass()))
    +
    810  return xml::scoped_xml_ptr<xmlNode>();
    +
    811  }
    812 
    -
    813 int AdaptationSet::Group() const {
    -
    814  return group_;
    -
    815 }
    -
    816 
    -
    817 // Check segmentAlignment for Live here. Storing all start_time and duration
    -
    818 // will out-of-memory because there's no way of knowing when it will end.
    -
    819 // VOD subsegmentAlignment check is *not* done here because it is possible
    -
    820 // that some Representations might not have been added yet (e.g. a thread is
    -
    821 // assigned per muxer so one might run faster than others).
    -
    822 // To be clear, for Live, all Representations should be added before a
    -
    823 // segment is added.
    -
    824 void AdaptationSet::OnNewSegmentForRepresentation(uint32_t representation_id,
    -
    825  uint64_t start_time,
    -
    826  uint64_t duration) {
    -
    827  if (mpd_type_ == MpdBuilder::kDynamic) {
    -
    828  CheckLiveSegmentAlignment(representation_id, start_time, duration);
    -
    829  } else {
    -
    830  representation_segment_start_times_[representation_id].push_back(
    -
    831  start_time);
    -
    832  }
    -
    833 }
    -
    834 
    - -
    836  uint32_t representation_id,
    -
    837  uint32_t frame_duration,
    -
    838  uint32_t timescale) {
    -
    839  RecordFrameRate(frame_duration, timescale);
    -
    840 }
    -
    841 
    -
    842 bool AdaptationSet::GetEarliestTimestamp(double* timestamp_seconds) {
    -
    843  DCHECK(timestamp_seconds);
    -
    844 
    -
    845  double earliest_timestamp(-1);
    -
    846  for (std::list<Representation*>::const_iterator iter =
    -
    847  representations_.begin();
    -
    848  iter != representations_.end(); ++iter) {
    -
    849  double timestamp;
    -
    850  if ((*iter)->GetEarliestTimestamp(&timestamp) &&
    -
    851  ((earliest_timestamp < 0) || (timestamp < earliest_timestamp))) {
    -
    852  earliest_timestamp = timestamp;
    -
    853  }
    -
    854  }
    -
    855  if (earliest_timestamp < 0)
    -
    856  return false;
    +
    813  return adaptation_set.PassScopedPtr();
    +
    814 }
    +
    815 
    +
    816 void AdaptationSet::ForceSetSegmentAlignment(bool segment_alignment) {
    +
    817  segments_aligned_ =
    +
    818  segment_alignment ? kSegmentAlignmentTrue : kSegmentAlignmentFalse;
    +
    819  force_set_segment_alignment_ = true;
    +
    820 }
    +
    821 
    +
    822 void AdaptationSet::SetGroup(int group_number) {
    +
    823  group_ = group_number;
    +
    824 }
    +
    825 
    +
    826 int AdaptationSet::Group() const {
    +
    827  return group_;
    +
    828 }
    +
    829 
    +
    830 // Check segmentAlignment for Live here. Storing all start_time and duration
    +
    831 // will out-of-memory because there's no way of knowing when it will end.
    +
    832 // VOD subsegmentAlignment check is *not* done here because it is possible
    +
    833 // that some Representations might not have been added yet (e.g. a thread is
    +
    834 // assigned per muxer so one might run faster than others).
    +
    835 // To be clear, for Live, all Representations should be added before a
    +
    836 // segment is added.
    +
    837 void AdaptationSet::OnNewSegmentForRepresentation(uint32_t representation_id,
    +
    838  uint64_t start_time,
    +
    839  uint64_t duration) {
    +
    840  if (mpd_type_ == MpdBuilder::kDynamic) {
    +
    841  CheckLiveSegmentAlignment(representation_id, start_time, duration);
    +
    842  } else {
    +
    843  representation_segment_start_times_[representation_id].push_back(
    +
    844  start_time);
    +
    845  }
    +
    846 }
    +
    847 
    + +
    849  uint32_t representation_id,
    +
    850  uint32_t frame_duration,
    +
    851  uint32_t timescale) {
    +
    852  RecordFrameRate(frame_duration, timescale);
    +
    853 }
    +
    854 
    +
    855 bool AdaptationSet::GetEarliestTimestamp(double* timestamp_seconds) {
    +
    856  DCHECK(timestamp_seconds);
    857 
    -
    858  *timestamp_seconds = earliest_timestamp;
    -
    859  return true;
    -
    860 }
    -
    861 
    -
    862 // This implementation assumes that each representations' segments' are
    -
    863 // contiguous.
    -
    864 // Also assumes that all Representations are added before this is called.
    -
    865 // This checks whether the first elements of the lists in
    -
    866 // representation_segment_start_times_ are aligned.
    -
    867 // For example, suppose this method was just called with args rep_id=2
    -
    868 // start_time=1.
    -
    869 // 1 -> [1, 100, 200]
    -
    870 // 2 -> [1]
    -
    871 // The timestamps of the first elements match, so this flags
    -
    872 // segments_aligned_=true.
    -
    873 // Also since the first segment start times match, the first element of all the
    -
    874 // lists are removed, so the map of lists becomes:
    -
    875 // 1 -> [100, 200]
    -
    876 // 2 -> []
    -
    877 // Note that there could be false positives.
    -
    878 // e.g. just got rep_id=3 start_time=1 duration=300, and the duration of the
    -
    879 // whole AdaptationSet is 300.
    -
    880 // 1 -> [1, 100, 200]
    -
    881 // 2 -> [1, 90, 100]
    -
    882 // 3 -> [1]
    -
    883 // They are not aligned but this will be marked as aligned.
    -
    884 // But since this is unlikely to happen in the packager (and to save
    -
    885 // computation), this isn't handled at the moment.
    -
    886 void AdaptationSet::CheckLiveSegmentAlignment(uint32_t representation_id,
    -
    887  uint64_t start_time,
    -
    888  uint64_t /* duration */) {
    -
    889  if (segments_aligned_ == kSegmentAlignmentFalse ||
    -
    890  force_set_segment_alignment_) {
    -
    891  return;
    -
    892  }
    -
    893 
    -
    894  std::list<uint64_t>& representation_start_times =
    -
    895  representation_segment_start_times_[representation_id];
    -
    896  representation_start_times.push_back(start_time);
    -
    897  // There's no way to detemine whether the segments are aligned if some
    -
    898  // representations do not have any segments.
    -
    899  if (representation_segment_start_times_.size() != representations_.size())
    -
    900  return;
    -
    901 
    -
    902  DCHECK(!representation_start_times.empty());
    -
    903  const uint64_t expected_start_time = representation_start_times.front();
    -
    904  for (RepresentationTimeline::const_iterator it =
    -
    905  representation_segment_start_times_.begin();
    -
    906  it != representation_segment_start_times_.end(); ++it) {
    -
    907  // If there are no entries in a list, then there is no way for the
    -
    908  // segment alignment status to change.
    -
    909  // Note that it can be empty because entries get deleted below.
    -
    910  if (it->second.empty())
    -
    911  return;
    -
    912 
    -
    913  if (expected_start_time != it->second.front()) {
    -
    914  // Flag as false and clear the start times data, no need to keep it
    -
    915  // around.
    -
    916  segments_aligned_ = kSegmentAlignmentFalse;
    -
    917  representation_segment_start_times_.clear();
    -
    918  return;
    -
    919  }
    -
    920  }
    -
    921  segments_aligned_ = kSegmentAlignmentTrue;
    -
    922 
    -
    923  for (RepresentationTimeline::iterator it =
    -
    924  representation_segment_start_times_.begin();
    -
    925  it != representation_segment_start_times_.end(); ++it) {
    -
    926  it->second.pop_front();
    -
    927  }
    -
    928 }
    -
    929 
    -
    930 // Make sure all segements start times match for all Representations.
    -
    931 // This assumes that the segments are contiguous.
    -
    932 void AdaptationSet::CheckVodSegmentAlignment() {
    -
    933  if (segments_aligned_ == kSegmentAlignmentFalse ||
    -
    934  force_set_segment_alignment_) {
    -
    935  return;
    -
    936  }
    -
    937  if (representation_segment_start_times_.empty())
    -
    938  return;
    -
    939  if (representation_segment_start_times_.size() == 1) {
    -
    940  segments_aligned_ = kSegmentAlignmentTrue;
    -
    941  return;
    -
    942  }
    -
    943 
    -
    944  // This is not the most efficient implementation to compare the values
    -
    945  // because expected_time_line is compared against all other time lines, but
    -
    946  // probably the most readable.
    -
    947  const std::list<uint64_t>& expected_time_line =
    -
    948  representation_segment_start_times_.begin()->second;
    -
    949 
    -
    950  bool all_segment_time_line_same_length = true;
    -
    951  // Note that the first entry is skipped because it is expected_time_line.
    -
    952  RepresentationTimeline::const_iterator it =
    -
    953  representation_segment_start_times_.begin();
    -
    954  for (++it; it != representation_segment_start_times_.end(); ++it) {
    -
    955  const std::list<uint64_t>& other_time_line = it->second;
    -
    956  if (expected_time_line.size() != other_time_line.size()) {
    -
    957  all_segment_time_line_same_length = false;
    -
    958  }
    -
    959 
    -
    960  const std::list<uint64_t>* longer_list = &other_time_line;
    -
    961  const std::list<uint64_t>* shorter_list = &expected_time_line;
    -
    962  if (expected_time_line.size() > other_time_line.size()) {
    -
    963  shorter_list = &other_time_line;
    -
    964  longer_list = &expected_time_line;
    -
    965  }
    -
    966 
    -
    967  if (!std::equal(shorter_list->begin(), shorter_list->end(),
    -
    968  longer_list->begin())) {
    -
    969  // Some segments are definitely unaligned.
    -
    970  segments_aligned_ = kSegmentAlignmentFalse;
    -
    971  representation_segment_start_times_.clear();
    -
    972  return;
    -
    973  }
    -
    974  }
    -
    975 
    -
    976  // TODO(rkuroiwa): The right way to do this is to also check the durations.
    -
    977  // For example:
    -
    978  // (a) 3 4 5
    -
    979  // (b) 3 4 5 6
    -
    980  // could be true or false depending on the length of the third segment of (a).
    -
    981  // i.e. if length of the third segment is 2, then this is not aligned.
    -
    982  if (!all_segment_time_line_same_length) {
    -
    983  segments_aligned_ = kSegmentAlignmentUnknown;
    -
    984  return;
    -
    985  }
    -
    986 
    -
    987  segments_aligned_ = kSegmentAlignmentTrue;
    -
    988 }
    -
    989 
    -
    990 // Since all AdaptationSet cares about is the maxFrameRate, representation_id
    -
    991 // is not passed to this method.
    -
    992 void AdaptationSet::RecordFrameRate(uint32_t frame_duration,
    -
    993  uint32_t timescale) {
    -
    994  if (frame_duration == 0) {
    -
    995  LOG(ERROR) << "Frame duration is 0 and cannot be set.";
    -
    996  return;
    -
    997  }
    -
    998  video_frame_rates_[static_cast<double>(timescale) / frame_duration] =
    -
    999  base::IntToString(timescale) + "/" + base::IntToString(frame_duration);
    -
    1000 }
    -
    1001 
    - -
    1003  const MediaInfo& media_info,
    -
    1004  const MpdOptions& mpd_options,
    -
    1005  uint32_t id,
    -
    1006  scoped_ptr<RepresentationStateChangeListener> state_change_listener)
    -
    1007  : media_info_(media_info),
    -
    1008  id_(id),
    -
    1009  bandwidth_estimator_(BandwidthEstimator::kUseAllBlocks),
    -
    1010  mpd_options_(mpd_options),
    -
    1011  start_number_(1),
    -
    1012  state_change_listener_(state_change_listener.Pass()) {}
    -
    1013 
    -
    1014 Representation::~Representation() {}
    -
    1015 
    - -
    1017  if (!AtLeastOneTrue(media_info_.has_video_info(),
    -
    1018  media_info_.has_audio_info(),
    -
    1019  media_info_.has_text_info())) {
    -
    1020  // This is an error. Segment information can be in AdaptationSet, Period, or
    -
    1021  // MPD but the interface does not provide a way to set them.
    -
    1022  // See 5.3.9.1 ISO 23009-1:2012 for segment info.
    -
    1023  LOG(ERROR) << "Representation needs one of video, audio, or text.";
    -
    1024  return false;
    -
    1025  }
    -
    1026 
    -
    1027  if (MoreThanOneTrue(media_info_.has_video_info(),
    -
    1028  media_info_.has_audio_info(),
    -
    1029  media_info_.has_text_info())) {
    -
    1030  LOG(ERROR) << "Only one of VideoInfo, AudioInfo, or TextInfo can be set.";
    -
    1031  return false;
    -
    1032  }
    -
    1033 
    -
    1034  if (media_info_.container_type() == MediaInfo::CONTAINER_UNKNOWN) {
    -
    1035  LOG(ERROR) << "'container_type' in MediaInfo cannot be CONTAINER_UNKNOWN.";
    -
    1036  return false;
    -
    1037  }
    -
    1038 
    -
    1039  if (media_info_.has_video_info()) {
    -
    1040  mime_type_ = GetVideoMimeType();
    -
    1041  if (!HasRequiredVideoFields(media_info_.video_info())) {
    -
    1042  LOG(ERROR) << "Missing required fields to create a video Representation.";
    -
    1043  return false;
    -
    1044  }
    -
    1045  } else if (media_info_.has_audio_info()) {
    -
    1046  mime_type_ = GetAudioMimeType();
    -
    1047  } else if (media_info_.has_text_info()) {
    -
    1048  mime_type_ = GetTextMimeType();
    -
    1049  }
    -
    1050 
    -
    1051  if (mime_type_.empty())
    -
    1052  return false;
    -
    1053 
    -
    1054  codecs_ = GetCodecs(media_info_);
    -
    1055  return true;
    -
    1056 }
    -
    1057 
    - -
    1059  const ContentProtectionElement& content_protection_element) {
    -
    1060  content_protection_elements_.push_back(content_protection_element);
    -
    1061  RemoveDuplicateAttributes(&content_protection_elements_.back());
    -
    1062 }
    -
    1063 
    -
    1064 void Representation::UpdateContentProtectionPssh(const std::string& drm_uuid,
    -
    1065  const std::string& pssh) {
    -
    1066  UpdateContentProtectionPsshHelper(drm_uuid, pssh,
    -
    1067  &content_protection_elements_);
    -
    1068 }
    -
    1069 
    -
    1070 void Representation::AddNewSegment(uint64_t start_time,
    -
    1071  uint64_t duration,
    -
    1072  uint64_t size) {
    -
    1073  if (start_time == 0 && duration == 0) {
    -
    1074  LOG(WARNING) << "Got segment with start_time and duration == 0. Ignoring.";
    -
    1075  return;
    -
    1076  }
    +
    858  double earliest_timestamp(-1);
    +
    859  for (std::list<Representation*>::const_iterator iter =
    +
    860  representations_.begin();
    +
    861  iter != representations_.end(); ++iter) {
    +
    862  double timestamp;
    +
    863  if ((*iter)->GetEarliestTimestamp(&timestamp) &&
    +
    864  ((earliest_timestamp < 0) || (timestamp < earliest_timestamp))) {
    +
    865  earliest_timestamp = timestamp;
    +
    866  }
    +
    867  }
    +
    868  if (earliest_timestamp < 0)
    +
    869  return false;
    +
    870 
    +
    871  *timestamp_seconds = earliest_timestamp;
    +
    872  return true;
    +
    873 }
    +
    874 
    +
    875 // This implementation assumes that each representations' segments' are
    +
    876 // contiguous.
    +
    877 // Also assumes that all Representations are added before this is called.
    +
    878 // This checks whether the first elements of the lists in
    +
    879 // representation_segment_start_times_ are aligned.
    +
    880 // For example, suppose this method was just called with args rep_id=2
    +
    881 // start_time=1.
    +
    882 // 1 -> [1, 100, 200]
    +
    883 // 2 -> [1]
    +
    884 // The timestamps of the first elements match, so this flags
    +
    885 // segments_aligned_=true.
    +
    886 // Also since the first segment start times match, the first element of all the
    +
    887 // lists are removed, so the map of lists becomes:
    +
    888 // 1 -> [100, 200]
    +
    889 // 2 -> []
    +
    890 // Note that there could be false positives.
    +
    891 // e.g. just got rep_id=3 start_time=1 duration=300, and the duration of the
    +
    892 // whole AdaptationSet is 300.
    +
    893 // 1 -> [1, 100, 200]
    +
    894 // 2 -> [1, 90, 100]
    +
    895 // 3 -> [1]
    +
    896 // They are not aligned but this will be marked as aligned.
    +
    897 // But since this is unlikely to happen in the packager (and to save
    +
    898 // computation), this isn't handled at the moment.
    +
    899 void AdaptationSet::CheckLiveSegmentAlignment(uint32_t representation_id,
    +
    900  uint64_t start_time,
    +
    901  uint64_t /* duration */) {
    +
    902  if (segments_aligned_ == kSegmentAlignmentFalse ||
    +
    903  force_set_segment_alignment_) {
    +
    904  return;
    +
    905  }
    +
    906 
    +
    907  std::list<uint64_t>& representation_start_times =
    +
    908  representation_segment_start_times_[representation_id];
    +
    909  representation_start_times.push_back(start_time);
    +
    910  // There's no way to detemine whether the segments are aligned if some
    +
    911  // representations do not have any segments.
    +
    912  if (representation_segment_start_times_.size() != representations_.size())
    +
    913  return;
    +
    914 
    +
    915  DCHECK(!representation_start_times.empty());
    +
    916  const uint64_t expected_start_time = representation_start_times.front();
    +
    917  for (RepresentationTimeline::const_iterator it =
    +
    918  representation_segment_start_times_.begin();
    +
    919  it != representation_segment_start_times_.end(); ++it) {
    +
    920  // If there are no entries in a list, then there is no way for the
    +
    921  // segment alignment status to change.
    +
    922  // Note that it can be empty because entries get deleted below.
    +
    923  if (it->second.empty())
    +
    924  return;
    +
    925 
    +
    926  if (expected_start_time != it->second.front()) {
    +
    927  // Flag as false and clear the start times data, no need to keep it
    +
    928  // around.
    +
    929  segments_aligned_ = kSegmentAlignmentFalse;
    +
    930  representation_segment_start_times_.clear();
    +
    931  return;
    +
    932  }
    +
    933  }
    +
    934  segments_aligned_ = kSegmentAlignmentTrue;
    +
    935 
    +
    936  for (RepresentationTimeline::iterator it =
    +
    937  representation_segment_start_times_.begin();
    +
    938  it != representation_segment_start_times_.end(); ++it) {
    +
    939  it->second.pop_front();
    +
    940  }
    +
    941 }
    +
    942 
    +
    943 // Make sure all segements start times match for all Representations.
    +
    944 // This assumes that the segments are contiguous.
    +
    945 void AdaptationSet::CheckVodSegmentAlignment() {
    +
    946  if (segments_aligned_ == kSegmentAlignmentFalse ||
    +
    947  force_set_segment_alignment_) {
    +
    948  return;
    +
    949  }
    +
    950  if (representation_segment_start_times_.empty())
    +
    951  return;
    +
    952  if (representation_segment_start_times_.size() == 1) {
    +
    953  segments_aligned_ = kSegmentAlignmentTrue;
    +
    954  return;
    +
    955  }
    +
    956 
    +
    957  // This is not the most efficient implementation to compare the values
    +
    958  // because expected_time_line is compared against all other time lines, but
    +
    959  // probably the most readable.
    +
    960  const std::list<uint64_t>& expected_time_line =
    +
    961  representation_segment_start_times_.begin()->second;
    +
    962 
    +
    963  bool all_segment_time_line_same_length = true;
    +
    964  // Note that the first entry is skipped because it is expected_time_line.
    +
    965  RepresentationTimeline::const_iterator it =
    +
    966  representation_segment_start_times_.begin();
    +
    967  for (++it; it != representation_segment_start_times_.end(); ++it) {
    +
    968  const std::list<uint64_t>& other_time_line = it->second;
    +
    969  if (expected_time_line.size() != other_time_line.size()) {
    +
    970  all_segment_time_line_same_length = false;
    +
    971  }
    +
    972 
    +
    973  const std::list<uint64_t>* longer_list = &other_time_line;
    +
    974  const std::list<uint64_t>* shorter_list = &expected_time_line;
    +
    975  if (expected_time_line.size() > other_time_line.size()) {
    +
    976  shorter_list = &other_time_line;
    +
    977  longer_list = &expected_time_line;
    +
    978  }
    +
    979 
    +
    980  if (!std::equal(shorter_list->begin(), shorter_list->end(),
    +
    981  longer_list->begin())) {
    +
    982  // Some segments are definitely unaligned.
    +
    983  segments_aligned_ = kSegmentAlignmentFalse;
    +
    984  representation_segment_start_times_.clear();
    +
    985  return;
    +
    986  }
    +
    987  }
    +
    988 
    +
    989  // TODO(rkuroiwa): The right way to do this is to also check the durations.
    +
    990  // For example:
    +
    991  // (a) 3 4 5
    +
    992  // (b) 3 4 5 6
    +
    993  // could be true or false depending on the length of the third segment of (a).
    +
    994  // i.e. if length of the third segment is 2, then this is not aligned.
    +
    995  if (!all_segment_time_line_same_length) {
    +
    996  segments_aligned_ = kSegmentAlignmentUnknown;
    +
    997  return;
    +
    998  }
    +
    999 
    +
    1000  segments_aligned_ = kSegmentAlignmentTrue;
    +
    1001 }
    +
    1002 
    +
    1003 // Since all AdaptationSet cares about is the maxFrameRate, representation_id
    +
    1004 // is not passed to this method.
    +
    1005 void AdaptationSet::RecordFrameRate(uint32_t frame_duration,
    +
    1006  uint32_t timescale) {
    +
    1007  if (frame_duration == 0) {
    +
    1008  LOG(ERROR) << "Frame duration is 0 and cannot be set.";
    +
    1009  return;
    +
    1010  }
    +
    1011  video_frame_rates_[static_cast<double>(timescale) / frame_duration] =
    +
    1012  base::IntToString(timescale) + "/" + base::IntToString(frame_duration);
    +
    1013 }
    +
    1014 
    + +
    1016  const MediaInfo& media_info,
    +
    1017  const MpdOptions& mpd_options,
    +
    1018  uint32_t id,
    +
    1019  scoped_ptr<RepresentationStateChangeListener> state_change_listener)
    +
    1020  : media_info_(media_info),
    +
    1021  id_(id),
    +
    1022  bandwidth_estimator_(BandwidthEstimator::kUseAllBlocks),
    +
    1023  mpd_options_(mpd_options),
    +
    1024  start_number_(1),
    +
    1025  state_change_listener_(state_change_listener.Pass()),
    +
    1026  output_suppression_flags_(0) {}
    +
    1027 
    +
    1028 Representation::~Representation() {}
    +
    1029 
    + +
    1031  if (!AtLeastOneTrue(media_info_.has_video_info(),
    +
    1032  media_info_.has_audio_info(),
    +
    1033  media_info_.has_text_info())) {
    +
    1034  // This is an error. Segment information can be in AdaptationSet, Period, or
    +
    1035  // MPD but the interface does not provide a way to set them.
    +
    1036  // See 5.3.9.1 ISO 23009-1:2012 for segment info.
    +
    1037  LOG(ERROR) << "Representation needs one of video, audio, or text.";
    +
    1038  return false;
    +
    1039  }
    +
    1040 
    +
    1041  if (MoreThanOneTrue(media_info_.has_video_info(),
    +
    1042  media_info_.has_audio_info(),
    +
    1043  media_info_.has_text_info())) {
    +
    1044  LOG(ERROR) << "Only one of VideoInfo, AudioInfo, or TextInfo can be set.";
    +
    1045  return false;
    +
    1046  }
    +
    1047 
    +
    1048  if (media_info_.container_type() == MediaInfo::CONTAINER_UNKNOWN) {
    +
    1049  LOG(ERROR) << "'container_type' in MediaInfo cannot be CONTAINER_UNKNOWN.";
    +
    1050  return false;
    +
    1051  }
    +
    1052 
    +
    1053  if (media_info_.has_video_info()) {
    +
    1054  mime_type_ = GetVideoMimeType();
    +
    1055  if (!HasRequiredVideoFields(media_info_.video_info())) {
    +
    1056  LOG(ERROR) << "Missing required fields to create a video Representation.";
    +
    1057  return false;
    +
    1058  }
    +
    1059  } else if (media_info_.has_audio_info()) {
    +
    1060  mime_type_ = GetAudioMimeType();
    +
    1061  } else if (media_info_.has_text_info()) {
    +
    1062  mime_type_ = GetTextMimeType();
    +
    1063  }
    +
    1064 
    +
    1065  if (mime_type_.empty())
    +
    1066  return false;
    +
    1067 
    +
    1068  codecs_ = GetCodecs(media_info_);
    +
    1069  return true;
    +
    1070 }
    +
    1071 
    + +
    1073  const ContentProtectionElement& content_protection_element) {
    +
    1074  content_protection_elements_.push_back(content_protection_element);
    +
    1075  RemoveDuplicateAttributes(&content_protection_elements_.back());
    +
    1076 }
    1077 
    -
    1078  if (state_change_listener_)
    -
    1079  state_change_listener_->OnNewSegmentForRepresentation(start_time, duration);
    -
    1080  if (IsContiguous(start_time, duration, size)) {
    -
    1081  ++segment_infos_.back().repeat;
    -
    1082  } else {
    -
    1083  SegmentInfo s = {start_time, duration, /* Not repeat. */ 0};
    -
    1084  segment_infos_.push_back(s);
    -
    1085  }
    -
    1086 
    -
    1087  bandwidth_estimator_.AddBlock(
    -
    1088  size, static_cast<double>(duration) / media_info_.reference_time_scale());
    -
    1089 
    -
    1090  SlideWindow();
    -
    1091  DCHECK_GE(segment_infos_.size(), 1u);
    -
    1092 }
    -
    1093 
    -
    1094 void Representation::SetSampleDuration(uint32_t sample_duration) {
    -
    1095  if (media_info_.has_video_info()) {
    -
    1096  media_info_.mutable_video_info()->set_frame_duration(sample_duration);
    -
    1097  if (state_change_listener_) {
    -
    1098  state_change_listener_->OnSetFrameRateForRepresentation(
    -
    1099  sample_duration, media_info_.video_info().time_scale());
    -
    1100  }
    -
    1101  }
    -
    1102 }
    +
    1078 void Representation::UpdateContentProtectionPssh(const std::string& drm_uuid,
    +
    1079  const std::string& pssh) {
    +
    1080  UpdateContentProtectionPsshHelper(drm_uuid, pssh,
    +
    1081  &content_protection_elements_);
    +
    1082 }
    +
    1083 
    +
    1084 void Representation::AddNewSegment(uint64_t start_time,
    +
    1085  uint64_t duration,
    +
    1086  uint64_t size) {
    +
    1087  if (start_time == 0 && duration == 0) {
    +
    1088  LOG(WARNING) << "Got segment with start_time and duration == 0. Ignoring.";
    +
    1089  return;
    +
    1090  }
    +
    1091 
    +
    1092  if (state_change_listener_)
    +
    1093  state_change_listener_->OnNewSegmentForRepresentation(start_time, duration);
    +
    1094  if (IsContiguous(start_time, duration, size)) {
    +
    1095  ++segment_infos_.back().repeat;
    +
    1096  } else {
    +
    1097  SegmentInfo s = {start_time, duration, /* Not repeat. */ 0};
    +
    1098  segment_infos_.push_back(s);
    +
    1099  }
    +
    1100 
    +
    1101  bandwidth_estimator_.AddBlock(
    +
    1102  size, static_cast<double>(duration) / media_info_.reference_time_scale());
    1103 
    -
    1104 // Uses info in |media_info_| and |content_protection_elements_| to create a
    -
    1105 // "Representation" node.
    -
    1106 // MPD schema has strict ordering. The following must be done in order.
    -
    1107 // AddVideoInfo() (possibly adds FramePacking elements), AddAudioInfo() (Adds
    -
    1108 // AudioChannelConfig elements), AddContentProtectionElements*(), and
    -
    1109 // AddVODOnlyInfo() (Adds segment info).
    -
    1110 xml::scoped_xml_ptr<xmlNode> Representation::GetXml() {
    -
    1111  if (!HasRequiredMediaInfoFields()) {
    -
    1112  LOG(ERROR) << "MediaInfo missing required fields.";
    -
    1113  return xml::scoped_xml_ptr<xmlNode>();
    -
    1114  }
    -
    1115 
    -
    1116  const uint64_t bandwidth = media_info_.has_bandwidth()
    -
    1117  ? media_info_.bandwidth()
    -
    1118  : bandwidth_estimator_.Estimate();
    -
    1119 
    -
    1120  DCHECK(!(HasVODOnlyFields(media_info_) && HasLiveOnlyFields(media_info_)));
    -
    1121 
    -
    1122  RepresentationXmlNode representation;
    -
    1123  // Mandatory fields for Representation.
    -
    1124  representation.SetId(id_);
    -
    1125  representation.SetIntegerAttribute("bandwidth", bandwidth);
    -
    1126  if (!codecs_.empty())
    -
    1127  representation.SetStringAttribute("codecs", codecs_);
    -
    1128  representation.SetStringAttribute("mimeType", mime_type_);
    +
    1104  SlideWindow();
    +
    1105  DCHECK_GE(segment_infos_.size(), 1u);
    +
    1106 }
    +
    1107 
    +
    1108 void Representation::SetSampleDuration(uint32_t sample_duration) {
    +
    1109  if (media_info_.has_video_info()) {
    +
    1110  media_info_.mutable_video_info()->set_frame_duration(sample_duration);
    +
    1111  if (state_change_listener_) {
    +
    1112  state_change_listener_->OnSetFrameRateForRepresentation(
    +
    1113  sample_duration, media_info_.video_info().time_scale());
    +
    1114  }
    +
    1115  }
    +
    1116 }
    +
    1117 
    +
    1118 // Uses info in |media_info_| and |content_protection_elements_| to create a
    +
    1119 // "Representation" node.
    +
    1120 // MPD schema has strict ordering. The following must be done in order.
    +
    1121 // AddVideoInfo() (possibly adds FramePacking elements), AddAudioInfo() (Adds
    +
    1122 // AudioChannelConfig elements), AddContentProtectionElements*(), and
    +
    1123 // AddVODOnlyInfo() (Adds segment info).
    +
    1124 xml::scoped_xml_ptr<xmlNode> Representation::GetXml() {
    +
    1125  if (!HasRequiredMediaInfoFields()) {
    +
    1126  LOG(ERROR) << "MediaInfo missing required fields.";
    +
    1127  return xml::scoped_xml_ptr<xmlNode>();
    +
    1128  }
    1129 
    -
    1130  const bool has_video_info = media_info_.has_video_info();
    -
    1131  const bool has_audio_info = media_info_.has_audio_info();
    -
    1132 
    -
    1133  if (has_video_info &&
    -
    1134  !representation.AddVideoInfo(media_info_.video_info())) {
    -
    1135  LOG(ERROR) << "Failed to add video info to Representation XML.";
    -
    1136  return xml::scoped_xml_ptr<xmlNode>();
    -
    1137  }
    -
    1138 
    -
    1139  if (has_audio_info &&
    -
    1140  !representation.AddAudioInfo(media_info_.audio_info())) {
    -
    1141  LOG(ERROR) << "Failed to add audio info to Representation XML.";
    -
    1142  return xml::scoped_xml_ptr<xmlNode>();
    -
    1143  }
    -
    1144 
    -
    1145  if (!representation.AddContentProtectionElements(
    -
    1146  content_protection_elements_)) {
    -
    1147  return xml::scoped_xml_ptr<xmlNode>();
    -
    1148  }
    -
    1149 
    -
    1150  if (HasVODOnlyFields(media_info_) &&
    -
    1151  !representation.AddVODOnlyInfo(media_info_)) {
    -
    1152  LOG(ERROR) << "Failed to add VOD segment info.";
    -
    1153  return xml::scoped_xml_ptr<xmlNode>();
    -
    1154  }
    -
    1155 
    -
    1156  if (HasLiveOnlyFields(media_info_) &&
    -
    1157  !representation.AddLiveOnlyInfo(media_info_, segment_infos_,
    -
    1158  start_number_)) {
    -
    1159  LOG(ERROR) << "Failed to add Live info.";
    +
    1130  const uint64_t bandwidth = media_info_.has_bandwidth()
    +
    1131  ? media_info_.bandwidth()
    +
    1132  : bandwidth_estimator_.Estimate();
    +
    1133 
    +
    1134  DCHECK(!(HasVODOnlyFields(media_info_) && HasLiveOnlyFields(media_info_)));
    +
    1135 
    +
    1136  RepresentationXmlNode representation;
    +
    1137  // Mandatory fields for Representation.
    +
    1138  representation.SetId(id_);
    +
    1139  representation.SetIntegerAttribute("bandwidth", bandwidth);
    +
    1140  if (!codecs_.empty())
    +
    1141  representation.SetStringAttribute("codecs", codecs_);
    +
    1142  representation.SetStringAttribute("mimeType", mime_type_);
    +
    1143 
    +
    1144  const bool has_video_info = media_info_.has_video_info();
    +
    1145  const bool has_audio_info = media_info_.has_audio_info();
    +
    1146 
    +
    1147  if (has_video_info &&
    +
    1148  !representation.AddVideoInfo(
    +
    1149  media_info_.video_info(),
    +
    1150  !(output_suppression_flags_ & kSuppressWidth),
    +
    1151  !(output_suppression_flags_ & kSuppressHeight),
    +
    1152  !(output_suppression_flags_ & kSuppressFrameRate))) {
    +
    1153  LOG(ERROR) << "Failed to add video info to Representation XML.";
    +
    1154  return xml::scoped_xml_ptr<xmlNode>();
    +
    1155  }
    +
    1156 
    +
    1157  if (has_audio_info &&
    +
    1158  !representation.AddAudioInfo(media_info_.audio_info())) {
    +
    1159  LOG(ERROR) << "Failed to add audio info to Representation XML.";
    1160  return xml::scoped_xml_ptr<xmlNode>();
    1161  }
    -
    1162  // TODO(rkuroiwa): It is likely that all representations have the exact same
    -
    1163  // SegmentTemplate. Optimize and propagate the tag up to AdaptationSet level.
    -
    1164 
    -
    1165  return representation.PassScopedPtr();
    -
    1166 }
    +
    1162 
    +
    1163  if (!representation.AddContentProtectionElements(
    +
    1164  content_protection_elements_)) {
    +
    1165  return xml::scoped_xml_ptr<xmlNode>();
    +
    1166  }
    1167 
    -
    1168 bool Representation::HasRequiredMediaInfoFields() {
    -
    1169  if (HasVODOnlyFields(media_info_) && HasLiveOnlyFields(media_info_)) {
    -
    1170  LOG(ERROR) << "MediaInfo cannot have both VOD and Live fields.";
    -
    1171  return false;
    +
    1168  if (HasVODOnlyFields(media_info_) &&
    +
    1169  !representation.AddVODOnlyInfo(media_info_)) {
    +
    1170  LOG(ERROR) << "Failed to add VOD segment info.";
    +
    1171  return xml::scoped_xml_ptr<xmlNode>();
    1172  }
    1173 
    -
    1174  if (!media_info_.has_container_type()) {
    -
    1175  LOG(ERROR) << "MediaInfo missing required field: container_type.";
    -
    1176  return false;
    -
    1177  }
    -
    1178 
    -
    1179  if (HasVODOnlyFields(media_info_) && !media_info_.has_bandwidth()) {
    -
    1180  LOG(ERROR) << "Missing 'bandwidth' field. MediaInfo requires bandwidth for "
    -
    1181  "static profile for generating a valid MPD.";
    -
    1182  return false;
    -
    1183  }
    -
    1184 
    -
    1185  VLOG_IF(3, HasLiveOnlyFields(media_info_) && !media_info_.has_bandwidth())
    -
    1186  << "MediaInfo missing field 'bandwidth'. Using estimated from "
    -
    1187  "segment size.";
    -
    1188 
    -
    1189  return true;
    -
    1190 }
    -
    1191 
    -
    1192 bool Representation::IsContiguous(uint64_t start_time,
    -
    1193  uint64_t duration,
    -
    1194  uint64_t size) const {
    -
    1195  if (segment_infos_.empty())
    -
    1196  return false;
    -
    1197 
    -
    1198  // Contiguous segment.
    -
    1199  const SegmentInfo& previous = segment_infos_.back();
    -
    1200  const uint64_t previous_segment_end_time =
    -
    1201  previous.start_time + previous.duration * (previous.repeat + 1);
    -
    1202  if (previous_segment_end_time == start_time &&
    -
    1203  segment_infos_.back().duration == duration) {
    -
    1204  return true;
    -
    1205  }
    -
    1206 
    -
    1207  // No out of order segments.
    -
    1208  const uint64_t previous_segment_start_time =
    -
    1209  previous.start_time + previous.duration * previous.repeat;
    -
    1210  if (previous_segment_start_time >= start_time) {
    -
    1211  LOG(ERROR) << "Segments should not be out of order segment. Adding segment "
    -
    1212  "with start_time == "
    -
    1213  << start_time << " but the previous segment starts at "
    -
    1214  << previous.start_time << ".";
    -
    1215  return false;
    -
    1216  }
    -
    1217 
    -
    1218  // A gap since previous.
    -
    1219  const uint64_t kRoundingErrorGrace = 5;
    -
    1220  if (previous_segment_end_time + kRoundingErrorGrace < start_time) {
    -
    1221  LOG(WARNING) << "Found a gap of size "
    -
    1222  << (start_time - previous_segment_end_time)
    -
    1223  << " > kRoundingErrorGrace (" << kRoundingErrorGrace
    -
    1224  << "). The new segment starts at " << start_time
    -
    1225  << " but the previous segment ends at "
    -
    1226  << previous_segment_end_time << ".";
    -
    1227  return false;
    +
    1174  if (HasLiveOnlyFields(media_info_) &&
    +
    1175  !representation.AddLiveOnlyInfo(media_info_, segment_infos_,
    +
    1176  start_number_)) {
    +
    1177  LOG(ERROR) << "Failed to add Live info.";
    +
    1178  return xml::scoped_xml_ptr<xmlNode>();
    +
    1179  }
    +
    1180  // TODO(rkuroiwa): It is likely that all representations have the exact same
    +
    1181  // SegmentTemplate. Optimize and propagate the tag up to AdaptationSet level.
    +
    1182 
    +
    1183  output_suppression_flags_ = 0;
    +
    1184  return representation.PassScopedPtr();
    +
    1185 }
    +
    1186 
    +
    1187 void Representation::SuppressOnce(SuppressFlag flag) {
    +
    1188  output_suppression_flags_ |= flag;
    +
    1189 }
    +
    1190 
    +
    1191 bool Representation::HasRequiredMediaInfoFields() {
    +
    1192  if (HasVODOnlyFields(media_info_) && HasLiveOnlyFields(media_info_)) {
    +
    1193  LOG(ERROR) << "MediaInfo cannot have both VOD and Live fields.";
    +
    1194  return false;
    +
    1195  }
    +
    1196 
    +
    1197  if (!media_info_.has_container_type()) {
    +
    1198  LOG(ERROR) << "MediaInfo missing required field: container_type.";
    +
    1199  return false;
    +
    1200  }
    +
    1201 
    +
    1202  if (HasVODOnlyFields(media_info_) && !media_info_.has_bandwidth()) {
    +
    1203  LOG(ERROR) << "Missing 'bandwidth' field. MediaInfo requires bandwidth for "
    +
    1204  "static profile for generating a valid MPD.";
    +
    1205  return false;
    +
    1206  }
    +
    1207 
    +
    1208  VLOG_IF(3, HasLiveOnlyFields(media_info_) && !media_info_.has_bandwidth())
    +
    1209  << "MediaInfo missing field 'bandwidth'. Using estimated from "
    +
    1210  "segment size.";
    +
    1211 
    +
    1212  return true;
    +
    1213 }
    +
    1214 
    +
    1215 bool Representation::IsContiguous(uint64_t start_time,
    +
    1216  uint64_t duration,
    +
    1217  uint64_t size) const {
    +
    1218  if (segment_infos_.empty())
    +
    1219  return false;
    +
    1220 
    +
    1221  // Contiguous segment.
    +
    1222  const SegmentInfo& previous = segment_infos_.back();
    +
    1223  const uint64_t previous_segment_end_time =
    +
    1224  previous.start_time + previous.duration * (previous.repeat + 1);
    +
    1225  if (previous_segment_end_time == start_time &&
    +
    1226  segment_infos_.back().duration == duration) {
    +
    1227  return true;
    1228  }
    1229 
    -
    1230  // No overlapping segments.
    -
    1231  if (start_time < previous_segment_end_time - kRoundingErrorGrace) {
    -
    1232  LOG(WARNING)
    -
    1233  << "Segments should not be overlapping. The new segment starts at "
    -
    1234  << start_time << " but the previous segment ends at "
    -
    1235  << previous_segment_end_time << ".";
    -
    1236  return false;
    -
    1237  }
    -
    1238 
    -
    1239  // Within rounding error grace but technically not contiguous in terms of MPD.
    -
    1240  return false;
    -
    1241 }
    -
    1242 
    -
    1243 void Representation::SlideWindow() {
    -
    1244  DCHECK(!segment_infos_.empty());
    -
    1245  if (mpd_options_.time_shift_buffer_depth <= 0.0)
    -
    1246  return;
    -
    1247 
    -
    1248  const uint32_t time_scale = GetTimeScale(media_info_);
    -
    1249  DCHECK_GT(time_scale, 0u);
    -
    1250 
    -
    1251  uint64_t time_shift_buffer_depth =
    -
    1252  static_cast<uint64_t>(mpd_options_.time_shift_buffer_depth * time_scale);
    -
    1253 
    -
    1254  // The start time of the latest segment is considered the current_play_time,
    -
    1255  // and this should guarantee that the latest segment will stay in the list.
    -
    1256  const uint64_t current_play_time = LatestSegmentStartTime(segment_infos_);
    -
    1257  if (current_play_time <= time_shift_buffer_depth)
    -
    1258  return;
    -
    1259 
    -
    1260  const uint64_t timeshift_limit = current_play_time - time_shift_buffer_depth;
    +
    1230  // No out of order segments.
    +
    1231  const uint64_t previous_segment_start_time =
    +
    1232  previous.start_time + previous.duration * previous.repeat;
    +
    1233  if (previous_segment_start_time >= start_time) {
    +
    1234  LOG(ERROR) << "Segments should not be out of order segment. Adding segment "
    +
    1235  "with start_time == "
    +
    1236  << start_time << " but the previous segment starts at "
    +
    1237  << previous.start_time << ".";
    +
    1238  return false;
    +
    1239  }
    +
    1240 
    +
    1241  // A gap since previous.
    +
    1242  const uint64_t kRoundingErrorGrace = 5;
    +
    1243  if (previous_segment_end_time + kRoundingErrorGrace < start_time) {
    +
    1244  LOG(WARNING) << "Found a gap of size "
    +
    1245  << (start_time - previous_segment_end_time)
    +
    1246  << " > kRoundingErrorGrace (" << kRoundingErrorGrace
    +
    1247  << "). The new segment starts at " << start_time
    +
    1248  << " but the previous segment ends at "
    +
    1249  << previous_segment_end_time << ".";
    +
    1250  return false;
    +
    1251  }
    +
    1252 
    +
    1253  // No overlapping segments.
    +
    1254  if (start_time < previous_segment_end_time - kRoundingErrorGrace) {
    +
    1255  LOG(WARNING)
    +
    1256  << "Segments should not be overlapping. The new segment starts at "
    +
    1257  << start_time << " but the previous segment ends at "
    +
    1258  << previous_segment_end_time << ".";
    +
    1259  return false;
    +
    1260  }
    1261 
    -
    1262  // First remove all the SegmentInfos that are completely out of range, by
    -
    1263  // looking at the very last segment's end time.
    -
    1264  std::list<SegmentInfo>::iterator first = segment_infos_.begin();
    -
    1265  std::list<SegmentInfo>::iterator last = first;
    -
    1266  size_t num_segments_removed = 0;
    -
    1267  for (; last != segment_infos_.end(); ++last) {
    -
    1268  const uint64_t last_segment_end_time = LastSegmentEndTime(*last);
    -
    1269  if (timeshift_limit < last_segment_end_time)
    -
    1270  break;
    -
    1271  num_segments_removed += last->repeat + 1;
    -
    1272  }
    -
    1273  segment_infos_.erase(first, last);
    -
    1274  start_number_ += num_segments_removed;
    -
    1275 
    -
    1276  // Now some segment in the first SegmentInfo should be left in the list.
    -
    1277  SegmentInfo* first_segment_info = &segment_infos_.front();
    -
    1278  DCHECK_LE(timeshift_limit, LastSegmentEndTime(*first_segment_info));
    -
    1279 
    -
    1280  // Identify which segments should still be in the SegmentInfo.
    -
    1281  const int repeat_index =
    -
    1282  SearchTimedOutRepeatIndex(timeshift_limit, *first_segment_info);
    -
    1283  CHECK_GE(repeat_index, 0);
    -
    1284  if (repeat_index == 0)
    -
    1285  return;
    -
    1286 
    -
    1287  first_segment_info->start_time = first_segment_info->start_time +
    -
    1288  first_segment_info->duration * repeat_index;
    -
    1289 
    -
    1290  first_segment_info->repeat = first_segment_info->repeat - repeat_index;
    -
    1291  start_number_ += repeat_index;
    -
    1292 }
    -
    1293 
    -
    1294 std::string Representation::GetVideoMimeType() const {
    -
    1295  return GetMimeType("video", media_info_.container_type());
    -
    1296 }
    -
    1297 
    -
    1298 std::string Representation::GetAudioMimeType() const {
    -
    1299  return GetMimeType("audio", media_info_.container_type());
    -
    1300 }
    -
    1301 
    -
    1302 std::string Representation::GetTextMimeType() const {
    -
    1303  CHECK(media_info_.has_text_info());
    -
    1304  if (media_info_.text_info().format() == "ttml") {
    -
    1305  switch (media_info_.container_type()) {
    -
    1306  case MediaInfo::CONTAINER_TEXT:
    -
    1307  return "application/ttml+xml";
    -
    1308  case MediaInfo::CONTAINER_MP4:
    -
    1309  return "application/mp4";
    -
    1310  default:
    -
    1311  LOG(ERROR) << "Failed to determine MIME type for TTML container: "
    -
    1312  << media_info_.container_type();
    -
    1313  return "";
    -
    1314  }
    -
    1315  }
    -
    1316  if (media_info_.text_info().format() == "vtt") {
    -
    1317  if (media_info_.container_type() == MediaInfo::CONTAINER_TEXT) {
    -
    1318  return "text/vtt";
    -
    1319  }
    -
    1320  LOG(ERROR) << "Failed to determine MIME type for VTT container: "
    -
    1321  << media_info_.container_type();
    -
    1322  return "";
    -
    1323  }
    +
    1262  // Within rounding error grace but technically not contiguous in terms of MPD.
    +
    1263  return false;
    +
    1264 }
    +
    1265 
    +
    1266 void Representation::SlideWindow() {
    +
    1267  DCHECK(!segment_infos_.empty());
    +
    1268  if (mpd_options_.time_shift_buffer_depth <= 0.0)
    +
    1269  return;
    +
    1270 
    +
    1271  const uint32_t time_scale = GetTimeScale(media_info_);
    +
    1272  DCHECK_GT(time_scale, 0u);
    +
    1273 
    +
    1274  uint64_t time_shift_buffer_depth =
    +
    1275  static_cast<uint64_t>(mpd_options_.time_shift_buffer_depth * time_scale);
    +
    1276 
    +
    1277  // The start time of the latest segment is considered the current_play_time,
    +
    1278  // and this should guarantee that the latest segment will stay in the list.
    +
    1279  const uint64_t current_play_time = LatestSegmentStartTime(segment_infos_);
    +
    1280  if (current_play_time <= time_shift_buffer_depth)
    +
    1281  return;
    +
    1282 
    +
    1283  const uint64_t timeshift_limit = current_play_time - time_shift_buffer_depth;
    +
    1284 
    +
    1285  // First remove all the SegmentInfos that are completely out of range, by
    +
    1286  // looking at the very last segment's end time.
    +
    1287  std::list<SegmentInfo>::iterator first = segment_infos_.begin();
    +
    1288  std::list<SegmentInfo>::iterator last = first;
    +
    1289  size_t num_segments_removed = 0;
    +
    1290  for (; last != segment_infos_.end(); ++last) {
    +
    1291  const uint64_t last_segment_end_time = LastSegmentEndTime(*last);
    +
    1292  if (timeshift_limit < last_segment_end_time)
    +
    1293  break;
    +
    1294  num_segments_removed += last->repeat + 1;
    +
    1295  }
    +
    1296  segment_infos_.erase(first, last);
    +
    1297  start_number_ += num_segments_removed;
    +
    1298 
    +
    1299  // Now some segment in the first SegmentInfo should be left in the list.
    +
    1300  SegmentInfo* first_segment_info = &segment_infos_.front();
    +
    1301  DCHECK_LE(timeshift_limit, LastSegmentEndTime(*first_segment_info));
    +
    1302 
    +
    1303  // Identify which segments should still be in the SegmentInfo.
    +
    1304  const int repeat_index =
    +
    1305  SearchTimedOutRepeatIndex(timeshift_limit, *first_segment_info);
    +
    1306  CHECK_GE(repeat_index, 0);
    +
    1307  if (repeat_index == 0)
    +
    1308  return;
    +
    1309 
    +
    1310  first_segment_info->start_time = first_segment_info->start_time +
    +
    1311  first_segment_info->duration * repeat_index;
    +
    1312 
    +
    1313  first_segment_info->repeat = first_segment_info->repeat - repeat_index;
    +
    1314  start_number_ += repeat_index;
    +
    1315 }
    +
    1316 
    +
    1317 std::string Representation::GetVideoMimeType() const {
    +
    1318  return GetMimeType("video", media_info_.container_type());
    +
    1319 }
    +
    1320 
    +
    1321 std::string Representation::GetAudioMimeType() const {
    +
    1322  return GetMimeType("audio", media_info_.container_type());
    +
    1323 }
    1324 
    -
    1325  LOG(ERROR) << "Cannot determine MIME type for format: "
    -
    1326  << media_info_.text_info().format()
    -
    1327  << " container: " << media_info_.container_type();
    -
    1328  return "";
    -
    1329 }
    -
    1330 
    -
    1331 bool Representation::GetEarliestTimestamp(double* timestamp_seconds) {
    -
    1332  DCHECK(timestamp_seconds);
    -
    1333 
    -
    1334  if (segment_infos_.empty())
    -
    1335  return false;
    -
    1336 
    -
    1337  *timestamp_seconds = static_cast<double>(segment_infos_.begin()->start_time) /
    -
    1338  GetTimeScale(media_info_);
    -
    1339  return true;
    -
    1340 }
    -
    1341 
    -
    1342 } // namespace edash_packager
    +
    1325 std::string Representation::GetTextMimeType() const {
    +
    1326  CHECK(media_info_.has_text_info());
    +
    1327  if (media_info_.text_info().format() == "ttml") {
    +
    1328  switch (media_info_.container_type()) {
    +
    1329  case MediaInfo::CONTAINER_TEXT:
    +
    1330  return "application/ttml+xml";
    +
    1331  case MediaInfo::CONTAINER_MP4:
    +
    1332  return "application/mp4";
    +
    1333  default:
    +
    1334  LOG(ERROR) << "Failed to determine MIME type for TTML container: "
    +
    1335  << media_info_.container_type();
    +
    1336  return "";
    +
    1337  }
    +
    1338  }
    +
    1339  if (media_info_.text_info().format() == "vtt") {
    +
    1340  if (media_info_.container_type() == MediaInfo::CONTAINER_TEXT) {
    +
    1341  return "text/vtt";
    +
    1342  }
    +
    1343  LOG(ERROR) << "Failed to determine MIME type for VTT container: "
    +
    1344  << media_info_.container_type();
    +
    1345  return "";
    +
    1346  }
    +
    1347 
    +
    1348  LOG(ERROR) << "Cannot determine MIME type for format: "
    +
    1349  << media_info_.text_info().format()
    +
    1350  << " container: " << media_info_.container_type();
    +
    1351  return "";
    +
    1352 }
    +
    1353 
    +
    1354 bool Representation::GetEarliestTimestamp(double* timestamp_seconds) {
    +
    1355  DCHECK(timestamp_seconds);
    +
    1356 
    +
    1357  if (segment_infos_.empty())
    +
    1358  return false;
    +
    1359 
    +
    1360  *timestamp_seconds = static_cast<double>(segment_infos_.begin()->start_time) /
    +
    1361  GetTimeScale(media_info_);
    +
    1362  return true;
    +
    1363 }
    +
    1364 
    +
    1365 } // namespace edash_packager
    std::string LanguageToShortestForm(const std::string &language)
    -
    virtual void AddNewSegment(uint64_t start_time, uint64_t duration, uint64_t size)
    -
    AdaptationSet(uint32_t adaptation_set_id, const std::string &lang, const MpdOptions &mpd_options, MpdBuilder::MpdType mpd_type, base::AtomicSequenceNumber *representation_counter)
    Definition: mpd_builder.cc:653
    - +
    virtual void AddNewSegment(uint64_t start_time, uint64_t duration, uint64_t size)
    +
    AdaptationSet(uint32_t adaptation_set_id, const std::string &lang, const MpdOptions &mpd_options, MpdBuilder::MpdType mpd_type, base::AtomicSequenceNumber *representation_counter)
    Definition: mpd_builder.cc:654
    +
    Defines Mpd Options.
    Definition: mpd_options.h:17
    -
    virtual int Group() const
    Definition: mpd_builder.cc:813
    -
    virtual AdaptationSet * AddAdaptationSet(const std::string &lang)
    Definition: mpd_builder.cc:407
    -
    xml::scoped_xml_ptr< xmlNode > GetXml()
    +
    virtual int Group() const
    Definition: mpd_builder.cc:826
    +
    virtual AdaptationSet * AddAdaptationSet(const std::string &lang)
    Definition: mpd_builder.cc:408
    +
    xml::scoped_xml_ptr< xmlNode > GetXml()
    Define an abstract file interface.
    Definition: file.h:23
    -
    static void MakePathsRelativeToMpd(const std::string &mpd_path, MediaInfo *media_info)
    Definition: mpd_builder.cc:625
    -
    virtual void ForceSetSegmentAlignment(bool segment_alignment)
    Definition: mpd_builder.cc:803
    -
    virtual void SetSampleDuration(uint32_t sample_duration)
    -
    void AddBaseUrl(const std::string &base_url)
    Definition: mpd_builder.cc:403
    -
    virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
    -
    Representation(const MediaInfo &media_info, const MpdOptions &mpd_options, uint32_t representation_id, scoped_ptr< RepresentationStateChangeListener > state_change_listener)
    -
    virtual void SetGroup(int group_number)
    Definition: mpd_builder.cc:809
    +
    static void MakePathsRelativeToMpd(const std::string &mpd_path, MediaInfo *media_info)
    Definition: mpd_builder.cc:626
    +
    virtual void ForceSetSegmentAlignment(bool segment_alignment)
    Definition: mpd_builder.cc:816
    +
    virtual void SetSampleDuration(uint32_t sample_duration)
    +
    void AddBaseUrl(const std::string &base_url)
    Definition: mpd_builder.cc:404
    +
    virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
    +
    Representation(const MediaInfo &media_info, const MpdOptions &mpd_options, uint32_t representation_id, scoped_ptr< RepresentationStateChangeListener > state_change_listener)
    +
    virtual void SetGroup(int group_number)
    Definition: mpd_builder.cc:822
    -
    virtual void AddContentProtectionElement(const ContentProtectionElement &element)
    -
    bool WriteMpdToFile(media::File *output_file)
    Definition: mpd_builder.cc:417
    -
    void OnSetFrameRateForRepresentation(uint32_t representation_id, uint32_t frame_duration, uint32_t timescale)
    Definition: mpd_builder.cc:835
    -
    virtual Representation * AddRepresentation(const MediaInfo &media_info)
    Definition: mpd_builder.cc:672
    +
    virtual void AddContentProtectionElement(const ContentProtectionElement &element)
    +
    bool WriteMpdToFile(media::File *output_file)
    Definition: mpd_builder.cc:418
    +
    void OnSetFrameRateForRepresentation(uint32_t representation_id, uint32_t frame_duration, uint32_t timescale)
    Definition: mpd_builder.cc:848
    +
    virtual Representation * AddRepresentation(const MediaInfo &media_info)
    Definition: mpd_builder.cc:673
    -
    xml::scoped_xml_ptr< xmlNode > GetXml()
    Definition: mpd_builder.cc:734
    +
    xml::scoped_xml_ptr< xmlNode > GetXml()
    Definition: mpd_builder.cc:739
    +
    void SuppressOnce(SuppressFlag flag)
    -
    virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
    Definition: mpd_builder.cc:722
    -
    virtual bool ToString(std::string *output)
    Definition: mpd_builder.cc:422
    -
    virtual void AddRole(Role role)
    Definition: mpd_builder.cc:728
    -
    MpdBuilder(MpdType type, const MpdOptions &mpd_options)
    Definition: mpd_builder.cc:396
    -
    virtual void AddContentProtectionElement(const ContentProtectionElement &element)
    Definition: mpd_builder.cc:716
    +
    virtual void UpdateContentProtectionPssh(const std::string &drm_uuid, const std::string &pssh)
    Definition: mpd_builder.cc:723
    +
    virtual bool ToString(std::string *output)
    Definition: mpd_builder.cc:423
    +
    virtual void AddRole(Role role)
    Definition: mpd_builder.cc:729
    +
    MpdBuilder(MpdType type, const MpdOptions &mpd_options)
    Definition: mpd_builder.cc:397
    +
    virtual void AddContentProtectionElement(const ContentProtectionElement &element)
    Definition: mpd_builder.cc:717
    -
    void OnNewSegmentForRepresentation(uint32_t representation_id, uint64_t start_time, uint64_t duration)
    Definition: mpd_builder.cc:824
    +
    void OnNewSegmentForRepresentation(uint32_t representation_id, uint64_t start_time, uint64_t duration)
    Definition: mpd_builder.cc:837
    diff --git a/docs/dd/d12/mpd__writer_8cc_source.html b/docs/dd/d12/mpd__writer_8cc_source.html index b96fae50a9..ec0dcd1006 100644 --- a/docs/dd/d12/mpd__writer_8cc_source.html +++ b/docs/dd/d12/mpd__writer_8cc_source.html @@ -220,11 +220,11 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    131 } // namespace edash_packager
    static bool ReadFileToString(const char *file_name, std::string *contents)
    Definition: file.cc:184
    Define an abstract file interface.
    Definition: file.h:23
    -
    static void MakePathsRelativeToMpd(const std::string &mpd_path, MediaInfo *media_info)
    Definition: mpd_builder.cc:625
    +
    static void MakePathsRelativeToMpd(const std::string &mpd_path, MediaInfo *media_info)
    Definition: mpd_builder.cc:626
    diff --git a/docs/dd/d12/structedash__packager_1_1media_1_1mp4_1_1CueTimeBox.html b/docs/dd/d12/structedash__packager_1_1media_1_1mp4_1_1CueTimeBox.html index 5d5d7204f3..44e8c3ba8a 100644 --- a/docs/dd/d12/structedash__packager_1_1media_1_1mp4_1_1CueTimeBox.html +++ b/docs/dd/d12/structedash__packager_1_1media_1_1mp4_1_1CueTimeBox.html @@ -136,7 +136,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 723 of file box_definitions.h.

    +

    Definition at line 730 of file box_definitions.h.

    Member Function Documentation

    @@ -162,7 +162,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 2382 of file box_definitions.cc.

    +

    Definition at line 2403 of file box_definitions.cc.

    @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/dd/d14/structedash__packager_1_1media_1_1mp4_1_1MovieHeader.html b/docs/dd/d14/structedash__packager_1_1media_1_1mp4_1_1MovieHeader.html index 1527e59429..d847304e7b 100644 --- a/docs/dd/d14/structedash__packager_1_1media_1_1mp4_1_1MovieHeader.html +++ b/docs/dd/d14/structedash__packager_1_1media_1_1mp4_1_1MovieHeader.html @@ -189,7 +189,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 492 of file box_definitions.cc.

    +

    Definition at line 493 of file box_definitions.cc.

    @@ -200,7 +200,7 @@ Additional Inherited Members diff --git a/docs/dd/d15/structedash__packager_1_1media_1_1mp4_1_1TrackHeader.html b/docs/dd/d15/structedash__packager_1_1media_1_1mp4_1_1TrackHeader.html index 8e7f3b5142..b80505c544 100644 --- a/docs/dd/d15/structedash__packager_1_1media_1_1mp4_1_1TrackHeader.html +++ b/docs/dd/d15/structedash__packager_1_1media_1_1mp4_1_1TrackHeader.html @@ -204,7 +204,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 535 of file box_definitions.cc.

    +

    Definition at line 536 of file box_definitions.cc.

    @@ -215,7 +215,7 @@ Additional Inherited Members diff --git a/docs/dd/d18/es__parser__adts_8h_source.html b/docs/dd/d18/es__parser__adts_8h_source.html index 1aa7aa8ede..216a3eb997 100644 --- a/docs/dd/d18/es__parser__adts_8h_source.html +++ b/docs/dd/d18/es__parser__adts_8h_source.html @@ -172,7 +172,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d19/video__stream__info_8cc_source.html b/docs/dd/d19/video__stream__info_8cc_source.html index b8a14691d4..356efd541d 100644 --- a/docs/dd/d19/video__stream__info_8cc_source.html +++ b/docs/dd/d19/video__stream__info_8cc_source.html @@ -197,7 +197,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d1a/classedash__packager_1_1media_1_1H264ByteToUnitStreamConverter-members.html b/docs/dd/d1a/classedash__packager_1_1media_1_1H264ByteToUnitStreamConverter-members.html index 7b2ca6d43f..ebf0f7b453 100644 --- a/docs/dd/d1a/classedash__packager_1_1media_1_1H264ByteToUnitStreamConverter-members.html +++ b/docs/dd/d1a/classedash__packager_1_1media_1_1H264ByteToUnitStreamConverter-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d2b/classedash__packager_1_1media_1_1ClosureThread.html b/docs/dd/d2b/classedash__packager_1_1media_1_1ClosureThread.html index 68464a2294..226c54594d 100644 --- a/docs/dd/d2b/classedash__packager_1_1media_1_1ClosureThread.html +++ b/docs/dd/d2b/classedash__packager_1_1media_1_1ClosureThread.html @@ -179,7 +179,7 @@ void  diff --git a/docs/dd/d30/wvm__media__parser_8cc_source.html b/docs/dd/d30/wvm__media__parser_8cc_source.html index 6f5613282e..54d1c75224 100644 --- a/docs/dd/d30/wvm__media__parser_8cc_source.html +++ b/docs/dd/d30/wvm__media__parser_8cc_source.html @@ -1255,11 +1255,11 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    static size_t GetAdtsFrameSize(const uint8_t *data, size_t num_bytes)
    Definition: adts_header.cc:23
    KeySource is responsible for encryption key acquisition.
    Definition: key_source.h:29
    static scoped_refptr< MediaSample > CreateEmptyMediaSample()
    Create a MediaSample object with default members.
    Definition: media_sample.cc:74
    -
    static std::string GetCodecString(AudioCodec codec, uint8_t audio_object_type)
    +
    static std::string GetCodecString(AudioCodec codec, uint8_t audio_object_type)
    diff --git a/docs/dd/d36/classedash__packager_1_1media_1_1MediaSample-members.html b/docs/dd/d36/classedash__packager_1_1media_1_1MediaSample-members.html index 1e50ef7bb0..025a7f2145 100644 --- a/docs/dd/d36/classedash__packager_1_1media_1_1MediaSample-members.html +++ b/docs/dd/d36/classedash__packager_1_1media_1_1MediaSample-members.html @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d3b/mp4_2segmenter_8h_source.html b/docs/dd/d3b/mp4_2segmenter_8h_source.html index 6b96503606..421e111c74 100644 --- a/docs/dd/d3b/mp4_2segmenter_8h_source.html +++ b/docs/dd/d3b/mp4_2segmenter_8h_source.html @@ -219,7 +219,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d41/structedash__packager_1_1media_1_1H264NALU.html b/docs/dd/d41/structedash__packager_1_1media_1_1H264NALU.html index 48c7f9c1ab..ecc64750ba 100644 --- a/docs/dd/d41/structedash__packager_1_1media_1_1H264NALU.html +++ b/docs/dd/d41/structedash__packager_1_1media_1_1H264NALU.html @@ -139,7 +139,7 @@ int nal_unit_type diff --git a/docs/dd/d44/structedash__packager_1_1media_1_1mp4_1_1SegmentReference-members.html b/docs/dd/d44/structedash__packager_1_1media_1_1mp4_1_1SegmentReference-members.html index a6650d2522..32e978152c 100644 --- a/docs/dd/d44/structedash__packager_1_1media_1_1mp4_1_1SegmentReference-members.html +++ b/docs/dd/d44/structedash__packager_1_1media_1_1mp4_1_1SegmentReference-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d46/webm__parser_8h_source.html b/docs/dd/d46/webm__parser_8h_source.html index b8ffc3e933..5099e19328 100644 --- a/docs/dd/d46/webm__parser_8h_source.html +++ b/docs/dd/d46/webm__parser_8h_source.html @@ -227,7 +227,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d47/classedash__packager_1_1media_1_1WebMInfoParser.html b/docs/dd/d47/classedash__packager_1_1media_1_1WebMInfoParser.html index 203e6df6f2..3a8f815225 100644 --- a/docs/dd/d47/classedash__packager_1_1media_1_1WebMInfoParser.html +++ b/docs/dd/d47/classedash__packager_1_1media_1_1WebMInfoParser.html @@ -175,7 +175,7 @@ The number of bytes parsed on success. diff --git a/docs/dd/d4c/structedash__packager_1_1media_1_1mp4_1_1FullBox-members.html b/docs/dd/d4c/structedash__packager_1_1media_1_1mp4_1_1FullBox-members.html index c95cad888e..a826fb6302 100644 --- a/docs/dd/d4c/structedash__packager_1_1media_1_1mp4_1_1FullBox-members.html +++ b/docs/dd/d4c/structedash__packager_1_1media_1_1mp4_1_1FullBox-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d4f/classedash__packager_1_1media_1_1mp4_1_1BoxBuffer.html b/docs/dd/d4f/classedash__packager_1_1media_1_1mp4_1_1BoxBuffer.html index 61f6448f64..339e1b7123 100644 --- a/docs/dd/d4f/classedash__packager_1_1media_1_1mp4_1_1BoxBuffer.html +++ b/docs/dd/d4f/classedash__packager_1_1media_1_1mp4_1_1BoxBuffer.html @@ -589,7 +589,7 @@ bool ReadWriteInt64 (i diff --git a/docs/dd/d54/widevine__encryption__flags_8h_source.html b/docs/dd/d54/widevine__encryption__flags_8h_source.html index 0d6ee06b4a..ce62b96729 100644 --- a/docs/dd/d54/widevine__encryption__flags_8h_source.html +++ b/docs/dd/d54/widevine__encryption__flags_8h_source.html @@ -123,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d5e/structedash__packager_1_1media_1_1mp4_1_1CuePayloadBox-members.html b/docs/dd/d5e/structedash__packager_1_1media_1_1mp4_1_1CuePayloadBox-members.html index 22c328794e..b61e1f07da 100644 --- a/docs/dd/d5e/structedash__packager_1_1media_1_1mp4_1_1CuePayloadBox-members.html +++ b/docs/dd/d5e/structedash__packager_1_1media_1_1mp4_1_1CuePayloadBox-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d60/structedash__packager_1_1media_1_1mp4_1_1VTTEmptyCueBox-members.html b/docs/dd/d60/structedash__packager_1_1media_1_1mp4_1_1VTTEmptyCueBox-members.html index 0bff6dfa3b..2cfbee3a89 100644 --- a/docs/dd/d60/structedash__packager_1_1media_1_1mp4_1_1VTTEmptyCueBox-members.html +++ b/docs/dd/d60/structedash__packager_1_1media_1_1mp4_1_1VTTEmptyCueBox-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d65/vp8__parser_8h_source.html b/docs/dd/d65/vp8__parser_8h_source.html index 335b82c070..e225ebc6b4 100644 --- a/docs/dd/d65/vp8__parser_8h_source.html +++ b/docs/dd/d65/vp8__parser_8h_source.html @@ -136,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d67/h264__byte__to__unit__stream__converter_8cc_source.html b/docs/dd/d67/h264__byte__to__unit__stream__converter_8cc_source.html index e80d918b51..d617a25b49 100644 --- a/docs/dd/d67/h264__byte__to__unit__stream__converter_8cc_source.html +++ b/docs/dd/d67/h264__byte__to__unit__stream__converter_8cc_source.html @@ -226,7 +226,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d79/classedash__packager_1_1media_1_1AesCtrEncryptor.html b/docs/dd/d79/classedash__packager_1_1media_1_1AesCtrEncryptor.html index dae4127a71..bb05436a46 100644 --- a/docs/dd/d79/classedash__packager_1_1media_1_1AesCtrEncryptor.html +++ b/docs/dd/d79/classedash__packager_1_1media_1_1AesCtrEncryptor.html @@ -255,7 +255,7 @@ bool Encrypt (const st diff --git a/docs/dd/d80/media__sample_8h_source.html b/docs/dd/d80/media__sample_8h_source.html index b4a1d7d5a4..6bb013e711 100644 --- a/docs/dd/d80/media__sample_8h_source.html +++ b/docs/dd/d80/media__sample_8h_source.html @@ -256,7 +256,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d85/classedash__packager_1_1xml_1_1XmlNode.html b/docs/dd/d85/classedash__packager_1_1xml_1_1XmlNode.html index ced2705dc9..a585906eb8 100644 --- a/docs/dd/d85/classedash__packager_1_1xml_1_1XmlNode.html +++ b/docs/dd/d85/classedash__packager_1_1xml_1_1XmlNode.html @@ -419,7 +419,7 @@ bool  diff --git a/docs/dd/d85/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentHeader-members.html b/docs/dd/d85/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentHeader-members.html index ba49571e56..6a07ebc155 100644 --- a/docs/dd/d85/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentHeader-members.html +++ b/docs/dd/d85/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentHeader-members.html @@ -133,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d87/memory__file_8cc_source.html b/docs/dd/d87/memory__file_8cc_source.html index 9a42f7cc33..d605d8631b 100644 --- a/docs/dd/d87/memory__file_8cc_source.html +++ b/docs/dd/d87/memory__file_8cc_source.html @@ -241,7 +241,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d8c/file__test__util_8h_source.html b/docs/dd/d8c/file__test__util_8h_source.html index b5623fa3d1..de481f1d28 100644 --- a/docs/dd/d8c/file__test__util_8h_source.html +++ b/docs/dd/d8c/file__test__util_8h_source.html @@ -119,7 +119,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d8e/classedash__packager_1_1media_1_1mp4_1_1KeyRotationFragmenter-members.html b/docs/dd/d8e/classedash__packager_1_1media_1_1mp4_1_1KeyRotationFragmenter-members.html index f7c0eb7fbd..1e84fae68c 100644 --- a/docs/dd/d8e/classedash__packager_1_1media_1_1mp4_1_1KeyRotationFragmenter-members.html +++ b/docs/dd/d8e/classedash__packager_1_1media_1_1mp4_1_1KeyRotationFragmenter-members.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/d96/classedash__packager_1_1media_1_1AesCbcCtsDecryptor.html b/docs/dd/d96/classedash__packager_1_1media_1_1AesCbcCtsDecryptor.html index 485bd609aa..92d97919ac 100644 --- a/docs/dd/d96/classedash__packager_1_1media_1_1AesCbcCtsDecryptor.html +++ b/docs/dd/d96/classedash__packager_1_1media_1_1AesCbcCtsDecryptor.html @@ -252,7 +252,7 @@ const std::vector< uint8_t > &  diff --git a/docs/dd/d98/classedash__packager_1_1media_1_1LocalFile.html b/docs/dd/d98/classedash__packager_1_1media_1_1LocalFile.html index 9788636de6..5e3705c94c 100644 --- a/docs/dd/d98/classedash__packager_1_1media_1_1LocalFile.html +++ b/docs/dd/d98/classedash__packager_1_1media_1_1LocalFile.html @@ -502,7 +502,7 @@ bool  diff --git a/docs/dd/d99/classedash__packager_1_1media_1_1WebMMediaParser.html b/docs/dd/d99/classedash__packager_1_1media_1_1WebMMediaParser.html index 2d127ce127..df21591cad 100644 --- a/docs/dd/d99/classedash__packager_1_1media_1_1WebMMediaParser.html +++ b/docs/dd/d99/classedash__packager_1_1media_1_1WebMMediaParser.html @@ -205,7 +205,7 @@ track_id, const scoped_refptr
    diff --git a/docs/dd/d9a/audio__timestamp__helper_8h_source.html b/docs/dd/d9a/audio__timestamp__helper_8h_source.html index cce2cda1c2..c9263412dd 100644 --- a/docs/dd/d9a/audio__timestamp__helper_8h_source.html +++ b/docs/dd/d9a/audio__timestamp__helper_8h_source.html @@ -167,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/da2/structedash__packager_1_1media_1_1mp4_1_1MovieFragment.html b/docs/dd/da2/structedash__packager_1_1media_1_1mp4_1_1MovieFragment.html index 870b1974e0..6e7a6f4a77 100644 --- a/docs/dd/da2/structedash__packager_1_1media_1_1mp4_1_1MovieFragment.html +++ b/docs/dd/da2/structedash__packager_1_1media_1_1mp4_1_1MovieFragment.html @@ -143,7 +143,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 671 of file box_definitions.h.

    +

    Definition at line 678 of file box_definitions.h.

    Member Function Documentation

    @@ -169,7 +169,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 2265 of file box_definitions.cc.

    +

    Definition at line 2286 of file box_definitions.cc.

    @@ -180,7 +180,7 @@ Additional Inherited Members diff --git a/docs/dd/da6/structedash__packager_1_1media_1_1mp4_1_1SegmentType.html b/docs/dd/da6/structedash__packager_1_1media_1_1mp4_1_1SegmentType.html index 3719a7d58b..d43178c3ee 100644 --- a/docs/dd/da6/structedash__packager_1_1media_1_1mp4_1_1SegmentType.html +++ b/docs/dd/da6/structedash__packager_1_1media_1_1mp4_1_1SegmentType.html @@ -166,7 +166,7 @@ std::vector< FourCC > <

    Reimplemented from edash_packager::media::mp4::FileType.

    -

    Definition at line 152 of file box_definitions.cc.

    +

    Definition at line 153 of file box_definitions.cc.

    @@ -177,7 +177,7 @@ std::vector< FourCC > < diff --git a/docs/dd/da8/classedash__packager_1_1media_1_1RsaRequestSigner.html b/docs/dd/da8/classedash__packager_1_1media_1_1RsaRequestSigner.html index 5451b2f072..bfff2e468e 100644 --- a/docs/dd/da8/classedash__packager_1_1media_1_1RsaRequestSigner.html +++ b/docs/dd/da8/classedash__packager_1_1media_1_1RsaRequestSigner.html @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/dd/daa/vod__media__info__dump__muxer__listener_8h_source.html b/docs/dd/daa/vod__media__info__dump__muxer__listener_8h_source.html index c960392a86..81ec6218f9 100644 --- a/docs/dd/daa/vod__media__info__dump__muxer__listener_8h_source.html +++ b/docs/dd/daa/vod__media__info__dump__muxer__listener_8h_source.html @@ -178,7 +178,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dab/structedash__packager_1_1media_1_1mp4_1_1SampleToGroupEntry.html b/docs/dd/dab/structedash__packager_1_1media_1_1mp4_1_1SampleToGroupEntry.html index 78a971c37d..315d437906 100644 --- a/docs/dd/dab/structedash__packager_1_1media_1_1mp4_1_1SampleToGroupEntry.html +++ b/docs/dd/dab/structedash__packager_1_1media_1_1mp4_1_1SampleToGroupEntry.html @@ -113,14 +113,14 @@ uint32_t group_description

    Detailed Description

    -

    Definition at line 623 of file box_definitions.h.

    +

    Definition at line 630 of file box_definitions.h.


    The documentation for this struct was generated from the following file: diff --git a/docs/dd/dab/webm__muxer_8h_source.html b/docs/dd/dab/webm__muxer_8h_source.html index c34304ff6f..e18b5d9de7 100644 --- a/docs/dd/dab/webm__muxer_8h_source.html +++ b/docs/dd/dab/webm__muxer_8h_source.html @@ -138,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dad/classedash__packager_1_1media_1_1WebMParserClient-members.html b/docs/dd/dad/classedash__packager_1_1media_1_1WebMParserClient-members.html index 9f48951f35..93bddfb45c 100644 --- a/docs/dd/dad/classedash__packager_1_1media_1_1WebMParserClient-members.html +++ b/docs/dd/dad/classedash__packager_1_1media_1_1WebMParserClient-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dbc/buffer__reader_8cc_source.html b/docs/dd/dbc/buffer__reader_8cc_source.html index fbecbd59d0..6252deb047 100644 --- a/docs/dd/dbc/buffer__reader_8cc_source.html +++ b/docs/dd/dbc/buffer__reader_8cc_source.html @@ -196,7 +196,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dbd/classedash__packager_1_1media_1_1AesCtrEncryptor-members.html b/docs/dd/dbd/classedash__packager_1_1media_1_1AesCtrEncryptor-members.html index fdc8ca65b5..abcf56ae19 100644 --- a/docs/dd/dbd/classedash__packager_1_1media_1_1AesCtrEncryptor-members.html +++ b/docs/dd/dbd/classedash__packager_1_1media_1_1AesCtrEncryptor-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dbd/structedash__packager_1_1media_1_1mp4_1_1MediaInformation.html b/docs/dd/dbd/structedash__packager_1_1media_1_1mp4_1_1MediaInformation.html index 9da6e2ffa1..5c739aeb47 100644 --- a/docs/dd/dbd/structedash__packager_1_1media_1_1mp4_1_1MediaInformation.html +++ b/docs/dd/dbd/structedash__packager_1_1media_1_1mp4_1_1MediaInformation.html @@ -148,7 +148,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 500 of file box_definitions.h.

    +

    Definition at line 507 of file box_definitions.h.

    Member Function Documentation

    @@ -174,7 +174,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1678 of file box_definitions.cc.

    +

    Definition at line 1699 of file box_definitions.cc.

    @@ -185,7 +185,7 @@ Additional Inherited Members diff --git a/docs/dd/dbf/classedash__packager_1_1MpdNotifier-members.html b/docs/dd/dbf/classedash__packager_1_1MpdNotifier-members.html index 8438a78c0b..9cf001b4d2 100644 --- a/docs/dd/dbf/classedash__packager_1_1MpdNotifier-members.html +++ b/docs/dd/dbf/classedash__packager_1_1MpdNotifier-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dbf/webm__webvtt__parser_8h_source.html b/docs/dd/dbf/webm__webvtt__parser_8h_source.html index 850a9f808b..6f97f4fd76 100644 --- a/docs/dd/dbf/webm__webvtt__parser_8h_source.html +++ b/docs/dd/dbf/webm__webvtt__parser_8h_source.html @@ -144,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dc9/structedash__packager_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html b/docs/dd/dc9/structedash__packager_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html index 5985110486..9d10247381 100644 --- a/docs/dd/dc9/structedash__packager_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html +++ b/docs/dd/dc9/structedash__packager_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html @@ -168,7 +168,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 459 of file box_definitions.cc.

    +

    Definition at line 460 of file box_definitions.cc.

    @@ -179,7 +179,7 @@ Additional Inherited Members diff --git a/docs/dd/dcb/classedash__packager_1_1MpdNotifierFactory.html b/docs/dd/dcb/classedash__packager_1_1MpdNotifierFactory.html index fecbd036a0..3817c91e10 100644 --- a/docs/dd/dcb/classedash__packager_1_1MpdNotifierFactory.html +++ b/docs/dd/dcb/classedash__packager_1_1MpdNotifierFactory.html @@ -112,7 +112,7 @@ virtual scoped_ptr< diff --git a/docs/dd/dcf/structedash__packager_1_1media_1_1H264PPS.html b/docs/dd/dcf/structedash__packager_1_1media_1_1H264PPS.html index b342e7f1f6..a376a995d9 100644 --- a/docs/dd/dcf/structedash__packager_1_1media_1_1H264PPS.html +++ b/docs/dd/dcf/structedash__packager_1_1media_1_1H264PPS.html @@ -167,7 +167,7 @@ int second_chroma_qp_index diff --git a/docs/dd/dd2/buffer__writer_8h_source.html b/docs/dd/dd2/buffer__writer_8h_source.html index dab471a50f..314d7f7edd 100644 --- a/docs/dd/dd2/buffer__writer_8h_source.html +++ b/docs/dd/dd2/buffer__writer_8h_source.html @@ -159,7 +159,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dd3/buffer__writer_8cc_source.html b/docs/dd/dd3/buffer__writer_8cc_source.html index 475627c849..1830b68168 100644 --- a/docs/dd/dd3/buffer__writer_8cc_source.html +++ b/docs/dd/dd3/buffer__writer_8cc_source.html @@ -186,7 +186,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dd7/classedash__packager_1_1media_1_1OpusPacket-members.html b/docs/dd/dd7/classedash__packager_1_1media_1_1OpusPacket-members.html index 4cf3eb5f01..40138f31f4 100644 --- a/docs/dd/dd7/classedash__packager_1_1media_1_1OpusPacket-members.html +++ b/docs/dd/dd7/classedash__packager_1_1media_1_1OpusPacket-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/de7/xml__node_8h_source.html b/docs/dd/de7/xml__node_8h_source.html index 50091ba527..2058cd3cb6 100644 --- a/docs/dd/de7/xml__node_8h_source.html +++ b/docs/dd/de7/xml__node_8h_source.html @@ -179,35 +179,38 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    131  ~RepresentationXmlNode() override;
    132 
    -
    137  bool AddVideoInfo(const MediaInfo::VideoInfo& video_info);
    -
    138 
    -
    143  bool AddAudioInfo(const MediaInfo::AudioInfo& audio_info);
    +
    140  bool AddVideoInfo(const MediaInfo::VideoInfo& video_info,
    +
    141  bool set_width,
    +
    142  bool set_height,
    +
    143  bool set_frame_rate);
    144 
    -
    149  bool AddVODOnlyInfo(const MediaInfo& media_info);
    +
    149  bool AddAudioInfo(const MediaInfo::AudioInfo& audio_info);
    150 
    -
    153  bool AddLiveOnlyInfo(const MediaInfo& media_info,
    -
    154  const std::list<SegmentInfo>& segment_infos,
    -
    155  uint32_t start_number);
    +
    155  bool AddVODOnlyInfo(const MediaInfo& media_info);
    156 
    -
    157  private:
    -
    158  // Add AudioChannelConfiguration element. Note that it is a required element
    -
    159  // for audio Representations.
    -
    160  bool AddAudioChannelInfo(const MediaInfo::AudioInfo& audio_info);
    -
    161 
    -
    162  // Add audioSamplingRate attribute to this element, if present.
    -
    163  void AddAudioSamplingRateInfo(const MediaInfo::AudioInfo& audio_info);
    -
    164 
    -
    165  DISALLOW_COPY_AND_ASSIGN(RepresentationXmlNode);
    -
    166 };
    +
    159  bool AddLiveOnlyInfo(const MediaInfo& media_info,
    +
    160  const std::list<SegmentInfo>& segment_infos,
    +
    161  uint32_t start_number);
    +
    162 
    +
    163  private:
    +
    164  // Add AudioChannelConfiguration element. Note that it is a required element
    +
    165  // for audio Representations.
    +
    166  bool AddAudioChannelInfo(const MediaInfo::AudioInfo& audio_info);
    167 
    -
    168 } // namespace xml
    -
    169 } // namespace edash_packager
    -
    170 #endif // MPD_BASE_XML_XML_NODE_H_
    -
    bool AddVODOnlyInfo(const MediaInfo &media_info)
    Definition: xml_node.cc:246
    -
    bool AddLiveOnlyInfo(const MediaInfo &media_info, const std::list< SegmentInfo > &segment_infos, uint32_t start_number)
    Definition: xml_node.cc:293
    +
    168  // Add audioSamplingRate attribute to this element, if present.
    +
    169  void AddAudioSamplingRateInfo(const MediaInfo::AudioInfo& audio_info);
    +
    170 
    +
    171  DISALLOW_COPY_AND_ASSIGN(RepresentationXmlNode);
    +
    172 };
    +
    173 
    +
    174 } // namespace xml
    +
    175 } // namespace edash_packager
    +
    176 #endif // MPD_BASE_XML_XML_NODE_H_
    +
    bool AddVODOnlyInfo(const MediaInfo &media_info)
    Definition: xml_node.cc:253
    +
    bool AddLiveOnlyInfo(const MediaInfo &media_info, const std::list< SegmentInfo > &segment_infos, uint32_t start_number)
    Definition: xml_node.cc:300
    void SetStringAttribute(const char *attribute_name, const std::string &attribute)
    Definition: xml_node.cc:106
    void SetFloatingPointAttribute(const char *attribute_name, double number)
    Definition: xml_node.cc:121
    -
    bool AddAudioInfo(const MediaInfo::AudioInfo &audio_info)
    Definition: xml_node.cc:238
    +
    bool AddAudioInfo(const MediaInfo::AudioInfo &audio_info)
    Definition: xml_node.cc:245
    void SetId(uint32_t id)
    Definition: xml_node.cc:130
    bool AddChild(scoped_xml_ptr< xmlNode > child)
    Definition: xml_node.cc:64
    @@ -217,17 +220,17 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    bool AddElements(const std::vector< Element > &elements)
    Adds Elements to this node using the Element struct.
    Definition: xml_node.cc:76
    -
    bool AddVideoInfo(const MediaInfo::VideoInfo &video_info)
    Definition: xml_node.cc:218
    RepresentationType in MPD.
    Definition: xml_node.h:128
    scoped_xml_ptr< xmlNode > PassScopedPtr()
    Definition: xml_node.cc:139
    void SetContent(const std::string &content)
    Definition: xml_node.cc:134
    +
    bool AddVideoInfo(const MediaInfo::VideoInfo &video_info, bool set_width, bool set_height, bool set_frame_rate)
    Definition: xml_node.cc:218
    void AddRoleElement(const std::string &scheme_id_uri, const std::string &value)
    Definition: xml_node.cc:206
    AdaptationSetType specified in MPD.
    Definition: xml_node.h:113
    diff --git a/docs/dd/dec/structedash__packager_1_1media_1_1OnMediaEndParameters-members.html b/docs/dd/dec/structedash__packager_1_1media_1_1OnMediaEndParameters-members.html index 9a84591f60..1e94b29ed0 100644 --- a/docs/dd/dec/structedash__packager_1_1media_1_1OnMediaEndParameters-members.html +++ b/docs/dd/dec/structedash__packager_1_1media_1_1OnMediaEndParameters-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dee/box__definitions_8cc_source.html b/docs/dd/dee/box__definitions_8cc_source.html index 6c854c4230..f9d19e7901 100644 --- a/docs/dd/dee/box__definitions_8cc_source.html +++ b/docs/dd/dee/box__definitions_8cc_source.html @@ -223,2492 +223,2512 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    134  buffer->ReadWriteUInt32(&minor_version));
    135  size_t num_brands;
    136  if (buffer->Reading()) {
    -
    137  num_brands = (buffer->Size() - buffer->Pos()) / sizeof(FourCC);
    -
    138  compatible_brands.resize(num_brands);
    -
    139  } else {
    -
    140  num_brands = compatible_brands.size();
    -
    141  }
    -
    142  for (size_t i = 0; i < num_brands; ++i)
    -
    143  RCHECK(buffer->ReadWriteFourCC(&compatible_brands[i]));
    -
    144  return true;
    -
    145 }
    -
    146 
    -
    147 uint32_t FileType::ComputeSizeInternal() {
    -
    148  return HeaderSize() + kFourCCSize + sizeof(minor_version) +
    -
    149  kFourCCSize * compatible_brands.size();
    -
    150 }
    -
    151 
    -
    152 FourCC SegmentType::BoxType() const { return FOURCC_STYP; }
    -
    153 
    -
    154 ProtectionSystemSpecificHeader::ProtectionSystemSpecificHeader() {}
    -
    155 ProtectionSystemSpecificHeader::~ProtectionSystemSpecificHeader() {}
    -
    156 FourCC ProtectionSystemSpecificHeader::BoxType() const { return FOURCC_PSSH; }
    -
    157 
    -
    158 bool ProtectionSystemSpecificHeader::ReadWriteInternal(BoxBuffer* buffer) {
    -
    159  if (!buffer->Reading() && !raw_box.empty()) {
    -
    160  // Write the raw box directly.
    -
    161  buffer->writer()->AppendVector(raw_box);
    -
    162  return true;
    -
    163  }
    -
    164 
    -
    165  uint32_t size = data.size();
    -
    166  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    167  buffer->ReadWriteVector(&system_id, 16) &&
    -
    168  buffer->ReadWriteUInt32(&size) &&
    -
    169  buffer->ReadWriteVector(&data, size));
    -
    170 
    -
    171  if (buffer->Reading()) {
    -
    172  // Copy the entire box, including the header, for passing to EME as
    -
    173  // initData.
    -
    174  DCHECK(raw_box.empty());
    -
    175  BoxReader* reader = buffer->reader();
    -
    176  DCHECK(reader);
    -
    177  raw_box.assign(reader->data(), reader->data() + reader->size());
    -
    178  }
    -
    179  return true;
    -
    180 }
    -
    181 
    -
    182 uint32_t ProtectionSystemSpecificHeader::ComputeSizeInternal() {
    -
    183  if (!raw_box.empty()) {
    -
    184  return raw_box.size();
    -
    185  } else {
    -
    186  return HeaderSize() + system_id.size() + sizeof(uint32_t) + data.size();
    -
    187  }
    -
    188 }
    -
    189 
    -
    190 SampleAuxiliaryInformationOffset::SampleAuxiliaryInformationOffset() {}
    -
    191 SampleAuxiliaryInformationOffset::~SampleAuxiliaryInformationOffset() {}
    -
    192 FourCC SampleAuxiliaryInformationOffset::BoxType() const { return FOURCC_SAIO; }
    -
    193 
    -
    194 bool SampleAuxiliaryInformationOffset::ReadWriteInternal(BoxBuffer* buffer) {
    -
    195  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    196  if (flags & 1)
    -
    197  RCHECK(buffer->IgnoreBytes(8)); // aux_info_type and parameter.
    -
    198 
    -
    199  uint32_t count = offsets.size();
    -
    200  RCHECK(buffer->ReadWriteUInt32(&count));
    -
    201  offsets.resize(count);
    -
    202 
    -
    203  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    -
    204  for (uint32_t i = 0; i < count; ++i)
    -
    205  RCHECK(buffer->ReadWriteUInt64NBytes(&offsets[i], num_bytes));
    -
    206  return true;
    -
    207 }
    -
    208 
    -
    209 uint32_t SampleAuxiliaryInformationOffset::ComputeSizeInternal() {
    -
    210  // This box is optional. Skip it if it is empty.
    -
    211  if (offsets.size() == 0)
    -
    212  return 0;
    -
    213  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    -
    214  return HeaderSize() + sizeof(uint32_t) + num_bytes * offsets.size();
    -
    215 }
    -
    216 
    -
    217 SampleAuxiliaryInformationSize::SampleAuxiliaryInformationSize()
    -
    218  : default_sample_info_size(0), sample_count(0) {}
    -
    219 SampleAuxiliaryInformationSize::~SampleAuxiliaryInformationSize() {}
    -
    220 FourCC SampleAuxiliaryInformationSize::BoxType() const { return FOURCC_SAIZ; }
    -
    221 
    -
    222 bool SampleAuxiliaryInformationSize::ReadWriteInternal(BoxBuffer* buffer) {
    -
    223  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    224  if (flags & 1)
    -
    225  RCHECK(buffer->IgnoreBytes(8));
    -
    226 
    -
    227  RCHECK(buffer->ReadWriteUInt8(&default_sample_info_size) &&
    -
    228  buffer->ReadWriteUInt32(&sample_count));
    -
    229  if (default_sample_info_size == 0)
    -
    230  RCHECK(buffer->ReadWriteVector(&sample_info_sizes, sample_count));
    -
    231  return true;
    -
    232 }
    -
    233 
    -
    234 uint32_t SampleAuxiliaryInformationSize::ComputeSizeInternal() {
    -
    235  // This box is optional. Skip it if it is empty.
    -
    236  if (sample_count == 0)
    -
    237  return 0;
    -
    238  return HeaderSize() + sizeof(default_sample_info_size) +
    -
    239  sizeof(sample_count) +
    -
    240  (default_sample_info_size == 0 ? sample_info_sizes.size() : 0);
    -
    241 }
    -
    242 
    -
    243 SampleEncryptionEntry::SampleEncryptionEntry() {}
    -
    244 SampleEncryptionEntry::~SampleEncryptionEntry() {}
    -
    245 
    -
    246 bool SampleEncryptionEntry::ReadWrite(uint8_t iv_size,
    -
    247  bool has_subsamples,
    -
    248  BoxBuffer* buffer) {
    -
    249  DCHECK(IsIvSizeValid(iv_size));
    -
    250  DCHECK(buffer);
    -
    251 
    -
    252  RCHECK(buffer->ReadWriteVector(&initialization_vector, iv_size));
    -
    253 
    -
    254  if (!has_subsamples) {
    -
    255  subsamples.clear();
    -
    256  return true;
    -
    257  }
    -
    258 
    -
    259  uint16_t subsample_count = subsamples.size();
    -
    260  RCHECK(buffer->ReadWriteUInt16(&subsample_count));
    -
    261  RCHECK(subsample_count > 0);
    -
    262  subsamples.resize(subsample_count);
    -
    263  for (auto& subsample : subsamples) {
    -
    264  RCHECK(buffer->ReadWriteUInt16(&subsample.clear_bytes) &&
    -
    265  buffer->ReadWriteUInt32(&subsample.cipher_bytes));
    -
    266  }
    -
    267  return true;
    -
    268 }
    -
    269 
    - -
    271  bool has_subsamples,
    -
    272  BufferReader* reader) {
    -
    273  DCHECK(IsIvSizeValid(iv_size));
    -
    274  DCHECK(reader);
    -
    275 
    -
    276  initialization_vector.resize(iv_size);
    -
    277  RCHECK(reader->ReadToVector(&initialization_vector, iv_size));
    -
    278 
    -
    279  if (!has_subsamples) {
    -
    280  subsamples.clear();
    -
    281  return true;
    -
    282  }
    -
    283 
    -
    284  uint16_t subsample_count;
    -
    285  RCHECK(reader->Read2(&subsample_count));
    -
    286  RCHECK(subsample_count > 0);
    -
    287  subsamples.resize(subsample_count);
    -
    288  for (auto& subsample : subsamples) {
    -
    289  RCHECK(reader->Read2(&subsample.clear_bytes) &&
    -
    290  reader->Read4(&subsample.cipher_bytes));
    -
    291  }
    -
    292  return true;
    -
    293 }
    -
    294 
    - -
    296  const uint32_t subsample_entry_size = sizeof(uint16_t) + sizeof(uint32_t);
    -
    297  const uint16_t subsample_count = subsamples.size();
    -
    298  return initialization_vector.size() +
    -
    299  (subsample_count > 0 ? (sizeof(subsample_count) +
    -
    300  subsample_entry_size * subsample_count)
    -
    301  : 0);
    -
    302 }
    -
    303 
    - -
    305  uint32_t size = 0;
    -
    306  for (uint32_t i = 0; i < subsamples.size(); ++i)
    -
    307  size += subsamples[i].clear_bytes + subsamples[i].cipher_bytes;
    -
    308  return size;
    -
    309 }
    -
    310 
    -
    311 SampleEncryption::SampleEncryption() : iv_size(0) {}
    -
    312 SampleEncryption::~SampleEncryption() {}
    -
    313 FourCC SampleEncryption::BoxType() const { return FOURCC_SENC; }
    -
    314 
    -
    315 bool SampleEncryption::ReadWriteInternal(BoxBuffer* buffer) {
    -
    316  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    317 
    -
    318  // If we don't know |iv_size|, store sample encryption data to parse later
    -
    319  // after we know iv_size.
    -
    320  if (buffer->Reading() && iv_size == 0) {
    -
    321  RCHECK(buffer->ReadWriteVector(&sample_encryption_data,
    -
    322  buffer->Size() - buffer->Pos()));
    -
    323  return true;
    -
    324  }
    -
    325 
    -
    326  if (!IsIvSizeValid(iv_size)) {
    -
    327  LOG(ERROR) << "IV_size can only be 8 or 16, but seeing " << iv_size;
    -
    328  return false;
    -
    329  }
    -
    330 
    -
    331  uint32_t sample_count = sample_encryption_entries.size();
    -
    332  RCHECK(buffer->ReadWriteUInt32(&sample_count));
    -
    333 
    -
    334  sample_encryption_entries.resize(sample_count);
    -
    335  for (auto& sample_encryption_entry : sample_encryption_entries) {
    -
    336  RCHECK(sample_encryption_entry.ReadWrite(
    -
    337  iv_size, flags & kUseSubsampleEncryption, buffer));
    -
    338  }
    -
    339  return true;
    -
    340 }
    -
    341 
    -
    342 uint32_t SampleEncryption::ComputeSizeInternal() {
    -
    343  const uint32_t sample_count = sample_encryption_entries.size();
    -
    344  if (sample_count == 0) {
    -
    345  // Sample encryption box is optional. Skip it if it is empty.
    -
    346  return 0;
    -
    347  }
    -
    348 
    -
    349  DCHECK(IsIvSizeValid(iv_size));
    -
    350  uint32_t box_size = HeaderSize() + sizeof(sample_count);
    -
    351  if (flags & kUseSubsampleEncryption) {
    -
    352  for (const SampleEncryptionEntry& sample_encryption_entry :
    -
    353  sample_encryption_entries) {
    -
    354  box_size += sample_encryption_entry.ComputeSize();
    -
    355  }
    -
    356  } else {
    -
    357  box_size += sample_count * iv_size;
    -
    358  }
    -
    359  return box_size;
    -
    360 }
    -
    361 
    - -
    363  size_t iv_size,
    -
    364  std::vector<SampleEncryptionEntry>* sample_encryption_entries) const {
    -
    365  DCHECK(IsIvSizeValid(iv_size));
    -
    366 
    -
    367  BufferReader reader(vector_as_array(&sample_encryption_data),
    -
    368  sample_encryption_data.size());
    -
    369  uint32_t sample_count = 0;
    -
    370  RCHECK(reader.Read4(&sample_count));
    -
    371 
    -
    372  sample_encryption_entries->resize(sample_count);
    -
    373  for (auto& sample_encryption_entry : *sample_encryption_entries) {
    -
    374  RCHECK(sample_encryption_entry.ParseFromBuffer(
    -
    375  iv_size, flags & kUseSubsampleEncryption, &reader));
    -
    376  }
    -
    377  return true;
    -
    378 }
    -
    379 
    -
    380 OriginalFormat::OriginalFormat() : format(FOURCC_NULL) {}
    -
    381 OriginalFormat::~OriginalFormat() {}
    -
    382 FourCC OriginalFormat::BoxType() const { return FOURCC_FRMA; }
    -
    383 
    -
    384 bool OriginalFormat::ReadWriteInternal(BoxBuffer* buffer) {
    -
    385  return ReadWriteHeaderInternal(buffer) && buffer->ReadWriteFourCC(&format);
    -
    386 }
    -
    387 
    -
    388 uint32_t OriginalFormat::ComputeSizeInternal() {
    -
    389  return HeaderSize() + kFourCCSize;
    -
    390 }
    -
    391 
    -
    392 SchemeType::SchemeType() : type(FOURCC_NULL), version(0) {}
    -
    393 SchemeType::~SchemeType() {}
    -
    394 FourCC SchemeType::BoxType() const { return FOURCC_SCHM; }
    -
    395 
    -
    396 bool SchemeType::ReadWriteInternal(BoxBuffer* buffer) {
    -
    397  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    398  buffer->ReadWriteFourCC(&type) &&
    -
    399  buffer->ReadWriteUInt32(&version));
    -
    400  return true;
    -
    401 }
    -
    402 
    -
    403 uint32_t SchemeType::ComputeSizeInternal() {
    -
    404  return HeaderSize() + kFourCCSize + sizeof(version);
    -
    405 }
    -
    406 
    -
    407 TrackEncryption::TrackEncryption()
    -
    408  : is_encrypted(false), default_iv_size(0), default_kid(16, 0) {}
    -
    409 TrackEncryption::~TrackEncryption() {}
    -
    410 FourCC TrackEncryption::BoxType() const { return FOURCC_TENC; }
    -
    411 
    -
    412 bool TrackEncryption::ReadWriteInternal(BoxBuffer* buffer) {
    -
    413  if (!buffer->Reading()) {
    -
    414  if (default_kid.size() != kCencKeyIdSize) {
    -
    415  LOG(WARNING) << "CENC defines key id length of " << kCencKeyIdSize
    -
    416  << " bytes; got " << default_kid.size()
    -
    417  << ". Resized accordingly.";
    -
    418  default_kid.resize(kCencKeyIdSize);
    -
    419  }
    -
    420  }
    -
    421 
    -
    422  uint8_t flag = is_encrypted ? 1 : 0;
    -
    423  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    424  buffer->IgnoreBytes(2) && // reserved.
    -
    425  buffer->ReadWriteUInt8(&flag) &&
    -
    426  buffer->ReadWriteUInt8(&default_iv_size) &&
    -
    427  buffer->ReadWriteVector(&default_kid, kCencKeyIdSize));
    -
    428  if (buffer->Reading()) {
    -
    429  is_encrypted = (flag != 0);
    -
    430  if (is_encrypted) {
    -
    431  RCHECK(default_iv_size == 8 || default_iv_size == 16);
    -
    432  } else {
    -
    433  RCHECK(default_iv_size == 0);
    -
    434  }
    -
    435  }
    -
    436  return true;
    -
    437 }
    -
    438 
    -
    439 uint32_t TrackEncryption::ComputeSizeInternal() {
    -
    440  return HeaderSize() + sizeof(uint32_t) + kCencKeyIdSize;
    -
    441 }
    -
    442 
    -
    443 SchemeInfo::SchemeInfo() {}
    -
    444 SchemeInfo::~SchemeInfo() {}
    -
    445 FourCC SchemeInfo::BoxType() const { return FOURCC_SCHI; }
    -
    446 
    -
    447 bool SchemeInfo::ReadWriteInternal(BoxBuffer* buffer) {
    -
    448  RCHECK(ReadWriteHeaderInternal(buffer) && buffer->PrepareChildren() &&
    -
    449  buffer->ReadWriteChild(&track_encryption));
    -
    450  return true;
    -
    451 }
    -
    452 
    -
    453 uint32_t SchemeInfo::ComputeSizeInternal() {
    -
    454  return HeaderSize() + track_encryption.ComputeSize();
    -
    455 }
    -
    456 
    -
    457 ProtectionSchemeInfo::ProtectionSchemeInfo() {}
    -
    458 ProtectionSchemeInfo::~ProtectionSchemeInfo() {}
    -
    459 FourCC ProtectionSchemeInfo::BoxType() const { return FOURCC_SINF; }
    -
    460 
    -
    461 bool ProtectionSchemeInfo::ReadWriteInternal(BoxBuffer* buffer) {
    -
    462  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    463  buffer->PrepareChildren() &&
    -
    464  buffer->ReadWriteChild(&format) &&
    -
    465  buffer->ReadWriteChild(&type));
    -
    466  if (type.type == FOURCC_CENC)
    -
    467  RCHECK(buffer->ReadWriteChild(&info));
    -
    468  // Other protection schemes are silently ignored. Since the protection scheme
    -
    469  // type can't be determined until this box is opened, we return 'true' for
    -
    470  // non-CENC protection scheme types. It is the parent box's responsibility to
    -
    471  // ensure that this scheme type is a supported one.
    -
    472  return true;
    -
    473 }
    -
    474 
    -
    475 uint32_t ProtectionSchemeInfo::ComputeSizeInternal() {
    -
    476  // Skip sinf box if it is not initialized.
    -
    477  if (format.format == FOURCC_NULL)
    -
    478  return 0;
    -
    479  return HeaderSize() + format.ComputeSize() + type.ComputeSize() +
    -
    480  info.ComputeSize();
    -
    481 }
    -
    482 
    -
    483 MovieHeader::MovieHeader()
    -
    484  : creation_time(0),
    -
    485  modification_time(0),
    -
    486  timescale(0),
    -
    487  duration(0),
    -
    488  rate(1 << 16),
    -
    489  volume(1 << 8),
    -
    490  next_track_id(0) {}
    -
    491 MovieHeader::~MovieHeader() {}
    -
    492 FourCC MovieHeader::BoxType() const { return FOURCC_MVHD; }
    -
    493 
    -
    494 bool MovieHeader::ReadWriteInternal(BoxBuffer* buffer) {
    -
    495  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    496 
    -
    497  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    -
    498  RCHECK(buffer->ReadWriteUInt64NBytes(&creation_time, num_bytes) &&
    -
    499  buffer->ReadWriteUInt64NBytes(&modification_time, num_bytes) &&
    -
    500  buffer->ReadWriteUInt32(&timescale) &&
    -
    501  buffer->ReadWriteUInt64NBytes(&duration, num_bytes));
    -
    502 
    -
    503  std::vector<uint8_t> matrix(kUnityMatrix,
    -
    504  kUnityMatrix + arraysize(kUnityMatrix));
    -
    505  RCHECK(buffer->ReadWriteInt32(&rate) &&
    -
    506  buffer->ReadWriteInt16(&volume) &&
    -
    507  buffer->IgnoreBytes(10) && // reserved
    -
    508  buffer->ReadWriteVector(&matrix, matrix.size()) &&
    -
    509  buffer->IgnoreBytes(24) && // predefined zero
    -
    510  buffer->ReadWriteUInt32(&next_track_id));
    -
    511  return true;
    -
    512 }
    -
    513 
    -
    514 uint32_t MovieHeader::ComputeSizeInternal() {
    -
    515  version = IsFitIn32Bits(creation_time, modification_time, duration) ? 0 : 1;
    -
    516  return HeaderSize() + sizeof(uint32_t) * (1 + version) * 3 +
    -
    517  sizeof(timescale) + sizeof(rate) + sizeof(volume) +
    -
    518  sizeof(next_track_id) + sizeof(kUnityMatrix) + 10 +
    -
    519  24; // 10 bytes reserved, 24 bytes predefined.
    -
    520 }
    -
    521 
    -
    522 TrackHeader::TrackHeader()
    -
    523  : creation_time(0),
    -
    524  modification_time(0),
    -
    525  track_id(0),
    -
    526  duration(0),
    -
    527  layer(0),
    -
    528  alternate_group(0),
    -
    529  volume(-1),
    -
    530  width(0),
    -
    531  height(0) {
    -
    532  flags = kTrackEnabled | kTrackInMovie;
    -
    533 }
    -
    534 TrackHeader::~TrackHeader() {}
    -
    535 FourCC TrackHeader::BoxType() const { return FOURCC_TKHD; }
    -
    536 
    -
    537 bool TrackHeader::ReadWriteInternal(BoxBuffer* buffer) {
    -
    538  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    539 
    -
    540  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    -
    541  RCHECK(buffer->ReadWriteUInt64NBytes(&creation_time, num_bytes) &&
    -
    542  buffer->ReadWriteUInt64NBytes(&modification_time, num_bytes) &&
    -
    543  buffer->ReadWriteUInt32(&track_id) &&
    -
    544  buffer->IgnoreBytes(4) && // reserved
    -
    545  buffer->ReadWriteUInt64NBytes(&duration, num_bytes));
    -
    546 
    -
    547  if (!buffer->Reading()) {
    -
    548  // Set default value for volume, if track is audio, 0x100 else 0.
    -
    549  if (volume == -1)
    -
    550  volume = (width != 0 && height != 0) ? 0 : 0x100;
    -
    551  }
    -
    552  std::vector<uint8_t> matrix(kUnityMatrix,
    -
    553  kUnityMatrix + arraysize(kUnityMatrix));
    -
    554  RCHECK(buffer->IgnoreBytes(8) && // reserved
    -
    555  buffer->ReadWriteInt16(&layer) &&
    -
    556  buffer->ReadWriteInt16(&alternate_group) &&
    -
    557  buffer->ReadWriteInt16(&volume) &&
    -
    558  buffer->IgnoreBytes(2) && // reserved
    -
    559  buffer->ReadWriteVector(&matrix, matrix.size()) &&
    -
    560  buffer->ReadWriteUInt32(&width) &&
    -
    561  buffer->ReadWriteUInt32(&height));
    -
    562  return true;
    -
    563 }
    -
    564 
    -
    565 uint32_t TrackHeader::ComputeSizeInternal() {
    -
    566  version = IsFitIn32Bits(creation_time, modification_time, duration) ? 0 : 1;
    -
    567  return HeaderSize() + sizeof(track_id) +
    -
    568  sizeof(uint32_t) * (1 + version) * 3 + sizeof(layer) +
    -
    569  sizeof(alternate_group) + sizeof(volume) + sizeof(width) +
    -
    570  sizeof(height) + sizeof(kUnityMatrix) + 14; // 14 bytes reserved.
    -
    571 }
    -
    572 
    -
    573 SampleDescription::SampleDescription() : type(kInvalid) {}
    -
    574 SampleDescription::~SampleDescription() {}
    -
    575 FourCC SampleDescription::BoxType() const { return FOURCC_STSD; }
    -
    576 
    -
    577 bool SampleDescription::ReadWriteInternal(BoxBuffer* buffer) {
    -
    578  uint32_t count = 0;
    -
    579  switch (type) {
    -
    580  case kVideo:
    -
    581  count = video_entries.size();
    -
    582  break;
    -
    583  case kAudio:
    -
    584  count = audio_entries.size();
    -
    585  break;
    -
    586  case kText:
    -
    587  count = wvtt_entries.size();
    -
    588  break;
    -
    589  default:
    -
    590  NOTIMPLEMENTED() << "SampleDecryption type " << type
    -
    591  << " is not handled. Skipping.";
    -
    592  }
    -
    593  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    594  buffer->ReadWriteUInt32(&count));
    -
    595 
    -
    596  if (buffer->Reading()) {
    -
    597  BoxReader* reader = buffer->reader();
    -
    598  DCHECK(reader);
    -
    599  video_entries.clear();
    -
    600  audio_entries.clear();
    -
    601  // Note: this value is preset before scanning begins. See comments in the
    -
    602  // Parse(Media*) function.
    -
    603  if (type == kVideo) {
    -
    604  RCHECK(reader->ReadAllChildren(&video_entries));
    -
    605  RCHECK(video_entries.size() == count);
    -
    606  } else if (type == kAudio) {
    -
    607  RCHECK(reader->ReadAllChildren(&audio_entries));
    -
    608  RCHECK(audio_entries.size() == count);
    -
    609  } else if (type == kText) {
    -
    610  RCHECK(reader->ReadAllChildren(&wvtt_entries));
    -
    611  RCHECK(wvtt_entries.size() == count);
    -
    612  }
    -
    613  } else {
    -
    614  DCHECK_LT(0u, count);
    -
    615  if (type == kVideo) {
    -
    616  for (uint32_t i = 0; i < count; ++i)
    -
    617  RCHECK(buffer->ReadWriteChild(&video_entries[i]));
    -
    618  } else if (type == kAudio) {
    -
    619  for (uint32_t i = 0; i < count; ++i)
    -
    620  RCHECK(buffer->ReadWriteChild(&audio_entries[i]));
    -
    621  } else if (type == kText) {
    -
    622  for (uint32_t i = 0; i < count; ++i)
    -
    623  RCHECK(buffer->ReadWriteChild(&wvtt_entries[i]));
    -
    624  } else {
    -
    625  NOTIMPLEMENTED();
    -
    626  }
    -
    627  }
    -
    628  return true;
    -
    629 }
    -
    630 
    -
    631 uint32_t SampleDescription::ComputeSizeInternal() {
    -
    632  uint32_t box_size = HeaderSize() + sizeof(uint32_t);
    -
    633  if (type == kVideo) {
    -
    634  for (uint32_t i = 0; i < video_entries.size(); ++i)
    -
    635  box_size += video_entries[i].ComputeSize();
    -
    636  } else if (type == kAudio) {
    -
    637  for (uint32_t i = 0; i < audio_entries.size(); ++i)
    -
    638  box_size += audio_entries[i].ComputeSize();
    -
    639  }
    -
    640  return box_size;
    -
    641 }
    -
    642 
    -
    643 DecodingTimeToSample::DecodingTimeToSample() {}
    -
    644 DecodingTimeToSample::~DecodingTimeToSample() {}
    -
    645 FourCC DecodingTimeToSample::BoxType() const { return FOURCC_STTS; }
    -
    646 
    -
    647 bool DecodingTimeToSample::ReadWriteInternal(BoxBuffer* buffer) {
    -
    648  uint32_t count = decoding_time.size();
    -
    649  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    650  buffer->ReadWriteUInt32(&count));
    -
    651 
    -
    652  decoding_time.resize(count);
    -
    653  for (uint32_t i = 0; i < count; ++i) {
    -
    654  RCHECK(buffer->ReadWriteUInt32(&decoding_time[i].sample_count) &&
    -
    655  buffer->ReadWriteUInt32(&decoding_time[i].sample_delta));
    -
    656  }
    -
    657  return true;
    -
    658 }
    -
    659 
    -
    660 uint32_t DecodingTimeToSample::ComputeSizeInternal() {
    -
    661  return HeaderSize() + sizeof(uint32_t) +
    -
    662  sizeof(DecodingTime) * decoding_time.size();
    -
    663 }
    -
    664 
    -
    665 CompositionTimeToSample::CompositionTimeToSample() {}
    -
    666 CompositionTimeToSample::~CompositionTimeToSample() {}
    -
    667 FourCC CompositionTimeToSample::BoxType() const { return FOURCC_CTTS; }
    -
    668 
    -
    669 bool CompositionTimeToSample::ReadWriteInternal(BoxBuffer* buffer) {
    -
    670  uint32_t count = composition_offset.size();
    -
    671  if (!buffer->Reading()) {
    -
    672  // Determine whether version 0 or version 1 should be used.
    -
    673  // Use version 0 if possible, use version 1 if there is a negative
    -
    674  // sample_offset value.
    -
    675  version = 0;
    -
    676  for (uint32_t i = 0; i < count; ++i) {
    -
    677  if (composition_offset[i].sample_offset < 0) {
    -
    678  version = 1;
    -
    679  break;
    -
    680  }
    -
    681  }
    -
    682  }
    -
    683 
    -
    684  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    685  buffer->ReadWriteUInt32(&count));
    -
    686 
    -
    687  composition_offset.resize(count);
    -
    688  for (uint32_t i = 0; i < count; ++i) {
    -
    689  RCHECK(buffer->ReadWriteUInt32(&composition_offset[i].sample_count));
    -
    690 
    -
    691  if (version == 0) {
    -
    692  uint32_t sample_offset = composition_offset[i].sample_offset;
    -
    693  RCHECK(buffer->ReadWriteUInt32(&sample_offset));
    -
    694  composition_offset[i].sample_offset = sample_offset;
    -
    695  } else {
    -
    696  int32_t sample_offset = composition_offset[i].sample_offset;
    -
    697  RCHECK(buffer->ReadWriteInt32(&sample_offset));
    -
    698  composition_offset[i].sample_offset = sample_offset;
    -
    699  }
    -
    700  }
    -
    701  return true;
    -
    702 }
    -
    703 
    -
    704 uint32_t CompositionTimeToSample::ComputeSizeInternal() {
    -
    705  // This box is optional. Skip it if it is empty.
    -
    706  if (composition_offset.empty())
    -
    707  return 0;
    -
    708  // Structure CompositionOffset contains |sample_offset| (uint32_t) and
    -
    709  // |sample_offset| (int64_t). The actual size of |sample_offset| is
    -
    710  // 4 bytes (uint32_t for version 0 and int32_t for version 1).
    -
    711  const uint32_t kCompositionOffsetSize = sizeof(uint32_t) * 2;
    -
    712  return HeaderSize() + sizeof(uint32_t) +
    -
    713  kCompositionOffsetSize * composition_offset.size();
    -
    714 }
    -
    715 
    -
    716 SampleToChunk::SampleToChunk() {}
    -
    717 SampleToChunk::~SampleToChunk() {}
    -
    718 FourCC SampleToChunk::BoxType() const { return FOURCC_STSC; }
    -
    719 
    -
    720 bool SampleToChunk::ReadWriteInternal(BoxBuffer* buffer) {
    -
    721  uint32_t count = chunk_info.size();
    -
    722  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    723  buffer->ReadWriteUInt32(&count));
    -
    724 
    -
    725  chunk_info.resize(count);
    -
    726  for (uint32_t i = 0; i < count; ++i) {
    -
    727  RCHECK(buffer->ReadWriteUInt32(&chunk_info[i].first_chunk) &&
    -
    728  buffer->ReadWriteUInt32(&chunk_info[i].samples_per_chunk) &&
    -
    729  buffer->ReadWriteUInt32(&chunk_info[i].sample_description_index));
    -
    730  // first_chunk values are always increasing.
    -
    731  RCHECK(i == 0 ? chunk_info[i].first_chunk == 1
    -
    732  : chunk_info[i].first_chunk > chunk_info[i - 1].first_chunk);
    -
    733  }
    -
    734  return true;
    -
    735 }
    -
    736 
    -
    737 uint32_t SampleToChunk::ComputeSizeInternal() {
    -
    738  return HeaderSize() + sizeof(uint32_t) +
    -
    739  sizeof(ChunkInfo) * chunk_info.size();
    -
    740 }
    -
    741 
    -
    742 SampleSize::SampleSize() : sample_size(0), sample_count(0) {}
    -
    743 SampleSize::~SampleSize() {}
    -
    744 FourCC SampleSize::BoxType() const { return FOURCC_STSZ; }
    -
    745 
    -
    746 bool SampleSize::ReadWriteInternal(BoxBuffer* buffer) {
    -
    747  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    748  buffer->ReadWriteUInt32(&sample_size) &&
    -
    749  buffer->ReadWriteUInt32(&sample_count));
    -
    750 
    -
    751  if (sample_size == 0) {
    -
    752  if (buffer->Reading())
    -
    753  sizes.resize(sample_count);
    -
    754  else
    -
    755  DCHECK(sample_count == sizes.size());
    -
    756  for (uint32_t i = 0; i < sample_count; ++i)
    -
    757  RCHECK(buffer->ReadWriteUInt32(&sizes[i]));
    -
    758  }
    -
    759  return true;
    -
    760 }
    -
    761 
    -
    762 uint32_t SampleSize::ComputeSizeInternal() {
    -
    763  return HeaderSize() + sizeof(sample_size) + sizeof(sample_count) +
    -
    764  (sample_size == 0 ? sizeof(uint32_t) * sizes.size() : 0);
    -
    765 }
    -
    766 
    -
    767 CompactSampleSize::CompactSampleSize() : field_size(0) {}
    -
    768 CompactSampleSize::~CompactSampleSize() {}
    -
    769 FourCC CompactSampleSize::BoxType() const { return FOURCC_STZ2; }
    -
    770 
    -
    771 bool CompactSampleSize::ReadWriteInternal(BoxBuffer* buffer) {
    -
    772  uint32_t sample_count = sizes.size();
    -
    773  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    774  buffer->IgnoreBytes(3) &&
    -
    775  buffer->ReadWriteUInt8(&field_size) &&
    -
    776  buffer->ReadWriteUInt32(&sample_count));
    -
    777 
    -
    778  // Reserve one more entry if field size is 4 bits.
    -
    779  sizes.resize(sample_count + (field_size == 4 ? 1 : 0), 0);
    -
    780  switch (field_size) {
    -
    781  case 4:
    -
    782  for (uint32_t i = 0; i < sample_count; i += 2) {
    -
    783  if (buffer->Reading()) {
    -
    784  uint8_t size = 0;
    -
    785  RCHECK(buffer->ReadWriteUInt8(&size));
    -
    786  sizes[i] = size >> 4;
    -
    787  sizes[i + 1] = size & 0x0F;
    -
    788  } else {
    -
    789  DCHECK_LT(sizes[i], 16u);
    -
    790  DCHECK_LT(sizes[i + 1], 16u);
    -
    791  uint8_t size = (sizes[i] << 4) | sizes[i + 1];
    -
    792  RCHECK(buffer->ReadWriteUInt8(&size));
    -
    793  }
    -
    794  }
    -
    795  break;
    -
    796  case 8:
    -
    797  for (uint32_t i = 0; i < sample_count; ++i) {
    -
    798  uint8_t size = sizes[i];
    -
    799  RCHECK(buffer->ReadWriteUInt8(&size));
    -
    800  sizes[i] = size;
    -
    801  }
    -
    802  break;
    -
    803  case 16:
    -
    804  for (uint32_t i = 0; i < sample_count; ++i) {
    -
    805  uint16_t size = sizes[i];
    -
    806  RCHECK(buffer->ReadWriteUInt16(&size));
    -
    807  sizes[i] = size;
    -
    808  }
    -
    809  break;
    -
    810  default:
    -
    811  RCHECK(false);
    -
    812  }
    -
    813  sizes.resize(sample_count);
    -
    814  return true;
    -
    815 }
    -
    816 
    -
    817 uint32_t CompactSampleSize::ComputeSizeInternal() {
    -
    818  return HeaderSize() + sizeof(uint32_t) + sizeof(uint32_t) +
    -
    819  (field_size * sizes.size() + 7) / 8;
    -
    820 }
    -
    821 
    -
    822 ChunkOffset::ChunkOffset() {}
    -
    823 ChunkOffset::~ChunkOffset() {}
    -
    824 FourCC ChunkOffset::BoxType() const { return FOURCC_STCO; }
    -
    825 
    -
    826 bool ChunkOffset::ReadWriteInternal(BoxBuffer* buffer) {
    -
    827  uint32_t count = offsets.size();
    -
    828  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    829  buffer->ReadWriteUInt32(&count));
    -
    830 
    -
    831  offsets.resize(count);
    -
    832  for (uint32_t i = 0; i < count; ++i)
    -
    833  RCHECK(buffer->ReadWriteUInt64NBytes(&offsets[i], sizeof(uint32_t)));
    -
    834  return true;
    -
    835 }
    -
    836 
    -
    837 uint32_t ChunkOffset::ComputeSizeInternal() {
    -
    838  return HeaderSize() + sizeof(uint32_t) + sizeof(uint32_t) * offsets.size();
    -
    839 }
    -
    840 
    -
    841 ChunkLargeOffset::ChunkLargeOffset() {}
    -
    842 ChunkLargeOffset::~ChunkLargeOffset() {}
    -
    843 FourCC ChunkLargeOffset::BoxType() const { return FOURCC_CO64; }
    -
    844 
    -
    845 bool ChunkLargeOffset::ReadWriteInternal(BoxBuffer* buffer) {
    -
    846  uint32_t count = offsets.size();
    -
    847 
    -
    848  if (!buffer->Reading()) {
    -
    849  // Switch to ChunkOffset box if it is able to fit in 32 bits offset.
    -
    850  if (count == 0 || IsFitIn32Bits(offsets[count - 1])) {
    -
    851  ChunkOffset stco;
    -
    852  stco.offsets.swap(offsets);
    -
    853  DCHECK(buffer->writer());
    -
    854  stco.Write(buffer->writer());
    -
    855  stco.offsets.swap(offsets);
    -
    856  return true;
    -
    857  }
    -
    858  }
    -
    859 
    -
    860  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    861  buffer->ReadWriteUInt32(&count));
    -
    862 
    -
    863  offsets.resize(count);
    -
    864  for (uint32_t i = 0; i < count; ++i)
    -
    865  RCHECK(buffer->ReadWriteUInt64(&offsets[i]));
    -
    866  return true;
    -
    867 }
    -
    868 
    -
    869 uint32_t ChunkLargeOffset::ComputeSizeInternal() {
    -
    870  uint32_t count = offsets.size();
    -
    871  int use_large_offset =
    -
    872  (count > 0 && !IsFitIn32Bits(offsets[count - 1])) ? 1 : 0;
    -
    873  return HeaderSize() + sizeof(count) +
    -
    874  sizeof(uint32_t) * (1 + use_large_offset) * offsets.size();
    -
    875 }
    -
    876 
    -
    877 SyncSample::SyncSample() {}
    -
    878 SyncSample::~SyncSample() {}
    -
    879 FourCC SyncSample::BoxType() const { return FOURCC_STSS; }
    -
    880 
    -
    881 bool SyncSample::ReadWriteInternal(BoxBuffer* buffer) {
    -
    882  uint32_t count = sample_number.size();
    -
    883  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    884  buffer->ReadWriteUInt32(&count));
    -
    885 
    -
    886  sample_number.resize(count);
    -
    887  for (uint32_t i = 0; i < count; ++i)
    -
    888  RCHECK(buffer->ReadWriteUInt32(&sample_number[i]));
    -
    889  return true;
    -
    890 }
    -
    891 
    -
    892 uint32_t SyncSample::ComputeSizeInternal() {
    -
    893  // Sync sample box is optional. Skip it if it is empty.
    -
    894  if (sample_number.empty())
    -
    895  return 0;
    -
    896  return HeaderSize() + sizeof(uint32_t) +
    -
    897  sizeof(uint32_t) * sample_number.size();
    -
    898 }
    -
    899 
    -
    900 SampleTable::SampleTable() {}
    -
    901 SampleTable::~SampleTable() {}
    -
    902 FourCC SampleTable::BoxType() const { return FOURCC_STBL; }
    -
    903 
    -
    904 bool SampleTable::ReadWriteInternal(BoxBuffer* buffer) {
    -
    905  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    906  buffer->PrepareChildren() &&
    -
    907  buffer->ReadWriteChild(&description) &&
    -
    908  buffer->ReadWriteChild(&decoding_time_to_sample) &&
    -
    909  buffer->TryReadWriteChild(&composition_time_to_sample) &&
    -
    910  buffer->ReadWriteChild(&sample_to_chunk));
    -
    911 
    -
    912  if (buffer->Reading()) {
    -
    913  BoxReader* reader = buffer->reader();
    -
    914  DCHECK(reader);
    -
    915 
    -
    916  // Either SampleSize or CompactSampleSize must present.
    -
    917  if (reader->ChildExist(&sample_size)) {
    -
    918  RCHECK(reader->ReadChild(&sample_size));
    -
    919  } else {
    -
    920  CompactSampleSize compact_sample_size;
    -
    921  RCHECK(reader->ReadChild(&compact_sample_size));
    -
    922  sample_size.sample_size = 0;
    -
    923  sample_size.sample_count = compact_sample_size.sizes.size();
    -
    924  sample_size.sizes.swap(compact_sample_size.sizes);
    -
    925  }
    -
    926 
    -
    927  // Either ChunkOffset or ChunkLargeOffset must present.
    -
    928  if (reader->ChildExist(&chunk_large_offset)) {
    -
    929  RCHECK(reader->ReadChild(&chunk_large_offset));
    -
    930  } else {
    -
    931  ChunkOffset chunk_offset;
    -
    932  RCHECK(reader->ReadChild(&chunk_offset));
    -
    933  chunk_large_offset.offsets.swap(chunk_offset.offsets);
    -
    934  }
    -
    935  } else {
    -
    936  RCHECK(buffer->ReadWriteChild(&sample_size) &&
    -
    937  buffer->ReadWriteChild(&chunk_large_offset));
    -
    938  }
    -
    939  RCHECK(buffer->TryReadWriteChild(&sync_sample));
    -
    940  return true;
    -
    941 }
    -
    942 
    -
    943 uint32_t SampleTable::ComputeSizeInternal() {
    -
    944  return HeaderSize() + description.ComputeSize() +
    -
    945  decoding_time_to_sample.ComputeSize() +
    -
    946  composition_time_to_sample.ComputeSize() +
    -
    947  sample_to_chunk.ComputeSize() + sample_size.ComputeSize() +
    -
    948  chunk_large_offset.ComputeSize() + sync_sample.ComputeSize();
    -
    949 }
    -
    950 
    -
    951 EditList::EditList() {}
    -
    952 EditList::~EditList() {}
    -
    953 FourCC EditList::BoxType() const { return FOURCC_ELST; }
    -
    954 
    -
    955 bool EditList::ReadWriteInternal(BoxBuffer* buffer) {
    -
    956  uint32_t count = edits.size();
    -
    957  RCHECK(ReadWriteHeaderInternal(buffer) && buffer->ReadWriteUInt32(&count));
    -
    958  edits.resize(count);
    -
    959 
    -
    960  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    -
    961  for (uint32_t i = 0; i < count; ++i) {
    -
    962  RCHECK(
    -
    963  buffer->ReadWriteUInt64NBytes(&edits[i].segment_duration, num_bytes) &&
    -
    964  buffer->ReadWriteInt64NBytes(&edits[i].media_time, num_bytes) &&
    -
    965  buffer->ReadWriteInt16(&edits[i].media_rate_integer) &&
    -
    966  buffer->ReadWriteInt16(&edits[i].media_rate_fraction));
    -
    967  }
    -
    968  return true;
    -
    969 }
    -
    970 
    -
    971 uint32_t EditList::ComputeSizeInternal() {
    -
    972  // EditList box is optional. Skip it if it is empty.
    -
    973  if (edits.empty())
    -
    974  return 0;
    -
    975 
    -
    976  version = 0;
    -
    977  for (uint32_t i = 0; i < edits.size(); ++i) {
    -
    978  if (!IsFitIn32Bits(edits[i].segment_duration, edits[i].media_time)) {
    -
    979  version = 1;
    -
    980  break;
    -
    981  }
    -
    982  }
    -
    983  return HeaderSize() + sizeof(uint32_t) +
    -
    984  (sizeof(uint32_t) * (1 + version) * 2 + sizeof(int16_t) * 2) *
    -
    985  edits.size();
    -
    986 }
    -
    987 
    -
    988 Edit::Edit() {}
    -
    989 Edit::~Edit() {}
    -
    990 FourCC Edit::BoxType() const { return FOURCC_EDTS; }
    -
    991 
    -
    992 bool Edit::ReadWriteInternal(BoxBuffer* buffer) {
    -
    993  return ReadWriteHeaderInternal(buffer) &&
    -
    994  buffer->PrepareChildren() &&
    -
    995  buffer->ReadWriteChild(&list);
    -
    996 }
    -
    997 
    -
    998 uint32_t Edit::ComputeSizeInternal() {
    -
    999  // Edit box is optional. Skip it if it is empty.
    -
    1000  if (list.edits.empty())
    -
    1001  return 0;
    -
    1002  return HeaderSize() + list.ComputeSize();
    -
    1003 }
    -
    1004 
    -
    1005 HandlerReference::HandlerReference() : handler_type(FOURCC_NULL) {}
    -
    1006 HandlerReference::~HandlerReference() {}
    -
    1007 FourCC HandlerReference::BoxType() const { return FOURCC_HDLR; }
    -
    1008 
    -
    1009 bool HandlerReference::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1010  std::vector<uint8_t> handler_name;
    -
    1011  if (!buffer->Reading()) {
    -
    1012  switch (handler_type) {
    -
    1013  case FOURCC_VIDE:
    -
    1014  handler_name.assign(kVideoHandlerName,
    -
    1015  kVideoHandlerName + arraysize(kVideoHandlerName));
    -
    1016  break;
    -
    1017  case FOURCC_SOUN:
    -
    1018  handler_name.assign(kAudioHandlerName,
    -
    1019  kAudioHandlerName + arraysize(kAudioHandlerName));
    -
    1020  break;
    -
    1021  case FOURCC_TEXT:
    -
    1022  handler_name.assign(kTextHandlerName,
    -
    1023  kTextHandlerName + arraysize(kTextHandlerName));
    -
    1024  break;
    -
    1025  case FOURCC_ID32:
    -
    1026  break;
    -
    1027  default:
    -
    1028  NOTIMPLEMENTED();
    -
    1029  return false;
    -
    1030  }
    -
    1031  }
    -
    1032  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1033  buffer->IgnoreBytes(4) && // predefined.
    -
    1034  buffer->ReadWriteFourCC(&handler_type));
    -
    1035  if (!buffer->Reading()) {
    -
    1036  RCHECK(buffer->IgnoreBytes(12) && // reserved.
    -
    1037  buffer->ReadWriteVector(&handler_name, handler_name.size()));
    -
    1038  }
    -
    1039  return true;
    -
    1040 }
    -
    1041 
    -
    1042 uint32_t HandlerReference::ComputeSizeInternal() {
    -
    1043  uint32_t box_size = HeaderSize() + kFourCCSize + 16; // 16 bytes Reserved
    -
    1044  switch (handler_type) {
    -
    1045  case FOURCC_VIDE:
    -
    1046  box_size += sizeof(kVideoHandlerName);
    -
    1047  break;
    -
    1048  case FOURCC_SOUN:
    -
    1049  box_size += sizeof(kAudioHandlerName);
    -
    1050  break;
    -
    1051  case FOURCC_TEXT:
    -
    1052  box_size += sizeof(kTextHandlerName);
    -
    1053  break;
    -
    1054  case FOURCC_ID32:
    -
    1055  break;
    -
    1056  default:
    -
    1057  NOTIMPLEMENTED();
    -
    1058  }
    -
    1059  return box_size;
    -
    1060 }
    -
    1061 
    -
    1062 bool Language::ReadWrite(BoxBuffer* buffer) {
    -
    1063  if (buffer->Reading()) {
    -
    1064  // Read language codes into temp first then use BitReader to read the
    -
    1065  // values. ISO-639-2/T language code: unsigned int(5)[3] language (2 bytes).
    -
    1066  std::vector<uint8_t> temp;
    -
    1067  RCHECK(buffer->ReadWriteVector(&temp, 2));
    -
    1068 
    -
    1069  BitReader bit_reader(&temp[0], 2);
    -
    1070  bit_reader.SkipBits(1);
    -
    1071  char language[3];
    -
    1072  for (int i = 0; i < 3; ++i) {
    -
    1073  CHECK(bit_reader.ReadBits(5, &language[i]));
    -
    1074  language[i] += 0x60;
    -
    1075  }
    -
    1076  code.assign(language, 3);
    -
    1077  } else {
    -
    1078  // Set up default language if it is not set.
    -
    1079  const char kUndefinedLanguage[] = "und";
    -
    1080  if (code.empty())
    -
    1081  code = kUndefinedLanguage;
    -
    1082  DCHECK_EQ(code.size(), 3u);
    -
    1083 
    -
    1084  // Lang format: bit(1) pad, unsigned int(5)[3] language.
    -
    1085  uint16_t lang = 0;
    -
    1086  for (int i = 0; i < 3; ++i)
    -
    1087  lang |= (code[i] - 0x60) << ((2 - i) * 5);
    -
    1088  RCHECK(buffer->ReadWriteUInt16(&lang));
    -
    1089  }
    -
    1090  return true;
    -
    1091 }
    -
    1092 
    -
    1093 uint32_t Language::ComputeSize() const {
    -
    1094  // ISO-639-2/T language code: unsigned int(5)[3] language (2 bytes).
    -
    1095  return 2;
    -
    1096 }
    -
    1097 
    -
    1098 bool PrivFrame::ReadWrite(BoxBuffer* buffer) {
    -
    1099  FourCC fourcc = FOURCC_PRIV;
    -
    1100  RCHECK(buffer->ReadWriteFourCC(&fourcc));
    -
    1101  if (fourcc != FOURCC_PRIV) {
    -
    1102  VLOG(1) << "Skip unrecognized id3 frame during read: "
    -
    1103  << FourCCToString(fourcc);
    -
    1104  return true;
    -
    1105  }
    -
    1106 
    -
    1107  uint32_t frame_size = owner.size() + 1 + value.size();
    -
    1108  // size should be encoded as synchsafe integer, which is not support here.
    -
    1109  // We don't expect frame_size to be larger than 0x7F. Synchsafe integers less
    -
    1110  // than 0x7F is encoded in the same way as normal integer.
    -
    1111  DCHECK_LT(frame_size, 0x7Fu);
    -
    1112  uint16_t flags = 0;
    -
    1113  RCHECK(buffer->ReadWriteUInt32(&frame_size) &&
    -
    1114  buffer->ReadWriteUInt16(&flags));
    -
    1115 
    -
    1116  if (buffer->Reading()) {
    -
    1117  std::string str;
    -
    1118  RCHECK(buffer->ReadWriteString(&str, frame_size));
    -
    1119  // |owner| is null terminated.
    -
    1120  size_t pos = str.find('\0');
    -
    1121  RCHECK(pos < str.size());
    -
    1122  owner = str.substr(0, pos);
    -
    1123  value = str.substr(pos + 1);
    -
    1124  } else {
    -
    1125  uint8_t byte = 0; // Null terminating byte between owner and value.
    -
    1126  RCHECK(buffer->ReadWriteString(&owner, owner.size()) &&
    -
    1127  buffer->ReadWriteUInt8(&byte) &&
    -
    1128  buffer->ReadWriteString(&value, value.size()));
    -
    1129  }
    -
    1130  return true;
    -
    1131 }
    -
    1132 
    -
    1133 uint32_t PrivFrame::ComputeSize() const {
    -
    1134  if (owner.empty() && value.empty())
    -
    1135  return 0;
    -
    1136  const uint32_t kFourCCSize = 4;
    -
    1137  return kFourCCSize + sizeof(uint32_t) + sizeof(uint16_t) + owner.size() + 1 +
    -
    1138  value.size();
    -
    1139 }
    -
    1140 
    -
    1141 ID3v2::ID3v2() {}
    -
    1142 ID3v2::~ID3v2() {}
    -
    1143 
    -
    1144 FourCC ID3v2::BoxType() const { return FOURCC_ID32; }
    -
    1145 
    -
    1146 bool ID3v2::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1147  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1148  language.ReadWrite(buffer));
    -
    1149 
    -
    1150  // Read/Write ID3v2 header
    -
    1151  std::string id3v2_identifier = kID3v2Identifier;
    -
    1152  uint16_t version = kID3v2Version;
    -
    1153  // We only support PrivateFrame in ID3.
    -
    1154  uint32_t data_size = private_frame.ComputeSize();
    -
    1155  // size should be encoded as synchsafe integer, which is not support here.
    -
    1156  // We don't expect data_size to be larger than 0x7F. Synchsafe integers less
    -
    1157  // than 0x7F is encoded in the same way as normal integer.
    -
    1158  DCHECK_LT(data_size, 0x7Fu);
    -
    1159  uint8_t flags = 0;
    -
    1160  RCHECK(buffer->ReadWriteString(&id3v2_identifier, id3v2_identifier.size()) &&
    -
    1161  buffer->ReadWriteUInt16(&version) &&
    -
    1162  buffer->ReadWriteUInt8(&flags) &&
    -
    1163  buffer->ReadWriteUInt32(&data_size));
    -
    1164 
    -
    1165  RCHECK(private_frame.ReadWrite(buffer));
    -
    1166  return true;
    -
    1167 }
    -
    1168 
    -
    1169 uint32_t ID3v2::ComputeSizeInternal() {
    -
    1170  uint32_t private_frame_size = private_frame.ComputeSize();
    -
    1171  // Skip ID3v2 box generation if there is no private frame.
    -
    1172  return private_frame_size == 0 ? 0 : HeaderSize() + language.ComputeSize() +
    -
    1173  kID3v2HeaderSize +
    -
    1174  private_frame_size;
    -
    1175 }
    -
    1176 
    -
    1177 Metadata::Metadata() {}
    -
    1178 Metadata::~Metadata() {}
    -
    1179 
    -
    1180 FourCC Metadata::BoxType() const {
    -
    1181  return FOURCC_META;
    -
    1182 }
    -
    1183 
    -
    1184 bool Metadata::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1185  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1186  buffer->PrepareChildren() &&
    -
    1187  buffer->ReadWriteChild(&handler) &&
    -
    1188  buffer->TryReadWriteChild(&id3v2));
    -
    1189  return true;
    -
    1190 }
    -
    1191 
    -
    1192 uint32_t Metadata::ComputeSizeInternal() {
    -
    1193  uint32_t id3v2_size = id3v2.ComputeSize();
    -
    1194  // Skip metadata box generation if there is no metadata box.
    -
    1195  return id3v2_size == 0 ? 0
    -
    1196  : HeaderSize() + handler.ComputeSize() + id3v2_size;
    -
    1197 }
    -
    1198 
    -
    1199 CodecConfigurationRecord::CodecConfigurationRecord() : box_type(FOURCC_NULL) {}
    -
    1200 CodecConfigurationRecord::~CodecConfigurationRecord() {}
    - -
    1202  // CodecConfigurationRecord should be parsed according to format recovered in
    -
    1203  // VideoSampleEntry. |box_type| is determined dynamically there.
    -
    1204  return box_type;
    -
    1205 }
    -
    1206 
    -
    1207 bool CodecConfigurationRecord::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1208  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    1209  if (buffer->Reading()) {
    -
    1210  RCHECK(buffer->ReadWriteVector(&data, buffer->BytesLeft()));
    -
    1211  } else {
    -
    1212  RCHECK(buffer->ReadWriteVector(&data, data.size()));
    -
    1213  }
    -
    1214  return true;
    -
    1215 }
    -
    1216 
    -
    1217 uint32_t CodecConfigurationRecord::ComputeSizeInternal() {
    -
    1218  if (data.empty())
    -
    1219  return 0;
    -
    1220  return HeaderSize() + data.size();
    -
    1221 }
    -
    1222 
    -
    1223 PixelAspectRatio::PixelAspectRatio() : h_spacing(0), v_spacing(0) {}
    -
    1224 PixelAspectRatio::~PixelAspectRatio() {}
    -
    1225 FourCC PixelAspectRatio::BoxType() const { return FOURCC_PASP; }
    -
    1226 
    -
    1227 bool PixelAspectRatio::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1228  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1229  buffer->ReadWriteUInt32(&h_spacing) &&
    -
    1230  buffer->ReadWriteUInt32(&v_spacing));
    -
    1231  return true;
    -
    1232 }
    -
    1233 
    -
    1234 uint32_t PixelAspectRatio::ComputeSizeInternal() {
    -
    1235  // This box is optional. Skip it if it is not initialized.
    -
    1236  if (h_spacing == 0 && v_spacing == 0)
    -
    1237  return 0;
    -
    1238  // Both values must be positive.
    -
    1239  DCHECK(h_spacing != 0 && v_spacing != 0);
    -
    1240  return HeaderSize() + sizeof(h_spacing) + sizeof(v_spacing);
    -
    1241 }
    -
    1242 
    -
    1243 VideoSampleEntry::VideoSampleEntry()
    -
    1244  : format(FOURCC_NULL), data_reference_index(1), width(0), height(0) {}
    -
    1245 
    -
    1246 VideoSampleEntry::~VideoSampleEntry() {}
    - -
    1248  if (format == FOURCC_NULL) {
    -
    1249  LOG(ERROR) << "VideoSampleEntry should be parsed according to the "
    -
    1250  << "handler type recovered in its Media ancestor.";
    -
    1251  }
    -
    1252  return format;
    -
    1253 }
    -
    1254 
    -
    1255 bool VideoSampleEntry::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1256  std::vector<uint8_t> compressor_name;
    -
    1257  if (buffer->Reading()) {
    -
    1258  DCHECK(buffer->reader());
    -
    1259  format = buffer->reader()->type();
    -
    1260  } else {
    -
    1261  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    1262 
    -
    1263  const FourCC actual_format = GetActualFormat();
    -
    1264  switch (actual_format) {
    -
    1265  case FOURCC_AVC1:
    -
    1266  compressor_name.assign(
    -
    1267  kAvcCompressorName,
    -
    1268  kAvcCompressorName + arraysize(kAvcCompressorName));
    -
    1269  break;
    -
    1270  case FOURCC_HEV1:
    -
    1271  case FOURCC_HVC1:
    -
    1272  compressor_name.assign(
    -
    1273  kHevcCompressorName,
    -
    1274  kHevcCompressorName + arraysize(kHevcCompressorName));
    -
    1275  break;
    -
    1276  case FOURCC_VP08:
    -
    1277  case FOURCC_VP09:
    -
    1278  case FOURCC_VP10:
    -
    1279  compressor_name.assign(
    -
    1280  kVpcCompressorName,
    -
    1281  kVpcCompressorName + arraysize(kVpcCompressorName));
    -
    1282  break;
    -
    1283  default:
    -
    1284  LOG(ERROR) << FourCCToString(actual_format) << " is not supported.";
    -
    1285  return false;
    -
    1286  }
    -
    1287  compressor_name.resize(kCompressorNameSize);
    -
    1288  }
    -
    1289 
    -
    1290  uint32_t video_resolution = kVideoResolution;
    -
    1291  uint16_t video_frame_count = kVideoFrameCount;
    -
    1292  uint16_t video_depth = kVideoDepth;
    -
    1293  int16_t predefined = -1;
    -
    1294  RCHECK(buffer->IgnoreBytes(6) && // reserved.
    -
    1295  buffer->ReadWriteUInt16(&data_reference_index) &&
    -
    1296  buffer->IgnoreBytes(16) && // predefined 0.
    -
    1297  buffer->ReadWriteUInt16(&width) &&
    -
    1298  buffer->ReadWriteUInt16(&height) &&
    -
    1299  buffer->ReadWriteUInt32(&video_resolution) &&
    +
    137  RCHECK(buffer->BytesLeft() % sizeof(FourCC) == 0);
    +
    138  num_brands = buffer->BytesLeft() / sizeof(FourCC);
    +
    139  compatible_brands.resize(num_brands);
    +
    140  } else {
    +
    141  num_brands = compatible_brands.size();
    +
    142  }
    +
    143  for (size_t i = 0; i < num_brands; ++i)
    +
    144  RCHECK(buffer->ReadWriteFourCC(&compatible_brands[i]));
    +
    145  return true;
    +
    146 }
    +
    147 
    +
    148 uint32_t FileType::ComputeSizeInternal() {
    +
    149  return HeaderSize() + kFourCCSize + sizeof(minor_version) +
    +
    150  kFourCCSize * compatible_brands.size();
    +
    151 }
    +
    152 
    +
    153 FourCC SegmentType::BoxType() const { return FOURCC_STYP; }
    +
    154 
    +
    155 ProtectionSystemSpecificHeader::ProtectionSystemSpecificHeader() {}
    +
    156 ProtectionSystemSpecificHeader::~ProtectionSystemSpecificHeader() {}
    +
    157 FourCC ProtectionSystemSpecificHeader::BoxType() const { return FOURCC_PSSH; }
    +
    158 
    +
    159 bool ProtectionSystemSpecificHeader::ReadWriteInternal(BoxBuffer* buffer) {
    +
    160  if (!buffer->Reading() && !raw_box.empty()) {
    +
    161  // Write the raw box directly.
    +
    162  buffer->writer()->AppendVector(raw_box);
    +
    163  return true;
    +
    164  }
    +
    165 
    +
    166  uint32_t size = data.size();
    +
    167  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    168  buffer->ReadWriteVector(&system_id, 16) &&
    +
    169  buffer->ReadWriteUInt32(&size) &&
    +
    170  buffer->ReadWriteVector(&data, size));
    +
    171 
    +
    172  if (buffer->Reading()) {
    +
    173  // Copy the entire box, including the header, for passing to EME as
    +
    174  // initData.
    +
    175  DCHECK(raw_box.empty());
    +
    176  BoxReader* reader = buffer->reader();
    +
    177  DCHECK(reader);
    +
    178  raw_box.assign(reader->data(), reader->data() + reader->size());
    +
    179  }
    +
    180  return true;
    +
    181 }
    +
    182 
    +
    183 uint32_t ProtectionSystemSpecificHeader::ComputeSizeInternal() {
    +
    184  if (!raw_box.empty()) {
    +
    185  return raw_box.size();
    +
    186  } else {
    +
    187  return HeaderSize() + system_id.size() + sizeof(uint32_t) + data.size();
    +
    188  }
    +
    189 }
    +
    190 
    +
    191 SampleAuxiliaryInformationOffset::SampleAuxiliaryInformationOffset() {}
    +
    192 SampleAuxiliaryInformationOffset::~SampleAuxiliaryInformationOffset() {}
    +
    193 FourCC SampleAuxiliaryInformationOffset::BoxType() const { return FOURCC_SAIO; }
    +
    194 
    +
    195 bool SampleAuxiliaryInformationOffset::ReadWriteInternal(BoxBuffer* buffer) {
    +
    196  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    197  if (flags & 1)
    +
    198  RCHECK(buffer->IgnoreBytes(8)); // aux_info_type and parameter.
    +
    199 
    +
    200  uint32_t count = offsets.size();
    +
    201  RCHECK(buffer->ReadWriteUInt32(&count));
    +
    202  offsets.resize(count);
    +
    203 
    +
    204  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    +
    205  for (uint32_t i = 0; i < count; ++i)
    +
    206  RCHECK(buffer->ReadWriteUInt64NBytes(&offsets[i], num_bytes));
    +
    207  return true;
    +
    208 }
    +
    209 
    +
    210 uint32_t SampleAuxiliaryInformationOffset::ComputeSizeInternal() {
    +
    211  // This box is optional. Skip it if it is empty.
    +
    212  if (offsets.size() == 0)
    +
    213  return 0;
    +
    214  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    +
    215  return HeaderSize() + sizeof(uint32_t) + num_bytes * offsets.size();
    +
    216 }
    +
    217 
    +
    218 SampleAuxiliaryInformationSize::SampleAuxiliaryInformationSize()
    +
    219  : default_sample_info_size(0), sample_count(0) {}
    +
    220 SampleAuxiliaryInformationSize::~SampleAuxiliaryInformationSize() {}
    +
    221 FourCC SampleAuxiliaryInformationSize::BoxType() const { return FOURCC_SAIZ; }
    +
    222 
    +
    223 bool SampleAuxiliaryInformationSize::ReadWriteInternal(BoxBuffer* buffer) {
    +
    224  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    225  if (flags & 1)
    +
    226  RCHECK(buffer->IgnoreBytes(8));
    +
    227 
    +
    228  RCHECK(buffer->ReadWriteUInt8(&default_sample_info_size) &&
    +
    229  buffer->ReadWriteUInt32(&sample_count));
    +
    230  if (default_sample_info_size == 0)
    +
    231  RCHECK(buffer->ReadWriteVector(&sample_info_sizes, sample_count));
    +
    232  return true;
    +
    233 }
    +
    234 
    +
    235 uint32_t SampleAuxiliaryInformationSize::ComputeSizeInternal() {
    +
    236  // This box is optional. Skip it if it is empty.
    +
    237  if (sample_count == 0)
    +
    238  return 0;
    +
    239  return HeaderSize() + sizeof(default_sample_info_size) +
    +
    240  sizeof(sample_count) +
    +
    241  (default_sample_info_size == 0 ? sample_info_sizes.size() : 0);
    +
    242 }
    +
    243 
    +
    244 SampleEncryptionEntry::SampleEncryptionEntry() {}
    +
    245 SampleEncryptionEntry::~SampleEncryptionEntry() {}
    +
    246 
    +
    247 bool SampleEncryptionEntry::ReadWrite(uint8_t iv_size,
    +
    248  bool has_subsamples,
    +
    249  BoxBuffer* buffer) {
    +
    250  DCHECK(IsIvSizeValid(iv_size));
    +
    251  DCHECK(buffer);
    +
    252 
    +
    253  RCHECK(buffer->ReadWriteVector(&initialization_vector, iv_size));
    +
    254 
    +
    255  if (!has_subsamples) {
    +
    256  subsamples.clear();
    +
    257  return true;
    +
    258  }
    +
    259 
    +
    260  uint16_t subsample_count = subsamples.size();
    +
    261  RCHECK(buffer->ReadWriteUInt16(&subsample_count));
    +
    262  RCHECK(subsample_count > 0);
    +
    263  subsamples.resize(subsample_count);
    +
    264  for (auto& subsample : subsamples) {
    +
    265  RCHECK(buffer->ReadWriteUInt16(&subsample.clear_bytes) &&
    +
    266  buffer->ReadWriteUInt32(&subsample.cipher_bytes));
    +
    267  }
    +
    268  return true;
    +
    269 }
    +
    270 
    + +
    272  bool has_subsamples,
    +
    273  BufferReader* reader) {
    +
    274  DCHECK(IsIvSizeValid(iv_size));
    +
    275  DCHECK(reader);
    +
    276 
    +
    277  initialization_vector.resize(iv_size);
    +
    278  RCHECK(reader->ReadToVector(&initialization_vector, iv_size));
    +
    279 
    +
    280  if (!has_subsamples) {
    +
    281  subsamples.clear();
    +
    282  return true;
    +
    283  }
    +
    284 
    +
    285  uint16_t subsample_count;
    +
    286  RCHECK(reader->Read2(&subsample_count));
    +
    287  RCHECK(subsample_count > 0);
    +
    288  subsamples.resize(subsample_count);
    +
    289  for (auto& subsample : subsamples) {
    +
    290  RCHECK(reader->Read2(&subsample.clear_bytes) &&
    +
    291  reader->Read4(&subsample.cipher_bytes));
    +
    292  }
    +
    293  return true;
    +
    294 }
    +
    295 
    + +
    297  const uint32_t subsample_entry_size = sizeof(uint16_t) + sizeof(uint32_t);
    +
    298  const uint16_t subsample_count = subsamples.size();
    +
    299  return initialization_vector.size() +
    +
    300  (subsample_count > 0 ? (sizeof(subsample_count) +
    +
    301  subsample_entry_size * subsample_count)
    +
    302  : 0);
    +
    303 }
    +
    304 
    + +
    306  uint32_t size = 0;
    +
    307  for (uint32_t i = 0; i < subsamples.size(); ++i)
    +
    308  size += subsamples[i].clear_bytes + subsamples[i].cipher_bytes;
    +
    309  return size;
    +
    310 }
    +
    311 
    +
    312 SampleEncryption::SampleEncryption() : iv_size(0) {}
    +
    313 SampleEncryption::~SampleEncryption() {}
    +
    314 FourCC SampleEncryption::BoxType() const { return FOURCC_SENC; }
    +
    315 
    +
    316 bool SampleEncryption::ReadWriteInternal(BoxBuffer* buffer) {
    +
    317  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    318 
    +
    319  // If we don't know |iv_size|, store sample encryption data to parse later
    +
    320  // after we know iv_size.
    +
    321  if (buffer->Reading() && iv_size == 0) {
    +
    322  RCHECK(
    +
    323  buffer->ReadWriteVector(&sample_encryption_data, buffer->BytesLeft()));
    +
    324  return true;
    +
    325  }
    +
    326 
    +
    327  if (!IsIvSizeValid(iv_size)) {
    +
    328  LOG(ERROR) << "IV_size can only be 8 or 16, but seeing " << iv_size;
    +
    329  return false;
    +
    330  }
    +
    331 
    +
    332  uint32_t sample_count = sample_encryption_entries.size();
    +
    333  RCHECK(buffer->ReadWriteUInt32(&sample_count));
    +
    334 
    +
    335  sample_encryption_entries.resize(sample_count);
    +
    336  for (auto& sample_encryption_entry : sample_encryption_entries) {
    +
    337  RCHECK(sample_encryption_entry.ReadWrite(
    +
    338  iv_size, flags & kUseSubsampleEncryption, buffer));
    +
    339  }
    +
    340  return true;
    +
    341 }
    +
    342 
    +
    343 uint32_t SampleEncryption::ComputeSizeInternal() {
    +
    344  const uint32_t sample_count = sample_encryption_entries.size();
    +
    345  if (sample_count == 0) {
    +
    346  // Sample encryption box is optional. Skip it if it is empty.
    +
    347  return 0;
    +
    348  }
    +
    349 
    +
    350  DCHECK(IsIvSizeValid(iv_size));
    +
    351  uint32_t box_size = HeaderSize() + sizeof(sample_count);
    +
    352  if (flags & kUseSubsampleEncryption) {
    +
    353  for (const SampleEncryptionEntry& sample_encryption_entry :
    +
    354  sample_encryption_entries) {
    +
    355  box_size += sample_encryption_entry.ComputeSize();
    +
    356  }
    +
    357  } else {
    +
    358  box_size += sample_count * iv_size;
    +
    359  }
    +
    360  return box_size;
    +
    361 }
    +
    362 
    + +
    364  size_t iv_size,
    +
    365  std::vector<SampleEncryptionEntry>* sample_encryption_entries) const {
    +
    366  DCHECK(IsIvSizeValid(iv_size));
    +
    367 
    +
    368  BufferReader reader(vector_as_array(&sample_encryption_data),
    +
    369  sample_encryption_data.size());
    +
    370  uint32_t sample_count = 0;
    +
    371  RCHECK(reader.Read4(&sample_count));
    +
    372 
    +
    373  sample_encryption_entries->resize(sample_count);
    +
    374  for (auto& sample_encryption_entry : *sample_encryption_entries) {
    +
    375  RCHECK(sample_encryption_entry.ParseFromBuffer(
    +
    376  iv_size, flags & kUseSubsampleEncryption, &reader));
    +
    377  }
    +
    378  return true;
    +
    379 }
    +
    380 
    +
    381 OriginalFormat::OriginalFormat() : format(FOURCC_NULL) {}
    +
    382 OriginalFormat::~OriginalFormat() {}
    +
    383 FourCC OriginalFormat::BoxType() const { return FOURCC_FRMA; }
    +
    384 
    +
    385 bool OriginalFormat::ReadWriteInternal(BoxBuffer* buffer) {
    +
    386  return ReadWriteHeaderInternal(buffer) && buffer->ReadWriteFourCC(&format);
    +
    387 }
    +
    388 
    +
    389 uint32_t OriginalFormat::ComputeSizeInternal() {
    +
    390  return HeaderSize() + kFourCCSize;
    +
    391 }
    +
    392 
    +
    393 SchemeType::SchemeType() : type(FOURCC_NULL), version(0) {}
    +
    394 SchemeType::~SchemeType() {}
    +
    395 FourCC SchemeType::BoxType() const { return FOURCC_SCHM; }
    +
    396 
    +
    397 bool SchemeType::ReadWriteInternal(BoxBuffer* buffer) {
    +
    398  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    399  buffer->ReadWriteFourCC(&type) &&
    +
    400  buffer->ReadWriteUInt32(&version));
    +
    401  return true;
    +
    402 }
    +
    403 
    +
    404 uint32_t SchemeType::ComputeSizeInternal() {
    +
    405  return HeaderSize() + kFourCCSize + sizeof(version);
    +
    406 }
    +
    407 
    +
    408 TrackEncryption::TrackEncryption()
    +
    409  : is_encrypted(false), default_iv_size(0), default_kid(16, 0) {}
    +
    410 TrackEncryption::~TrackEncryption() {}
    +
    411 FourCC TrackEncryption::BoxType() const { return FOURCC_TENC; }
    +
    412 
    +
    413 bool TrackEncryption::ReadWriteInternal(BoxBuffer* buffer) {
    +
    414  if (!buffer->Reading()) {
    +
    415  if (default_kid.size() != kCencKeyIdSize) {
    +
    416  LOG(WARNING) << "CENC defines key id length of " << kCencKeyIdSize
    +
    417  << " bytes; got " << default_kid.size()
    +
    418  << ". Resized accordingly.";
    +
    419  default_kid.resize(kCencKeyIdSize);
    +
    420  }
    +
    421  }
    +
    422 
    +
    423  uint8_t flag = is_encrypted ? 1 : 0;
    +
    424  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    425  buffer->IgnoreBytes(2) && // reserved.
    +
    426  buffer->ReadWriteUInt8(&flag) &&
    +
    427  buffer->ReadWriteUInt8(&default_iv_size) &&
    +
    428  buffer->ReadWriteVector(&default_kid, kCencKeyIdSize));
    +
    429  if (buffer->Reading()) {
    +
    430  is_encrypted = (flag != 0);
    +
    431  if (is_encrypted) {
    +
    432  RCHECK(default_iv_size == 8 || default_iv_size == 16);
    +
    433  } else {
    +
    434  RCHECK(default_iv_size == 0);
    +
    435  }
    +
    436  }
    +
    437  return true;
    +
    438 }
    +
    439 
    +
    440 uint32_t TrackEncryption::ComputeSizeInternal() {
    +
    441  return HeaderSize() + sizeof(uint32_t) + kCencKeyIdSize;
    +
    442 }
    +
    443 
    +
    444 SchemeInfo::SchemeInfo() {}
    +
    445 SchemeInfo::~SchemeInfo() {}
    +
    446 FourCC SchemeInfo::BoxType() const { return FOURCC_SCHI; }
    +
    447 
    +
    448 bool SchemeInfo::ReadWriteInternal(BoxBuffer* buffer) {
    +
    449  RCHECK(ReadWriteHeaderInternal(buffer) && buffer->PrepareChildren() &&
    +
    450  buffer->ReadWriteChild(&track_encryption));
    +
    451  return true;
    +
    452 }
    +
    453 
    +
    454 uint32_t SchemeInfo::ComputeSizeInternal() {
    +
    455  return HeaderSize() + track_encryption.ComputeSize();
    +
    456 }
    +
    457 
    +
    458 ProtectionSchemeInfo::ProtectionSchemeInfo() {}
    +
    459 ProtectionSchemeInfo::~ProtectionSchemeInfo() {}
    +
    460 FourCC ProtectionSchemeInfo::BoxType() const { return FOURCC_SINF; }
    +
    461 
    +
    462 bool ProtectionSchemeInfo::ReadWriteInternal(BoxBuffer* buffer) {
    +
    463  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    464  buffer->PrepareChildren() &&
    +
    465  buffer->ReadWriteChild(&format) &&
    +
    466  buffer->ReadWriteChild(&type));
    +
    467  if (type.type == FOURCC_CENC)
    +
    468  RCHECK(buffer->ReadWriteChild(&info));
    +
    469  // Other protection schemes are silently ignored. Since the protection scheme
    +
    470  // type can't be determined until this box is opened, we return 'true' for
    +
    471  // non-CENC protection scheme types. It is the parent box's responsibility to
    +
    472  // ensure that this scheme type is a supported one.
    +
    473  return true;
    +
    474 }
    +
    475 
    +
    476 uint32_t ProtectionSchemeInfo::ComputeSizeInternal() {
    +
    477  // Skip sinf box if it is not initialized.
    +
    478  if (format.format == FOURCC_NULL)
    +
    479  return 0;
    +
    480  return HeaderSize() + format.ComputeSize() + type.ComputeSize() +
    +
    481  info.ComputeSize();
    +
    482 }
    +
    483 
    +
    484 MovieHeader::MovieHeader()
    +
    485  : creation_time(0),
    +
    486  modification_time(0),
    +
    487  timescale(0),
    +
    488  duration(0),
    +
    489  rate(1 << 16),
    +
    490  volume(1 << 8),
    +
    491  next_track_id(0) {}
    +
    492 MovieHeader::~MovieHeader() {}
    +
    493 FourCC MovieHeader::BoxType() const { return FOURCC_MVHD; }
    +
    494 
    +
    495 bool MovieHeader::ReadWriteInternal(BoxBuffer* buffer) {
    +
    496  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    497 
    +
    498  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    +
    499  RCHECK(buffer->ReadWriteUInt64NBytes(&creation_time, num_bytes) &&
    +
    500  buffer->ReadWriteUInt64NBytes(&modification_time, num_bytes) &&
    +
    501  buffer->ReadWriteUInt32(&timescale) &&
    +
    502  buffer->ReadWriteUInt64NBytes(&duration, num_bytes));
    +
    503 
    +
    504  std::vector<uint8_t> matrix(kUnityMatrix,
    +
    505  kUnityMatrix + arraysize(kUnityMatrix));
    +
    506  RCHECK(buffer->ReadWriteInt32(&rate) &&
    +
    507  buffer->ReadWriteInt16(&volume) &&
    +
    508  buffer->IgnoreBytes(10) && // reserved
    +
    509  buffer->ReadWriteVector(&matrix, matrix.size()) &&
    +
    510  buffer->IgnoreBytes(24) && // predefined zero
    +
    511  buffer->ReadWriteUInt32(&next_track_id));
    +
    512  return true;
    +
    513 }
    +
    514 
    +
    515 uint32_t MovieHeader::ComputeSizeInternal() {
    +
    516  version = IsFitIn32Bits(creation_time, modification_time, duration) ? 0 : 1;
    +
    517  return HeaderSize() + sizeof(uint32_t) * (1 + version) * 3 +
    +
    518  sizeof(timescale) + sizeof(rate) + sizeof(volume) +
    +
    519  sizeof(next_track_id) + sizeof(kUnityMatrix) + 10 +
    +
    520  24; // 10 bytes reserved, 24 bytes predefined.
    +
    521 }
    +
    522 
    +
    523 TrackHeader::TrackHeader()
    +
    524  : creation_time(0),
    +
    525  modification_time(0),
    +
    526  track_id(0),
    +
    527  duration(0),
    +
    528  layer(0),
    +
    529  alternate_group(0),
    +
    530  volume(-1),
    +
    531  width(0),
    +
    532  height(0) {
    +
    533  flags = kTrackEnabled | kTrackInMovie;
    +
    534 }
    +
    535 TrackHeader::~TrackHeader() {}
    +
    536 FourCC TrackHeader::BoxType() const { return FOURCC_TKHD; }
    +
    537 
    +
    538 bool TrackHeader::ReadWriteInternal(BoxBuffer* buffer) {
    +
    539  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    540 
    +
    541  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    +
    542  RCHECK(buffer->ReadWriteUInt64NBytes(&creation_time, num_bytes) &&
    +
    543  buffer->ReadWriteUInt64NBytes(&modification_time, num_bytes) &&
    +
    544  buffer->ReadWriteUInt32(&track_id) &&
    +
    545  buffer->IgnoreBytes(4) && // reserved
    +
    546  buffer->ReadWriteUInt64NBytes(&duration, num_bytes));
    +
    547 
    +
    548  if (!buffer->Reading()) {
    +
    549  // Set default value for volume, if track is audio, 0x100 else 0.
    +
    550  if (volume == -1)
    +
    551  volume = (width != 0 && height != 0) ? 0 : 0x100;
    +
    552  }
    +
    553  std::vector<uint8_t> matrix(kUnityMatrix,
    +
    554  kUnityMatrix + arraysize(kUnityMatrix));
    +
    555  RCHECK(buffer->IgnoreBytes(8) && // reserved
    +
    556  buffer->ReadWriteInt16(&layer) &&
    +
    557  buffer->ReadWriteInt16(&alternate_group) &&
    +
    558  buffer->ReadWriteInt16(&volume) &&
    +
    559  buffer->IgnoreBytes(2) && // reserved
    +
    560  buffer->ReadWriteVector(&matrix, matrix.size()) &&
    +
    561  buffer->ReadWriteUInt32(&width) &&
    +
    562  buffer->ReadWriteUInt32(&height));
    +
    563  return true;
    +
    564 }
    +
    565 
    +
    566 uint32_t TrackHeader::ComputeSizeInternal() {
    +
    567  version = IsFitIn32Bits(creation_time, modification_time, duration) ? 0 : 1;
    +
    568  return HeaderSize() + sizeof(track_id) +
    +
    569  sizeof(uint32_t) * (1 + version) * 3 + sizeof(layer) +
    +
    570  sizeof(alternate_group) + sizeof(volume) + sizeof(width) +
    +
    571  sizeof(height) + sizeof(kUnityMatrix) + 14; // 14 bytes reserved.
    +
    572 }
    +
    573 
    +
    574 SampleDescription::SampleDescription() : type(kInvalid) {}
    +
    575 SampleDescription::~SampleDescription() {}
    +
    576 FourCC SampleDescription::BoxType() const { return FOURCC_STSD; }
    +
    577 
    +
    578 bool SampleDescription::ReadWriteInternal(BoxBuffer* buffer) {
    +
    579  uint32_t count = 0;
    +
    580  switch (type) {
    +
    581  case kVideo:
    +
    582  count = video_entries.size();
    +
    583  break;
    +
    584  case kAudio:
    +
    585  count = audio_entries.size();
    +
    586  break;
    +
    587  case kText:
    +
    588  count = wvtt_entries.size();
    +
    589  break;
    +
    590  default:
    +
    591  NOTIMPLEMENTED() << "SampleDecryption type " << type
    +
    592  << " is not handled. Skipping.";
    +
    593  }
    +
    594  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    595  buffer->ReadWriteUInt32(&count));
    +
    596 
    +
    597  if (buffer->Reading()) {
    +
    598  BoxReader* reader = buffer->reader();
    +
    599  DCHECK(reader);
    +
    600  video_entries.clear();
    +
    601  audio_entries.clear();
    +
    602  // Note: this value is preset before scanning begins. See comments in the
    +
    603  // Parse(Media*) function.
    +
    604  if (type == kVideo) {
    +
    605  RCHECK(reader->ReadAllChildren(&video_entries));
    +
    606  RCHECK(video_entries.size() == count);
    +
    607  } else if (type == kAudio) {
    +
    608  RCHECK(reader->ReadAllChildren(&audio_entries));
    +
    609  RCHECK(audio_entries.size() == count);
    +
    610  } else if (type == kText) {
    +
    611  RCHECK(reader->ReadAllChildren(&wvtt_entries));
    +
    612  RCHECK(wvtt_entries.size() == count);
    +
    613  }
    +
    614  } else {
    +
    615  DCHECK_LT(0u, count);
    +
    616  if (type == kVideo) {
    +
    617  for (uint32_t i = 0; i < count; ++i)
    +
    618  RCHECK(buffer->ReadWriteChild(&video_entries[i]));
    +
    619  } else if (type == kAudio) {
    +
    620  for (uint32_t i = 0; i < count; ++i)
    +
    621  RCHECK(buffer->ReadWriteChild(&audio_entries[i]));
    +
    622  } else if (type == kText) {
    +
    623  for (uint32_t i = 0; i < count; ++i)
    +
    624  RCHECK(buffer->ReadWriteChild(&wvtt_entries[i]));
    +
    625  } else {
    +
    626  NOTIMPLEMENTED();
    +
    627  }
    +
    628  }
    +
    629  return true;
    +
    630 }
    +
    631 
    +
    632 uint32_t SampleDescription::ComputeSizeInternal() {
    +
    633  uint32_t box_size = HeaderSize() + sizeof(uint32_t);
    +
    634  if (type == kVideo) {
    +
    635  for (uint32_t i = 0; i < video_entries.size(); ++i)
    +
    636  box_size += video_entries[i].ComputeSize();
    +
    637  } else if (type == kAudio) {
    +
    638  for (uint32_t i = 0; i < audio_entries.size(); ++i)
    +
    639  box_size += audio_entries[i].ComputeSize();
    +
    640  }
    +
    641  return box_size;
    +
    642 }
    +
    643 
    +
    644 DecodingTimeToSample::DecodingTimeToSample() {}
    +
    645 DecodingTimeToSample::~DecodingTimeToSample() {}
    +
    646 FourCC DecodingTimeToSample::BoxType() const { return FOURCC_STTS; }
    +
    647 
    +
    648 bool DecodingTimeToSample::ReadWriteInternal(BoxBuffer* buffer) {
    +
    649  uint32_t count = decoding_time.size();
    +
    650  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    651  buffer->ReadWriteUInt32(&count));
    +
    652 
    +
    653  decoding_time.resize(count);
    +
    654  for (uint32_t i = 0; i < count; ++i) {
    +
    655  RCHECK(buffer->ReadWriteUInt32(&decoding_time[i].sample_count) &&
    +
    656  buffer->ReadWriteUInt32(&decoding_time[i].sample_delta));
    +
    657  }
    +
    658  return true;
    +
    659 }
    +
    660 
    +
    661 uint32_t DecodingTimeToSample::ComputeSizeInternal() {
    +
    662  return HeaderSize() + sizeof(uint32_t) +
    +
    663  sizeof(DecodingTime) * decoding_time.size();
    +
    664 }
    +
    665 
    +
    666 CompositionTimeToSample::CompositionTimeToSample() {}
    +
    667 CompositionTimeToSample::~CompositionTimeToSample() {}
    +
    668 FourCC CompositionTimeToSample::BoxType() const { return FOURCC_CTTS; }
    +
    669 
    +
    670 bool CompositionTimeToSample::ReadWriteInternal(BoxBuffer* buffer) {
    +
    671  uint32_t count = composition_offset.size();
    +
    672  if (!buffer->Reading()) {
    +
    673  // Determine whether version 0 or version 1 should be used.
    +
    674  // Use version 0 if possible, use version 1 if there is a negative
    +
    675  // sample_offset value.
    +
    676  version = 0;
    +
    677  for (uint32_t i = 0; i < count; ++i) {
    +
    678  if (composition_offset[i].sample_offset < 0) {
    +
    679  version = 1;
    +
    680  break;
    +
    681  }
    +
    682  }
    +
    683  }
    +
    684 
    +
    685  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    686  buffer->ReadWriteUInt32(&count));
    +
    687 
    +
    688  composition_offset.resize(count);
    +
    689  for (uint32_t i = 0; i < count; ++i) {
    +
    690  RCHECK(buffer->ReadWriteUInt32(&composition_offset[i].sample_count));
    +
    691 
    +
    692  if (version == 0) {
    +
    693  uint32_t sample_offset = composition_offset[i].sample_offset;
    +
    694  RCHECK(buffer->ReadWriteUInt32(&sample_offset));
    +
    695  composition_offset[i].sample_offset = sample_offset;
    +
    696  } else {
    +
    697  int32_t sample_offset = composition_offset[i].sample_offset;
    +
    698  RCHECK(buffer->ReadWriteInt32(&sample_offset));
    +
    699  composition_offset[i].sample_offset = sample_offset;
    +
    700  }
    +
    701  }
    +
    702  return true;
    +
    703 }
    +
    704 
    +
    705 uint32_t CompositionTimeToSample::ComputeSizeInternal() {
    +
    706  // This box is optional. Skip it if it is empty.
    +
    707  if (composition_offset.empty())
    +
    708  return 0;
    +
    709  // Structure CompositionOffset contains |sample_offset| (uint32_t) and
    +
    710  // |sample_offset| (int64_t). The actual size of |sample_offset| is
    +
    711  // 4 bytes (uint32_t for version 0 and int32_t for version 1).
    +
    712  const uint32_t kCompositionOffsetSize = sizeof(uint32_t) * 2;
    +
    713  return HeaderSize() + sizeof(uint32_t) +
    +
    714  kCompositionOffsetSize * composition_offset.size();
    +
    715 }
    +
    716 
    +
    717 SampleToChunk::SampleToChunk() {}
    +
    718 SampleToChunk::~SampleToChunk() {}
    +
    719 FourCC SampleToChunk::BoxType() const { return FOURCC_STSC; }
    +
    720 
    +
    721 bool SampleToChunk::ReadWriteInternal(BoxBuffer* buffer) {
    +
    722  uint32_t count = chunk_info.size();
    +
    723  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    724  buffer->ReadWriteUInt32(&count));
    +
    725 
    +
    726  chunk_info.resize(count);
    +
    727  for (uint32_t i = 0; i < count; ++i) {
    +
    728  RCHECK(buffer->ReadWriteUInt32(&chunk_info[i].first_chunk) &&
    +
    729  buffer->ReadWriteUInt32(&chunk_info[i].samples_per_chunk) &&
    +
    730  buffer->ReadWriteUInt32(&chunk_info[i].sample_description_index));
    +
    731  // first_chunk values are always increasing.
    +
    732  RCHECK(i == 0 ? chunk_info[i].first_chunk == 1
    +
    733  : chunk_info[i].first_chunk > chunk_info[i - 1].first_chunk);
    +
    734  }
    +
    735  return true;
    +
    736 }
    +
    737 
    +
    738 uint32_t SampleToChunk::ComputeSizeInternal() {
    +
    739  return HeaderSize() + sizeof(uint32_t) +
    +
    740  sizeof(ChunkInfo) * chunk_info.size();
    +
    741 }
    +
    742 
    +
    743 SampleSize::SampleSize() : sample_size(0), sample_count(0) {}
    +
    744 SampleSize::~SampleSize() {}
    +
    745 FourCC SampleSize::BoxType() const { return FOURCC_STSZ; }
    +
    746 
    +
    747 bool SampleSize::ReadWriteInternal(BoxBuffer* buffer) {
    +
    748  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    749  buffer->ReadWriteUInt32(&sample_size) &&
    +
    750  buffer->ReadWriteUInt32(&sample_count));
    +
    751 
    +
    752  if (sample_size == 0) {
    +
    753  if (buffer->Reading())
    +
    754  sizes.resize(sample_count);
    +
    755  else
    +
    756  DCHECK(sample_count == sizes.size());
    +
    757  for (uint32_t i = 0; i < sample_count; ++i)
    +
    758  RCHECK(buffer->ReadWriteUInt32(&sizes[i]));
    +
    759  }
    +
    760  return true;
    +
    761 }
    +
    762 
    +
    763 uint32_t SampleSize::ComputeSizeInternal() {
    +
    764  return HeaderSize() + sizeof(sample_size) + sizeof(sample_count) +
    +
    765  (sample_size == 0 ? sizeof(uint32_t) * sizes.size() : 0);
    +
    766 }
    +
    767 
    +
    768 CompactSampleSize::CompactSampleSize() : field_size(0) {}
    +
    769 CompactSampleSize::~CompactSampleSize() {}
    +
    770 FourCC CompactSampleSize::BoxType() const { return FOURCC_STZ2; }
    +
    771 
    +
    772 bool CompactSampleSize::ReadWriteInternal(BoxBuffer* buffer) {
    +
    773  uint32_t sample_count = sizes.size();
    +
    774  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    775  buffer->IgnoreBytes(3) &&
    +
    776  buffer->ReadWriteUInt8(&field_size) &&
    +
    777  buffer->ReadWriteUInt32(&sample_count));
    +
    778 
    +
    779  // Reserve one more entry if field size is 4 bits.
    +
    780  sizes.resize(sample_count + (field_size == 4 ? 1 : 0), 0);
    +
    781  switch (field_size) {
    +
    782  case 4:
    +
    783  for (uint32_t i = 0; i < sample_count; i += 2) {
    +
    784  if (buffer->Reading()) {
    +
    785  uint8_t size = 0;
    +
    786  RCHECK(buffer->ReadWriteUInt8(&size));
    +
    787  sizes[i] = size >> 4;
    +
    788  sizes[i + 1] = size & 0x0F;
    +
    789  } else {
    +
    790  DCHECK_LT(sizes[i], 16u);
    +
    791  DCHECK_LT(sizes[i + 1], 16u);
    +
    792  uint8_t size = (sizes[i] << 4) | sizes[i + 1];
    +
    793  RCHECK(buffer->ReadWriteUInt8(&size));
    +
    794  }
    +
    795  }
    +
    796  break;
    +
    797  case 8:
    +
    798  for (uint32_t i = 0; i < sample_count; ++i) {
    +
    799  uint8_t size = sizes[i];
    +
    800  RCHECK(buffer->ReadWriteUInt8(&size));
    +
    801  sizes[i] = size;
    +
    802  }
    +
    803  break;
    +
    804  case 16:
    +
    805  for (uint32_t i = 0; i < sample_count; ++i) {
    +
    806  uint16_t size = sizes[i];
    +
    807  RCHECK(buffer->ReadWriteUInt16(&size));
    +
    808  sizes[i] = size;
    +
    809  }
    +
    810  break;
    +
    811  default:
    +
    812  RCHECK(false);
    +
    813  }
    +
    814  sizes.resize(sample_count);
    +
    815  return true;
    +
    816 }
    +
    817 
    +
    818 uint32_t CompactSampleSize::ComputeSizeInternal() {
    +
    819  return HeaderSize() + sizeof(uint32_t) + sizeof(uint32_t) +
    +
    820  (field_size * sizes.size() + 7) / 8;
    +
    821 }
    +
    822 
    +
    823 ChunkOffset::ChunkOffset() {}
    +
    824 ChunkOffset::~ChunkOffset() {}
    +
    825 FourCC ChunkOffset::BoxType() const { return FOURCC_STCO; }
    +
    826 
    +
    827 bool ChunkOffset::ReadWriteInternal(BoxBuffer* buffer) {
    +
    828  uint32_t count = offsets.size();
    +
    829  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    830  buffer->ReadWriteUInt32(&count));
    +
    831 
    +
    832  offsets.resize(count);
    +
    833  for (uint32_t i = 0; i < count; ++i)
    +
    834  RCHECK(buffer->ReadWriteUInt64NBytes(&offsets[i], sizeof(uint32_t)));
    +
    835  return true;
    +
    836 }
    +
    837 
    +
    838 uint32_t ChunkOffset::ComputeSizeInternal() {
    +
    839  return HeaderSize() + sizeof(uint32_t) + sizeof(uint32_t) * offsets.size();
    +
    840 }
    +
    841 
    +
    842 ChunkLargeOffset::ChunkLargeOffset() {}
    +
    843 ChunkLargeOffset::~ChunkLargeOffset() {}
    +
    844 FourCC ChunkLargeOffset::BoxType() const { return FOURCC_CO64; }
    +
    845 
    +
    846 bool ChunkLargeOffset::ReadWriteInternal(BoxBuffer* buffer) {
    +
    847  uint32_t count = offsets.size();
    +
    848 
    +
    849  if (!buffer->Reading()) {
    +
    850  // Switch to ChunkOffset box if it is able to fit in 32 bits offset.
    +
    851  if (count == 0 || IsFitIn32Bits(offsets[count - 1])) {
    +
    852  ChunkOffset stco;
    +
    853  stco.offsets.swap(offsets);
    +
    854  DCHECK(buffer->writer());
    +
    855  stco.Write(buffer->writer());
    +
    856  stco.offsets.swap(offsets);
    +
    857  return true;
    +
    858  }
    +
    859  }
    +
    860 
    +
    861  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    862  buffer->ReadWriteUInt32(&count));
    +
    863 
    +
    864  offsets.resize(count);
    +
    865  for (uint32_t i = 0; i < count; ++i)
    +
    866  RCHECK(buffer->ReadWriteUInt64(&offsets[i]));
    +
    867  return true;
    +
    868 }
    +
    869 
    +
    870 uint32_t ChunkLargeOffset::ComputeSizeInternal() {
    +
    871  uint32_t count = offsets.size();
    +
    872  int use_large_offset =
    +
    873  (count > 0 && !IsFitIn32Bits(offsets[count - 1])) ? 1 : 0;
    +
    874  return HeaderSize() + sizeof(count) +
    +
    875  sizeof(uint32_t) * (1 + use_large_offset) * offsets.size();
    +
    876 }
    +
    877 
    +
    878 SyncSample::SyncSample() {}
    +
    879 SyncSample::~SyncSample() {}
    +
    880 FourCC SyncSample::BoxType() const { return FOURCC_STSS; }
    +
    881 
    +
    882 bool SyncSample::ReadWriteInternal(BoxBuffer* buffer) {
    +
    883  uint32_t count = sample_number.size();
    +
    884  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    885  buffer->ReadWriteUInt32(&count));
    +
    886 
    +
    887  sample_number.resize(count);
    +
    888  for (uint32_t i = 0; i < count; ++i)
    +
    889  RCHECK(buffer->ReadWriteUInt32(&sample_number[i]));
    +
    890  return true;
    +
    891 }
    +
    892 
    +
    893 uint32_t SyncSample::ComputeSizeInternal() {
    +
    894  // Sync sample box is optional. Skip it if it is empty.
    +
    895  if (sample_number.empty())
    +
    896  return 0;
    +
    897  return HeaderSize() + sizeof(uint32_t) +
    +
    898  sizeof(uint32_t) * sample_number.size();
    +
    899 }
    +
    900 
    +
    901 SampleTable::SampleTable() {}
    +
    902 SampleTable::~SampleTable() {}
    +
    903 FourCC SampleTable::BoxType() const { return FOURCC_STBL; }
    +
    904 
    +
    905 bool SampleTable::ReadWriteInternal(BoxBuffer* buffer) {
    +
    906  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    907  buffer->PrepareChildren() &&
    +
    908  buffer->ReadWriteChild(&description) &&
    +
    909  buffer->ReadWriteChild(&decoding_time_to_sample) &&
    +
    910  buffer->TryReadWriteChild(&composition_time_to_sample) &&
    +
    911  buffer->ReadWriteChild(&sample_to_chunk));
    +
    912 
    +
    913  if (buffer->Reading()) {
    +
    914  BoxReader* reader = buffer->reader();
    +
    915  DCHECK(reader);
    +
    916 
    +
    917  // Either SampleSize or CompactSampleSize must present.
    +
    918  if (reader->ChildExist(&sample_size)) {
    +
    919  RCHECK(reader->ReadChild(&sample_size));
    +
    920  } else {
    +
    921  CompactSampleSize compact_sample_size;
    +
    922  RCHECK(reader->ReadChild(&compact_sample_size));
    +
    923  sample_size.sample_size = 0;
    +
    924  sample_size.sample_count = compact_sample_size.sizes.size();
    +
    925  sample_size.sizes.swap(compact_sample_size.sizes);
    +
    926  }
    +
    927 
    +
    928  // Either ChunkOffset or ChunkLargeOffset must present.
    +
    929  if (reader->ChildExist(&chunk_large_offset)) {
    +
    930  RCHECK(reader->ReadChild(&chunk_large_offset));
    +
    931  } else {
    +
    932  ChunkOffset chunk_offset;
    +
    933  RCHECK(reader->ReadChild(&chunk_offset));
    +
    934  chunk_large_offset.offsets.swap(chunk_offset.offsets);
    +
    935  }
    +
    936  } else {
    +
    937  RCHECK(buffer->ReadWriteChild(&sample_size) &&
    +
    938  buffer->ReadWriteChild(&chunk_large_offset));
    +
    939  }
    +
    940  RCHECK(buffer->TryReadWriteChild(&sync_sample));
    +
    941  return true;
    +
    942 }
    +
    943 
    +
    944 uint32_t SampleTable::ComputeSizeInternal() {
    +
    945  return HeaderSize() + description.ComputeSize() +
    +
    946  decoding_time_to_sample.ComputeSize() +
    +
    947  composition_time_to_sample.ComputeSize() +
    +
    948  sample_to_chunk.ComputeSize() + sample_size.ComputeSize() +
    +
    949  chunk_large_offset.ComputeSize() + sync_sample.ComputeSize();
    +
    950 }
    +
    951 
    +
    952 EditList::EditList() {}
    +
    953 EditList::~EditList() {}
    +
    954 FourCC EditList::BoxType() const { return FOURCC_ELST; }
    +
    955 
    +
    956 bool EditList::ReadWriteInternal(BoxBuffer* buffer) {
    +
    957  uint32_t count = edits.size();
    +
    958  RCHECK(ReadWriteHeaderInternal(buffer) && buffer->ReadWriteUInt32(&count));
    +
    959  edits.resize(count);
    +
    960 
    +
    961  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    +
    962  for (uint32_t i = 0; i < count; ++i) {
    +
    963  RCHECK(
    +
    964  buffer->ReadWriteUInt64NBytes(&edits[i].segment_duration, num_bytes) &&
    +
    965  buffer->ReadWriteInt64NBytes(&edits[i].media_time, num_bytes) &&
    +
    966  buffer->ReadWriteInt16(&edits[i].media_rate_integer) &&
    +
    967  buffer->ReadWriteInt16(&edits[i].media_rate_fraction));
    +
    968  }
    +
    969  return true;
    +
    970 }
    +
    971 
    +
    972 uint32_t EditList::ComputeSizeInternal() {
    +
    973  // EditList box is optional. Skip it if it is empty.
    +
    974  if (edits.empty())
    +
    975  return 0;
    +
    976 
    +
    977  version = 0;
    +
    978  for (uint32_t i = 0; i < edits.size(); ++i) {
    +
    979  if (!IsFitIn32Bits(edits[i].segment_duration, edits[i].media_time)) {
    +
    980  version = 1;
    +
    981  break;
    +
    982  }
    +
    983  }
    +
    984  return HeaderSize() + sizeof(uint32_t) +
    +
    985  (sizeof(uint32_t) * (1 + version) * 2 + sizeof(int16_t) * 2) *
    +
    986  edits.size();
    +
    987 }
    +
    988 
    +
    989 Edit::Edit() {}
    +
    990 Edit::~Edit() {}
    +
    991 FourCC Edit::BoxType() const { return FOURCC_EDTS; }
    +
    992 
    +
    993 bool Edit::ReadWriteInternal(BoxBuffer* buffer) {
    +
    994  return ReadWriteHeaderInternal(buffer) &&
    +
    995  buffer->PrepareChildren() &&
    +
    996  buffer->ReadWriteChild(&list);
    +
    997 }
    +
    998 
    +
    999 uint32_t Edit::ComputeSizeInternal() {
    +
    1000  // Edit box is optional. Skip it if it is empty.
    +
    1001  if (list.edits.empty())
    +
    1002  return 0;
    +
    1003  return HeaderSize() + list.ComputeSize();
    +
    1004 }
    +
    1005 
    +
    1006 HandlerReference::HandlerReference() : handler_type(FOURCC_NULL) {}
    +
    1007 HandlerReference::~HandlerReference() {}
    +
    1008 FourCC HandlerReference::BoxType() const { return FOURCC_HDLR; }
    +
    1009 
    +
    1010 bool HandlerReference::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1011  std::vector<uint8_t> handler_name;
    +
    1012  if (!buffer->Reading()) {
    +
    1013  switch (handler_type) {
    +
    1014  case FOURCC_VIDE:
    +
    1015  handler_name.assign(kVideoHandlerName,
    +
    1016  kVideoHandlerName + arraysize(kVideoHandlerName));
    +
    1017  break;
    +
    1018  case FOURCC_SOUN:
    +
    1019  handler_name.assign(kAudioHandlerName,
    +
    1020  kAudioHandlerName + arraysize(kAudioHandlerName));
    +
    1021  break;
    +
    1022  case FOURCC_TEXT:
    +
    1023  handler_name.assign(kTextHandlerName,
    +
    1024  kTextHandlerName + arraysize(kTextHandlerName));
    +
    1025  break;
    +
    1026  case FOURCC_ID32:
    +
    1027  break;
    +
    1028  default:
    +
    1029  NOTIMPLEMENTED();
    +
    1030  return false;
    +
    1031  }
    +
    1032  }
    +
    1033  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1034  buffer->IgnoreBytes(4) && // predefined.
    +
    1035  buffer->ReadWriteFourCC(&handler_type));
    +
    1036  if (!buffer->Reading()) {
    +
    1037  RCHECK(buffer->IgnoreBytes(12) && // reserved.
    +
    1038  buffer->ReadWriteVector(&handler_name, handler_name.size()));
    +
    1039  }
    +
    1040  return true;
    +
    1041 }
    +
    1042 
    +
    1043 uint32_t HandlerReference::ComputeSizeInternal() {
    +
    1044  uint32_t box_size = HeaderSize() + kFourCCSize + 16; // 16 bytes Reserved
    +
    1045  switch (handler_type) {
    +
    1046  case FOURCC_VIDE:
    +
    1047  box_size += sizeof(kVideoHandlerName);
    +
    1048  break;
    +
    1049  case FOURCC_SOUN:
    +
    1050  box_size += sizeof(kAudioHandlerName);
    +
    1051  break;
    +
    1052  case FOURCC_TEXT:
    +
    1053  box_size += sizeof(kTextHandlerName);
    +
    1054  break;
    +
    1055  case FOURCC_ID32:
    +
    1056  break;
    +
    1057  default:
    +
    1058  NOTIMPLEMENTED();
    +
    1059  }
    +
    1060  return box_size;
    +
    1061 }
    +
    1062 
    +
    1063 bool Language::ReadWrite(BoxBuffer* buffer) {
    +
    1064  if (buffer->Reading()) {
    +
    1065  // Read language codes into temp first then use BitReader to read the
    +
    1066  // values. ISO-639-2/T language code: unsigned int(5)[3] language (2 bytes).
    +
    1067  std::vector<uint8_t> temp;
    +
    1068  RCHECK(buffer->ReadWriteVector(&temp, 2));
    +
    1069 
    +
    1070  BitReader bit_reader(&temp[0], 2);
    +
    1071  bit_reader.SkipBits(1);
    +
    1072  char language[3];
    +
    1073  for (int i = 0; i < 3; ++i) {
    +
    1074  CHECK(bit_reader.ReadBits(5, &language[i]));
    +
    1075  language[i] += 0x60;
    +
    1076  }
    +
    1077  code.assign(language, 3);
    +
    1078  } else {
    +
    1079  // Set up default language if it is not set.
    +
    1080  const char kUndefinedLanguage[] = "und";
    +
    1081  if (code.empty())
    +
    1082  code = kUndefinedLanguage;
    +
    1083  DCHECK_EQ(code.size(), 3u);
    +
    1084 
    +
    1085  // Lang format: bit(1) pad, unsigned int(5)[3] language.
    +
    1086  uint16_t lang = 0;
    +
    1087  for (int i = 0; i < 3; ++i)
    +
    1088  lang |= (code[i] - 0x60) << ((2 - i) * 5);
    +
    1089  RCHECK(buffer->ReadWriteUInt16(&lang));
    +
    1090  }
    +
    1091  return true;
    +
    1092 }
    +
    1093 
    +
    1094 uint32_t Language::ComputeSize() const {
    +
    1095  // ISO-639-2/T language code: unsigned int(5)[3] language (2 bytes).
    +
    1096  return 2;
    +
    1097 }
    +
    1098 
    +
    1099 bool PrivFrame::ReadWrite(BoxBuffer* buffer) {
    +
    1100  FourCC fourcc = FOURCC_PRIV;
    +
    1101  RCHECK(buffer->ReadWriteFourCC(&fourcc));
    +
    1102  if (fourcc != FOURCC_PRIV) {
    +
    1103  VLOG(1) << "Skip unrecognized id3 frame during read: "
    +
    1104  << FourCCToString(fourcc);
    +
    1105  return true;
    +
    1106  }
    +
    1107 
    +
    1108  uint32_t frame_size = owner.size() + 1 + value.size();
    +
    1109  // size should be encoded as synchsafe integer, which is not support here.
    +
    1110  // We don't expect frame_size to be larger than 0x7F. Synchsafe integers less
    +
    1111  // than 0x7F is encoded in the same way as normal integer.
    +
    1112  DCHECK_LT(frame_size, 0x7Fu);
    +
    1113  uint16_t flags = 0;
    +
    1114  RCHECK(buffer->ReadWriteUInt32(&frame_size) &&
    +
    1115  buffer->ReadWriteUInt16(&flags));
    +
    1116 
    +
    1117  if (buffer->Reading()) {
    +
    1118  std::string str;
    +
    1119  RCHECK(buffer->ReadWriteString(&str, frame_size));
    +
    1120  // |owner| is null terminated.
    +
    1121  size_t pos = str.find('\0');
    +
    1122  RCHECK(pos < str.size());
    +
    1123  owner = str.substr(0, pos);
    +
    1124  value = str.substr(pos + 1);
    +
    1125  } else {
    +
    1126  uint8_t byte = 0; // Null terminating byte between owner and value.
    +
    1127  RCHECK(buffer->ReadWriteString(&owner, owner.size()) &&
    +
    1128  buffer->ReadWriteUInt8(&byte) &&
    +
    1129  buffer->ReadWriteString(&value, value.size()));
    +
    1130  }
    +
    1131  return true;
    +
    1132 }
    +
    1133 
    +
    1134 uint32_t PrivFrame::ComputeSize() const {
    +
    1135  if (owner.empty() && value.empty())
    +
    1136  return 0;
    +
    1137  const uint32_t kFourCCSize = 4;
    +
    1138  return kFourCCSize + sizeof(uint32_t) + sizeof(uint16_t) + owner.size() + 1 +
    +
    1139  value.size();
    +
    1140 }
    +
    1141 
    +
    1142 ID3v2::ID3v2() {}
    +
    1143 ID3v2::~ID3v2() {}
    +
    1144 
    +
    1145 FourCC ID3v2::BoxType() const { return FOURCC_ID32; }
    +
    1146 
    +
    1147 bool ID3v2::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1148  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1149  language.ReadWrite(buffer));
    +
    1150 
    +
    1151  // Read/Write ID3v2 header
    +
    1152  std::string id3v2_identifier = kID3v2Identifier;
    +
    1153  uint16_t version = kID3v2Version;
    +
    1154  // We only support PrivateFrame in ID3.
    +
    1155  uint32_t data_size = private_frame.ComputeSize();
    +
    1156  // size should be encoded as synchsafe integer, which is not support here.
    +
    1157  // We don't expect data_size to be larger than 0x7F. Synchsafe integers less
    +
    1158  // than 0x7F is encoded in the same way as normal integer.
    +
    1159  DCHECK_LT(data_size, 0x7Fu);
    +
    1160  uint8_t flags = 0;
    +
    1161  RCHECK(buffer->ReadWriteString(&id3v2_identifier, id3v2_identifier.size()) &&
    +
    1162  buffer->ReadWriteUInt16(&version) &&
    +
    1163  buffer->ReadWriteUInt8(&flags) &&
    +
    1164  buffer->ReadWriteUInt32(&data_size));
    +
    1165 
    +
    1166  RCHECK(private_frame.ReadWrite(buffer));
    +
    1167  return true;
    +
    1168 }
    +
    1169 
    +
    1170 uint32_t ID3v2::ComputeSizeInternal() {
    +
    1171  uint32_t private_frame_size = private_frame.ComputeSize();
    +
    1172  // Skip ID3v2 box generation if there is no private frame.
    +
    1173  return private_frame_size == 0 ? 0 : HeaderSize() + language.ComputeSize() +
    +
    1174  kID3v2HeaderSize +
    +
    1175  private_frame_size;
    +
    1176 }
    +
    1177 
    +
    1178 Metadata::Metadata() {}
    +
    1179 Metadata::~Metadata() {}
    +
    1180 
    +
    1181 FourCC Metadata::BoxType() const {
    +
    1182  return FOURCC_META;
    +
    1183 }
    +
    1184 
    +
    1185 bool Metadata::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1186  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1187  buffer->PrepareChildren() &&
    +
    1188  buffer->ReadWriteChild(&handler) &&
    +
    1189  buffer->TryReadWriteChild(&id3v2));
    +
    1190  return true;
    +
    1191 }
    +
    1192 
    +
    1193 uint32_t Metadata::ComputeSizeInternal() {
    +
    1194  uint32_t id3v2_size = id3v2.ComputeSize();
    +
    1195  // Skip metadata box generation if there is no metadata box.
    +
    1196  return id3v2_size == 0 ? 0
    +
    1197  : HeaderSize() + handler.ComputeSize() + id3v2_size;
    +
    1198 }
    +
    1199 
    +
    1200 CodecConfigurationRecord::CodecConfigurationRecord() : box_type(FOURCC_NULL) {}
    +
    1201 CodecConfigurationRecord::~CodecConfigurationRecord() {}
    + +
    1203  // CodecConfigurationRecord should be parsed according to format recovered in
    +
    1204  // VideoSampleEntry. |box_type| is determined dynamically there.
    +
    1205  return box_type;
    +
    1206 }
    +
    1207 
    +
    1208 bool CodecConfigurationRecord::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1209  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    1210  if (buffer->Reading()) {
    +
    1211  RCHECK(buffer->ReadWriteVector(&data, buffer->BytesLeft()));
    +
    1212  } else {
    +
    1213  RCHECK(buffer->ReadWriteVector(&data, data.size()));
    +
    1214  }
    +
    1215  return true;
    +
    1216 }
    +
    1217 
    +
    1218 uint32_t CodecConfigurationRecord::ComputeSizeInternal() {
    +
    1219  if (data.empty())
    +
    1220  return 0;
    +
    1221  return HeaderSize() + data.size();
    +
    1222 }
    +
    1223 
    +
    1224 PixelAspectRatio::PixelAspectRatio() : h_spacing(0), v_spacing(0) {}
    +
    1225 PixelAspectRatio::~PixelAspectRatio() {}
    +
    1226 FourCC PixelAspectRatio::BoxType() const { return FOURCC_PASP; }
    +
    1227 
    +
    1228 bool PixelAspectRatio::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1229  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1230  buffer->ReadWriteUInt32(&h_spacing) &&
    +
    1231  buffer->ReadWriteUInt32(&v_spacing));
    +
    1232  return true;
    +
    1233 }
    +
    1234 
    +
    1235 uint32_t PixelAspectRatio::ComputeSizeInternal() {
    +
    1236  // This box is optional. Skip it if it is not initialized.
    +
    1237  if (h_spacing == 0 && v_spacing == 0)
    +
    1238  return 0;
    +
    1239  // Both values must be positive.
    +
    1240  DCHECK(h_spacing != 0 && v_spacing != 0);
    +
    1241  return HeaderSize() + sizeof(h_spacing) + sizeof(v_spacing);
    +
    1242 }
    +
    1243 
    +
    1244 VideoSampleEntry::VideoSampleEntry()
    +
    1245  : format(FOURCC_NULL), data_reference_index(1), width(0), height(0) {}
    +
    1246 
    +
    1247 VideoSampleEntry::~VideoSampleEntry() {}
    + +
    1249  if (format == FOURCC_NULL) {
    +
    1250  LOG(ERROR) << "VideoSampleEntry should be parsed according to the "
    +
    1251  << "handler type recovered in its Media ancestor.";
    +
    1252  }
    +
    1253  return format;
    +
    1254 }
    +
    1255 
    +
    1256 bool VideoSampleEntry::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1257  std::vector<uint8_t> compressor_name;
    +
    1258  if (buffer->Reading()) {
    +
    1259  DCHECK(buffer->reader());
    +
    1260  format = buffer->reader()->type();
    +
    1261  } else {
    +
    1262  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    1263 
    +
    1264  const FourCC actual_format = GetActualFormat();
    +
    1265  switch (actual_format) {
    +
    1266  case FOURCC_AVC1:
    +
    1267  compressor_name.assign(
    +
    1268  kAvcCompressorName,
    +
    1269  kAvcCompressorName + arraysize(kAvcCompressorName));
    +
    1270  break;
    +
    1271  case FOURCC_HEV1:
    +
    1272  case FOURCC_HVC1:
    +
    1273  compressor_name.assign(
    +
    1274  kHevcCompressorName,
    +
    1275  kHevcCompressorName + arraysize(kHevcCompressorName));
    +
    1276  break;
    +
    1277  case FOURCC_VP08:
    +
    1278  case FOURCC_VP09:
    +
    1279  case FOURCC_VP10:
    +
    1280  compressor_name.assign(
    +
    1281  kVpcCompressorName,
    +
    1282  kVpcCompressorName + arraysize(kVpcCompressorName));
    +
    1283  break;
    +
    1284  default:
    +
    1285  LOG(ERROR) << FourCCToString(actual_format) << " is not supported.";
    +
    1286  return false;
    +
    1287  }
    +
    1288  compressor_name.resize(kCompressorNameSize);
    +
    1289  }
    +
    1290 
    +
    1291  uint32_t video_resolution = kVideoResolution;
    +
    1292  uint16_t video_frame_count = kVideoFrameCount;
    +
    1293  uint16_t video_depth = kVideoDepth;
    +
    1294  int16_t predefined = -1;
    +
    1295  RCHECK(buffer->IgnoreBytes(6) && // reserved.
    +
    1296  buffer->ReadWriteUInt16(&data_reference_index) &&
    +
    1297  buffer->IgnoreBytes(16) && // predefined 0.
    +
    1298  buffer->ReadWriteUInt16(&width) &&
    +
    1299  buffer->ReadWriteUInt16(&height) &&
    1300  buffer->ReadWriteUInt32(&video_resolution) &&
    -
    1301  buffer->IgnoreBytes(4) && // reserved.
    -
    1302  buffer->ReadWriteUInt16(&video_frame_count) &&
    -
    1303  buffer->ReadWriteVector(&compressor_name, kCompressorNameSize) &&
    -
    1304  buffer->ReadWriteUInt16(&video_depth) &&
    -
    1305  buffer->ReadWriteInt16(&predefined));
    -
    1306 
    -
    1307  RCHECK(buffer->PrepareChildren());
    -
    1308 
    -
    1309  if (format == FOURCC_ENCV) {
    -
    1310  if (buffer->Reading()) {
    -
    1311  // Continue scanning until a recognized protection scheme is found,
    -
    1312  // or until we run out of protection schemes.
    -
    1313  while (sinf.type.type != FOURCC_CENC) {
    -
    1314  if (!buffer->ReadWriteChild(&sinf))
    -
    1315  return false;
    -
    1316  }
    -
    1317  } else {
    -
    1318  RCHECK(buffer->ReadWriteChild(&sinf));
    -
    1319  }
    -
    1320  }
    -
    1321 
    -
    1322  const FourCC actual_format = GetActualFormat();
    -
    1323  switch (actual_format) {
    -
    1324  case FOURCC_AVC1:
    -
    1325  codec_config_record.box_type = FOURCC_AVCC;
    -
    1326  break;
    -
    1327  case FOURCC_HEV1:
    -
    1328  case FOURCC_HVC1:
    -
    1329  codec_config_record.box_type = FOURCC_HVCC;
    -
    1330  break;
    -
    1331  case FOURCC_VP08:
    -
    1332  case FOURCC_VP09:
    -
    1333  case FOURCC_VP10:
    -
    1334  codec_config_record.box_type = FOURCC_VPCC;
    -
    1335  break;
    -
    1336  default:
    -
    1337  LOG(ERROR) << FourCCToString(actual_format) << " is not supported.";
    -
    1338  return false;
    -
    1339  }
    -
    1340  RCHECK(buffer->ReadWriteChild(&codec_config_record));
    -
    1341  RCHECK(buffer->TryReadWriteChild(&pixel_aspect));
    -
    1342  return true;
    -
    1343 }
    -
    1344 
    -
    1345 uint32_t VideoSampleEntry::ComputeSizeInternal() {
    -
    1346  return HeaderSize() + sizeof(data_reference_index) + sizeof(width) +
    -
    1347  sizeof(height) + sizeof(kVideoResolution) * 2 +
    -
    1348  sizeof(kVideoFrameCount) + sizeof(kVideoDepth) +
    -
    1349  pixel_aspect.ComputeSize() + sinf.ComputeSize() +
    -
    1350  codec_config_record.ComputeSize() + kCompressorNameSize + 6 + 4 + 16 +
    -
    1351  2; // 6 + 4 bytes reserved, 16 + 2 bytes predefined.
    -
    1352 }
    -
    1353 
    -
    1354 ElementaryStreamDescriptor::ElementaryStreamDescriptor() {}
    -
    1355 ElementaryStreamDescriptor::~ElementaryStreamDescriptor() {}
    -
    1356 FourCC ElementaryStreamDescriptor::BoxType() const { return FOURCC_ESDS; }
    -
    1357 
    -
    1358 bool ElementaryStreamDescriptor::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1359  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    1360  if (buffer->Reading()) {
    -
    1361  std::vector<uint8_t> data;
    -
    1362  RCHECK(buffer->ReadWriteVector(&data, buffer->BytesLeft()));
    -
    1363  RCHECK(es_descriptor.Parse(data));
    -
    1364  if (es_descriptor.IsAAC()) {
    -
    1365  RCHECK(aac_audio_specific_config.Parse(
    -
    1366  es_descriptor.decoder_specific_info()));
    -
    1367  }
    -
    1368  } else {
    -
    1369  DCHECK(buffer->writer());
    -
    1370  es_descriptor.Write(buffer->writer());
    -
    1371  }
    -
    1372  return true;
    -
    1373 }
    -
    1374 
    -
    1375 uint32_t ElementaryStreamDescriptor::ComputeSizeInternal() {
    -
    1376  // This box is optional. Skip it if not initialized.
    -
    1377  if (es_descriptor.object_type() == kForbidden)
    -
    1378  return 0;
    -
    1379  return HeaderSize() + es_descriptor.ComputeSize();
    -
    1380 }
    -
    1381 
    -
    1382 DTSSpecific::DTSSpecific()
    -
    1383  : sampling_frequency(0),
    -
    1384  max_bitrate(0),
    -
    1385  avg_bitrate(0),
    -
    1386  pcm_sample_depth(0) {}
    -
    1387 DTSSpecific::~DTSSpecific() {}
    -
    1388 FourCC DTSSpecific::BoxType() const { return FOURCC_DDTS; }
    -
    1389 
    -
    1390 bool DTSSpecific::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1391  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1392  buffer->ReadWriteUInt32(&sampling_frequency) &&
    -
    1393  buffer->ReadWriteUInt32(&max_bitrate) &&
    -
    1394  buffer->ReadWriteUInt32(&avg_bitrate) &&
    -
    1395  buffer->ReadWriteUInt8(&pcm_sample_depth));
    -
    1396 
    -
    1397  if (buffer->Reading()) {
    -
    1398  RCHECK(buffer->ReadWriteVector(&extra_data, buffer->Size() - buffer->Pos()));
    -
    1399  } else {
    -
    1400  if (extra_data.empty()) {
    -
    1401  extra_data.assign(kDdtsExtraData,
    -
    1402  kDdtsExtraData + sizeof(kDdtsExtraData));
    -
    1403  }
    -
    1404  RCHECK(buffer->ReadWriteVector(&extra_data, extra_data.size()));
    -
    1405  }
    -
    1406  return true;
    -
    1407 }
    -
    1408 
    -
    1409 uint32_t DTSSpecific::ComputeSizeInternal() {
    -
    1410  // This box is optional. Skip it if not initialized.
    -
    1411  if (sampling_frequency == 0)
    -
    1412  return 0;
    -
    1413  return HeaderSize() + sizeof(sampling_frequency) + sizeof(max_bitrate) +
    -
    1414  sizeof(avg_bitrate) + sizeof(pcm_sample_depth) +
    -
    1415  sizeof(kDdtsExtraData);
    -
    1416 }
    -
    1417 
    -
    1418 AudioSampleEntry::AudioSampleEntry()
    -
    1419  : format(FOURCC_NULL),
    -
    1420  data_reference_index(1),
    -
    1421  channelcount(2),
    -
    1422  samplesize(16),
    -
    1423  samplerate(0) {}
    -
    1424 
    -
    1425 AudioSampleEntry::~AudioSampleEntry() {}
    -
    1426 
    - -
    1428  if (format == FOURCC_NULL) {
    -
    1429  LOG(ERROR) << "AudioSampleEntry should be parsed according to the "
    -
    1430  << "handler type recovered in its Media ancestor.";
    -
    1431  }
    -
    1432  return format;
    -
    1433 }
    -
    1434 
    -
    1435 bool AudioSampleEntry::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1436  if (buffer->Reading()) {
    -
    1437  DCHECK(buffer->reader());
    -
    1438  format = buffer->reader()->type();
    -
    1439  } else {
    -
    1440  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    1441  }
    -
    1442 
    -
    1443  // Convert from integer to 16.16 fixed point for writing.
    -
    1444  samplerate <<= 16;
    -
    1445  RCHECK(buffer->IgnoreBytes(6) && // reserved.
    -
    1446  buffer->ReadWriteUInt16(&data_reference_index) &&
    -
    1447  buffer->IgnoreBytes(8) && // reserved.
    -
    1448  buffer->ReadWriteUInt16(&channelcount) &&
    -
    1449  buffer->ReadWriteUInt16(&samplesize) &&
    -
    1450  buffer->IgnoreBytes(4) && // predefined.
    -
    1451  buffer->ReadWriteUInt32(&samplerate));
    -
    1452  // Convert from 16.16 fixed point to integer.
    -
    1453  samplerate >>= 16;
    +
    1301  buffer->ReadWriteUInt32(&video_resolution) &&
    +
    1302  buffer->IgnoreBytes(4) && // reserved.
    +
    1303  buffer->ReadWriteUInt16(&video_frame_count) &&
    +
    1304  buffer->ReadWriteVector(&compressor_name, kCompressorNameSize) &&
    +
    1305  buffer->ReadWriteUInt16(&video_depth) &&
    +
    1306  buffer->ReadWriteInt16(&predefined));
    +
    1307 
    +
    1308  RCHECK(buffer->PrepareChildren());
    +
    1309 
    +
    1310  if (format == FOURCC_ENCV) {
    +
    1311  if (buffer->Reading()) {
    +
    1312  // Continue scanning until a recognized protection scheme is found,
    +
    1313  // or until we run out of protection schemes.
    +
    1314  while (sinf.type.type != FOURCC_CENC) {
    +
    1315  if (!buffer->ReadWriteChild(&sinf))
    +
    1316  return false;
    +
    1317  }
    +
    1318  } else {
    +
    1319  RCHECK(buffer->ReadWriteChild(&sinf));
    +
    1320  }
    +
    1321  }
    +
    1322 
    +
    1323  const FourCC actual_format = GetActualFormat();
    +
    1324  switch (actual_format) {
    +
    1325  case FOURCC_AVC1:
    +
    1326  codec_config_record.box_type = FOURCC_AVCC;
    +
    1327  break;
    +
    1328  case FOURCC_HEV1:
    +
    1329  case FOURCC_HVC1:
    +
    1330  codec_config_record.box_type = FOURCC_HVCC;
    +
    1331  break;
    +
    1332  case FOURCC_VP08:
    +
    1333  case FOURCC_VP09:
    +
    1334  case FOURCC_VP10:
    +
    1335  codec_config_record.box_type = FOURCC_VPCC;
    +
    1336  break;
    +
    1337  default:
    +
    1338  LOG(ERROR) << FourCCToString(actual_format) << " is not supported.";
    +
    1339  return false;
    +
    1340  }
    +
    1341  RCHECK(buffer->ReadWriteChild(&codec_config_record));
    +
    1342  RCHECK(buffer->TryReadWriteChild(&pixel_aspect));
    +
    1343  return true;
    +
    1344 }
    +
    1345 
    +
    1346 uint32_t VideoSampleEntry::ComputeSizeInternal() {
    +
    1347  return HeaderSize() + sizeof(data_reference_index) + sizeof(width) +
    +
    1348  sizeof(height) + sizeof(kVideoResolution) * 2 +
    +
    1349  sizeof(kVideoFrameCount) + sizeof(kVideoDepth) +
    +
    1350  pixel_aspect.ComputeSize() + sinf.ComputeSize() +
    +
    1351  codec_config_record.ComputeSize() + kCompressorNameSize + 6 + 4 + 16 +
    +
    1352  2; // 6 + 4 bytes reserved, 16 + 2 bytes predefined.
    +
    1353 }
    +
    1354 
    +
    1355 ElementaryStreamDescriptor::ElementaryStreamDescriptor() {}
    +
    1356 ElementaryStreamDescriptor::~ElementaryStreamDescriptor() {}
    +
    1357 FourCC ElementaryStreamDescriptor::BoxType() const { return FOURCC_ESDS; }
    +
    1358 
    +
    1359 bool ElementaryStreamDescriptor::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1360  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    1361  if (buffer->Reading()) {
    +
    1362  std::vector<uint8_t> data;
    +
    1363  RCHECK(buffer->ReadWriteVector(&data, buffer->BytesLeft()));
    +
    1364  RCHECK(es_descriptor.Parse(data));
    +
    1365  if (es_descriptor.IsAAC()) {
    +
    1366  RCHECK(aac_audio_specific_config.Parse(
    +
    1367  es_descriptor.decoder_specific_info()));
    +
    1368  }
    +
    1369  } else {
    +
    1370  DCHECK(buffer->writer());
    +
    1371  es_descriptor.Write(buffer->writer());
    +
    1372  }
    +
    1373  return true;
    +
    1374 }
    +
    1375 
    +
    1376 uint32_t ElementaryStreamDescriptor::ComputeSizeInternal() {
    +
    1377  // This box is optional. Skip it if not initialized.
    +
    1378  if (es_descriptor.object_type() == kForbidden)
    +
    1379  return 0;
    +
    1380  return HeaderSize() + es_descriptor.ComputeSize();
    +
    1381 }
    +
    1382 
    +
    1383 DTSSpecific::DTSSpecific()
    +
    1384  : sampling_frequency(0),
    +
    1385  max_bitrate(0),
    +
    1386  avg_bitrate(0),
    +
    1387  pcm_sample_depth(0) {}
    +
    1388 DTSSpecific::~DTSSpecific() {}
    +
    1389 FourCC DTSSpecific::BoxType() const { return FOURCC_DDTS; }
    +
    1390 
    +
    1391 bool DTSSpecific::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1392  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1393  buffer->ReadWriteUInt32(&sampling_frequency) &&
    +
    1394  buffer->ReadWriteUInt32(&max_bitrate) &&
    +
    1395  buffer->ReadWriteUInt32(&avg_bitrate) &&
    +
    1396  buffer->ReadWriteUInt8(&pcm_sample_depth));
    +
    1397 
    +
    1398  if (buffer->Reading()) {
    +
    1399  RCHECK(buffer->ReadWriteVector(&extra_data, buffer->BytesLeft()));
    +
    1400  } else {
    +
    1401  if (extra_data.empty()) {
    +
    1402  extra_data.assign(kDdtsExtraData,
    +
    1403  kDdtsExtraData + sizeof(kDdtsExtraData));
    +
    1404  }
    +
    1405  RCHECK(buffer->ReadWriteVector(&extra_data, extra_data.size()));
    +
    1406  }
    +
    1407  return true;
    +
    1408 }
    +
    1409 
    +
    1410 uint32_t DTSSpecific::ComputeSizeInternal() {
    +
    1411  // This box is optional. Skip it if not initialized.
    +
    1412  if (sampling_frequency == 0)
    +
    1413  return 0;
    +
    1414  return HeaderSize() + sizeof(sampling_frequency) + sizeof(max_bitrate) +
    +
    1415  sizeof(avg_bitrate) + sizeof(pcm_sample_depth) +
    +
    1416  sizeof(kDdtsExtraData);
    +
    1417 }
    +
    1418 
    +
    1419 AC3Specific::AC3Specific() {}
    +
    1420 AC3Specific::~AC3Specific() {}
    +
    1421 
    +
    1422 FourCC AC3Specific::BoxType() const { return FOURCC_DAC3; }
    +
    1423 
    +
    1424 bool AC3Specific::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1425  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1426  buffer->ReadWriteVector(
    +
    1427  &data, buffer->Reading() ? buffer->BytesLeft() : data.size()));
    +
    1428  return true;
    +
    1429 }
    +
    1430 
    +
    1431 uint32_t AC3Specific::ComputeSizeInternal() {
    +
    1432  // This box is optional. Skip it if not initialized.
    +
    1433  if (data.empty())
    +
    1434  return 0;
    +
    1435  return HeaderSize() + data.size();
    +
    1436 }
    +
    1437 
    +
    1438 AudioSampleEntry::AudioSampleEntry()
    +
    1439  : format(FOURCC_NULL),
    +
    1440  data_reference_index(1),
    +
    1441  channelcount(2),
    +
    1442  samplesize(16),
    +
    1443  samplerate(0) {}
    +
    1444 
    +
    1445 AudioSampleEntry::~AudioSampleEntry() {}
    +
    1446 
    + +
    1448  if (format == FOURCC_NULL) {
    +
    1449  LOG(ERROR) << "AudioSampleEntry should be parsed according to the "
    +
    1450  << "handler type recovered in its Media ancestor.";
    +
    1451  }
    +
    1452  return format;
    +
    1453 }
    1454 
    -
    1455  RCHECK(buffer->PrepareChildren());
    -
    1456  if (format == FOURCC_ENCA) {
    -
    1457  if (buffer->Reading()) {
    -
    1458  // Continue scanning until a recognized protection scheme is found,
    -
    1459  // or until we run out of protection schemes.
    -
    1460  while (sinf.type.type != FOURCC_CENC) {
    -
    1461  if (!buffer->ReadWriteChild(&sinf))
    -
    1462  return false;
    -
    1463  }
    -
    1464  } else {
    -
    1465  RCHECK(buffer->ReadWriteChild(&sinf));
    -
    1466  }
    -
    1467  }
    -
    1468 
    -
    1469  RCHECK(buffer->TryReadWriteChild(&esds));
    -
    1470  RCHECK(buffer->TryReadWriteChild(&ddts));
    -
    1471  return true;
    -
    1472 }
    -
    1473 
    -
    1474 uint32_t AudioSampleEntry::ComputeSizeInternal() {
    -
    1475  return HeaderSize() + sizeof(data_reference_index) + sizeof(channelcount) +
    -
    1476  sizeof(samplesize) + sizeof(samplerate) + sinf.ComputeSize() +
    -
    1477  esds.ComputeSize() + ddts.ComputeSize() + 6 +
    -
    1478  8 + // 6 + 8 bytes reserved.
    -
    1479  4; // 4 bytes predefined.
    -
    1480 }
    -
    1481 
    -
    1482 WebVTTConfigurationBox::WebVTTConfigurationBox() {}
    -
    1483 WebVTTConfigurationBox::~WebVTTConfigurationBox() {}
    -
    1484 
    - -
    1486  return FOURCC_vttC;
    -
    1487 }
    +
    1455 bool AudioSampleEntry::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1456  if (buffer->Reading()) {
    +
    1457  DCHECK(buffer->reader());
    +
    1458  format = buffer->reader()->type();
    +
    1459  } else {
    +
    1460  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    1461  }
    +
    1462 
    +
    1463  // Convert from integer to 16.16 fixed point for writing.
    +
    1464  samplerate <<= 16;
    +
    1465  RCHECK(buffer->IgnoreBytes(6) && // reserved.
    +
    1466  buffer->ReadWriteUInt16(&data_reference_index) &&
    +
    1467  buffer->IgnoreBytes(8) && // reserved.
    +
    1468  buffer->ReadWriteUInt16(&channelcount) &&
    +
    1469  buffer->ReadWriteUInt16(&samplesize) &&
    +
    1470  buffer->IgnoreBytes(4) && // predefined.
    +
    1471  buffer->ReadWriteUInt32(&samplerate));
    +
    1472  // Convert from 16.16 fixed point to integer.
    +
    1473  samplerate >>= 16;
    +
    1474 
    +
    1475  RCHECK(buffer->PrepareChildren());
    +
    1476  if (format == FOURCC_ENCA) {
    +
    1477  if (buffer->Reading()) {
    +
    1478  // Continue scanning until a recognized protection scheme is found,
    +
    1479  // or until we run out of protection schemes.
    +
    1480  while (sinf.type.type != FOURCC_CENC) {
    +
    1481  if (!buffer->ReadWriteChild(&sinf))
    +
    1482  return false;
    +
    1483  }
    +
    1484  } else {
    +
    1485  RCHECK(buffer->ReadWriteChild(&sinf));
    +
    1486  }
    +
    1487  }
    1488 
    -
    1489 bool WebVTTConfigurationBox::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1490  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    1491  return buffer->ReadWriteString(
    -
    1492  &config,
    -
    1493  buffer->Reading() ? buffer->BytesLeft() : config.size());
    -
    1494 }
    -
    1495 
    -
    1496 uint32_t WebVTTConfigurationBox::ComputeSizeInternal() {
    -
    1497  return HeaderSize() + config.size();
    -
    1498 }
    -
    1499 
    -
    1500 WebVTTSourceLabelBox::WebVTTSourceLabelBox() {}
    -
    1501 WebVTTSourceLabelBox::~WebVTTSourceLabelBox() {}
    +
    1489  RCHECK(buffer->TryReadWriteChild(&esds));
    +
    1490  RCHECK(buffer->TryReadWriteChild(&ddts));
    +
    1491  RCHECK(buffer->TryReadWriteChild(&dac3));
    +
    1492  return true;
    +
    1493 }
    +
    1494 
    +
    1495 uint32_t AudioSampleEntry::ComputeSizeInternal() {
    +
    1496  return HeaderSize() + sizeof(data_reference_index) + sizeof(channelcount) +
    +
    1497  sizeof(samplesize) + sizeof(samplerate) + sinf.ComputeSize() +
    +
    1498  esds.ComputeSize() + ddts.ComputeSize() + dac3.ComputeSize() +
    +
    1499  6 + 8 + // 6 + 8 bytes reserved.
    +
    1500  4; // 4 bytes predefined.
    +
    1501 }
    1502 
    - -
    1504  return FOURCC_vlab;
    -
    1505 }
    -
    1506 
    -
    1507 bool WebVTTSourceLabelBox::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1508  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    1509  return buffer->ReadWriteString(&source_label, buffer->Reading()
    -
    1510  ? buffer->BytesLeft()
    -
    1511  : source_label.size());
    -
    1512 }
    -
    1513 
    -
    1514 uint32_t WebVTTSourceLabelBox::ComputeSizeInternal() {
    -
    1515  if (source_label.empty())
    -
    1516  return 0;
    -
    1517  return HeaderSize() + source_label.size();
    -
    1518 }
    -
    1519 
    -
    1520 WVTTSampleEntry::WVTTSampleEntry() {}
    -
    1521 WVTTSampleEntry::~WVTTSampleEntry() {}
    -
    1522 
    - -
    1524  return FOURCC_wvtt;
    -
    1525 }
    -
    1526 
    -
    1527 bool WVTTSampleEntry::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1528  // TODO(rkuroiwa): Handle the optional MPEG4BitRateBox.
    -
    1529  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1530  buffer->IgnoreBytes(6) && // reserved for SampleEntry.
    -
    1531  buffer->ReadWriteUInt16(&data_reference_index) &&
    -
    1532  buffer->PrepareChildren() &&
    -
    1533  buffer->ReadWriteChild(&config) &&
    -
    1534  buffer->ReadWriteChild(&label));
    -
    1535  return true;
    -
    1536 }
    -
    1537 
    -
    1538 uint32_t WVTTSampleEntry::ComputeSizeInternal() {
    -
    1539  // 6 for the (anonymous) reserved bytes for SampleEntry class.
    -
    1540  return HeaderSize() + 6 + sizeof(data_reference_index) +
    -
    1541  config.ComputeSize() + label.ComputeSize();
    -
    1542 }
    +
    1503 WebVTTConfigurationBox::WebVTTConfigurationBox() {}
    +
    1504 WebVTTConfigurationBox::~WebVTTConfigurationBox() {}
    +
    1505 
    + +
    1507  return FOURCC_vttC;
    +
    1508 }
    +
    1509 
    +
    1510 bool WebVTTConfigurationBox::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1511  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    1512  return buffer->ReadWriteString(
    +
    1513  &config,
    +
    1514  buffer->Reading() ? buffer->BytesLeft() : config.size());
    +
    1515 }
    +
    1516 
    +
    1517 uint32_t WebVTTConfigurationBox::ComputeSizeInternal() {
    +
    1518  return HeaderSize() + config.size();
    +
    1519 }
    +
    1520 
    +
    1521 WebVTTSourceLabelBox::WebVTTSourceLabelBox() {}
    +
    1522 WebVTTSourceLabelBox::~WebVTTSourceLabelBox() {}
    +
    1523 
    + +
    1525  return FOURCC_vlab;
    +
    1526 }
    +
    1527 
    +
    1528 bool WebVTTSourceLabelBox::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1529  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    1530  return buffer->ReadWriteString(&source_label, buffer->Reading()
    +
    1531  ? buffer->BytesLeft()
    +
    1532  : source_label.size());
    +
    1533 }
    +
    1534 
    +
    1535 uint32_t WebVTTSourceLabelBox::ComputeSizeInternal() {
    +
    1536  if (source_label.empty())
    +
    1537  return 0;
    +
    1538  return HeaderSize() + source_label.size();
    +
    1539 }
    +
    1540 
    +
    1541 WVTTSampleEntry::WVTTSampleEntry() {}
    +
    1542 WVTTSampleEntry::~WVTTSampleEntry() {}
    1543 
    -
    1544 MediaHeader::MediaHeader()
    -
    1545  : creation_time(0), modification_time(0), timescale(0), duration(0) {}
    -
    1546 MediaHeader::~MediaHeader() {}
    -
    1547 FourCC MediaHeader::BoxType() const { return FOURCC_MDHD; }
    -
    1548 
    -
    1549 bool MediaHeader::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1550  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    1551 
    -
    1552  uint8_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    -
    1553  RCHECK(buffer->ReadWriteUInt64NBytes(&creation_time, num_bytes) &&
    -
    1554  buffer->ReadWriteUInt64NBytes(&modification_time, num_bytes) &&
    -
    1555  buffer->ReadWriteUInt32(&timescale) &&
    -
    1556  buffer->ReadWriteUInt64NBytes(&duration, num_bytes) &&
    -
    1557  language.ReadWrite(buffer) &&
    -
    1558  buffer->IgnoreBytes(2)); // predefined.
    -
    1559  return true;
    -
    1560 }
    -
    1561 
    -
    1562 uint32_t MediaHeader::ComputeSizeInternal() {
    -
    1563  version = IsFitIn32Bits(creation_time, modification_time, duration) ? 0 : 1;
    -
    1564  return HeaderSize() + sizeof(timescale) +
    -
    1565  sizeof(uint32_t) * (1 + version) * 3 + language.ComputeSize() +
    -
    1566  2; // 2 bytes predefined.
    -
    1567 }
    -
    1568 
    -
    1569 VideoMediaHeader::VideoMediaHeader()
    -
    1570  : graphicsmode(0), opcolor_red(0), opcolor_green(0), opcolor_blue(0) {
    -
    1571  const uint32_t kVideoMediaHeaderFlags = 1;
    -
    1572  flags = kVideoMediaHeaderFlags;
    -
    1573 }
    -
    1574 VideoMediaHeader::~VideoMediaHeader() {}
    -
    1575 FourCC VideoMediaHeader::BoxType() const { return FOURCC_VMHD; }
    -
    1576 bool VideoMediaHeader::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1577  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1578  buffer->ReadWriteUInt16(&graphicsmode) &&
    -
    1579  buffer->ReadWriteUInt16(&opcolor_red) &&
    -
    1580  buffer->ReadWriteUInt16(&opcolor_green) &&
    -
    1581  buffer->ReadWriteUInt16(&opcolor_blue));
    -
    1582  return true;
    -
    1583 }
    -
    1584 
    -
    1585 uint32_t VideoMediaHeader::ComputeSizeInternal() {
    -
    1586  return HeaderSize() + sizeof(graphicsmode) + sizeof(opcolor_red) +
    -
    1587  sizeof(opcolor_green) + sizeof(opcolor_blue);
    + +
    1545  return FOURCC_wvtt;
    +
    1546 }
    +
    1547 
    +
    1548 bool WVTTSampleEntry::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1549  // TODO(rkuroiwa): Handle the optional MPEG4BitRateBox.
    +
    1550  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1551  buffer->IgnoreBytes(6) && // reserved for SampleEntry.
    +
    1552  buffer->ReadWriteUInt16(&data_reference_index) &&
    +
    1553  buffer->PrepareChildren() &&
    +
    1554  buffer->ReadWriteChild(&config) &&
    +
    1555  buffer->ReadWriteChild(&label));
    +
    1556  return true;
    +
    1557 }
    +
    1558 
    +
    1559 uint32_t WVTTSampleEntry::ComputeSizeInternal() {
    +
    1560  // 6 for the (anonymous) reserved bytes for SampleEntry class.
    +
    1561  return HeaderSize() + 6 + sizeof(data_reference_index) +
    +
    1562  config.ComputeSize() + label.ComputeSize();
    +
    1563 }
    +
    1564 
    +
    1565 MediaHeader::MediaHeader()
    +
    1566  : creation_time(0), modification_time(0), timescale(0), duration(0) {}
    +
    1567 MediaHeader::~MediaHeader() {}
    +
    1568 FourCC MediaHeader::BoxType() const { return FOURCC_MDHD; }
    +
    1569 
    +
    1570 bool MediaHeader::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1571  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    1572 
    +
    1573  uint8_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    +
    1574  RCHECK(buffer->ReadWriteUInt64NBytes(&creation_time, num_bytes) &&
    +
    1575  buffer->ReadWriteUInt64NBytes(&modification_time, num_bytes) &&
    +
    1576  buffer->ReadWriteUInt32(&timescale) &&
    +
    1577  buffer->ReadWriteUInt64NBytes(&duration, num_bytes) &&
    +
    1578  language.ReadWrite(buffer) &&
    +
    1579  buffer->IgnoreBytes(2)); // predefined.
    +
    1580  return true;
    +
    1581 }
    +
    1582 
    +
    1583 uint32_t MediaHeader::ComputeSizeInternal() {
    +
    1584  version = IsFitIn32Bits(creation_time, modification_time, duration) ? 0 : 1;
    +
    1585  return HeaderSize() + sizeof(timescale) +
    +
    1586  sizeof(uint32_t) * (1 + version) * 3 + language.ComputeSize() +
    +
    1587  2; // 2 bytes predefined.
    1588 }
    1589 
    -
    1590 SoundMediaHeader::SoundMediaHeader() : balance(0) {}
    -
    1591 SoundMediaHeader::~SoundMediaHeader() {}
    -
    1592 FourCC SoundMediaHeader::BoxType() const { return FOURCC_SMHD; }
    -
    1593 bool SoundMediaHeader::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1594  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1595  buffer->ReadWriteUInt16(&balance) &&
    -
    1596  buffer->IgnoreBytes(2)); // reserved.
    -
    1597  return true;
    -
    1598 }
    -
    1599 
    -
    1600 uint32_t SoundMediaHeader::ComputeSizeInternal() {
    -
    1601  return HeaderSize() + sizeof(balance) + sizeof(uint16_t);
    -
    1602 }
    -
    1603 
    -
    1604 SubtitleMediaHeader::SubtitleMediaHeader() {}
    -
    1605 SubtitleMediaHeader::~SubtitleMediaHeader() {}
    -
    1606 
    -
    1607 FourCC SubtitleMediaHeader::BoxType() const { return FOURCC_sthd; }
    -
    1608 
    -
    1609 bool SubtitleMediaHeader::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1610  return ReadWriteHeaderInternal(buffer);
    -
    1611 }
    -
    1612 
    -
    1613 uint32_t SubtitleMediaHeader::ComputeSizeInternal() {
    -
    1614  return HeaderSize();
    -
    1615 }
    -
    1616 
    -
    1617 DataEntryUrl::DataEntryUrl() {
    -
    1618  const uint32_t kDataEntryUrlFlags = 1;
    -
    1619  flags = kDataEntryUrlFlags;
    -
    1620 }
    -
    1621 DataEntryUrl::~DataEntryUrl() {}
    -
    1622 FourCC DataEntryUrl::BoxType() const { return FOURCC_URL; }
    -
    1623 bool DataEntryUrl::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1624  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    1625  if (buffer->Reading()) {
    -
    1626  RCHECK(buffer->ReadWriteVector(&location, buffer->Size() - buffer->Pos()));
    -
    1627  } else {
    -
    1628  RCHECK(buffer->ReadWriteVector(&location, location.size()));
    -
    1629  }
    -
    1630  return true;
    -
    1631 }
    -
    1632 
    -
    1633 uint32_t DataEntryUrl::ComputeSizeInternal() {
    -
    1634  return HeaderSize() + location.size();
    -
    1635 }
    -
    1636 
    -
    1637 DataReference::DataReference() {
    -
    1638  // Default 1 entry.
    -
    1639  data_entry.resize(1);
    -
    1640 }
    -
    1641 DataReference::~DataReference() {}
    -
    1642 FourCC DataReference::BoxType() const { return FOURCC_DREF; }
    -
    1643 bool DataReference::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1644  uint32_t entry_count = data_entry.size();
    -
    1645  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1646  buffer->ReadWriteUInt32(&entry_count));
    -
    1647  data_entry.resize(entry_count);
    -
    1648  RCHECK(buffer->PrepareChildren());
    -
    1649  for (uint32_t i = 0; i < entry_count; ++i)
    -
    1650  RCHECK(buffer->ReadWriteChild(&data_entry[i]));
    +
    1590 VideoMediaHeader::VideoMediaHeader()
    +
    1591  : graphicsmode(0), opcolor_red(0), opcolor_green(0), opcolor_blue(0) {
    +
    1592  const uint32_t kVideoMediaHeaderFlags = 1;
    +
    1593  flags = kVideoMediaHeaderFlags;
    +
    1594 }
    +
    1595 VideoMediaHeader::~VideoMediaHeader() {}
    +
    1596 FourCC VideoMediaHeader::BoxType() const { return FOURCC_VMHD; }
    +
    1597 bool VideoMediaHeader::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1598  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1599  buffer->ReadWriteUInt16(&graphicsmode) &&
    +
    1600  buffer->ReadWriteUInt16(&opcolor_red) &&
    +
    1601  buffer->ReadWriteUInt16(&opcolor_green) &&
    +
    1602  buffer->ReadWriteUInt16(&opcolor_blue));
    +
    1603  return true;
    +
    1604 }
    +
    1605 
    +
    1606 uint32_t VideoMediaHeader::ComputeSizeInternal() {
    +
    1607  return HeaderSize() + sizeof(graphicsmode) + sizeof(opcolor_red) +
    +
    1608  sizeof(opcolor_green) + sizeof(opcolor_blue);
    +
    1609 }
    +
    1610 
    +
    1611 SoundMediaHeader::SoundMediaHeader() : balance(0) {}
    +
    1612 SoundMediaHeader::~SoundMediaHeader() {}
    +
    1613 FourCC SoundMediaHeader::BoxType() const { return FOURCC_SMHD; }
    +
    1614 bool SoundMediaHeader::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1615  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1616  buffer->ReadWriteUInt16(&balance) &&
    +
    1617  buffer->IgnoreBytes(2)); // reserved.
    +
    1618  return true;
    +
    1619 }
    +
    1620 
    +
    1621 uint32_t SoundMediaHeader::ComputeSizeInternal() {
    +
    1622  return HeaderSize() + sizeof(balance) + sizeof(uint16_t);
    +
    1623 }
    +
    1624 
    +
    1625 SubtitleMediaHeader::SubtitleMediaHeader() {}
    +
    1626 SubtitleMediaHeader::~SubtitleMediaHeader() {}
    +
    1627 
    +
    1628 FourCC SubtitleMediaHeader::BoxType() const { return FOURCC_sthd; }
    +
    1629 
    +
    1630 bool SubtitleMediaHeader::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1631  return ReadWriteHeaderInternal(buffer);
    +
    1632 }
    +
    1633 
    +
    1634 uint32_t SubtitleMediaHeader::ComputeSizeInternal() {
    +
    1635  return HeaderSize();
    +
    1636 }
    +
    1637 
    +
    1638 DataEntryUrl::DataEntryUrl() {
    +
    1639  const uint32_t kDataEntryUrlFlags = 1;
    +
    1640  flags = kDataEntryUrlFlags;
    +
    1641 }
    +
    1642 DataEntryUrl::~DataEntryUrl() {}
    +
    1643 FourCC DataEntryUrl::BoxType() const { return FOURCC_URL; }
    +
    1644 bool DataEntryUrl::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1645  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    1646  if (buffer->Reading()) {
    +
    1647  RCHECK(buffer->ReadWriteVector(&location, buffer->BytesLeft()));
    +
    1648  } else {
    +
    1649  RCHECK(buffer->ReadWriteVector(&location, location.size()));
    +
    1650  }
    1651  return true;
    1652 }
    1653 
    -
    1654 uint32_t DataReference::ComputeSizeInternal() {
    -
    1655  uint32_t count = data_entry.size();
    -
    1656  uint32_t box_size = HeaderSize() + sizeof(count);
    -
    1657  for (uint32_t i = 0; i < count; ++i)
    -
    1658  box_size += data_entry[i].ComputeSize();
    -
    1659  return box_size;
    -
    1660 }
    -
    1661 
    -
    1662 DataInformation::DataInformation() {}
    -
    1663 DataInformation::~DataInformation() {}
    -
    1664 FourCC DataInformation::BoxType() const { return FOURCC_DINF; }
    -
    1665 
    -
    1666 bool DataInformation::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1667  return ReadWriteHeaderInternal(buffer) &&
    -
    1668  buffer->PrepareChildren() &&
    -
    1669  buffer->ReadWriteChild(&dref);
    -
    1670 }
    -
    1671 
    -
    1672 uint32_t DataInformation::ComputeSizeInternal() {
    -
    1673  return HeaderSize() + dref.ComputeSize();
    -
    1674 }
    -
    1675 
    -
    1676 MediaInformation::MediaInformation() {}
    -
    1677 MediaInformation::~MediaInformation() {}
    -
    1678 FourCC MediaInformation::BoxType() const { return FOURCC_MINF; }
    -
    1679 
    -
    1680 bool MediaInformation::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1681  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1682  buffer->PrepareChildren() &&
    -
    1683  buffer->ReadWriteChild(&dinf) &&
    -
    1684  buffer->ReadWriteChild(&sample_table));
    -
    1685  switch (sample_table.description.type) {
    -
    1686  case kVideo:
    -
    1687  RCHECK(buffer->ReadWriteChild(&vmhd));
    -
    1688  break;
    -
    1689  case kAudio:
    -
    1690  RCHECK(buffer->ReadWriteChild(&smhd));
    -
    1691  break;
    -
    1692  case kText:
    -
    1693  RCHECK(buffer->ReadWriteChild(&sthd));
    -
    1694  break;
    -
    1695  default:
    -
    1696  NOTIMPLEMENTED();
    -
    1697  }
    -
    1698  // Hint is not supported for now.
    -
    1699  return true;
    -
    1700 }
    -
    1701 
    -
    1702 uint32_t MediaInformation::ComputeSizeInternal() {
    -
    1703  uint32_t box_size =
    -
    1704  HeaderSize() + dinf.ComputeSize() + sample_table.ComputeSize();
    -
    1705  switch (sample_table.description.type) {
    -
    1706  case kVideo:
    -
    1707  box_size += vmhd.ComputeSize();
    -
    1708  break;
    -
    1709  case kAudio:
    -
    1710  box_size += smhd.ComputeSize();
    -
    1711  break;
    -
    1712  case kText:
    -
    1713  box_size += sthd.ComputeSize();
    -
    1714  break;
    -
    1715  default:
    -
    1716  NOTIMPLEMENTED();
    -
    1717  }
    -
    1718  return box_size;
    -
    1719 }
    -
    1720 
    -
    1721 Media::Media() {}
    -
    1722 Media::~Media() {}
    -
    1723 FourCC Media::BoxType() const { return FOURCC_MDIA; }
    -
    1724 
    -
    1725 bool Media::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1726  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1727  buffer->PrepareChildren() &&
    -
    1728  buffer->ReadWriteChild(&header));
    -
    1729  if (buffer->Reading()) {
    -
    1730  RCHECK(buffer->ReadWriteChild(&handler));
    -
    1731  // Maddeningly, the HandlerReference box specifies how to parse the
    -
    1732  // SampleDescription box, making the latter the only box (of those that we
    -
    1733  // support) which cannot be parsed correctly on its own (or even with
    -
    1734  // information from its strict ancestor tree). We thus copy the handler type
    -
    1735  // to the sample description box *before* parsing it to provide this
    -
    1736  // information while parsing.
    -
    1737  information.sample_table.description.type =
    -
    1738  FourCCToTrackType(handler.handler_type);
    -
    1739  } else {
    -
    1740  handler.handler_type =
    -
    1741  TrackTypeToFourCC(information.sample_table.description.type);
    -
    1742  RCHECK(handler.handler_type != FOURCC_NULL);
    -
    1743  RCHECK(buffer->ReadWriteChild(&handler));
    -
    1744  }
    -
    1745  RCHECK(buffer->ReadWriteChild(&information));
    -
    1746  return true;
    -
    1747 }
    -
    1748 
    -
    1749 uint32_t Media::ComputeSizeInternal() {
    -
    1750  handler.handler_type =
    -
    1751  TrackTypeToFourCC(information.sample_table.description.type);
    -
    1752  return HeaderSize() + header.ComputeSize() + handler.ComputeSize() +
    -
    1753  information.ComputeSize();
    -
    1754 }
    -
    1755 
    -
    1756 Track::Track() {}
    -
    1757 Track::~Track() {}
    -
    1758 FourCC Track::BoxType() const { return FOURCC_TRAK; }
    -
    1759 
    -
    1760 bool Track::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1761  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1762  buffer->PrepareChildren() &&
    -
    1763  buffer->ReadWriteChild(&header) &&
    -
    1764  buffer->ReadWriteChild(&media) &&
    -
    1765  buffer->TryReadWriteChild(&edit) &&
    -
    1766  buffer->TryReadWriteChild(&sample_encryption));
    +
    1654 uint32_t DataEntryUrl::ComputeSizeInternal() {
    +
    1655  return HeaderSize() + location.size();
    +
    1656 }
    +
    1657 
    +
    1658 DataReference::DataReference() {
    +
    1659  // Default 1 entry.
    +
    1660  data_entry.resize(1);
    +
    1661 }
    +
    1662 DataReference::~DataReference() {}
    +
    1663 FourCC DataReference::BoxType() const { return FOURCC_DREF; }
    +
    1664 bool DataReference::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1665  uint32_t entry_count = data_entry.size();
    +
    1666  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1667  buffer->ReadWriteUInt32(&entry_count));
    +
    1668  data_entry.resize(entry_count);
    +
    1669  RCHECK(buffer->PrepareChildren());
    +
    1670  for (uint32_t i = 0; i < entry_count; ++i)
    +
    1671  RCHECK(buffer->ReadWriteChild(&data_entry[i]));
    +
    1672  return true;
    +
    1673 }
    +
    1674 
    +
    1675 uint32_t DataReference::ComputeSizeInternal() {
    +
    1676  uint32_t count = data_entry.size();
    +
    1677  uint32_t box_size = HeaderSize() + sizeof(count);
    +
    1678  for (uint32_t i = 0; i < count; ++i)
    +
    1679  box_size += data_entry[i].ComputeSize();
    +
    1680  return box_size;
    +
    1681 }
    +
    1682 
    +
    1683 DataInformation::DataInformation() {}
    +
    1684 DataInformation::~DataInformation() {}
    +
    1685 FourCC DataInformation::BoxType() const { return FOURCC_DINF; }
    +
    1686 
    +
    1687 bool DataInformation::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1688  return ReadWriteHeaderInternal(buffer) &&
    +
    1689  buffer->PrepareChildren() &&
    +
    1690  buffer->ReadWriteChild(&dref);
    +
    1691 }
    +
    1692 
    +
    1693 uint32_t DataInformation::ComputeSizeInternal() {
    +
    1694  return HeaderSize() + dref.ComputeSize();
    +
    1695 }
    +
    1696 
    +
    1697 MediaInformation::MediaInformation() {}
    +
    1698 MediaInformation::~MediaInformation() {}
    +
    1699 FourCC MediaInformation::BoxType() const { return FOURCC_MINF; }
    +
    1700 
    +
    1701 bool MediaInformation::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1702  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1703  buffer->PrepareChildren() &&
    +
    1704  buffer->ReadWriteChild(&dinf) &&
    +
    1705  buffer->ReadWriteChild(&sample_table));
    +
    1706  switch (sample_table.description.type) {
    +
    1707  case kVideo:
    +
    1708  RCHECK(buffer->ReadWriteChild(&vmhd));
    +
    1709  break;
    +
    1710  case kAudio:
    +
    1711  RCHECK(buffer->ReadWriteChild(&smhd));
    +
    1712  break;
    +
    1713  case kText:
    +
    1714  RCHECK(buffer->ReadWriteChild(&sthd));
    +
    1715  break;
    +
    1716  default:
    +
    1717  NOTIMPLEMENTED();
    +
    1718  }
    +
    1719  // Hint is not supported for now.
    +
    1720  return true;
    +
    1721 }
    +
    1722 
    +
    1723 uint32_t MediaInformation::ComputeSizeInternal() {
    +
    1724  uint32_t box_size =
    +
    1725  HeaderSize() + dinf.ComputeSize() + sample_table.ComputeSize();
    +
    1726  switch (sample_table.description.type) {
    +
    1727  case kVideo:
    +
    1728  box_size += vmhd.ComputeSize();
    +
    1729  break;
    +
    1730  case kAudio:
    +
    1731  box_size += smhd.ComputeSize();
    +
    1732  break;
    +
    1733  case kText:
    +
    1734  box_size += sthd.ComputeSize();
    +
    1735  break;
    +
    1736  default:
    +
    1737  NOTIMPLEMENTED();
    +
    1738  }
    +
    1739  return box_size;
    +
    1740 }
    +
    1741 
    +
    1742 Media::Media() {}
    +
    1743 Media::~Media() {}
    +
    1744 FourCC Media::BoxType() const { return FOURCC_MDIA; }
    +
    1745 
    +
    1746 bool Media::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1747  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1748  buffer->PrepareChildren() &&
    +
    1749  buffer->ReadWriteChild(&header));
    +
    1750  if (buffer->Reading()) {
    +
    1751  RCHECK(buffer->ReadWriteChild(&handler));
    +
    1752  // Maddeningly, the HandlerReference box specifies how to parse the
    +
    1753  // SampleDescription box, making the latter the only box (of those that we
    +
    1754  // support) which cannot be parsed correctly on its own (or even with
    +
    1755  // information from its strict ancestor tree). We thus copy the handler type
    +
    1756  // to the sample description box *before* parsing it to provide this
    +
    1757  // information while parsing.
    +
    1758  information.sample_table.description.type =
    +
    1759  FourCCToTrackType(handler.handler_type);
    +
    1760  } else {
    +
    1761  handler.handler_type =
    +
    1762  TrackTypeToFourCC(information.sample_table.description.type);
    +
    1763  RCHECK(handler.handler_type != FOURCC_NULL);
    +
    1764  RCHECK(buffer->ReadWriteChild(&handler));
    +
    1765  }
    +
    1766  RCHECK(buffer->ReadWriteChild(&information));
    1767  return true;
    1768 }
    1769 
    -
    1770 uint32_t Track::ComputeSizeInternal() {
    -
    1771  return HeaderSize() + header.ComputeSize() + media.ComputeSize() +
    -
    1772  edit.ComputeSize();
    -
    1773 }
    -
    1774 
    -
    1775 MovieExtendsHeader::MovieExtendsHeader() : fragment_duration(0) {}
    -
    1776 MovieExtendsHeader::~MovieExtendsHeader() {}
    -
    1777 FourCC MovieExtendsHeader::BoxType() const { return FOURCC_MEHD; }
    -
    1778 
    -
    1779 bool MovieExtendsHeader::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1780  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    1781  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    -
    1782  RCHECK(buffer->ReadWriteUInt64NBytes(&fragment_duration, num_bytes));
    -
    1783  return true;
    -
    1784 }
    -
    1785 
    -
    1786 uint32_t MovieExtendsHeader::ComputeSizeInternal() {
    -
    1787  // This box is optional. Skip it if it is not used.
    -
    1788  if (fragment_duration == 0)
    -
    1789  return 0;
    -
    1790  version = IsFitIn32Bits(fragment_duration) ? 0 : 1;
    -
    1791  return HeaderSize() + sizeof(uint32_t) * (1 + version);
    -
    1792 }
    -
    1793 
    -
    1794 TrackExtends::TrackExtends()
    -
    1795  : track_id(0),
    -
    1796  default_sample_description_index(0),
    -
    1797  default_sample_duration(0),
    -
    1798  default_sample_size(0),
    -
    1799  default_sample_flags(0) {}
    -
    1800 TrackExtends::~TrackExtends() {}
    -
    1801 FourCC TrackExtends::BoxType() const { return FOURCC_TREX; }
    -
    1802 
    -
    1803 bool TrackExtends::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1804  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1805  buffer->ReadWriteUInt32(&track_id) &&
    -
    1806  buffer->ReadWriteUInt32(&default_sample_description_index) &&
    -
    1807  buffer->ReadWriteUInt32(&default_sample_duration) &&
    -
    1808  buffer->ReadWriteUInt32(&default_sample_size) &&
    -
    1809  buffer->ReadWriteUInt32(&default_sample_flags));
    -
    1810  return true;
    -
    1811 }
    -
    1812 
    -
    1813 uint32_t TrackExtends::ComputeSizeInternal() {
    -
    1814  return HeaderSize() + sizeof(track_id) +
    -
    1815  sizeof(default_sample_description_index) +
    -
    1816  sizeof(default_sample_duration) + sizeof(default_sample_size) +
    -
    1817  sizeof(default_sample_flags);
    -
    1818 }
    -
    1819 
    -
    1820 MovieExtends::MovieExtends() {}
    -
    1821 MovieExtends::~MovieExtends() {}
    -
    1822 FourCC MovieExtends::BoxType() const { return FOURCC_MVEX; }
    +
    1770 uint32_t Media::ComputeSizeInternal() {
    +
    1771  handler.handler_type =
    +
    1772  TrackTypeToFourCC(information.sample_table.description.type);
    +
    1773  return HeaderSize() + header.ComputeSize() + handler.ComputeSize() +
    +
    1774  information.ComputeSize();
    +
    1775 }
    +
    1776 
    +
    1777 Track::Track() {}
    +
    1778 Track::~Track() {}
    +
    1779 FourCC Track::BoxType() const { return FOURCC_TRAK; }
    +
    1780 
    +
    1781 bool Track::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1782  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1783  buffer->PrepareChildren() &&
    +
    1784  buffer->ReadWriteChild(&header) &&
    +
    1785  buffer->ReadWriteChild(&media) &&
    +
    1786  buffer->TryReadWriteChild(&edit) &&
    +
    1787  buffer->TryReadWriteChild(&sample_encryption));
    +
    1788  return true;
    +
    1789 }
    +
    1790 
    +
    1791 uint32_t Track::ComputeSizeInternal() {
    +
    1792  return HeaderSize() + header.ComputeSize() + media.ComputeSize() +
    +
    1793  edit.ComputeSize();
    +
    1794 }
    +
    1795 
    +
    1796 MovieExtendsHeader::MovieExtendsHeader() : fragment_duration(0) {}
    +
    1797 MovieExtendsHeader::~MovieExtendsHeader() {}
    +
    1798 FourCC MovieExtendsHeader::BoxType() const { return FOURCC_MEHD; }
    +
    1799 
    +
    1800 bool MovieExtendsHeader::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1801  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    1802  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    +
    1803  RCHECK(buffer->ReadWriteUInt64NBytes(&fragment_duration, num_bytes));
    +
    1804  return true;
    +
    1805 }
    +
    1806 
    +
    1807 uint32_t MovieExtendsHeader::ComputeSizeInternal() {
    +
    1808  // This box is optional. Skip it if it is not used.
    +
    1809  if (fragment_duration == 0)
    +
    1810  return 0;
    +
    1811  version = IsFitIn32Bits(fragment_duration) ? 0 : 1;
    +
    1812  return HeaderSize() + sizeof(uint32_t) * (1 + version);
    +
    1813 }
    +
    1814 
    +
    1815 TrackExtends::TrackExtends()
    +
    1816  : track_id(0),
    +
    1817  default_sample_description_index(0),
    +
    1818  default_sample_duration(0),
    +
    1819  default_sample_size(0),
    +
    1820  default_sample_flags(0) {}
    +
    1821 TrackExtends::~TrackExtends() {}
    +
    1822 FourCC TrackExtends::BoxType() const { return FOURCC_TREX; }
    1823 
    -
    1824 bool MovieExtends::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1825  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1826  buffer->PrepareChildren() &&
    -
    1827  buffer->TryReadWriteChild(&header));
    -
    1828  if (buffer->Reading()) {
    -
    1829  DCHECK(buffer->reader());
    -
    1830  RCHECK(buffer->reader()->ReadChildren(&tracks));
    -
    1831  } else {
    -
    1832  for (uint32_t i = 0; i < tracks.size(); ++i)
    -
    1833  RCHECK(buffer->ReadWriteChild(&tracks[i]));
    -
    1834  }
    -
    1835  return true;
    -
    1836 }
    -
    1837 
    -
    1838 uint32_t MovieExtends::ComputeSizeInternal() {
    -
    1839  // This box is optional. Skip it if it does not contain any track.
    -
    1840  if (tracks.size() == 0)
    -
    1841  return 0;
    -
    1842  uint32_t box_size = HeaderSize() + header.ComputeSize();
    -
    1843  for (uint32_t i = 0; i < tracks.size(); ++i)
    -
    1844  box_size += tracks[i].ComputeSize();
    -
    1845  return box_size;
    -
    1846 }
    -
    1847 
    -
    1848 Movie::Movie() {}
    -
    1849 Movie::~Movie() {}
    -
    1850 FourCC Movie::BoxType() const { return FOURCC_MOOV; }
    -
    1851 
    -
    1852 bool Movie::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1853  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1854  buffer->PrepareChildren() &&
    -
    1855  buffer->ReadWriteChild(&header) &&
    -
    1856  buffer->TryReadWriteChild(&metadata) &&
    -
    1857  buffer->TryReadWriteChild(&extends));
    -
    1858  if (buffer->Reading()) {
    -
    1859  BoxReader* reader = buffer->reader();
    -
    1860  DCHECK(reader);
    -
    1861  RCHECK(reader->ReadChildren(&tracks) &&
    -
    1862  reader->TryReadChildren(&pssh));
    -
    1863  } else {
    -
    1864  for (uint32_t i = 0; i < tracks.size(); ++i)
    -
    1865  RCHECK(buffer->ReadWriteChild(&tracks[i]));
    -
    1866  for (uint32_t i = 0; i < pssh.size(); ++i)
    -
    1867  RCHECK(buffer->ReadWriteChild(&pssh[i]));
    -
    1868  }
    -
    1869  return true;
    -
    1870 }
    -
    1871 
    -
    1872 uint32_t Movie::ComputeSizeInternal() {
    -
    1873  uint32_t box_size = HeaderSize() + header.ComputeSize() +
    -
    1874  metadata.ComputeSize() + extends.ComputeSize();
    -
    1875  for (uint32_t i = 0; i < tracks.size(); ++i)
    -
    1876  box_size += tracks[i].ComputeSize();
    -
    1877  for (uint32_t i = 0; i < pssh.size(); ++i)
    -
    1878  box_size += pssh[i].ComputeSize();
    -
    1879  return box_size;
    -
    1880 }
    -
    1881 
    -
    1882 TrackFragmentDecodeTime::TrackFragmentDecodeTime() : decode_time(0) {}
    -
    1883 TrackFragmentDecodeTime::~TrackFragmentDecodeTime() {}
    -
    1884 FourCC TrackFragmentDecodeTime::BoxType() const { return FOURCC_TFDT; }
    -
    1885 
    -
    1886 bool TrackFragmentDecodeTime::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1887  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    1888  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    -
    1889  RCHECK(buffer->ReadWriteUInt64NBytes(&decode_time, num_bytes));
    +
    1824 bool TrackExtends::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1825  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1826  buffer->ReadWriteUInt32(&track_id) &&
    +
    1827  buffer->ReadWriteUInt32(&default_sample_description_index) &&
    +
    1828  buffer->ReadWriteUInt32(&default_sample_duration) &&
    +
    1829  buffer->ReadWriteUInt32(&default_sample_size) &&
    +
    1830  buffer->ReadWriteUInt32(&default_sample_flags));
    +
    1831  return true;
    +
    1832 }
    +
    1833 
    +
    1834 uint32_t TrackExtends::ComputeSizeInternal() {
    +
    1835  return HeaderSize() + sizeof(track_id) +
    +
    1836  sizeof(default_sample_description_index) +
    +
    1837  sizeof(default_sample_duration) + sizeof(default_sample_size) +
    +
    1838  sizeof(default_sample_flags);
    +
    1839 }
    +
    1840 
    +
    1841 MovieExtends::MovieExtends() {}
    +
    1842 MovieExtends::~MovieExtends() {}
    +
    1843 FourCC MovieExtends::BoxType() const { return FOURCC_MVEX; }
    +
    1844 
    +
    1845 bool MovieExtends::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1846  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1847  buffer->PrepareChildren() &&
    +
    1848  buffer->TryReadWriteChild(&header));
    +
    1849  if (buffer->Reading()) {
    +
    1850  DCHECK(buffer->reader());
    +
    1851  RCHECK(buffer->reader()->ReadChildren(&tracks));
    +
    1852  } else {
    +
    1853  for (uint32_t i = 0; i < tracks.size(); ++i)
    +
    1854  RCHECK(buffer->ReadWriteChild(&tracks[i]));
    +
    1855  }
    +
    1856  return true;
    +
    1857 }
    +
    1858 
    +
    1859 uint32_t MovieExtends::ComputeSizeInternal() {
    +
    1860  // This box is optional. Skip it if it does not contain any track.
    +
    1861  if (tracks.size() == 0)
    +
    1862  return 0;
    +
    1863  uint32_t box_size = HeaderSize() + header.ComputeSize();
    +
    1864  for (uint32_t i = 0; i < tracks.size(); ++i)
    +
    1865  box_size += tracks[i].ComputeSize();
    +
    1866  return box_size;
    +
    1867 }
    +
    1868 
    +
    1869 Movie::Movie() {}
    +
    1870 Movie::~Movie() {}
    +
    1871 FourCC Movie::BoxType() const { return FOURCC_MOOV; }
    +
    1872 
    +
    1873 bool Movie::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1874  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1875  buffer->PrepareChildren() &&
    +
    1876  buffer->ReadWriteChild(&header) &&
    +
    1877  buffer->TryReadWriteChild(&metadata) &&
    +
    1878  buffer->TryReadWriteChild(&extends));
    +
    1879  if (buffer->Reading()) {
    +
    1880  BoxReader* reader = buffer->reader();
    +
    1881  DCHECK(reader);
    +
    1882  RCHECK(reader->ReadChildren(&tracks) &&
    +
    1883  reader->TryReadChildren(&pssh));
    +
    1884  } else {
    +
    1885  for (uint32_t i = 0; i < tracks.size(); ++i)
    +
    1886  RCHECK(buffer->ReadWriteChild(&tracks[i]));
    +
    1887  for (uint32_t i = 0; i < pssh.size(); ++i)
    +
    1888  RCHECK(buffer->ReadWriteChild(&pssh[i]));
    +
    1889  }
    1890  return true;
    1891 }
    1892 
    -
    1893 uint32_t TrackFragmentDecodeTime::ComputeSizeInternal() {
    -
    1894  version = IsFitIn32Bits(decode_time) ? 0 : 1;
    -
    1895  return HeaderSize() + sizeof(uint32_t) * (1 + version);
    -
    1896 }
    -
    1897 
    -
    1898 MovieFragmentHeader::MovieFragmentHeader() : sequence_number(0) {}
    -
    1899 MovieFragmentHeader::~MovieFragmentHeader() {}
    -
    1900 FourCC MovieFragmentHeader::BoxType() const { return FOURCC_MFHD; }
    -
    1901 
    -
    1902 bool MovieFragmentHeader::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1903  return ReadWriteHeaderInternal(buffer) &&
    -
    1904  buffer->ReadWriteUInt32(&sequence_number);
    -
    1905 }
    +
    1893 uint32_t Movie::ComputeSizeInternal() {
    +
    1894  uint32_t box_size = HeaderSize() + header.ComputeSize() +
    +
    1895  metadata.ComputeSize() + extends.ComputeSize();
    +
    1896  for (uint32_t i = 0; i < tracks.size(); ++i)
    +
    1897  box_size += tracks[i].ComputeSize();
    +
    1898  for (uint32_t i = 0; i < pssh.size(); ++i)
    +
    1899  box_size += pssh[i].ComputeSize();
    +
    1900  return box_size;
    +
    1901 }
    +
    1902 
    +
    1903 TrackFragmentDecodeTime::TrackFragmentDecodeTime() : decode_time(0) {}
    +
    1904 TrackFragmentDecodeTime::~TrackFragmentDecodeTime() {}
    +
    1905 FourCC TrackFragmentDecodeTime::BoxType() const { return FOURCC_TFDT; }
    1906 
    -
    1907 uint32_t MovieFragmentHeader::ComputeSizeInternal() {
    -
    1908  return HeaderSize() + sizeof(sequence_number);
    -
    1909 }
    -
    1910 
    -
    1911 TrackFragmentHeader::TrackFragmentHeader()
    -
    1912  : track_id(0),
    -
    1913  sample_description_index(0),
    -
    1914  default_sample_duration(0),
    -
    1915  default_sample_size(0),
    -
    1916  default_sample_flags(0) {}
    -
    1917 
    -
    1918 TrackFragmentHeader::~TrackFragmentHeader() {}
    -
    1919 FourCC TrackFragmentHeader::BoxType() const { return FOURCC_TFHD; }
    -
    1920 
    -
    1921 bool TrackFragmentHeader::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1922  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1923  buffer->ReadWriteUInt32(&track_id));
    -
    1924 
    -
    1925  if (flags & kBaseDataOffsetPresentMask) {
    -
    1926  // MSE requires 'default-base-is-moof' to be set and
    -
    1927  // 'base-data-offset-present' not to be set. We omit these checks as some
    -
    1928  // valid files in the wild don't follow these rules, though they use moof as
    -
    1929  // base.
    -
    1930  uint64_t base_data_offset;
    -
    1931  RCHECK(buffer->ReadWriteUInt64(&base_data_offset));
    -
    1932  DLOG(WARNING) << "base-data-offset-present is not expected. Assumes "
    -
    1933  "default-base-is-moof.";
    -
    1934  }
    -
    1935 
    -
    1936  if (flags & kSampleDescriptionIndexPresentMask) {
    -
    1937  RCHECK(buffer->ReadWriteUInt32(&sample_description_index));
    -
    1938  } else if (buffer->Reading()) {
    -
    1939  sample_description_index = 0;
    -
    1940  }
    +
    1907 bool TrackFragmentDecodeTime::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1908  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    1909  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    +
    1910  RCHECK(buffer->ReadWriteUInt64NBytes(&decode_time, num_bytes));
    +
    1911  return true;
    +
    1912 }
    +
    1913 
    +
    1914 uint32_t TrackFragmentDecodeTime::ComputeSizeInternal() {
    +
    1915  version = IsFitIn32Bits(decode_time) ? 0 : 1;
    +
    1916  return HeaderSize() + sizeof(uint32_t) * (1 + version);
    +
    1917 }
    +
    1918 
    +
    1919 MovieFragmentHeader::MovieFragmentHeader() : sequence_number(0) {}
    +
    1920 MovieFragmentHeader::~MovieFragmentHeader() {}
    +
    1921 FourCC MovieFragmentHeader::BoxType() const { return FOURCC_MFHD; }
    +
    1922 
    +
    1923 bool MovieFragmentHeader::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1924  return ReadWriteHeaderInternal(buffer) &&
    +
    1925  buffer->ReadWriteUInt32(&sequence_number);
    +
    1926 }
    +
    1927 
    +
    1928 uint32_t MovieFragmentHeader::ComputeSizeInternal() {
    +
    1929  return HeaderSize() + sizeof(sequence_number);
    +
    1930 }
    +
    1931 
    +
    1932 TrackFragmentHeader::TrackFragmentHeader()
    +
    1933  : track_id(0),
    +
    1934  sample_description_index(0),
    +
    1935  default_sample_duration(0),
    +
    1936  default_sample_size(0),
    +
    1937  default_sample_flags(0) {}
    +
    1938 
    +
    1939 TrackFragmentHeader::~TrackFragmentHeader() {}
    +
    1940 FourCC TrackFragmentHeader::BoxType() const { return FOURCC_TFHD; }
    1941 
    -
    1942  if (flags & kDefaultSampleDurationPresentMask) {
    -
    1943  RCHECK(buffer->ReadWriteUInt32(&default_sample_duration));
    -
    1944  } else if (buffer->Reading()) {
    -
    1945  default_sample_duration = 0;
    -
    1946  }
    -
    1947 
    -
    1948  if (flags & kDefaultSampleSizePresentMask) {
    -
    1949  RCHECK(buffer->ReadWriteUInt32(&default_sample_size));
    -
    1950  } else if (buffer->Reading()) {
    -
    1951  default_sample_size = 0;
    -
    1952  }
    -
    1953 
    -
    1954  if (flags & kDefaultSampleFlagsPresentMask)
    -
    1955  RCHECK(buffer->ReadWriteUInt32(&default_sample_flags));
    -
    1956  return true;
    -
    1957 }
    -
    1958 
    -
    1959 uint32_t TrackFragmentHeader::ComputeSizeInternal() {
    -
    1960  uint32_t box_size = HeaderSize() + sizeof(track_id);
    -
    1961  if (flags & kSampleDescriptionIndexPresentMask)
    -
    1962  box_size += sizeof(sample_description_index);
    -
    1963  if (flags & kDefaultSampleDurationPresentMask)
    -
    1964  box_size += sizeof(default_sample_duration);
    -
    1965  if (flags & kDefaultSampleSizePresentMask)
    -
    1966  box_size += sizeof(default_sample_size);
    -
    1967  if (flags & kDefaultSampleFlagsPresentMask)
    -
    1968  box_size += sizeof(default_sample_flags);
    -
    1969  return box_size;
    -
    1970 }
    -
    1971 
    -
    1972 TrackFragmentRun::TrackFragmentRun() : sample_count(0), data_offset(0) {}
    -
    1973 TrackFragmentRun::~TrackFragmentRun() {}
    -
    1974 FourCC TrackFragmentRun::BoxType() const { return FOURCC_TRUN; }
    -
    1975 
    -
    1976 bool TrackFragmentRun::ReadWriteInternal(BoxBuffer* buffer) {
    -
    1977  if (!buffer->Reading()) {
    -
    1978  // Determine whether version 0 or version 1 should be used.
    -
    1979  // Use version 0 if possible, use version 1 if there is a negative
    -
    1980  // sample_offset value.
    -
    1981  version = 0;
    -
    1982  if (flags & kSampleCompTimeOffsetsPresentMask) {
    -
    1983  for (uint32_t i = 0; i < sample_count; ++i) {
    -
    1984  if (sample_composition_time_offsets[i] < 0) {
    -
    1985  version = 1;
    -
    1986  break;
    -
    1987  }
    -
    1988  }
    -
    1989  }
    -
    1990  }
    -
    1991 
    -
    1992  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    1993  buffer->ReadWriteUInt32(&sample_count));
    -
    1994 
    -
    1995  bool data_offset_present = (flags & kDataOffsetPresentMask) != 0;
    -
    1996  bool first_sample_flags_present = (flags & kFirstSampleFlagsPresentMask) != 0;
    -
    1997  bool sample_duration_present = (flags & kSampleDurationPresentMask) != 0;
    -
    1998  bool sample_size_present = (flags & kSampleSizePresentMask) != 0;
    -
    1999  bool sample_flags_present = (flags & kSampleFlagsPresentMask) != 0;
    -
    2000  bool sample_composition_time_offsets_present =
    -
    2001  (flags & kSampleCompTimeOffsetsPresentMask) != 0;
    -
    2002 
    -
    2003  if (data_offset_present) {
    -
    2004  RCHECK(buffer->ReadWriteUInt32(&data_offset));
    -
    2005  } else {
    -
    2006  // NOTE: If the data-offset is not present, then the data for this run
    -
    2007  // starts immediately after the data of the previous run, or at the
    -
    2008  // base-data-offset defined by the track fragment header if this is the
    -
    2009  // first run in a track fragment. If the data-offset is present, it is
    -
    2010  // relative to the base-data-offset established in the track fragment
    -
    2011  // header.
    -
    2012  NOTIMPLEMENTED();
    -
    2013  }
    -
    2014 
    -
    2015  uint32_t first_sample_flags;
    -
    2016 
    -
    2017  if (buffer->Reading()) {
    -
    2018  if (first_sample_flags_present)
    -
    2019  RCHECK(buffer->ReadWriteUInt32(&first_sample_flags));
    -
    2020 
    -
    2021  if (sample_duration_present)
    -
    2022  sample_durations.resize(sample_count);
    -
    2023  if (sample_size_present)
    -
    2024  sample_sizes.resize(sample_count);
    -
    2025  if (sample_flags_present)
    -
    2026  sample_flags.resize(sample_count);
    -
    2027  if (sample_composition_time_offsets_present)
    -
    2028  sample_composition_time_offsets.resize(sample_count);
    -
    2029  } else {
    -
    2030  if (first_sample_flags_present) {
    -
    2031  first_sample_flags = sample_flags[0];
    -
    2032  DCHECK(sample_flags.size() == 1);
    -
    2033  RCHECK(buffer->ReadWriteUInt32(&first_sample_flags));
    -
    2034  }
    +
    1942 bool TrackFragmentHeader::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1943  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    1944  buffer->ReadWriteUInt32(&track_id));
    +
    1945 
    +
    1946  if (flags & kBaseDataOffsetPresentMask) {
    +
    1947  // MSE requires 'default-base-is-moof' to be set and
    +
    1948  // 'base-data-offset-present' not to be set. We omit these checks as some
    +
    1949  // valid files in the wild don't follow these rules, though they use moof as
    +
    1950  // base.
    +
    1951  uint64_t base_data_offset;
    +
    1952  RCHECK(buffer->ReadWriteUInt64(&base_data_offset));
    +
    1953  DLOG(WARNING) << "base-data-offset-present is not expected. Assumes "
    +
    1954  "default-base-is-moof.";
    +
    1955  }
    +
    1956 
    +
    1957  if (flags & kSampleDescriptionIndexPresentMask) {
    +
    1958  RCHECK(buffer->ReadWriteUInt32(&sample_description_index));
    +
    1959  } else if (buffer->Reading()) {
    +
    1960  sample_description_index = 0;
    +
    1961  }
    +
    1962 
    +
    1963  if (flags & kDefaultSampleDurationPresentMask) {
    +
    1964  RCHECK(buffer->ReadWriteUInt32(&default_sample_duration));
    +
    1965  } else if (buffer->Reading()) {
    +
    1966  default_sample_duration = 0;
    +
    1967  }
    +
    1968 
    +
    1969  if (flags & kDefaultSampleSizePresentMask) {
    +
    1970  RCHECK(buffer->ReadWriteUInt32(&default_sample_size));
    +
    1971  } else if (buffer->Reading()) {
    +
    1972  default_sample_size = 0;
    +
    1973  }
    +
    1974 
    +
    1975  if (flags & kDefaultSampleFlagsPresentMask)
    +
    1976  RCHECK(buffer->ReadWriteUInt32(&default_sample_flags));
    +
    1977  return true;
    +
    1978 }
    +
    1979 
    +
    1980 uint32_t TrackFragmentHeader::ComputeSizeInternal() {
    +
    1981  uint32_t box_size = HeaderSize() + sizeof(track_id);
    +
    1982  if (flags & kSampleDescriptionIndexPresentMask)
    +
    1983  box_size += sizeof(sample_description_index);
    +
    1984  if (flags & kDefaultSampleDurationPresentMask)
    +
    1985  box_size += sizeof(default_sample_duration);
    +
    1986  if (flags & kDefaultSampleSizePresentMask)
    +
    1987  box_size += sizeof(default_sample_size);
    +
    1988  if (flags & kDefaultSampleFlagsPresentMask)
    +
    1989  box_size += sizeof(default_sample_flags);
    +
    1990  return box_size;
    +
    1991 }
    +
    1992 
    +
    1993 TrackFragmentRun::TrackFragmentRun() : sample_count(0), data_offset(0) {}
    +
    1994 TrackFragmentRun::~TrackFragmentRun() {}
    +
    1995 FourCC TrackFragmentRun::BoxType() const { return FOURCC_TRUN; }
    +
    1996 
    +
    1997 bool TrackFragmentRun::ReadWriteInternal(BoxBuffer* buffer) {
    +
    1998  if (!buffer->Reading()) {
    +
    1999  // Determine whether version 0 or version 1 should be used.
    +
    2000  // Use version 0 if possible, use version 1 if there is a negative
    +
    2001  // sample_offset value.
    +
    2002  version = 0;
    +
    2003  if (flags & kSampleCompTimeOffsetsPresentMask) {
    +
    2004  for (uint32_t i = 0; i < sample_count; ++i) {
    +
    2005  if (sample_composition_time_offsets[i] < 0) {
    +
    2006  version = 1;
    +
    2007  break;
    +
    2008  }
    +
    2009  }
    +
    2010  }
    +
    2011  }
    +
    2012 
    +
    2013  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    2014  buffer->ReadWriteUInt32(&sample_count));
    +
    2015 
    +
    2016  bool data_offset_present = (flags & kDataOffsetPresentMask) != 0;
    +
    2017  bool first_sample_flags_present = (flags & kFirstSampleFlagsPresentMask) != 0;
    +
    2018  bool sample_duration_present = (flags & kSampleDurationPresentMask) != 0;
    +
    2019  bool sample_size_present = (flags & kSampleSizePresentMask) != 0;
    +
    2020  bool sample_flags_present = (flags & kSampleFlagsPresentMask) != 0;
    +
    2021  bool sample_composition_time_offsets_present =
    +
    2022  (flags & kSampleCompTimeOffsetsPresentMask) != 0;
    +
    2023 
    +
    2024  if (data_offset_present) {
    +
    2025  RCHECK(buffer->ReadWriteUInt32(&data_offset));
    +
    2026  } else {
    +
    2027  // NOTE: If the data-offset is not present, then the data for this run
    +
    2028  // starts immediately after the data of the previous run, or at the
    +
    2029  // base-data-offset defined by the track fragment header if this is the
    +
    2030  // first run in a track fragment. If the data-offset is present, it is
    +
    2031  // relative to the base-data-offset established in the track fragment
    +
    2032  // header.
    +
    2033  NOTIMPLEMENTED();
    +
    2034  }
    2035 
    -
    2036  if (sample_duration_present)
    -
    2037  DCHECK(sample_durations.size() == sample_count);
    -
    2038  if (sample_size_present)
    -
    2039  DCHECK(sample_sizes.size() == sample_count);
    -
    2040  if (sample_flags_present)
    -
    2041  DCHECK(sample_flags.size() == sample_count);
    -
    2042  if (sample_composition_time_offsets_present)
    -
    2043  DCHECK(sample_composition_time_offsets.size() == sample_count);
    -
    2044  }
    -
    2045 
    -
    2046  for (uint32_t i = 0; i < sample_count; ++i) {
    -
    2047  if (sample_duration_present)
    -
    2048  RCHECK(buffer->ReadWriteUInt32(&sample_durations[i]));
    -
    2049  if (sample_size_present)
    -
    2050  RCHECK(buffer->ReadWriteUInt32(&sample_sizes[i]));
    -
    2051  if (sample_flags_present)
    -
    2052  RCHECK(buffer->ReadWriteUInt32(&sample_flags[i]));
    -
    2053 
    -
    2054  if (sample_composition_time_offsets_present) {
    -
    2055  if (version == 0) {
    -
    2056  uint32_t sample_offset = sample_composition_time_offsets[i];
    -
    2057  RCHECK(buffer->ReadWriteUInt32(&sample_offset));
    -
    2058  sample_composition_time_offsets[i] = sample_offset;
    -
    2059  } else {
    -
    2060  int32_t sample_offset = sample_composition_time_offsets[i];
    -
    2061  RCHECK(buffer->ReadWriteInt32(&sample_offset));
    -
    2062  sample_composition_time_offsets[i] = sample_offset;
    -
    2063  }
    -
    2064  }
    +
    2036  uint32_t first_sample_flags;
    +
    2037 
    +
    2038  if (buffer->Reading()) {
    +
    2039  if (first_sample_flags_present)
    +
    2040  RCHECK(buffer->ReadWriteUInt32(&first_sample_flags));
    +
    2041 
    +
    2042  if (sample_duration_present)
    +
    2043  sample_durations.resize(sample_count);
    +
    2044  if (sample_size_present)
    +
    2045  sample_sizes.resize(sample_count);
    +
    2046  if (sample_flags_present)
    +
    2047  sample_flags.resize(sample_count);
    +
    2048  if (sample_composition_time_offsets_present)
    +
    2049  sample_composition_time_offsets.resize(sample_count);
    +
    2050  } else {
    +
    2051  if (first_sample_flags_present) {
    +
    2052  first_sample_flags = sample_flags[0];
    +
    2053  DCHECK(sample_flags.size() == 1);
    +
    2054  RCHECK(buffer->ReadWriteUInt32(&first_sample_flags));
    +
    2055  }
    +
    2056 
    +
    2057  if (sample_duration_present)
    +
    2058  DCHECK(sample_durations.size() == sample_count);
    +
    2059  if (sample_size_present)
    +
    2060  DCHECK(sample_sizes.size() == sample_count);
    +
    2061  if (sample_flags_present)
    +
    2062  DCHECK(sample_flags.size() == sample_count);
    +
    2063  if (sample_composition_time_offsets_present)
    +
    2064  DCHECK(sample_composition_time_offsets.size() == sample_count);
    2065  }
    2066 
    -
    2067  if (buffer->Reading()) {
    -
    2068  if (first_sample_flags_present) {
    -
    2069  if (sample_flags.size() == 0) {
    -
    2070  sample_flags.push_back(first_sample_flags);
    -
    2071  } else {
    -
    2072  sample_flags[0] = first_sample_flags;
    -
    2073  }
    -
    2074  }
    -
    2075  }
    -
    2076  return true;
    -
    2077 }
    -
    2078 
    -
    2079 uint32_t TrackFragmentRun::ComputeSizeInternal() {
    -
    2080  uint32_t box_size = HeaderSize() + sizeof(sample_count);
    -
    2081  if (flags & kDataOffsetPresentMask)
    -
    2082  box_size += sizeof(data_offset);
    -
    2083  if (flags & kFirstSampleFlagsPresentMask)
    -
    2084  box_size += sizeof(uint32_t);
    -
    2085  uint32_t fields = (flags & kSampleDurationPresentMask ? 1 : 0) +
    -
    2086  (flags & kSampleSizePresentMask ? 1 : 0) +
    -
    2087  (flags & kSampleFlagsPresentMask ? 1 : 0) +
    -
    2088  (flags & kSampleCompTimeOffsetsPresentMask ? 1 : 0);
    -
    2089  box_size += fields * sizeof(uint32_t) * sample_count;
    -
    2090  return box_size;
    -
    2091 }
    -
    2092 
    -
    2093 SampleToGroup::SampleToGroup() : grouping_type(0), grouping_type_parameter(0) {}
    -
    2094 SampleToGroup::~SampleToGroup() {}
    -
    2095 FourCC SampleToGroup::BoxType() const { return FOURCC_SBGP; }
    -
    2096 
    -
    2097 bool SampleToGroup::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2098  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    2099  buffer->ReadWriteUInt32(&grouping_type));
    -
    2100  if (version == 1)
    -
    2101  RCHECK(buffer->ReadWriteUInt32(&grouping_type_parameter));
    -
    2102 
    -
    2103  if (grouping_type != FOURCC_SEIG) {
    -
    2104  DCHECK(buffer->Reading());
    -
    2105  DLOG(WARNING) << "Sample group "
    -
    2106  << FourCCToString(static_cast<FourCC>(grouping_type))
    -
    2107  << " is not supported.";
    -
    2108  return true;
    -
    2109  }
    -
    2110 
    -
    2111  uint32_t count = entries.size();
    -
    2112  RCHECK(buffer->ReadWriteUInt32(&count));
    -
    2113  entries.resize(count);
    -
    2114  for (uint32_t i = 0; i < count; ++i) {
    -
    2115  RCHECK(buffer->ReadWriteUInt32(&entries[i].sample_count) &&
    -
    2116  buffer->ReadWriteUInt32(&entries[i].group_description_index));
    -
    2117  }
    -
    2118  return true;
    -
    2119 }
    -
    2120 
    -
    2121 uint32_t SampleToGroup::ComputeSizeInternal() {
    -
    2122  // This box is optional. Skip it if it is not used.
    -
    2123  if (entries.empty())
    -
    2124  return 0;
    -
    2125  return HeaderSize() + sizeof(grouping_type) +
    -
    2126  (version == 1 ? sizeof(grouping_type_parameter) : 0) +
    -
    2127  sizeof(uint32_t) + entries.size() * sizeof(entries[0]);
    -
    2128 }
    -
    2129 
    -
    2130 CencSampleEncryptionInfoEntry::CencSampleEncryptionInfoEntry()
    -
    2131  : is_encrypted(false), iv_size(0) {
    -
    2132 }
    -
    2133 CencSampleEncryptionInfoEntry::~CencSampleEncryptionInfoEntry() {};
    -
    2134 
    -
    2135 SampleGroupDescription::SampleGroupDescription() : grouping_type(0) {}
    -
    2136 SampleGroupDescription::~SampleGroupDescription() {}
    -
    2137 FourCC SampleGroupDescription::BoxType() const { return FOURCC_SGPD; }
    -
    2138 
    -
    2139 bool SampleGroupDescription::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2140  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    2141  buffer->ReadWriteUInt32(&grouping_type));
    -
    2142 
    -
    2143  if (grouping_type != FOURCC_SEIG) {
    -
    2144  DCHECK(buffer->Reading());
    -
    2145  DLOG(WARNING) << "Sample group '" << grouping_type << "' is not supported.";
    -
    2146  return true;
    -
    2147  }
    -
    2148 
    -
    2149  const size_t kEntrySize = sizeof(uint32_t) + kCencKeyIdSize;
    -
    2150  uint32_t default_length = 0;
    -
    2151  if (version == 1) {
    -
    2152  if (buffer->Reading()) {
    -
    2153  RCHECK(buffer->ReadWriteUInt32(&default_length));
    -
    2154  RCHECK(default_length == 0 || default_length >= kEntrySize);
    -
    2155  } else {
    -
    2156  default_length = kEntrySize;
    -
    2157  RCHECK(buffer->ReadWriteUInt32(&default_length));
    -
    2158  }
    -
    2159  }
    -
    2160 
    -
    2161  uint32_t count = entries.size();
    -
    2162  RCHECK(buffer->ReadWriteUInt32(&count));
    -
    2163  entries.resize(count);
    -
    2164  for (uint32_t i = 0; i < count; ++i) {
    -
    2165  if (version == 1) {
    -
    2166  if (buffer->Reading() && default_length == 0) {
    -
    2167  uint32_t description_length = 0;
    -
    2168  RCHECK(buffer->ReadWriteUInt32(&description_length));
    -
    2169  RCHECK(description_length >= kEntrySize);
    -
    2170  }
    -
    2171  }
    -
    2172 
    -
    2173  if (!buffer->Reading()) {
    -
    2174  if (entries[i].key_id.size() != kCencKeyIdSize) {
    -
    2175  LOG(WARNING) << "CENC defines key id length of " << kCencKeyIdSize
    -
    2176  << " bytes; got " << entries[i].key_id.size()
    -
    2177  << ". Resized accordingly.";
    -
    2178  entries[i].key_id.resize(kCencKeyIdSize);
    -
    2179  }
    -
    2180  }
    +
    2067  for (uint32_t i = 0; i < sample_count; ++i) {
    +
    2068  if (sample_duration_present)
    +
    2069  RCHECK(buffer->ReadWriteUInt32(&sample_durations[i]));
    +
    2070  if (sample_size_present)
    +
    2071  RCHECK(buffer->ReadWriteUInt32(&sample_sizes[i]));
    +
    2072  if (sample_flags_present)
    +
    2073  RCHECK(buffer->ReadWriteUInt32(&sample_flags[i]));
    +
    2074 
    +
    2075  if (sample_composition_time_offsets_present) {
    +
    2076  if (version == 0) {
    +
    2077  uint32_t sample_offset = sample_composition_time_offsets[i];
    +
    2078  RCHECK(buffer->ReadWriteUInt32(&sample_offset));
    +
    2079  sample_composition_time_offsets[i] = sample_offset;
    +
    2080  } else {
    +
    2081  int32_t sample_offset = sample_composition_time_offsets[i];
    +
    2082  RCHECK(buffer->ReadWriteInt32(&sample_offset));
    +
    2083  sample_composition_time_offsets[i] = sample_offset;
    +
    2084  }
    +
    2085  }
    +
    2086  }
    +
    2087 
    +
    2088  if (buffer->Reading()) {
    +
    2089  if (first_sample_flags_present) {
    +
    2090  if (sample_flags.size() == 0) {
    +
    2091  sample_flags.push_back(first_sample_flags);
    +
    2092  } else {
    +
    2093  sample_flags[0] = first_sample_flags;
    +
    2094  }
    +
    2095  }
    +
    2096  }
    +
    2097  return true;
    +
    2098 }
    +
    2099 
    +
    2100 uint32_t TrackFragmentRun::ComputeSizeInternal() {
    +
    2101  uint32_t box_size = HeaderSize() + sizeof(sample_count);
    +
    2102  if (flags & kDataOffsetPresentMask)
    +
    2103  box_size += sizeof(data_offset);
    +
    2104  if (flags & kFirstSampleFlagsPresentMask)
    +
    2105  box_size += sizeof(uint32_t);
    +
    2106  uint32_t fields = (flags & kSampleDurationPresentMask ? 1 : 0) +
    +
    2107  (flags & kSampleSizePresentMask ? 1 : 0) +
    +
    2108  (flags & kSampleFlagsPresentMask ? 1 : 0) +
    +
    2109  (flags & kSampleCompTimeOffsetsPresentMask ? 1 : 0);
    +
    2110  box_size += fields * sizeof(uint32_t) * sample_count;
    +
    2111  return box_size;
    +
    2112 }
    +
    2113 
    +
    2114 SampleToGroup::SampleToGroup() : grouping_type(0), grouping_type_parameter(0) {}
    +
    2115 SampleToGroup::~SampleToGroup() {}
    +
    2116 FourCC SampleToGroup::BoxType() const { return FOURCC_SBGP; }
    +
    2117 
    +
    2118 bool SampleToGroup::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2119  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    2120  buffer->ReadWriteUInt32(&grouping_type));
    +
    2121  if (version == 1)
    +
    2122  RCHECK(buffer->ReadWriteUInt32(&grouping_type_parameter));
    +
    2123 
    +
    2124  if (grouping_type != FOURCC_SEIG) {
    +
    2125  DCHECK(buffer->Reading());
    +
    2126  DLOG(WARNING) << "Sample group "
    +
    2127  << FourCCToString(static_cast<FourCC>(grouping_type))
    +
    2128  << " is not supported.";
    +
    2129  return true;
    +
    2130  }
    +
    2131 
    +
    2132  uint32_t count = entries.size();
    +
    2133  RCHECK(buffer->ReadWriteUInt32(&count));
    +
    2134  entries.resize(count);
    +
    2135  for (uint32_t i = 0; i < count; ++i) {
    +
    2136  RCHECK(buffer->ReadWriteUInt32(&entries[i].sample_count) &&
    +
    2137  buffer->ReadWriteUInt32(&entries[i].group_description_index));
    +
    2138  }
    +
    2139  return true;
    +
    2140 }
    +
    2141 
    +
    2142 uint32_t SampleToGroup::ComputeSizeInternal() {
    +
    2143  // This box is optional. Skip it if it is not used.
    +
    2144  if (entries.empty())
    +
    2145  return 0;
    +
    2146  return HeaderSize() + sizeof(grouping_type) +
    +
    2147  (version == 1 ? sizeof(grouping_type_parameter) : 0) +
    +
    2148  sizeof(uint32_t) + entries.size() * sizeof(entries[0]);
    +
    2149 }
    +
    2150 
    +
    2151 CencSampleEncryptionInfoEntry::CencSampleEncryptionInfoEntry()
    +
    2152  : is_encrypted(false), iv_size(0) {
    +
    2153 }
    +
    2154 CencSampleEncryptionInfoEntry::~CencSampleEncryptionInfoEntry() {};
    +
    2155 
    +
    2156 SampleGroupDescription::SampleGroupDescription() : grouping_type(0) {}
    +
    2157 SampleGroupDescription::~SampleGroupDescription() {}
    +
    2158 FourCC SampleGroupDescription::BoxType() const { return FOURCC_SGPD; }
    +
    2159 
    +
    2160 bool SampleGroupDescription::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2161  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    2162  buffer->ReadWriteUInt32(&grouping_type));
    +
    2163 
    +
    2164  if (grouping_type != FOURCC_SEIG) {
    +
    2165  DCHECK(buffer->Reading());
    +
    2166  DLOG(WARNING) << "Sample group '" << grouping_type << "' is not supported.";
    +
    2167  return true;
    +
    2168  }
    +
    2169 
    +
    2170  const size_t kEntrySize = sizeof(uint32_t) + kCencKeyIdSize;
    +
    2171  uint32_t default_length = 0;
    +
    2172  if (version == 1) {
    +
    2173  if (buffer->Reading()) {
    +
    2174  RCHECK(buffer->ReadWriteUInt32(&default_length));
    +
    2175  RCHECK(default_length == 0 || default_length >= kEntrySize);
    +
    2176  } else {
    +
    2177  default_length = kEntrySize;
    +
    2178  RCHECK(buffer->ReadWriteUInt32(&default_length));
    +
    2179  }
    +
    2180  }
    2181 
    -
    2182  uint8_t flag = entries[i].is_encrypted ? 1 : 0;
    -
    2183  RCHECK(buffer->IgnoreBytes(2) && // reserved.
    -
    2184  buffer->ReadWriteUInt8(&flag) &&
    -
    2185  buffer->ReadWriteUInt8(&entries[i].iv_size) &&
    -
    2186  buffer->ReadWriteVector(&entries[i].key_id, kCencKeyIdSize));
    -
    2187 
    -
    2188  if (buffer->Reading()) {
    -
    2189  entries[i].is_encrypted = (flag != 0);
    -
    2190  if (entries[i].is_encrypted) {
    -
    2191  RCHECK(entries[i].iv_size == 8 || entries[i].iv_size == 16);
    -
    2192  } else {
    -
    2193  RCHECK(entries[i].iv_size == 0);
    -
    2194  }
    -
    2195  }
    -
    2196  }
    -
    2197  return true;
    -
    2198 }
    -
    2199 
    -
    2200 uint32_t SampleGroupDescription::ComputeSizeInternal() {
    -
    2201  // Version 0 is obsoleted, so always generate version 1 box.
    -
    2202  version = 1;
    -
    2203  // This box is optional. Skip it if it is not used.
    -
    2204  if (entries.empty())
    -
    2205  return 0;
    -
    2206  const size_t kEntrySize = sizeof(uint32_t) + kCencKeyIdSize;
    -
    2207  return HeaderSize() + sizeof(grouping_type) +
    -
    2208  (version == 1 ? sizeof(uint32_t) : 0) + sizeof(uint32_t) +
    -
    2209  entries.size() * kEntrySize;
    -
    2210 }
    -
    2211 
    -
    2212 TrackFragment::TrackFragment() : decode_time_absent(false) {}
    -
    2213 TrackFragment::~TrackFragment() {}
    -
    2214 FourCC TrackFragment::BoxType() const { return FOURCC_TRAF; }
    -
    2215 
    -
    2216 bool TrackFragment::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2217  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    2218  buffer->PrepareChildren() &&
    -
    2219  buffer->ReadWriteChild(&header));
    -
    2220  if (buffer->Reading()) {
    -
    2221  DCHECK(buffer->reader());
    -
    2222  decode_time_absent = !buffer->reader()->ChildExist(&decode_time);
    -
    2223  if (!decode_time_absent)
    -
    2224  RCHECK(buffer->ReadWriteChild(&decode_time));
    -
    2225  RCHECK(buffer->reader()->TryReadChildren(&runs));
    -
    2226 
    -
    2227  // There could be multiple SampleGroupDescription and SampleToGroup boxes
    -
    2228  // with different grouping types. For common encryption, the relevant
    -
    2229  // grouping type is 'seig'. Continue reading until 'seig' is found, or
    -
    2230  // until running out of child boxes.
    -
    2231  while (sample_to_group.grouping_type != FOURCC_SEIG &&
    -
    2232  buffer->reader()->ChildExist(&sample_to_group)) {
    -
    2233  RCHECK(buffer->reader()->ReadChild(&sample_to_group));
    -
    2234  }
    -
    2235  while (sample_group_description.grouping_type != FOURCC_SEIG &&
    -
    2236  buffer->reader()->ChildExist(&sample_group_description)) {
    -
    2237  RCHECK(buffer->reader()->ReadChild(&sample_group_description));
    -
    2238  }
    -
    2239  } else {
    -
    2240  if (!decode_time_absent)
    -
    2241  RCHECK(buffer->ReadWriteChild(&decode_time));
    -
    2242  for (uint32_t i = 0; i < runs.size(); ++i)
    -
    2243  RCHECK(buffer->ReadWriteChild(&runs[i]));
    -
    2244  RCHECK(buffer->TryReadWriteChild(&sample_to_group) &&
    -
    2245  buffer->TryReadWriteChild(&sample_group_description));
    -
    2246  }
    -
    2247  return buffer->TryReadWriteChild(&auxiliary_size) &&
    -
    2248  buffer->TryReadWriteChild(&auxiliary_offset) &&
    -
    2249  buffer->TryReadWriteChild(&sample_encryption);
    -
    2250 }
    -
    2251 
    -
    2252 uint32_t TrackFragment::ComputeSizeInternal() {
    -
    2253  uint32_t box_size =
    -
    2254  HeaderSize() + header.ComputeSize() + decode_time.ComputeSize() +
    -
    2255  sample_to_group.ComputeSize() + sample_group_description.ComputeSize() +
    -
    2256  auxiliary_size.ComputeSize() + auxiliary_offset.ComputeSize() +
    -
    2257  sample_encryption.ComputeSize();
    -
    2258  for (uint32_t i = 0; i < runs.size(); ++i)
    -
    2259  box_size += runs[i].ComputeSize();
    -
    2260  return box_size;
    -
    2261 }
    -
    2262 
    -
    2263 MovieFragment::MovieFragment() {}
    -
    2264 MovieFragment::~MovieFragment() {}
    -
    2265 FourCC MovieFragment::BoxType() const { return FOURCC_MOOF; }
    -
    2266 
    -
    2267 bool MovieFragment::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2268  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    2269  buffer->PrepareChildren() &&
    -
    2270  buffer->ReadWriteChild(&header));
    -
    2271  if (buffer->Reading()) {
    -
    2272  BoxReader* reader = buffer->reader();
    -
    2273  DCHECK(reader);
    -
    2274  RCHECK(reader->ReadChildren(&tracks) &&
    -
    2275  reader->TryReadChildren(&pssh));
    -
    2276  } else {
    -
    2277  for (uint32_t i = 0; i < tracks.size(); ++i)
    -
    2278  RCHECK(buffer->ReadWriteChild(&tracks[i]));
    -
    2279  for (uint32_t i = 0; i < pssh.size(); ++i)
    -
    2280  RCHECK(buffer->ReadWriteChild(&pssh[i]));
    -
    2281  }
    -
    2282  return true;
    -
    2283 }
    -
    2284 
    -
    2285 uint32_t MovieFragment::ComputeSizeInternal() {
    -
    2286  uint32_t box_size = HeaderSize() + header.ComputeSize();
    -
    2287  for (uint32_t i = 0; i < tracks.size(); ++i)
    -
    2288  box_size += tracks[i].ComputeSize();
    -
    2289  for (uint32_t i = 0; i < pssh.size(); ++i)
    -
    2290  box_size += pssh[i].ComputeSize();
    -
    2291  return box_size;
    -
    2292 }
    -
    2293 
    -
    2294 SegmentIndex::SegmentIndex()
    -
    2295  : reference_id(0),
    -
    2296  timescale(0),
    -
    2297  earliest_presentation_time(0),
    -
    2298  first_offset(0) {}
    -
    2299 SegmentIndex::~SegmentIndex() {}
    -
    2300 FourCC SegmentIndex::BoxType() const { return FOURCC_SIDX; }
    -
    2301 
    -
    2302 bool SegmentIndex::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2303  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    2304  buffer->ReadWriteUInt32(&reference_id) &&
    -
    2305  buffer->ReadWriteUInt32(&timescale));
    -
    2306 
    -
    2307  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    -
    2308  RCHECK(
    -
    2309  buffer->ReadWriteUInt64NBytes(&earliest_presentation_time, num_bytes) &&
    -
    2310  buffer->ReadWriteUInt64NBytes(&first_offset, num_bytes));
    -
    2311 
    -
    2312  uint16_t reference_count = references.size();
    -
    2313  RCHECK(buffer->IgnoreBytes(2) && // reserved.
    -
    2314  buffer->ReadWriteUInt16(&reference_count));
    -
    2315  references.resize(reference_count);
    -
    2316 
    -
    2317  uint32_t reference_type_size;
    -
    2318  uint32_t sap;
    -
    2319  for (uint32_t i = 0; i < reference_count; ++i) {
    -
    2320  if (!buffer->Reading()) {
    -
    2321  reference_type_size = references[i].referenced_size;
    -
    2322  if (references[i].reference_type)
    -
    2323  reference_type_size |= (1 << 31);
    -
    2324  sap = (references[i].sap_type << 28) | references[i].sap_delta_time;
    -
    2325  if (references[i].starts_with_sap)
    -
    2326  sap |= (1 << 31);
    -
    2327  }
    -
    2328  RCHECK(buffer->ReadWriteUInt32(&reference_type_size) &&
    -
    2329  buffer->ReadWriteUInt32(&references[i].subsegment_duration) &&
    -
    2330  buffer->ReadWriteUInt32(&sap));
    -
    2331  if (buffer->Reading()) {
    -
    2332  references[i].reference_type = (reference_type_size >> 31) ? true : false;
    -
    2333  references[i].referenced_size = reference_type_size & ~(1 << 31);
    -
    2334  references[i].starts_with_sap = (sap >> 31) ? true : false;
    -
    2335  references[i].sap_type =
    -
    2336  static_cast<SegmentReference::SAPType>((sap >> 28) & 0x07);
    -
    2337  references[i].sap_delta_time = sap & ~(0xF << 28);
    -
    2338  }
    -
    2339  }
    -
    2340  return true;
    -
    2341 }
    -
    2342 
    -
    2343 uint32_t SegmentIndex::ComputeSizeInternal() {
    -
    2344  version = IsFitIn32Bits(earliest_presentation_time, first_offset) ? 0 : 1;
    -
    2345  return HeaderSize() + sizeof(reference_id) + sizeof(timescale) +
    -
    2346  sizeof(uint32_t) * (1 + version) * 2 + 2 * sizeof(uint16_t) +
    -
    2347  3 * sizeof(uint32_t) * references.size();
    -
    2348 }
    -
    2349 
    -
    2350 MediaData::MediaData() : data_size(0) {}
    -
    2351 MediaData::~MediaData() {}
    -
    2352 FourCC MediaData::BoxType() const { return FOURCC_MDAT; }
    -
    2353 
    -
    2354 bool MediaData::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2355  NOTIMPLEMENTED() << "Actual data is parsed and written separately.";
    -
    2356  return false;
    -
    2357 }
    -
    2358 
    -
    2359 uint32_t MediaData::ComputeSizeInternal() {
    -
    2360  return HeaderSize() + data_size;
    -
    2361 }
    -
    2362 
    -
    2363 CueSourceIDBox::CueSourceIDBox() : source_id(kCueSourceIdNotSet) {}
    -
    2364 CueSourceIDBox::~CueSourceIDBox() {}
    -
    2365 
    -
    2366 FourCC CueSourceIDBox::BoxType() const { return FOURCC_vsid; }
    -
    2367 
    -
    2368 bool CueSourceIDBox::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2369  RCHECK(ReadWriteHeaderInternal(buffer) && buffer->ReadWriteInt32(&source_id));
    -
    2370  return true;
    -
    2371 }
    -
    2372 
    -
    2373 uint32_t CueSourceIDBox::ComputeSizeInternal() {
    -
    2374  if (source_id == kCueSourceIdNotSet)
    -
    2375  return 0;
    -
    2376  return HeaderSize() + sizeof(source_id);
    -
    2377 }
    -
    2378 
    -
    2379 CueTimeBox::CueTimeBox() {}
    -
    2380 CueTimeBox::~CueTimeBox() {}
    -
    2381 
    -
    2382 FourCC CueTimeBox::BoxType() const {
    -
    2383  return FOURCC_ctim;
    -
    2384 }
    -
    2385 
    -
    2386 bool CueTimeBox::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2387  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    2388  return buffer->ReadWriteString(
    -
    2389  &cue_current_time,
    -
    2390  buffer->Reading() ? buffer->BytesLeft() : cue_current_time.size());
    -
    2391 }
    -
    2392 
    -
    2393 uint32_t CueTimeBox::ComputeSizeInternal() {
    -
    2394  if (cue_current_time.empty())
    -
    2395  return 0;
    -
    2396  return HeaderSize() + cue_current_time.size();
    -
    2397 }
    -
    2398 
    -
    2399 CueIDBox::CueIDBox() {}
    -
    2400 CueIDBox::~CueIDBox() {}
    -
    2401 
    -
    2402 FourCC CueIDBox::BoxType() const {
    -
    2403  return FOURCC_iden;
    -
    2404 }
    -
    2405 
    -
    2406 bool CueIDBox::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2407  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    2408  return buffer->ReadWriteString(
    -
    2409  &cue_id, buffer->Reading() ? buffer->BytesLeft() : cue_id.size());
    -
    2410 }
    -
    2411 
    -
    2412 uint32_t CueIDBox::ComputeSizeInternal() {
    -
    2413  if (cue_id.empty())
    -
    2414  return 0;
    -
    2415  return HeaderSize() + cue_id.size();
    -
    2416 }
    -
    2417 
    -
    2418 CueSettingsBox::CueSettingsBox() {}
    -
    2419 CueSettingsBox::~CueSettingsBox() {}
    -
    2420 
    -
    2421 FourCC CueSettingsBox::BoxType() const {
    -
    2422  return FOURCC_sttg;
    -
    2423 }
    -
    2424 
    -
    2425 bool CueSettingsBox::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2426  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    2427  return buffer->ReadWriteString(
    -
    2428  &settings, buffer->Reading() ? buffer->BytesLeft() : settings.size());
    -
    2429 }
    -
    2430 
    -
    2431 uint32_t CueSettingsBox::ComputeSizeInternal() {
    -
    2432  if (settings.empty())
    -
    2433  return 0;
    -
    2434  return HeaderSize() + settings.size();
    -
    2435 }
    -
    2436 
    -
    2437 CuePayloadBox::CuePayloadBox() {}
    -
    2438 CuePayloadBox::~CuePayloadBox() {}
    -
    2439 
    -
    2440 FourCC CuePayloadBox::BoxType() const {
    -
    2441  return FOURCC_payl;
    -
    2442 }
    -
    2443 
    -
    2444 bool CuePayloadBox::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2445  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    2446  return buffer->ReadWriteString(
    -
    2447  &cue_text, buffer->Reading() ? buffer->BytesLeft() : cue_text.size());
    -
    2448 }
    -
    2449 
    -
    2450 uint32_t CuePayloadBox::ComputeSizeInternal() {
    -
    2451  return HeaderSize() + cue_text.size();
    -
    2452 }
    -
    2453 
    -
    2454 VTTEmptyCueBox::VTTEmptyCueBox() {}
    -
    2455 VTTEmptyCueBox::~VTTEmptyCueBox() {}
    -
    2456 
    -
    2457 FourCC VTTEmptyCueBox::BoxType() const {
    -
    2458  return FOURCC_vtte;
    -
    2459 }
    +
    2182  uint32_t count = entries.size();
    +
    2183  RCHECK(buffer->ReadWriteUInt32(&count));
    +
    2184  entries.resize(count);
    +
    2185  for (uint32_t i = 0; i < count; ++i) {
    +
    2186  if (version == 1) {
    +
    2187  if (buffer->Reading() && default_length == 0) {
    +
    2188  uint32_t description_length = 0;
    +
    2189  RCHECK(buffer->ReadWriteUInt32(&description_length));
    +
    2190  RCHECK(description_length >= kEntrySize);
    +
    2191  }
    +
    2192  }
    +
    2193 
    +
    2194  if (!buffer->Reading()) {
    +
    2195  if (entries[i].key_id.size() != kCencKeyIdSize) {
    +
    2196  LOG(WARNING) << "CENC defines key id length of " << kCencKeyIdSize
    +
    2197  << " bytes; got " << entries[i].key_id.size()
    +
    2198  << ". Resized accordingly.";
    +
    2199  entries[i].key_id.resize(kCencKeyIdSize);
    +
    2200  }
    +
    2201  }
    +
    2202 
    +
    2203  uint8_t flag = entries[i].is_encrypted ? 1 : 0;
    +
    2204  RCHECK(buffer->IgnoreBytes(2) && // reserved.
    +
    2205  buffer->ReadWriteUInt8(&flag) &&
    +
    2206  buffer->ReadWriteUInt8(&entries[i].iv_size) &&
    +
    2207  buffer->ReadWriteVector(&entries[i].key_id, kCencKeyIdSize));
    +
    2208 
    +
    2209  if (buffer->Reading()) {
    +
    2210  entries[i].is_encrypted = (flag != 0);
    +
    2211  if (entries[i].is_encrypted) {
    +
    2212  RCHECK(entries[i].iv_size == 8 || entries[i].iv_size == 16);
    +
    2213  } else {
    +
    2214  RCHECK(entries[i].iv_size == 0);
    +
    2215  }
    +
    2216  }
    +
    2217  }
    +
    2218  return true;
    +
    2219 }
    +
    2220 
    +
    2221 uint32_t SampleGroupDescription::ComputeSizeInternal() {
    +
    2222  // Version 0 is obsoleted, so always generate version 1 box.
    +
    2223  version = 1;
    +
    2224  // This box is optional. Skip it if it is not used.
    +
    2225  if (entries.empty())
    +
    2226  return 0;
    +
    2227  const size_t kEntrySize = sizeof(uint32_t) + kCencKeyIdSize;
    +
    2228  return HeaderSize() + sizeof(grouping_type) +
    +
    2229  (version == 1 ? sizeof(uint32_t) : 0) + sizeof(uint32_t) +
    +
    2230  entries.size() * kEntrySize;
    +
    2231 }
    +
    2232 
    +
    2233 TrackFragment::TrackFragment() : decode_time_absent(false) {}
    +
    2234 TrackFragment::~TrackFragment() {}
    +
    2235 FourCC TrackFragment::BoxType() const { return FOURCC_TRAF; }
    +
    2236 
    +
    2237 bool TrackFragment::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2238  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    2239  buffer->PrepareChildren() &&
    +
    2240  buffer->ReadWriteChild(&header));
    +
    2241  if (buffer->Reading()) {
    +
    2242  DCHECK(buffer->reader());
    +
    2243  decode_time_absent = !buffer->reader()->ChildExist(&decode_time);
    +
    2244  if (!decode_time_absent)
    +
    2245  RCHECK(buffer->ReadWriteChild(&decode_time));
    +
    2246  RCHECK(buffer->reader()->TryReadChildren(&runs));
    +
    2247 
    +
    2248  // There could be multiple SampleGroupDescription and SampleToGroup boxes
    +
    2249  // with different grouping types. For common encryption, the relevant
    +
    2250  // grouping type is 'seig'. Continue reading until 'seig' is found, or
    +
    2251  // until running out of child boxes.
    +
    2252  while (sample_to_group.grouping_type != FOURCC_SEIG &&
    +
    2253  buffer->reader()->ChildExist(&sample_to_group)) {
    +
    2254  RCHECK(buffer->reader()->ReadChild(&sample_to_group));
    +
    2255  }
    +
    2256  while (sample_group_description.grouping_type != FOURCC_SEIG &&
    +
    2257  buffer->reader()->ChildExist(&sample_group_description)) {
    +
    2258  RCHECK(buffer->reader()->ReadChild(&sample_group_description));
    +
    2259  }
    +
    2260  } else {
    +
    2261  if (!decode_time_absent)
    +
    2262  RCHECK(buffer->ReadWriteChild(&decode_time));
    +
    2263  for (uint32_t i = 0; i < runs.size(); ++i)
    +
    2264  RCHECK(buffer->ReadWriteChild(&runs[i]));
    +
    2265  RCHECK(buffer->TryReadWriteChild(&sample_to_group) &&
    +
    2266  buffer->TryReadWriteChild(&sample_group_description));
    +
    2267  }
    +
    2268  return buffer->TryReadWriteChild(&auxiliary_size) &&
    +
    2269  buffer->TryReadWriteChild(&auxiliary_offset) &&
    +
    2270  buffer->TryReadWriteChild(&sample_encryption);
    +
    2271 }
    +
    2272 
    +
    2273 uint32_t TrackFragment::ComputeSizeInternal() {
    +
    2274  uint32_t box_size =
    +
    2275  HeaderSize() + header.ComputeSize() + decode_time.ComputeSize() +
    +
    2276  sample_to_group.ComputeSize() + sample_group_description.ComputeSize() +
    +
    2277  auxiliary_size.ComputeSize() + auxiliary_offset.ComputeSize() +
    +
    2278  sample_encryption.ComputeSize();
    +
    2279  for (uint32_t i = 0; i < runs.size(); ++i)
    +
    2280  box_size += runs[i].ComputeSize();
    +
    2281  return box_size;
    +
    2282 }
    +
    2283 
    +
    2284 MovieFragment::MovieFragment() {}
    +
    2285 MovieFragment::~MovieFragment() {}
    +
    2286 FourCC MovieFragment::BoxType() const { return FOURCC_MOOF; }
    +
    2287 
    +
    2288 bool MovieFragment::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2289  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    2290  buffer->PrepareChildren() &&
    +
    2291  buffer->ReadWriteChild(&header));
    +
    2292  if (buffer->Reading()) {
    +
    2293  BoxReader* reader = buffer->reader();
    +
    2294  DCHECK(reader);
    +
    2295  RCHECK(reader->ReadChildren(&tracks) &&
    +
    2296  reader->TryReadChildren(&pssh));
    +
    2297  } else {
    +
    2298  for (uint32_t i = 0; i < tracks.size(); ++i)
    +
    2299  RCHECK(buffer->ReadWriteChild(&tracks[i]));
    +
    2300  for (uint32_t i = 0; i < pssh.size(); ++i)
    +
    2301  RCHECK(buffer->ReadWriteChild(&pssh[i]));
    +
    2302  }
    +
    2303  return true;
    +
    2304 }
    +
    2305 
    +
    2306 uint32_t MovieFragment::ComputeSizeInternal() {
    +
    2307  uint32_t box_size = HeaderSize() + header.ComputeSize();
    +
    2308  for (uint32_t i = 0; i < tracks.size(); ++i)
    +
    2309  box_size += tracks[i].ComputeSize();
    +
    2310  for (uint32_t i = 0; i < pssh.size(); ++i)
    +
    2311  box_size += pssh[i].ComputeSize();
    +
    2312  return box_size;
    +
    2313 }
    +
    2314 
    +
    2315 SegmentIndex::SegmentIndex()
    +
    2316  : reference_id(0),
    +
    2317  timescale(0),
    +
    2318  earliest_presentation_time(0),
    +
    2319  first_offset(0) {}
    +
    2320 SegmentIndex::~SegmentIndex() {}
    +
    2321 FourCC SegmentIndex::BoxType() const { return FOURCC_SIDX; }
    +
    2322 
    +
    2323 bool SegmentIndex::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2324  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    2325  buffer->ReadWriteUInt32(&reference_id) &&
    +
    2326  buffer->ReadWriteUInt32(&timescale));
    +
    2327 
    +
    2328  size_t num_bytes = (version == 1) ? sizeof(uint64_t) : sizeof(uint32_t);
    +
    2329  RCHECK(
    +
    2330  buffer->ReadWriteUInt64NBytes(&earliest_presentation_time, num_bytes) &&
    +
    2331  buffer->ReadWriteUInt64NBytes(&first_offset, num_bytes));
    +
    2332 
    +
    2333  uint16_t reference_count = references.size();
    +
    2334  RCHECK(buffer->IgnoreBytes(2) && // reserved.
    +
    2335  buffer->ReadWriteUInt16(&reference_count));
    +
    2336  references.resize(reference_count);
    +
    2337 
    +
    2338  uint32_t reference_type_size;
    +
    2339  uint32_t sap;
    +
    2340  for (uint32_t i = 0; i < reference_count; ++i) {
    +
    2341  if (!buffer->Reading()) {
    +
    2342  reference_type_size = references[i].referenced_size;
    +
    2343  if (references[i].reference_type)
    +
    2344  reference_type_size |= (1 << 31);
    +
    2345  sap = (references[i].sap_type << 28) | references[i].sap_delta_time;
    +
    2346  if (references[i].starts_with_sap)
    +
    2347  sap |= (1 << 31);
    +
    2348  }
    +
    2349  RCHECK(buffer->ReadWriteUInt32(&reference_type_size) &&
    +
    2350  buffer->ReadWriteUInt32(&references[i].subsegment_duration) &&
    +
    2351  buffer->ReadWriteUInt32(&sap));
    +
    2352  if (buffer->Reading()) {
    +
    2353  references[i].reference_type = (reference_type_size >> 31) ? true : false;
    +
    2354  references[i].referenced_size = reference_type_size & ~(1 << 31);
    +
    2355  references[i].starts_with_sap = (sap >> 31) ? true : false;
    +
    2356  references[i].sap_type =
    +
    2357  static_cast<SegmentReference::SAPType>((sap >> 28) & 0x07);
    +
    2358  references[i].sap_delta_time = sap & ~(0xF << 28);
    +
    2359  }
    +
    2360  }
    +
    2361  return true;
    +
    2362 }
    +
    2363 
    +
    2364 uint32_t SegmentIndex::ComputeSizeInternal() {
    +
    2365  version = IsFitIn32Bits(earliest_presentation_time, first_offset) ? 0 : 1;
    +
    2366  return HeaderSize() + sizeof(reference_id) + sizeof(timescale) +
    +
    2367  sizeof(uint32_t) * (1 + version) * 2 + 2 * sizeof(uint16_t) +
    +
    2368  3 * sizeof(uint32_t) * references.size();
    +
    2369 }
    +
    2370 
    +
    2371 MediaData::MediaData() : data_size(0) {}
    +
    2372 MediaData::~MediaData() {}
    +
    2373 FourCC MediaData::BoxType() const { return FOURCC_MDAT; }
    +
    2374 
    +
    2375 bool MediaData::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2376  NOTIMPLEMENTED() << "Actual data is parsed and written separately.";
    +
    2377  return false;
    +
    2378 }
    +
    2379 
    +
    2380 uint32_t MediaData::ComputeSizeInternal() {
    +
    2381  return HeaderSize() + data_size;
    +
    2382 }
    +
    2383 
    +
    2384 CueSourceIDBox::CueSourceIDBox() : source_id(kCueSourceIdNotSet) {}
    +
    2385 CueSourceIDBox::~CueSourceIDBox() {}
    +
    2386 
    +
    2387 FourCC CueSourceIDBox::BoxType() const { return FOURCC_vsid; }
    +
    2388 
    +
    2389 bool CueSourceIDBox::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2390  RCHECK(ReadWriteHeaderInternal(buffer) && buffer->ReadWriteInt32(&source_id));
    +
    2391  return true;
    +
    2392 }
    +
    2393 
    +
    2394 uint32_t CueSourceIDBox::ComputeSizeInternal() {
    +
    2395  if (source_id == kCueSourceIdNotSet)
    +
    2396  return 0;
    +
    2397  return HeaderSize() + sizeof(source_id);
    +
    2398 }
    +
    2399 
    +
    2400 CueTimeBox::CueTimeBox() {}
    +
    2401 CueTimeBox::~CueTimeBox() {}
    +
    2402 
    +
    2403 FourCC CueTimeBox::BoxType() const {
    +
    2404  return FOURCC_ctim;
    +
    2405 }
    +
    2406 
    +
    2407 bool CueTimeBox::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2408  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    2409  return buffer->ReadWriteString(
    +
    2410  &cue_current_time,
    +
    2411  buffer->Reading() ? buffer->BytesLeft() : cue_current_time.size());
    +
    2412 }
    +
    2413 
    +
    2414 uint32_t CueTimeBox::ComputeSizeInternal() {
    +
    2415  if (cue_current_time.empty())
    +
    2416  return 0;
    +
    2417  return HeaderSize() + cue_current_time.size();
    +
    2418 }
    +
    2419 
    +
    2420 CueIDBox::CueIDBox() {}
    +
    2421 CueIDBox::~CueIDBox() {}
    +
    2422 
    +
    2423 FourCC CueIDBox::BoxType() const {
    +
    2424  return FOURCC_iden;
    +
    2425 }
    +
    2426 
    +
    2427 bool CueIDBox::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2428  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    2429  return buffer->ReadWriteString(
    +
    2430  &cue_id, buffer->Reading() ? buffer->BytesLeft() : cue_id.size());
    +
    2431 }
    +
    2432 
    +
    2433 uint32_t CueIDBox::ComputeSizeInternal() {
    +
    2434  if (cue_id.empty())
    +
    2435  return 0;
    +
    2436  return HeaderSize() + cue_id.size();
    +
    2437 }
    +
    2438 
    +
    2439 CueSettingsBox::CueSettingsBox() {}
    +
    2440 CueSettingsBox::~CueSettingsBox() {}
    +
    2441 
    +
    2442 FourCC CueSettingsBox::BoxType() const {
    +
    2443  return FOURCC_sttg;
    +
    2444 }
    +
    2445 
    +
    2446 bool CueSettingsBox::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2447  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    2448  return buffer->ReadWriteString(
    +
    2449  &settings, buffer->Reading() ? buffer->BytesLeft() : settings.size());
    +
    2450 }
    +
    2451 
    +
    2452 uint32_t CueSettingsBox::ComputeSizeInternal() {
    +
    2453  if (settings.empty())
    +
    2454  return 0;
    +
    2455  return HeaderSize() + settings.size();
    +
    2456 }
    +
    2457 
    +
    2458 CuePayloadBox::CuePayloadBox() {}
    +
    2459 CuePayloadBox::~CuePayloadBox() {}
    2460 
    -
    2461 bool VTTEmptyCueBox::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2462  return ReadWriteHeaderInternal(buffer);
    +
    2461 FourCC CuePayloadBox::BoxType() const {
    +
    2462  return FOURCC_payl;
    2463 }
    2464 
    -
    2465 uint32_t VTTEmptyCueBox::ComputeSizeInternal() {
    -
    2466  return HeaderSize();
    -
    2467 }
    -
    2468 
    -
    2469 VTTAdditionalTextBox::VTTAdditionalTextBox() {}
    -
    2470 VTTAdditionalTextBox::~VTTAdditionalTextBox() {}
    -
    2471 
    - -
    2473  return FOURCC_vtta;
    -
    2474 }
    -
    2475 
    -
    2476 bool VTTAdditionalTextBox::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2477  RCHECK(ReadWriteHeaderInternal(buffer));
    -
    2478  return buffer->ReadWriteString(
    -
    2479  &cue_additional_text,
    -
    2480  buffer->Reading() ? buffer->BytesLeft() : cue_additional_text.size());
    -
    2481 }
    -
    2482 
    -
    2483 uint32_t VTTAdditionalTextBox::ComputeSizeInternal() {
    -
    2484  return HeaderSize() + cue_additional_text.size();
    -
    2485 }
    -
    2486 
    -
    2487 VTTCueBox::VTTCueBox() {}
    -
    2488 VTTCueBox::~VTTCueBox() {}
    +
    2465 bool CuePayloadBox::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2466  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    2467  return buffer->ReadWriteString(
    +
    2468  &cue_text, buffer->Reading() ? buffer->BytesLeft() : cue_text.size());
    +
    2469 }
    +
    2470 
    +
    2471 uint32_t CuePayloadBox::ComputeSizeInternal() {
    +
    2472  return HeaderSize() + cue_text.size();
    +
    2473 }
    +
    2474 
    +
    2475 VTTEmptyCueBox::VTTEmptyCueBox() {}
    +
    2476 VTTEmptyCueBox::~VTTEmptyCueBox() {}
    +
    2477 
    +
    2478 FourCC VTTEmptyCueBox::BoxType() const {
    +
    2479  return FOURCC_vtte;
    +
    2480 }
    +
    2481 
    +
    2482 bool VTTEmptyCueBox::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2483  return ReadWriteHeaderInternal(buffer);
    +
    2484 }
    +
    2485 
    +
    2486 uint32_t VTTEmptyCueBox::ComputeSizeInternal() {
    +
    2487  return HeaderSize();
    +
    2488 }
    2489 
    -
    2490 FourCC VTTCueBox::BoxType() const {
    -
    2491  return FOURCC_vttc;
    -
    2492 }
    -
    2493 
    -
    2494 bool VTTCueBox::ReadWriteInternal(BoxBuffer* buffer) {
    -
    2495  RCHECK(ReadWriteHeaderInternal(buffer) &&
    -
    2496  buffer->PrepareChildren() &&
    -
    2497  buffer->ReadWriteChild(&cue_source_id) &&
    -
    2498  buffer->ReadWriteChild(&cue_id) &&
    -
    2499  buffer->ReadWriteChild(&cue_time) &&
    -
    2500  buffer->ReadWriteChild(&cue_settings) &&
    -
    2501  buffer->ReadWriteChild(&cue_payload));
    -
    2502  return true;
    -
    2503 }
    -
    2504 
    -
    2505 uint32_t VTTCueBox::ComputeSizeInternal() {
    -
    2506  return HeaderSize() + cue_source_id.ComputeSize() + cue_id.ComputeSize() +
    -
    2507  cue_time.ComputeSize() + cue_settings.ComputeSize() +
    -
    2508  cue_payload.ComputeSize();
    -
    2509 }
    +
    2490 VTTAdditionalTextBox::VTTAdditionalTextBox() {}
    +
    2491 VTTAdditionalTextBox::~VTTAdditionalTextBox() {}
    +
    2492 
    + +
    2494  return FOURCC_vtta;
    +
    2495 }
    +
    2496 
    +
    2497 bool VTTAdditionalTextBox::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2498  RCHECK(ReadWriteHeaderInternal(buffer));
    +
    2499  return buffer->ReadWriteString(
    +
    2500  &cue_additional_text,
    +
    2501  buffer->Reading() ? buffer->BytesLeft() : cue_additional_text.size());
    +
    2502 }
    +
    2503 
    +
    2504 uint32_t VTTAdditionalTextBox::ComputeSizeInternal() {
    +
    2505  return HeaderSize() + cue_additional_text.size();
    +
    2506 }
    +
    2507 
    +
    2508 VTTCueBox::VTTCueBox() {}
    +
    2509 VTTCueBox::~VTTCueBox() {}
    2510 
    -
    2511 } // namespace mp4
    -
    2512 } // namespace media
    -
    2513 } // namespace edash_packager
    - -
    FourCC BoxType() const override
    - - +
    2511 FourCC VTTCueBox::BoxType() const {
    +
    2512  return FOURCC_vttc;
    +
    2513 }
    +
    2514 
    +
    2515 bool VTTCueBox::ReadWriteInternal(BoxBuffer* buffer) {
    +
    2516  RCHECK(ReadWriteHeaderInternal(buffer) &&
    +
    2517  buffer->PrepareChildren() &&
    +
    2518  buffer->ReadWriteChild(&cue_source_id) &&
    +
    2519  buffer->ReadWriteChild(&cue_id) &&
    +
    2520  buffer->ReadWriteChild(&cue_time) &&
    +
    2521  buffer->ReadWriteChild(&cue_settings) &&
    +
    2522  buffer->ReadWriteChild(&cue_payload));
    +
    2523  return true;
    +
    2524 }
    +
    2525 
    +
    2526 uint32_t VTTCueBox::ComputeSizeInternal() {
    +
    2527  return HeaderSize() + cue_source_id.ComputeSize() + cue_id.ComputeSize() +
    +
    2528  cue_time.ComputeSize() + cue_settings.ComputeSize() +
    +
    2529  cue_payload.ComputeSize();
    +
    2530 }
    +
    2531 
    +
    2532 } // namespace mp4
    +
    2533 } // namespace media
    +
    2534 } // namespace edash_packager
    + +
    FourCC BoxType() const override
    + +
    bool ReadChildren(std::vector< T > *children) WARN_UNUSED_RESULT
    Definition: box_reader.h:133
    - +
    bool ReadChild(Box *child) WARN_UNUSED_RESULT
    Definition: box_reader.cc:123
    - - - + + +
    virtual bool ReadWriteHeaderInternal(BoxBuffer *buffer)
    Definition: box.cc:60
    - - + +
    bool ReadWriteHeaderInternal(BoxBuffer *buffer) final
    Definition: box.cc:79
    - + - -
    bool ParseFromSampleEncryptionData(size_t iv_size, std::vector< SampleEncryptionEntry > *sample_encryption_entries) const
    - - - - - - + +
    bool ParseFromSampleEncryptionData(size_t iv_size, std::vector< SampleEncryptionEntry > *sample_encryption_entries) const
    + + + + + - - + + - +
    bool ChildExist(Box *child) WARN_UNUSED_RESULT
    Definition: box_reader.cc:136
    - - + + - - - - - - + + + + + + +
    bool ReadWriteUInt64NBytes(uint64_t *v, size_t num_bytes)
    Definition: box_buffer.h:117
    - - - - - - - + + + + + + + - - - - - - + + + + +
    PrivFrame private_frame
    We only support PrivateFrame in ID3. Other frames are ignored.
    bool ReadWriteString(std::string *str, size_t size)
    Definition: box_buffer.h:139
    - - + +
    bool IgnoreBytes(size_t num_bytes)
    Definition: box_buffer.h:189
    - - + + - + - - - - + + + + - - + + - - + +
    virtual uint32_t HeaderSize() const
    Definition: box.cc:54
    - +
    void Write(BufferWriter *writer)
    Definition: box.cc:25
    - -
    bool ParseFromBuffer(uint8_t iv_size, bool has_subsamples, BufferReader *reader)
    - - - - - - + +
    bool ParseFromBuffer(uint8_t iv_size, bool has_subsamples, BufferReader *reader)
    + + + + + +
    bool TryReadChildren(std::vector< T > *children) WARN_UNUSED_RESULT
    Definition: box_reader.h:139
    Class for reading MP4 boxes.
    Definition: box_reader.h:24
    - - - - + + + + -
    bool ReadWrite(uint8_t iv_size, bool has_subsamples, BoxBuffer *buffer)
    +
    bool ReadWrite(uint8_t iv_size, bool has_subsamples, BoxBuffer *buffer)
    - - - + + +
    uint32_t HeaderSize() const final
    Definition: box.cc:74
    - - - + + + diff --git a/docs/dd/def/classedash__packager_1_1media_1_1TextTrackConfig.html b/docs/dd/def/classedash__packager_1_1media_1_1TextTrackConfig.html index de5b320d4b..54404c959c 100644 --- a/docs/dd/def/classedash__packager_1_1media_1_1TextTrackConfig.html +++ b/docs/dd/def/classedash__packager_1_1media_1_1TextTrackConfig.html @@ -125,7 +125,7 @@ const std::string & id diff --git a/docs/dd/df2/webm_2multi__segment__segmenter_8h_source.html b/docs/dd/df2/webm_2multi__segment__segmenter_8h_source.html index fd73fc3f12..5fefe8f75a 100644 --- a/docs/dd/df2/webm_2multi__segment__segmenter_8h_source.html +++ b/docs/dd/df2/webm_2multi__segment__segmenter_8h_source.html @@ -149,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dd/dfa/structedash__packager_1_1media_1_1MuxerOptions-members.html b/docs/dd/dfa/structedash__packager_1_1media_1_1MuxerOptions-members.html index 33f475e253..4ef0441603 100644 --- a/docs/dd/dfa/structedash__packager_1_1media_1_1MuxerOptions-members.html +++ b/docs/dd/dfa/structedash__packager_1_1media_1_1MuxerOptions-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d07/structedash__packager_1_1media_1_1mp4_1_1CueIDBox.html b/docs/de/d07/structedash__packager_1_1media_1_1mp4_1_1CueIDBox.html index fe39e89a49..e622433516 100644 --- a/docs/de/d07/structedash__packager_1_1media_1_1mp4_1_1CueIDBox.html +++ b/docs/de/d07/structedash__packager_1_1media_1_1mp4_1_1CueIDBox.html @@ -136,7 +136,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 728 of file box_definitions.h.

    +

    Definition at line 735 of file box_definitions.h.

    Member Function Documentation

    @@ -162,7 +162,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 2402 of file box_definitions.cc.

    +

    Definition at line 2423 of file box_definitions.cc.

    @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/de/d0f/local__file_8h_source.html b/docs/de/d0f/local__file_8h_source.html index 481e3429f7..27089267a7 100644 --- a/docs/de/d0f/local__file_8h_source.html +++ b/docs/de/d0f/local__file_8h_source.html @@ -152,7 +152,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d12/container__names_8h_source.html b/docs/de/d12/container__names_8h_source.html index d067ce9104..abe1f754c7 100644 --- a/docs/de/d12/container__names_8h_source.html +++ b/docs/de/d12/container__names_8h_source.html @@ -159,7 +159,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d15/media__stream_8cc_source.html b/docs/de/d15/media__stream_8cc_source.html index a734b324f5..0e9b31ca87 100644 --- a/docs/de/d15/media__stream_8cc_source.html +++ b/docs/de/d15/media__stream_8cc_source.html @@ -210,7 +210,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d17/cluster__builder_8cc_source.html b/docs/de/d17/cluster__builder_8cc_source.html index a79a0bd1ff..3f3342b934 100644 --- a/docs/de/d17/cluster__builder_8cc_source.html +++ b/docs/de/d17/cluster__builder_8cc_source.html @@ -330,7 +330,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d18/classedash__packager_1_1media_1_1WebVttMediaParser-members.html b/docs/de/d18/classedash__packager_1_1media_1_1WebVttMediaParser-members.html index 00bf3ff039..61865265cf 100644 --- a/docs/de/d18/classedash__packager_1_1media_1_1WebVttMediaParser-members.html +++ b/docs/de/d18/classedash__packager_1_1media_1_1WebVttMediaParser-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d19/classedash__packager_1_1media_1_1File.html b/docs/de/d19/classedash__packager_1_1media_1_1File.html index 37f2acac74..8f24aea660 100644 --- a/docs/de/d19/classedash__packager_1_1media_1_1File.html +++ b/docs/de/d19/classedash__packager_1_1media_1_1File.html @@ -811,7 +811,7 @@ class ThreadedIoFile diff --git a/docs/de/d1e/mp4_2single__segment__segmenter_8cc_source.html b/docs/de/d1e/mp4_2single__segment__segmenter_8cc_source.html index 7f59ffca39..bad563ef33 100644 --- a/docs/de/d1e/mp4_2single__segment__segmenter_8cc_source.html +++ b/docs/de/d1e/mp4_2single__segment__segmenter_8cc_source.html @@ -328,12 +328,12 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    static bool Delete(const char *file_name)
    Definition: file.cc:162
    virtual bool Open()=0
    Internal open. Should not be used directly.
    -
    void UpdateProgress(uint64_t progress)
    Update segmentation progress using ProgressListener.
    Definition: segmenter.cc:202
    +
    void UpdateProgress(uint64_t progress)
    Update segmentation progress using ProgressListener.
    Definition: segmenter.cc:219
    virtual void OnSampleDurationReady(uint32_t sample_duration)=0
    diff --git a/docs/de/d1f/structedash__packager_1_1media_1_1StreamDescriptor.html b/docs/de/d1f/structedash__packager_1_1media_1_1StreamDescriptor.html index 5930957415..6d07ab9588 100644 --- a/docs/de/d1f/structedash__packager_1_1media_1_1StreamDescriptor.html +++ b/docs/de/d1f/structedash__packager_1_1media_1_1StreamDescriptor.html @@ -131,7 +131,7 @@ MediaContainerName output_ diff --git a/docs/de/d34/offset__byte__queue_8h_source.html b/docs/de/d34/offset__byte__queue_8h_source.html index abd1213fda..c216523fae 100644 --- a/docs/de/d34/offset__byte__queue_8h_source.html +++ b/docs/de/d34/offset__byte__queue_8h_source.html @@ -143,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d3c/macros_8h_source.html b/docs/de/d3c/macros_8h_source.html index 4159439320..ccef96d6a4 100644 --- a/docs/de/d3c/macros_8h_source.html +++ b/docs/de/d3c/macros_8h_source.html @@ -144,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d3e/buffer__reader_8h_source.html b/docs/de/d3e/buffer__reader_8h_source.html index b1cad42388..cfcf162dc5 100644 --- a/docs/de/d3e/buffer__reader_8h_source.html +++ b/docs/de/d3e/buffer__reader_8h_source.html @@ -163,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d44/structedash__packager_1_1media_1_1mp4_1_1TrackEncryption.html b/docs/de/d44/structedash__packager_1_1media_1_1mp4_1_1TrackEncryption.html index 09bf648183..069f4e8c76 100644 --- a/docs/de/d44/structedash__packager_1_1media_1_1mp4_1_1TrackEncryption.html +++ b/docs/de/d44/structedash__packager_1_1media_1_1mp4_1_1TrackEncryption.html @@ -177,7 +177,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 410 of file box_definitions.cc.

    +

    Definition at line 411 of file box_definitions.cc.

    @@ -188,7 +188,7 @@ Additional Inherited Members diff --git a/docs/de/d48/classedash__packager_1_1media_1_1VP8Parser-members.html b/docs/de/d48/classedash__packager_1_1media_1_1VP8Parser-members.html index a172d8e055..0f1c6b6172 100644 --- a/docs/de/d48/classedash__packager_1_1media_1_1VP8Parser-members.html +++ b/docs/de/d48/classedash__packager_1_1media_1_1VP8Parser-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d4a/muxer__listener__internal_8h_source.html b/docs/de/d4a/muxer__listener__internal_8h_source.html index e09f735b28..f4099c8c95 100644 --- a/docs/de/d4a/muxer__listener__internal_8h_source.html +++ b/docs/de/d4a/muxer__listener__internal_8h_source.html @@ -144,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d4c/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPat-members.html b/docs/de/d4c/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPat-members.html index f1a4f79ac8..6ac0569f92 100644 --- a/docs/de/d4c/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPat-members.html +++ b/docs/de/d4c/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPat-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d57/structedash__packager_1_1media_1_1MuxerOptions.html b/docs/de/d57/structedash__packager_1_1media_1_1MuxerOptions.html index d2ab95c014..45e37ea05b 100644 --- a/docs/de/d57/structedash__packager_1_1media_1_1MuxerOptions.html +++ b/docs/de/d57/structedash__packager_1_1media_1_1MuxerOptions.html @@ -275,7 +275,7 @@ std::string  diff --git a/docs/de/d59/classedash__packager_1_1media_1_1mp2t_1_1EsParserAdts.html b/docs/de/d59/classedash__packager_1_1media_1_1mp2t_1_1EsParserAdts.html index 71ab85714e..412a2a87ce 100644 --- a/docs/de/d59/classedash__packager_1_1media_1_1mp2t_1_1EsParserAdts.html +++ b/docs/de/d59/classedash__packager_1_1media_1_1mp2t_1_1EsParserAdts.html @@ -148,7 +148,7 @@ const scoped_refptr
    diff --git a/docs/de/d5a/structedash__packager_1_1media_1_1mp4_1_1SchemeType-members.html b/docs/de/d5a/structedash__packager_1_1media_1_1mp4_1_1SchemeType-members.html index 49b58cce8e..925cb283ee 100644 --- a/docs/de/d5a/structedash__packager_1_1media_1_1mp4_1_1SchemeType-members.html +++ b/docs/de/d5a/structedash__packager_1_1media_1_1mp4_1_1SchemeType-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d5b/adts__header_8cc_source.html b/docs/de/d5b/adts__header_8cc_source.html index 3c504966d7..94b3b1bb94 100644 --- a/docs/de/d5b/adts__header_8cc_source.html +++ b/docs/de/d5b/adts__header_8cc_source.html @@ -207,7 +207,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d5c/mpd__flags_8h_source.html b/docs/de/d5c/mpd__flags_8h_source.html index 7c9ed722f6..b9f80fd319 100644 --- a/docs/de/d5c/mpd__flags_8h_source.html +++ b/docs/de/d5c/mpd__flags_8h_source.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d68/structedash__packager_1_1media_1_1mp4_1_1Track-members.html b/docs/de/d68/structedash__packager_1_1media_1_1mp4_1_1Track-members.html index fb9ddcaa5c..fc844826f0 100644 --- a/docs/de/d68/structedash__packager_1_1media_1_1mp4_1_1Track-members.html +++ b/docs/de/d68/structedash__packager_1_1media_1_1mp4_1_1Track-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d6a/classedash__packager_1_1media_1_1webm_1_1WebMMuxer.html b/docs/de/d6a/classedash__packager_1_1media_1_1webm_1_1WebMMuxer.html index cb6007c872..2a8e7c2e7c 100644 --- a/docs/de/d6a/classedash__packager_1_1media_1_1webm_1_1WebMMuxer.html +++ b/docs/de/d6a/classedash__packager_1_1media_1_1webm_1_1WebMMuxer.html @@ -179,7 +179,7 @@ base::Clock * clock () diff --git a/docs/de/d6e/language__utils_8h_source.html b/docs/de/d6e/language__utils_8h_source.html index 4dc59fd197..1c3e70d228 100644 --- a/docs/de/d6e/language__utils_8h_source.html +++ b/docs/de/d6e/language__utils_8h_source.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d70/http__key__fetcher_8cc_source.html b/docs/de/d70/http__key__fetcher_8cc_source.html index 53ac450a14..90d7f798ea 100644 --- a/docs/de/d70/http__key__fetcher_8cc_source.html +++ b/docs/de/d70/http__key__fetcher_8cc_source.html @@ -238,7 +238,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d77/classedash__packager_1_1media_1_1VodMediaInfoDumpMuxerListener-members.html b/docs/de/d77/classedash__packager_1_1media_1_1VodMediaInfoDumpMuxerListener-members.html index ed2b4e6d14..492c5bfc92 100644 --- a/docs/de/d77/classedash__packager_1_1media_1_1VodMediaInfoDumpMuxerListener-members.html +++ b/docs/de/d77/classedash__packager_1_1media_1_1VodMediaInfoDumpMuxerListener-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d77/webm__content__encodings__client_8cc_source.html b/docs/de/d77/webm__content__encodings__client_8cc_source.html index c7a12aea2d..5d3431d1b3 100644 --- a/docs/de/d77/webm__content__encodings__client_8cc_source.html +++ b/docs/de/d77/webm__content__encodings__client_8cc_source.html @@ -361,7 +361,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d7b/mp4__media__parser_8h_source.html b/docs/de/d7b/mp4__media__parser_8h_source.html index 32e4cd2c62..23f084f7fc 100644 --- a/docs/de/d7b/mp4__media__parser_8h_source.html +++ b/docs/de/d7b/mp4__media__parser_8h_source.html @@ -217,7 +217,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d83/box__definitions__comparison_8h_source.html b/docs/de/d83/box__definitions__comparison_8h_source.html index 03cb64719e..765d95d661 100644 --- a/docs/de/d83/box__definitions__comparison_8h_source.html +++ b/docs/de/d83/box__definitions__comparison_8h_source.html @@ -329,244 +329,249 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    240  lhs.extra_data == rhs.extra_data;
    241 }
    242 
    -
    243 inline bool operator==(const AudioSampleEntry& lhs,
    -
    244  const AudioSampleEntry& rhs) {
    -
    245  return lhs.format == rhs.format &&
    -
    246  lhs.data_reference_index == rhs.data_reference_index &&
    -
    247  lhs.channelcount == rhs.channelcount &&
    -
    248  lhs.samplesize == rhs.samplesize && lhs.samplerate == rhs.samplerate &&
    -
    249  lhs.sinf == rhs.sinf && lhs.esds == rhs.esds &&
    -
    250  lhs.ddts == rhs.ddts;
    -
    251 }
    -
    252 
    -
    253 inline bool operator==(const WebVTTConfigurationBox& lhs,
    -
    254  const WebVTTConfigurationBox& rhs) {
    -
    255  return lhs.config == rhs.config;
    +
    243 inline bool operator==(const AC3Specific& lhs,
    +
    244  const AC3Specific& rhs) {
    +
    245  return lhs.data == rhs.data;
    +
    246 }
    +
    247 
    +
    248 inline bool operator==(const AudioSampleEntry& lhs,
    +
    249  const AudioSampleEntry& rhs) {
    +
    250  return lhs.format == rhs.format &&
    +
    251  lhs.data_reference_index == rhs.data_reference_index &&
    +
    252  lhs.channelcount == rhs.channelcount &&
    +
    253  lhs.samplesize == rhs.samplesize && lhs.samplerate == rhs.samplerate &&
    +
    254  lhs.sinf == rhs.sinf && lhs.esds == rhs.esds && lhs.ddts == rhs.ddts &&
    +
    255  lhs.dac3 == rhs.dac3;
    256 }
    257 
    -
    258 inline bool operator==(const WebVTTSourceLabelBox& lhs,
    -
    259  const WebVTTSourceLabelBox& rhs) {
    -
    260  return lhs.source_label == rhs.source_label;
    +
    258 inline bool operator==(const WebVTTConfigurationBox& lhs,
    +
    259  const WebVTTConfigurationBox& rhs) {
    +
    260  return lhs.config == rhs.config;
    261 }
    262 
    -
    263 inline bool operator==(const WVTTSampleEntry& lhs,
    -
    264  const WVTTSampleEntry& rhs) {
    -
    265  return lhs.config == rhs.config && lhs.label == rhs.label;
    +
    263 inline bool operator==(const WebVTTSourceLabelBox& lhs,
    +
    264  const WebVTTSourceLabelBox& rhs) {
    +
    265  return lhs.source_label == rhs.source_label;
    266 }
    267 
    -
    268 inline bool operator==(const MediaHeader& lhs, const MediaHeader& rhs) {
    -
    269  return lhs.creation_time == rhs.creation_time &&
    -
    270  lhs.modification_time == rhs.modification_time &&
    -
    271  lhs.timescale == rhs.timescale && lhs.duration == rhs.duration &&
    -
    272  lhs.language == rhs.language;
    -
    273 }
    -
    274 
    -
    275 inline bool operator==(const VideoMediaHeader& lhs,
    -
    276  const VideoMediaHeader& rhs) {
    -
    277  return lhs.graphicsmode == rhs.graphicsmode &&
    -
    278  lhs.opcolor_red == rhs.opcolor_red &&
    -
    279  lhs.opcolor_green == rhs.opcolor_green &&
    -
    280  lhs.opcolor_blue == rhs.opcolor_blue;
    -
    281 }
    -
    282 
    -
    283 inline bool operator==(const SoundMediaHeader& lhs,
    -
    284  const SoundMediaHeader& rhs) {
    -
    285  return lhs.balance == rhs.balance;
    +
    268 inline bool operator==(const WVTTSampleEntry& lhs,
    +
    269  const WVTTSampleEntry& rhs) {
    +
    270  return lhs.config == rhs.config && lhs.label == rhs.label;
    +
    271 }
    +
    272 
    +
    273 inline bool operator==(const MediaHeader& lhs, const MediaHeader& rhs) {
    +
    274  return lhs.creation_time == rhs.creation_time &&
    +
    275  lhs.modification_time == rhs.modification_time &&
    +
    276  lhs.timescale == rhs.timescale && lhs.duration == rhs.duration &&
    +
    277  lhs.language == rhs.language;
    +
    278 }
    +
    279 
    +
    280 inline bool operator==(const VideoMediaHeader& lhs,
    +
    281  const VideoMediaHeader& rhs) {
    +
    282  return lhs.graphicsmode == rhs.graphicsmode &&
    +
    283  lhs.opcolor_red == rhs.opcolor_red &&
    +
    284  lhs.opcolor_green == rhs.opcolor_green &&
    +
    285  lhs.opcolor_blue == rhs.opcolor_blue;
    286 }
    287 
    -
    288 inline bool operator==(const SubtitleMediaHeader& lhs,
    -
    289  const SubtitleMediaHeader& rhs) {
    -
    290  return true;
    +
    288 inline bool operator==(const SoundMediaHeader& lhs,
    +
    289  const SoundMediaHeader& rhs) {
    +
    290  return lhs.balance == rhs.balance;
    291 }
    292 
    -
    293 inline bool operator==(const DataEntryUrl& lhs, const DataEntryUrl& rhs) {
    -
    294  return lhs.flags == rhs.flags && lhs.location == rhs.location;
    -
    295 }
    -
    296 
    -
    297 inline bool operator==(const DataReference& lhs, const DataReference& rhs) {
    -
    298  return lhs.data_entry == rhs.data_entry;
    -
    299 }
    -
    300 
    -
    301 inline bool operator==(const DataInformation& lhs, const DataInformation& rhs) {
    -
    302  return lhs.dref == rhs.dref;
    -
    303 }
    -
    304 
    -
    305 inline bool operator==(const MediaInformation& lhs,
    -
    306  const MediaInformation& rhs) {
    -
    307  return lhs.dinf == rhs.dinf && lhs.sample_table == rhs.sample_table &&
    -
    308  lhs.vmhd == rhs.vmhd && lhs.smhd == rhs.smhd;
    -
    309 }
    -
    310 
    -
    311 inline bool operator==(const Media& lhs, const Media& rhs) {
    -
    312  return lhs.header == rhs.header && lhs.handler == rhs.handler &&
    -
    313  lhs.information == rhs.information;
    +
    293 inline bool operator==(const SubtitleMediaHeader& lhs,
    +
    294  const SubtitleMediaHeader& rhs) {
    +
    295  return true;
    +
    296 }
    +
    297 
    +
    298 inline bool operator==(const DataEntryUrl& lhs, const DataEntryUrl& rhs) {
    +
    299  return lhs.flags == rhs.flags && lhs.location == rhs.location;
    +
    300 }
    +
    301 
    +
    302 inline bool operator==(const DataReference& lhs, const DataReference& rhs) {
    +
    303  return lhs.data_entry == rhs.data_entry;
    +
    304 }
    +
    305 
    +
    306 inline bool operator==(const DataInformation& lhs, const DataInformation& rhs) {
    +
    307  return lhs.dref == rhs.dref;
    +
    308 }
    +
    309 
    +
    310 inline bool operator==(const MediaInformation& lhs,
    +
    311  const MediaInformation& rhs) {
    +
    312  return lhs.dinf == rhs.dinf && lhs.sample_table == rhs.sample_table &&
    +
    313  lhs.vmhd == rhs.vmhd && lhs.smhd == rhs.smhd;
    314 }
    315 
    -
    316 inline bool operator==(const Track& lhs, const Track& rhs) {
    -
    317  return lhs.header == rhs.header && lhs.media == rhs.media &&
    -
    318  lhs.edit == rhs.edit && lhs.sample_encryption == rhs.sample_encryption;
    +
    316 inline bool operator==(const Media& lhs, const Media& rhs) {
    +
    317  return lhs.header == rhs.header && lhs.handler == rhs.handler &&
    +
    318  lhs.information == rhs.information;
    319 }
    320 
    -
    321 inline bool operator==(const MovieExtendsHeader& lhs,
    -
    322  const MovieExtendsHeader& rhs) {
    -
    323  return lhs.fragment_duration == rhs.fragment_duration;
    +
    321 inline bool operator==(const Track& lhs, const Track& rhs) {
    +
    322  return lhs.header == rhs.header && lhs.media == rhs.media &&
    +
    323  lhs.edit == rhs.edit && lhs.sample_encryption == rhs.sample_encryption;
    324 }
    325 
    -
    326 inline bool operator==(const TrackExtends& lhs, const TrackExtends& rhs) {
    -
    327  return lhs.track_id == rhs.track_id &&
    -
    328  lhs.default_sample_description_index ==
    -
    329  rhs.default_sample_description_index &&
    -
    330  lhs.default_sample_duration == rhs.default_sample_duration &&
    -
    331  lhs.default_sample_size == rhs.default_sample_size &&
    -
    332  lhs.default_sample_flags == rhs.default_sample_flags;
    -
    333 }
    -
    334 
    -
    335 inline bool operator==(const MovieExtends& lhs, const MovieExtends& rhs) {
    -
    336  return lhs.header == rhs.header && lhs.tracks == rhs.tracks;
    -
    337 }
    -
    338 
    -
    339 inline bool operator==(const Movie& lhs, const Movie& rhs) {
    -
    340  return lhs.header == rhs.header && lhs.extends == rhs.extends &&
    -
    341  lhs.tracks == rhs.tracks && lhs.pssh == rhs.pssh;
    +
    326 inline bool operator==(const MovieExtendsHeader& lhs,
    +
    327  const MovieExtendsHeader& rhs) {
    +
    328  return lhs.fragment_duration == rhs.fragment_duration;
    +
    329 }
    +
    330 
    +
    331 inline bool operator==(const TrackExtends& lhs, const TrackExtends& rhs) {
    +
    332  return lhs.track_id == rhs.track_id &&
    +
    333  lhs.default_sample_description_index ==
    +
    334  rhs.default_sample_description_index &&
    +
    335  lhs.default_sample_duration == rhs.default_sample_duration &&
    +
    336  lhs.default_sample_size == rhs.default_sample_size &&
    +
    337  lhs.default_sample_flags == rhs.default_sample_flags;
    +
    338 }
    +
    339 
    +
    340 inline bool operator==(const MovieExtends& lhs, const MovieExtends& rhs) {
    +
    341  return lhs.header == rhs.header && lhs.tracks == rhs.tracks;
    342 }
    343 
    -
    344 inline bool operator==(const TrackFragmentDecodeTime& lhs,
    -
    345  const TrackFragmentDecodeTime& rhs) {
    -
    346  return lhs.decode_time == rhs.decode_time;
    +
    344 inline bool operator==(const Movie& lhs, const Movie& rhs) {
    +
    345  return lhs.header == rhs.header && lhs.extends == rhs.extends &&
    +
    346  lhs.tracks == rhs.tracks && lhs.pssh == rhs.pssh;
    347 }
    348 
    -
    349 inline bool operator==(const MovieFragmentHeader& lhs,
    -
    350  const MovieFragmentHeader& rhs) {
    -
    351  return lhs.sequence_number == rhs.sequence_number;
    +
    349 inline bool operator==(const TrackFragmentDecodeTime& lhs,
    +
    350  const TrackFragmentDecodeTime& rhs) {
    +
    351  return lhs.decode_time == rhs.decode_time;
    352 }
    353 
    -
    354 inline bool operator==(const TrackFragmentHeader& lhs,
    -
    355  const TrackFragmentHeader& rhs) {
    -
    356  return lhs.flags == rhs.flags && lhs.track_id == rhs.track_id &&
    -
    357  lhs.sample_description_index == rhs.sample_description_index &&
    -
    358  lhs.default_sample_duration == rhs.default_sample_duration &&
    -
    359  lhs.default_sample_size == rhs.default_sample_size &&
    -
    360  lhs.default_sample_flags == rhs.default_sample_flags;
    -
    361 }
    -
    362 
    -
    363 inline bool operator==(const TrackFragmentRun& lhs,
    -
    364  const TrackFragmentRun& rhs) {
    -
    365  return lhs.flags == rhs.flags && lhs.sample_count == rhs.sample_count &&
    -
    366  lhs.data_offset == rhs.data_offset &&
    -
    367  lhs.sample_flags == rhs.sample_flags &&
    -
    368  lhs.sample_sizes == rhs.sample_sizes &&
    -
    369  lhs.sample_durations == rhs.sample_durations &&
    -
    370  lhs.sample_composition_time_offsets ==
    -
    371  rhs.sample_composition_time_offsets;
    -
    372 }
    -
    373 
    -
    374 inline bool operator==(const SampleToGroupEntry& lhs,
    -
    375  const SampleToGroupEntry& rhs) {
    -
    376  return lhs.sample_count == rhs.sample_count &&
    -
    377  lhs.group_description_index == rhs.group_description_index;
    -
    378 }
    -
    379 
    -
    380 inline bool operator==(const SampleToGroup& lhs,
    -
    381  const SampleToGroup& rhs) {
    -
    382  return lhs.grouping_type == rhs.grouping_type &&
    -
    383  lhs.grouping_type_parameter == rhs.grouping_type_parameter &&
    -
    384  lhs.entries == rhs.entries;
    -
    385 }
    -
    386 
    -
    387 inline bool operator==(const CencSampleEncryptionInfoEntry& lhs,
    -
    388  const CencSampleEncryptionInfoEntry& rhs) {
    -
    389  return lhs.is_encrypted == rhs.is_encrypted &&
    -
    390  lhs.iv_size == rhs.iv_size &&
    -
    391  lhs.key_id == rhs.key_id;
    -
    392 }
    -
    393 
    -
    394 inline bool operator==(const SampleGroupDescription& lhs,
    -
    395  const SampleGroupDescription& rhs) {
    -
    396  return lhs.grouping_type == rhs.grouping_type &&
    -
    397  lhs.entries == rhs.entries;
    -
    398 }
    -
    399 
    -
    400 inline bool operator==(const TrackFragment& lhs, const TrackFragment& rhs) {
    -
    401  return lhs.header == rhs.header && lhs.runs == rhs.runs &&
    -
    402  lhs.decode_time == rhs.decode_time &&
    -
    403  lhs.auxiliary_offset == rhs.auxiliary_offset &&
    -
    404  lhs.auxiliary_size == rhs.auxiliary_size &&
    -
    405  lhs.sample_encryption == rhs.sample_encryption;
    -
    406 }
    -
    407 
    -
    408 inline bool operator==(const MovieFragment& lhs, const MovieFragment& rhs) {
    -
    409  return lhs.header == rhs.header && lhs.tracks == rhs.tracks &&
    -
    410  lhs.pssh == rhs.pssh;
    +
    354 inline bool operator==(const MovieFragmentHeader& lhs,
    +
    355  const MovieFragmentHeader& rhs) {
    +
    356  return lhs.sequence_number == rhs.sequence_number;
    +
    357 }
    +
    358 
    +
    359 inline bool operator==(const TrackFragmentHeader& lhs,
    +
    360  const TrackFragmentHeader& rhs) {
    +
    361  return lhs.flags == rhs.flags && lhs.track_id == rhs.track_id &&
    +
    362  lhs.sample_description_index == rhs.sample_description_index &&
    +
    363  lhs.default_sample_duration == rhs.default_sample_duration &&
    +
    364  lhs.default_sample_size == rhs.default_sample_size &&
    +
    365  lhs.default_sample_flags == rhs.default_sample_flags;
    +
    366 }
    +
    367 
    +
    368 inline bool operator==(const TrackFragmentRun& lhs,
    +
    369  const TrackFragmentRun& rhs) {
    +
    370  return lhs.flags == rhs.flags && lhs.sample_count == rhs.sample_count &&
    +
    371  lhs.data_offset == rhs.data_offset &&
    +
    372  lhs.sample_flags == rhs.sample_flags &&
    +
    373  lhs.sample_sizes == rhs.sample_sizes &&
    +
    374  lhs.sample_durations == rhs.sample_durations &&
    +
    375  lhs.sample_composition_time_offsets ==
    +
    376  rhs.sample_composition_time_offsets;
    +
    377 }
    +
    378 
    +
    379 inline bool operator==(const SampleToGroupEntry& lhs,
    +
    380  const SampleToGroupEntry& rhs) {
    +
    381  return lhs.sample_count == rhs.sample_count &&
    +
    382  lhs.group_description_index == rhs.group_description_index;
    +
    383 }
    +
    384 
    +
    385 inline bool operator==(const SampleToGroup& lhs,
    +
    386  const SampleToGroup& rhs) {
    +
    387  return lhs.grouping_type == rhs.grouping_type &&
    +
    388  lhs.grouping_type_parameter == rhs.grouping_type_parameter &&
    +
    389  lhs.entries == rhs.entries;
    +
    390 }
    +
    391 
    +
    392 inline bool operator==(const CencSampleEncryptionInfoEntry& lhs,
    +
    393  const CencSampleEncryptionInfoEntry& rhs) {
    +
    394  return lhs.is_encrypted == rhs.is_encrypted &&
    +
    395  lhs.iv_size == rhs.iv_size &&
    +
    396  lhs.key_id == rhs.key_id;
    +
    397 }
    +
    398 
    +
    399 inline bool operator==(const SampleGroupDescription& lhs,
    +
    400  const SampleGroupDescription& rhs) {
    +
    401  return lhs.grouping_type == rhs.grouping_type &&
    +
    402  lhs.entries == rhs.entries;
    +
    403 }
    +
    404 
    +
    405 inline bool operator==(const TrackFragment& lhs, const TrackFragment& rhs) {
    +
    406  return lhs.header == rhs.header && lhs.runs == rhs.runs &&
    +
    407  lhs.decode_time == rhs.decode_time &&
    +
    408  lhs.auxiliary_offset == rhs.auxiliary_offset &&
    +
    409  lhs.auxiliary_size == rhs.auxiliary_size &&
    +
    410  lhs.sample_encryption == rhs.sample_encryption;
    411 }
    412 
    -
    413 inline bool operator==(const SegmentReference& lhs,
    -
    414  const SegmentReference& rhs) {
    -
    415  return lhs.reference_type == rhs.reference_type &&
    -
    416  lhs.referenced_size == rhs.referenced_size &&
    -
    417  lhs.subsegment_duration == rhs.subsegment_duration &&
    -
    418  lhs.starts_with_sap == rhs.starts_with_sap &&
    -
    419  lhs.sap_type == rhs.sap_type &&
    -
    420  lhs.sap_delta_time == rhs.sap_delta_time;
    -
    421 }
    -
    422 
    -
    423 inline bool operator==(const SegmentIndex& lhs, const SegmentIndex& rhs) {
    -
    424  return lhs.reference_id == rhs.reference_id &&
    -
    425  lhs.timescale == rhs.timescale &&
    -
    426  lhs.earliest_presentation_time == rhs.earliest_presentation_time &&
    -
    427  lhs.first_offset == rhs.first_offset &&
    -
    428  lhs.references == rhs.references;
    -
    429 }
    -
    430 
    -
    431 inline bool operator==(const CueSourceIDBox& lhs,
    -
    432  const CueSourceIDBox& rhs) {
    -
    433  return lhs.source_id == rhs.source_id;
    +
    413 inline bool operator==(const MovieFragment& lhs, const MovieFragment& rhs) {
    +
    414  return lhs.header == rhs.header && lhs.tracks == rhs.tracks &&
    +
    415  lhs.pssh == rhs.pssh;
    +
    416 }
    +
    417 
    +
    418 inline bool operator==(const SegmentReference& lhs,
    +
    419  const SegmentReference& rhs) {
    +
    420  return lhs.reference_type == rhs.reference_type &&
    +
    421  lhs.referenced_size == rhs.referenced_size &&
    +
    422  lhs.subsegment_duration == rhs.subsegment_duration &&
    +
    423  lhs.starts_with_sap == rhs.starts_with_sap &&
    +
    424  lhs.sap_type == rhs.sap_type &&
    +
    425  lhs.sap_delta_time == rhs.sap_delta_time;
    +
    426 }
    +
    427 
    +
    428 inline bool operator==(const SegmentIndex& lhs, const SegmentIndex& rhs) {
    +
    429  return lhs.reference_id == rhs.reference_id &&
    +
    430  lhs.timescale == rhs.timescale &&
    +
    431  lhs.earliest_presentation_time == rhs.earliest_presentation_time &&
    +
    432  lhs.first_offset == rhs.first_offset &&
    +
    433  lhs.references == rhs.references;
    434 }
    435 
    -
    436 inline bool operator==(const CueTimeBox& lhs,
    -
    437  const CueTimeBox& rhs) {
    -
    438  return lhs.cue_current_time == rhs.cue_current_time;
    +
    436 inline bool operator==(const CueSourceIDBox& lhs,
    +
    437  const CueSourceIDBox& rhs) {
    +
    438  return lhs.source_id == rhs.source_id;
    439 }
    440 
    -
    441 inline bool operator==(const CueIDBox& lhs,
    -
    442  const CueIDBox& rhs) {
    -
    443  return lhs.cue_id == rhs.cue_id;
    +
    441 inline bool operator==(const CueTimeBox& lhs,
    +
    442  const CueTimeBox& rhs) {
    +
    443  return lhs.cue_current_time == rhs.cue_current_time;
    444 }
    445 
    -
    446 inline bool operator==(const CueSettingsBox& lhs,
    -
    447  const CueSettingsBox& rhs) {
    -
    448  return lhs.settings == rhs.settings;
    +
    446 inline bool operator==(const CueIDBox& lhs,
    +
    447  const CueIDBox& rhs) {
    +
    448  return lhs.cue_id == rhs.cue_id;
    449 }
    450 
    -
    451 inline bool operator==(const CuePayloadBox& lhs,
    -
    452  const CuePayloadBox& rhs) {
    -
    453  return lhs.cue_text == rhs.cue_text;
    +
    451 inline bool operator==(const CueSettingsBox& lhs,
    +
    452  const CueSettingsBox& rhs) {
    +
    453  return lhs.settings == rhs.settings;
    454 }
    455 
    -
    456 inline bool operator==(const VTTEmptyCueBox& lhs, const VTTEmptyCueBox& rhs) {
    -
    457  return true;
    -
    458 }
    -
    459 
    -
    460 inline bool operator==(const VTTAdditionalTextBox& lhs,
    -
    461  const VTTAdditionalTextBox& rhs) {
    -
    462  return lhs.cue_additional_text == rhs.cue_additional_text;
    +
    456 inline bool operator==(const CuePayloadBox& lhs,
    +
    457  const CuePayloadBox& rhs) {
    +
    458  return lhs.cue_text == rhs.cue_text;
    +
    459 }
    +
    460 
    +
    461 inline bool operator==(const VTTEmptyCueBox& lhs, const VTTEmptyCueBox& rhs) {
    +
    462  return true;
    463 }
    464 
    -
    465 inline bool operator==(const VTTCueBox& lhs,
    -
    466  const VTTCueBox& rhs) {
    -
    467  return lhs.cue_source_id == rhs.cue_source_id && lhs.cue_id == rhs.cue_id &&
    -
    468  lhs.cue_time == rhs.cue_time && lhs.cue_settings == rhs.cue_settings &&
    -
    469  lhs.cue_payload == rhs.cue_payload;
    -
    470 }
    -
    471 
    -
    472 } // namespace mp4
    -
    473 } // namespace media
    -
    474 } // namespace edash_packager
    -
    475 
    -
    476 #endif // MEDIA_FORMATS_MP4_BOX_DEFINITIONS_COMPARISON_H_
    +
    465 inline bool operator==(const VTTAdditionalTextBox& lhs,
    +
    466  const VTTAdditionalTextBox& rhs) {
    +
    467  return lhs.cue_additional_text == rhs.cue_additional_text;
    +
    468 }
    +
    469 
    +
    470 inline bool operator==(const VTTCueBox& lhs,
    +
    471  const VTTCueBox& rhs) {
    +
    472  return lhs.cue_source_id == rhs.cue_source_id && lhs.cue_id == rhs.cue_id &&
    +
    473  lhs.cue_time == rhs.cue_time && lhs.cue_settings == rhs.cue_settings &&
    +
    474  lhs.cue_payload == rhs.cue_payload;
    +
    475 }
    +
    476 
    +
    477 } // namespace mp4
    +
    478 } // namespace media
    +
    479 } // namespace edash_packager
    +
    480 
    +
    481 #endif // MEDIA_FORMATS_MP4_BOX_DEFINITIONS_COMPARISON_H_
    diff --git a/docs/de/d87/structedash__packager_1_1media_1_1mp4_1_1ChunkInfo-members.html b/docs/de/d87/structedash__packager_1_1media_1_1mp4_1_1ChunkInfo-members.html index ad984f46e9..619e2315ef 100644 --- a/docs/de/d87/structedash__packager_1_1media_1_1mp4_1_1ChunkInfo-members.html +++ b/docs/de/d87/structedash__packager_1_1media_1_1mp4_1_1ChunkInfo-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d8b/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPes.html b/docs/de/d8b/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPes.html index d5a21a9986..a9b707aad4 100644 --- a/docs/de/d8b/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPes.html +++ b/docs/de/d8b/classedash__packager_1_1media_1_1mp2t_1_1TsSectionPes.html @@ -142,7 +142,7 @@ Additional Inherited Members diff --git a/docs/de/d8d/structedash__packager_1_1media_1_1H264SliceHeader.html b/docs/de/d8d/structedash__packager_1_1media_1_1H264SliceHeader.html index 987c59bae0..3fe630815e 100644 --- a/docs/de/d8d/structedash__packager_1_1media_1_1H264SliceHeader.html +++ b/docs/de/d8d/structedash__packager_1_1media_1_1H264SliceHeader.html @@ -276,7 +276,7 @@ int slice_beta_offset_div2 diff --git a/docs/de/d93/classedash__packager_1_1media_1_1ByteQueue-members.html b/docs/de/d93/classedash__packager_1_1media_1_1ByteQueue-members.html index 2cf83c45db..f72f5e83b8 100644 --- a/docs/de/d93/classedash__packager_1_1media_1_1ByteQueue-members.html +++ b/docs/de/d93/classedash__packager_1_1media_1_1ByteQueue-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d98/classedash__packager_1_1media_1_1WebMAudioClient.html b/docs/de/d98/classedash__packager_1_1media_1_1WebMAudioClient.html index 92b45a4b81..fad0c9d72c 100644 --- a/docs/de/d98/classedash__packager_1_1media_1_1WebMAudioClient.html +++ b/docs/de/d98/classedash__packager_1_1media_1_1WebMAudioClient.html @@ -199,7 +199,7 @@ An empty scoped_refptr if there was unexpected values in the provided parameters diff --git a/docs/de/d9d/classedash__packager_1_1media_1_1TracksBuilder-members.html b/docs/de/d9d/classedash__packager_1_1media_1_1TracksBuilder-members.html index 39c7aa03f5..5cd4fb38b3 100644 --- a/docs/de/d9d/classedash__packager_1_1media_1_1TracksBuilder-members.html +++ b/docs/de/d9d/classedash__packager_1_1media_1_1TracksBuilder-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/d9e/classedash__packager_1_1media_1_1TextTrack.html b/docs/de/d9e/classedash__packager_1_1media_1_1TextTrack.html index 883b0e8217..1f1e88d9a9 100644 --- a/docs/de/d9e/classedash__packager_1_1media_1_1TextTrack.html +++ b/docs/de/d9e/classedash__packager_1_1media_1_1TextTrack.html @@ -109,7 +109,7 @@ virtual void addWebVTTCue< diff --git a/docs/de/da0/classedash__packager_1_1media_1_1AesCbcCtsDecryptor-members.html b/docs/de/da0/classedash__packager_1_1media_1_1AesCbcCtsDecryptor-members.html index 98610b3232..5a57dd50c1 100644 --- a/docs/de/da0/classedash__packager_1_1media_1_1AesCbcCtsDecryptor-members.html +++ b/docs/de/da0/classedash__packager_1_1media_1_1AesCbcCtsDecryptor-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/da5/classedash__packager_1_1media_1_1WebMParserClient.html b/docs/de/da5/classedash__packager_1_1media_1_1WebMParserClient.html index 7043fd371e..60c75ef4fa 100644 --- a/docs/de/da5/classedash__packager_1_1media_1_1WebMParserClient.html +++ b/docs/de/da5/classedash__packager_1_1media_1_1WebMParserClient.html @@ -151,7 +151,7 @@ Protected Member Functions diff --git a/docs/de/da6/classedash__packager_1_1media_1_1mp4_1_1DecodingTimeIterator-members.html b/docs/de/da6/classedash__packager_1_1media_1_1mp4_1_1DecodingTimeIterator-members.html index 7f47fa4b5f..aaa1ce0a3a 100644 --- a/docs/de/da6/classedash__packager_1_1media_1_1mp4_1_1DecodingTimeIterator-members.html +++ b/docs/de/da6/classedash__packager_1_1media_1_1mp4_1_1DecodingTimeIterator-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/da7/classedash__packager_1_1media_1_1AudioTimestampHelper-members.html b/docs/de/da7/classedash__packager_1_1media_1_1AudioTimestampHelper-members.html index 1b411ed6c0..9d877a6c47 100644 --- a/docs/de/da7/classedash__packager_1_1media_1_1AudioTimestampHelper-members.html +++ b/docs/de/da7/classedash__packager_1_1media_1_1AudioTimestampHelper-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dab/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentRun-members.html b/docs/de/dab/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentRun-members.html index 7c32baf5dd..c65b26e83a 100644 --- a/docs/de/dab/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentRun-members.html +++ b/docs/de/dab/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentRun-members.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dad/validate__flag_8cc_source.html b/docs/de/dad/validate__flag_8cc_source.html index b42df100cf..847064fe15 100644 --- a/docs/de/dad/validate__flag_8cc_source.html +++ b/docs/de/dad/validate__flag_8cc_source.html @@ -132,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/db1/classedash__packager_1_1media_1_1mp4_1_1ESDescriptor.html b/docs/de/db1/classedash__packager_1_1media_1_1mp4_1_1ESDescriptor.html index 0b9be931f1..f8371b2620 100644 --- a/docs/de/db1/classedash__packager_1_1media_1_1mp4_1_1ESDescriptor.html +++ b/docs/de/db1/classedash__packager_1_1media_1_1mp4_1_1ESDescriptor.html @@ -181,7 +181,7 @@ bool IsDTS () const diff --git a/docs/de/db4/structedash__packager_1_1media_1_1mp4_1_1SchemeInfo-members.html b/docs/de/db4/structedash__packager_1_1media_1_1mp4_1_1SchemeInfo-members.html index e98b924d14..d1cf5972f6 100644 --- a/docs/de/db4/structedash__packager_1_1media_1_1mp4_1_1SchemeInfo-members.html +++ b/docs/de/db4/structedash__packager_1_1media_1_1mp4_1_1SchemeInfo-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dc1/demuxer_8h_source.html b/docs/de/dc1/demuxer_8h_source.html index 556cd9ce17..1b47cb6cdc 100644 --- a/docs/de/dc1/demuxer_8h_source.html +++ b/docs/de/dc1/demuxer_8h_source.html @@ -171,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dc4/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html b/docs/de/dc4/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html index d6ea4cd4f8..769a6e4c9e 100644 --- a/docs/de/dc4/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html +++ b/docs/de/dc4/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html @@ -171,7 +171,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 192 of file box_definitions.cc.

    +

    Definition at line 193 of file box_definitions.cc.

    @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/de/dcc/mock__mpd__notifier_8cc_source.html b/docs/de/dcc/mock__mpd__notifier_8cc_source.html index 49f8d8f8da..a4337fee98 100644 --- a/docs/de/dcc/mock__mpd__notifier_8cc_source.html +++ b/docs/de/dcc/mock__mpd__notifier_8cc_source.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dcf/file__closer_8h_source.html b/docs/de/dcf/file__closer_8h_source.html index c021317df0..2d4cee08e0 100644 --- a/docs/de/dcf/file__closer_8h_source.html +++ b/docs/de/dcf/file__closer_8h_source.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dd4/classedash__packager_1_1media_1_1mp4_1_1MP4Muxer-members.html b/docs/de/dd4/classedash__packager_1_1media_1_1mp4_1_1MP4Muxer-members.html index 44e7a857bc..08dc2d1d40 100644 --- a/docs/de/dd4/classedash__packager_1_1media_1_1mp4_1_1MP4Muxer-members.html +++ b/docs/de/dd4/classedash__packager_1_1media_1_1mp4_1_1MP4Muxer-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dd6/content__protection__element_8h_source.html b/docs/de/dd6/content__protection__element_8h_source.html index e43cfe6143..f455392615 100644 --- a/docs/de/dd6/content__protection__element_8h_source.html +++ b/docs/de/dd6/content__protection__element_8h_source.html @@ -142,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dd6/muxer__listener__test__helper_8cc_source.html b/docs/de/dd6/muxer__listener__test__helper_8cc_source.html index f1a4e4913d..be6e2d5451 100644 --- a/docs/de/dd6/muxer__listener__test__helper_8cc_source.html +++ b/docs/de/dd6/muxer__listener__test__helper_8cc_source.html @@ -206,7 +206,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/de7/structedash__packager_1_1media_1_1mp4_1_1Media.html b/docs/de/de7/structedash__packager_1_1media_1_1mp4_1_1Media.html index 3d06a52ef1..a60d41b6b5 100644 --- a/docs/de/de7/structedash__packager_1_1media_1_1mp4_1_1Media.html +++ b/docs/de/de7/structedash__packager_1_1media_1_1mp4_1_1Media.html @@ -142,7 +142,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 511 of file box_definitions.h.

    +

    Definition at line 518 of file box_definitions.h.

    Member Function Documentation

    @@ -168,7 +168,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1723 of file box_definitions.cc.

    +

    Definition at line 1744 of file box_definitions.cc.

    @@ -179,7 +179,7 @@ Additional Inherited Members diff --git a/docs/de/de9/classedash__packager_1_1media_1_1LibcryptoThreading.html b/docs/de/de9/classedash__packager_1_1media_1_1LibcryptoThreading.html index a74890f303..7339041625 100644 --- a/docs/de/de9/classedash__packager_1_1media_1_1LibcryptoThreading.html +++ b/docs/de/de9/classedash__packager_1_1media_1_1LibcryptoThreading.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dfa/muxer__listener_8h_source.html b/docs/de/dfa/muxer__listener_8h_source.html index 67a40bd059..5ef340d188 100644 --- a/docs/de/dfa/muxer__listener_8h_source.html +++ b/docs/de/dfa/muxer__listener_8h_source.html @@ -204,7 +204,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dfb/structedash__packager_1_1media_1_1H264ModificationOfPicNum-members.html b/docs/de/dfb/structedash__packager_1_1media_1_1H264ModificationOfPicNum-members.html index dadf047fc1..d4d193fed2 100644 --- a/docs/de/dfb/structedash__packager_1_1media_1_1H264ModificationOfPicNum-members.html +++ b/docs/de/dfb/structedash__packager_1_1media_1_1H264ModificationOfPicNum-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dfc/classedash__packager_1_1media_1_1mp2t_1_1EsParserH264-members.html b/docs/de/dfc/classedash__packager_1_1media_1_1mp2t_1_1EsParserH264-members.html index aaf7af96d6..54ce675c5b 100644 --- a/docs/de/dfc/classedash__packager_1_1media_1_1mp2t_1_1EsParserH264-members.html +++ b/docs/de/dfc/classedash__packager_1_1media_1_1mp2t_1_1EsParserH264-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/de/dfd/stream__info_8cc_source.html b/docs/de/dfd/stream__info_8cc_source.html index 320b74a5ed..9cca23850d 100644 --- a/docs/de/dfd/stream__info_8cc_source.html +++ b/docs/de/dfd/stream__info_8cc_source.html @@ -143,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d0c/classedash__packager_1_1media_1_1VPCodecConfiguration-members.html b/docs/df/d0c/classedash__packager_1_1media_1_1VPCodecConfiguration-members.html index 29394e61e1..5ceb8fb6d3 100644 --- a/docs/df/d0c/classedash__packager_1_1media_1_1VPCodecConfiguration-members.html +++ b/docs/df/d0c/classedash__packager_1_1media_1_1VPCodecConfiguration-members.html @@ -131,7 +131,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d1a/offset__byte__queue_8cc_source.html b/docs/df/d1a/offset__byte__queue_8cc_source.html index 005038489b..9eb88474a4 100644 --- a/docs/df/d1a/offset__byte__queue_8cc_source.html +++ b/docs/df/d1a/offset__byte__queue_8cc_source.html @@ -164,7 +164,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d1c/composition__offset__iterator_8h_source.html b/docs/df/d1c/composition__offset__iterator_8h_source.html index 261258282a..950ccfe1a7 100644 --- a/docs/df/d1c/composition__offset__iterator_8h_source.html +++ b/docs/df/d1c/composition__offset__iterator_8h_source.html @@ -140,14 +140,14 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    CompositionOffsetIterator(const CompositionTimeToSample &composition_time_to_sample)
    Create CompositionOffsetIterator from composition time to sample box.
    - + diff --git a/docs/df/d1f/classedash__packager_1_1media_1_1mp4_1_1TrackRunIterator-members.html b/docs/df/d1f/classedash__packager_1_1media_1_1mp4_1_1TrackRunIterator-members.html index 3bd80caff3..92fa00c4c9 100644 --- a/docs/df/d1f/classedash__packager_1_1media_1_1mp4_1_1TrackRunIterator-members.html +++ b/docs/df/d1f/classedash__packager_1_1media_1_1mp4_1_1TrackRunIterator-members.html @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d21/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentRun.html b/docs/df/d21/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentRun.html index 3f444ffc8b..751110d14b 100644 --- a/docs/df/d21/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentRun.html +++ b/docs/df/d21/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentRun.html @@ -175,7 +175,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 603 of file box_definitions.h.

    +

    Definition at line 610 of file box_definitions.h.

    Member Function Documentation

    @@ -201,7 +201,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1974 of file box_definitions.cc.

    +

    Definition at line 1995 of file box_definitions.cc.

    @@ -212,7 +212,7 @@ Additional Inherited Members diff --git a/docs/df/d22/validate__flag_8h_source.html b/docs/df/d22/validate__flag_8h_source.html index 22f5d94864..ff43735482 100644 --- a/docs/df/d22/validate__flag_8h_source.html +++ b/docs/df/d22/validate__flag_8h_source.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d2f/structedash__packager_1_1media_1_1mp4_1_1Language.html b/docs/df/d2f/structedash__packager_1_1media_1_1mp4_1_1Language.html index 0aeb8075d1..91c759e696 100644 --- a/docs/df/d2f/structedash__packager_1_1media_1_1mp4_1_1Language.html +++ b/docs/df/d2f/structedash__packager_1_1media_1_1mp4_1_1Language.html @@ -120,7 +120,7 @@ std::string code< diff --git a/docs/df/d30/classedash__packager_1_1media_1_1ContentEncoding.html b/docs/df/d30/classedash__packager_1_1media_1_1ContentEncoding.html index 79fdc38d3f..62563d678d 100644 --- a/docs/df/d30/classedash__packager_1_1media_1_1ContentEncoding.html +++ b/docs/df/d30/classedash__packager_1_1media_1_1ContentEncoding.html @@ -208,7 +208,7 @@ Static Public Attributes diff --git a/docs/df/d31/muxer__util_8cc_source.html b/docs/df/d31/muxer__util_8cc_source.html index 68c84b09bd..a18b45b90c 100644 --- a/docs/df/d31/muxer__util_8cc_source.html +++ b/docs/df/d31/muxer__util_8cc_source.html @@ -247,7 +247,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d32/audio__stream__info_8h_source.html b/docs/df/d32/audio__stream__info_8h_source.html index 370e156b30..910d36bc91 100644 --- a/docs/df/d32/audio__stream__info_8h_source.html +++ b/docs/df/d32/audio__stream__info_8h_source.html @@ -106,96 +106,87 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
    17 enum AudioCodec {
    18  kUnknownAudioCodec = 0,
    19  kCodecAAC,
    -
    20  kCodecMP3,
    -
    21  kCodecPCM,
    -
    22  kCodecVorbis,
    -
    23  kCodecFLAC,
    -
    24  kCodecAMR_NB,
    -
    25  kCodecAMR_WB,
    -
    26  kCodecPCM_MULAW,
    -
    27  kCodecGSM_MS,
    -
    28  kCodecPCM_S16BE,
    -
    29  kCodecPCM_S24BE,
    -
    30  kCodecOpus,
    -
    31  kCodecEAC3,
    -
    32  kCodecDTSC,
    -
    33  kCodecDTSH,
    -
    34  kCodecDTSL,
    -
    35  kCodecDTSE,
    -
    36  kCodecDTSP,
    -
    37  kCodecDTSM,
    -
    38 
    -
    39  kNumAudioCodec
    -
    40 };
    -
    41 
    -
    43 class AudioStreamInfo : public StreamInfo {
    -
    44  public:
    -
    46  AudioStreamInfo(int track_id,
    -
    47  uint32_t time_scale,
    -
    48  uint64_t duration,
    -
    49  AudioCodec codec,
    -
    50  const std::string& codec_string,
    -
    51  const std::string& language,
    -
    52  uint8_t sample_bits,
    -
    53  uint8_t num_channels,
    -
    54  uint32_t sampling_frequency,
    -
    55  uint32_t max_bitrate,
    -
    56  uint32_t avg_bitrate,
    -
    57  const uint8_t* extra_data,
    -
    58  size_t extra_data_size,
    -
    59  bool is_encrypted);
    -
    60 
    -
    63  bool IsValidConfig() const override;
    -
    64  std::string ToString() const override;
    -
    66 
    -
    67  AudioCodec codec() const { return codec_; }
    -
    68  uint8_t sample_bits() const { return sample_bits_; }
    -
    69  uint8_t sample_bytes() const { return sample_bits_ / 8; }
    -
    70  uint8_t num_channels() const { return num_channels_; }
    -
    71  uint32_t sampling_frequency() const { return sampling_frequency_; }
    -
    72  uint32_t bytes_per_frame() const {
    -
    73  return static_cast<uint32_t>(num_channels_) * sample_bits_ / 8;
    -
    74  }
    -
    75  uint32_t max_bitrate() const { return max_bitrate_; }
    -
    76  uint32_t avg_bitrate() const { return avg_bitrate_; }
    -
    77 
    -
    78  void set_codec(AudioCodec codec) { codec_ = codec; }
    -
    79  void set_sampling_frequency(const uint32_t sampling_frequency) {
    -
    80  sampling_frequency_ = sampling_frequency;
    -
    81  }
    -
    82 
    -
    85  static std::string GetCodecString(AudioCodec codec,
    -
    86  uint8_t audio_object_type);
    -
    87 
    -
    88  private:
    -
    89  ~AudioStreamInfo() override;
    -
    90 
    -
    91  AudioCodec codec_;
    -
    92  uint8_t sample_bits_;
    -
    93  uint8_t num_channels_;
    -
    94  uint32_t sampling_frequency_;
    -
    95  uint32_t max_bitrate_;
    -
    96  uint32_t avg_bitrate_;
    -
    97 
    -
    98  // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler
    -
    99  // generated copy constructor and assignment operator. Since the extra data is
    -
    100  // typically small, the performance impact is minimal.
    -
    101 };
    -
    102 
    -
    103 } // namespace media
    -
    104 } // namespace edash_packager
    -
    105 
    -
    106 #endif // MEDIA_BASE_AUDIO_STREAM_INFO_H_
    -
    Holds audio stream information.
    -
    std::string ToString() const override
    +
    20  kCodecAC3,
    +
    21  kCodecDTSC,
    +
    22  kCodecDTSE,
    +
    23  kCodecDTSH,
    +
    24  kCodecDTSL,
    +
    25  kCodecDTSM,
    +
    26  kCodecDTSP,
    +
    27  kCodecOpus,
    +
    28  kCodecVorbis,
    +
    29 
    +
    30  kNumAudioCodec
    +
    31 };
    +
    32 
    +
    34 class AudioStreamInfo : public StreamInfo {
    +
    35  public:
    +
    37  AudioStreamInfo(int track_id,
    +
    38  uint32_t time_scale,
    +
    39  uint64_t duration,
    +
    40  AudioCodec codec,
    +
    41  const std::string& codec_string,
    +
    42  const std::string& language,
    +
    43  uint8_t sample_bits,
    +
    44  uint8_t num_channels,
    +
    45  uint32_t sampling_frequency,
    +
    46  uint32_t max_bitrate,
    +
    47  uint32_t avg_bitrate,
    +
    48  const uint8_t* extra_data,
    +
    49  size_t extra_data_size,
    +
    50  bool is_encrypted);
    +
    51 
    +
    54  bool IsValidConfig() const override;
    +
    55  std::string ToString() const override;
    +
    57 
    +
    58  AudioCodec codec() const { return codec_; }
    +
    59  uint8_t sample_bits() const { return sample_bits_; }
    +
    60  uint8_t sample_bytes() const { return sample_bits_ / 8; }
    +
    61  uint8_t num_channels() const { return num_channels_; }
    +
    62  uint32_t sampling_frequency() const { return sampling_frequency_; }
    +
    63  uint32_t bytes_per_frame() const {
    +
    64  return static_cast<uint32_t>(num_channels_) * sample_bits_ / 8;
    +
    65  }
    +
    66  uint32_t max_bitrate() const { return max_bitrate_; }
    +
    67  uint32_t avg_bitrate() const { return avg_bitrate_; }
    +
    68 
    +
    69  void set_codec(AudioCodec codec) { codec_ = codec; }
    +
    70  void set_sampling_frequency(const uint32_t sampling_frequency) {
    +
    71  sampling_frequency_ = sampling_frequency;
    +
    72  }
    +
    73 
    +
    76  static std::string GetCodecString(AudioCodec codec,
    +
    77  uint8_t audio_object_type);
    +
    78 
    +
    79  private:
    +
    80  ~AudioStreamInfo() override;
    +
    81 
    +
    82  AudioCodec codec_;
    +
    83  uint8_t sample_bits_;
    +
    84  uint8_t num_channels_;
    +
    85  uint32_t sampling_frequency_;
    +
    86  uint32_t max_bitrate_;
    +
    87  uint32_t avg_bitrate_;
    +
    88 
    +
    89  // Not using DISALLOW_COPY_AND_ASSIGN here intentionally to allow the compiler
    +
    90  // generated copy constructor and assignment operator. Since the extra data is
    +
    91  // typically small, the performance impact is minimal.
    +
    92 };
    +
    93 
    +
    94 } // namespace media
    +
    95 } // namespace edash_packager
    +
    96 
    +
    97 #endif // MEDIA_BASE_AUDIO_STREAM_INFO_H_
    +
    Holds audio stream information.
    +
    std::string ToString() const override
    Abstract class holds stream information.
    Definition: stream_info.h:26
    -
    AudioStreamInfo(int track_id, uint32_t time_scale, uint64_t duration, AudioCodec codec, const std::string &codec_string, const std::string &language, uint8_t sample_bits, uint8_t num_channels, uint32_t sampling_frequency, uint32_t max_bitrate, uint32_t avg_bitrate, const uint8_t *extra_data, size_t extra_data_size, bool is_encrypted)
    Construct an initialized audio stream info object.
    - -
    static std::string GetCodecString(AudioCodec codec, uint8_t audio_object_type)
    +
    AudioStreamInfo(int track_id, uint32_t time_scale, uint64_t duration, AudioCodec codec, const std::string &codec_string, const std::string &language, uint8_t sample_bits, uint8_t num_channels, uint32_t sampling_frequency, uint32_t max_bitrate, uint32_t avg_bitrate, const uint8_t *extra_data, size_t extra_data_size, bool is_encrypted)
    Construct an initialized audio stream info object.
    + +
    static std::string GetCodecString(AudioCodec codec, uint8_t audio_object_type)
    diff --git a/docs/df/d3c/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentDecodeTime-members.html b/docs/df/d3c/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentDecodeTime-members.html index 8ad1bacb62..e20ea302bb 100644 --- a/docs/df/d3c/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentDecodeTime-members.html +++ b/docs/df/d3c/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentDecodeTime-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d40/classedash__packager_1_1media_1_1Cluster.html b/docs/df/d40/classedash__packager_1_1media_1_1Cluster.html index d45077af62..59b1043ba2 100644 --- a/docs/df/d40/classedash__packager_1_1media_1_1Cluster.html +++ b/docs/df/d40/classedash__packager_1_1media_1_1Cluster.html @@ -116,7 +116,7 @@ int size () const diff --git a/docs/df/d43/classedash__packager_1_1media_1_1mp4_1_1Segmenter-members.html b/docs/df/d43/classedash__packager_1_1media_1_1mp4_1_1Segmenter-members.html index a935951794..778b2a9c2c 100644 --- a/docs/df/d43/classedash__packager_1_1media_1_1mp4_1_1Segmenter-members.html +++ b/docs/df/d43/classedash__packager_1_1media_1_1mp4_1_1Segmenter-members.html @@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d4e/classedash__packager_1_1media_1_1webm_1_1MultiSegmentSegmenter.html b/docs/df/d4e/classedash__packager_1_1media_1_1webm_1_1MultiSegmentSegmenter.html index c0d6f79ce9..a7bb21b63e 100644 --- a/docs/df/d4e/classedash__packager_1_1media_1_1webm_1_1MultiSegmentSegmenter.html +++ b/docs/df/d4e/classedash__packager_1_1media_1_1webm_1_1MultiSegmentSegmenter.html @@ -277,7 +277,7 @@ double cluster_length_sec< diff --git a/docs/df/d5b/classedash__packager_1_1media_1_1mp2t_1_1EsParserAdts-members.html b/docs/df/d5b/classedash__packager_1_1media_1_1mp2t_1_1EsParserAdts-members.html index b6bd33412b..dbd365da91 100644 --- a/docs/df/d5b/classedash__packager_1_1media_1_1mp2t_1_1EsParserAdts-members.html +++ b/docs/df/d5b/classedash__packager_1_1media_1_1mp2t_1_1EsParserAdts-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d5e/classedash__packager_1_1media_1_1mp2t_1_1TsSection-members.html b/docs/df/d5e/classedash__packager_1_1media_1_1mp2t_1_1TsSection-members.html index 937c56a009..d7445e05e8 100644 --- a/docs/df/d5e/classedash__packager_1_1media_1_1mp2t_1_1TsSection-members.html +++ b/docs/df/d5e/classedash__packager_1_1media_1_1mp2t_1_1TsSection-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d62/structedash__packager_1_1media_1_1mp4_1_1AudioSampleEntry.html b/docs/df/d62/structedash__packager_1_1media_1_1mp4_1_1AudioSampleEntry.html index 76e104abf9..2215ed6e7b 100644 --- a/docs/df/d62/structedash__packager_1_1media_1_1mp4_1_1AudioSampleEntry.html +++ b/docs/df/d62/structedash__packager_1_1media_1_1mp4_1_1AudioSampleEntry.html @@ -151,6 +151,9 @@ uint32_t samplerate DTSSpecific ddts   + +AC3Specific dac3 +  @@ -160,7 +163,7 @@ Additional Inherited Members

    Additional Inherited Members

    Detailed Description

    -

    Definition at line 312 of file box_definitions.h.

    +

    Definition at line 318 of file box_definitions.h.

    Member Function Documentation

    @@ -186,7 +189,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1427 of file box_definitions.cc.

    +

    Definition at line 1447 of file box_definitions.cc.

    @@ -197,7 +200,7 @@ Additional Inherited Members diff --git a/docs/df/d67/opus__packet__builder_8h_source.html b/docs/df/d67/opus__packet__builder_8h_source.html index d8aaad3f00..85e2f5a2e1 100644 --- a/docs/df/d67/opus__packet__builder_8h_source.html +++ b/docs/df/d67/opus__packet__builder_8h_source.html @@ -136,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d6a/structedash__packager_1_1media_1_1mp4_1_1VideoSampleEntry.html b/docs/df/d6a/structedash__packager_1_1media_1_1mp4_1_1VideoSampleEntry.html index 496a0a8d70..7b487ac66d 100644 --- a/docs/df/d6a/structedash__packager_1_1media_1_1mp4_1_1VideoSampleEntry.html +++ b/docs/df/d6a/structedash__packager_1_1media_1_1mp4_1_1VideoSampleEntry.html @@ -183,7 +183,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1247 of file box_definitions.cc.

    +

    Definition at line 1248 of file box_definitions.cc.

    @@ -194,7 +194,7 @@ Additional Inherited Members diff --git a/docs/df/d6e/structedash__packager_1_1media_1_1mp4_1_1Language-members.html b/docs/df/d6e/structedash__packager_1_1media_1_1mp4_1_1Language-members.html index fdc988cc4f..04713678c9 100644 --- a/docs/df/d6e/structedash__packager_1_1media_1_1mp4_1_1Language-members.html +++ b/docs/df/d6e/structedash__packager_1_1media_1_1mp4_1_1Language-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d76/structedash__packager_1_1media_1_1mp4_1_1SampleToChunk.html b/docs/df/d76/structedash__packager_1_1media_1_1mp4_1_1SampleToChunk.html index 871c283fd8..905259dca7 100644 --- a/docs/df/d76/structedash__packager_1_1media_1_1mp4_1_1SampleToChunk.html +++ b/docs/df/d76/structedash__packager_1_1media_1_1mp4_1_1SampleToChunk.html @@ -145,7 +145,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 395 of file box_definitions.h.

    +

    Definition at line 402 of file box_definitions.h.

    Member Function Documentation

    @@ -171,7 +171,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 718 of file box_definitions.cc.

    +

    Definition at line 719 of file box_definitions.cc.

    @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/df/d7d/webm__info__parser_8cc_source.html b/docs/df/d7d/webm__info__parser_8cc_source.html index 562425a69a..291f34d761 100644 --- a/docs/df/d7d/webm__info__parser_8cc_source.html +++ b/docs/df/d7d/webm__info__parser_8cc_source.html @@ -200,7 +200,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d86/structedash__packager_1_1media_1_1mp4_1_1MovieFragmentHeader.html b/docs/df/d86/structedash__packager_1_1media_1_1mp4_1_1MovieFragmentHeader.html index b4666d744b..ee39b95382 100644 --- a/docs/df/d86/structedash__packager_1_1media_1_1mp4_1_1MovieFragmentHeader.html +++ b/docs/df/d86/structedash__packager_1_1media_1_1mp4_1_1MovieFragmentHeader.html @@ -145,7 +145,7 @@ Additional Inherited Members

    Detailed Description

    -

    Definition at line 567 of file box_definitions.h.

    +

    Definition at line 574 of file box_definitions.h.

    Member Function Documentation

    @@ -171,7 +171,7 @@ Additional Inherited Members

    Implements edash_packager::media::mp4::Box.

    -

    Definition at line 1900 of file box_definitions.cc.

    +

    Definition at line 1921 of file box_definitions.cc.

    @@ -182,7 +182,7 @@ Additional Inherited Members diff --git a/docs/df/d89/classedash__packager_1_1media_1_1SegmentTestBase_1_1ClusterParser.html b/docs/df/d89/classedash__packager_1_1media_1_1SegmentTestBase_1_1ClusterParser.html index 81d7c8a783..34f2e1e179 100644 --- a/docs/df/d89/classedash__packager_1_1media_1_1SegmentTestBase_1_1ClusterParser.html +++ b/docs/df/d89/classedash__packager_1_1media_1_1SegmentTestBase_1_1ClusterParser.html @@ -120,7 +120,7 @@ int cluster_count () c

    Detailed Description

    -

    Definition at line 63 of file segmenter_test_base.h.

    +

    Definition at line 75 of file segmenter_test_base.h.


    The documentation for this class was generated from the following files:
    • media/formats/webm/segmenter_test_base.h
    • media/formats/webm/segmenter_test_base.cc
    • @@ -128,7 +128,7 @@ int cluster_count () c diff --git a/docs/df/d8a/vp9__parser_8h_source.html b/docs/df/d8a/vp9__parser_8h_source.html index 42e51ab5fe..0ad434d39e 100644 --- a/docs/df/d8a/vp9__parser_8h_source.html +++ b/docs/df/d8a/vp9__parser_8h_source.html @@ -136,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d8a/vpx__parser_8h_source.html b/docs/df/d8a/vpx__parser_8h_source.html index 17a7eb7e46..5cbad22305 100644 --- a/docs/df/d8a/vpx__parser_8h_source.html +++ b/docs/df/d8a/vpx__parser_8h_source.html @@ -145,7 +145,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/d96/xml__node_8cc_source.html b/docs/df/d96/xml__node_8cc_source.html index 3940c6f02c..154ee52f01 100644 --- a/docs/df/d96/xml__node_8cc_source.html +++ b/docs/df/d96/xml__node_8cc_source.html @@ -304,153 +304,160 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
      215  : RepresentationBaseXmlNode("Representation") {}
      216 RepresentationXmlNode::~RepresentationXmlNode() {}
      217 
      -
      218 bool RepresentationXmlNode::AddVideoInfo(const VideoInfo& video_info) {
      -
      219  if (!video_info.has_width() || !video_info.has_height()) {
      -
      220  LOG(ERROR) << "Missing width or height for adding a video info.";
      -
      221  return false;
      -
      222  }
      -
      223 
      -
      224  if (video_info.has_pixel_width() && video_info.has_pixel_height()) {
      -
      225  SetStringAttribute("sar", base::IntToString(video_info.pixel_width()) +
      -
      226  ":" +
      -
      227  base::IntToString(video_info.pixel_height()));
      -
      228  }
      -
      229 
      -
      230  SetIntegerAttribute("width", video_info.width());
      -
      231  SetIntegerAttribute("height", video_info.height());
      -
      232  SetStringAttribute("frameRate",
      -
      233  base::IntToString(video_info.time_scale()) + "/" +
      -
      234  base::IntToString(video_info.frame_duration()));
      -
      235  return true;
      -
      236 }
      -
      237 
      -
      238 bool RepresentationXmlNode::AddAudioInfo(const AudioInfo& audio_info) {
      -
      239  if (!AddAudioChannelInfo(audio_info))
      -
      240  return false;
      -
      241 
      -
      242  AddAudioSamplingRateInfo(audio_info);
      -
      243  return true;
      -
      244 }
      -
      245 
      -
      246 bool RepresentationXmlNode::AddVODOnlyInfo(const MediaInfo& media_info) {
      -
      247  if (media_info.has_media_file_name()) {
      -
      248  XmlNode base_url("BaseURL");
      -
      249  base_url.SetContent(media_info.media_file_name());
      -
      250 
      -
      251  if (!AddChild(base_url.PassScopedPtr()))
      -
      252  return false;
      -
      253  }
      -
      254 
      -
      255  const bool need_segment_base = media_info.has_index_range() ||
      -
      256  media_info.has_init_range() ||
      -
      257  media_info.has_reference_time_scale();
      -
      258 
      -
      259  if (need_segment_base) {
      -
      260  XmlNode segment_base("SegmentBase");
      -
      261  if (media_info.has_index_range()) {
      -
      262  segment_base.SetStringAttribute("indexRange",
      -
      263  RangeToString(media_info.index_range()));
      -
      264  }
      +
      218 bool RepresentationXmlNode::AddVideoInfo(const VideoInfo& video_info,
      +
      219  bool set_width,
      +
      220  bool set_height,
      +
      221  bool set_frame_rate) {
      +
      222  if (!video_info.has_width() || !video_info.has_height()) {
      +
      223  LOG(ERROR) << "Missing width or height for adding a video info.";
      +
      224  return false;
      +
      225  }
      +
      226 
      +
      227  if (video_info.has_pixel_width() && video_info.has_pixel_height()) {
      +
      228  SetStringAttribute("sar", base::IntToString(video_info.pixel_width()) +
      +
      229  ":" +
      +
      230  base::IntToString(video_info.pixel_height()));
      +
      231  }
      +
      232 
      +
      233  if (set_width)
      +
      234  SetIntegerAttribute("width", video_info.width());
      +
      235  if (set_height)
      +
      236  SetIntegerAttribute("height", video_info.height());
      +
      237  if (set_frame_rate) {
      +
      238  SetStringAttribute("frameRate",
      +
      239  base::IntToString(video_info.time_scale()) + "/" +
      +
      240  base::IntToString(video_info.frame_duration()));
      +
      241  }
      +
      242  return true;
      +
      243 }
      +
      244 
      +
      245 bool RepresentationXmlNode::AddAudioInfo(const AudioInfo& audio_info) {
      +
      246  if (!AddAudioChannelInfo(audio_info))
      +
      247  return false;
      +
      248 
      +
      249  AddAudioSamplingRateInfo(audio_info);
      +
      250  return true;
      +
      251 }
      +
      252 
      +
      253 bool RepresentationXmlNode::AddVODOnlyInfo(const MediaInfo& media_info) {
      +
      254  if (media_info.has_media_file_name()) {
      +
      255  XmlNode base_url("BaseURL");
      +
      256  base_url.SetContent(media_info.media_file_name());
      +
      257 
      +
      258  if (!AddChild(base_url.PassScopedPtr()))
      +
      259  return false;
      +
      260  }
      +
      261 
      +
      262  const bool need_segment_base = media_info.has_index_range() ||
      +
      263  media_info.has_init_range() ||
      +
      264  media_info.has_reference_time_scale();
      265 
      -
      266  if (media_info.has_reference_time_scale()) {
      -
      267  segment_base.SetIntegerAttribute("timescale",
      -
      268  media_info.reference_time_scale());
      -
      269  }
      -
      270 
      -
      271  if (media_info.has_init_range()) {
      -
      272  XmlNode initialization("Initialization");
      -
      273  initialization.SetStringAttribute("range",
      -
      274  RangeToString(media_info.init_range()));
      -
      275 
      -
      276  if (!segment_base.AddChild(initialization.PassScopedPtr()))
      -
      277  return false;
      -
      278  }
      -
      279 
      -
      280  if (!AddChild(segment_base.PassScopedPtr()))
      -
      281  return false;
      -
      282  }
      -
      283 
      -
      284  if (media_info.has_media_duration_seconds()) {
      -
      285  // Adding 'duration' attribute, so that this information can be used when
      -
      286  // generating one MPD file. This should be removed from the final MPD.
      -
      287  SetFloatingPointAttribute("duration", media_info.media_duration_seconds());
      -
      288  }
      -
      289 
      -
      290  return true;
      -
      291 }
      -
      292 
      - -
      294  const MediaInfo& media_info,
      -
      295  const std::list<SegmentInfo>& segment_infos,
      -
      296  uint32_t start_number) {
      -
      297  XmlNode segment_template("SegmentTemplate");
      -
      298  if (media_info.has_reference_time_scale()) {
      -
      299  segment_template.SetIntegerAttribute("timescale",
      -
      300  media_info.reference_time_scale());
      -
      301  }
      -
      302 
      -
      303  if (media_info.has_init_segment_name()) {
      -
      304  // The spec does not allow '$Number$' and '$Time$' in initialization
      -
      305  // attribute.
      -
      306  // TODO(rkuroiwa, kqyang): Swap this check out with a better check. These
      -
      307  // templates allow formatting as well.
      -
      308  const std::string& init_segment_name = media_info.init_segment_name();
      -
      309  if (init_segment_name.find("$Number$") != std::string::npos ||
      -
      310  init_segment_name.find("$Time$") != std::string::npos) {
      -
      311  LOG(ERROR) << "$Number$ and $Time$ cannot be used for "
      -
      312  "SegmentTemplate@initialization";
      -
      313  return false;
      -
      314  }
      -
      315  segment_template.SetStringAttribute("initialization",
      -
      316  media_info.init_segment_name());
      -
      317  }
      -
      318 
      -
      319  if (media_info.has_segment_template()) {
      -
      320  segment_template.SetStringAttribute("media", media_info.segment_template());
      -
      321 
      -
      322  // TODO(rkuroiwa): Need a better check. $$Number is legitimate but not a
      -
      323  // template.
      -
      324  if (media_info.segment_template().find("$Number") != std::string::npos) {
      -
      325  DCHECK_GE(start_number, 1u);
      -
      326  segment_template.SetIntegerAttribute("startNumber", start_number);
      -
      327  }
      -
      328  }
      -
      329 
      -
      330  // TODO(rkuroiwa): Find out when a live MPD doesn't require SegmentTimeline.
      -
      331  XmlNode segment_timeline("SegmentTimeline");
      -
      332 
      -
      333  return PopulateSegmentTimeline(segment_infos, &segment_timeline) &&
      -
      334  segment_template.AddChild(segment_timeline.PassScopedPtr()) &&
      -
      335  AddChild(segment_template.PassScopedPtr());
      -
      336 }
      -
      337 
      -
      338 bool RepresentationXmlNode::AddAudioChannelInfo(const AudioInfo& audio_info) {
      -
      339  const uint32_t num_channels = audio_info.num_channels();
      -
      340  XmlNode audio_channel_config("AudioChannelConfiguration");
      -
      341  const char kAudioChannelConfigScheme[] =
      -
      342  "urn:mpeg:dash:23003:3:audio_channel_configuration:2011";
      -
      343  audio_channel_config.SetStringAttribute("schemeIdUri",
      -
      344  kAudioChannelConfigScheme);
      -
      345  audio_channel_config.SetIntegerAttribute("value", num_channels);
      -
      346 
      -
      347  return AddChild(audio_channel_config.PassScopedPtr());
      -
      348 }
      -
      349 
      -
      350 // MPD expects one number for sampling frequency, or if it is a range it should
      -
      351 // be space separated.
      -
      352 void RepresentationXmlNode::AddAudioSamplingRateInfo(
      -
      353  const AudioInfo& audio_info) {
      -
      354  if (audio_info.has_sampling_frequency())
      -
      355  SetIntegerAttribute("audioSamplingRate", audio_info.sampling_frequency());
      -
      356 }
      -
      357 
      -
      358 } // namespace xml
      -
      359 } // namespace edash_packager
      -
      bool AddVODOnlyInfo(const MediaInfo &media_info)
      Definition: xml_node.cc:246
      -
      bool AddLiveOnlyInfo(const MediaInfo &media_info, const std::list< SegmentInfo > &segment_infos, uint32_t start_number)
      Definition: xml_node.cc:293
      +
      266  if (need_segment_base) {
      +
      267  XmlNode segment_base("SegmentBase");
      +
      268  if (media_info.has_index_range()) {
      +
      269  segment_base.SetStringAttribute("indexRange",
      +
      270  RangeToString(media_info.index_range()));
      +
      271  }
      +
      272 
      +
      273  if (media_info.has_reference_time_scale()) {
      +
      274  segment_base.SetIntegerAttribute("timescale",
      +
      275  media_info.reference_time_scale());
      +
      276  }
      +
      277 
      +
      278  if (media_info.has_init_range()) {
      +
      279  XmlNode initialization("Initialization");
      +
      280  initialization.SetStringAttribute("range",
      +
      281  RangeToString(media_info.init_range()));
      +
      282 
      +
      283  if (!segment_base.AddChild(initialization.PassScopedPtr()))
      +
      284  return false;
      +
      285  }
      +
      286 
      +
      287  if (!AddChild(segment_base.PassScopedPtr()))
      +
      288  return false;
      +
      289  }
      +
      290 
      +
      291  if (media_info.has_media_duration_seconds()) {
      +
      292  // Adding 'duration' attribute, so that this information can be used when
      +
      293  // generating one MPD file. This should be removed from the final MPD.
      +
      294  SetFloatingPointAttribute("duration", media_info.media_duration_seconds());
      +
      295  }
      +
      296 
      +
      297  return true;
      +
      298 }
      +
      299 
      + +
      301  const MediaInfo& media_info,
      +
      302  const std::list<SegmentInfo>& segment_infos,
      +
      303  uint32_t start_number) {
      +
      304  XmlNode segment_template("SegmentTemplate");
      +
      305  if (media_info.has_reference_time_scale()) {
      +
      306  segment_template.SetIntegerAttribute("timescale",
      +
      307  media_info.reference_time_scale());
      +
      308  }
      +
      309 
      +
      310  if (media_info.has_init_segment_name()) {
      +
      311  // The spec does not allow '$Number$' and '$Time$' in initialization
      +
      312  // attribute.
      +
      313  // TODO(rkuroiwa, kqyang): Swap this check out with a better check. These
      +
      314  // templates allow formatting as well.
      +
      315  const std::string& init_segment_name = media_info.init_segment_name();
      +
      316  if (init_segment_name.find("$Number$") != std::string::npos ||
      +
      317  init_segment_name.find("$Time$") != std::string::npos) {
      +
      318  LOG(ERROR) << "$Number$ and $Time$ cannot be used for "
      +
      319  "SegmentTemplate@initialization";
      +
      320  return false;
      +
      321  }
      +
      322  segment_template.SetStringAttribute("initialization",
      +
      323  media_info.init_segment_name());
      +
      324  }
      +
      325 
      +
      326  if (media_info.has_segment_template()) {
      +
      327  segment_template.SetStringAttribute("media", media_info.segment_template());
      +
      328 
      +
      329  // TODO(rkuroiwa): Need a better check. $$Number is legitimate but not a
      +
      330  // template.
      +
      331  if (media_info.segment_template().find("$Number") != std::string::npos) {
      +
      332  DCHECK_GE(start_number, 1u);
      +
      333  segment_template.SetIntegerAttribute("startNumber", start_number);
      +
      334  }
      +
      335  }
      +
      336 
      +
      337  // TODO(rkuroiwa): Find out when a live MPD doesn't require SegmentTimeline.
      +
      338  XmlNode segment_timeline("SegmentTimeline");
      +
      339 
      +
      340  return PopulateSegmentTimeline(segment_infos, &segment_timeline) &&
      +
      341  segment_template.AddChild(segment_timeline.PassScopedPtr()) &&
      +
      342  AddChild(segment_template.PassScopedPtr());
      +
      343 }
      +
      344 
      +
      345 bool RepresentationXmlNode::AddAudioChannelInfo(const AudioInfo& audio_info) {
      +
      346  const uint32_t num_channels = audio_info.num_channels();
      +
      347  XmlNode audio_channel_config("AudioChannelConfiguration");
      +
      348  const char kAudioChannelConfigScheme[] =
      +
      349  "urn:mpeg:dash:23003:3:audio_channel_configuration:2011";
      +
      350  audio_channel_config.SetStringAttribute("schemeIdUri",
      +
      351  kAudioChannelConfigScheme);
      +
      352  audio_channel_config.SetIntegerAttribute("value", num_channels);
      +
      353 
      +
      354  return AddChild(audio_channel_config.PassScopedPtr());
      +
      355 }
      +
      356 
      +
      357 // MPD expects one number for sampling frequency, or if it is a range it should
      +
      358 // be space separated.
      +
      359 void RepresentationXmlNode::AddAudioSamplingRateInfo(
      +
      360  const AudioInfo& audio_info) {
      +
      361  if (audio_info.has_sampling_frequency())
      +
      362  SetIntegerAttribute("audioSamplingRate", audio_info.sampling_frequency());
      +
      363 }
      +
      364 
      +
      365 } // namespace xml
      +
      366 } // namespace edash_packager
      +
      bool AddVODOnlyInfo(const MediaInfo &media_info)
      Definition: xml_node.cc:253
      +
      bool AddLiveOnlyInfo(const MediaInfo &media_info, const std::list< SegmentInfo > &segment_infos, uint32_t start_number)
      Definition: xml_node.cc:300
      void SetStringAttribute(const char *attribute_name, const std::string &attribute)
      Definition: xml_node.cc:106
      void SetFloatingPointAttribute(const char *attribute_name, double number)
      Definition: xml_node.cc:121
      -
      bool AddAudioInfo(const MediaInfo::AudioInfo &audio_info)
      Definition: xml_node.cc:238
      +
      bool AddAudioInfo(const MediaInfo::AudioInfo &audio_info)
      Definition: xml_node.cc:245
      void SetId(uint32_t id)
      Definition: xml_node.cc:130
      bool AddChild(scoped_xml_ptr< xmlNode > child)
      Definition: xml_node.cc:64
      @@ -461,14 +468,14 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
      bool AddElements(const std::vector< Element > &elements)
      Adds Elements to this node using the Element struct.
      Definition: xml_node.cc:76
      -
      bool AddVideoInfo(const MediaInfo::VideoInfo &video_info)
      Definition: xml_node.cc:218
      scoped_xml_ptr< xmlNode > PassScopedPtr()
      Definition: xml_node.cc:139
      void SetContent(const std::string &content)
      Definition: xml_node.cc:134
      +
      bool AddVideoInfo(const MediaInfo::VideoInfo &video_info, bool set_width, bool set_height, bool set_frame_rate)
      Definition: xml_node.cc:218
      void AddRoleElement(const std::string &scheme_id_uri, const std::string &value)
      Definition: xml_node.cc:206
      diff --git a/docs/df/da9/classedash__packager_1_1media_1_1mp4_1_1Fragmenter-members.html b/docs/df/da9/classedash__packager_1_1media_1_1mp4_1_1Fragmenter-members.html index 5c51861342..65f68d3a10 100644 --- a/docs/df/da9/classedash__packager_1_1media_1_1mp4_1_1Fragmenter-members.html +++ b/docs/df/da9/classedash__packager_1_1media_1_1mp4_1_1Fragmenter-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/da9/structedash__packager_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html b/docs/df/da9/structedash__packager_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html index 826a9e6439..f802b722fc 100644 --- a/docs/df/da9/structedash__packager_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html +++ b/docs/df/da9/structedash__packager_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html @@ -136,7 +136,7 @@ Additional Inherited Members

      Detailed Description

      -

      Definition at line 335 of file box_definitions.h.

      +

      Definition at line 342 of file box_definitions.h.

      Member Function Documentation

      @@ -162,7 +162,7 @@ Additional Inherited Members

      Implements edash_packager::media::mp4::Box.

      -

      Definition at line 1503 of file box_definitions.cc.

      +

      Definition at line 1524 of file box_definitions.cc.

      @@ -173,7 +173,7 @@ Additional Inherited Members diff --git a/docs/df/dad/decrypt__config_8h_source.html b/docs/df/dad/decrypt__config_8h_source.html index aa5dc44759..0738c55f0a 100644 --- a/docs/df/dad/decrypt__config_8h_source.html +++ b/docs/df/dad/decrypt__config_8h_source.html @@ -151,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/db4/classedash__packager_1_1media_1_1BitReader.html b/docs/df/db4/classedash__packager_1_1media_1_1BitReader.html index 7e80038ea8..80cd3262ba 100644 --- a/docs/df/db4/classedash__packager_1_1media_1_1BitReader.html +++ b/docs/df/db4/classedash__packager_1_1media_1_1BitReader.html @@ -362,7 +362,7 @@ template<typename T > diff --git a/docs/df/db8/structedash__packager_1_1media_1_1mp4_1_1AC3Specific-members.html b/docs/df/db8/structedash__packager_1_1media_1_1mp4_1_1AC3Specific-members.html new file mode 100644 index 0000000000..b6ff88681b --- /dev/null +++ b/docs/df/db8/structedash__packager_1_1media_1_1mp4_1_1AC3Specific-members.html @@ -0,0 +1,117 @@ + + + + + + +DASH Media Packaging SDK: Member List + + + + + + + + + +
      +
      + + + + + + +
      +
      DASH Media Packaging SDK +
      +
      +
      + + + + + + + + + +
      + +
      + + +
      +
      +
      +
      edash_packager::media::mp4::AC3Specific Member List
      +
      + + + + + diff --git a/docs/df/dbc/structedash__packager_1_1media_1_1mp4_1_1ChunkLargeOffset-members.html b/docs/df/dbc/structedash__packager_1_1media_1_1mp4_1_1ChunkLargeOffset-members.html index 0a9d2a61df..7be097de84 100644 --- a/docs/df/dbc/structedash__packager_1_1media_1_1mp4_1_1ChunkLargeOffset-members.html +++ b/docs/df/dbc/structedash__packager_1_1media_1_1mp4_1_1ChunkLargeOffset-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/dd1/structedash__packager_1_1media_1_1mp4_1_1FileType-members.html b/docs/df/dd1/structedash__packager_1_1media_1_1mp4_1_1FileType-members.html index 5b5327556a..116e350723 100644 --- a/docs/df/dd1/structedash__packager_1_1media_1_1mp4_1_1FileType-members.html +++ b/docs/df/dd1/structedash__packager_1_1media_1_1mp4_1_1FileType-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/dd2/classedash__packager_1_1MockMpdBuilder-members.html b/docs/df/dd2/classedash__packager_1_1MockMpdBuilder-members.html index 4dc421dd07..043168fdc8 100644 --- a/docs/df/dd2/classedash__packager_1_1MockMpdBuilder-members.html +++ b/docs/df/dd2/classedash__packager_1_1MockMpdBuilder-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/dd2/mpd__utils_8h_source.html b/docs/df/dd2/mpd__utils_8h_source.html index dc594a84c5..801a8dbc9e 100644 --- a/docs/df/dd2/mpd__utils_8h_source.html +++ b/docs/df/dd2/mpd__utils_8h_source.html @@ -165,7 +165,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/dda/structedash__packager_1_1media_1_1Cue.html b/docs/df/dda/structedash__packager_1_1media_1_1Cue.html index a22b339da6..38fd285460 100644 --- a/docs/df/dda/structedash__packager_1_1media_1_1Cue.html +++ b/docs/df/dda/structedash__packager_1_1media_1_1Cue.html @@ -125,7 +125,7 @@ std::vector< std::string >  diff --git a/docs/df/ddc/webm_2segmenter_8h_source.html b/docs/df/ddc/webm_2segmenter_8h_source.html index 516b5d5531..eb8ecb5eb6 100644 --- a/docs/df/ddc/webm_2segmenter_8h_source.html +++ b/docs/df/ddc/webm_2segmenter_8h_source.html @@ -216,10 +216,10 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
      153 
      154 #endif // MEDIA_FORMATS_WEBM_SEGMENTER_H_
      Status Initialize(scoped_ptr< MkvWriter > writer, StreamInfo *info, ProgressListener *progress_listener, MuxerListener *muxer_listener, KeySource *encryption_key_source)
      Definition: segmenter.cc:45
      -
      Holds audio stream information.
      +
      Holds audio stream information.
      An implementation of IMkvWriter using our File type.
      Definition: mkv_writer.h:21
      - -
      Status SetCluster(uint64_t start_webm_timecode, uint64_t position, MkvWriter *writer)
      Creates a Cluster object with the given parameters.
      Definition: segmenter.cc:193
      + +
      Status SetCluster(uint64_t start_webm_timecode, uint64_t position, MkvWriter *writer)
      Creates a Cluster object with the given parameters.
      Definition: segmenter.cc:210
      Abstract class holds stream information.
      Definition: stream_info.h:26
      This class listens to progress updates events.
      @@ -227,12 +227,12 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search');
      virtual bool GetIndexRangeStartAndEnd(uint32_t *start, uint32_t *end)=0
      KeySource is responsible for encryption key acquisition.
      Definition: key_source.h:29
      -
      uint64_t FromWebMTimecode(uint64_t time_webm_timecode)
      Converts the given time in WebM timecode to ISO BMFF timescale.
      Definition: segmenter.cc:151
      +
      uint64_t FromWebMTimecode(uint64_t time_webm_timecode)
      Converts the given time in WebM timecode to ISO BMFF timescale.
      Definition: segmenter.cc:168
      virtual bool GetInitRangeStartAndEnd(uint32_t *start, uint32_t *end)=0
      Holds video stream information.
      -
      uint64_t FromBMFFTimescale(uint64_t time_timescale)
      Definition: segmenter.cc:144
      -
      Status WriteSegmentHeader(uint64_t file_size, MkvWriter *writer)
      Writes the Segment header to writer.
      Definition: segmenter.cc:157
      -
      void UpdateProgress(uint64_t progress)
      Update segmentation progress using ProgressListener.
      Definition: segmenter.cc:202
      +
      uint64_t FromBMFFTimescale(uint64_t time_timescale)
      Definition: segmenter.cc:161
      +
      Status WriteSegmentHeader(uint64_t file_size, MkvWriter *writer)
      Writes the Segment header to writer.
      Definition: segmenter.cc:174
      +
      void UpdateProgress(uint64_t progress)
      Update segmentation progress using ProgressListener.
      Definition: segmenter.cc:219
      This structure contains the list of configuration options for Muxer.
      Definition: muxer_options.h:18
      @@ -240,7 +240,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/dde/classedash__packager_1_1media_1_1BufferWriter.html b/docs/df/dde/classedash__packager_1_1media_1_1BufferWriter.html index 99616e5b0e..dd2aca48c2 100644 --- a/docs/df/dde/classedash__packager_1_1media_1_1BufferWriter.html +++ b/docs/df/dde/classedash__packager_1_1media_1_1BufferWriter.html @@ -301,7 +301,7 @@ void AppendInt (int64_ diff --git a/docs/df/dde/ts__section__psi_8cc_source.html b/docs/df/dde/ts__section__psi_8cc_source.html index e323aa9f94..f8b9500861 100644 --- a/docs/df/dde/ts__section__psi_8cc_source.html +++ b/docs/df/dde/ts__section__psi_8cc_source.html @@ -228,7 +228,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/de3/structedash__packager_1_1media_1_1mp4_1_1TrackHeader-members.html b/docs/df/de3/structedash__packager_1_1media_1_1mp4_1_1TrackHeader-members.html index 46ecb805da..af8b70647b 100644 --- a/docs/df/de3/structedash__packager_1_1media_1_1mp4_1_1TrackHeader-members.html +++ b/docs/df/de3/structedash__packager_1_1media_1_1mp4_1_1TrackHeader-members.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/de3/text__track__config_8cc_source.html b/docs/df/de3/text__track__config_8cc_source.html index dad909d11c..5e766242c9 100644 --- a/docs/df/de3/text__track__config_8cc_source.html +++ b/docs/df/de3/text__track__config_8cc_source.html @@ -122,7 +122,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/de7/classedash__packager_1_1media_1_1MuxerListener.html b/docs/df/de7/classedash__packager_1_1media_1_1MuxerListener.html index 7d74b58201..89ab230a26 100644 --- a/docs/df/de7/classedash__packager_1_1media_1_1MuxerListener.html +++ b/docs/df/de7/classedash__packager_1_1media_1_1MuxerListener.html @@ -177,7 +177,7 @@ virtual void OnNewSegment< diff --git a/docs/df/de9/segment__info_8h_source.html b/docs/df/de9/segment__info_8h_source.html index 9e6d4a292d..9da4ceddf6 100644 --- a/docs/df/de9/segment__info_8h_source.html +++ b/docs/df/de9/segment__info_8h_source.html @@ -114,7 +114,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/dec/classedash__packager_1_1media_1_1MuxerListener-members.html b/docs/df/dec/classedash__packager_1_1media_1_1MuxerListener-members.html index 91571852e8..9decb2c054 100644 --- a/docs/df/dec/classedash__packager_1_1media_1_1MuxerListener-members.html +++ b/docs/df/dec/classedash__packager_1_1media_1_1MuxerListener-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/df/df4/classedash__packager_1_1media_1_1SeekHead.html b/docs/df/df4/classedash__packager_1_1media_1_1SeekHead.html index f8b9309f28..711add3c62 100644 --- a/docs/df/df4/classedash__packager_1_1media_1_1SeekHead.html +++ b/docs/df/df4/classedash__packager_1_1media_1_1SeekHead.html @@ -148,7 +148,7 @@ void set_tracks_pos (u diff --git a/docs/df/dfa/classedash__packager_1_1media_1_1RsaPublicKey-members.html b/docs/df/dfa/classedash__packager_1_1media_1_1RsaPublicKey-members.html index 290d2bbf5b..d37369e337 100644 --- a/docs/df/dfa/classedash__packager_1_1media_1_1RsaPublicKey-members.html +++ b/docs/df/dfa/classedash__packager_1_1media_1_1RsaPublicKey-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "../../search",false,'Search'); diff --git a/docs/dir_2618cd273dea54f184e42d7a562af818.html b/docs/dir_2618cd273dea54f184e42d7a562af818.html index 8f91885d00..f99e161e96 100644 --- a/docs/dir_2618cd273dea54f184e42d7a562af818.html +++ b/docs/dir_2618cd273dea54f184e42d7a562af818.html @@ -140,7 +140,7 @@ Files diff --git a/docs/dir_279fd47bebb21302c25cfb685e84c359.html b/docs/dir_279fd47bebb21302c25cfb685e84c359.html index dbc61fda8a..69317cad7b 100644 --- a/docs/dir_279fd47bebb21302c25cfb685e84c359.html +++ b/docs/dir_279fd47bebb21302c25cfb685e84c359.html @@ -119,7 +119,7 @@ Files diff --git a/docs/dir_2eceb70145328c029a5f43350007537a.html b/docs/dir_2eceb70145328c029a5f43350007537a.html index ce62fa793b..f481399824 100644 --- a/docs/dir_2eceb70145328c029a5f43350007537a.html +++ b/docs/dir_2eceb70145328c029a5f43350007537a.html @@ -93,7 +93,7 @@ Files diff --git a/docs/dir_39dc0668bd5a501998f94e8b4e546c71.html b/docs/dir_39dc0668bd5a501998f94e8b4e546c71.html index e261306f0b..3f774db242 100644 --- a/docs/dir_39dc0668bd5a501998f94e8b4e546c71.html +++ b/docs/dir_39dc0668bd5a501998f94e8b4e546c71.html @@ -99,7 +99,7 @@ Directories diff --git a/docs/dir_3e9291fd7a18fdecc763294cb2628910.html b/docs/dir_3e9291fd7a18fdecc763294cb2628910.html index 3bc81df31e..5dec6d7f9b 100644 --- a/docs/dir_3e9291fd7a18fdecc763294cb2628910.html +++ b/docs/dir_3e9291fd7a18fdecc763294cb2628910.html @@ -169,7 +169,7 @@ Files diff --git a/docs/dir_49627ef5ef0630f6cf11dd06344c4cf0.html b/docs/dir_49627ef5ef0630f6cf11dd06344c4cf0.html index 3afa3cd047..0a6aa31b23 100644 --- a/docs/dir_49627ef5ef0630f6cf11dd06344c4cf0.html +++ b/docs/dir_49627ef5ef0630f6cf11dd06344c4cf0.html @@ -93,7 +93,7 @@ Files diff --git a/docs/dir_5039d854a18988ed1f1dbebc120ffbf7.html b/docs/dir_5039d854a18988ed1f1dbebc120ffbf7.html index 1aa4d008ab..1221d07e35 100644 --- a/docs/dir_5039d854a18988ed1f1dbebc120ffbf7.html +++ b/docs/dir_5039d854a18988ed1f1dbebc120ffbf7.html @@ -181,7 +181,7 @@ Files diff --git a/docs/dir_5eb2e460866db0ed29e32d64402e5c22.html b/docs/dir_5eb2e460866db0ed29e32d64402e5c22.html index d611c4ab20..c086445323 100644 --- a/docs/dir_5eb2e460866db0ed29e32d64402e5c22.html +++ b/docs/dir_5eb2e460866db0ed29e32d64402e5c22.html @@ -125,7 +125,7 @@ Files diff --git a/docs/dir_65f7acfa8cf3a5f1edc11faa2428b914.html b/docs/dir_65f7acfa8cf3a5f1edc11faa2428b914.html index bf436c7d25..07104de512 100644 --- a/docs/dir_65f7acfa8cf3a5f1edc11faa2428b914.html +++ b/docs/dir_65f7acfa8cf3a5f1edc11faa2428b914.html @@ -101,7 +101,7 @@ Directories diff --git a/docs/dir_679a6f4e9fa092b388fc986148018f2a.html b/docs/dir_679a6f4e9fa092b388fc986148018f2a.html index add27106f0..f8c632694e 100644 --- a/docs/dir_679a6f4e9fa092b388fc986148018f2a.html +++ b/docs/dir_679a6f4e9fa092b388fc986148018f2a.html @@ -95,7 +95,7 @@ Files diff --git a/docs/dir_7f5e01ba7faf319a30cabd201b6ef121.html b/docs/dir_7f5e01ba7faf319a30cabd201b6ef121.html index 71141b5ecd..6ad2dcf8d3 100644 --- a/docs/dir_7f5e01ba7faf319a30cabd201b6ef121.html +++ b/docs/dir_7f5e01ba7faf319a30cabd201b6ef121.html @@ -93,7 +93,7 @@ Files diff --git a/docs/dir_89dd766eb2df7d7257dbe806a34404af.html b/docs/dir_89dd766eb2df7d7257dbe806a34404af.html index 97e204ddd8..2a4668d0c3 100644 --- a/docs/dir_89dd766eb2df7d7257dbe806a34404af.html +++ b/docs/dir_89dd766eb2df7d7257dbe806a34404af.html @@ -93,7 +93,7 @@ Directories diff --git a/docs/dir_aa73376d632f252584a1c0dfbefab2c4.html b/docs/dir_aa73376d632f252584a1c0dfbefab2c4.html index 4313186bbb..a2c2ac4afe 100644 --- a/docs/dir_aa73376d632f252584a1c0dfbefab2c4.html +++ b/docs/dir_aa73376d632f252584a1c0dfbefab2c4.html @@ -109,7 +109,7 @@ Files diff --git a/docs/dir_c6ada2450b25ab5438a4dba6c9b890af.html b/docs/dir_c6ada2450b25ab5438a4dba6c9b890af.html index eb3c7c764d..ae59ea6a1e 100644 --- a/docs/dir_c6ada2450b25ab5438a4dba6c9b890af.html +++ b/docs/dir_c6ada2450b25ab5438a4dba6c9b890af.html @@ -219,7 +219,7 @@ Files diff --git a/docs/dir_d422163b96683743ed3963d4aac17747.html b/docs/dir_d422163b96683743ed3963d4aac17747.html index f19c26b4b6..3c7e61823c 100644 --- a/docs/dir_d422163b96683743ed3963d4aac17747.html +++ b/docs/dir_d422163b96683743ed3963d4aac17747.html @@ -131,7 +131,7 @@ Files diff --git a/docs/dir_eeaeb49ac3913fcfb450d3ce9cc0141b.html b/docs/dir_eeaeb49ac3913fcfb450d3ce9cc0141b.html index a032e9ac52..af57e64e49 100644 --- a/docs/dir_eeaeb49ac3913fcfb450d3ce9cc0141b.html +++ b/docs/dir_eeaeb49ac3913fcfb450d3ce9cc0141b.html @@ -93,7 +93,7 @@ Files diff --git a/docs/dir_f7dcbe7025bbacfc4b9a7dff6ad41d72.html b/docs/dir_f7dcbe7025bbacfc4b9a7dff6ad41d72.html index 5d42a27da3..3e688c08f1 100644 --- a/docs/dir_f7dcbe7025bbacfc4b9a7dff6ad41d72.html +++ b/docs/dir_f7dcbe7025bbacfc4b9a7dff6ad41d72.html @@ -131,7 +131,7 @@ Files diff --git a/docs/files.html b/docs/files.html index d8100dd238..bfe32b2a81 100644 --- a/docs/files.html +++ b/docs/files.html @@ -377,7 +377,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions.html b/docs/functions.html index e04a3877ec..b3963cae3b 100644 --- a/docs/functions.html +++ b/docs/functions.html @@ -171,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : edash_packager::media::Muxer
    • AddVideoInfo() -: edash_packager::xml::RepresentationXmlNode +: edash_packager::xml::RepresentationXmlNode
    • AddVODOnlyInfo() : edash_packager::xml::RepresentationXmlNode @@ -211,7 +211,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_b.html b/docs/functions_b.html index 71a0f909eb..6e73534d0b 100644 --- a/docs/functions_b.html +++ b/docs/functions_b.html @@ -143,7 +143,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : edash_packager::media::mp4::BoxBuffer
    • BoxType() -: edash_packager::media::mp4::AudioSampleEntry +: edash_packager::media::mp4::AC3Specific +, edash_packager::media::mp4::AudioSampleEntry , edash_packager::media::mp4::Box , edash_packager::media::mp4::ChunkLargeOffset , edash_packager::media::mp4::ChunkOffset @@ -236,7 +237,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_c.html b/docs/functions_c.html index 99cc454ce2..56ebb435ef 100644 --- a/docs/functions_c.html +++ b/docs/functions_c.html @@ -209,7 +209,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : edash_packager::media::SegmentTestBase
    • CreateSample() -: edash_packager::media::SegmentTestBase +: edash_packager::media::SegmentTestBase
    • CreateSigner() : edash_packager::media::AesRequestSigner @@ -225,7 +225,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_d.html b/docs/functions_d.html index cee17d1853..ea991a3f37 100644 --- a/docs/functions_d.html +++ b/docs/functions_d.html @@ -153,7 +153,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_e.html b/docs/functions_e.html index dd44b1c367..e110d6c9dc 100644 --- a/docs/functions_e.html +++ b/docs/functions_e.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_eval.html b/docs/functions_eval.html index dbf3a65efa..b1ce8002bc 100644 --- a/docs/functions_eval.html +++ b/docs/functions_eval.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_f.html b/docs/functions_f.html index b0c7c06d2c..51ee069713 100644 --- a/docs/functions_f.html +++ b/docs/functions_f.html @@ -187,7 +187,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func.html b/docs/functions_func.html index 031aa7c14b..f699c0bcce 100644 --- a/docs/functions_func.html +++ b/docs/functions_func.html @@ -171,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : edash_packager::media::Muxer
    • AddVideoInfo() -: edash_packager::xml::RepresentationXmlNode +: edash_packager::xml::RepresentationXmlNode
    • AddVODOnlyInfo() : edash_packager::xml::RepresentationXmlNode @@ -211,7 +211,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_b.html b/docs/functions_func_b.html index 4aa8210394..562910cced 100644 --- a/docs/functions_func_b.html +++ b/docs/functions_func_b.html @@ -140,7 +140,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : edash_packager::media::mp4::BoxBuffer
    • BoxType() -: edash_packager::media::mp4::AudioSampleEntry +: edash_packager::media::mp4::AC3Specific +, edash_packager::media::mp4::AudioSampleEntry , edash_packager::media::mp4::Box , edash_packager::media::mp4::ChunkLargeOffset , edash_packager::media::mp4::ChunkOffset @@ -233,7 +234,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_c.html b/docs/functions_func_c.html index 5e97c475a0..cdd248ec27 100644 --- a/docs/functions_func_c.html +++ b/docs/functions_func_c.html @@ -209,7 +209,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : edash_packager::media::SegmentTestBase
    • CreateSample() -: edash_packager::media::SegmentTestBase +: edash_packager::media::SegmentTestBase
    • CreateSigner() : edash_packager::media::AesRequestSigner @@ -225,7 +225,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_d.html b/docs/functions_func_d.html index d89dab9a4c..c240d63e91 100644 --- a/docs/functions_func_d.html +++ b/docs/functions_func_d.html @@ -153,7 +153,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_e.html b/docs/functions_func_e.html index 93c5f072dd..37ec78283f 100644 --- a/docs/functions_func_e.html +++ b/docs/functions_func_e.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_f.html b/docs/functions_func_f.html index 00ff74402a..346d386db4 100644 --- a/docs/functions_func_f.html +++ b/docs/functions_func_f.html @@ -181,7 +181,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_g.html b/docs/functions_func_g.html index 3cb69b4d12..2dbaa47ca9 100644 --- a/docs/functions_func_g.html +++ b/docs/functions_func_g.html @@ -234,7 +234,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_h.html b/docs/functions_func_h.html index c8e61eab1c..83f163c80d 100644 --- a/docs/functions_func_h.html +++ b/docs/functions_func_h.html @@ -141,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_i.html b/docs/functions_func_i.html index d20660c4eb..3d46c09895 100644 --- a/docs/functions_func_i.html +++ b/docs/functions_func_i.html @@ -196,7 +196,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_k.html b/docs/functions_func_k.html index b0f7b11abf..4b7d4d2b98 100644 --- a/docs/functions_func_k.html +++ b/docs/functions_func_k.html @@ -128,7 +128,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_l.html b/docs/functions_func_l.html index f66289b7a4..e832faa8fc 100644 --- a/docs/functions_func_l.html +++ b/docs/functions_func_l.html @@ -137,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_m.html b/docs/functions_func_m.html index c42a947634..c700dabcee 100644 --- a/docs/functions_func_m.html +++ b/docs/functions_func_m.html @@ -143,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_n.html b/docs/functions_func_n.html index 8253ef0191..a1ca881eb7 100644 --- a/docs/functions_func_n.html +++ b/docs/functions_func_n.html @@ -153,7 +153,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_o.html b/docs/functions_func_o.html index 596df38811..19251e1303 100644 --- a/docs/functions_func_o.html +++ b/docs/functions_func_o.html @@ -164,7 +164,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_p.html b/docs/functions_func_p.html index c554254a85..3431efd076 100644 --- a/docs/functions_func_p.html +++ b/docs/functions_func_p.html @@ -206,7 +206,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_r.html b/docs/functions_func_r.html index fbf95a94a6..fd0271b7a4 100644 --- a/docs/functions_func_r.html +++ b/docs/functions_func_r.html @@ -200,7 +200,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_s.html b/docs/functions_func_s.html index 8c0aee67d4..a30f3110e8 100644 --- a/docs/functions_func_s.html +++ b/docs/functions_func_s.html @@ -238,7 +238,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : edash_packager::media::mp4::BoxReader
    • Status() -: edash_packager::media::Status +: edash_packager::media::Status
    • Stop() : edash_packager::media::ProducerConsumerQueue< T > @@ -249,6 +249,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    • streams() : edash_packager::media::Demuxer
    • +
    • SuppressOnce() +: edash_packager::Representation +
    • SyncSampleIterator() : edash_packager::media::mp4::SyncSampleIterator
    • @@ -259,7 +262,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_t.html b/docs/functions_func_t.html index 3673c5cefa..be6af8401b 100644 --- a/docs/functions_func_t.html +++ b/docs/functions_func_t.html @@ -174,7 +174,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_u.html b/docs/functions_func_u.html index 6223d0f4f4..9d2dfdbf84 100644 --- a/docs/functions_func_u.html +++ b/docs/functions_func_u.html @@ -146,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_v.html b/docs/functions_func_v.html index 4fe24da649..021bd81759 100644 --- a/docs/functions_func_v.html +++ b/docs/functions_func_v.html @@ -134,7 +134,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_w.html b/docs/functions_func_w.html index d15cede230..5637e10135 100644 --- a/docs/functions_func_w.html +++ b/docs/functions_func_w.html @@ -173,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_x.html b/docs/functions_func_x.html index 7782ecffa5..64eaf2d2f8 100644 --- a/docs/functions_func_x.html +++ b/docs/functions_func_x.html @@ -128,7 +128,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_func_~.html b/docs/functions_func_~.html index 1f1065b942..bf6eb3272b 100644 --- a/docs/functions_func_~.html +++ b/docs/functions_func_~.html @@ -131,7 +131,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_g.html b/docs/functions_g.html index eac9cb0e36..93f9d405fb 100644 --- a/docs/functions_g.html +++ b/docs/functions_g.html @@ -234,7 +234,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_h.html b/docs/functions_h.html index 0af153ec7f..d5d1ba3fdc 100644 --- a/docs/functions_h.html +++ b/docs/functions_h.html @@ -141,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_i.html b/docs/functions_i.html index 927bd5884e..82c71b1013 100644 --- a/docs/functions_i.html +++ b/docs/functions_i.html @@ -199,7 +199,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_k.html b/docs/functions_k.html index 08e09d621e..d4c6123940 100644 --- a/docs/functions_k.html +++ b/docs/functions_k.html @@ -146,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_l.html b/docs/functions_l.html index bcb7185bc6..4c4233688e 100644 --- a/docs/functions_l.html +++ b/docs/functions_l.html @@ -137,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_m.html b/docs/functions_m.html index 8e701f39d8..1e2e6ac320 100644 --- a/docs/functions_m.html +++ b/docs/functions_m.html @@ -143,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_n.html b/docs/functions_n.html index ec38baef80..cf56063e03 100644 --- a/docs/functions_n.html +++ b/docs/functions_n.html @@ -159,7 +159,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_o.html b/docs/functions_o.html index 00a13bc140..4f2ce19b93 100644 --- a/docs/functions_o.html +++ b/docs/functions_o.html @@ -167,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_p.html b/docs/functions_p.html index 4451bf8e3b..0c805fa321 100644 --- a/docs/functions_p.html +++ b/docs/functions_p.html @@ -212,7 +212,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_r.html b/docs/functions_r.html index 94d0d614b1..a9f53fa0de 100644 --- a/docs/functions_r.html +++ b/docs/functions_r.html @@ -200,7 +200,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_s.html b/docs/functions_s.html index daae80760d..4a52238436 100644 --- a/docs/functions_s.html +++ b/docs/functions_s.html @@ -264,6 +264,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
    • streams() : edash_packager::media::Demuxer
    • +
    • SuppressOnce() +: edash_packager::Representation +
    • SyncSampleIterator() : edash_packager::media::mp4::SyncSampleIterator
    • @@ -274,7 +277,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_t.html b/docs/functions_t.html index b431705dd3..1a67682507 100644 --- a/docs/functions_t.html +++ b/docs/functions_t.html @@ -177,7 +177,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_type.html b/docs/functions_type.html index 66e920d72c..272c1483ec 100644 --- a/docs/functions_type.html +++ b/docs/functions_type.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_u.html b/docs/functions_u.html index 18a444fcea..e2fbd622c6 100644 --- a/docs/functions_u.html +++ b/docs/functions_u.html @@ -146,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_v.html b/docs/functions_v.html index 5e836402bb..7373fac7cc 100644 --- a/docs/functions_v.html +++ b/docs/functions_v.html @@ -134,7 +134,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_vars.html b/docs/functions_vars.html index c9d98a0333..f676ac2e73 100644 --- a/docs/functions_vars.html +++ b/docs/functions_vars.html @@ -147,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_w.html b/docs/functions_w.html index 18bb6cb443..f395dc43f0 100644 --- a/docs/functions_w.html +++ b/docs/functions_w.html @@ -173,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_x.html b/docs/functions_x.html index bad10052bf..813a1067b1 100644 --- a/docs/functions_x.html +++ b/docs/functions_x.html @@ -128,7 +128,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/functions_~.html b/docs/functions_~.html index 62b870f7d6..0aa8be2c94 100644 --- a/docs/functions_~.html +++ b/docs/functions_~.html @@ -131,7 +131,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/hierarchy.html b/docs/hierarchy.html index bc0a13aa03..d6aca142e0 100644 --- a/docs/hierarchy.html +++ b/docs/hierarchy.html @@ -102,76 +102,77 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); oCBandwidthEstimator oCedash_packager::media::BitReaderA class to read bit streams oCedash_packager::media::mp4::Box -|oCedash_packager::media::mp4::AudioSampleEntry -|oCedash_packager::media::mp4::CodecConfigurationRecord -|oCedash_packager::media::mp4::CueIDBox -|oCedash_packager::media::mp4::CuePayloadBox -|oCedash_packager::media::mp4::CueSettingsBox -|oCedash_packager::media::mp4::CueSourceIDBox -|oCedash_packager::media::mp4::CueTimeBox -|oCedash_packager::media::mp4::DataInformation -|oCedash_packager::media::mp4::DTSSpecific -|oCedash_packager::media::mp4::Edit -|oCedash_packager::media::mp4::FileType -||\Cedash_packager::media::mp4::SegmentType -|oCedash_packager::media::mp4::FullBox -||oCedash_packager::media::mp4::ChunkLargeOffset -|||\Cedash_packager::media::mp4::ChunkOffset -||oCedash_packager::media::mp4::CompactSampleSize -||oCedash_packager::media::mp4::CompositionTimeToSample -||oCedash_packager::media::mp4::DataEntryUrl -||oCedash_packager::media::mp4::DataReference -||oCedash_packager::media::mp4::DecodingTimeToSample -||oCedash_packager::media::mp4::EditList -||oCedash_packager::media::mp4::ElementaryStreamDescriptor -||oCedash_packager::media::mp4::HandlerReference -||oCedash_packager::media::mp4::ID3v2 -||oCedash_packager::media::mp4::MediaHeader -||oCedash_packager::media::mp4::Metadata -||oCedash_packager::media::mp4::MovieExtendsHeader -||oCedash_packager::media::mp4::MovieFragmentHeader -||oCedash_packager::media::mp4::MovieHeader -||oCedash_packager::media::mp4::ProtectionSystemSpecificHeader -||oCedash_packager::media::mp4::SampleAuxiliaryInformationOffset -||oCedash_packager::media::mp4::SampleAuxiliaryInformationSize -||oCedash_packager::media::mp4::SampleDescription -||oCedash_packager::media::mp4::SampleEncryption -||oCedash_packager::media::mp4::SampleGroupDescription -||oCedash_packager::media::mp4::SampleSize -||oCedash_packager::media::mp4::SampleToChunk -||oCedash_packager::media::mp4::SampleToGroup -||oCedash_packager::media::mp4::SchemeType -||oCedash_packager::media::mp4::SegmentIndex -||oCedash_packager::media::mp4::SoundMediaHeader -||oCedash_packager::media::mp4::SubtitleMediaHeader -||oCedash_packager::media::mp4::SyncSample -||oCedash_packager::media::mp4::TrackEncryption -||oCedash_packager::media::mp4::TrackExtends -||oCedash_packager::media::mp4::TrackFragmentDecodeTime -||oCedash_packager::media::mp4::TrackFragmentHeader -||oCedash_packager::media::mp4::TrackFragmentRun -||oCedash_packager::media::mp4::TrackHeader -||\Cedash_packager::media::mp4::VideoMediaHeader -|oCedash_packager::media::mp4::Media -|oCedash_packager::media::mp4::MediaData -|oCedash_packager::media::mp4::MediaInformation -|oCedash_packager::media::mp4::Movie -|oCedash_packager::media::mp4::MovieExtends -|oCedash_packager::media::mp4::MovieFragment -|oCedash_packager::media::mp4::OriginalFormat -|oCedash_packager::media::mp4::PixelAspectRatio -|oCedash_packager::media::mp4::ProtectionSchemeInfo -|oCedash_packager::media::mp4::SampleTable -|oCedash_packager::media::mp4::SchemeInfo -|oCedash_packager::media::mp4::Track -|oCedash_packager::media::mp4::TrackFragment -|oCedash_packager::media::mp4::VideoSampleEntry -|oCedash_packager::media::mp4::VTTAdditionalTextBox -|oCedash_packager::media::mp4::VTTCueBox -|oCedash_packager::media::mp4::VTTEmptyCueBox -|oCedash_packager::media::mp4::WebVTTConfigurationBox -|oCedash_packager::media::mp4::WebVTTSourceLabelBox -|\Cedash_packager::media::mp4::WVTTSampleEntry +|oCedash_packager::media::mp4::AC3Specific +|oCedash_packager::media::mp4::AudioSampleEntry +|oCedash_packager::media::mp4::CodecConfigurationRecord +|oCedash_packager::media::mp4::CueIDBox +|oCedash_packager::media::mp4::CuePayloadBox +|oCedash_packager::media::mp4::CueSettingsBox +|oCedash_packager::media::mp4::CueSourceIDBox +|oCedash_packager::media::mp4::CueTimeBox +|oCedash_packager::media::mp4::DataInformation +|oCedash_packager::media::mp4::DTSSpecific +|oCedash_packager::media::mp4::Edit +|oCedash_packager::media::mp4::FileType +||\Cedash_packager::media::mp4::SegmentType +|oCedash_packager::media::mp4::FullBox +||oCedash_packager::media::mp4::ChunkLargeOffset +|||\Cedash_packager::media::mp4::ChunkOffset +||oCedash_packager::media::mp4::CompactSampleSize +||oCedash_packager::media::mp4::CompositionTimeToSample +||oCedash_packager::media::mp4::DataEntryUrl +||oCedash_packager::media::mp4::DataReference +||oCedash_packager::media::mp4::DecodingTimeToSample +||oCedash_packager::media::mp4::EditList +||oCedash_packager::media::mp4::ElementaryStreamDescriptor +||oCedash_packager::media::mp4::HandlerReference +||oCedash_packager::media::mp4::ID3v2 +||oCedash_packager::media::mp4::MediaHeader +||oCedash_packager::media::mp4::Metadata +||oCedash_packager::media::mp4::MovieExtendsHeader +||oCedash_packager::media::mp4::MovieFragmentHeader +||oCedash_packager::media::mp4::MovieHeader +||oCedash_packager::media::mp4::ProtectionSystemSpecificHeader +||oCedash_packager::media::mp4::SampleAuxiliaryInformationOffset +||oCedash_packager::media::mp4::SampleAuxiliaryInformationSize +||oCedash_packager::media::mp4::SampleDescription +||oCedash_packager::media::mp4::SampleEncryption +||oCedash_packager::media::mp4::SampleGroupDescription +||oCedash_packager::media::mp4::SampleSize +||oCedash_packager::media::mp4::SampleToChunk +||oCedash_packager::media::mp4::SampleToGroup +||oCedash_packager::media::mp4::SchemeType +||oCedash_packager::media::mp4::SegmentIndex +||oCedash_packager::media::mp4::SoundMediaHeader +||oCedash_packager::media::mp4::SubtitleMediaHeader +||oCedash_packager::media::mp4::SyncSample +||oCedash_packager::media::mp4::TrackEncryption +||oCedash_packager::media::mp4::TrackExtends +||oCedash_packager::media::mp4::TrackFragmentDecodeTime +||oCedash_packager::media::mp4::TrackFragmentHeader +||oCedash_packager::media::mp4::TrackFragmentRun +||oCedash_packager::media::mp4::TrackHeader +||\Cedash_packager::media::mp4::VideoMediaHeader +|oCedash_packager::media::mp4::Media +|oCedash_packager::media::mp4::MediaData +|oCedash_packager::media::mp4::MediaInformation +|oCedash_packager::media::mp4::Movie +|oCedash_packager::media::mp4::MovieExtends +|oCedash_packager::media::mp4::MovieFragment +|oCedash_packager::media::mp4::OriginalFormat +|oCedash_packager::media::mp4::PixelAspectRatio +|oCedash_packager::media::mp4::ProtectionSchemeInfo +|oCedash_packager::media::mp4::SampleTable +|oCedash_packager::media::mp4::SchemeInfo +|oCedash_packager::media::mp4::Track +|oCedash_packager::media::mp4::TrackFragment +|oCedash_packager::media::mp4::VideoSampleEntry +|oCedash_packager::media::mp4::VTTAdditionalTextBox +|oCedash_packager::media::mp4::VTTCueBox +|oCedash_packager::media::mp4::VTTEmptyCueBox +|oCedash_packager::media::mp4::WebVTTConfigurationBox +|oCedash_packager::media::mp4::WebVTTSourceLabelBox +|\Cedash_packager::media::mp4::WVTTSampleEntry oCedash_packager::media::mp4::BoxBuffer oCedash_packager::media::BufferReader |\Cedash_packager::media::mp4::BoxReaderClass for reading MP4 boxes @@ -332,7 +333,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/index.html b/docs/index.html index b1bff0d22d..b9bd5a699f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -81,7 +81,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/namespacemembers.html b/docs/namespacemembers.html index fdff2799c0..9f0b68c896 100644 --- a/docs/namespacemembers.html +++ b/docs/namespacemembers.html @@ -124,7 +124,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/namespacemembers_func.html b/docs/namespacemembers_func.html index 36da1dc4a8..84c05fbbbe 100644 --- a/docs/namespacemembers_func.html +++ b/docs/namespacemembers_func.html @@ -124,7 +124,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/namespaces.html b/docs/namespaces.html index 0b2d3dc2a3..f481bc29a1 100644 --- a/docs/namespaces.html +++ b/docs/namespaces.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/docs/search/all_0.js b/docs/search/all_0.js index 42aef40504..0f4e36274f 100644 --- a/docs/search/all_0.js +++ b/docs/search/all_0.js @@ -1,8 +1,9 @@ var searchData= [ ['aacaudiospecificconfig',['AACAudioSpecificConfig',['../dc/dc6/classedash__packager_1_1media_1_1mp4_1_1AACAudioSpecificConfig.html',1,'edash_packager::media::mp4']]], - ['adaptationset',['AdaptationSet',['../db/de4/classedash__packager_1_1AdaptationSet.html',1,'edash_packager']]], + ['ac3specific',['AC3Specific',['../d0/d65/structedash__packager_1_1media_1_1mp4_1_1AC3Specific.html',1,'edash_packager::media::mp4']]], ['adaptationset',['AdaptationSet',['../db/de4/classedash__packager_1_1AdaptationSet.html#a21ce7ce804532a95f9aea7e2a9c3570e',1,'edash_packager::AdaptationSet']]], + ['adaptationset',['AdaptationSet',['../db/de4/classedash__packager_1_1AdaptationSet.html',1,'edash_packager']]], ['adaptationsetxmlnode',['AdaptationSetXmlNode',['../d6/d37/classedash__packager_1_1xml_1_1AdaptationSetXmlNode.html',1,'edash_packager::xml']]], ['addadaptationset',['AddAdaptationSet',['../d3/dfa/classedash__packager_1_1MpdBuilder.html#a301a9b49e15371117e2c050c4e5b038c',1,'edash_packager::MpdBuilder']]], ['addaudioinfo',['AddAudioInfo',['../dc/d05/classedash__packager_1_1xml_1_1RepresentationXmlNode.html#a1a3d8d8831e19ae010841704c07238c6',1,'edash_packager::xml::RepresentationXmlNode']]], @@ -18,7 +19,7 @@ var searchData= ['addroleelement',['AddRoleElement',['../d6/d37/classedash__packager_1_1xml_1_1AdaptationSetXmlNode.html#a40c48f2ed2ac0f550bf019d7e650be94',1,'edash_packager::xml::AdaptationSetXmlNode']]], ['addsample',['AddSample',['../d8/d1e/classedash__packager_1_1media_1_1mp4_1_1EncryptingFragmenter.html#ae8fd13a579fee2167167bcdbb9637dcc',1,'edash_packager::media::mp4::EncryptingFragmenter::AddSample()'],['../db/dae/classedash__packager_1_1media_1_1mp4_1_1Fragmenter.html#a81d8b1f324bdd2bc9cc2e5a469243926',1,'edash_packager::media::mp4::Fragmenter::AddSample()'],['../dc/de1/classedash__packager_1_1media_1_1mp4_1_1Segmenter.html#a5c21059ee9a533caec81491bdb751c57',1,'edash_packager::media::mp4::Segmenter::AddSample()'],['../da/d14/classedash__packager_1_1media_1_1webm_1_1Segmenter.html#aff9c729f9464540eafc6571d4a42df47',1,'edash_packager::media::webm::Segmenter::AddSample()']]], ['addstream',['AddStream',['../d4/d1d/classedash__packager_1_1media_1_1Muxer.html#a77c7a214383f64f822d479d226750bf5',1,'edash_packager::media::Muxer']]], - ['addvideoinfo',['AddVideoInfo',['../dc/d05/classedash__packager_1_1xml_1_1RepresentationXmlNode.html#a2b00f576154e002f067849129cff4c4a',1,'edash_packager::xml::RepresentationXmlNode']]], + ['addvideoinfo',['AddVideoInfo',['../dc/d05/classedash__packager_1_1xml_1_1RepresentationXmlNode.html#a1a3651243d59b29652453ad5d52e4912',1,'edash_packager::xml::RepresentationXmlNode']]], ['addvodonlyinfo',['AddVODOnlyInfo',['../dc/d05/classedash__packager_1_1xml_1_1RepresentationXmlNode.html#a2afa0f4b92900936e2eb97a218d119a2',1,'edash_packager::xml::RepresentationXmlNode']]], ['adtsheader',['AdtsHeader',['../db/d69/classedash__packager_1_1media_1_1mp2t_1_1AdtsHeader.html',1,'edash_packager::media::mp2t']]], ['advancechunk',['AdvanceChunk',['../d8/d71/classedash__packager_1_1media_1_1mp4_1_1ChunkInfoIterator.html#a9472a31149417750f39cd3aa78ab2562',1,'edash_packager::media::mp4::ChunkInfoIterator']]], @@ -35,8 +36,8 @@ var searchData= ['audio_5fdescription',['audio_description',['../db/d26/classedash__packager_1_1media_1_1mp4_1_1TrackRunIterator.html#a2c58182a77817e4ed4a2860ae3be73df',1,'edash_packager::media::mp4::TrackRunIterator']]], ['audio_5fobject_5ftype',['audio_object_type',['../dc/dc6/classedash__packager_1_1media_1_1mp4_1_1AACAudioSpecificConfig.html#a12bcda441f7745bd70cb9b4fdfb4b9b5',1,'edash_packager::media::mp4::AACAudioSpecificConfig']]], ['audiosampleentry',['AudioSampleEntry',['../df/d62/structedash__packager_1_1media_1_1mp4_1_1AudioSampleEntry.html',1,'edash_packager::media::mp4']]], - ['audiostreaminfo',['AudioStreamInfo',['../da/d27/classedash__packager_1_1media_1_1AudioStreamInfo.html',1,'edash_packager::media']]], ['audiostreaminfo',['AudioStreamInfo',['../da/d27/classedash__packager_1_1media_1_1AudioStreamInfo.html#a3a75339290a004cc4b2dd232e4561ed8',1,'edash_packager::media::AudioStreamInfo']]], + ['audiostreaminfo',['AudioStreamInfo',['../da/d27/classedash__packager_1_1media_1_1AudioStreamInfo.html',1,'edash_packager::media']]], ['audiotimestamphelper',['AudioTimestampHelper',['../da/de4/classedash__packager_1_1media_1_1AudioTimestampHelper.html',1,'edash_packager::media']]], ['auxinfoneedstobecached',['AuxInfoNeedsToBeCached',['../db/d26/classedash__packager_1_1media_1_1mp4_1_1TrackRunIterator.html#a3538a0f31238843afd2dfb4e94587f03',1,'edash_packager::media::mp4::TrackRunIterator']]], ['avcdecoderconfiguration',['AVCDecoderConfiguration',['../d6/d49/classedash__packager_1_1media_1_1AVCDecoderConfiguration.html',1,'edash_packager::media']]] diff --git a/docs/search/all_1.js b/docs/search/all_1.js index ec64d430e1..fcbac638f6 100644 --- a/docs/search/all_1.js +++ b/docs/search/all_1.js @@ -11,7 +11,7 @@ var searchData= ['boxbuffer',['BoxBuffer',['../dd/d4f/classedash__packager_1_1media_1_1mp4_1_1BoxBuffer.html',1,'edash_packager::media::mp4']]], ['boxbuffer',['BoxBuffer',['../dd/d4f/classedash__packager_1_1media_1_1mp4_1_1BoxBuffer.html#aa1144b8d6912a983d65ff97f44ffeb51',1,'edash_packager::media::mp4::BoxBuffer::BoxBuffer(BoxReader *reader)'],['../dd/d4f/classedash__packager_1_1media_1_1mp4_1_1BoxBuffer.html#a1ecfb419ea348ad684bf3c1556d1570c',1,'edash_packager::media::mp4::BoxBuffer::BoxBuffer(BufferWriter *writer)']]], ['boxreader',['BoxReader',['../db/d6c/classedash__packager_1_1media_1_1mp4_1_1BoxReader.html',1,'edash_packager::media::mp4']]], - ['boxtype',['BoxType',['../d7/d8a/structedash__packager_1_1media_1_1mp4_1_1Box.html#a504e7612c24f7d788748dff9940e46ea',1,'edash_packager::media::mp4::Box::BoxType()'],['../d1/dcd/structedash__packager_1_1media_1_1mp4_1_1FileType.html#a37c1287fee817803e6cb18eebfd99847',1,'edash_packager::media::mp4::FileType::BoxType()'],['../dd/da6/structedash__packager_1_1media_1_1mp4_1_1SegmentType.html#aebd87db93b8d63a08e0becb45e1d70cf',1,'edash_packager::media::mp4::SegmentType::BoxType()'],['../da/d2a/structedash__packager_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html#a652e720a34bfc0ea43de52642325d12e',1,'edash_packager::media::mp4::ProtectionSystemSpecificHeader::BoxType()'],['../de/dc4/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html#acfbcac458961036f8fa9c47bea95905c',1,'edash_packager::media::mp4::SampleAuxiliaryInformationOffset::BoxType()'],['../d2/d51/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html#a54b83543e5924c4f9d7e4e45934be26a',1,'edash_packager::media::mp4::SampleAuxiliaryInformationSize::BoxType()'],['../d5/d78/structedash__packager_1_1media_1_1mp4_1_1SampleEncryption.html#ab6d4d91b2bd0a2a021c10afac4672c09',1,'edash_packager::media::mp4::SampleEncryption::BoxType()'],['../da/d4b/structedash__packager_1_1media_1_1mp4_1_1OriginalFormat.html#a3c21bf81deb542ab69811673ec025f2e',1,'edash_packager::media::mp4::OriginalFormat::BoxType()'],['../d4/dcc/structedash__packager_1_1media_1_1mp4_1_1SchemeType.html#a9d477e94ca46a6ee6ebd6208a3343c6c',1,'edash_packager::media::mp4::SchemeType::BoxType()'],['../de/d44/structedash__packager_1_1media_1_1mp4_1_1TrackEncryption.html#aebad0e736feade55f9a81675737380fe',1,'edash_packager::media::mp4::TrackEncryption::BoxType()'],['../d2/d6f/structedash__packager_1_1media_1_1mp4_1_1SchemeInfo.html#a05f236b91e36bd7c774fec38378dae2c',1,'edash_packager::media::mp4::SchemeInfo::BoxType()'],['../dd/dc9/structedash__packager_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html#a62ea06c139c349ef4f1960c15f85da33',1,'edash_packager::media::mp4::ProtectionSchemeInfo::BoxType()'],['../dd/d14/structedash__packager_1_1media_1_1mp4_1_1MovieHeader.html#a4403980ce1e53080796c60d8d7f91ee1',1,'edash_packager::media::mp4::MovieHeader::BoxType()'],['../dd/d15/structedash__packager_1_1media_1_1mp4_1_1TrackHeader.html#a7347e1e4b0e9785b4cecaf6b24c7b70f',1,'edash_packager::media::mp4::TrackHeader::BoxType()'],['../d8/d4a/structedash__packager_1_1media_1_1mp4_1_1EditList.html#aeeaefd1b799f2da1d28dd037ecbbd6a8',1,'edash_packager::media::mp4::EditList::BoxType()'],['../d7/d4f/structedash__packager_1_1media_1_1mp4_1_1Edit.html#aa59c17335999289620bd51d05d3208ab',1,'edash_packager::media::mp4::Edit::BoxType()'],['../d3/dbd/structedash__packager_1_1media_1_1mp4_1_1HandlerReference.html#a27e27257f90332a2585114153e0d7594',1,'edash_packager::media::mp4::HandlerReference::BoxType()'],['../d9/d21/structedash__packager_1_1media_1_1mp4_1_1ID3v2.html#acc52776c15a2dcd6a61be12cb7604bb1',1,'edash_packager::media::mp4::ID3v2::BoxType()'],['../d2/d06/structedash__packager_1_1media_1_1mp4_1_1Metadata.html#aeb14c600d3581277e2709857ab86203a',1,'edash_packager::media::mp4::Metadata::BoxType()'],['../d1/d31/structedash__packager_1_1media_1_1mp4_1_1CodecConfigurationRecord.html#af79275c621765517a82bd0805c82247e',1,'edash_packager::media::mp4::CodecConfigurationRecord::BoxType()'],['../d4/d3d/structedash__packager_1_1media_1_1mp4_1_1PixelAspectRatio.html#a9b88be9293ff1ea9d943de9e9d737782',1,'edash_packager::media::mp4::PixelAspectRatio::BoxType()'],['../df/d6a/structedash__packager_1_1media_1_1mp4_1_1VideoSampleEntry.html#a9d870de1a6e6799c18976adeed3d2b3e',1,'edash_packager::media::mp4::VideoSampleEntry::BoxType()'],['../d9/dcc/structedash__packager_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html#a8a819a7d71dfbbaf5ec2770499689d2d',1,'edash_packager::media::mp4::ElementaryStreamDescriptor::BoxType()'],['../d0/db7/structedash__packager_1_1media_1_1mp4_1_1DTSSpecific.html#aa392cbec3186779bb28e57e9a5e55973',1,'edash_packager::media::mp4::DTSSpecific::BoxType()'],['../df/d62/structedash__packager_1_1media_1_1mp4_1_1AudioSampleEntry.html#a9204f77a7c4e0c6bed49ac995ba25488',1,'edash_packager::media::mp4::AudioSampleEntry::BoxType()'],['../d7/dcc/structedash__packager_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html#a0189e52ddef8d5674a0d9e46a96eff87',1,'edash_packager::media::mp4::WebVTTConfigurationBox::BoxType()'],['../df/da9/structedash__packager_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html#aa2605337625ef9e34e6563d95688338c',1,'edash_packager::media::mp4::WebVTTSourceLabelBox::BoxType()'],['../dc/d0e/structedash__packager_1_1media_1_1mp4_1_1WVTTSampleEntry.html#a0cde4e110795765483a2b8d7feab1010',1,'edash_packager::media::mp4::WVTTSampleEntry::BoxType()'],['../d3/d74/structedash__packager_1_1media_1_1mp4_1_1SampleDescription.html#ada90ed0cac4d2d899424669864f7e6d8',1,'edash_packager::media::mp4::SampleDescription::BoxType()'],['../dc/db7/structedash__packager_1_1media_1_1mp4_1_1DecodingTimeToSample.html#a52fc624b3a6ce6ccd1077420d46d6ef2',1,'edash_packager::media::mp4::DecodingTimeToSample::BoxType()'],['../da/d54/structedash__packager_1_1media_1_1mp4_1_1CompositionTimeToSample.html#a11a38fe87d393d25f89b0b616159479f',1,'edash_packager::media::mp4::CompositionTimeToSample::BoxType()'],['../df/d76/structedash__packager_1_1media_1_1mp4_1_1SampleToChunk.html#ac28ec4cd9cac79d7b552102cb8c3304a',1,'edash_packager::media::mp4::SampleToChunk::BoxType()'],['../d7/da5/structedash__packager_1_1media_1_1mp4_1_1SampleSize.html#ad408709db5e9d0843948b1de6921d11c',1,'edash_packager::media::mp4::SampleSize::BoxType()'],['../db/d89/structedash__packager_1_1media_1_1mp4_1_1CompactSampleSize.html#afd1bbe1300c24d2b86e69a2b20942174',1,'edash_packager::media::mp4::CompactSampleSize::BoxType()'],['../da/d81/structedash__packager_1_1media_1_1mp4_1_1ChunkLargeOffset.html#a83ff8d4e12f4a84c9e5652d74cb582d4',1,'edash_packager::media::mp4::ChunkLargeOffset::BoxType()'],['../d6/d79/structedash__packager_1_1media_1_1mp4_1_1ChunkOffset.html#a7aa021dc4bc57fd5abb83582513ec7d6',1,'edash_packager::media::mp4::ChunkOffset::BoxType()'],['../d9/d18/structedash__packager_1_1media_1_1mp4_1_1SyncSample.html#a83405091000e8777b4be3088ed638c65',1,'edash_packager::media::mp4::SyncSample::BoxType()'],['../d3/d77/structedash__packager_1_1media_1_1mp4_1_1SampleTable.html#a8d8d5a5f691ea55bd0248a6d12302e90',1,'edash_packager::media::mp4::SampleTable::BoxType()'],['../d7/dec/structedash__packager_1_1media_1_1mp4_1_1MediaHeader.html#af7668a8993e5ef0b515cf1deca69db90',1,'edash_packager::media::mp4::MediaHeader::BoxType()'],['../db/df7/structedash__packager_1_1media_1_1mp4_1_1VideoMediaHeader.html#a5a3f17a16ce780e1d3c9e7ff2c2d8b92',1,'edash_packager::media::mp4::VideoMediaHeader::BoxType()'],['../da/db0/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader.html#a294713d0b23c8fd694752a9fe5b302d0',1,'edash_packager::media::mp4::SoundMediaHeader::BoxType()'],['../d1/d86/structedash__packager_1_1media_1_1mp4_1_1SubtitleMediaHeader.html#a46fb740ceb2e6b51336e602fb707d9dc',1,'edash_packager::media::mp4::SubtitleMediaHeader::BoxType()'],['../d6/d6c/structedash__packager_1_1media_1_1mp4_1_1DataEntryUrl.html#a52a2b2d6afb05554e144b476e2a7c2e1',1,'edash_packager::media::mp4::DataEntryUrl::BoxType()'],['../d7/d0d/structedash__packager_1_1media_1_1mp4_1_1DataReference.html#a4cfadf5c0c452c121be0ea980555be60',1,'edash_packager::media::mp4::DataReference::BoxType()'],['../d6/d59/structedash__packager_1_1media_1_1mp4_1_1DataInformation.html#aed66cd68a3126748afe6b42d04cab885',1,'edash_packager::media::mp4::DataInformation::BoxType()'],['../dd/dbd/structedash__packager_1_1media_1_1mp4_1_1MediaInformation.html#a2dab0117ee2e03c052f5df25134db42e',1,'edash_packager::media::mp4::MediaInformation::BoxType()'],['../de/de7/structedash__packager_1_1media_1_1mp4_1_1Media.html#a339ebe17f0f7d4ffbbf82795419155b5',1,'edash_packager::media::mp4::Media::BoxType()'],['../d3/de1/structedash__packager_1_1media_1_1mp4_1_1Track.html#a94e5e94f5bc4e4f6498bb384ed548cae',1,'edash_packager::media::mp4::Track::BoxType()'],['../da/d17/structedash__packager_1_1media_1_1mp4_1_1MovieExtendsHeader.html#a3d7d2e08f6baedf1af02c9e4504d75d9',1,'edash_packager::media::mp4::MovieExtendsHeader::BoxType()'],['../d3/d2c/structedash__packager_1_1media_1_1mp4_1_1TrackExtends.html#a133f1027410f7767253ed0bfd8da54cd',1,'edash_packager::media::mp4::TrackExtends::BoxType()'],['../d6/d8b/structedash__packager_1_1media_1_1mp4_1_1MovieExtends.html#a13e40bc4f9d2a6988b3506a5305e6fca',1,'edash_packager::media::mp4::MovieExtends::BoxType()'],['../d6/dec/structedash__packager_1_1media_1_1mp4_1_1Movie.html#aa5e25db4def848291ed7b79217e7e2fe',1,'edash_packager::media::mp4::Movie::BoxType()'],['../d0/d92/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html#a33cfba86f8b918fbedaceb465ec40eb1',1,'edash_packager::media::mp4::TrackFragmentDecodeTime::BoxType()'],['../df/d86/structedash__packager_1_1media_1_1mp4_1_1MovieFragmentHeader.html#a1cd6327f596a7cb253f1426812490dce',1,'edash_packager::media::mp4::MovieFragmentHeader::BoxType()'],['../d9/d47/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentHeader.html#a9a5be3ea4894965d2bb643d88acdb4c9',1,'edash_packager::media::mp4::TrackFragmentHeader::BoxType()'],['../df/d21/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentRun.html#a1390e0e93a5181be7d31cb701592ec18',1,'edash_packager::media::mp4::TrackFragmentRun::BoxType()'],['../d1/d65/structedash__packager_1_1media_1_1mp4_1_1SampleToGroup.html#abf5ab6476c2530cf820cc4262c2eef41',1,'edash_packager::media::mp4::SampleToGroup::BoxType()'],['../d2/d26/structedash__packager_1_1media_1_1mp4_1_1SampleGroupDescription.html#a20836adec61bcbc891d08ffbc291ab4e',1,'edash_packager::media::mp4::SampleGroupDescription::BoxType()'],['../d4/dd9/structedash__packager_1_1media_1_1mp4_1_1TrackFragment.html#a1b72b2b61bdbca4b23f0ef727cb04901',1,'edash_packager::media::mp4::TrackFragment::BoxType()'],['../dd/da2/structedash__packager_1_1media_1_1mp4_1_1MovieFragment.html#a5455c20a8391c344d91929eb088f0699',1,'edash_packager::media::mp4::MovieFragment::BoxType()'],['../d1/d81/structedash__packager_1_1media_1_1mp4_1_1SegmentIndex.html#a2a0444e32d7ccc525b10b6f9fc81b0b5',1,'edash_packager::media::mp4::SegmentIndex::BoxType()'],['../d4/d92/structedash__packager_1_1media_1_1mp4_1_1MediaData.html#a2cd09fe16fb9b50fc70476217977a060',1,'edash_packager::media::mp4::MediaData::BoxType()'],['../d2/df8/structedash__packager_1_1media_1_1mp4_1_1CueSourceIDBox.html#a79ce16bc0cd49723eaa8e4734c6426e5',1,'edash_packager::media::mp4::CueSourceIDBox::BoxType()'],['../dd/d12/structedash__packager_1_1media_1_1mp4_1_1CueTimeBox.html#a099bff9996e063551114d44e9a0429bc',1,'edash_packager::media::mp4::CueTimeBox::BoxType()'],['../de/d07/structedash__packager_1_1media_1_1mp4_1_1CueIDBox.html#ad160b5d1ef859073d2536f048d71af05',1,'edash_packager::media::mp4::CueIDBox::BoxType()'],['../d1/df2/structedash__packager_1_1media_1_1mp4_1_1CueSettingsBox.html#af750ff88f1d2e7926f01969db44b76ed',1,'edash_packager::media::mp4::CueSettingsBox::BoxType()'],['../d7/d49/structedash__packager_1_1media_1_1mp4_1_1CuePayloadBox.html#a227df861e36f5876dca5cd91b5b230ad',1,'edash_packager::media::mp4::CuePayloadBox::BoxType()'],['../d3/d1c/structedash__packager_1_1media_1_1mp4_1_1VTTEmptyCueBox.html#a12c38669db1fc4e70bb8dca039a52f8b',1,'edash_packager::media::mp4::VTTEmptyCueBox::BoxType()'],['../db/d6b/structedash__packager_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html#ad0715718756fb534e945ed725670bf79',1,'edash_packager::media::mp4::VTTAdditionalTextBox::BoxType()'],['../d6/d74/structedash__packager_1_1media_1_1mp4_1_1VTTCueBox.html#abd7dab86dd675aadf17eb857d0d0ab80',1,'edash_packager::media::mp4::VTTCueBox::BoxType()']]], + ['boxtype',['BoxType',['../d7/d8a/structedash__packager_1_1media_1_1mp4_1_1Box.html#a504e7612c24f7d788748dff9940e46ea',1,'edash_packager::media::mp4::Box::BoxType()'],['../d1/dcd/structedash__packager_1_1media_1_1mp4_1_1FileType.html#a37c1287fee817803e6cb18eebfd99847',1,'edash_packager::media::mp4::FileType::BoxType()'],['../dd/da6/structedash__packager_1_1media_1_1mp4_1_1SegmentType.html#aebd87db93b8d63a08e0becb45e1d70cf',1,'edash_packager::media::mp4::SegmentType::BoxType()'],['../da/d2a/structedash__packager_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html#a652e720a34bfc0ea43de52642325d12e',1,'edash_packager::media::mp4::ProtectionSystemSpecificHeader::BoxType()'],['../de/dc4/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html#acfbcac458961036f8fa9c47bea95905c',1,'edash_packager::media::mp4::SampleAuxiliaryInformationOffset::BoxType()'],['../d2/d51/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html#a54b83543e5924c4f9d7e4e45934be26a',1,'edash_packager::media::mp4::SampleAuxiliaryInformationSize::BoxType()'],['../d5/d78/structedash__packager_1_1media_1_1mp4_1_1SampleEncryption.html#ab6d4d91b2bd0a2a021c10afac4672c09',1,'edash_packager::media::mp4::SampleEncryption::BoxType()'],['../da/d4b/structedash__packager_1_1media_1_1mp4_1_1OriginalFormat.html#a3c21bf81deb542ab69811673ec025f2e',1,'edash_packager::media::mp4::OriginalFormat::BoxType()'],['../d4/dcc/structedash__packager_1_1media_1_1mp4_1_1SchemeType.html#a9d477e94ca46a6ee6ebd6208a3343c6c',1,'edash_packager::media::mp4::SchemeType::BoxType()'],['../de/d44/structedash__packager_1_1media_1_1mp4_1_1TrackEncryption.html#aebad0e736feade55f9a81675737380fe',1,'edash_packager::media::mp4::TrackEncryption::BoxType()'],['../d2/d6f/structedash__packager_1_1media_1_1mp4_1_1SchemeInfo.html#a05f236b91e36bd7c774fec38378dae2c',1,'edash_packager::media::mp4::SchemeInfo::BoxType()'],['../dd/dc9/structedash__packager_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html#a62ea06c139c349ef4f1960c15f85da33',1,'edash_packager::media::mp4::ProtectionSchemeInfo::BoxType()'],['../dd/d14/structedash__packager_1_1media_1_1mp4_1_1MovieHeader.html#a4403980ce1e53080796c60d8d7f91ee1',1,'edash_packager::media::mp4::MovieHeader::BoxType()'],['../dd/d15/structedash__packager_1_1media_1_1mp4_1_1TrackHeader.html#a7347e1e4b0e9785b4cecaf6b24c7b70f',1,'edash_packager::media::mp4::TrackHeader::BoxType()'],['../d8/d4a/structedash__packager_1_1media_1_1mp4_1_1EditList.html#aeeaefd1b799f2da1d28dd037ecbbd6a8',1,'edash_packager::media::mp4::EditList::BoxType()'],['../d7/d4f/structedash__packager_1_1media_1_1mp4_1_1Edit.html#aa59c17335999289620bd51d05d3208ab',1,'edash_packager::media::mp4::Edit::BoxType()'],['../d3/dbd/structedash__packager_1_1media_1_1mp4_1_1HandlerReference.html#a27e27257f90332a2585114153e0d7594',1,'edash_packager::media::mp4::HandlerReference::BoxType()'],['../d9/d21/structedash__packager_1_1media_1_1mp4_1_1ID3v2.html#acc52776c15a2dcd6a61be12cb7604bb1',1,'edash_packager::media::mp4::ID3v2::BoxType()'],['../d2/d06/structedash__packager_1_1media_1_1mp4_1_1Metadata.html#aeb14c600d3581277e2709857ab86203a',1,'edash_packager::media::mp4::Metadata::BoxType()'],['../d1/d31/structedash__packager_1_1media_1_1mp4_1_1CodecConfigurationRecord.html#af79275c621765517a82bd0805c82247e',1,'edash_packager::media::mp4::CodecConfigurationRecord::BoxType()'],['../d4/d3d/structedash__packager_1_1media_1_1mp4_1_1PixelAspectRatio.html#a9b88be9293ff1ea9d943de9e9d737782',1,'edash_packager::media::mp4::PixelAspectRatio::BoxType()'],['../df/d6a/structedash__packager_1_1media_1_1mp4_1_1VideoSampleEntry.html#a9d870de1a6e6799c18976adeed3d2b3e',1,'edash_packager::media::mp4::VideoSampleEntry::BoxType()'],['../d9/dcc/structedash__packager_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html#a8a819a7d71dfbbaf5ec2770499689d2d',1,'edash_packager::media::mp4::ElementaryStreamDescriptor::BoxType()'],['../d0/db7/structedash__packager_1_1media_1_1mp4_1_1DTSSpecific.html#aa392cbec3186779bb28e57e9a5e55973',1,'edash_packager::media::mp4::DTSSpecific::BoxType()'],['../d0/d65/structedash__packager_1_1media_1_1mp4_1_1AC3Specific.html#adcfdf18f91a08aa3f9fa73d617e02a22',1,'edash_packager::media::mp4::AC3Specific::BoxType()'],['../df/d62/structedash__packager_1_1media_1_1mp4_1_1AudioSampleEntry.html#a9204f77a7c4e0c6bed49ac995ba25488',1,'edash_packager::media::mp4::AudioSampleEntry::BoxType()'],['../d7/dcc/structedash__packager_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html#a0189e52ddef8d5674a0d9e46a96eff87',1,'edash_packager::media::mp4::WebVTTConfigurationBox::BoxType()'],['../df/da9/structedash__packager_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html#aa2605337625ef9e34e6563d95688338c',1,'edash_packager::media::mp4::WebVTTSourceLabelBox::BoxType()'],['../dc/d0e/structedash__packager_1_1media_1_1mp4_1_1WVTTSampleEntry.html#a0cde4e110795765483a2b8d7feab1010',1,'edash_packager::media::mp4::WVTTSampleEntry::BoxType()'],['../d3/d74/structedash__packager_1_1media_1_1mp4_1_1SampleDescription.html#ada90ed0cac4d2d899424669864f7e6d8',1,'edash_packager::media::mp4::SampleDescription::BoxType()'],['../dc/db7/structedash__packager_1_1media_1_1mp4_1_1DecodingTimeToSample.html#a52fc624b3a6ce6ccd1077420d46d6ef2',1,'edash_packager::media::mp4::DecodingTimeToSample::BoxType()'],['../da/d54/structedash__packager_1_1media_1_1mp4_1_1CompositionTimeToSample.html#a11a38fe87d393d25f89b0b616159479f',1,'edash_packager::media::mp4::CompositionTimeToSample::BoxType()'],['../df/d76/structedash__packager_1_1media_1_1mp4_1_1SampleToChunk.html#ac28ec4cd9cac79d7b552102cb8c3304a',1,'edash_packager::media::mp4::SampleToChunk::BoxType()'],['../d7/da5/structedash__packager_1_1media_1_1mp4_1_1SampleSize.html#ad408709db5e9d0843948b1de6921d11c',1,'edash_packager::media::mp4::SampleSize::BoxType()'],['../db/d89/structedash__packager_1_1media_1_1mp4_1_1CompactSampleSize.html#afd1bbe1300c24d2b86e69a2b20942174',1,'edash_packager::media::mp4::CompactSampleSize::BoxType()'],['../da/d81/structedash__packager_1_1media_1_1mp4_1_1ChunkLargeOffset.html#a83ff8d4e12f4a84c9e5652d74cb582d4',1,'edash_packager::media::mp4::ChunkLargeOffset::BoxType()'],['../d6/d79/structedash__packager_1_1media_1_1mp4_1_1ChunkOffset.html#a7aa021dc4bc57fd5abb83582513ec7d6',1,'edash_packager::media::mp4::ChunkOffset::BoxType()'],['../d9/d18/structedash__packager_1_1media_1_1mp4_1_1SyncSample.html#a83405091000e8777b4be3088ed638c65',1,'edash_packager::media::mp4::SyncSample::BoxType()'],['../d3/d77/structedash__packager_1_1media_1_1mp4_1_1SampleTable.html#a8d8d5a5f691ea55bd0248a6d12302e90',1,'edash_packager::media::mp4::SampleTable::BoxType()'],['../d7/dec/structedash__packager_1_1media_1_1mp4_1_1MediaHeader.html#af7668a8993e5ef0b515cf1deca69db90',1,'edash_packager::media::mp4::MediaHeader::BoxType()'],['../db/df7/structedash__packager_1_1media_1_1mp4_1_1VideoMediaHeader.html#a5a3f17a16ce780e1d3c9e7ff2c2d8b92',1,'edash_packager::media::mp4::VideoMediaHeader::BoxType()'],['../da/db0/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader.html#a294713d0b23c8fd694752a9fe5b302d0',1,'edash_packager::media::mp4::SoundMediaHeader::BoxType()'],['../d1/d86/structedash__packager_1_1media_1_1mp4_1_1SubtitleMediaHeader.html#a46fb740ceb2e6b51336e602fb707d9dc',1,'edash_packager::media::mp4::SubtitleMediaHeader::BoxType()'],['../d6/d6c/structedash__packager_1_1media_1_1mp4_1_1DataEntryUrl.html#a52a2b2d6afb05554e144b476e2a7c2e1',1,'edash_packager::media::mp4::DataEntryUrl::BoxType()'],['../d7/d0d/structedash__packager_1_1media_1_1mp4_1_1DataReference.html#a4cfadf5c0c452c121be0ea980555be60',1,'edash_packager::media::mp4::DataReference::BoxType()'],['../d6/d59/structedash__packager_1_1media_1_1mp4_1_1DataInformation.html#aed66cd68a3126748afe6b42d04cab885',1,'edash_packager::media::mp4::DataInformation::BoxType()'],['../dd/dbd/structedash__packager_1_1media_1_1mp4_1_1MediaInformation.html#a2dab0117ee2e03c052f5df25134db42e',1,'edash_packager::media::mp4::MediaInformation::BoxType()'],['../de/de7/structedash__packager_1_1media_1_1mp4_1_1Media.html#a339ebe17f0f7d4ffbbf82795419155b5',1,'edash_packager::media::mp4::Media::BoxType()'],['../d3/de1/structedash__packager_1_1media_1_1mp4_1_1Track.html#a94e5e94f5bc4e4f6498bb384ed548cae',1,'edash_packager::media::mp4::Track::BoxType()'],['../da/d17/structedash__packager_1_1media_1_1mp4_1_1MovieExtendsHeader.html#a3d7d2e08f6baedf1af02c9e4504d75d9',1,'edash_packager::media::mp4::MovieExtendsHeader::BoxType()'],['../d3/d2c/structedash__packager_1_1media_1_1mp4_1_1TrackExtends.html#a133f1027410f7767253ed0bfd8da54cd',1,'edash_packager::media::mp4::TrackExtends::BoxType()'],['../d6/d8b/structedash__packager_1_1media_1_1mp4_1_1MovieExtends.html#a13e40bc4f9d2a6988b3506a5305e6fca',1,'edash_packager::media::mp4::MovieExtends::BoxType()'],['../d6/dec/structedash__packager_1_1media_1_1mp4_1_1Movie.html#aa5e25db4def848291ed7b79217e7e2fe',1,'edash_packager::media::mp4::Movie::BoxType()'],['../d0/d92/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html#a33cfba86f8b918fbedaceb465ec40eb1',1,'edash_packager::media::mp4::TrackFragmentDecodeTime::BoxType()'],['../df/d86/structedash__packager_1_1media_1_1mp4_1_1MovieFragmentHeader.html#a1cd6327f596a7cb253f1426812490dce',1,'edash_packager::media::mp4::MovieFragmentHeader::BoxType()'],['../d9/d47/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentHeader.html#a9a5be3ea4894965d2bb643d88acdb4c9',1,'edash_packager::media::mp4::TrackFragmentHeader::BoxType()'],['../df/d21/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentRun.html#a1390e0e93a5181be7d31cb701592ec18',1,'edash_packager::media::mp4::TrackFragmentRun::BoxType()'],['../d1/d65/structedash__packager_1_1media_1_1mp4_1_1SampleToGroup.html#abf5ab6476c2530cf820cc4262c2eef41',1,'edash_packager::media::mp4::SampleToGroup::BoxType()'],['../d2/d26/structedash__packager_1_1media_1_1mp4_1_1SampleGroupDescription.html#a20836adec61bcbc891d08ffbc291ab4e',1,'edash_packager::media::mp4::SampleGroupDescription::BoxType()'],['../d4/dd9/structedash__packager_1_1media_1_1mp4_1_1TrackFragment.html#a1b72b2b61bdbca4b23f0ef727cb04901',1,'edash_packager::media::mp4::TrackFragment::BoxType()'],['../dd/da2/structedash__packager_1_1media_1_1mp4_1_1MovieFragment.html#a5455c20a8391c344d91929eb088f0699',1,'edash_packager::media::mp4::MovieFragment::BoxType()'],['../d1/d81/structedash__packager_1_1media_1_1mp4_1_1SegmentIndex.html#a2a0444e32d7ccc525b10b6f9fc81b0b5',1,'edash_packager::media::mp4::SegmentIndex::BoxType()'],['../d4/d92/structedash__packager_1_1media_1_1mp4_1_1MediaData.html#a2cd09fe16fb9b50fc70476217977a060',1,'edash_packager::media::mp4::MediaData::BoxType()'],['../d2/df8/structedash__packager_1_1media_1_1mp4_1_1CueSourceIDBox.html#a79ce16bc0cd49723eaa8e4734c6426e5',1,'edash_packager::media::mp4::CueSourceIDBox::BoxType()'],['../dd/d12/structedash__packager_1_1media_1_1mp4_1_1CueTimeBox.html#a099bff9996e063551114d44e9a0429bc',1,'edash_packager::media::mp4::CueTimeBox::BoxType()'],['../de/d07/structedash__packager_1_1media_1_1mp4_1_1CueIDBox.html#ad160b5d1ef859073d2536f048d71af05',1,'edash_packager::media::mp4::CueIDBox::BoxType()'],['../d1/df2/structedash__packager_1_1media_1_1mp4_1_1CueSettingsBox.html#af750ff88f1d2e7926f01969db44b76ed',1,'edash_packager::media::mp4::CueSettingsBox::BoxType()'],['../d7/d49/structedash__packager_1_1media_1_1mp4_1_1CuePayloadBox.html#a227df861e36f5876dca5cd91b5b230ad',1,'edash_packager::media::mp4::CuePayloadBox::BoxType()'],['../d3/d1c/structedash__packager_1_1media_1_1mp4_1_1VTTEmptyCueBox.html#a12c38669db1fc4e70bb8dca039a52f8b',1,'edash_packager::media::mp4::VTTEmptyCueBox::BoxType()'],['../db/d6b/structedash__packager_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html#ad0715718756fb534e945ed725670bf79',1,'edash_packager::media::mp4::VTTAdditionalTextBox::BoxType()'],['../d6/d74/structedash__packager_1_1media_1_1mp4_1_1VTTCueBox.html#abd7dab86dd675aadf17eb857d0d0ab80',1,'edash_packager::media::mp4::VTTCueBox::BoxType()']]], ['buffer',['Buffer',['../df/dde/classedash__packager_1_1media_1_1BufferWriter.html#a8849c495e9e5cb0c33d7633fecbe0643',1,'edash_packager::media::BufferWriter']]], ['bufferreader',['BufferReader',['../d9/d46/classedash__packager_1_1media_1_1BufferReader.html#a7354b7da262fd2cd4680346d4ae871d8',1,'edash_packager::media::BufferReader']]], ['bufferreader',['BufferReader',['../d9/d46/classedash__packager_1_1media_1_1BufferReader.html',1,'edash_packager::media']]], diff --git a/docs/search/all_10.js b/docs/search/all_10.js index 525c75449d..1282d96019 100644 --- a/docs/search/all_10.js +++ b/docs/search/all_10.js @@ -63,8 +63,8 @@ var searchData= ['soundmediaheader',['SoundMediaHeader',['../da/db0/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader.html',1,'edash_packager::media::mp4']]], ['start',['Start',['../d2/dfd/classedash__packager_1_1media_1_1MediaStream.html#aaf43ae1836aadcc912298c30bc71838a',1,'edash_packager::media::MediaStream']]], ['starttoplevelbox',['StartTopLevelBox',['../db/d6c/classedash__packager_1_1media_1_1mp4_1_1BoxReader.html#a61fc23759071d1445b81cbcc9564c6a4',1,'edash_packager::media::mp4::BoxReader']]], - ['status',['Status',['../d2/d90/classedash__packager_1_1media_1_1Status.html#ab3b32018b2666a73432b860ed27ec4e2',1,'edash_packager::media::Status::Status()'],['../d2/d90/classedash__packager_1_1media_1_1Status.html#a9688991aab3f7b1db8acc5341b81d160',1,'edash_packager::media::Status::Status(error::Code error_code, const std::string &error_message)']]], ['status',['Status',['../d2/d90/classedash__packager_1_1media_1_1Status.html',1,'edash_packager::media']]], + ['status',['Status',['../d2/d90/classedash__packager_1_1media_1_1Status.html#ab3b32018b2666a73432b860ed27ec4e2',1,'edash_packager::media::Status::Status()'],['../d2/d90/classedash__packager_1_1media_1_1Status.html#a9688991aab3f7b1db8acc5341b81d160',1,'edash_packager::media::Status::Status(error::Code error_code, const std::string &error_message)']]], ['stop',['Stop',['../d5/d02/classedash__packager_1_1media_1_1ProducerConsumerQueue.html#a04f78e0c31398c66f19a24e6a563436b',1,'edash_packager::media::ProducerConsumerQueue']]], ['stopped',['Stopped',['../d5/d02/classedash__packager_1_1media_1_1ProducerConsumerQueue.html#ad36a861f53f0b58d398a14ce2d93d793',1,'edash_packager::media::ProducerConsumerQueue']]], ['streamdescriptor',['StreamDescriptor',['../de/d1f/structedash__packager_1_1media_1_1StreamDescriptor.html',1,'edash_packager::media']]], @@ -73,6 +73,7 @@ var searchData= ['streams',['streams',['../d5/dce/classedash__packager_1_1media_1_1Demuxer.html#ae8182d61264096c811f457f50009fe3d',1,'edash_packager::media::Demuxer']]], ['subsampleentry',['SubsampleEntry',['../d4/de4/structedash__packager_1_1media_1_1SubsampleEntry.html',1,'edash_packager::media']]], ['subtitlemediaheader',['SubtitleMediaHeader',['../d1/d86/structedash__packager_1_1media_1_1mp4_1_1SubtitleMediaHeader.html',1,'edash_packager::media::mp4']]], + ['suppressonce',['SuppressOnce',['../d7/d15/classedash__packager_1_1Representation.html#a9d0e434e410332342d346a7665ffbaac',1,'edash_packager::Representation']]], ['syncsample',['SyncSample',['../d9/d18/structedash__packager_1_1media_1_1mp4_1_1SyncSample.html',1,'edash_packager::media::mp4']]], ['syncsampleiterator',['SyncSampleIterator',['../db/d01/classedash__packager_1_1media_1_1mp4_1_1SyncSampleIterator.html',1,'edash_packager::media::mp4']]], ['syncsampleiterator',['SyncSampleIterator',['../db/d01/classedash__packager_1_1media_1_1mp4_1_1SyncSampleIterator.html#aa96fc4d3705ea3e25b97266675aa9e01',1,'edash_packager::media::mp4::SyncSampleIterator']]], diff --git a/docs/search/all_2.js b/docs/search/all_2.js index 6f07e5f363..d3ec5bdad3 100644 --- a/docs/search/all_2.js +++ b/docs/search/all_2.js @@ -42,7 +42,7 @@ var searchData= ['createeosbuffer',['CreateEOSBuffer',['../d8/d6c/classedash__packager_1_1media_1_1MediaSample.html#ae449ca4aeea6cacb8c08a56d9652a64e',1,'edash_packager::media::MediaSample']]], ['createfromhexstrings',['CreateFromHexStrings',['../d9/d8b/classedash__packager_1_1media_1_1KeySource.html#ab05172d89513c0d3627502c9cff4535f',1,'edash_packager::media::KeySource']]], ['createmuxeroptions',['CreateMuxerOptions',['../d2/d28/classedash__packager_1_1media_1_1SegmentTestBase.html#a89b635fe86f80e54d4a4dd8cd6e4a1a0',1,'edash_packager::media::SegmentTestBase']]], - ['createsample',['CreateSample',['../d2/d28/classedash__packager_1_1media_1_1SegmentTestBase.html#ae4ec9ded9bc0974f36459aa819cbec75',1,'edash_packager::media::SegmentTestBase']]], + ['createsample',['CreateSample',['../d2/d28/classedash__packager_1_1media_1_1SegmentTestBase.html#a8d5a6020af6bc81cee269e03998c1fa4',1,'edash_packager::media::SegmentTestBase']]], ['createsigner',['CreateSigner',['../d8/dcc/classedash__packager_1_1media_1_1AesRequestSigner.html#a1e43c2e7e3ab4f5e07d442ed59fc1278',1,'edash_packager::media::AesRequestSigner::CreateSigner()'],['../dd/da8/classedash__packager_1_1media_1_1RsaRequestSigner.html#a51517907c457f9f991e1a72ce4355183',1,'edash_packager::media::RsaRequestSigner::CreateSigner()']]], ['createvideostreaminfo',['CreateVideoStreamInfo',['../d2/d28/classedash__packager_1_1media_1_1SegmentTestBase.html#a282e32ddca952a9f10ccf150a6a211fb',1,'edash_packager::media::SegmentTestBase']]], ['cue',['Cue',['../df/dda/structedash__packager_1_1media_1_1Cue.html',1,'edash_packager::media']]], diff --git a/docs/search/all_b.js b/docs/search/all_b.js index c21e29a262..e34fbcfb4b 100644 --- a/docs/search/all_b.js +++ b/docs/search/all_b.js @@ -35,8 +35,8 @@ var searchData= ['mpdnotifymuxerlistener',['MpdNotifyMuxerListener',['../d3/d0e/classedash__packager_1_1media_1_1MpdNotifyMuxerListener.html',1,'edash_packager::media']]], ['mpdoptions',['MpdOptions',['../d1/d5d/structedash__packager_1_1MpdOptions.html',1,'edash_packager']]], ['mpdwriter',['MpdWriter',['../dc/d81/classedash__packager_1_1MpdWriter.html',1,'edash_packager']]], - ['multisegmentsegmenter',['MultiSegmentSegmenter',['../dc/d7a/classedash__packager_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html',1,'edash_packager::media::mp4']]], ['multisegmentsegmenter',['MultiSegmentSegmenter',['../df/d4e/classedash__packager_1_1media_1_1webm_1_1MultiSegmentSegmenter.html',1,'edash_packager::media::webm']]], + ['multisegmentsegmenter',['MultiSegmentSegmenter',['../dc/d7a/classedash__packager_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html',1,'edash_packager::media::mp4']]], ['muxer',['Muxer',['../d4/d1d/classedash__packager_1_1media_1_1Muxer.html',1,'edash_packager::media']]], ['muxerlistener',['MuxerListener',['../df/de7/classedash__packager_1_1media_1_1MuxerListener.html',1,'edash_packager::media']]], ['muxeroptions',['MuxerOptions',['../de/d57/structedash__packager_1_1media_1_1MuxerOptions.html',1,'edash_packager::media']]] diff --git a/docs/search/classes_0.js b/docs/search/classes_0.js index 9aea99dbc3..b602ca6af0 100644 --- a/docs/search/classes_0.js +++ b/docs/search/classes_0.js @@ -1,6 +1,7 @@ var searchData= [ ['aacaudiospecificconfig',['AACAudioSpecificConfig',['../dc/dc6/classedash__packager_1_1media_1_1mp4_1_1AACAudioSpecificConfig.html',1,'edash_packager::media::mp4']]], + ['ac3specific',['AC3Specific',['../d0/d65/structedash__packager_1_1media_1_1mp4_1_1AC3Specific.html',1,'edash_packager::media::mp4']]], ['adaptationset',['AdaptationSet',['../db/de4/classedash__packager_1_1AdaptationSet.html',1,'edash_packager']]], ['adaptationsetxmlnode',['AdaptationSetXmlNode',['../d6/d37/classedash__packager_1_1xml_1_1AdaptationSetXmlNode.html',1,'edash_packager::xml']]], ['adtsheader',['AdtsHeader',['../db/d69/classedash__packager_1_1media_1_1mp2t_1_1AdtsHeader.html',1,'edash_packager::media::mp2t']]], diff --git a/docs/search/classes_a.js b/docs/search/classes_a.js index 589cdc1742..9e4d5580e1 100644 --- a/docs/search/classes_a.js +++ b/docs/search/classes_a.js @@ -29,8 +29,8 @@ var searchData= ['mpdnotifymuxerlistener',['MpdNotifyMuxerListener',['../d3/d0e/classedash__packager_1_1media_1_1MpdNotifyMuxerListener.html',1,'edash_packager::media']]], ['mpdoptions',['MpdOptions',['../d1/d5d/structedash__packager_1_1MpdOptions.html',1,'edash_packager']]], ['mpdwriter',['MpdWriter',['../dc/d81/classedash__packager_1_1MpdWriter.html',1,'edash_packager']]], - ['multisegmentsegmenter',['MultiSegmentSegmenter',['../df/d4e/classedash__packager_1_1media_1_1webm_1_1MultiSegmentSegmenter.html',1,'edash_packager::media::webm']]], ['multisegmentsegmenter',['MultiSegmentSegmenter',['../dc/d7a/classedash__packager_1_1media_1_1mp4_1_1MultiSegmentSegmenter.html',1,'edash_packager::media::mp4']]], + ['multisegmentsegmenter',['MultiSegmentSegmenter',['../df/d4e/classedash__packager_1_1media_1_1webm_1_1MultiSegmentSegmenter.html',1,'edash_packager::media::webm']]], ['muxer',['Muxer',['../d4/d1d/classedash__packager_1_1media_1_1Muxer.html',1,'edash_packager::media']]], ['muxerlistener',['MuxerListener',['../df/de7/classedash__packager_1_1media_1_1MuxerListener.html',1,'edash_packager::media']]], ['muxeroptions',['MuxerOptions',['../de/d57/structedash__packager_1_1media_1_1MuxerOptions.html',1,'edash_packager::media']]] diff --git a/docs/search/classes_e.js b/docs/search/classes_e.js index ae9a73af35..8b32369782 100644 --- a/docs/search/classes_e.js +++ b/docs/search/classes_e.js @@ -22,8 +22,8 @@ var searchData= ['segmenttestbase',['SegmentTestBase',['../d2/d28/classedash__packager_1_1media_1_1SegmentTestBase.html',1,'edash_packager::media']]], ['segmenttype',['SegmentType',['../dd/da6/structedash__packager_1_1media_1_1mp4_1_1SegmentType.html',1,'edash_packager::media::mp4']]], ['simplempdnotifier',['SimpleMpdNotifier',['../db/d56/classedash__packager_1_1SimpleMpdNotifier.html',1,'edash_packager']]], - ['singlesegmentsegmenter',['SingleSegmentSegmenter',['../d0/d03/classedash__packager_1_1media_1_1webm_1_1SingleSegmentSegmenter.html',1,'edash_packager::media::webm']]], ['singlesegmentsegmenter',['SingleSegmentSegmenter',['../da/d75/classedash__packager_1_1media_1_1mp4_1_1SingleSegmentSegmenter.html',1,'edash_packager::media::mp4']]], + ['singlesegmentsegmenter',['SingleSegmentSegmenter',['../d0/d03/classedash__packager_1_1media_1_1webm_1_1SingleSegmentSegmenter.html',1,'edash_packager::media::webm']]], ['soundmediaheader',['SoundMediaHeader',['../da/db0/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader.html',1,'edash_packager::media::mp4']]], ['status',['Status',['../d2/d90/classedash__packager_1_1media_1_1Status.html',1,'edash_packager::media']]], ['streamdescriptor',['StreamDescriptor',['../de/d1f/structedash__packager_1_1media_1_1StreamDescriptor.html',1,'edash_packager::media']]], diff --git a/docs/search/functions_0.js b/docs/search/functions_0.js index 6b0abce2b1..34f421ff80 100644 --- a/docs/search/functions_0.js +++ b/docs/search/functions_0.js @@ -15,7 +15,7 @@ var searchData= ['addroleelement',['AddRoleElement',['../d6/d37/classedash__packager_1_1xml_1_1AdaptationSetXmlNode.html#a40c48f2ed2ac0f550bf019d7e650be94',1,'edash_packager::xml::AdaptationSetXmlNode']]], ['addsample',['AddSample',['../d8/d1e/classedash__packager_1_1media_1_1mp4_1_1EncryptingFragmenter.html#ae8fd13a579fee2167167bcdbb9637dcc',1,'edash_packager::media::mp4::EncryptingFragmenter::AddSample()'],['../db/dae/classedash__packager_1_1media_1_1mp4_1_1Fragmenter.html#a81d8b1f324bdd2bc9cc2e5a469243926',1,'edash_packager::media::mp4::Fragmenter::AddSample()'],['../dc/de1/classedash__packager_1_1media_1_1mp4_1_1Segmenter.html#a5c21059ee9a533caec81491bdb751c57',1,'edash_packager::media::mp4::Segmenter::AddSample()'],['../da/d14/classedash__packager_1_1media_1_1webm_1_1Segmenter.html#aff9c729f9464540eafc6571d4a42df47',1,'edash_packager::media::webm::Segmenter::AddSample()']]], ['addstream',['AddStream',['../d4/d1d/classedash__packager_1_1media_1_1Muxer.html#a77c7a214383f64f822d479d226750bf5',1,'edash_packager::media::Muxer']]], - ['addvideoinfo',['AddVideoInfo',['../dc/d05/classedash__packager_1_1xml_1_1RepresentationXmlNode.html#a2b00f576154e002f067849129cff4c4a',1,'edash_packager::xml::RepresentationXmlNode']]], + ['addvideoinfo',['AddVideoInfo',['../dc/d05/classedash__packager_1_1xml_1_1RepresentationXmlNode.html#a1a3651243d59b29652453ad5d52e4912',1,'edash_packager::xml::RepresentationXmlNode']]], ['addvodonlyinfo',['AddVODOnlyInfo',['../dc/d05/classedash__packager_1_1xml_1_1RepresentationXmlNode.html#a2afa0f4b92900936e2eb97a218d119a2',1,'edash_packager::xml::RepresentationXmlNode']]], ['advancechunk',['AdvanceChunk',['../d8/d71/classedash__packager_1_1media_1_1mp4_1_1ChunkInfoIterator.html#a9472a31149417750f39cd3aa78ab2562',1,'edash_packager::media::mp4::ChunkInfoIterator']]], ['advancerun',['AdvanceRun',['../db/d26/classedash__packager_1_1media_1_1mp4_1_1TrackRunIterator.html#a73b4ffaf8c1bba665c475729c2c9e22f',1,'edash_packager::media::mp4::TrackRunIterator']]], diff --git a/docs/search/functions_1.js b/docs/search/functions_1.js index bde3a05cd0..c4dfe70293 100644 --- a/docs/search/functions_1.js +++ b/docs/search/functions_1.js @@ -6,7 +6,7 @@ var searchData= ['bits_5favailable',['bits_available',['../df/db4/classedash__packager_1_1media_1_1BitReader.html#a1409a0968749ca5a55ba823cd718065b',1,'edash_packager::media::BitReader']]], ['box_5fsize',['box_size',['../d7/d8a/structedash__packager_1_1media_1_1mp4_1_1Box.html#a6a9392e954db3ae0aa6cc16c87562dc7',1,'edash_packager::media::mp4::Box']]], ['boxbuffer',['BoxBuffer',['../dd/d4f/classedash__packager_1_1media_1_1mp4_1_1BoxBuffer.html#aa1144b8d6912a983d65ff97f44ffeb51',1,'edash_packager::media::mp4::BoxBuffer::BoxBuffer(BoxReader *reader)'],['../dd/d4f/classedash__packager_1_1media_1_1mp4_1_1BoxBuffer.html#a1ecfb419ea348ad684bf3c1556d1570c',1,'edash_packager::media::mp4::BoxBuffer::BoxBuffer(BufferWriter *writer)']]], - ['boxtype',['BoxType',['../d7/d8a/structedash__packager_1_1media_1_1mp4_1_1Box.html#a504e7612c24f7d788748dff9940e46ea',1,'edash_packager::media::mp4::Box::BoxType()'],['../d1/dcd/structedash__packager_1_1media_1_1mp4_1_1FileType.html#a37c1287fee817803e6cb18eebfd99847',1,'edash_packager::media::mp4::FileType::BoxType()'],['../dd/da6/structedash__packager_1_1media_1_1mp4_1_1SegmentType.html#aebd87db93b8d63a08e0becb45e1d70cf',1,'edash_packager::media::mp4::SegmentType::BoxType()'],['../da/d2a/structedash__packager_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html#a652e720a34bfc0ea43de52642325d12e',1,'edash_packager::media::mp4::ProtectionSystemSpecificHeader::BoxType()'],['../de/dc4/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html#acfbcac458961036f8fa9c47bea95905c',1,'edash_packager::media::mp4::SampleAuxiliaryInformationOffset::BoxType()'],['../d2/d51/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html#a54b83543e5924c4f9d7e4e45934be26a',1,'edash_packager::media::mp4::SampleAuxiliaryInformationSize::BoxType()'],['../d5/d78/structedash__packager_1_1media_1_1mp4_1_1SampleEncryption.html#ab6d4d91b2bd0a2a021c10afac4672c09',1,'edash_packager::media::mp4::SampleEncryption::BoxType()'],['../da/d4b/structedash__packager_1_1media_1_1mp4_1_1OriginalFormat.html#a3c21bf81deb542ab69811673ec025f2e',1,'edash_packager::media::mp4::OriginalFormat::BoxType()'],['../d4/dcc/structedash__packager_1_1media_1_1mp4_1_1SchemeType.html#a9d477e94ca46a6ee6ebd6208a3343c6c',1,'edash_packager::media::mp4::SchemeType::BoxType()'],['../de/d44/structedash__packager_1_1media_1_1mp4_1_1TrackEncryption.html#aebad0e736feade55f9a81675737380fe',1,'edash_packager::media::mp4::TrackEncryption::BoxType()'],['../d2/d6f/structedash__packager_1_1media_1_1mp4_1_1SchemeInfo.html#a05f236b91e36bd7c774fec38378dae2c',1,'edash_packager::media::mp4::SchemeInfo::BoxType()'],['../dd/dc9/structedash__packager_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html#a62ea06c139c349ef4f1960c15f85da33',1,'edash_packager::media::mp4::ProtectionSchemeInfo::BoxType()'],['../dd/d14/structedash__packager_1_1media_1_1mp4_1_1MovieHeader.html#a4403980ce1e53080796c60d8d7f91ee1',1,'edash_packager::media::mp4::MovieHeader::BoxType()'],['../dd/d15/structedash__packager_1_1media_1_1mp4_1_1TrackHeader.html#a7347e1e4b0e9785b4cecaf6b24c7b70f',1,'edash_packager::media::mp4::TrackHeader::BoxType()'],['../d8/d4a/structedash__packager_1_1media_1_1mp4_1_1EditList.html#aeeaefd1b799f2da1d28dd037ecbbd6a8',1,'edash_packager::media::mp4::EditList::BoxType()'],['../d7/d4f/structedash__packager_1_1media_1_1mp4_1_1Edit.html#aa59c17335999289620bd51d05d3208ab',1,'edash_packager::media::mp4::Edit::BoxType()'],['../d3/dbd/structedash__packager_1_1media_1_1mp4_1_1HandlerReference.html#a27e27257f90332a2585114153e0d7594',1,'edash_packager::media::mp4::HandlerReference::BoxType()'],['../d9/d21/structedash__packager_1_1media_1_1mp4_1_1ID3v2.html#acc52776c15a2dcd6a61be12cb7604bb1',1,'edash_packager::media::mp4::ID3v2::BoxType()'],['../d2/d06/structedash__packager_1_1media_1_1mp4_1_1Metadata.html#aeb14c600d3581277e2709857ab86203a',1,'edash_packager::media::mp4::Metadata::BoxType()'],['../d1/d31/structedash__packager_1_1media_1_1mp4_1_1CodecConfigurationRecord.html#af79275c621765517a82bd0805c82247e',1,'edash_packager::media::mp4::CodecConfigurationRecord::BoxType()'],['../d4/d3d/structedash__packager_1_1media_1_1mp4_1_1PixelAspectRatio.html#a9b88be9293ff1ea9d943de9e9d737782',1,'edash_packager::media::mp4::PixelAspectRatio::BoxType()'],['../df/d6a/structedash__packager_1_1media_1_1mp4_1_1VideoSampleEntry.html#a9d870de1a6e6799c18976adeed3d2b3e',1,'edash_packager::media::mp4::VideoSampleEntry::BoxType()'],['../d9/dcc/structedash__packager_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html#a8a819a7d71dfbbaf5ec2770499689d2d',1,'edash_packager::media::mp4::ElementaryStreamDescriptor::BoxType()'],['../d0/db7/structedash__packager_1_1media_1_1mp4_1_1DTSSpecific.html#aa392cbec3186779bb28e57e9a5e55973',1,'edash_packager::media::mp4::DTSSpecific::BoxType()'],['../df/d62/structedash__packager_1_1media_1_1mp4_1_1AudioSampleEntry.html#a9204f77a7c4e0c6bed49ac995ba25488',1,'edash_packager::media::mp4::AudioSampleEntry::BoxType()'],['../d7/dcc/structedash__packager_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html#a0189e52ddef8d5674a0d9e46a96eff87',1,'edash_packager::media::mp4::WebVTTConfigurationBox::BoxType()'],['../df/da9/structedash__packager_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html#aa2605337625ef9e34e6563d95688338c',1,'edash_packager::media::mp4::WebVTTSourceLabelBox::BoxType()'],['../dc/d0e/structedash__packager_1_1media_1_1mp4_1_1WVTTSampleEntry.html#a0cde4e110795765483a2b8d7feab1010',1,'edash_packager::media::mp4::WVTTSampleEntry::BoxType()'],['../d3/d74/structedash__packager_1_1media_1_1mp4_1_1SampleDescription.html#ada90ed0cac4d2d899424669864f7e6d8',1,'edash_packager::media::mp4::SampleDescription::BoxType()'],['../dc/db7/structedash__packager_1_1media_1_1mp4_1_1DecodingTimeToSample.html#a52fc624b3a6ce6ccd1077420d46d6ef2',1,'edash_packager::media::mp4::DecodingTimeToSample::BoxType()'],['../da/d54/structedash__packager_1_1media_1_1mp4_1_1CompositionTimeToSample.html#a11a38fe87d393d25f89b0b616159479f',1,'edash_packager::media::mp4::CompositionTimeToSample::BoxType()'],['../df/d76/structedash__packager_1_1media_1_1mp4_1_1SampleToChunk.html#ac28ec4cd9cac79d7b552102cb8c3304a',1,'edash_packager::media::mp4::SampleToChunk::BoxType()'],['../d7/da5/structedash__packager_1_1media_1_1mp4_1_1SampleSize.html#ad408709db5e9d0843948b1de6921d11c',1,'edash_packager::media::mp4::SampleSize::BoxType()'],['../db/d89/structedash__packager_1_1media_1_1mp4_1_1CompactSampleSize.html#afd1bbe1300c24d2b86e69a2b20942174',1,'edash_packager::media::mp4::CompactSampleSize::BoxType()'],['../da/d81/structedash__packager_1_1media_1_1mp4_1_1ChunkLargeOffset.html#a83ff8d4e12f4a84c9e5652d74cb582d4',1,'edash_packager::media::mp4::ChunkLargeOffset::BoxType()'],['../d6/d79/structedash__packager_1_1media_1_1mp4_1_1ChunkOffset.html#a7aa021dc4bc57fd5abb83582513ec7d6',1,'edash_packager::media::mp4::ChunkOffset::BoxType()'],['../d9/d18/structedash__packager_1_1media_1_1mp4_1_1SyncSample.html#a83405091000e8777b4be3088ed638c65',1,'edash_packager::media::mp4::SyncSample::BoxType()'],['../d3/d77/structedash__packager_1_1media_1_1mp4_1_1SampleTable.html#a8d8d5a5f691ea55bd0248a6d12302e90',1,'edash_packager::media::mp4::SampleTable::BoxType()'],['../d7/dec/structedash__packager_1_1media_1_1mp4_1_1MediaHeader.html#af7668a8993e5ef0b515cf1deca69db90',1,'edash_packager::media::mp4::MediaHeader::BoxType()'],['../db/df7/structedash__packager_1_1media_1_1mp4_1_1VideoMediaHeader.html#a5a3f17a16ce780e1d3c9e7ff2c2d8b92',1,'edash_packager::media::mp4::VideoMediaHeader::BoxType()'],['../da/db0/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader.html#a294713d0b23c8fd694752a9fe5b302d0',1,'edash_packager::media::mp4::SoundMediaHeader::BoxType()'],['../d1/d86/structedash__packager_1_1media_1_1mp4_1_1SubtitleMediaHeader.html#a46fb740ceb2e6b51336e602fb707d9dc',1,'edash_packager::media::mp4::SubtitleMediaHeader::BoxType()'],['../d6/d6c/structedash__packager_1_1media_1_1mp4_1_1DataEntryUrl.html#a52a2b2d6afb05554e144b476e2a7c2e1',1,'edash_packager::media::mp4::DataEntryUrl::BoxType()'],['../d7/d0d/structedash__packager_1_1media_1_1mp4_1_1DataReference.html#a4cfadf5c0c452c121be0ea980555be60',1,'edash_packager::media::mp4::DataReference::BoxType()'],['../d6/d59/structedash__packager_1_1media_1_1mp4_1_1DataInformation.html#aed66cd68a3126748afe6b42d04cab885',1,'edash_packager::media::mp4::DataInformation::BoxType()'],['../dd/dbd/structedash__packager_1_1media_1_1mp4_1_1MediaInformation.html#a2dab0117ee2e03c052f5df25134db42e',1,'edash_packager::media::mp4::MediaInformation::BoxType()'],['../de/de7/structedash__packager_1_1media_1_1mp4_1_1Media.html#a339ebe17f0f7d4ffbbf82795419155b5',1,'edash_packager::media::mp4::Media::BoxType()'],['../d3/de1/structedash__packager_1_1media_1_1mp4_1_1Track.html#a94e5e94f5bc4e4f6498bb384ed548cae',1,'edash_packager::media::mp4::Track::BoxType()'],['../da/d17/structedash__packager_1_1media_1_1mp4_1_1MovieExtendsHeader.html#a3d7d2e08f6baedf1af02c9e4504d75d9',1,'edash_packager::media::mp4::MovieExtendsHeader::BoxType()'],['../d3/d2c/structedash__packager_1_1media_1_1mp4_1_1TrackExtends.html#a133f1027410f7767253ed0bfd8da54cd',1,'edash_packager::media::mp4::TrackExtends::BoxType()'],['../d6/d8b/structedash__packager_1_1media_1_1mp4_1_1MovieExtends.html#a13e40bc4f9d2a6988b3506a5305e6fca',1,'edash_packager::media::mp4::MovieExtends::BoxType()'],['../d6/dec/structedash__packager_1_1media_1_1mp4_1_1Movie.html#aa5e25db4def848291ed7b79217e7e2fe',1,'edash_packager::media::mp4::Movie::BoxType()'],['../d0/d92/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html#a33cfba86f8b918fbedaceb465ec40eb1',1,'edash_packager::media::mp4::TrackFragmentDecodeTime::BoxType()'],['../df/d86/structedash__packager_1_1media_1_1mp4_1_1MovieFragmentHeader.html#a1cd6327f596a7cb253f1426812490dce',1,'edash_packager::media::mp4::MovieFragmentHeader::BoxType()'],['../d9/d47/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentHeader.html#a9a5be3ea4894965d2bb643d88acdb4c9',1,'edash_packager::media::mp4::TrackFragmentHeader::BoxType()'],['../df/d21/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentRun.html#a1390e0e93a5181be7d31cb701592ec18',1,'edash_packager::media::mp4::TrackFragmentRun::BoxType()'],['../d1/d65/structedash__packager_1_1media_1_1mp4_1_1SampleToGroup.html#abf5ab6476c2530cf820cc4262c2eef41',1,'edash_packager::media::mp4::SampleToGroup::BoxType()'],['../d2/d26/structedash__packager_1_1media_1_1mp4_1_1SampleGroupDescription.html#a20836adec61bcbc891d08ffbc291ab4e',1,'edash_packager::media::mp4::SampleGroupDescription::BoxType()'],['../d4/dd9/structedash__packager_1_1media_1_1mp4_1_1TrackFragment.html#a1b72b2b61bdbca4b23f0ef727cb04901',1,'edash_packager::media::mp4::TrackFragment::BoxType()'],['../dd/da2/structedash__packager_1_1media_1_1mp4_1_1MovieFragment.html#a5455c20a8391c344d91929eb088f0699',1,'edash_packager::media::mp4::MovieFragment::BoxType()'],['../d1/d81/structedash__packager_1_1media_1_1mp4_1_1SegmentIndex.html#a2a0444e32d7ccc525b10b6f9fc81b0b5',1,'edash_packager::media::mp4::SegmentIndex::BoxType()'],['../d4/d92/structedash__packager_1_1media_1_1mp4_1_1MediaData.html#a2cd09fe16fb9b50fc70476217977a060',1,'edash_packager::media::mp4::MediaData::BoxType()'],['../d2/df8/structedash__packager_1_1media_1_1mp4_1_1CueSourceIDBox.html#a79ce16bc0cd49723eaa8e4734c6426e5',1,'edash_packager::media::mp4::CueSourceIDBox::BoxType()'],['../dd/d12/structedash__packager_1_1media_1_1mp4_1_1CueTimeBox.html#a099bff9996e063551114d44e9a0429bc',1,'edash_packager::media::mp4::CueTimeBox::BoxType()'],['../de/d07/structedash__packager_1_1media_1_1mp4_1_1CueIDBox.html#ad160b5d1ef859073d2536f048d71af05',1,'edash_packager::media::mp4::CueIDBox::BoxType()'],['../d1/df2/structedash__packager_1_1media_1_1mp4_1_1CueSettingsBox.html#af750ff88f1d2e7926f01969db44b76ed',1,'edash_packager::media::mp4::CueSettingsBox::BoxType()'],['../d7/d49/structedash__packager_1_1media_1_1mp4_1_1CuePayloadBox.html#a227df861e36f5876dca5cd91b5b230ad',1,'edash_packager::media::mp4::CuePayloadBox::BoxType()'],['../d3/d1c/structedash__packager_1_1media_1_1mp4_1_1VTTEmptyCueBox.html#a12c38669db1fc4e70bb8dca039a52f8b',1,'edash_packager::media::mp4::VTTEmptyCueBox::BoxType()'],['../db/d6b/structedash__packager_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html#ad0715718756fb534e945ed725670bf79',1,'edash_packager::media::mp4::VTTAdditionalTextBox::BoxType()'],['../d6/d74/structedash__packager_1_1media_1_1mp4_1_1VTTCueBox.html#abd7dab86dd675aadf17eb857d0d0ab80',1,'edash_packager::media::mp4::VTTCueBox::BoxType()']]], + ['boxtype',['BoxType',['../d7/d8a/structedash__packager_1_1media_1_1mp4_1_1Box.html#a504e7612c24f7d788748dff9940e46ea',1,'edash_packager::media::mp4::Box::BoxType()'],['../d1/dcd/structedash__packager_1_1media_1_1mp4_1_1FileType.html#a37c1287fee817803e6cb18eebfd99847',1,'edash_packager::media::mp4::FileType::BoxType()'],['../dd/da6/structedash__packager_1_1media_1_1mp4_1_1SegmentType.html#aebd87db93b8d63a08e0becb45e1d70cf',1,'edash_packager::media::mp4::SegmentType::BoxType()'],['../da/d2a/structedash__packager_1_1media_1_1mp4_1_1ProtectionSystemSpecificHeader.html#a652e720a34bfc0ea43de52642325d12e',1,'edash_packager::media::mp4::ProtectionSystemSpecificHeader::BoxType()'],['../de/dc4/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationOffset.html#acfbcac458961036f8fa9c47bea95905c',1,'edash_packager::media::mp4::SampleAuxiliaryInformationOffset::BoxType()'],['../d2/d51/structedash__packager_1_1media_1_1mp4_1_1SampleAuxiliaryInformationSize.html#a54b83543e5924c4f9d7e4e45934be26a',1,'edash_packager::media::mp4::SampleAuxiliaryInformationSize::BoxType()'],['../d5/d78/structedash__packager_1_1media_1_1mp4_1_1SampleEncryption.html#ab6d4d91b2bd0a2a021c10afac4672c09',1,'edash_packager::media::mp4::SampleEncryption::BoxType()'],['../da/d4b/structedash__packager_1_1media_1_1mp4_1_1OriginalFormat.html#a3c21bf81deb542ab69811673ec025f2e',1,'edash_packager::media::mp4::OriginalFormat::BoxType()'],['../d4/dcc/structedash__packager_1_1media_1_1mp4_1_1SchemeType.html#a9d477e94ca46a6ee6ebd6208a3343c6c',1,'edash_packager::media::mp4::SchemeType::BoxType()'],['../de/d44/structedash__packager_1_1media_1_1mp4_1_1TrackEncryption.html#aebad0e736feade55f9a81675737380fe',1,'edash_packager::media::mp4::TrackEncryption::BoxType()'],['../d2/d6f/structedash__packager_1_1media_1_1mp4_1_1SchemeInfo.html#a05f236b91e36bd7c774fec38378dae2c',1,'edash_packager::media::mp4::SchemeInfo::BoxType()'],['../dd/dc9/structedash__packager_1_1media_1_1mp4_1_1ProtectionSchemeInfo.html#a62ea06c139c349ef4f1960c15f85da33',1,'edash_packager::media::mp4::ProtectionSchemeInfo::BoxType()'],['../dd/d14/structedash__packager_1_1media_1_1mp4_1_1MovieHeader.html#a4403980ce1e53080796c60d8d7f91ee1',1,'edash_packager::media::mp4::MovieHeader::BoxType()'],['../dd/d15/structedash__packager_1_1media_1_1mp4_1_1TrackHeader.html#a7347e1e4b0e9785b4cecaf6b24c7b70f',1,'edash_packager::media::mp4::TrackHeader::BoxType()'],['../d8/d4a/structedash__packager_1_1media_1_1mp4_1_1EditList.html#aeeaefd1b799f2da1d28dd037ecbbd6a8',1,'edash_packager::media::mp4::EditList::BoxType()'],['../d7/d4f/structedash__packager_1_1media_1_1mp4_1_1Edit.html#aa59c17335999289620bd51d05d3208ab',1,'edash_packager::media::mp4::Edit::BoxType()'],['../d3/dbd/structedash__packager_1_1media_1_1mp4_1_1HandlerReference.html#a27e27257f90332a2585114153e0d7594',1,'edash_packager::media::mp4::HandlerReference::BoxType()'],['../d9/d21/structedash__packager_1_1media_1_1mp4_1_1ID3v2.html#acc52776c15a2dcd6a61be12cb7604bb1',1,'edash_packager::media::mp4::ID3v2::BoxType()'],['../d2/d06/structedash__packager_1_1media_1_1mp4_1_1Metadata.html#aeb14c600d3581277e2709857ab86203a',1,'edash_packager::media::mp4::Metadata::BoxType()'],['../d1/d31/structedash__packager_1_1media_1_1mp4_1_1CodecConfigurationRecord.html#af79275c621765517a82bd0805c82247e',1,'edash_packager::media::mp4::CodecConfigurationRecord::BoxType()'],['../d4/d3d/structedash__packager_1_1media_1_1mp4_1_1PixelAspectRatio.html#a9b88be9293ff1ea9d943de9e9d737782',1,'edash_packager::media::mp4::PixelAspectRatio::BoxType()'],['../df/d6a/structedash__packager_1_1media_1_1mp4_1_1VideoSampleEntry.html#a9d870de1a6e6799c18976adeed3d2b3e',1,'edash_packager::media::mp4::VideoSampleEntry::BoxType()'],['../d9/dcc/structedash__packager_1_1media_1_1mp4_1_1ElementaryStreamDescriptor.html#a8a819a7d71dfbbaf5ec2770499689d2d',1,'edash_packager::media::mp4::ElementaryStreamDescriptor::BoxType()'],['../d0/db7/structedash__packager_1_1media_1_1mp4_1_1DTSSpecific.html#aa392cbec3186779bb28e57e9a5e55973',1,'edash_packager::media::mp4::DTSSpecific::BoxType()'],['../d0/d65/structedash__packager_1_1media_1_1mp4_1_1AC3Specific.html#adcfdf18f91a08aa3f9fa73d617e02a22',1,'edash_packager::media::mp4::AC3Specific::BoxType()'],['../df/d62/structedash__packager_1_1media_1_1mp4_1_1AudioSampleEntry.html#a9204f77a7c4e0c6bed49ac995ba25488',1,'edash_packager::media::mp4::AudioSampleEntry::BoxType()'],['../d7/dcc/structedash__packager_1_1media_1_1mp4_1_1WebVTTConfigurationBox.html#a0189e52ddef8d5674a0d9e46a96eff87',1,'edash_packager::media::mp4::WebVTTConfigurationBox::BoxType()'],['../df/da9/structedash__packager_1_1media_1_1mp4_1_1WebVTTSourceLabelBox.html#aa2605337625ef9e34e6563d95688338c',1,'edash_packager::media::mp4::WebVTTSourceLabelBox::BoxType()'],['../dc/d0e/structedash__packager_1_1media_1_1mp4_1_1WVTTSampleEntry.html#a0cde4e110795765483a2b8d7feab1010',1,'edash_packager::media::mp4::WVTTSampleEntry::BoxType()'],['../d3/d74/structedash__packager_1_1media_1_1mp4_1_1SampleDescription.html#ada90ed0cac4d2d899424669864f7e6d8',1,'edash_packager::media::mp4::SampleDescription::BoxType()'],['../dc/db7/structedash__packager_1_1media_1_1mp4_1_1DecodingTimeToSample.html#a52fc624b3a6ce6ccd1077420d46d6ef2',1,'edash_packager::media::mp4::DecodingTimeToSample::BoxType()'],['../da/d54/structedash__packager_1_1media_1_1mp4_1_1CompositionTimeToSample.html#a11a38fe87d393d25f89b0b616159479f',1,'edash_packager::media::mp4::CompositionTimeToSample::BoxType()'],['../df/d76/structedash__packager_1_1media_1_1mp4_1_1SampleToChunk.html#ac28ec4cd9cac79d7b552102cb8c3304a',1,'edash_packager::media::mp4::SampleToChunk::BoxType()'],['../d7/da5/structedash__packager_1_1media_1_1mp4_1_1SampleSize.html#ad408709db5e9d0843948b1de6921d11c',1,'edash_packager::media::mp4::SampleSize::BoxType()'],['../db/d89/structedash__packager_1_1media_1_1mp4_1_1CompactSampleSize.html#afd1bbe1300c24d2b86e69a2b20942174',1,'edash_packager::media::mp4::CompactSampleSize::BoxType()'],['../da/d81/structedash__packager_1_1media_1_1mp4_1_1ChunkLargeOffset.html#a83ff8d4e12f4a84c9e5652d74cb582d4',1,'edash_packager::media::mp4::ChunkLargeOffset::BoxType()'],['../d6/d79/structedash__packager_1_1media_1_1mp4_1_1ChunkOffset.html#a7aa021dc4bc57fd5abb83582513ec7d6',1,'edash_packager::media::mp4::ChunkOffset::BoxType()'],['../d9/d18/structedash__packager_1_1media_1_1mp4_1_1SyncSample.html#a83405091000e8777b4be3088ed638c65',1,'edash_packager::media::mp4::SyncSample::BoxType()'],['../d3/d77/structedash__packager_1_1media_1_1mp4_1_1SampleTable.html#a8d8d5a5f691ea55bd0248a6d12302e90',1,'edash_packager::media::mp4::SampleTable::BoxType()'],['../d7/dec/structedash__packager_1_1media_1_1mp4_1_1MediaHeader.html#af7668a8993e5ef0b515cf1deca69db90',1,'edash_packager::media::mp4::MediaHeader::BoxType()'],['../db/df7/structedash__packager_1_1media_1_1mp4_1_1VideoMediaHeader.html#a5a3f17a16ce780e1d3c9e7ff2c2d8b92',1,'edash_packager::media::mp4::VideoMediaHeader::BoxType()'],['../da/db0/structedash__packager_1_1media_1_1mp4_1_1SoundMediaHeader.html#a294713d0b23c8fd694752a9fe5b302d0',1,'edash_packager::media::mp4::SoundMediaHeader::BoxType()'],['../d1/d86/structedash__packager_1_1media_1_1mp4_1_1SubtitleMediaHeader.html#a46fb740ceb2e6b51336e602fb707d9dc',1,'edash_packager::media::mp4::SubtitleMediaHeader::BoxType()'],['../d6/d6c/structedash__packager_1_1media_1_1mp4_1_1DataEntryUrl.html#a52a2b2d6afb05554e144b476e2a7c2e1',1,'edash_packager::media::mp4::DataEntryUrl::BoxType()'],['../d7/d0d/structedash__packager_1_1media_1_1mp4_1_1DataReference.html#a4cfadf5c0c452c121be0ea980555be60',1,'edash_packager::media::mp4::DataReference::BoxType()'],['../d6/d59/structedash__packager_1_1media_1_1mp4_1_1DataInformation.html#aed66cd68a3126748afe6b42d04cab885',1,'edash_packager::media::mp4::DataInformation::BoxType()'],['../dd/dbd/structedash__packager_1_1media_1_1mp4_1_1MediaInformation.html#a2dab0117ee2e03c052f5df25134db42e',1,'edash_packager::media::mp4::MediaInformation::BoxType()'],['../de/de7/structedash__packager_1_1media_1_1mp4_1_1Media.html#a339ebe17f0f7d4ffbbf82795419155b5',1,'edash_packager::media::mp4::Media::BoxType()'],['../d3/de1/structedash__packager_1_1media_1_1mp4_1_1Track.html#a94e5e94f5bc4e4f6498bb384ed548cae',1,'edash_packager::media::mp4::Track::BoxType()'],['../da/d17/structedash__packager_1_1media_1_1mp4_1_1MovieExtendsHeader.html#a3d7d2e08f6baedf1af02c9e4504d75d9',1,'edash_packager::media::mp4::MovieExtendsHeader::BoxType()'],['../d3/d2c/structedash__packager_1_1media_1_1mp4_1_1TrackExtends.html#a133f1027410f7767253ed0bfd8da54cd',1,'edash_packager::media::mp4::TrackExtends::BoxType()'],['../d6/d8b/structedash__packager_1_1media_1_1mp4_1_1MovieExtends.html#a13e40bc4f9d2a6988b3506a5305e6fca',1,'edash_packager::media::mp4::MovieExtends::BoxType()'],['../d6/dec/structedash__packager_1_1media_1_1mp4_1_1Movie.html#aa5e25db4def848291ed7b79217e7e2fe',1,'edash_packager::media::mp4::Movie::BoxType()'],['../d0/d92/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentDecodeTime.html#a33cfba86f8b918fbedaceb465ec40eb1',1,'edash_packager::media::mp4::TrackFragmentDecodeTime::BoxType()'],['../df/d86/structedash__packager_1_1media_1_1mp4_1_1MovieFragmentHeader.html#a1cd6327f596a7cb253f1426812490dce',1,'edash_packager::media::mp4::MovieFragmentHeader::BoxType()'],['../d9/d47/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentHeader.html#a9a5be3ea4894965d2bb643d88acdb4c9',1,'edash_packager::media::mp4::TrackFragmentHeader::BoxType()'],['../df/d21/structedash__packager_1_1media_1_1mp4_1_1TrackFragmentRun.html#a1390e0e93a5181be7d31cb701592ec18',1,'edash_packager::media::mp4::TrackFragmentRun::BoxType()'],['../d1/d65/structedash__packager_1_1media_1_1mp4_1_1SampleToGroup.html#abf5ab6476c2530cf820cc4262c2eef41',1,'edash_packager::media::mp4::SampleToGroup::BoxType()'],['../d2/d26/structedash__packager_1_1media_1_1mp4_1_1SampleGroupDescription.html#a20836adec61bcbc891d08ffbc291ab4e',1,'edash_packager::media::mp4::SampleGroupDescription::BoxType()'],['../d4/dd9/structedash__packager_1_1media_1_1mp4_1_1TrackFragment.html#a1b72b2b61bdbca4b23f0ef727cb04901',1,'edash_packager::media::mp4::TrackFragment::BoxType()'],['../dd/da2/structedash__packager_1_1media_1_1mp4_1_1MovieFragment.html#a5455c20a8391c344d91929eb088f0699',1,'edash_packager::media::mp4::MovieFragment::BoxType()'],['../d1/d81/structedash__packager_1_1media_1_1mp4_1_1SegmentIndex.html#a2a0444e32d7ccc525b10b6f9fc81b0b5',1,'edash_packager::media::mp4::SegmentIndex::BoxType()'],['../d4/d92/structedash__packager_1_1media_1_1mp4_1_1MediaData.html#a2cd09fe16fb9b50fc70476217977a060',1,'edash_packager::media::mp4::MediaData::BoxType()'],['../d2/df8/structedash__packager_1_1media_1_1mp4_1_1CueSourceIDBox.html#a79ce16bc0cd49723eaa8e4734c6426e5',1,'edash_packager::media::mp4::CueSourceIDBox::BoxType()'],['../dd/d12/structedash__packager_1_1media_1_1mp4_1_1CueTimeBox.html#a099bff9996e063551114d44e9a0429bc',1,'edash_packager::media::mp4::CueTimeBox::BoxType()'],['../de/d07/structedash__packager_1_1media_1_1mp4_1_1CueIDBox.html#ad160b5d1ef859073d2536f048d71af05',1,'edash_packager::media::mp4::CueIDBox::BoxType()'],['../d1/df2/structedash__packager_1_1media_1_1mp4_1_1CueSettingsBox.html#af750ff88f1d2e7926f01969db44b76ed',1,'edash_packager::media::mp4::CueSettingsBox::BoxType()'],['../d7/d49/structedash__packager_1_1media_1_1mp4_1_1CuePayloadBox.html#a227df861e36f5876dca5cd91b5b230ad',1,'edash_packager::media::mp4::CuePayloadBox::BoxType()'],['../d3/d1c/structedash__packager_1_1media_1_1mp4_1_1VTTEmptyCueBox.html#a12c38669db1fc4e70bb8dca039a52f8b',1,'edash_packager::media::mp4::VTTEmptyCueBox::BoxType()'],['../db/d6b/structedash__packager_1_1media_1_1mp4_1_1VTTAdditionalTextBox.html#ad0715718756fb534e945ed725670bf79',1,'edash_packager::media::mp4::VTTAdditionalTextBox::BoxType()'],['../d6/d74/structedash__packager_1_1media_1_1mp4_1_1VTTCueBox.html#abd7dab86dd675aadf17eb857d0d0ab80',1,'edash_packager::media::mp4::VTTCueBox::BoxType()']]], ['buffer',['Buffer',['../df/dde/classedash__packager_1_1media_1_1BufferWriter.html#a8849c495e9e5cb0c33d7633fecbe0643',1,'edash_packager::media::BufferWriter']]], ['bufferreader',['BufferReader',['../d9/d46/classedash__packager_1_1media_1_1BufferReader.html#a7354b7da262fd2cd4680346d4ae871d8',1,'edash_packager::media::BufferReader']]], ['bufferwriter',['BufferWriter',['../df/dde/classedash__packager_1_1media_1_1BufferWriter.html#abffefbaff39469927deaaa97fec636a4',1,'edash_packager::media::BufferWriter']]], diff --git a/docs/search/functions_10.js b/docs/search/functions_10.js index 61507173e2..aa05d526b7 100644 --- a/docs/search/functions_10.js +++ b/docs/search/functions_10.js @@ -37,6 +37,7 @@ var searchData= ['stop',['Stop',['../d5/d02/classedash__packager_1_1media_1_1ProducerConsumerQueue.html#a04f78e0c31398c66f19a24e6a563436b',1,'edash_packager::media::ProducerConsumerQueue']]], ['stopped',['Stopped',['../d5/d02/classedash__packager_1_1media_1_1ProducerConsumerQueue.html#ad36a861f53f0b58d398a14ce2d93d793',1,'edash_packager::media::ProducerConsumerQueue']]], ['streams',['streams',['../d5/dce/classedash__packager_1_1media_1_1Demuxer.html#ae8182d61264096c811f457f50009fe3d',1,'edash_packager::media::Demuxer']]], + ['suppressonce',['SuppressOnce',['../d7/d15/classedash__packager_1_1Representation.html#a9d0e434e410332342d346a7665ffbaac',1,'edash_packager::Representation']]], ['syncsampleiterator',['SyncSampleIterator',['../db/d01/classedash__packager_1_1media_1_1mp4_1_1SyncSampleIterator.html#aa96fc4d3705ea3e25b97266675aa9e01',1,'edash_packager::media::mp4::SyncSampleIterator']]], ['systemname',['SystemName',['../d9/d8b/classedash__packager_1_1media_1_1KeySource.html#aa73dacef997e7700b8669bb2db5f8f31',1,'edash_packager::media::KeySource']]] ]; diff --git a/docs/search/functions_2.js b/docs/search/functions_2.js index 07097334c9..eb04aeaabd 100644 --- a/docs/search/functions_2.js +++ b/docs/search/functions_2.js @@ -26,7 +26,7 @@ var searchData= ['createeosbuffer',['CreateEOSBuffer',['../d8/d6c/classedash__packager_1_1media_1_1MediaSample.html#ae449ca4aeea6cacb8c08a56d9652a64e',1,'edash_packager::media::MediaSample']]], ['createfromhexstrings',['CreateFromHexStrings',['../d9/d8b/classedash__packager_1_1media_1_1KeySource.html#ab05172d89513c0d3627502c9cff4535f',1,'edash_packager::media::KeySource']]], ['createmuxeroptions',['CreateMuxerOptions',['../d2/d28/classedash__packager_1_1media_1_1SegmentTestBase.html#a89b635fe86f80e54d4a4dd8cd6e4a1a0',1,'edash_packager::media::SegmentTestBase']]], - ['createsample',['CreateSample',['../d2/d28/classedash__packager_1_1media_1_1SegmentTestBase.html#ae4ec9ded9bc0974f36459aa819cbec75',1,'edash_packager::media::SegmentTestBase']]], + ['createsample',['CreateSample',['../d2/d28/classedash__packager_1_1media_1_1SegmentTestBase.html#a8d5a6020af6bc81cee269e03998c1fa4',1,'edash_packager::media::SegmentTestBase']]], ['createsigner',['CreateSigner',['../d8/dcc/classedash__packager_1_1media_1_1AesRequestSigner.html#a1e43c2e7e3ab4f5e07d442ed59fc1278',1,'edash_packager::media::AesRequestSigner::CreateSigner()'],['../dd/da8/classedash__packager_1_1media_1_1RsaRequestSigner.html#a51517907c457f9f991e1a72ce4355183',1,'edash_packager::media::RsaRequestSigner::CreateSigner()']]], ['createvideostreaminfo',['CreateVideoStreamInfo',['../d2/d28/classedash__packager_1_1media_1_1SegmentTestBase.html#a282e32ddca952a9f10ccf150a6a211fb',1,'edash_packager::media::SegmentTestBase']]], ['current_5fchunk',['current_chunk',['../d8/d71/classedash__packager_1_1media_1_1mp4_1_1ChunkInfoIterator.html#ab3a329468f494ff3143d4c43c94d13ba',1,'edash_packager::media::mp4::ChunkInfoIterator']]]