zoukankan      html  css  js  c++  java
  • 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语言中有关负数和补码的概念。
  • 相关阅读:
    openjump遇到的一些问题
    kettle安装教程/安装失败
    C# string和byte[]数组之间相互转换
    C# 各种进制转换
    C#AE创建FeatureDataset/创建数据、集要素集
    ArcCatalog/arcgis怎么连接postgresql/postpis
    梦断代码阅读笔记03
    体温冲刺完成
    体温冲刺
    体温作业
  • 原文地址:https://www.cnblogs.com/super119/p/1924446.html
Copyright © 2011-2022 走看看