예제 #1
0
        public async Task <Message> DemultiplexFlvAsync(CancellationToken ct = default)
        {
            byte[] bodyBuffer = null;

            try
            {
                var header = await ReadHeader(ct);

                bodyBuffer = _arrayPool.Rent((int)header.MessageLength);
                if (!_factories.TryGetValue(header.MessageType, out var factory))
                {
                    throw new InvalidOperationException();
                }

                await _stream.ReadBytesAsync(bodyBuffer.AsMemory(0, (int)header.MessageLength), ct);

                var context = new Networking.Rtmp.Serialization.SerializationContext()
                {
                    Amf0Reader = _amf0Reader,
                    Amf3Reader = _amf3Reader,
                    ReadBuffer = bodyBuffer.AsMemory(0, (int)header.MessageLength)
                };

                var message = factory(header, context, out var consumed);
                context.ReadBuffer    = context.ReadBuffer.Slice(consumed);
                message.MessageHeader = header;
                message.Deserialize(context);
                _amf0Reader.ResetReference();
                _amf3Reader.ResetReference();
                return(message);
            }
            finally
            {
                if (bodyBuffer != null)
                {
                    _arrayPool.Return(bodyBuffer);
                }
            }
        }