private TsPacketizedElementaryStream CreatePacketizedElementaryStream(TsStreamType streamType, uint pid, IMediaStreamMetadata mediaStreamMetadata) { IStreamBuffer streamBuffer = this._bufferingManager.CreateStreamBuffer(streamType); MediaStream mediaStream = (MediaStream)null; PesStreamHandler pesHandler = this._pesHandlers.GetPesHandler(streamType, pid, mediaStreamMetadata, (Action <TsPesPacket>)(packet => { if (null != mediaStream) { mediaStream.EnqueuePacket(packet); } else { if (null == packet) { return; } this._tsPesPacketPool.FreePesPacket(packet); } })); TsPacketizedElementaryStream elementaryStream = new TsPacketizedElementaryStream(this._bufferPool, this._tsPesPacketPool, new Action <TsPesPacket>(pesHandler.PacketHandler), streamType, pid); IConfigurationSource configurator = pesHandler.Configurator; if (null != configurator) { EventHandler configuratorOnConfigurationComplete = (EventHandler)null; configuratorOnConfigurationComplete = (EventHandler)((o, e) => { configurator.ConfigurationComplete -= configuratorOnConfigurationComplete; this.CheckConfigurationComplete(); }); configurator.ConfigurationComplete += configuratorOnConfigurationComplete; } mediaStream = new MediaStream(configurator, streamBuffer, new Action <TsPesPacket>(this._tsPesPacketPool.FreePesPacket)); this.AddMediaStream(mediaStream); this._tsTimemestamp.RegisterMediaStream(mediaStream, new Func <TsPesPacket, TimeSpan?>(pesHandler.GetDuration)); if (null == configurator) { this.CheckConfigurationComplete(); } return(elementaryStream); }