예제 #1
0
        private void ReadMdia(ref TrakInfo trackData, BoxInfo mdiaBox)
        {
            var     maxLen = mdiaBox.BoxOffset + mdiaBox.Offset;
            BoxInfo?box    = null;

            do
            {
                box = NextBox(maxLen);
                if (box != null)
                {
                    if (box.Value.Type.Check(mdhd))
                    {
                        ReadMdhd(ref trackData);
                    }
                    if (box.Value.Type.Check(hdlr))
                    {
                        ReadHdlr(ref trackData);
                    }
                    if (box.Value.Type.Check(minf))
                    {
                        ReadMinf(ref trackData, box.Value);
                    }
                    SeekNext(box.Value);
                }
            } while (!(box == null || box.Value.Last));
        }
예제 #2
0
 private void ReadChaptersText(TrakInfo textBox)
 {
     if (textBox.Durations != null && textBox.Samples != null)
     {
         var len = Math.Min(textBox.Durations.Length, textBox.Samples.Length);
         if (len > 0)
         {
             Chapters = new ChapterInfo[len];
             var pos = TimeSpan.FromSeconds(0);
             var tps = (double)textBox.TimeUnitPerSecond;
             if (tps <= 0.1)
             {
                 tps = 600;
             }
             for (int i = 0; i < len; i++)
             {
                 var ci = new ChapterInfo();
                 ci.Time = pos;
                 var d = (double)textBox.Durations[i];
                 pos += TimeSpan.FromSeconds(d / tps);
                 stream.Seek(SeekOrigin.Begin, textBox.Samples[i]);
                 ci.Name     = ReadPascalString(Encoding.UTF8);
                 Chapters[i] = ci;
             }
         }
     }
 }
예제 #3
0
        private TrakInfo ReadTrak(BoxInfo trakBox)
        {
            var     maxLen   = trakBox.BoxOffset + trakBox.Offset;
            var     trakData = new TrakInfo();
            BoxInfo?box      = null;

            do
            {
                box = NextBox(maxLen);
                if (box != null)
                {
                    if (box.Value.Type.Check(tkhd))
                    {
                        ReadTkhd(ref trakData);
                    }
                    if (box.Value.Type.Check(mdia))
                    {
                        ReadMdia(ref trakData, box.Value);
                    }
                    if (box.Value.Type.Check(tref))
                    {
                        ReadTref(ref trakData, box.Value);
                    }
                    SeekNext(box.Value);
                }
            } while (!(box == null || box.Value.Last));
            return(trakData);
        }
예제 #4
0
        private void ReadTkhd(ref TrakInfo trakData)
        {
            var v = new byte[1];

            stream.Read(v, 1);
            var isv8 = v[0] == 1;

            stream.Seek(SeekOrigin.Current, 3 + (isv8 ? 8 + 8 : 4 + 4));
            trakData.Id = ReadUint32();
        }
예제 #5
0
        private void ReadHdlr(ref TrakInfo trakData)
        {
            stream.Seek(SeekOrigin.Current, 4 + 4);
            var b = new byte[4];

            stream.Read(b, 4);
            var bc = new char[4];

            AsciiEncoding.Current.GetDecoder().GetChars(b, 0, 4, bc, 0);
            trakData.Type = new string(bc);
        }
예제 #6
0
        private void ReadChap(ref TrakInfo trakData, BoxInfo box2)
        {
            var len = (box2.Offset - 8) / 4;

            if (len > 0 && len < 1024)
            {
                trakData.Chaps = new uint[len];
                for (uint i = 0; i < len; i++)
                {
                    trakData.Chaps[i] = ReadUint32();
                }
            }
        }
예제 #7
0
        private void ReadStco(ref TrakInfo trakData)
        {
            stream.Seek(SeekOrigin.Current, 4);
            var len = ReadUint32();

            if (len > 1024)
            {
                len = 0;
            }
            trakData.Samples = new long[len];
            for (uint i = 0; i < len; i++)
            {
                trakData.Samples[i] = ReadUint32();
            }
        }
예제 #8
0
        private void ReadStts(ref TrakInfo trakData)
        {
            stream.Seek(SeekOrigin.Current, 4);
            var len = ReadUint32();

            if (len > 1024)
            {
                len = 0;
            }
            trakData.Durations  = new uint[len];
            trakData.FrameCount = new uint[len];
            for (uint i = 0; i < len; i++)
            {
                trakData.FrameCount[i] = ReadUint32();
                trakData.Durations[i]  = ReadUint32();
            }
        }
예제 #9
0
        private void ReadMinf(ref TrakInfo trakData, BoxInfo box2)
        {
            var     maxLen = box2.BoxOffset + box2.Offset;
            BoxInfo?box    = null;

            do
            {
                box = NextBox(maxLen);
                if (box != null)
                {
                    if (box.Value.Type.Check(stbl))
                    {
                        ReadStbl(ref trakData, box.Value);
                    }
                    SeekNext(box.Value);
                }
            } while (!(box == null || box.Value.Last));
        }