public ParsedContent Read(Stream stream)
{
var processed = false;
var eos = false;
while (!eos)
{
var start_pos = stream.Position;
try {
switch (state)
{
case ReaderState.Header:
{
var bin = ReadBytes(stream, 13);
var header = new FileHeader(bin);
if (header.IsValid)
{
Logger.Info("FLV Header found");
contentBuffer.OnStart();
state = ReaderState.Body;
}
else
{
throw new BadDataException();
}
}
break;
case ReaderState.Body:
{
var bin = ReadBytes(stream, 11);
var read_valid = false;
var body = new FLVTag(bin);
if (body.IsValidHeader)
{
body.ReadBody(stream);
body.ReadFooter(stream);
if (body.IsValidFooter)
{
read_valid = true;
switch (body.Type)
{
case FLVTag.TagType.Audio:
contentBuffer.OnAudio(body.ToRTMPMessage());
break;
case FLVTag.TagType.Video:
contentBuffer.OnVideo(body.ToRTMPMessage());
break;
case FLVTag.TagType.Script:
contentBuffer.OnData(new RTMP.DataAMF0Message(body.ToRTMPMessage()));
break;
}
}
}
if (!read_valid)
{
stream.Position = start_pos;
var header = new FileHeader(ReadBytes(stream, 13));
if (header.IsValid)
{
Logger.Info("New FLV Header found");
read_valid = true;
contentBuffer.OnStart();
}
}
if (!read_valid)
{
throw new BadDataException();
}
}
break;
}
processed = true;
}
catch (EndOfStreamException) {
if (!processed)
{
throw;
}
stream.Position = start_pos;
eos = true;
}
catch (BadDataException) {
stream.Position = start_pos + 1;
}
}
return(contentBuffer.GetContents());
}