示例#1
0
        public override string ToString()
        {
            StringBuilder xml = new StringBuilder();

            xml.Append(base.ToString());
            xml.Append(MovieFragmentHeaderBox.ToString());
            xml.Append(TrackFragmentBox.ToString());
            xml.Append("</box>");
            return(xml.ToString());
        }
示例#2
0
        /// <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);
        }