在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:数据块的引用计数

流媒体学习四------- ortp队列的实现的更多相关文章

  1. TweenMax动画库学习(四)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  2. SVG 学习<四> 基础API

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  3. Android JNI学习(四)——JNI的常用方法的中文API

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  4. SCARA——OpenGL入门学习四(颜色)

    OpenGL入门学习[四] 本次学习的是颜色的选择.终于要走出黑白的世界了~~ OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 无论哪种颜色模式,计算机都必须为每一个像素保存一些数 ...

  5. ZigBee学习四 无线+UART通信

    ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique messag ...

  6. (转)SpringMVC学习(四)——Spring、MyBatis和SpringMVC的整合

    http://blog.csdn.net/yerenyuan_pku/article/details/72231763 之前我整合了Spring和MyBatis这两个框架,不会的可以看我的文章MyBa ...

  7. Spring Boot 项目学习 (四) Spring Boot整合Swagger2自动生成API文档

    0 引言 在做服务端开发的时候,难免会涉及到API 接口文档的编写,可以经历过手写API 文档的过程,就会发现,一个自动生成API文档可以提高多少的效率. 以下列举几个手写API 文档的痛点: 文档需 ...

  8. Expression Blend学习四控件

    原文:Expression Blend学习四控件 Expression Blend制作自定义按钮 1.从Blend工具箱中添加一个Button,按住shift,将尺寸调整为125*125; 2.右键点 ...

  9. day 83 Vue学习四之过滤器、钩子函数、路由、全家桶等

    Vue学习四之过滤器.钩子函数.路由.全家桶等   本节目录 一 vue过滤器 二 生命周期的钩子函数 三 vue的全家桶 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 Vue的过滤 ...

随机推荐

  1. ural 1243. Divorce of the Seven Dwarfs

    1243. Divorce of the Seven Dwarfs Time limit: 1.0 secondMemory limit: 64 MB After the Snow White wit ...

  2. python  代码片段

    print 'dongshen' for word in ['capitalize','these','words']: print word.upper() for i in range(0,5): ...

  3. 生成跨语言的类型声明和接口绑定的工具(Djinni )

    Djinni 是一个用来生成跨语言的类型声明和接口绑定的工具,主要用于 C++ 和 Java 以及 Objective-C 间的互通. 示例接口定义文件: # Multi-line comments ...

  4. windows phone7 豆瓣FM

        HubTile参考了下,就做了一个豆瓣的FM应用 豆瓣的API在百度里查一下. 整个应用很简单,无非是解析豆瓣的JSON数据,然后读取,下载图片和歌单

  5. IntelliJ IDEA 14 SVN无法正常使用问题

    通过SVN导入项目 SVN checkout时候会出现如下错误: Cannot run program "svn" (in directory "E:\Projects& ...

  6. [shell] if else以及大于、小于、等于逻辑表达式 [转]

    本文也即<Learning the bash Shell>3rd Edition的第五章Flow Control之读书笔记,但我们将不限于此.flow control是任何编程语言中很常用 ...

  7. ztree学习之异步加载节点(一)

    ztreedemo.jsp: <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  8. juniper防火墙 L2TP VPN配置

    juniper防火墙 L2TP  VPN配置 建立L2TP_POOL 创建连接的用户: 创建用户组: 更改L2TP的连接池: 更改L2TP的隧道: 设置防火墙的策略: Win7连接:

  9. kvm安装

    基础环境: 192.168.1.67                  super67 硬件cpu需要支持:Intel VT-x 技术 本实验使用虚拟机VMware Workstation上的虚拟机 ...

  10. 在vs2013中配置openGL(绝对可靠 !)

    首先要下载glut.h glut32.dll glut32.lib.(这个在glut-3.7.6-bin的包里面,可以直接下载 ) 然后: glut.h:放到 D:\vs2013\VC\include ...