private byte[] Mixing(List <ReceivedRtp> list, ReceivedRtp baseitem, DelayedMil _delayedms) { byte[] mixedbytes = null; if (_delayedms == DelayedMil.i80o160) { int nseq = baseitem.seq * 2; ReceivedRtp _item0 = list.FirstOrDefault(x => x.seq == nseq); ReceivedRtp _item1 = list.FirstOrDefault(x => x.seq == nseq + 1); if (_item0 == null) { _item0 = new ReceivedRtp() { buff = new byte[332], seq = nseq, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } if (_item1 == null) { _item1 = new ReceivedRtp() { buff = new byte[332], seq = nseq + 1, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } // item2 + tmpitem mix with item1 and write byte[] tmpbuff = new byte[332]; Array.Copy(_item0.buff, 0, tmpbuff, 0, _item0.size); Array.Copy(_item1.buff, headersize, tmpbuff, _item0.size, (_item1.size - headersize)); ReceivedRtp _itm = new ReceivedRtp() { buff = tmpbuff, size = (_item0.size + _item1.size - headersize) }; mixedbytes = this.RealMix(_itm, baseitem); // util.WriteLogTest3(_delayedms.ToString() + " // codec: " + _item0.codec.ToString() + " // " + (_item0.size - 12) + " // basecodec: " + baseitem.codec + " // " + (baseitem.size - 12) + " // " + baseitem.seq + " // " + _item0.seq + " // " + _item1.seq, this.filename); lock (listIn) { listIn.RemoveAll(x => x.seq == _item0.seq); listIn.RemoveAll(x => x.seq == _item1.seq); } lock (listOut) { listOut.RemoveAll(x => x.seq == baseitem.seq); } } else if (_delayedms == DelayedMil.i160o80) { int nseq = baseitem.seq * 2; ReceivedRtp _item0 = list.FirstOrDefault(x => x.seq == nseq); ReceivedRtp _item1 = list.FirstOrDefault(x => x.seq == nseq + 1); if (_item0 == null) { _item0 = new ReceivedRtp() { buff = new byte[332], seq = nseq, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } if (_item1 == null) { _item1 = new ReceivedRtp() { buff = new byte[332], seq = nseq + 1, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } // item2 + tmpitem mix with item1 and write byte[] tmpbuff = new byte[332]; Array.Copy(_item0.buff, 0, tmpbuff, 0, _item0.size); Array.Copy(_item1.buff, headersize, tmpbuff, _item0.size, (_item1.size - headersize)); ReceivedRtp _itm = new ReceivedRtp() { buff = tmpbuff, size = (_item0.size + _item1.size - headersize) }; mixedbytes = this.RealMix(_itm, baseitem); // util.WriteLogTest3(_delayedms.ToString() + " // " + (baseitem.size - 12) + " // " + baseitem.seq + " // " + _item0.seq + " // " + _item1.seq, this.filename); lock (listIn) { listIn.RemoveAll(x => x.seq == baseitem.seq); } lock (listOut) { listOut.RemoveAll(x => x.seq == _item0.seq); listOut.RemoveAll(x => x.seq == _item1.seq); } } else if (_delayedms == DelayedMil.i80o240) { int nseq = baseitem.seq * 3; ReceivedRtp _item0 = list.FirstOrDefault(x => x.seq == nseq); ReceivedRtp _item1 = list.FirstOrDefault(x => x.seq == nseq + 1); ReceivedRtp _item2 = list.FirstOrDefault(x => x.seq == nseq + 2); if (_item0 == null) { _item0 = new ReceivedRtp() { buff = new byte[332], seq = nseq, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } if (_item1 == null) { _item1 = new ReceivedRtp() { buff = new byte[332], seq = nseq + 1, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } if (_item2 == null) { _item2 = new ReceivedRtp() { buff = new byte[332], seq = nseq + 2, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } // item2 + tmpitem mix with item1 and write byte[] tmpbuff = new byte[332]; Array.Copy(_item0.buff, 0, tmpbuff, 0, _item0.size); Array.Copy(_item1.buff, headersize, tmpbuff, _item0.size, _item1.size - headersize); Array.Copy(_item2.buff, headersize, tmpbuff, _item0.size + _item0.size - headersize, _item2.size - headersize); ReceivedRtp _itm = new ReceivedRtp() { buff = tmpbuff, size = _item0.size + _item1.size + _item2.size - headersize }; mixedbytes = this.RealMix(_itm, baseitem); // util.WriteLogTest3(_delayedms.ToString() + " // " + (baseitem.size - 12) + " // " + baseitem.seq + " // " + _item0.seq + " // " + _item1.seq + " // " + _item2.seq, this.filename); lock (listIn) { listIn.RemoveAll(x => x.seq == _item0.seq); listIn.RemoveAll(x => x.seq == _item1.seq); listIn.RemoveAll(x => x.seq == _item2.seq); } lock (listOut) { listOut.RemoveAll(x => x.seq == baseitem.seq); } } else if (_delayedms == DelayedMil.i240o80) { int nseq = baseitem.seq * 3; ReceivedRtp _item0 = list.FirstOrDefault(x => x.seq == nseq); ReceivedRtp _item1 = list.FirstOrDefault(x => x.seq == nseq + 1); ReceivedRtp _item2 = list.FirstOrDefault(x => x.seq == nseq + 2); if (_item0 == null) { _item0 = new ReceivedRtp() { buff = new byte[332], seq = nseq, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } if (_item1 == null) { _item1 = new ReceivedRtp() { buff = new byte[332], seq = nseq + 1, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } if (_item2 == null) { _item2 = new ReceivedRtp() { buff = new byte[332], seq = nseq + 2, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } // util.WriteLogTest3(_delayedms.ToString() + " // " + (baseitem.size - 12) + " // " + baseitem.seq + " // " + _item0.seq + " // " + _item1.seq + " // " + _item2.seq, this.filename); // item2 + tmpitem mix with item1 and write byte[] tmpbuff = new byte[332]; Array.Copy(_item0.buff, 0, tmpbuff, 0, _item0.size); Array.Copy(_item1.buff, headersize, tmpbuff, _item0.size, _item1.size - headersize); Array.Copy(_item1.buff, headersize, tmpbuff, _item0.size + _item1.size - headersize, _item2.size - headersize); ReceivedRtp _itm = new ReceivedRtp() { buff = tmpbuff, size = _item0.size + _item1.size + _item2.size - headersize }; mixedbytes = this.RealMix(_itm, baseitem); lock (listIn) { listIn.RemoveAll(x => x.seq == baseitem.seq); } lock (listOut) { listOut.RemoveAll(x => x.seq == _item0.seq); listOut.RemoveAll(x => x.seq == _item1.seq); listOut.RemoveAll(x => x.seq == _item2.seq); } } else if (_delayedms == DelayedMil.same) { ReceivedRtp _item = list.FirstOrDefault(x => x.seq == baseitem.seq); if (_item == null) { _item = new ReceivedRtp() { buff = new byte[332], seq = baseitem.seq, size = baseitem.size, ext = baseitem.ext, peer = baseitem.peer }; } mixedbytes = this.RealMix(_item, baseitem); // util.WriteLogTest3(_delayedms.ToString() + " // " + (baseitem.size - 12) + " // " + baseitem.seq + " // " + _item.seq, this.filename); lock (listIn) { listIn.RemoveAll(x => x.seq == _item.seq); } lock (listOut) { listOut.RemoveAll(x => x.seq == baseitem.seq); } } return(mixedbytes); }
private byte[] Mixing(List<ReceivedRtp> list, ReceivedRtp baseitem, DelayedMil _delayedms) { byte[] mixedbytes = null; if (_delayedms == DelayedMil.i80o160) { int nseq = baseitem.seq * 2; ReceivedRtp _item0 = list.FirstOrDefault(x => x.seq == nseq); ReceivedRtp _item1 = list.FirstOrDefault(x => x.seq == nseq + 1); if (_item0 == null) { _item0 = new ReceivedRtp() { buff = new byte[332], seq = nseq, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } if (_item1 == null) { _item1 = new ReceivedRtp() { buff = new byte[332], seq = nseq + 1, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } // item2 + tmpitem mix with item1 and write byte[] tmpbuff = new byte[332]; Array.Copy(_item0.buff, 0, tmpbuff, 0, _item0.size); Array.Copy(_item1.buff, headersize, tmpbuff, _item0.size, (_item1.size - headersize)); ReceivedRtp _itm = new ReceivedRtp() { buff = tmpbuff, size = (_item0.size + _item1.size - headersize) }; mixedbytes = this.RealMix(_itm, baseitem); // util.WriteLogTest3(_delayedms.ToString() + " // codec: " + _item0.codec.ToString() + " // " + (_item0.size - 12) + " // basecodec: " + baseitem.codec + " // " + (baseitem.size - 12) + " // " + baseitem.seq + " // " + _item0.seq + " // " + _item1.seq, this.filename); lock (listIn) { listIn.RemoveAll(x => x.seq == _item0.seq); listIn.RemoveAll(x => x.seq == _item1.seq); } lock (listOut) { listOut.RemoveAll(x => x.seq == baseitem.seq); } } else if (_delayedms == DelayedMil.i160o80) { int nseq = baseitem.seq * 2; ReceivedRtp _item0 = list.FirstOrDefault(x => x.seq == nseq); ReceivedRtp _item1 = list.FirstOrDefault(x => x.seq == nseq + 1); if (_item0 == null) { _item0 = new ReceivedRtp() { buff = new byte[332], seq = nseq, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } if (_item1 == null) { _item1 = new ReceivedRtp() { buff = new byte[332], seq = nseq + 1, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } // item2 + tmpitem mix with item1 and write byte[] tmpbuff = new byte[332]; Array.Copy(_item0.buff, 0, tmpbuff, 0, _item0.size); Array.Copy(_item1.buff, headersize, tmpbuff, _item0.size, (_item1.size - headersize)); ReceivedRtp _itm = new ReceivedRtp() { buff = tmpbuff, size = (_item0.size + _item1.size - headersize) }; mixedbytes = this.RealMix(_itm, baseitem); // util.WriteLogTest3(_delayedms.ToString() + " // " + (baseitem.size - 12) + " // " + baseitem.seq + " // " + _item0.seq + " // " + _item1.seq, this.filename); lock (listIn) { listIn.RemoveAll(x => x.seq == baseitem.seq); } lock (listOut) { listOut.RemoveAll(x => x.seq == _item0.seq); listOut.RemoveAll(x => x.seq == _item1.seq); } } else if (_delayedms == DelayedMil.i80o240) { int nseq = baseitem.seq * 3; ReceivedRtp _item0 = list.FirstOrDefault(x => x.seq == nseq); ReceivedRtp _item1 = list.FirstOrDefault(x => x.seq == nseq + 1); ReceivedRtp _item2 = list.FirstOrDefault(x => x.seq == nseq + 2); if (_item0 == null) { _item0 = new ReceivedRtp() { buff = new byte[332], seq = nseq, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } if (_item1 == null) { _item1 = new ReceivedRtp() { buff = new byte[332], seq = nseq + 1, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } if (_item2 == null) { _item2 = new ReceivedRtp() { buff = new byte[332], seq = nseq + 2, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } // item2 + tmpitem mix with item1 and write byte[] tmpbuff = new byte[332]; Array.Copy(_item0.buff, 0, tmpbuff, 0, _item0.size); Array.Copy(_item1.buff, headersize, tmpbuff, _item0.size, _item1.size - headersize); Array.Copy(_item2.buff, headersize, tmpbuff, _item0.size + _item0.size - headersize, _item2.size - headersize); ReceivedRtp _itm = new ReceivedRtp() { buff = tmpbuff, size = _item0.size + _item1.size + _item2.size - headersize }; mixedbytes = this.RealMix(_itm, baseitem); // util.WriteLogTest3(_delayedms.ToString() + " // " + (baseitem.size - 12) + " // " + baseitem.seq + " // " + _item0.seq + " // " + _item1.seq + " // " + _item2.seq, this.filename); lock (listIn) { listIn.RemoveAll(x => x.seq == _item0.seq); listIn.RemoveAll(x => x.seq == _item1.seq); listIn.RemoveAll(x => x.seq == _item2.seq); } lock (listOut) { listOut.RemoveAll(x => x.seq == baseitem.seq); } } else if (_delayedms == DelayedMil. i240o80) { int nseq = baseitem.seq * 3; ReceivedRtp _item0 = list.FirstOrDefault(x => x.seq == nseq); ReceivedRtp _item1 = list.FirstOrDefault(x => x.seq == nseq + 1); ReceivedRtp _item2 = list.FirstOrDefault(x => x.seq == nseq + 2); if (_item0 == null) { _item0 = new ReceivedRtp() { buff = new byte[332], seq = nseq, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } if (_item1 == null) { _item1 = new ReceivedRtp() { buff = new byte[332], seq = nseq + 1, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } if (_item2 == null) { _item2 = new ReceivedRtp() { buff = new byte[332], seq = nseq + 2, size = 92, ext = baseitem.ext, peer = baseitem.peer }; } // util.WriteLogTest3(_delayedms.ToString() + " // " + (baseitem.size - 12) + " // " + baseitem.seq + " // " + _item0.seq + " // " + _item1.seq + " // " + _item2.seq, this.filename); // item2 + tmpitem mix with item1 and write byte[] tmpbuff = new byte[332]; Array.Copy(_item0.buff, 0, tmpbuff, 0, _item0.size); Array.Copy(_item1.buff, headersize, tmpbuff, _item0.size, _item1.size - headersize); Array.Copy(_item1.buff, headersize, tmpbuff, _item0.size + _item1.size - headersize, _item2.size - headersize); ReceivedRtp _itm = new ReceivedRtp() { buff = tmpbuff, size = _item0.size + _item1.size + _item2.size - headersize }; mixedbytes = this.RealMix(_itm, baseitem); lock (listIn) { listIn.RemoveAll(x => x.seq == baseitem.seq); } lock (listOut) { listOut.RemoveAll(x => x.seq == _item0.seq); listOut.RemoveAll(x => x.seq == _item1.seq); listOut.RemoveAll(x => x.seq == _item2.seq); } } else if (_delayedms == DelayedMil.same) { ReceivedRtp _item = list.FirstOrDefault(x => x.seq == baseitem.seq); if (_item == null) { _item = new ReceivedRtp() { buff = new byte[332], seq = baseitem.seq, size = baseitem.size, ext = baseitem.ext, peer = baseitem.peer }; } mixedbytes = this.RealMix(_item, baseitem); // util.WriteLogTest3(_delayedms.ToString() + " // " + (baseitem.size - 12) + " // " + baseitem.seq + " // " + _item.seq, this.filename); lock (listIn) { listIn.RemoveAll(x => x.seq == _item.seq); } lock (listOut) { listOut.RemoveAll(x => x.seq == baseitem.seq); } } return mixedbytes; }
private void MixRtp(MixType mixtype) { if (timer != null) { timer.Enabled = false; } if (listIn == null || listOut == null) { return; } List <ReceivedRtp> linin = null; List <ReceivedRtp> linout = null; lock (listIn) { linin = new List <ReceivedRtp>(listIn); } lock (listOut) { linout = new List <ReceivedRtp>(listOut); } //Com.Huen.Libs.SortRtpSeq sorting = new Com.Huen.Libs.SortRtpSeq(); //linin.Sort(sorting); //linout.Sort(sorting); linin.OrderBy(x => x.seq); linout.OrderBy(x => x.seq); var itemIn = linin.FirstOrDefault(); var itemOut = linout.FirstOrDefault(); DelayedMil _delayedms = DelayedMil.same; if (itemIn == null || itemOut == null) { return; } else { byte[] mixedbytes = null; float times = 0.8f; if ((itemIn.size - headersize) == 80 && (itemOut.size - headersize) == 160) { _delayedms = DelayedMil.i80o160; float xtimes = (float)linin.Count / (float)(linout.Count * 2); int _count = 0; if (xtimes >= 1) { _count = mixtype == MixType.NORMAL ? (int)(linout.Count * times) : linout.Count; } else { _count = mixtype == MixType.NORMAL ? (int)((((float)linout.Count) * xtimes) * times) : (int)(((float)linout.Count) * xtimes); } for (int i = 0; i < _count; i++) { mixedbytes = this.Mixing(linin, linout[i], _delayedms); this.WaveFileWriting(mixedbytes); } } else if ((itemIn.size - headersize) == 160 && (itemOut.size - headersize) == 80) { _delayedms = DelayedMil.i160o80; float xtimes = (float)linout.Count / (float)(linin.Count * 2); int _count = 0; if (xtimes >= 1) { _count = mixtype == MixType.NORMAL ? (int)(linout.Count * times) : linout.Count; } else { _count = mixtype == MixType.NORMAL ? (int)((((float)linout.Count) * xtimes) * times) : (int)(((float)linout.Count) * xtimes); } for (int i = 0; i < _count; i++) { mixedbytes = this.Mixing(linout, linin[i], _delayedms); this.WaveFileWriting(mixedbytes); } } else if ((itemIn.size - headersize) == 80 && (itemOut.size - headersize) == 240) { _delayedms = DelayedMil.i80o240; float xtimes = (float)linin.Count / (float)(linout.Count * 3); int _count = 0; if (xtimes >= 1) { _count = mixtype == MixType.NORMAL ? (int)(linout.Count * times) : linout.Count; } else { _count = mixtype == MixType.NORMAL ? (int)((((float)linout.Count) * xtimes) * times) : (int)(((float)linout.Count) * xtimes); } for (int i = 0; i < _count; i++) { mixedbytes = this.Mixing(linin, linout[i], _delayedms); this.WaveFileWriting(mixedbytes); } } else if ((itemIn.size - headersize) == 240 && (itemOut.size - headersize) == 80) { _delayedms = DelayedMil.i240o80; float xtimes = (float)linout.Count / (float)(linin.Count * 3); int _count = 0; if (xtimes >= 1) { _count = mixtype == MixType.NORMAL ? (int)(linout.Count * times) : linout.Count; } else { _count = mixtype == MixType.NORMAL ? (int)((((float)linout.Count) * xtimes) * times) : (int)(((float)linout.Count) * xtimes); } for (int i = 0; i < _count; i++) { mixedbytes = this.Mixing(linout, linin[i], _delayedms); this.WaveFileWriting(mixedbytes); } } else if (itemIn.size == itemOut.size) { _delayedms = DelayedMil.same; float xtimes = (float)linin.Count / (float)linout.Count; int _count = 0; if (xtimes >= 1) { _count = mixtype == MixType.NORMAL ? (int)(linout.Count * times) : linout.Count; } else { _count = mixtype == MixType.NORMAL ? (int)((((float)linout.Count) * xtimes) * times) : (int)(((float)linout.Count) * xtimes); } for (int i = 0; i < _count; i++) { mixedbytes = this.Mixing(linin, linout[i], _delayedms); this.WaveFileWriting(mixedbytes); } } } if (timer != null) { timer.Enabled = true; } }