public override string ToString() { StringBuilder xml = new StringBuilder(); xml.Append(base.ToString()); xml.Append(TrackFragmentHeaderBox.ToString()); xml.Append(TrackFragmentRunBox.ToString()); xml.Append(IndependentAndDisposableSamplesBox.ToString()); xml.Append("</box>"); return(xml.ToString()); }
/// <summary> /// AddSampleStream /// This is the inverse of GetSampleStream above. /// Given a list of samples, assemble the TrackFragmentBox for this fragment. /// </summary> /// <param name="streamLocations"></param> /// <param name="trackTimeScale"></param> /// <param name="currMdatOffset"></param> public void AddSampleStream(List <StreamDataBlockInfo> streamLocations, uint trackTimeScale, ref ulong currMdatOffset) { // the time scale for every ISMV video fragment is 10,000,000 this._timeScale = trackTimeScale; _currentOffsetInBytes = 0UL; TrackFragmentBox tfrag = this.MovieFragmentBox.TrackFragmentBox; TrackFragmentHeaderBox tfhd = tfrag.TrackFragmentHeaderBox; // now we know the file offset to the data bits, so this is where we set the base data offset tfhd.BaseDataOffset = currMdatOffset; uint defaultSampleDuration = tfhd.DefaultSampleDuration; uint defaultSampleSize = 0; // tfhd.DefaultSampleSize; <-- don't use default sample size uint defaultSampleFlags = tfhd.DefaultSampleFlags; TrackFragmentRunBox fragRunBox = tfrag.TrackFragmentRunBox; IndependentAndDisposableSamplesBox stdpBox = tfrag.IndependentAndDisposableSamplesBox; uint trackID = tfhd.TrackId; uint trunFlags = fragRunBox.Flags; if (((trunFlags & (uint)TrackFragmentRunBoxFlags.SampleDurationPresent) == 0) != (defaultSampleDuration > 0)) { throw new Exception("Fragment: Trun flag sample duration present inconsistent with TrackFragmentHeaderBox data"); } if (((trunFlags & (uint)TrackFragmentRunBoxFlags.SampleSizePresent) == 0) != (defaultSampleSize > 0)) { throw new Exception("Fragment: Trun flag sample size present inconsistent with TrackFragmentHeaderBox data"); } if (((trunFlags & (uint)TrackFragmentRunBoxFlags.SampleFlagsPresent) == 0) != (defaultSampleFlags != 0)) { throw new Exception("Fragment: Trun flag sample flags present inconsistent with TrackFragmentHeaderBox data"); } foreach (StreamDataBlockInfo data in streamLocations) { if ((defaultSampleSize > 0) && (data.SliceSize != defaultSampleSize)) { throw new Exception("Samples do not have the same size in input stream when they're supposed to"); } fragRunBox.AddOneSample(data, trackTimeScale, defaultSampleSize, defaultSampleFlags, ref currMdatOffset); stdpBox.AddOneSample(data); } // after we write all the data bits, we should know the size of the mdata box if (currMdatOffset < tfhd.BaseDataOffset) { throw new Exception("Fragment: fragment mdat box size calculation error"); } this.MediaDataBox.Size += (ulong)(currMdatOffset - tfhd.BaseDataOffset); }