Ejemplo n.º 1
0
        public override MediaFrame Depacketize(RtpPacket pkt)
        {
            MediaFrame frame = null;

            if (pkt != null)
            {
                frame = new MediaFrame
                {
                    Data = pkt.Payload.ToArray()
                };
            }

            return(frame);
        }
Ejemplo n.º 2
0
        public override MediaFrame Depacketize(RtpPacket pkt)
        {
            MediaFrame frame = null;

            if (pkt.Sequence != (lastSequence + 1))
            {
                logger.Warn("Bad sequence " + lastSequence + " != " + pkt.Sequence);
                // TODO:
                // Добавляем в буфер и пытаемся упорядочить
            }

            lastSequence = pkt.Sequence;
            bool newTimestampSequence = false;
            var  timestamp            = pkt.Timestamp;

            if (timestamp != RtpConst.NoTimestamp && timestamp != lastTimestamp)
            {
                if (lastTimestamp != RtpConst.NoTimestamp)
                {
                    var diff = (timestamp - lastTimestamp);
                    if (diff < 0)
                    { // TODO:
                    }

                    unwrappedTimestamp += diff;
                }

                lastTimestamp        = timestamp;
                newTimestampSequence = true;

                // logger.Warn(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ");
            }

            if (newTimestampSequence)
            { // группируем по временным меткам
              // т.е сервер должен передавать данные с правильным вр.метками иначе работать не будет...

                if (naluBuffer.Count > 0)
                {
                    var firstNalu = naluBuffer[0];

                    // все вр.метки должны быть одинаковые...
                    var naluTimestamp = firstNalu.timestamp;

                    var dataBuffer  = new List <byte[]>();
                    int totalLength = 0;
                    foreach (var nal in naluBuffer)
                    {
                        if (naluTimestamp != nal.timestamp)
                        {
                            logger.Warn("naluTimstamp  != nal.timestamp");
                        }

                        var data = nal.data;
                        dataBuffer.Add(data);
                        totalLength += data.Length;
                    }

                    //var dataBuffer = naluBuffer.Select(n => n.data);
                    //var totalLength = dataBuffer.Sum(n => n.Length);

                    var nalUnitData = new byte[totalLength];
                    int offset      = 0;
                    foreach (var data in dataBuffer)
                    {
                        Array.Copy(data, 0, nalUnitData, offset, data.Length);
                        offset += data.Length;
                    }

                    var naluTime = (naluTimestamp / (double)ClockRate);

                    frame = new MediaFrame
                    {
                        Data = nalUnitData,
                        Time = naluTime,
                    };

                    naluBuffer.Clear();
                }
            }

            if (naluBuffer.Count > 256)
            {
                if (timestamp == RtpConst.NoTimestamp || lastTimestamp == RtpConst.NoTimestamp ||
                    timestamp == 0 || lastTimestamp == 0)
                {// если не удается получить правильные вр.метки - сбрасываем буфер
                 // т.к декодировать не сгруппированные данные не все декодеры могу...

                    logger.Error("No valid timestamp received; drop buffer");
                    naluBuffer.Clear();
                }
            }

            NALUnit nalUnit = null;

            byte[] payload = pkt.Payload.ToArray();
            if (payload != null && payload.Length > 0)
            {
                nalUnit = ParseH264Payload(payload, unwrappedTimestamp);
            }

            if (nalUnit != null)
            {
                naluBuffer.Add(nalUnit);
            }

            return(frame);

            //if (data != null)
            //{
            //    frame = new MediaFrame
            //    {
            //        Data = data,
            //        Time = monotonicTime,
            //    };
            //}

            //return frame;
        }