注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

linux 学习

 
 
 

日志

 
 

[转载]ortp分析之二 主要结构体  

2011-05-21 17:45:06|  分类: ORTP库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

原文出自:http://blog.csdn.net/ren911/archive/2010/07/10/5724602.aspx


头文件分析

从例子源码rtpsend.c看,主要的初始话步骤是:

         ortp_init();

         ortp_scheduler_init();

         session=rtp_session_new(RTP_SESSION_SENDONLY); 

这三步中涉及到了主要的结构体,具体如下:

1.1 ortp_init()涉及_RtpProfilertp_stats

void ortp_init()

{

         static bool_t initialized=FALSE;

         if (initialized) return;

         initialized=TRUE;

 

#ifdef WIN32

         win32_init_sockets();

#endif

 

         av_profile_init(&av_profile);

         ortp_global_stats_reset();//重置rtp_stats结构

         init_random_number_generator();

         ortp_message("oRTP-" ORTP_VERSION " initialized.");

}

 

主要涉及结构体:RtpProfile av_profile; RtpProfilepayloadtype.h

 

 

struct _RtpProfile

{

         char *name;

         PayloadType *payload[RTP_PROFILE_MAX_PAYLOADS];

};

 

ortp_global_stats_reset()涉及的结构体如下

typedef struct rtp_stats

{

         uint64_t packet_sent;

        

         uint64_t sent;          

        

         uint64_t recv;                  

        

         uint64_t hw_recv;           

        

         uint64_t packet_recv;    

        

         uint64_t unavaillable;     

        

uint64_t outoftime;                  

 

         uint64_t cum_packet_loss;

        

         uint64_t bad;                    

        

         uint64_t discarded;         

} rtp_stats_t;

 主要用于ortp对整个RTP过程的全局数据的统计,例如在源码中使用    ortp_global_stats_display() 就可以显示如下:

ortp-message-oRTP-stats:

   Global statistics :

ortp-message- number of rtp packet sent=1430

ortp-message- number of rtp bytes sent=1687484 bytes

ortp-message- number of rtp packet received=0

ortp-message- number of rtp bytes received=0 bytes

ortp-message- number of incoming rtp bytes successfully delivered to the application=0

ortp-message- number of times the application queried a packet that didn't exist=0

ortp-message- number of rtp packet lost=0

ortp-message- number of rtp packets received too late=0

ortp-message- number of bad formatted rtp packets=0

ortp-message- number of packet discarded because of queue overflow=0

*/

 

1.2 ortp_scheduler_init()涉及RtpScheduler

ortp_scheduler_init(),对全局变量RtpScheduler *__ortp_scheduler初始化,RtpScheduler管理多个session的调度和收发的控制。

struct _RtpScheduler {

 

        

        

         RtpSession *list;     

        

         SessionSet        all_sessions; 

        

         int              all_max;           

        

         SessionSet  r_sessions;         

         int              r_max;

        

         SessionSet        w_sessions;             

         int            w_max;

        

         SessionSet        e_sessions;     

         int              e_max;

         int max_sessions;            

 

         ortp_cond_t   unblock_select_cond;

         ortp_mutex_t  lock;

         ortp_thread_t thread;

         int thread_running;

         struct _RtpTimer *timer;

        

         uint32_t time_;      

         uint32_t timer_inc;

};

typedef struct _RtpScheduler RtpScheduler;

 

1.3 rtp_session_new(RTP_SESSION_SENDONLY)涉及_RtpSession

 

rtp_session_new创建一个新的rtp会话,对其初始化,首先设置好最大队列数和模式,判断读写模式,根据模式设置flag,设置随机数random,设置源的描述,信号的设置,互斥锁的设置,设置send payloadreceive payload type,设置jitter(见),设置最大接受单元等等。。Session是在实际编程中最常操作的结构,如rtp_session_*主要都是对session的操作,具体结构解释如下:

struct _RtpSession

{

         RtpSession *next;   

         int mask_pos; 

        struct {

           RtpProfile *profile;

           int pt;

           unsigned int ssrc;

           WaitPoint wp;

           int telephone_events_pt;   

         } snd,rcv;

         unsigned int inc_ssrc_candidate;

         int inc_same_ssrc_count;

         int hw_recv_pt;

         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_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;

        

         struct timeval last_recv_time;

         mblk_t *pending;

        

         mblk_t *current_tev;               

         mblk_t *sd;

         queue_t contributing_sources;

         bool_t symmetric_rtp;

         bool_t permissive;

         bool_t use_connect;

         bool_t ssrc_set;

};

  评论这张
 
阅读(2904)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018