关闭

视频网络传输机制的设计(续)

标签: 网络struct数据结构工作socketbuffer
1664人阅读 评论(0) 收藏 举报
分类:

       线程对系统内存的开支比进程要少,在视频Server端,采用两个线程在后台分别完成采集处理和网络传输的工作,两个线程的协调工作靠struct videodev *dev,所以在程序设计中,必须把这个数据结构设为全局变量。

      首先看一下上述数据结构中对两个线程工作协调相关的参数:

       unsigned char* pFramebuffer:mmap返回的数据指针,指向采集进来的原始数据;

       unsigned char* ptframe[4]:指向四个buffer缓冲数组,存放已压缩完成的数据;

       int lock[4]:对四个ptframe的标示,0表示可以写入视频压缩数据,1表示可以发送到网络,两者互斥。

       接下来描述一下整个代码运行的过程:

       1. 初始化:1.1 分配ptframe的大小,其大小为:sizeof(struct frame_t)+width*height*3;其中struct frame_t 描述了压缩数据的各个特征参数,如w*h,size,format等;  1.2 将2个frame的数据采集保存在数据结构videombuf中,这两个frame的指针分别为pFramebuffer和pFramebuffer+offset,offset为一个frame的大小;1.3 对4个lock置0;

       2. 采集开始:具体见上一篇文章,启动采集线程,做一个big loop,简单说:如果没有网络发送的线程在跑,采集线程不停的把pFramebuffer和pFramebuffer+offset指向的数据压缩后依次存放到ptframe+sizeof (struct frame_t)的位置,大小为frame压缩后的大小;注意数据压缩并存放到ptframe+sizeof (struct frame_t)时必须上线程互斥锁;

        3. 网络传输的线程:线程打开之前sock套接口都已经打开,传到线程函数的参数为accept后产生的新的socket描述符(假设传输协议为标准TCP/IP协议),传输过程相对比较简单,从prframe[0]开始查看,查看ptframe[0]是否写完,ok则将lock[0]置1;根据struct frame_t的size参数,发送ptframe[0]+sizeof (struct frame_t)数据到网络,发送完成后解锁,然后继续下一个ptframe[],and so on...............

To be continue for RTP/RTCP...................

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:198558次
    • 积分:2674
    • 等级:
    • 排名:第13533名
    • 原创:70篇
    • 转载:19篇
    • 译文:0篇
    • 评论:91条
    最新评论