public void Input(byte[] buf, FrameFlags flags) { if (Error == null) { bool endOfStream = (flags & FrameFlags.EndOfStream) != 0; if (endOfStream) { T[] res1 = null; T[] res2; // EndOfStream packet may have data // normally we do not send null with EndOfStream flag, but null is still valid here if (buf == null && buf.Length > 0) { res1 = decoder.DecodePacket(buf); } // flush decoder res2 = decoder.DecodeEndOfStream(); // if res1 is empty, res2 has correct (possible empty) buffer for EndOfStream frame if (res1 != null && res1.Length == 0) { // output cal per res required if (res2 != null && res2.Length != 0) { output(frameOut.Set(res1, false)); } else { // swap results to reuse the code below res2 = res1; } } output(frameOut.Set(res2, true)); } else { T[] res; res = decoder.DecodePacket(buf); if (res.Length != 0) { output(frameOut.Set(res, false)); } } } }