⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdp_negoc.h

📁 libosip-0.9.7源码
💻 H
📖 第 1 页 / 共 2 页
字号:
/*  The oSIP library implements the Session Initiation Protocol (SIP -rfc3261-)  Copyright (C) 2001,2002,2003  Aymeric MOIZARD jack@atosc.org    This library is free software; you can redistribute it and/or  modify it under the terms of the GNU Lesser General Public  License as published by the Free Software Foundation; either  version 2.1 of the License, or (at your option) any later version.    This library is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  Lesser General Public License for more details.    You should have received a copy of the GNU Lesser General Public  License along with this library; if not, write to the Free Software  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/#ifndef _SDP_NEGOC_H_#define _SDP_NEGOC_H_#include <osip/sdp.h>/** * @file sdp_negoc.h * @brief oSIP and SDP offer/answer model Routines * * The SDP offer/answer model is where most SIP interoperability issue * comes from.  The SDP specification (rfc2327.txt) is often not fully * respected. As an example, most SIP applications forget to add the * mandatory 's' field in the SDP packet. Another mistake is to assume * that an SDP packet don't need a 'p' and a 'e' field. Even if they * are both optional, at least of those is mandatory! I have never * seen ONE implementation that send at least one 'p' or 'e' field!! * <BR>For all the reasons, that make negotiation a hard task, I have * decided to provide a helpful facility to build SDP answer from an * SDP offer. (This facility does not help to build the compliant offer) * Of course, after the SDP negotiator has been executed and produced * a valid response, you can still modify your SDP answer to add * attributes or modify anything. You always keep the entire control * over it. * <H2>Do you need the negotiator</H2> * If you are planning a simple application, I advise you to use it. * Advanced applications may find it inappropriate, but as you can * modify the SDP answer after running the negotiation, I see no reason * why you should not use it. The only goal of the SDP negotiator is * to make sure only one line of audio codec is accepted (the first one) * and only one line of video codec is accepted (the first one). It * also remove from the media lines, the codec that you don't support * without asking you. (Also, you can still refuse the codec you support.) * <BR>Using the negotiator, your only task is to check/add/remove * the media attributes.  *  * <H2>How-To</H2> * Using the SDP negotiator is simple. An example is provided in the * test directory as 'torture_sdp.c'. It parses a SDP packet from * a file (a sample is available in conf/) and produce the answer * that would be made with a basic configuration where 4 audio codecs * are supported. * <BR>When starting your application, you simply configure the global * sdp_config_t element: you'll set you username, ip address and some * general informations about you that every SDP packet must contain. * As a second action, you will register all the codec you support. * (audio, video and 'other' codecs). * <BR>After that, you will also register a set of method used to * accept the codec. The return code of those method will accept or * refused the supported codec for this specific session. * <pre><code> *  sdp_config_set_fcn_accept_audio_codec(&application_accept_audio_codec); *  sdp_config_set_fcn_accept_video_codec(&application_accept_video_codec); *  sdp_config_set_fcn_accept_other_codec(&application_accept_other_codec); *  sdp_config_set_fcn_get_audio_port(&application_get_audio_port); * </pre></code> * <BR>When you need to create an answer, the following code will create * the SDP packet: * <pre><code> *  sdp_context_t *context; *   *  sdp_t *dest; *  i = sdp_context_init(&context); *  i = sdp_context_set_mycontext(context, (void *)ua_context); *  i = sdp_context_set_remote_sdp(context, sdp); *  if (i!=0) { *    fprintf(stdout, "Initialisation of context failed. Could not negociate"); *  } else { *    fprintf(stdout, "Trying to execute a SIP negociation:"); *    i = sdp_context_execute_negociation(context); *    fprintf(stdout, "return code: %i",i); *    if (i==200) *     { *       dest = sdp_context_get_local_sdp(context); *       fprintf(stdout, "SDP answer:"); *       i = sdp_2char(dest, &result); *       if (i!=0) *         fprintf(stdout, "Error found in SDP answer while printing"); *       else *         fprintf(stdout, "%s", result); *       sfree(result); *     } *    sdp_context_free(context); *    sfree(context); *    return 0; *  } * </pre></code> * <BR>Notice the presence of sdp_context_set_mycontext() which can add * a store the address of your own context (probably related to your call). * This is very useful if you need to know inside the callback which call * this negotiation belongs to. *//** * @defgroup oSIP_OAM oSIP and SDP offer/answer model Handling * @ingroup oSIP * @{ */#ifdef __cplusplusextern "C"{#endif/** * Structure for applying the SDP offer/answer negotiation. * The goal is simply to give: *      1.  A configuration (sdp_config_t) *      2.  A remote SDP packet (generally from the INVITE) * The result is the creation of a local answer to * the remote SDP packet. * @defvar sdp_context_t */  typedef struct sdp_context_t sdp_context_t;  struct sdp_context_t  {    void *mycontext;		/* add the pointer to your personal context */    sdp_t *remote;    sdp_t *local;  };/** * Allocate a bandwidth element. * @param ctx The element to work on. */  int sdp_context_init (sdp_context_t ** ctx);/** * Free a bandwidth element. * @param ctx The element to work on. */  void sdp_context_free (sdp_context_t * ctx);/** * Set the context associated to this negotiation. * @param ctx The element to work on. * @param value A pointer to your personal context. */  int sdp_context_set_mycontext (sdp_context_t * ctx, void *value);/** * Get the context associated to this negotiation. * @param ctx The element to work on. */  void *sdp_context_get_mycontext (sdp_context_t * ctx);/** * Set the local SDP packet associated to this negotiation. * NOTE: This is done by the 'negotiator'. (You only need to give * the remote SDP packet) * @param ctx The element to work on. * @param sdp The local SDP packet. */  int sdp_context_set_local_sdp (sdp_context_t * ctx, sdp_t * sdp);/** * Get the local SDP packet associated to this negotiation. * @param ctx The element to work on. */  sdp_t *sdp_context_get_local_sdp (sdp_context_t * ctx);/** * Set the remote SDP packet associated to this negotiation. * @param ctx The element to work on. * @param sdp The remote SDP packet. */  int sdp_context_set_remote_sdp (sdp_context_t * ctx, sdp_t * sdp);/** * Get the remote SDP packet associated to this negotiation. * @param ctx The element to work on. */  sdp_t *sdp_context_get_remote_sdp (sdp_context_t * ctx);/** * Structure for payload management. Each payload element * represents one codec of a media line. * @defvar payload_t */  typedef struct payload_t payload_t;  struct payload_t  {    char *payload;    /*  char *port; this must be assigned by the application dynamicly */    char *number_of_port;    char *proto;    char *c_nettype;    char *c_addrtype;    char *c_addr;    char *c_addr_multicast_ttl;    char *c_addr_multicast_int;    /* rtpmap (rcvonly and other attributes are added dynamicly) */    char *a_rtpmap;  };/** * Allocate a payload element. * @param payload The payload. */  int payload_init (payload_t ** payload);/** * Free a payload element. * @param payload The payload. */  void payload_free (payload_t * payload);/** * Structure for storing the global configuration management. * The information you store here is used when computing a * remote SDP packet to build a compliant answer. * The main objectives is to: *    * automaticly refuse unknown media. *    * accept some of the known media. *    * make sure the SDP answer match the SDP offer. *    * simplify the SDP offer/answer model, as all unknown media *      are refused without any indication to the application layer. *    * In any case, you can still modify the entire SDP packet after *      a negotiation if you are not satisfied by the negotiation result. * @defvar sdp_config_t */  typedef struct sdp_config_t sdp_config_t;  struct sdp_config_t  {    char *o_username;    char *o_session_id;    char *o_session_version;    char *o_nettype;    char *o_addrtype;    char *o_addr;    char *c_nettype;    char *c_addrtype;    char *c_addr;    char *c_addr_multicast_ttl;    char *c_addr_multicast_int;    list_t *audio_codec;    list_t *video_codec;    list_t *other_codec;    int (*fcn_set_info) (void *, sdp_t *);    int (*fcn_set_uri) (void *, sdp_t *);    int (*fcn_set_emails) (void *, sdp_t *);    int (*fcn_set_phones) (void *, sdp_t *);    int (*fcn_set_attributes) (void *, sdp_t *, int);    int (*fcn_accept_audio_codec) (void *, char *, char *, int, char *);    int (*fcn_accept_video_codec) (void *, char *, char *, int, char *);    int (*fcn_accept_other_codec) (void *, char *, char *, char *, char *);    char *(*fcn_get_audio_port) (void *, int);    char *(*fcn_get_video_port) (void *, int);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -