diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/AV/RTCP.h')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/AV/RTCP.h | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/TAO/orbsvcs/orbsvcs/AV/RTCP.h b/TAO/orbsvcs/orbsvcs/AV/RTCP.h new file mode 100644 index 00000000000..58688376837 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/AV/RTCP.h @@ -0,0 +1,256 @@ +// -*- C++ -*- + +/** + * Copyright (c) 1993-1994 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and the Network Research Group at + * Lawrence Berkeley Laboratory. + * 4. Neither the name of the University nor of the Laboratory may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +//============================================================================= +/** + * @file RTCP.h + * + * $Id$ + * + * @author Nagarajan Surendran <naga@cs.wustl.edu> + */ +//============================================================================= + + +#ifndef TAO_AV_RTCP_H +#define TAO_AV_RTCP_H +#include /**/ "ace/pre.h" + +#include "orbsvcs/AV/RTCP_Channel.h" + +// FUZZ: disable check_for_math_include + +#include "orbsvcs/AV/AVStreams_i.h" +#include "orbsvcs/AV/UDP.h" +#include "orbsvcs/AV/RTP.h" +#include "ace/Hash_Map_Manager_T.h" +#include <math.h> +#include <stdlib.h> + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +class TAO_AV_RTCP_Callback; + +/** + * @class TAO_AV_RTCP + * @brief Encapsulate the header format for the Real Time Control + * Protocol (RTCP) + */ +class TAO_AV_Export TAO_AV_RTCP +{ +public: + struct rtcphdr + { + ACE_UINT16 rh_flags; /* T:2 P:1 CNT:5 PT:8 */ + ACE_UINT16 rh_len; /* length of message (in bytes) */ + ACE_UINT32 rh_ssrc; /* synchronization src id */ + }; + + struct ntp64 + { + ACE_UINT32 upper; /* more significant 32 bits */ + ACE_UINT32 lower; /* less significant 32 bits */ + }; + + struct md5_string + { + int type; + ACE_Time_Value tv; + pid_t pid; + pid_t pgid; + pid_t ppid; + uid_t uid; + gid_t gid; + }; + + static void send_report (ACE_Message_Block *mb); + + static ACE_UINT32 alloc_srcid (ACE_UINT32 addr); + + static double rtcp_interval (int members, + int senders, + double rtcp_bw, + int we_sent, + int packet_size, + int *avg_rtcp_size, + int initial); +}; + + + +/** + * @class TAO_AV_RTCP_Flow_Factory + * @brief + */ +class TAO_AV_Export TAO_AV_RTCP_Flow_Factory + :public TAO_AV_Flow_Protocol_Factory +{ +public: + TAO_AV_RTCP_Flow_Factory (void); + virtual ~TAO_AV_RTCP_Flow_Factory (void); + virtual int init (int argc, char *argv[]); + virtual int match_protocol (const char *flow_string); + virtual TAO_AV_Protocol_Object* make_protocol_object (TAO_FlowSpec_Entry *entry, + TAO_Base_StreamEndPoint *endpoint, + TAO_AV_Flow_Handler *handler, + TAO_AV_Transport *transport); +}; + +class TAO_AV_Callback; + + +/** + * @class TAO_AV_RTCP_Callback + * @brief TAO_AV_Callback for RTCP protocol + */ +class TAO_AV_Export TAO_AV_RTCP_Callback : public TAO_AV_Callback +{ +public: + /// RTCP callback. + TAO_AV_RTCP_Callback (void); + + /// virtual destructor. + virtual ~TAO_AV_RTCP_Callback (void); + + /// Called during Streamctrl->start. + virtual int handle_start (void); + + /// Called during Streamctrl->stop. + virtual int handle_stop (void); + + /// Called during timeout for Flow Producers. + virtual int handle_timeout (void *arg); + + /// Called when a frame arrives for a FlowConsumer. + virtual int receive_frame (ACE_Message_Block *frame, + TAO_AV_frame_info *frame_info = 0, + const ACE_Addr &peer_address = ACE_Addr::sap_any); + int send_frame (ACE_Message_Block *frame); + + virtual int receive_control_frame (ACE_Message_Block *frame, + const ACE_Addr &peer_address = ACE_Addr::sap_any); + + /// Called during Streamctrl->destroy i.e tear_down of the stream + /// @@coryan:Call it handle_destroy or handle_close. + virtual int handle_destroy (void); + + /// Called to get the timeout. If tv is 0 then the framework stop + /// calling this. + virtual void get_timeout (ACE_Time_Value *&tv, + void *&arg); + + int send_report(int bye); + void schedule (int ms); + TAO_AV_RTP_State *state (void); + void ts_offset (ACE_UINT32 offset); + +protected: + ACE_Hash_Map_Manager<ACE_UINT32, RTCP_Channel_In*, ACE_Null_Mutex> inputs_; + RTCP_Channel_Out output_; + int timeout_; + int timestamp_offset_; + int sdes_count_; + + int is_initial_timeout_; + int avg_rtcp_size_; + int packet_size_; +}; + +class RTP_Packet; + + +/** + * @class TAO_AV_RTCP_Object + * @brief TAO_AV_Protocol_Object for RTCP protocol + */ +class TAO_AV_Export TAO_AV_RTCP_Object + : public TAO_AV_Protocol_Object +{ +public: + /// constructor. + TAO_AV_RTCP_Object (TAO_AV_Callback *client_cb, + TAO_AV_RTCP_Callback *&rtcp_cb, + TAO_AV_Transport *transport = 0); + + /// Destructor + virtual ~TAO_AV_RTCP_Object (void); + + virtual int handle_input (void); + virtual int handle_control_input (ACE_Message_Block *frame, + const ACE_Addr &peer_address); + virtual int handle_control_output (ACE_Message_Block *frame); + + /// set/get policies. + virtual int set_policies (const TAO_AV_PolicyList &policy_list); + + /// start/stop the flow. + virtual int start (void); + virtual int stop (void); + + /// send a data frame. + virtual int send_frame (ACE_Message_Block *frame, + TAO_AV_frame_info *frame_info = 0); + + /// send a frame in iovecs. + virtual int send_frame (const iovec *iov, + int iovcnt, + TAO_AV_frame_info *frame_info = 0); + + virtual int send_frame (const char*buf, + size_t len); + + /// end the stream. + virtual int destroy (void); + + void ssrc (ACE_UINT32 ssrc) {this->ssrc_ = ssrc; } + ACE_UINT32 ssrc (void) { return this->ssrc_; } + + void ts_offset (ACE_UINT32 ts_offset); + + +private: + TAO_AV_Callback *client_cb_; + TAO_AV_RTCP_Callback rtcp_cb_; + ACE_UINT32 ssrc_; +}; + +TAO_END_VERSIONED_NAMESPACE_DECL + +ACE_STATIC_SVC_DECLARE (TAO_AV_RTCP_Flow_Factory) +ACE_FACTORY_DECLARE (TAO_AV, TAO_AV_RTCP_Flow_Factory) + +#include /**/ "ace/post.h" +#endif /* TAO_AV_RTCP_H */ |