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

📄 osip_negotiation.c

📁 嵌入式产品中的osip的源代码.
💻 C
📖 第 1 页 / 共 3 页
字号:
    }  return 0;}intosip_negotiation_ctx_execute_negotiation (osip_negotiation_t * config,					  osip_negotiation_ctx_t * context){  int m_lines_that_match = 0;  sdp_message_t *remote;  sdp_message_t *local;  int i;  if (context == NULL)    return -1;  remote = context->remote;  if (remote == NULL)    return -1;  i = sdp_message_init (&local);  if (i != 0)    return -1;  if (0 != strncmp (remote->v_version, "0", 1))    {      sdp_message_free (local);      /*      sdp_context->fcn_wrong_version(context); */      return 406;		/* Not Acceptable */    }  i = sdp_partial_clone (config, context, remote, &local);  if (i != 0)    {      sdp_message_free (local);      return -1;    }  i = sdp_confirm_media (config, context, remote, &local);  if (i != 0)    {      sdp_message_free (local);      return i;    }  i = 0;  while (!sdp_message_endof_media (local, i))    {      /* this is to refuse each line with no codec that matches! */      if (NULL == sdp_message_m_payload_get (local, i, 0))	{	  sdp_media_t *med = osip_list_get ((local)->m_medias, i);	  char *str = sdp_message_m_payload_get (remote, i, 0);	  sdp_message_m_payload_add (local, i, osip_strdup (str));	  osip_free (med->m_port);	  med->m_port = osip_strdup ("0");	/* refuse this line */	}      else	{			/* number of "m" lines that match */	  sdp_media_t *med = osip_list_get (local->m_medias, i);	  m_lines_that_match++;	  osip_free (med->m_port);	  /* AMD: use the correct fcn_get_xxx_port method: */	  if (0 == strcmp (med->m_media, "audio"))	    {	      if (config->fcn_get_audio_port != NULL)		med->m_port = config->fcn_get_audio_port (context, i);	      else		med->m_port = osip_strdup ("0");	/* should never happen */	    }	  else if (0 == strcmp (med->m_media, "video"))	    {	      if (config->fcn_get_video_port != NULL)		med->m_port = config->fcn_get_video_port (context, i);	      else		med->m_port = osip_strdup ("0");	/* should never happen */	    }	  else	    {	      if (config->fcn_get_other_port != NULL)		med->m_port = config->fcn_get_other_port (context, i);	      else		med->m_port = osip_strdup ("0");	/* should never happen */	    }	}      i++;    }  if (m_lines_that_match > 0)    {      context->local = local;      return 200;    }  else    {      sdp_message_free (local);      return 415;    }}intosip_negotiation_sdp_build_offer (osip_negotiation_t * config,				  osip_negotiation_ctx_t * con,				  sdp_message_t ** sdp, char *audio_port,				  char *video_port){  int i;  int media_line = 0;  i = sdp_message_init (sdp);  if (i != 0)    return -1;  sdp_message_v_version_set (*sdp, osip_strdup ("0"));  /* those fields MUST be set */  sdp_message_o_origin_set (*sdp,			    osip_strdup (config->o_username),			    osip_strdup (config->o_session_id),			    osip_strdup (config->o_session_version),			    osip_strdup (config->o_nettype),			    osip_strdup (config->o_addrtype),			    osip_strdup (config->o_addr));  sdp_message_s_name_set (*sdp, osip_strdup ("A call"));  if (config->fcn_set_info != NULL)    config->fcn_set_info (con, *sdp);  if (config->fcn_set_uri != NULL)    config->fcn_set_uri (con, *sdp);  if (config->fcn_set_emails != NULL)    config->fcn_set_emails (con, *sdp);  if (config->fcn_set_phones != NULL)    config->fcn_set_phones (con, *sdp);  if (config->c_nettype != NULL)    sdp_message_c_connection_add (*sdp, -1,				  osip_strdup (config->c_nettype),				  osip_strdup (config->c_addrtype),				  osip_strdup (config->c_addr),				  osip_strdup (config->c_addr_multicast_ttl),				  osip_strdup (config->c_addr_multicast_int));  {				/* offer-answer draft says we must copy the "t=" line */    int now = time (NULL);    char *tmp = osip_malloc (15);    char *tmp2 = osip_malloc (15);    sprintf (tmp, "%i", now);    sprintf (tmp2, "%i", now + 3600);    i = sdp_message_t_time_descr_add (*sdp, tmp, tmp2);    if (i != 0)      return -1;  }  if (config->fcn_set_attributes != NULL)    config->fcn_set_attributes (con, *sdp, -1);  /* add all audio codec */  if (!osip_list_eol (config->audio_codec, 0))    {      int pos = 0;      __payload_t *my =	(__payload_t *) osip_list_get (config->audio_codec, pos);      /* all media MUST have the same PROTO, PORT. */      sdp_message_m_media_add (*sdp, osip_strdup ("audio"),			       osip_strdup (audio_port),			       osip_strdup (my->number_of_port),			       osip_strdup (my->proto));      while (!osip_list_eol (config->audio_codec, pos))	{	  my = (__payload_t *) osip_list_get (config->audio_codec, pos);	  sdp_message_m_payload_add (*sdp, media_line,				     osip_strdup (my->payload));	  if (my->a_rtpmap != NULL)	    sdp_message_a_attribute_add (*sdp, media_line,					 osip_strdup ("rtpmap"),					 osip_strdup (my->a_rtpmap));	  pos++;	}      media_line++;    }  /* add all video codec */  if (!osip_list_eol (config->video_codec, 0))    {      int pos = 0;      __payload_t *my =	(__payload_t *) osip_list_get (config->video_codec, pos);      /* all media MUST have the same PROTO, PORT. */      sdp_message_m_media_add (*sdp, osip_strdup ("video"),			       osip_strdup (video_port),			       osip_strdup (my->number_of_port),			       osip_strdup (my->proto));      while (!osip_list_eol (config->video_codec, pos))	{	  my = (__payload_t *) osip_list_get (config->video_codec, pos);	  sdp_message_m_payload_add (*sdp, media_line,				     osip_strdup (my->payload));	  if (my->a_rtpmap != NULL)	    sdp_message_a_attribute_add (*sdp, media_line,					 osip_strdup ("rtpmap"),					 osip_strdup (my->a_rtpmap));	  pos++;	}      media_line++;    }  return 0;}/* build the SDP packet with only one audio codec and one video codec. * - Usefull if you don't want to restrict proposal to one codec only - * - Limitation, only one codec will be proposed */int__osip_negotiation_sdp_build_offer (osip_negotiation_t * config,				    osip_negotiation_ctx_t * con,				    sdp_message_t ** sdp, char *audio_port,				    char *video_port, char *audio_codec,				    char *video_codec){  int i;  int media_line = 0;  i = sdp_message_init (sdp);  if (i != 0)    return -1;  sdp_message_v_version_set (*sdp, osip_strdup ("0"));  /* those fields MUST be set */  sdp_message_o_origin_set (*sdp,			    osip_strdup (config->o_username),			    osip_strdup (config->o_session_id),			    osip_strdup (config->o_session_version),			    osip_strdup (config->o_nettype),			    osip_strdup (config->o_addrtype),			    osip_strdup (config->o_addr));  sdp_message_s_name_set (*sdp, osip_strdup ("A call"));  if (config->fcn_set_info != NULL)    config->fcn_set_info (con, *sdp);  if (config->fcn_set_uri != NULL)    config->fcn_set_uri (con, *sdp);  if (config->fcn_set_emails != NULL)    config->fcn_set_emails (con, *sdp);  if (config->fcn_set_phones != NULL)    config->fcn_set_phones (con, *sdp);  if (config->c_nettype != NULL)    sdp_message_c_connection_add (*sdp, -1,				  osip_strdup (config->c_nettype),				  osip_strdup (config->c_addrtype),				  osip_strdup (config->c_addr),				  osip_strdup (config->c_addr_multicast_ttl),				  osip_strdup (config->c_addr_multicast_int));  {				/* offer-answer draft says we must copy the "t=" line */    int now = time (NULL);    char *tmp = osip_malloc (15);    char *tmp2 = osip_malloc (15);    sprintf (tmp, "%i", now);    sprintf (tmp2, "%i", now + 3600);    i = sdp_message_t_time_descr_add (*sdp, tmp, tmp2);    if (i != 0)      return -1;  }  if (config->fcn_set_attributes != NULL)    config->fcn_set_attributes (con, *sdp, -1);  /* add all audio codec */  if (audio_codec != NULL)    {      if (!osip_list_eol (config->audio_codec, 0))	{	  int pos = 0;	  __payload_t *my =	    (__payload_t *) osip_list_get (config->audio_codec, pos);	  while (!osip_list_eol (config->audio_codec, pos))	    {	      my = (__payload_t *) osip_list_get (config->audio_codec, pos);	      if (0 == strcmp (audio_codec, my->payload))		{		  /* all media MUST have the same PROTO, PORT. */		  sdp_message_m_media_add (*sdp, osip_strdup ("audio"),					   osip_strdup (audio_port),					   osip_strdup (my->number_of_port),					   osip_strdup (my->proto));		  sdp_message_m_payload_add (*sdp, media_line,					     osip_strdup (my->payload));		  if (my->a_rtpmap != NULL)		    sdp_message_a_attribute_add (*sdp, media_line,						 osip_strdup ("rtpmap"),						 osip_strdup (my->a_rtpmap));		  media_line++;		  break;		}	      pos++;	    }	}    }  /* add all video codec */  if (video_codec != NULL)    {      if (!osip_list_eol (config->video_codec, 0))	{	  int pos = 0;	  __payload_t *my =	    (__payload_t *) osip_list_get (config->video_codec, pos);	  while (!osip_list_eol (config->video_codec, pos))	    {	      my = (__payload_t *) osip_list_get (config->video_codec, pos);	      if (0 == strcmp (video_codec, my->payload))		{		  /* all media MUST have the same PROTO, PORT. */		  sdp_message_m_media_add (*sdp, osip_strdup ("video"),					   osip_strdup (video_port),					   osip_strdup (my->number_of_port),					   osip_strdup (my->proto));		  sdp_message_m_payload_add (*sdp, media_line,					     osip_strdup (my->payload));		  if (my->a_rtpmap != NULL)		    sdp_message_a_attribute_add (*sdp, media_line,						 osip_strdup ("rtpmap"),						 osip_strdup (my->a_rtpmap));		  media_line++;		  break;		}	      pos++;	    }	}    }  return 0;}intosip_negotiation_sdp_message_put_on_hold (sdp_message_t * sdp){  int pos;  int pos_media = -1;  char *rcvsnd;  int recv_send = -1;  pos = 0;  rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);  while (rcvsnd != NULL)    {      if (rcvsnd != NULL && 0 == strcmp (rcvsnd, "sendonly"))	{	  recv_send = 0;	}      else if (rcvsnd != NULL && (0 == strcmp (rcvsnd, "recvonly")				  || 0 == strcmp (rcvsnd, "sendrecv")))	{	  recv_send = 0;	  sprintf (rcvsnd, "sendonly");	}      pos++;      rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);    }  pos_media = 0;  while (!sdp_message_endof_media (sdp, pos_media))    {      pos = 0;      rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);      while (rcvsnd != NULL)	{	  if (rcvsnd != NULL && 0 == strcmp (rcvsnd, "sendonly"))	    {	      recv_send = 0;	    }	  else if (rcvsnd != NULL && (0 == strcmp (rcvsnd, "recvonly")				      || 0 == strcmp (rcvsnd, "sendrecv")))	    {	      recv_send = 0;	      sprintf (rcvsnd, "sendonly");	    }	  pos++;	  rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);	}      pos_media++;    }  if (recv_send == -1)    {      /* we need to add a global attribute with a field set to "sendonly" */      sdp_message_a_attribute_add (sdp, -1, osip_strdup ("sendonly"), NULL);    }  return 0;}intosip_negotiation_sdp_message_put_off_hold (sdp_message_t * sdp){  int pos;  int pos_media = -1;  char *rcvsnd;  pos = 0;  rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);  while (rcvsnd != NULL)    {      if (rcvsnd != NULL && (0 == strcmp (rcvsnd, "sendonly")			     || 0 == strcmp (rcvsnd, "recvonly")))	{	  sprintf (rcvsnd, "sendrecv");	}      pos++;      rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);    }  pos_media = 0;  while (!sdp_message_endof_media (sdp, pos_media))    {      pos = 0;      rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);      while (rcvsnd != NULL)	{	  if (rcvsnd != NULL && (0 == strcmp (rcvsnd, "sendonly")				 || 0 == strcmp (rcvsnd, "recvonly")))	    {	      sprintf (rcvsnd, "sendrecv");	    }	  pos++;	  rcvsnd = sdp_message_a_att_field_get (sdp, pos_media, pos);	}      pos_media++;    }  return 0;}

⌨️ 快捷键说明

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