yuanrongxi / razor

A google's congestion Control Algorithm
MIT License
355 stars 156 forks source link

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

Closed shentu521 closed 5 years ago

shentu521 commented 5 years ago

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了?

shentu521 commented 5 years ago

void pace_try_transmit(pace_sender_t pace, int64_t now_ts) { int elapsed_ms; uint32_t target_bitrate_kbps; int sent_bytes; packet_event_t ev;

elapsed_ms = (int)(now_ts - pace->last_update_ts);

if (elapsed_ms < k_min_packet_limit_ms)
    return;

elapsed_ms = SU_MIN(elapsed_ms, k_max_interval_ms);

//budget是个评估单位时间内可以发送多少数据量的一个机制

/*计算media budget中需要的码率,并更新到media budget之中*/
if (pacer_queue_bytes(&pace->que) > 0){
    //通过media_budget模块来计算本次理应发送的字节数
    //然后和实际发送的字节数进行对比!!!!
    target_bitrate_kbps = pacer_queue_target_bitrate_kbps(&pace->que, now_ts);
    target_bitrate_kbps = SU_MAX(pace->pacing_bitrate_kpbs, target_bitrate_kbps);
}
else
    target_bitrate_kbps = pace->pacing_bitrate_kpbs;

这个target_bitrate_kbps不是应该根据发送端和接收端的网络情况综合得出吗?如果按代码缩写,那就是500ms非得把缓冲区中剩余的数据发光?

yuanrongxi commented 5 years ago

oldest是缓冲区中最早待发送的包,目的是为了计算缓冲区延迟长度。

yuanrongxi commented 5 years ago

这个500毫秒的意思是pace最大的延迟为500毫秒,不是一个绝对值,如果是绝对值,容易引起很大的延迟。pacer只是为了平滑发送,不是码率控制,码率控制是通过拥塞控制得到,再通知给上层的数据源来改变编码码率。

shentu521 commented 5 years ago

感谢老大不吝指教,再继续好好研究

shentu521 commented 5 years ago

缓冲区中有100个数据,oldest就是第一个数据包的时间戳,第一个数据包发送出去后,oldtest就变为了第二个数据包的时间戳,也就是oldtest是缓冲区中最早待发送的包,懂了,谢谢老大指点.