CSharpRTMP.Core.MediaFormats.MP4Document.BuildFrames C# (CSharp) Метод

BuildFrames() защищенный Метод

protected BuildFrames ( ) : bool
Результат bool
        protected override bool BuildFrames()
        {
            _frames.Clear();
            AtomTRAK track;
            AtomAVCC avcc = null;
            if (null!= (track = GetTRAK(false)) )
            {
                avcc = (AtomAVCC)track.GetPath(6,MDIA,MINF,
				STBL, STSD, AVC1, AVCC);
            }
            AtomESDS esds = null;
            if (null!= (track = GetTRAK(true)) )
            {
                esds = (AtomESDS)track.GetPath(6, MDIA, MINF,
                    STBL, STSD, MP4A, ESDS) ?? (AtomESDS)track.GetPath(7, MDIA, MINF,
                        STBL, STSD, MP4A, WAVE, ESDS);
            }
            if (avcc != null)
            {
                if (!BuildMOOVFrames(false)) return false;
            }
            foreach (var moof in _moof)
            {
                if (!BuildMOOFFrames(moof, true)) {
                    FATAL("Unable to build audio frames from MOOF");
                    return false;
                }
                if (!BuildMOOFFrames(moof, false)) {
                    FATAL("Unable to build video frames from MOOF");
                    return false;
                }
            }
            _frames.Sort(CompareFrames);
            if (esds != null)
            {
                MediaFrame audioHeader;
                audioHeader.Type = MediaFrameType.Audio;
                audioHeader.IsBinaryHeader = true;
                audioHeader.IsKeyFrame = true;
                audioHeader.Length = esds.ExtraDataLength;
                audioHeader.AbsoluteTime = 0;
                audioHeader.Start = (uint) esds.ExtraDataStart;
                audioHeader.DeltaTime = 0;
                audioHeader.CompositionOffset = 0;
                MediaFile.SeekTo(audioHeader.Start);
                var raw = MediaFile.Br.ReadBytes((int) audioHeader.Length);
                _streamCapabilities.InitAudioAAC(new MemoryStream(raw), raw.Length);
                 _frames.Add(audioHeader);
            }
            else
            {
                if ((track = GetTRAK(true)) != null)
                {
                    var mp3 = track.GetPath(5, MDIA, MINF,
                        STBL, STSD, MP3);
                    if (mp3 != null)
                    {
                        _streamCapabilities.AudioCodecId = AudioCodec.Mp3;
                    }
                }
            }
            if (avcc != null)
            {
                MediaFrame videoHeader;
                videoHeader.Type = MediaFrameType.Video;
                videoHeader.IsBinaryHeader = true;
                videoHeader.IsKeyFrame = true;
                videoHeader.Length = (uint) avcc.ExtraDataLength;
                videoHeader.AbsoluteTime = 0;
                videoHeader.Start = (uint) avcc.ExtraDataStart;
                videoHeader.DeltaTime = 0;
                videoHeader.CompositionOffset = 0;
                 MediaFile.SeekTo(videoHeader.Start);
                var raw = MediaFile.Br.ReadBytes((int) videoHeader.Length);
                if (raw.Length < 8)
                {
                    FATAL("Invalid AVC codec bytes");
                    return false;
                }
                var spsLength = raw.ReadUShort( 6);
                var ppsLength =  raw.ReadUShort(8+spsLength+1);
                var psps = new byte[spsLength];
                Buffer.BlockCopy(raw,8,psps,0,(int) spsLength);
                var pps = new byte[ppsLength];
                Buffer.BlockCopy(raw, 8 + spsLength + 3,psps,0,ppsLength);
                _streamCapabilities.InitVideoH264(psps,pps);
                 _frames.Add(videoHeader);
            }
           
            return true;
        }