osip_rfc3264.c

来自「最新osip源代码」· C语言 代码 · 共 1,093 行 · 第 1/2 页

C
1,093
字号
/*  The oSIP library implements the Session Initiation Protocol (SIP -rfc3261-)  Copyright (C) 2001,2002,2003,2004,2005  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*/#include <stdlib.h>#include <osipparser2/osip_port.h>#include <osipparser2/osip_rfc3264.h>#include <osip_rfc3264i.h>      /* internal include *//** * Initialize negotiation facility.. * @param config The element to work on. */intosip_rfc3264_init (struct osip_rfc3264 **config){  osip_rfc3264_t *cnf;  *config = NULL;  cnf = (osip_rfc3264_t *) osip_malloc (sizeof (osip_rfc3264_t));  if (cnf == NULL)    return -1;  memset (cnf, 0, sizeof (osip_rfc3264_t));  *config = cnf;  return 0;}/** * Free negotiation facility. * @param config The element to work on. */voidosip_rfc3264_free (struct osip_rfc3264 *config){  osip_rfc3264_t *cnf = (osip_rfc3264_t *) config;  int i;  if (config == NULL)    return;  for (i = 0; i < MAX_AUDIO_CODECS; i++)    {      if (cnf->audio_medias[i] != NULL)        {          sdp_media_free (cnf->audio_medias[i]);          cnf->audio_medias[i] = NULL;        }    }  for (i = 0; i < MAX_VIDEO_CODECS; i++)    {      if (cnf->video_medias[i] != NULL)        {          sdp_media_free (cnf->video_medias[i]);          cnf->video_medias[i] = NULL;        }    }  for (i = 0; i < MAX_T38_CODECS; i++)    {      if (cnf->t38_medias[i] != NULL)        {          sdp_media_free (cnf->t38_medias[i]);          cnf->t38_medias[i] = NULL;        }    }  for (i = 0; i < MAX_APP_CODECS; i++)    {      if (cnf->app_medias[i] != NULL)        {          sdp_media_free (cnf->app_medias[i]);          cnf->app_medias[i] = NULL;        }    }  osip_free (cnf);}/** * Test if a media exist in the configuration. * @param config The element to work on. * @param pos The index of the media element. */intosip_rfc3264_endof_media (struct osip_rfc3264 *config, int pos){  if (config == NULL)    return -1;  return 0;}/** * Get a media from the configuration. * @param config The element to work on. * @param pos The index of the media element to get. */sdp_media_t *osip_rfc3264_get (struct osip_rfc3264 * config, int pos){  if (config == NULL)    return NULL;  return NULL;}/** * Remove a media from the configuration. * @param config The element to work on. * @param pos The index of the media element to remove. */intosip_rfc3264_remove (struct osip_rfc3264 *config, int pos){  if (config == NULL)    return -1;  return 0;}/** * Remove all medias from the configuration. * @param config The element to work on. */intosip_rfc3264_reset_media (struct osip_rfc3264 *config){  if (config == NULL)    return -1;  return 0;}/** * Add a media (for audio) in the configuration. * @param config The element to work on. * @param med The media element to add. * @param pos The index of the media element to add. */intosip_rfc3264_add_audio_media (struct osip_rfc3264 *config, sdp_media_t * med,                              int pos){  osip_rfc3264_t *cnf = (osip_rfc3264_t *) config;  if (config == NULL)    return -1;  if (pos >= MAX_AUDIO_CODECS)    return -1;  if (pos == -1)    {      for (pos = 0; pos < MAX_AUDIO_CODECS && cnf->audio_medias[pos] != NULL;           pos++)        {        }    }  if (pos >= MAX_AUDIO_CODECS)    return -1;                  /* no space left */  cnf->audio_medias[pos] = med;  return 0;}/** * Remove a media in the configuration. * @param config The element to work on. * @param pos The index of the media element to remove. */intosip_rfc3264_del_audio_media (struct osip_rfc3264 *config, int pos){  osip_rfc3264_t *cnf = (osip_rfc3264_t *) config;  if (config == NULL)    return -1;  if (pos >= MAX_AUDIO_CODECS)    return -1;  sdp_media_free (cnf->audio_medias[pos]);  cnf->audio_medias[pos] = NULL;  return 0;}/** * Add a media (for video) in the configuration. * @param config The element to work on. * @param med The media element to add. * @param pos The index of the media element to add. */intosip_rfc3264_add_video_media (struct osip_rfc3264 *config, sdp_media_t * med,                              int pos){  osip_rfc3264_t *cnf = (osip_rfc3264_t *) config;  if (config == NULL)    return -1;  if (pos >= MAX_VIDEO_CODECS)    return -1;  if (pos == -1)    {      for (pos = 0; pos < MAX_VIDEO_CODECS && cnf->video_medias[pos] != NULL;           pos++)        {        }    }  if (pos >= MAX_VIDEO_CODECS)    return -1;                  /* no space left */  cnf->video_medias[pos] = med;  return 0;}/** * Remove a media in the configuration. * @param config The element to work on. * @param pos The index of the media element to remove. */intosip_rfc3264_del_video_media (struct osip_rfc3264 *config, int pos){  osip_rfc3264_t *cnf = (osip_rfc3264_t *) config;  if (config == NULL)    return -1;  if (pos >= MAX_VIDEO_CODECS)    return -1;  sdp_media_free (cnf->video_medias[pos]);  cnf->video_medias[pos] = NULL;  return 0;}/** * Add a media (for t38) in the configuration. * @param config The element to work on. * @param med The media element to add. * @param pos The index of the media element to add. */intosip_rfc3264_add_t38_media (struct osip_rfc3264 *config, sdp_media_t * med,                            int pos){  osip_rfc3264_t *cnf = (osip_rfc3264_t *) config;  if (config == NULL)    return -1;  if (pos >= MAX_T38_CODECS)    return -1;  if (pos == -1)    {      for (pos = 0; pos < MAX_T38_CODECS && cnf->t38_medias[pos] != NULL; pos++)        {        }    }  if (pos >= MAX_T38_CODECS)    return -1;                  /* no space left */  cnf->t38_medias[pos] = med;  return 0;}/** * Remove a media in the configuration. * @param config The element to work on. * @param pos The index of the media element to remove. */intosip_rfc3264_del_t38_media (struct osip_rfc3264 *config, int pos){  osip_rfc3264_t *cnf = (osip_rfc3264_t *) config;  if (config == NULL)    return -1;  if (pos >= MAX_T38_CODECS)    return -1;  sdp_media_free (cnf->t38_medias[pos]);  cnf->t38_medias[pos] = NULL;  return 0;}/** * Search for support of a special codec. * @param config The element to work on. * @param payload The payload to find. * @param rtpmap The rtpmap for the payload. */sdp_media_t *osip_rfc3264_find_audio (struct osip_rfc3264 * config, char *payload, char *rtpmap){  osip_rfc3264_t *cnf = (osip_rfc3264_t *) config;  int i;  if (config == NULL)    return NULL;  if (rtpmap == NULL)    {      for (i = 0; i < MAX_AUDIO_CODECS; i++)        {          if (cnf->audio_medias[i] != NULL)            {              sdp_media_t *med = cnf->audio_medias[i];              char *str = (char *) osip_list_get (med->m_payloads, 0);              /* static payload?: only compare payload number */              if (strlen (str) == strlen (payload)                  && 0 == osip_strcasecmp (str, payload))                return med;            }        }      return NULL;    }  for (i = 0; i < MAX_AUDIO_CODECS; i++)    {      if (cnf->audio_medias[i] != NULL)        {          sdp_media_t *med = cnf->audio_medias[i];          int pos = 0;          while (!osip_list_eol (med->a_attributes, pos))            {              sdp_attribute_t *attr =                (sdp_attribute_t *) osip_list_get (med->a_attributes, pos);              if (0 == osip_strcasecmp ("rtpmap", attr->a_att_field)                  && attr->a_att_value != NULL)                {                  char *tmp = strchr (attr->a_att_value, ' ');                  char *tmp2 = strchr (rtpmap, ' ');                  if (tmp != NULL && tmp2 != NULL)                    {                      if (0 == osip_strcasecmp (tmp, tmp2))                        return med;                    }                }              pos++;            }        }    }  return NULL;}/** * Search for support of a special codec. * @param config The element to work on. * @param payload The payload to find. * @param rtpmap The rtpmap for the payload. */sdp_media_t *osip_rfc3264_find_video (struct osip_rfc3264 * config, char *payload, char *rtpmap){  osip_rfc3264_t *cnf = (osip_rfc3264_t *) config;  int i;  if (config == NULL)    return NULL;  if (rtpmap == NULL)    {      for (i = 0; i < MAX_VIDEO_CODECS; i++)        {          if (cnf->video_medias[i] != NULL)            {              sdp_media_t *med = cnf->video_medias[i];              char *str = (char *) osip_list_get (med->m_payloads, 0);              /* static payload?: only compare payload number */              if (strlen (str) == strlen (payload)                  && 0 == osip_strcasecmp (str, payload))                return med;            }        }      return NULL;    }  for (i = 0; i < MAX_VIDEO_CODECS; i++)    {      if (cnf->video_medias[i] != NULL)        {          sdp_media_t *med = cnf->video_medias[i];          int pos = 0;          while (!osip_list_eol (med->a_attributes, pos))            {              sdp_attribute_t *attr =                (sdp_attribute_t *) osip_list_get (med->a_attributes, pos);              if (0 == osip_strcasecmp ("rtpmap", attr->a_att_field)                  && attr->a_att_value != NULL)                {                  char *tmp = strchr (attr->a_att_value, ' ');                  char *tmp2 = strchr (rtpmap, ' ');                  if (tmp != NULL && tmp2 != NULL)                    {                      if (0 == osip_strcasecmp (tmp, tmp2))                        return med;                    }                }              pos++;            }        }    }  return NULL;}/** * Search for support of a special codec. * @param config The element to work on. * @param payload The payload to find. */sdp_media_t *osip_rfc3264_find_t38 (struct osip_rfc3264 * config, char *payload){  osip_rfc3264_t *cnf = (osip_rfc3264_t *) config;  if (config == NULL)    return NULL;  return NULL;}/** * Search for support of a special codec. * @param config The element to work on. * @param payload The payload to find. */sdp_media_t *osip_rfc3264_find_app (struct osip_rfc3264 * config, char *payload){  osip_rfc3264_t *cnf = (osip_rfc3264_t *) config;  if (config == NULL)    return NULL;  return NULL;}/** * Compare remote sdp packet against local supported media. *    Only one media line is checked. * * @param config The element to work on. * @param remote_sdp The remote SDP packet. * @param audio_tab The local list of media supported by both side. * @param video_tab The local list of media supported by both side. * @param t38_tab The local list of media supported by both side. * @param app_tab The local list of media supported by both side. * @param pos_media The position of the media line to match. */intosip_rfc3264_match (struct osip_rfc3264 *config,                    sdp_message_t * remote_sdp,                    sdp_media_t * audio_tab[],                    sdp_media_t * video_tab[],                    sdp_media_t * t38_tab[],                    sdp_media_t * app_tab[], int pos_media){  sdp_media_t *remote_med;  int pos;  audio_tab[0] = NULL;  video_tab[0] = NULL;  t38_tab[0] = NULL;  app_tab[0] = NULL;  if (config == NULL)    return -1;  pos = 0;  while (!sdp_message_endof_media (remote_sdp, pos))    {      if (pos_media == 0)        {          remote_med = osip_list_get (remote_sdp->m_medias, pos);          if (remote_med->m_media != NULL              && 0 == osip_strcasecmp (remote_med->m_media, "audio"))            {              osip_rfc3264_match_audio (config, remote_sdp, remote_med, audio_tab);          } else if (remote_med->m_media != NULL                     && 0 == osip_strcasecmp (remote_med->m_media, "video"))            {              osip_rfc3264_match_video (config, remote_sdp, remote_med, video_tab);          } else if (remote_med->m_media != NULL                     && 0 == osip_strcasecmp (remote_med->m_media, "image"))            {              osip_rfc3264_match_t38 (config, remote_sdp, remote_med, t38_tab);          } else if (remote_med->m_media != NULL                     && 0 == osip_strcasecmp (remote_med->m_media, "application"))            {              osip_rfc3264_match_app (config, remote_sdp, remote_med, app_tab);            }          return 0;        }      remote_med = NULL;      pos++;      pos_media--;    }  return -1;}/** * Compare remote sdp packet against local supported media for audio. * @param config The element to work on. * @param remote_sdp The remote SDP packet. * @param remote_med The remote Media SDP line. * @param audio_tab The local list of media supported by both side. */intosip_rfc3264_match_audio (struct osip_rfc3264 *config,                          sdp_message_t * remote_sdp,                          sdp_media_t * remote_med, sdp_media_t * audio_tab[]){  osip_rfc3264_t *cnf = (osip_rfc3264_t *) config;  int num = 0;  int pos;

⌨️ 快捷键说明

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