欢迎来到天天文库
浏览记录
ID:29058111
大小:87.04 KB
页数:17页
时间:2018-12-16
《《程序代码分析》word版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、一、源代码的构建框架Ortp是一种开源软件,实现了RTP与RTCP协议。首先在RTP中有几种重要的结构体,第一种比较重要的结构体是payloadtype,该结构用于指定编码类型,以及与其相关的时钟速率、采样率等一些参数,参见下图。struct_PayloadType{inttype;/**2、zero_pattern;intpattern_length;/*otherusefulinformationfortheapplication*/intnormal_bitrate;/*inbit/s*/char*mime_type;/**3、eam*/char*send_fmtp;/*variousformatparametersfortheoutgoingstream*/intflags;void*user_data;};在代码中,不同的媒体类型有不同的payloadtype结构体与之对应,h263,g729,MPEG4等。因为每种编码都有其独有的特点,而且许多参数也不一样,所以RTP包头中使用payload域标记负载的类型,一方面接收端可以就此判断负载的类型,从而选择对应的解码器进行解码播放;另一方面,代码在进行时间戳等方面的计算时可以更加4、方便一点。所有系统当前支持的payload类型都被放在一个数组中,由全局变量av_profile这个结构体实例统领。除了payloadtype结构体外,一个更重要的结构体是rtpsession。该结构体即是一个会话的抽象,与会话相关的各种信息都定义在该结构体上或者能够通过该结构体找到。要使用oRTP进行媒体数据的传输,需要先创建一个会话,之后所有数据的传输都在会话上完成或基于会话完成。rtpsession结构体的定义如下:struct_RtpSession{RtpSession*next;/*nextRtp5、Session,whenthesessionareenqueuedbythescheduler*/intmask_pos;/*thepositionintheschedulermaskofRtpSession:donotmovethisfield:itispartoftheABIsincethesession_setmacrosuseit*/struct{RtpProfile*profile;intpt;unsignedintssrc;WaitPointwp;inttelephone_events_pt;/6、*thepayloadtypeusedfortelephonyevents*/}snd,rcv;unsignedintinc_ssrc_candidate;intinc_same_ssrc_count;inthw_recv_pt;/*recvpayloadtypebeforejitterbuffer*/intrecv_buf_size;RtpSignalTableon_ssrc_changed;RtpSignalTableon_payload_type_changed;RtpSignalTableon_te7、lephone_event_packet;RtpSignalTableon_telephone_event;RtpSignalTableon_timestamp_jump;RtpSignalTableon_network_error;RtpSignalTableon_rtcp_bye;struct_OList*signal_tables;struct_OList*eventqs;msgb_allocator_tallocator;RtpStreamrtp;RtcpStreamrtcp;RtpSessionM8、odemode;struct_RtpScheduler*sched;uint32_tflags;intdscp;intmulticast_ttl;intmulticast_loopback;void*user_data;/*FIXME:Shouldbeatableforallsessionparticipants.*/structtimevallast_recv_time;/*Timeofreceivingthe
2、zero_pattern;intpattern_length;/*otherusefulinformationfortheapplication*/intnormal_bitrate;/*inbit/s*/char*mime_type;/**3、eam*/char*send_fmtp;/*variousformatparametersfortheoutgoingstream*/intflags;void*user_data;};在代码中,不同的媒体类型有不同的payloadtype结构体与之对应,h263,g729,MPEG4等。因为每种编码都有其独有的特点,而且许多参数也不一样,所以RTP包头中使用payload域标记负载的类型,一方面接收端可以就此判断负载的类型,从而选择对应的解码器进行解码播放;另一方面,代码在进行时间戳等方面的计算时可以更加4、方便一点。所有系统当前支持的payload类型都被放在一个数组中,由全局变量av_profile这个结构体实例统领。除了payloadtype结构体外,一个更重要的结构体是rtpsession。该结构体即是一个会话的抽象,与会话相关的各种信息都定义在该结构体上或者能够通过该结构体找到。要使用oRTP进行媒体数据的传输,需要先创建一个会话,之后所有数据的传输都在会话上完成或基于会话完成。rtpsession结构体的定义如下:struct_RtpSession{RtpSession*next;/*nextRtp5、Session,whenthesessionareenqueuedbythescheduler*/intmask_pos;/*thepositionintheschedulermaskofRtpSession:donotmovethisfield:itispartoftheABIsincethesession_setmacrosuseit*/struct{RtpProfile*profile;intpt;unsignedintssrc;WaitPointwp;inttelephone_events_pt;/6、*thepayloadtypeusedfortelephonyevents*/}snd,rcv;unsignedintinc_ssrc_candidate;intinc_same_ssrc_count;inthw_recv_pt;/*recvpayloadtypebeforejitterbuffer*/intrecv_buf_size;RtpSignalTableon_ssrc_changed;RtpSignalTableon_payload_type_changed;RtpSignalTableon_te7、lephone_event_packet;RtpSignalTableon_telephone_event;RtpSignalTableon_timestamp_jump;RtpSignalTableon_network_error;RtpSignalTableon_rtcp_bye;struct_OList*signal_tables;struct_OList*eventqs;msgb_allocator_tallocator;RtpStreamrtp;RtcpStreamrtcp;RtpSessionM8、odemode;struct_RtpScheduler*sched;uint32_tflags;intdscp;intmulticast_ttl;intmulticast_loopback;void*user_data;/*FIXME:Shouldbeatableforallsessionparticipants.*/structtimevallast_recv_time;/*Timeofreceivingthe
3、eam*/char*send_fmtp;/*variousformatparametersfortheoutgoingstream*/intflags;void*user_data;};在代码中,不同的媒体类型有不同的payloadtype结构体与之对应,h263,g729,MPEG4等。因为每种编码都有其独有的特点,而且许多参数也不一样,所以RTP包头中使用payload域标记负载的类型,一方面接收端可以就此判断负载的类型,从而选择对应的解码器进行解码播放;另一方面,代码在进行时间戳等方面的计算时可以更加
4、方便一点。所有系统当前支持的payload类型都被放在一个数组中,由全局变量av_profile这个结构体实例统领。除了payloadtype结构体外,一个更重要的结构体是rtpsession。该结构体即是一个会话的抽象,与会话相关的各种信息都定义在该结构体上或者能够通过该结构体找到。要使用oRTP进行媒体数据的传输,需要先创建一个会话,之后所有数据的传输都在会话上完成或基于会话完成。rtpsession结构体的定义如下:struct_RtpSession{RtpSession*next;/*nextRtp
5、Session,whenthesessionareenqueuedbythescheduler*/intmask_pos;/*thepositionintheschedulermaskofRtpSession:donotmovethisfield:itispartoftheABIsincethesession_setmacrosuseit*/struct{RtpProfile*profile;intpt;unsignedintssrc;WaitPointwp;inttelephone_events_pt;/
6、*thepayloadtypeusedfortelephonyevents*/}snd,rcv;unsignedintinc_ssrc_candidate;intinc_same_ssrc_count;inthw_recv_pt;/*recvpayloadtypebeforejitterbuffer*/intrecv_buf_size;RtpSignalTableon_ssrc_changed;RtpSignalTableon_payload_type_changed;RtpSignalTableon_te
7、lephone_event_packet;RtpSignalTableon_telephone_event;RtpSignalTableon_timestamp_jump;RtpSignalTableon_network_error;RtpSignalTableon_rtcp_bye;struct_OList*signal_tables;struct_OList*eventqs;msgb_allocator_tallocator;RtpStreamrtp;RtcpStreamrtcp;RtpSessionM
8、odemode;struct_RtpScheduler*sched;uint32_tflags;intdscp;intmulticast_ttl;intmulticast_loopback;void*user_data;/*FIXME:Shouldbeatableforallsessionparticipants.*/structtimevallast_recv_time;/*Timeofreceivingthe
此文档下载收益归作者所有