00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
#ifndef MNRTP_H
00025
#define MNRTP_H
00026
00027
#include "MNArrayList.h"
00028
#include "MNRTPbase.h"
00029
#include "MNRTCP.h"
00030
#include "MNRTPSendCsrcList.h"
00031
#include "MNRTPSsrcCollisionList.h"
00032
#include "MNSocketQueue.h"
00033
#include "sdp/PayloadTypes.h"
00034
#include "sdp/TransportTypes.h"
00035
00036
00037
struct addr_list_item;
00038
00039
00040
00041
00042
00043
00044
00045 class MNRTP :
public MNRTPbase
00046 ,
public MNRTP_RTCPbye_callback
00047 ,
public MNRTP_Collision_callback
00048 {
00049
00050
00052
MNRTP& operator=(
const MNRTP& );
00053
00055
MNRTP(
const MNRTP& );
00056
00057
public:
00082
MNRTP(
MNSelector& sel,
00083
MNSocket* rtpsock,
00084
MNSocket* rtcpsock,
00085
int remote_port,
00086
const char* targetaddr_,
00087
int payload_t,
00088
u_int32 bw,
00089 RTSP::TransportTypes requested_transport = RTSP::RTP_AVP_UDP,
00090
int dpt_ts_rate = -1);
00091
00092
virtual ~MNRTP();
00093
00094
protected:
00095
00096
00101 SendCsrcList _send_csrcs;
00102
00108 SsrcCollisionList ssrc_coll_list;
00109
00111 struct sockaddr_in*
_target_save;
00112
00114 ProtectedU_int32 ssrc_collission_counter;
00115
00116 ProtectedInt32 rtcp_port;
00117
00119 struct sockaddr_in rtp_my_addr;
00120
00121
00122
00124 ProtectedU_int16 rtp_seq;
00125
00126
00127
00128 MNMutex rtp_initialized;
00129 MNMutex send_mutex;
00130
00131
00132
00133
private:
00139
int make_even(
int port);
00140
00141
void rtp_resolve_ssrc_col(
struct sockaddr_in *dest);
00142
00143
virtual RTP_RC process_data(
MNRope* rope,
struct sockaddr_in *dest);
00144
00145
void notify_write_enabled();
00146
void rtp_timeout_check();
00147
void rtp_lock();
00148
void rtp_unlock();
00149
00150
00151
virtual void RTPcollission_cb(
struct sockaddr_in *dest);
00152
00154 RTSP::TransportTypes _requested_transport;
00155
00156
00157
MNSocketQueue* _data_queue;
00158
00159
00160
00161
MNRTCP* _rtcp_server;
00162
MNMutex rtcp_mutex;
00163
00164
virtual void RTCPbye_cb(
u_int32 ssrc,
text_item_t *bye_text);
00165
00166
public:
00167
00168
00174
RTP_RC rtp_start(
bool sender =
false);
00175
00194
int rtp_send(
MNRope* buf,
00195
int marker,
00196
int ts_in_value,
00197 rtp_math tstamp );
00198
00225
int rtp_send_ext(
MNRope* buf,
00226
char* ext_buf,
00227
int ext_len,
00228
u_int16 ext_type,
00229
int marker,
00230
int ts_inc_value,
00231 rtp_math tstamp);
00232
00233
00234
u_int32 get_collision_counter();
00235
00236
00237
virtual void set_mc_ttl(
int val);
00238
00245 SendCsrcList&
rtp_csrcs() {
00246
return _send_csrcs;
00247 }
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
virtual void rt_set_ssrc(
u_int32 ssrc);
00261
00264
void disable_collision_detection();
00265
00268
void enable_collision_detection();
00269
00277
void rt_set_bandwidth(
u_int32 bw);
00278
00283
u_int32 rt_get_bandwidth();
00284
00285
00286
00287
00288
virtual MNRTCP*
rt_get_rtcp_ptr();
00289
00300
void rtcp_stop(
bool bye,
const char* reason );
00301
00302
00303
bool rtcp_start(
MNSocket* rtcpsock );
00304
00308
void enable_rtcp();
00309
00313
void disable_rtcp();
00314
00315
00316
int rtcp_send_app(
char* app,
int len,
int subtype);
00317
00320
void rtcp_set_app_name(
const char* name );
00321
00322
void stopRTPUdpServer( );
00323
00324
00325
void rtcp_register_RTCPreader_cb(
MNRTP_RTCPreader_callback* p);
00326
00327
00328
void rtcp_set_sdes(rtcp_sdes_type_t type,
char* text,
int prio);
00329
00330
00331
const sdes_list_item*
rtcp_get_sdes_text(rtcp_sdes_type_t type);
00332
00333
u_int32 rtcp_get_first_ssrc();
00334
u_int32 rtcp_get_next_ssrc(
u_int32 ssrc);
00335
private:
00336
SSRCEntry* rtcp_get_ssrc_info_ptr(
u_int32 ssrc);
00337
public:
00338
SSRCEntry rtcp_get_ssrc_info(
u_int32 ssrc);
00339
00340
00341
virtual u_int64 GetBytesSent();
00342
virtual u_int64 GetBytesRecv();
00343
00344
private:
00348
bool is_rtcp_running() const;
00349 };
00350
00351 #endif