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

来看这个函数: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语言中有关负数和补码的概念。

你可能感兴趣的:(Stream)