zoukankan      html  css  js  c++  java
  • 流媒体学习四------- ortp队列的实现

    在ortp中实现了一个通用的队列,每一个队列包括三个实体,分别是队列、消息块和数据块,这三个实体分别对应queue_t、msgb和datab结构体。

    queue_t的定义如下所示:

    typedef struct _queue {
    mblk_t _q_stopper;      /* 消息队列头 */
    int q_mcount;           /*number of packet in the q */
    } queue_t;
    _q_stopper:消息块,内嵌于queue_t,它的主要作用是作为作为链表的表头;_q_stopper所指向的mblk_t并无实际数据,只是作为消息对列头的标识头。putq或者getq都是从_q_stopper之后的第一个mblk_t开始。
    q_mcount:用于记录队列元素的个数。
    构造一个空的消息队列:
    注:void qinit(queue_t *q){
        mblk_init(&q->_q_stopper);
        q->_q_stopper.b_next=&q->_q_stopper;
        q->_q_stopper.b_prev=&q->_q_stopper;
        q->q_mcount=0;
    }
    从上面这个初始化一个queue_t的函数可以得知,_q_stopper初始化的时候,_q_stopper.b_next、_q_stopper.b_prev都是指向_q_stopper自己的。

    mblk_t的定义如下所示:

    typedef struct msgb {
    struct msgb *b_prev;    /* 指向上一个消息块 */
    struct msgb *b_next;    /* 指向下一个消息块 */
    struct msgb *b_cont;    /* 复合消息快 mblk_t */
    struct datab *b_datap;  /* 数据块指针 */
    unsigned char *b_rptr;  /* 读取的数据指针 */
    unsigned char *b_wptr;  /* 写入的数据指针 */
    uint32_t reserved1;
    uint32_t reserved2;
    } mblk_t;
    b_prev和b_next:消息块的链表指针,所有消息块通过这两个指针串接成链。
    b_cout:通过这个指针可以构成复合消息块,复合消息块由多个消息块组成,但在队列中作为一个元素
    b_datap:消息块的数据指针,指向一个数据块
    b_rptr:指向数据块的数据已经读取的部分
    b_wptr:指向数据块的数据已经写入的部分
    reserved1和reserved2:保留用途

    datab的定义如下所示:

    typedef struct datab {
    unsigned char *db_base; /* 数据块的数据基址 */
    unsigned char *db_lim;  /* 数据块的数据部分的结束地址 */
    void (*db_freefn) (void *); /* 数据块数据的释放函数 */
    int db_ref;             /* 数据块引用计数 */
    } dblk_t;
    db_base:数据基址
    db_lim:数据的结束地址
    db_freefn:用于释放数据块的数据的函数
    db_ref:数据块的引用计数
  • 相关阅读:
    ant+jmeter 报告优化
    使用no-gui 模式执行分布式测试
    jmeter 4.0使用本机做slave
    jmeter 4.0,分布式测试
    jmeter 跨线程执行变量
    jmeter if 控制器
    jmeter 获取cookie
    jmeter 使用 P函数 自动控制ip和端口等变量
    linux 配置tomcat环境变量
    linux 配置jdk环境变量
  • 原文地址:https://www.cnblogs.com/cy568searchx/p/4379088.html
Copyright © 2011-2022 走看看