Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
        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;
            }
        }