Code Monkey home page Code Monkey logo

razor's Introduction

razor

A google's congestion Control Algorithm razor是一个GCC算法实现项目,主体算法来源于webRTC的CC实现,主要了解决点对点视频传输过程中网络拥塞的问题。razor是通过传输的延迟间隔来评估网络的过载与拥塞, 然后通过一个带宽调整控制器(aimd)来决策合适的码率进行视频通信。razor没有继承复杂的webRTC接口,而是将它设置在点对点视频通信的范畴。开发者可以仅仅使用razor 库和自己的传输协议来构建自己的传输体系,也可以直接使用它提供的sim transport传输系统来进行通信,这里需要说明的是sim transport还没有正式线上环境使用过,协议 的安全性没有经受过严格的考验,使用时需谨慎。

编译

下载

  git clone https://github.com/yuanrongxi/razor.git

编译

  用visual studio 2013打开project目录下的工程就可以直接编译,这个工程环境下有单元测试文件,可以进行代码选择修改,
  进行单元测试。

测试

要进行razor的整体测试,需要编译sim transport模块,这里有两个工程,是sim_test下sim_sender和sim_receiver,用visual studio就可以直接进行编译运行。这 两个工程需要配合起来使用,在sim_sender工程代码中填写sim receiver的IP地址和端口,就可以进行通信测试了。如果需要模拟网络,需要relay配合。假如运行sim sender 和receiver机器的IP地址为192.168.1.100,relay机器的IP地址192.168.1.200:6009,那么步骤如下:

在Linux下运行relay:

  ./sim_relay 192.168.1.100:16000 192.168.1.100:16001

运行receiver

  在visual studio下运行receiver

运行sender

  在visual studio中修改sim sender中的sim_sender_test.cpp
	if (sim_connect(1000, "192.168.1.200", 6009) != 0){
	    printf("sim connect failed!\n");
	    goto err;
    }
  修改后直接编译运行即可.

PS:也可以在linux下运行sim sender和sim receiver,直接在他们的目录下make即可编译。

echo

echo是一个windows下的测试程序,它据有视频传输的所有功能,需要在windows下进行编译,依赖于dshow,它同样需要relay来配合。测试步骤如下:

运行relay

在Linux下直接运行 ./sim_relay

编译echo

在visual studio下打开sim_test目录下的echo工程,直接编译

运行echo

在echo UI上将receiver ip地址填写为:192.168.1.200:6009,点击start echo按钮即可

GCC与BBR的对比(来自nkcubert的贡献)

测试条件

操作系统环境:VMWare虚拟机(win10)限定网速

最大视频编码码率:400kBps

测试结果

avatar

微信交流

入群交流请加微信zerok775

razor's People

Contributors

geckoops avatar nullcore1024 avatar vgoss avatar xsbzxl avatar yuanrongxi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

razor's Issues

音视频同步问题

试用了您的代码传输实时视频效果非常好。但是有一个问题请教您,razor在内部做了播放控制,丢包率高,播放延时会变大,那怎么和音频流同步呢?

性能测试报告

我有一个小小的想法。不知道作者有没有相关的性能测试报告,如带宽评估的准确性,收敛速度(包括大到小,小到大),以及与其他TCP、UDP流的竞争等。

我觉得如果有这样的报告的话,应该会有更多的人集成这个standalone的CC,进一步会有更多的人参与到仓库的开发中来。

使用BBR算法实现视频传输

袁老师您好,我最近一直在看razor项目和bbr算法。我有一个小问题,就是项目代码里哪些是原本的bbr算法,哪些是结合视频传输做的改进。因为bbr算法本身只是拥塞控制,与传输的数据无关。
我看了bbr部分的代码,感觉bbr_controller.c 是原本bbr状态机转换的实现,和视频传输无关。
bbr_sender.c里面是结合视频传输做的改进。在bbr_sender.c里面对编码器速率target_bitrate进行了aimd决策,然后返回通信层,把码率传给协议。然后问题是aimd决策只是一个控制码率的初步实现,还可以换成其他控制算法?
最后heartbeat()函数应该也不是bbr原本部分,而是借鉴gcc做的改进,作用是每5ms发送一次数据。
我可能理解有不对的地方,还请袁老师多多指正。

bbr的反馈输入问题

在bbr的使用中,要进行ack的输入。想问下,这个ack是自己做吗?如果在webrtc的这种场景,这个ack或者说rtt是通过什么来进行计算?如果是webrtc中的transport-cc的话,这个扩展不是不能很精确地计算哪几个包的ack吗?

razor sender被限制带宽后,以及放开限制后的行为

袁老师,您好。我在局域网两个windowsPC里使用sim receiver, sim sender相互发包,中间串联一个网络损伤仪。正常不限制情况下,remb或BBR算法下,sim sender可以跑到6M且比较稳定,当我限制一个方向的带宽到2M时,sim_sender会快速落到2M左右,但是统计显示会有很大的丢包率(60到100之间),然后sim sender发送带宽和速率进一步下降,最终停留在150K左右。当我放开带宽时,此时sim sender并未恢复,还是保持在150K。 所以,我想请教:remb或BBR是不是能够出当前可用带宽值,感觉我们的sim test是可以调整发包速率让其等于带宽,从而稳定,但是测试结果为什么是这样的呢?
同时,我发现GCC找到可用带宽然后稳定下来的能力更强一些,但是,三种算法(GCC, BBR, REMB)都不能在限制取消后恢复发送速率。想问一下袁老师,从razor的原理上看,是不是本身也不支持这样的带宽恢复功能呢?

这个项目可以再linux下面编译使用吗

袁老师,

您好,我想请问一下,这个项目有可能在Linux下面使用吗?

我看这里好像用到了很多Windows下面的东西,而且也没有Linux下面的编译文件。如果我想换到Linux下面使用会不会很麻烦呢?

请教下media mediabuget这段代码的工作原理?

uint32_t pacer_queue_target_bitrate_kbps(pacer_queue_t* que, int64_t now_ts)
{
uint32_t ret = 0, space;

if (que->oldest_ts != -1 && now_ts > que->oldest_ts){
	space = (uint32_t)(now_ts - que->oldest_ts);
	if (space >= que->max_que_ms)
		space = 500;
	else
		space = que->max_que_ms - space;
}
else
	space = que->max_que_ms - 1;

/*计算缓冲区在500毫秒之内要发送完毕所需的带宽*/
if (skiplist_size(que->cache) > 0 && que->total_size > 0)
	ret = que->total_size * 8 / space; //每毫秒需要发送的bits

return ret;

}

老大,请教下,这行代码,为什么是500毫秒?

还有:
now_ts - que->oldest_ts;

que->oldest_ts应该是代表的发送的第一帧的时间戳把,也就是:
now_ts - que->oldest_ts;
如果是第100帧,400,600,等等,未来的某些时刻,这个space就永远为500了?

返回最小比特率问题

袁老师:
uint32_t sender_estimation_get_min_bitrate(sender_estimation_t* est)
{
return est->max_conf_bitrate;
}
是不是应该是return est->min_conf_bitrate,谢谢

bugs found

sender_cc_create
{
cc->bitrate_controller = bitrate_controller_create(cc, sender_cc_on_change_bitrate);//line 41
cc->pacer = pace_create(handler, send_cb);
}
pacer is called before its created in sender_cc_on_change_bitrate, and segemnt fault.

{
cc->pacer = pace_create(handler, send_cb);
cc->bitrate_controller = bitrate_controller_create(cc, sender_cc_on_change_bitrate);
}

echo的输出日志问题

袁老师你好:
对于echo测试程序输出的日志中,send bandwidth = 141kb/s, recv bandwidth = 82kb/s, video rate = 88kb/s,不过利用带宽测试工具测试得到的值这边的单位好像应该是kB/s,想问下echo测试输出的单位是否是kB/s。麻烦了!

这个项目的目标是什么

想知道这个项目只是做测试各种流控算法使用,还是说未来可以达到商用级别,做一个稳定高效的音视频传输库使用

sim_recever与sim_sender的编译问题

recever上编译出现问题:
1>razor.lib(sender_congestion_controller.obj) : error LNK2019: 无法解析的外部符号 _cc_feedback_adapter_init,该符号在函数 _sender_cc_create 中被引用
1>razor.lib(sender_congestion_controller.obj) : error LNK2019: 无法解析的外部符号 _cc_feedback_adapter_destroy,该符号在函数 _sender_cc_destroy 中被引用
1>razor.lib(sender_congestion_controller.obj) : error LNK2019: 无法解析的外部符号 _cc_feedback_add_packet,该符号在函数 _sender_on_send_packet 中被引用
1>razor.lib(sender_congestion_controller.obj) : error LNK2019: 无法解析的外部符号 _cc_feedback_on_feedback,该符号在函数 _sender_on_feedback 中被引用
1>G:\码率自适应\razor-master\razor-master\sim_test\sim_receiver\Debug\sim_receiver.exe : fatal error LNK1120: 4 个无法解析的外部命令
sender:
sim_connect()函数不接受三个参数,是否要传入六个参数
请问老师该怎么解决呀?

razor可以切换到x64位运行吗

袁老师,

您好,我想请问一下,razor可以切换到x64位运行吗?

因为需要调用64位的模型,将razor切换到x64平台的时候运行会报错。希望袁老师能给一点建议,非常感谢!

BDP问题

袁老师您好,请教一下。我注意到bbr模块中pacer发送把原本的拥塞窗口控制给关掉了。这方面有什么考量么?

请教下袁老师关于普通帧丢失的设计方面的思路

袁老师,研究了razor一段时间,有一些设计上的思路没有整理明白。

针对接收端的情况:

比如我们接受到的帧是: 1,2,3,4,8,9,10,11.

中间4-8出现了丢帧情况,对于关键帧丢帧,每次在接收到数据后,都会做对应的检测。

但是普通的非关键帧丢帧了。

我看了main_event_loop中,取帧基本都是min_fid+1,一次取的。

因此想请教下袁老师,和各位在研究的大佬,普通帧丢失了,咱这边的业务逻辑是怎么进行处理的?

协议标准化问题

感谢您的贡献,想使用您的代码实现实时视频传输,首先要将协议改为RTP,您的私有协议中携带了帧序号,帧分包数,帧分包序号。这些若填入扩展头就不能与其他设备互通了,有办法解决吗?比如不传输改为在接收端判断,能做到吗?

求助

image
你好,在vs2013上编译的时候遇到这个问题,请问是什么原因,刚开始学习,还望大神指点一下,问题比较低级,还望大神谅解

test_pacer_queue执行就崩溃

commit 953568159c3034363f4bf69a4ad9a27755f05752 Author: rongxi.yuan <[email protected]> Date: Fri Aug 17 11:01:53 2018 +0800

这个版本,编译出来的test程序,test_pacer_queue,代码有问题。
pacer_queue_sent(&que, pos);

传入的pos是int,需要的是packet_event_t *

关于接收缓冲区的播放问题

袁老师你好:
对于sim_frame_cache_t里面的几个时戳字段区分不怎么清楚,也就是play_frame_ts, max_ts, frame_ts, play_ts,能解释一下各自的用途和使用方法吗?另外,这个real_video_cache_sync_timestamp的作用也不明白,其中用到的c->f这个系数有什么说法吗?谢谢,麻烦了!

不限制带宽下RTT增大

袁老师,不知您是否碰见过这种情况:
测试razor的时候,在不限制带宽的,rtt在开始的一段时间是正常大概在10ms左右,但是运行一段时间之后rtt会上升到100~300ms,然后持续在这一个阶段,不知什么原因。

为什么设置丢包率为1呢?

袁老师您好:
请问为什么在文件sim_sender.c的函数sim_send_packet中,当padding == 1的时候,在发送完padding包之后,为什么要把丢包率设置为1呢?
就是这段代码:
if(s->loss_fraction == 0)
s->loss_fraction = 1;

谢谢

公平性问题

袁老师,您好!
我使用了Razor的GCC算法,多条流往同一个目的IP发包,尝试对这个目的IP所在的网络进行带宽限制,观察到这样的结果:1、当可用总带宽比较小时,比如2Mbit,2条流基本能够均分,3Mbit,3条流能够基本均分;2、若可用带宽加大,4Mbit,2条流不能均分(一个获得3Mbit左右,另一个获得几百Kbit),6Mbit,3条流不能均分(一个获得4Mbit左右,另2个都大致获得几百Kbit)。
所以,我观察的现象是,当总带宽较小时(每条流平均1M),多流均分似乎符合预期;当总带宽稍大时,多流不能均分,总是有一个特大流,其余流为小流,且流量基本相等。
想请教下袁老师,关于多流竞争带宽均分问题,Razor是不是存在这样的问题呢?

estimator_proxy_incoming

这个函数,是不是有些错误,我测试数据包接收的时候,对这个函数执行前后,打时戳,有时候出现一个很大的时间差108215(ms)
for (i = 0; i < num; ++i){
key.i64 = sequence;
skiplist_remove(proxy->arrival_times, key);
}
偶尔这个 num的值很大,例如781168441,可是我只发送了20多个包。

solution:
int num=0, i;//line 44

在丢包环境下target_rate估不上去

袁老师好,我在私有协议中集成razor以后测试bbr,发现在丢包网络下target_rate估不上去。

我用tc设置的网络,发送方向模拟30%丢包10M带宽。

sudo tcset --direction outgoing  --loss 30% wlp0s20f3 --rate 10Mbps

image

第一行是razor在razor_sender_create中传入的回调函数中返回的bitrate
第二行是我统计的实际送入udp socket的速率。

为什么会出现这种情况,按照我的理解,bbr应该对丢包不敏感,不应该出现估计带宽低于实际发送带宽的情况吧?

提前感谢袁老师!

这是不是一个书写错误

袁老师,trendline.c文件中。
void trendline_update(trendline_estimator_t* est, double recv_delta_ms, double send_delta_ms, int64_t arrival_ts)
{
double delta_ms = recv_delta_ms - send_delta_ms;
delay_hist_t* hist;

est->num_of_deltas++;
if (est->num_of_deltas > TRENDLINE_MAX_COUNT)
	est->num_of_deltas = est->num_of_deltas;    //这一行!
  ……
  ……

}
上面标的那一行是不是应该为est->num_of_deltas = TRENDLINE_MAX_COUNT,我看卡尔曼滤波中就是赋值了TRENDLINE_MAX_COUNT ?

请教一个关于rtt计算的理论问题

最近空下来了,看了下袁总的文章,
https://mp.weixin.qq.com/s/Ej63-FTe5-2pkxyXoXBUTw

写的相当棒。

晚上看好看到了计算rtt的部分.

每次发送端发送ack后,服务端会发送对应的SIM_SEG_ACK应答.

函数sim_sender_ack代码片段:
` /计算RTT/
now_ts = GET_SYS_MS();

key.u32 = ack->acked_packet_id;
iter = skiplist_search(sender->cache, key);
if (iter != NULL){
	seg = (sim_segment_t*)iter->val.ptr;
	//发送时间为: [ seg->timestamp(帧产生的时间) + seg->send_ts ](帧的发送时间) + sender->first_ts ,转为绝对时间
	//假设接收端是收到这个包了立刻就发送回来的:
	//那么RTT = now_ts - seg->timestamp - seg->send_ts -> sender->first_ts ;
	if (now_ts > seg->timestamp + seg->send_ts + sender->first_ts)//把相对时间转为绝对时间
		sim_session_calculate_rtt(s, (uint16_t)(now_ts - seg->timestamp - seg->send_ts - sender->first_ts));
	skiplist_remove(sender->cache, key);
}`

这里我们sim_session_calculate计算rtt,

`void sim_session_calculate_rtt(sim_session_t* s, uint32_t keep_rtt)
{
if (keep_rtt < 5)
keep_rtt = 5;

s->rtt_var = (s->rtt_var * 3 + SU_ABS(s->rtt, keep_rtt)) / 4;
if (s->rtt_var < 10)
	s->rtt_var = 10;

s->rtt = (7 * s->rtt + keep_rtt) / 8;
if (s->rtt < 10)
	s->rtt = 10;

/*通知RTT更新*/
if (s->sender != NULL)
	sim_sender_update_rtt(s, s->sender);
if (s->receiver != NULL)
	sim_receiver_update_rtt(s, s->receiver);

}`

这里计算rtt的过程中,

s->rtt_var = (s->rtt_var * 3 + SU_ABS(s->rtt, keep_rtt)) / 4;
if (s->rtt_var < 10)
s->rtt_var = 10;

s->rtt = (7 * s->rtt + keep_rtt) / 8;
if (s->rtt < 10)
	s->rtt = 10;

这个计算公式,对应的理论支撑文档在哪里,袁总方便提示下么?

问的问题比较菜,多多体谅,苦笑脸.

链接错误---

博主,本人菜鸟一枚,编译碰到了这个问题,但是其实在代码跟踪又能够跟踪到具体的实现,麻烦指点一下,谢谢!

环境VS2013

错误 43 error LNK2019: 无法解析的外部符号 _cc_feedback_adapter_init,该符号在函数 _sender_cc_create 中被引用 D:\work\CongestionControl\razor\sim_test\echo\razor.lib(sender_congestion_controller.obj) echo

错误 44 error LNK2019: 无法解析的外部符号 _cc_feedback_adapter_destroy,该符号在函数 _sender_cc_destroy 中被引用 D:\work\CongestionControl\razor\sim_test\echo\razor.lib(sender_congestion_controller.obj) echo

错误 46 error LNK2019: 无法解析的外部符号 _cc_feedback_on_feedback,该符号在函数 _sender_on_feedback 中被引用 D:\work\CongestionControl\razor\sim_test\echo\razor.lib(sender_congestion_controller.obj) echo

发现2个编译的小问题哈

diff --git a/project/razor.vcxproj b/project/razor.vcxproj
index 010f219..7a2a1e6 100644
--- a/project/razor.vcxproj
+++ b/project/razor.vcxproj
@@ -98,10 +98,9 @@
     <ClCompile Include="..\estimator\aimd_rate_control.c" />
     <ClCompile Include="..\estimator\bitrate_controller.c" />
     <ClCompile Include="..\estimator\cc_loss_stat.c" />
+    <ClCompile Include="..\estimator\cc_feedback_adapter.c" />
     <ClCompile Include="..\estimator\delay_base_bwe.c" />
     <ClCompile Include="..\estimator\estimator_common.c" />
-    <ClCompile Include="..\estimator\cc_feedback_adapter.c" />
-    <ClCompile Include="..\estimator\cc_feedback_adapter.h" />
     <ClCompile Include="..\estimator\inter_arrival.c" />
     <ClCompile Include="..\estimator\kalman_filter.c" />
     <ClCompile Include="..\estimator\overuse_detector.c" />
@@ -120,7 +119,7 @@
     <ClInclude Include="..\bbr\bbr_bandwidth_sample.h" />
     <ClInclude Include="..\bbr\bbr_common.h" />
     <ClInclude Include="..\bbr\bbr_controller.h" />
-    <ClInclude Include="..\bbr\bbr_feedback_adpater.h" />
+    <ClInclude Include="..\bbr\bbr_feedback_adapter.h" />
     <ClInclude Include="..\bbr\bbr_loss_rate_filter.h" />
     <ClInclude Include="..\bbr\bbr_pacer.h" />
     <ClInclude Include="..\bbr\bbr_receiver.h" />
@@ -142,6 +141,7 @@
     <ClInclude Include="..\estimator\ack_bitrate_estimator.h" />
     <ClInclude Include="..\estimator\aimd_rate_control.h" />
     <ClInclude Include="..\estimator\bitrate_controller.h" />
+    <ClInclude Include="..\estimator\cc_feedback_adapter.h" />
     <ClInclude Include="..\estimator\cc_loss_stat.h" />
     <ClInclude Include="..\estimator\delay_base_bwe.h" />
     <ClInclude Include="..\estimator\estimator_common.h" />
diff --git a/test/bbr_controller_test.c b/test/bbr_controller_test.c
index 18d1e70..98b98c6 100644
--- a/test/bbr_controller_test.c
+++ b/test/bbr_controller_test.c
@@ -192,7 +192,9 @@
 					feedback.data_in_flight += packet->size;
 				}
 
-				ctrl->update = bbr_on_feedback(ctrl->bbr, &feedback);
+				uint32_t acked_bitrate;
+				acked_bitrate = bbr_feedback_get_birate(&feedback) / 8000;
+				ctrl->update = bbr_on_feedback(ctrl->bbr, &feedback, acked_bitrate);
 			}
 		}

关于带宽估计算法的细节有一些疑问

袁老师您好!我正在阅读您编写的源码以及gcc的源码来学习这块的带宽估计机制;
在delay_bwe_maybe_update函数的

		else if (acked_bitrate == 0 && bwe->rate_control->inited == 0 
			&& aimd_time_reduce_further(bwe->rate_control, now_ts, bwe->rate_control->curr_rate * 3 / 4 - 1) == 0){ /*带宽过载且没统计到新的acked带宽,进行减半处理*/
			aimd_set_estimate(bwe->rate_control, bwe->rate_control->curr_rate * 3 / 4, now_ts);
			result.updated = 0;
			result.probe = -1;
			result.bitrate = bwe->rate_control->curr_rate;
		}

部分,您的注释写的是减半处理,在GCC最新的源码中也是1/2,请问这部分改成3/4是实践上更加有优势吗?

关于测试结果?

请教一下袁老师,用测试的sender和receiver进行测试,gcc和bbr这两种拥塞控制算法,发现gcc基本上一直线性增长到3000kb/s,bbr测试先增后减再增加到更高然后再减少(看着是探测带宽的一个过程)再最后趋于稳定,但是bbr的速度最终稳定的速度大概只有400-500kb/s。请问这是正常结果吗?觉得bbr的好像不对?

请教关于缓冲区的设计

/skiplist iterator/
typedef struct wb_skiplist_iter_s
{
skiplist_item_t key;
skiplist_item_t val;

int	depth;

struct wb_skiplist_iter_s* next[0];

}skiplist_iter_t;

最近在仔细的研究博主的这篇开源的工程,在研究缓存这里碰到了很多不明白的东西?

请问下depth的设计目的是为何?
整个缓存是怎么进行排布设计的?

请教袁老师您一个代码细节问题

`static void real_video_evict_frame(sim_session_t* s, sim_frame_cache_t* c, uint32_t fid)
{
uint32_t pos, i;

for (pos = c->max_fid + 1; pos <= fid; pos++)
	real_video_clean_frame(s, c, &c->frames[INDEX(pos)]);//需要把以前的缓冲区给清了,给新进来的数据腾空间

//1.最开始最小的min_fid肯定为0,所以fid肯定会小于 c->min_fid + c->size
if (fid < c->min_fid + c->size) //新进来的元素已经跨越了一个缓冲区的长度
	return;


//删除一个GOP序列??? -- 有什么特殊的设计意义吗?
for (pos = c->min_fid + 1; pos < c->max_fid; ++pos){ 
	if (c->frames[INDEX(pos)].frame_type == 1)
		break;
}

for (i = c->min_fid + 1; i < pos; ++i)
	real_video_clean_frame(s, c, &c->frames[INDEX(i)]);

}`

当清除过期的槽位的时候,思路卡主了,

当我们缓存的帧数据超过了数组的大小后,此时需要先清除以前缓存的数据,然后在存储新的数据.

但是有2个地方我始终没有想明白:

后面的代码:
清除的以前的数据,就作为了最小的min_fid,但是后面紧接着就把这个min_fid开始的一个GOP给清空了?请问这样做有什么单独的目的吗?

还有:

if (fid < c->min_fid + c->size) //新进来的元素已经跨越了一个缓冲区的长度
return;

上面这样代码:

如果缓冲区的长度 < cache size,那么很容易理解.

但是如果超过了cache size 后,这行代码的意义,好像就有点多余.

因为超过cache size后:

fid = c->min_fid + c->size ;

请教下袁老师gcc/bbr算法在可靠网络上的应用问题

袁老师,
您好!我们做了一个基于VNC的远程桌面软件,由于RFB协议的限制,只能在可靠网络上工作(TCP/RUDP)。VNC中没有流控的概念,所以想引入gcc/bbr算法进行拥塞控制。
我们有以下几点要求,对低延时的追求胜过对带宽利用率的追求:

  • 1、实时性强(低延时)
  • 2、较小的带宽占用
  • 3、弱网对抗能力强
  • 4、快速感知拥塞

先简单介绍下基于VNC的远程桌面,它工作在可靠网络中,会通过算法找到当前帧相对于上一帧的变化区域,然后对这个区域进行Tight编码(融合了调色板、JPEG编码),然后发送。

所以当桌面没有变化时,数据量基本为0;当桌面有变化时,数据量和变化区域大小有关,可能忽大忽小,不可控。我们希望,桌面的最后的变化能快速发送到接收端,一些中间变化在带宽有限时可以忽略。

在可靠网络上,拿不到丢包相关信息,所以我准备尝试Vegas,BBR,以及GCC的基于延迟的拥塞控制的算法部分。

我有以下几点疑惑:
1、bbr算法得到一个带宽的时候,如果现在的数据量不够的话,它必须要发送一些padding数据。在我们的场景下,数据量会忽大忽小。带宽大的时候,感觉会需要发送很多padding数据,会很浪费带宽。
2、我们的数据量的变化和数据发送时间是比较随机的,且数据格式受RFB协议限制,拥塞控制只能通过扩展协议来做。这种情况下,pacing机制还能用吗?GCC的到达时间滤波器和延迟梯度模型还能生效吗?
3、GCC算法需要接受端反馈数据包的到达时间,但两个端上的时间一般都是对不齐的。这样的话,用到达时间和RTT在一起计算不太合适。razor没有考虑到这个问题吗?还是算法能屏蔽两个端上时间不同步的问题?

由于缺少拥塞控制方面的经验,不能确定我们的场景适合使用哪个算法,希望袁老师能给一点建议,非常感谢!

关于razor中fec的性能指标

袁老师,您好!请问razor中fec比较适用的场景是什么呢?再就是fec在某些测试场景下的性能指标是怎么样的呢?

编译razor.sln的报错问题

设置razor.sln中的sim_transport为启动项目,运行后报错:
error LNK2019: 无法解析的外部符号 ___WSAFDIsSet@8,该符号在函数 _su_udp_recv 中被引用
error LNK2019: 无法解析的外部符号 __imp__bind@12,该符号在函数 _su_tcp_listen_create 中被引用
error LNK2019: 无法解析的外部符号 _cc_feedback_adapter_init,该符号在函数 _sender_cc_create 中被引用
error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
一共24个无法解析的外部命令,请问应该如何解决?

请教下pace_sender获取target bitrate的步骤

袁老师:
您好!
pace_sender.c的pace_try_transmit函数中,在发包前先获取target bitrate,当发送队列中有包时,即通过两步获取target bitrate。(1)、通过pacer_queue_target_bitrate_kbps计算一个码率;(2)、比较第1步的码率与control计算出的码率,两者取大。我没明白第1步中计算码率的原理,袁老师可以稍微解释一下吗?并且那个注释是“/计算缓冲区在500毫秒之内要发送完毕所需的带宽/”,我也没看从哪儿看出来是500ms。。
uint32_t pacer_queue_target_bitrate_kbps(pacer_queue_t* que, int64_t now_ts)
{
uint32_t ret = 0, space;

if (que->oldest_ts != -1 && now_ts > que->oldest_ts){
	space = (uint32_t)(now_ts - que->oldest_ts);		
	if (space >= que->max_que_ms)
		space = 500;
	else
		space = que->max_que_ms - space;										
}
else
	space = que->max_que_ms - 1;

/*计算缓冲区在500毫秒之内要发送完毕所需的带宽*/			
if (skiplist_size(que->cache) > 0 && que->total_size > 0)
	ret = que->total_size * 8 / space;

return ret;

}

请教一下两个编译的小问题

想请教一下各位大佬
1、在Linux下运行relay之前是不是也要编译razor下的project文件呀?
2、if (sim_connect(1000, "192.168.1.200", 6009) != 0){
printf("sim connect failed!\n");
goto err;
sim_connect设定好像是需要传入六个参数,这样修改好像会报错,请问可以怎么改呀?

channel overuse

反映一个现象:
测试了一下你的新版本,使用mininet测试,在2M的链路上,发送的速率能够发到2.5M左右,导致非常多的丢包。当然这在实际网络里可能并不是什么大问题,只要数据包可以挤进网络里,或者进行数据重传。
之前我一移植的仿真代码(无论是webrtc还是razor),发现只有在2M的链路上可以占用很合理的带宽,3M,4M的链路上,都有数据发送速率过大的情况。有可能是gcc自身的问题。

padding发送问题请教

袁老师,您好!关于padding有两个问题想向您请教:1、gcc的padding功能,可以通过参数(像bbr一样)控制是否启用,从而将gcc的padding完善出来吗?我的看法是,为了画面稳定编解码会不那么频率地变动码率,padding可以减少上探的频率;此外,gcc层的探测与应用层的探测并不冲突,且gcc层的padding发送的触发是在应用层的码率不够时,所以两个并存似乎不冲突的。2、bbr发送padding时,是不是需要加上budget_remaining(&pace->media_budget) > 0的判断,从而防止突发呢?

Razor发送特大I帧

袁老师,您好!想请教一下,如果I帧比P帧大几倍,按照Razor的发包方式(pacing平滑),理论上I帧所在那秒就会产生延时;如果不平滑,强行把I帧在一定时间范围内把它发出去,就会触发拥塞。总的来说,编码器不能保证很稳定的码率时,结合拥塞控制,您有什么好的思路解决这个问题吗?

请教一下编译问题

您好 我用vs2107编译报错
1>------ 已启动生成: 项目: sim_sender_test, 配置: Debug Win32 ------
1>razor.lib(sender_congestion_controller.obj) : error LNK2019: 无法解析的外部符号 _cc_feedback_adapter_init,该符号在函数 _sender_cc_create 中被引用
1>razor.lib(sender_congestion_controller.obj) : error LNK2019: 无法解析的外部符号 _cc_feedback_adapter_destroy,该符号在函数 _sender_cc_destroy 中被引用
1>razor.lib(sender_congestion_controller.obj) : error LNK2019: 无法解析的外部符号 _cc_feedback_add_packet,该符号在函数 _sender_on_send_packet 中被引用
1>razor.lib(sender_congestion_controller.obj) : error LNK2019: 无法解析的外部符号 _cc_feedback_on_feedback,该符号在函数 _sender_on_feedback 中被引用
1>D:\razor\sim_test\sim_sender\Debug\sim_sender_test.exe : fatal error LNK1120: 4 个无法解析的外部命令
1>已完成生成项目“sim_sender.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

import the code on ns3

hi, would you licence me to import your codes on simulation platform ns3?
大神,很早读过您的博客,关于视频直播低延时的,现在关于实时视频流的传输的拥塞控制是一个小的研究点。但是webrtc代码庞大,让人望而却步。我能不能将你的这份代码移植到ns3仿真平台上。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.