您的位置:首页 > 编程语言

GStreamer中对RTP包seqnum是否wraparound的判断只用一句代码

2011-01-03 11:28 267 查看
来看这个函数:gst_rtp_buffer_compare_seqnum
CODE: SELECT ALL
gint
gst_rtp_buffer_compare_seqnum (guint16 seqnum1, guint16 seqnum2)
{
return (gint16) (seqnum2 - seqnum1);
}


就简单的一句代码,就能判断出seqnum1, seqnum2是否有wraparound的现象。关键点就在于return后面的gint16类型转换上。seqnum1, seqnum2都是guint16,也就是unsigned short,而返回值被强制转换成了gint16,也就是signed short。这样的话,如果seqnum2 - seqnum1 < -32768的话,也就是发生wraparound的话,此时返回值却是一个正数,其他情况如果seqnum2 - seqnum1 >= -32768的话,此时返回的就是一个负数。所以,如果返回值<0,则seqnum2 < seqnum1且没有wraparound;反之如果返回值>0,那表示seqnum2 > seqnum1或发生了wraparound。在RTP协议下,如果发生了wraparound,那么即使seqnum2比seqnum1小,但是逻辑上seqnum2是大于seqnum1的,因为seqnum2是后产生的。
至于为什么seqnum2 - seqnum1 < -32768的时候,转换成gint16就变成一个正数的问题,请参考C语言中有关负数和补码的概念。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: