GStreamer中对RTP包seqnum是否wraparound的判断只用一句代码
2011-01-03 11:28
267 查看
来看这个函数:gst_rtp_buffer_compare_seqnum
CODE: SELECT ALL
就简单的一句代码,就能判断出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语言中有关负数和补码的概念。
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语言中有关负数和补码的概念。
相关文章推荐
- .Net判断一个对象是否为数值类型探讨总结(高营养含量,含最终代码及跑分)
- 微信公众号判断用户是否已关注php代码解析
- Android代码判断当前设备是否为模拟器
- [JS代码]如何判断ipad或者iphone是否为横屏或者竖屏 - portrait或者lan...
- [JS代码]如何判断ipad或者iphone是否为横屏或者竖屏 - portrait或者landscape
- php中判断字符串是否全是中文或含有中文的实现代码
- Asp.net中判断是否是指定页面请求的代码示例
- Python实现判断一行代码是否为注释
- 实测如何使用c#代码判断服务器是否安装iis
- shell判断文件是否为空的代码
- 判断客户浏览器是否支持cookie的示例代码
- android通过代码判断手机是否root
- [转]用Javascript判断图片是否存在,不存在则显示默认图片的代码
- 华为面试 手写代码 判断int类型的数是否是回文
- iOS设备是否越狱的判断代码
- asp.net中利用正则表达式判断一个字符串是否为数字的代码
- 判断是否是微信端的代码
- C++ 代码统计工具 & 判断一行代码是否为注释行
- 判断 iPhone 虚拟键盘是否打开的代码
- js判断输入是否为正整数、浮点数等数字的函数代码