程序代四码分析1.doc
《程序代四码分析1.doc》由会员分享,可在线阅读,更多相关《程序代四码分析1.doc(17页珍藏版)》请在三一文库上搜索。
1、一、源代码的构建框架 Ortp是一种开源软件,实现了 RTP 与 RTCP 协议。首先在RTP中有几种重要的结构体,第一种比较重要的结构体是payload type,该结构用于指定编码类型,以及与其相关的时钟速率、采样率等一些参数,参见下图。struct _PayloadTypeint type; /* one of PAYLOAD_* macros*/int clock_rate; /* rtp clock rate*/char bits_per_sample;/* in case of continuous audio data */char *zero_pattern;int patte
2、rn_length;/* other useful information for the application*/int normal_bitrate;/*in bit/s */char *mime_type; /*actually the submime, ex: pcm, pcma, gsm*/int channels; /* number of channels of audio */char *recv_fmtp; /* various format parameters for the incoming stream */char *send_fmtp; /* various f
3、ormat parameters for the outgoing stream */int flags;void *user_data; 在代码中,不同的媒体类型有不同的 payloadtype 结构体与之对应,h263,g729,MPEG4等。 因为每种编码都有其独有的特点,而且许多参数也不一样,所以 RTP 包头中使用 payload 域标记负载的类型,一方面接收端可以就此判断负载的类型,从而选择对应的解码器进行解码播放;另一方面,代码在进行时间戳等方面的计算时可以更加方便一点。所有系统当前支持的payload 类型都被放在一个数组中, 由全局变量 av_profile 这个结构体实例统
4、领。 除了 payloadtype 结构体外,一个更重要的结构体是 rtpsession。该结构体即是一个会话的抽象,与会话相关的各种信息都定义在该结构体上或者能够通过该结构体找到。要使用oRTP 进行媒体数据的传输,需要先创建一个会话,之后所有数据的传输都在会话上完成或 基于会话完成。rtpsession结构体的定义如下:struct _RtpSessionRtpSession *next;/* next RtpSession, when the session are enqueued by the scheduler */int mask_pos;/* the position in t
5、he scheduler mask of RtpSession : do not move this field: it is part of the ABI since the session_set macros use it*/struct RtpProfile *profile;int pt;unsigned int ssrc;WaitPoint wp;int telephone_events_pt;/* the payload type used for telephony events */ snd,rcv;unsigned int inc_ssrc_candidate;int i
6、nc_same_ssrc_count;int hw_recv_pt; /* recv payload type before jitter buffer */int recv_buf_size;RtpSignalTable on_ssrc_changed;RtpSignalTable on_payload_type_changed;RtpSignalTable on_telephone_event_packet;RtpSignalTable on_telephone_event;RtpSignalTable on_timestamp_jump;RtpSignalTable on_network
7、_error;RtpSignalTable on_rtcp_bye;struct _OList *signal_tables;struct _OList *eventqs;msgb_allocator_t allocator;RtpStream rtp;RtcpStream rtcp;RtpSessionMode mode;struct _RtpScheduler *sched;uint32_t flags;int dscp;int multicast_ttl;int multicast_loopback;void * user_data;/* FIXME: Should be a table
8、 for all session participants. */struct timeval last_recv_time; /* Time of receiving the RTP/RTCP packet. */mblk_t *pending;/* telephony events extension */mblk_t *current_tev;/* the pending telephony events */mblk_t *sd;queue_t contributing_sources;unsigned int lost_packets_test_vector;unsigned int
9、 interarrival_jitter_test_vector;unsigned int delay_test_vector;float rtt;/*last round trip delay calculated*/OrtpNetworkSimulatorCtx *net_sim_ctx;bool_t symmetric_rtp;bool_t permissive; /*use the permissive algorithm*/bool_t use_connect; /* use connect() on the socket */bool_t ssrc_set;Session 的初始化
10、通过接口 rtp_session_init 完成,外部获得一个新的 session是通过调用接口rtp_session_new 完成。关于 session 的其他有关配置和获取信息的操作都可以在文件 rtpsession.c 中找到定义。使用 oRTP 进行数据传输时,可以在一个任务上完成多个会话流的接收和发送。这得益于oRTP 中调度模块的支持。要使用调度模块,应用需要在进行 oRTP 的初始化时对调度进行初始化,将需要调度管理的会话注册到调度模块中,这样当进行接收和发送操作时,先向调度询问当前会话是否可以进行发送和接收,如果不能进行收发操作,则处理下一个会话。 这有点类似I/O 接口上的
11、select 操作。调度模块使用的数据结构主要为 rtpscheduler,定义如下 :struct _RtpScheduler RtpSession *list;/* list of scheduled sessions*/SessionSetall_sessions; /* mask of scheduled sessions */intall_max;/* the highest pos in the all mask */SessionSet r_sessions;/* mask of sessions that have a recv event */intr_max;Session
12、Setw_sessions;/* mask of sessions that have a send event */int w_max;SessionSete_sessions;/* mask of session that have error event */inte_max;int max_sessions;/* the number of position in the masks */ /* GMutex *unblock_select_mutex; */ortp_cond_t unblock_select_cond;ortp_mutex_tlock;ortp_thread_t t
13、hread;int thread_running;struct _RtpTimer *timer;uint32_t time_; /*number of miliseconds elapsed since the start of the thread */uint32_t timer_inc;/* the timer increment in milisec */;调度结构体中的r/w/e分别代表接收,发送,异常。Avprofile.c文件中定义了一些负载类型。接收的 rtp和 rtcp 包的解析处理函数在文件 rtpparse.c 和 rtcpparse.c 文件 中实现。实现的是将包中的
14、事件包取出放入列队中。rtpsession_inet.c 文件中定义了数据在网络中传输的过程,利用socket 接口完成了。介绍了socket ,远程地址,端口的建立等设置。其相关的声明在rtpsession_priv.h 中定义,Rtpsignaltable.c主要实现一些信号量的初始化,加入一个信号量,以及发射信号量。定义一些回调函数等。rtptimer.c,scheduler.c,sessionset.c等文件实现了调度模块。 port.c 文件中实现常用的任务(如分配内存)的创建及销毁,条件变量及互斥锁,进程间的管道通信机制等。文件utils.c 文件中讲述了一些数据结构,讲述了一些链
15、表的操作。Str_utils.c文件中讲述了一些队列的操作。首先,队列数据结构由三部分组成:队列头、消息块以及数据块队列头指向消息块,消息块之间可以构成双向链表,这是队列的基本要素。消息块本身不带buffer,数据是由专门的数据块来保存的, 并被消息块指向。 在发送上层应用的 payload 数据之前,oRTP 会构造一个消息块,数据指针会指向payload, 这避免了数据拷贝。较低层的接口处理数据时依赖于消息块结构。接收后的数据从消息块中拷贝到用户buffer。接收的 rtp和 rtcp 包的解析处理函数在文件 rtpparse.c 和 rtcpparse.c 文件 中实现。在使用oRTP
16、提供的 rtp 库之前,需要先对其进行初始化,这部分的实现在 oRTP.c 文件中。oRTP的初始化主要调用两个接口:ortp_init 和 ortp_scheduler_init。其中 ortp_init完成 了 payload 的注册,ortp_scheduler_init完成了调度任务的初始化。写程序首先你要了解你的程序是干什么,要解决的什么问题,需要那些变量,以及各变量的关系。我们RTP的目的是实现对数据的打包输出,以及对数据的接收,我们前期的工作就是实现各种初始化,将我们的想要的传输的数据,地址信息等通过调用库函数提供的接口将我们的数据传入内部,在做这些以前,我们还需要判断我们的系统
17、参数个数是否正确,同时还要注意数据类型的一致性。一系列的初始化结束后就要进行数据的发送与接收了,这些数据都是要经过缓冲区的,再写入我们的文件系统的,或者发送出去。整个过程结束后,就是要进行资源的释放。编程的难点是消息是怎样交换。二、主要函数介绍rtp_session_init函数原型:void rtp_session_init (RtpSession * session, int mode)函数功能:执行rtp会话的一些必要的初始化工作参数含义:session: rtp会话结构体,含有一些rtp会话的基本信息mode: 传输模式,有以下几种,决定本会话的一些特性。RTP_SESSION_REC
18、VONLY:只进行rtp数据的接收RTP_SESSION_SENDONLY:只进行rtp数据的发送RTP_SESSION_SENDRECV:可以进行rtp数据的接收和发送执行的操作:1) 首先判断会话是否为空,若不是,则将会话初始化,即清零2) 根据传输模式设置标志变量的值,在rtpsession中一共设置了14个标志位3) 随机产生SSRC和同步源描述信息4) 传入全局的av_profile,即使用默认的profile配置,profile 包含名字与负载类型,负载类型的确认先要得到库中的所拥有的负载,再比较是否与我们所传入的负载相匹配,若是传回类型号5) 套接字的初始化,包含套接字的文件描述
19、符,套接字大小6) 初始化rtp包缓冲区队列7) 信号量的初始化,包含了7种信号量,分别为ssrc的变化 ;负载类型的改变;电话事件;电话事件包;时间戳的跳变;网络错误;RTCP结束包。8) 发送负载类型默认设置为0(pcmu音频),接收负载类型默认设置为-1(未定义)9) 将session的其他成员的值均设置一个默认值。10) 还有抖动的设置,rtcp报告的间隔,job运行等一些设置。rtp_session_new 函数原型:RtpSession *rtp_session_new (int mode)函数功能:建立一个会话该函数很简单,首先为会话分配一个内存,再调用rtp_session_i
20、nit()进行会话的初始化。成功则返回一个会话。rtp_session_set_scheduling_mode函数原型:void rtp_session_set_scheduling_mode (RtpSession * session, int yesno)函数功能: RtpScheduler管理多个session的调度和收发的控制,本函数设置是否使用该session调度管理功能。参数含义:session: rtp会话结构体yesno: 是否使用rtp session的系统调度功能说明:如果yesno为1,调用ortp_get_scheduler ()得到一个调度器,将会话添加到调度会话集合
21、中则表明使用系统的session调度管理功能,意味着可以使用以下功能:1) 可以使用session_set_select在多个rtp会话之间进行选择,根据时间戳判定某个会话是否到达了收发的时间。2) 可以使用rtp_session_set_blocking_mode()设置是否使用阻塞模式来进行rtp包的发送和接收。如果yesno为0,则表明该会话不受系统管理和调度。关于rtp session的管理和调度,由全局的变量RtpScheduler *_ortp_scheduler来负责,该变量必须通过ortp_scheduler_init() 来进行初始化操作。在ortp_scheduler_in
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序 代四码 分析
链接地址:https://www.31doc.com/p-2110420.html