yuanrongxi / razor

A google's congestion Control Algorithm
MIT License
352 stars 152 forks source link

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

Open shentu521 opened 5 years ago

shentu521 commented 5 years ago

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

针对接收端的情况:

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

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

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

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

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

shentu521 commented 5 years ago

不知道有没有理解错:

在real_video_cache_put里:real_video_evict_frame

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

这行代码,clean_frame的时候,就会把min_fid指向了被clean的frame的id.

shentu521 commented 5 years ago

也就是一旦发生了跳帧,我们就把min_fid移动到这个最大的帧的前面一位,在main_event_loop的时候每次都是从min_fid+1开始取的。 不知道这样理解有没有错,如果这么做,那么就会面临一个问题,这样实现就会导致丢包重传的意义不大.

yuanrongxi commented 5 years ago

丢帧是主动是以一个gop为单位去丢弃,在evict_frame函数里面,有两个前提会触发丢帧,cache中的数据过多,二,有丢包。在get函数里面有个判定的。

yuanrongxi commented 5 years ago

重传也是有限制的,如果延迟太大,或者重传的次数太多,都会导致evict frame

shentu521 commented 5 years ago

evict_frame注意过,但是这样导致的问题也很明显,就是如果中间一个普通帧丢失了,那么播放端就会卡主,然后等丢帧把min_fid改变,这样感觉是不是不是太好哦。

yuanrongxi commented 5 years ago

普通帧丢了,如果继续播放的话,就是花屏了,这是权宜选择的问题,我们禁止出现花屏

shentu521 commented 5 years ago

嗯,明白了,感谢袁老师指点,学习了比较多,现在项目用了不少。袁老师的代码设计风格值得学习。