ZLMediaKit Rtp包处理Seq的方式(一)

调用关系关系

RtpMultiReceiver::handleOneRtp => RtpTrack::inputRtp => PacketSortor::sortPacket

// RtpTrack::inputRtp
...
onBeforeRtpSorted(rtp);
sortPacket(rtp->getSeq(), rtp);
...

主要函数

PacketSortor::sortPacket

void sortPacket(SEQ seq, T packet) {
    _latest_seq = seq;
    if (!_started) {
        // 记录第一个seq
        _started = true;
        _last_seq_out = seq - 1;
    }
    // next_seq为记录的seq+1
    auto next_seq = static_cast<SEQ>(_last_seq_out + 1);
    // 判断收到的seq是否等于记录的seq+1
    if (seq == next_seq) {
        // 收到下一个seq
        output(seq, std::move(packet));
        // 清空连续包列表
        flushPacket();
        return;
    }

    // 此处开始的逻辑为异常情况

    // seq小于next_seq 且不为回环包,直接跳过此包,认为seq错误
    if (seq < next_seq && !mayLooped(next_seq, seq)) {
        // 无回环风险, 过滤seq回退包
        return;
    }
    // seq>next_seq || seq<next_seq 且为回环的情况
    // 放入缓冲区
    _pkt_sort_cache_map.emplace(seq, std::move(packet));

    // 判断需要强行清空缓冲区
    if (needForceFlush(seq)) {
        forceFlush(next_seq);
    }
}

_lastest_seq 记录当前输入的 seq 值
_last_seq_out记录上一次合规输入的 seq 值

PacketSortor::mayLooped

bool mayLooped(SEQ last_seq, SEQ now_seq) {
    return last_seq > SEQ_MAX - _max_distance
        || now_seq < _max_distance;
}

此函数为判断是否可能未回环包的逻辑,通常情况是 seq 超过了类型的最大值,导致重新置为较小的值。

_max_distance 设定为一个阈值

有两种情况,在此函数中判断可能是回环包

  1. 上一个记录的 seq 值较大,接近SEQ_MAX
  2. 当前的 seq 值较小

PacketSortor::output

void output(SEQ seq, T packet) {
    auto next_seq = static_cast<SEQ>(_last_seq_out + 1);
    if (seq != next_seq) {
        WarnL << "packet dropped: " << next_seq << " -> " << static_cast<SEQ>(seq - 1)
              << ", latest seq: " << _latest_seq
              << ", jitter buffer size: " << _pkt_sort_cache_map.size()
              << ", jitter buffer ms: " << _ticker.elapsedTime();
    }
    // 记录seq值
    _last_seq_out = seq;
    _cb(seq, std::move(packe);
    // 重置定时器
    _ticker.resetTime();
}

此函数用于正常 seq 的包后的处理

  1. 记录包的 seq 值
  2. 重置定时器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值