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;
}