简介
本篇文章介绍Licode是怎么做时域+空域svc的丢包的,所有的代码都是集中在QualityFilterHandler.cpp
中。不包含弱网自动降级的策略,弱网自动降级会在在接下来文章介绍。
时域 svc:可以删掉不同时域层级的帧,最后表现出来的就是帧率不一样。
空域 svc:可以删掉不同空域层级的帧,不同空域的分辨率不一样。空域svc有两种,大小流的空域svc和单流的空域svc。
流程
licode中大概流程如下图。总结就是:判断当前包不属于当前时域或者当前空域我们就把它丢弃。
详细
开启
licode通过detectVideoScalability
这个函数判断是否需要开启丢帧的功能。
void QualityFilterHandler::detectVideoScalability(const std::shared_ptr<DataPacket> &packet) {
//如果已经开启了,直接返回
if (is_scalable_ || packet->type != VIDEO_PACKET) {
return;
}
//当这个包rid不等于0
//时域属于1
//空域属于1
if (packet->rid != "0" ||
packet->belongsToTemporalLayer(1) ||
packet->belongsToSpatialLayer(1)) {
is_scalable_ = true;
quality_manager_->enable();
}
}
从上面代码可以看到,is_scalable_
是用于标记是否开启该功能。
当有以下情况时is_scalable_
会被标记为true:
-
收到rid为非0的包,也就是除了rid == 0 的流还有rid != 0的流。这种情况代表了开启了simulcast,可以做空域的svc。
-
通过
belongsToSpatialLayer
判断当前包属于空域1。这种情况包含非simulcast的空域svc,在一些视频编码格式(如vp9)中不需要由大小流做svc,一个视频流中有空域的svc层。 -
通过
belongsToTemporalLayer
判断当前包属于时域1,具有时域的svc。
在上面3种情况下,会开启svc的功能。
并且会调用quality_manager_->enable()
这个函数,开启了自动降级的策略,自动降级的策略简要的说:当带宽探测发现当前的带宽不足以发送当前码率视频时,会开启自动降低时域或者空域的码率。
准备切换
在切时域和空域的时候分为准备和进行。在checkLayers
函数中会去拿quality_manager_
的结果,用于判断是否需要准备切换时域或者空域。
void QualityFilterHandler::checkLayers() {
// 从弱网降级模块获取当前最新的空域层级
int new_spatial_layer = quality_manager_->getSpatialLayer();
// 当弱网降级模块给的空域层级不是当前的层级 && 没有正在改变层级
if