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

📄 sdp_encode.c

📁 完整的RTP RTSP代码库
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ *  * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. *  * The Original Code is MPEG4IP. *  * The Initial Developer of the Original Code is Cisco Systems Inc. * Portions created by Cisco Systems Inc. are * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved. *  * Contributor(s):  *              Bill May        wmay@cisco.com *//* * sdp_encode.c * * Encodes session_desc_t structure into an SDP file. * * October, 2000 * Bill May (wmay@cisco.com) * Cisco Systems, Inc. */#include "sdp.h"#include "sdp_decode_private.h"typedef struct sdp_encode_t {  char *buffer;  uint32_t used;  uint32_t buflen;} sdp_encode_t;static int prepare_sdp_encode (sdp_encode_t *se){  se->buffer = malloc(2048);  if (se->buffer == NULL) return ENOMEM;  se->buffer[0] = '\0';  se->used = 0;  se->buflen = 2048;  return (0);}static int add_string_to_encode (sdp_encode_t *sptr, const char *buf,				 int line){  uint32_t len;  char *temp;    if (buf == NULL) {    sdp_debug(LOG_CRIT, "Can't add NULL string to SDP - line %d", line);    return (EINVAL);  }  len = strlen(buf);  if (len == 0) return (0);    if (len + 1 + sptr->used > sptr->buflen) {    temp = realloc(sptr->buffer, sptr->buflen + 1024);    if (temp == NULL)      return (ENOMEM);    sptr->buffer = temp;    sptr->buflen += 1024;  }  strcpy(sptr->buffer + sptr->used, buf);  sptr->used += len;  return (0);}#define ADD_STR_TO_ENCODE_WITH_RETURN(se, string) \ { int ret; ret = add_string_to_encode(se, string, __LINE__); if (ret != 0) return(ret);}#define CHECK_RETURN(a) {int ret; ret = (a); if (ret != 0) return (ret); }static int encode_a_ints (int recvonly,			   int sendrecv,			   int sendonly,			   sdp_encode_t *se){  if (recvonly)    ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=recvonly\n");  if (sendrecv)    ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=sendrecv\n");  if (sendonly)    ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=sendonly\n");  return(0);}static int encode_string_list (string_list_t *sptr,			       sdp_encode_t *se,			       char* code,			       int *cnt){  int val;  val = 0;  while (sptr != NULL) {    ADD_STR_TO_ENCODE_WITH_RETURN(se, code);    ADD_STR_TO_ENCODE_WITH_RETURN(se, sptr->string_val);    ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");    val++;    sptr = sptr->next;  }  if (cnt != NULL) *cnt = val;  return (0);}static int encode_bandwidth (bandwidth_t *bptr, sdp_encode_t *se){  char buffer[20];  while (bptr != NULL) {    if (bptr->modifier == BANDWIDTH_MODIFIER_NONE)      return (0);    ADD_STR_TO_ENCODE_WITH_RETURN(se, "b=");    ADD_STR_TO_ENCODE_WITH_RETURN(se, 				  bptr->modifier == BANDWIDTH_MODIFIER_USER ? 				  bptr->user_band :				  bptr->modifier == BANDWIDTH_MODIFIER_CT ?				     "CT" : "AS");    snprintf(buffer, sizeof(buffer), ":%ld\n", bptr->bandwidth);    ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);    bptr = bptr->next;  }  return (0);}static int encode_category (category_list_t *cptr, sdp_encode_t *se){  int first;  char buffer[40];    first = FALSE;  while (cptr != NULL) {    if (first == FALSE) {      ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=cat:");      snprintf(buffer, sizeof(buffer), U64, cptr->category);      ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);      first = TRUE;    } else {      snprintf(buffer, sizeof(buffer), "."U64, cptr->category);      ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);    }    cptr = cptr->next;  }  if (first == TRUE)    ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");  return(0);}static int encode_conf_type (session_desc_t *sptr, sdp_encode_t *se){  const char *temp;  switch (sptr->conf_type) {  case CONFERENCE_TYPE_NONE:  default:    return (0);  case CONFERENCE_TYPE_OTHER:    temp = sptr->conf_type_user;    break;  case CONFERENCE_TYPE_BROADCAST:    temp = "broadcast";    break;  case CONFERENCE_TYPE_MEETING:    temp = "meeting";    break;  case CONFERENCE_TYPE_MODERATED:    temp = "moderated";    break;  case CONFERENCE_TYPE_TEST:    temp = "test";    break;  case CONFERENCE_TYPE_H332:    temp = "H322";    break;  }  ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=type:");  ADD_STR_TO_ENCODE_WITH_RETURN(se, temp);  ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");  return (0);}static int encode_connect (connect_desc_t *cptr, sdp_encode_t *se){  char buffer[20];  ADD_STR_TO_ENCODE_WITH_RETURN(se, "c=IN ");  ADD_STR_TO_ENCODE_WITH_RETURN(se, cptr->conn_type);  ADD_STR_TO_ENCODE_WITH_RETURN(se, " ");  ADD_STR_TO_ENCODE_WITH_RETURN(se, cptr->conn_addr);  if (cptr->ttl) {    snprintf(buffer, sizeof(buffer), "/%d", cptr->ttl);    ADD_STR_TO_ENCODE_WITH_RETURN(se,buffer);    if (cptr->num_addr) {      snprintf(buffer, sizeof(buffer), "/%d", cptr->num_addr);      ADD_STR_TO_ENCODE_WITH_RETURN(se,buffer);    }  }  ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");  return (0);}static int encode_rtcp (media_desc_t *mptr, sdp_encode_t *se){  char buffer[20];  connect_desc_t *cptr = &mptr->rtcp_connect;  ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=rtcp:");  snprintf(buffer, sizeof(buffer), "%u", mptr->rtcp_port);  ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);  if (cptr->conn_type != NULL) {    ADD_STR_TO_ENCODE_WITH_RETURN(se, " ");    ADD_STR_TO_ENCODE_WITH_RETURN(se, cptr->conn_type);    ADD_STR_TO_ENCODE_WITH_RETURN(se, " ");    ADD_STR_TO_ENCODE_WITH_RETURN(se, cptr->conn_addr);    if (cptr->ttl) {      snprintf(buffer, sizeof(buffer), "/%d", cptr->ttl);      ADD_STR_TO_ENCODE_WITH_RETURN(se,buffer);      if (cptr->num_addr) {	snprintf(buffer, sizeof(buffer), "/%d", cptr->num_addr);	ADD_STR_TO_ENCODE_WITH_RETURN(se,buffer);      }    }  }  ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");  return (0);}static int encode_key (key_desc_t *kptr, sdp_encode_t *se){  const char *temp;    switch (kptr->key_type) {  case KEY_TYPE_NONE:  default:    return (0);  case KEY_TYPE_PROMPT:    ADD_STR_TO_ENCODE_WITH_RETURN(se, "k=prompt\n");    return(0);  case KEY_TYPE_CLEAR:    temp ="clear";    break;  case KEY_TYPE_BASE64:    temp = "base64";    break;  case KEY_TYPE_URI:    temp = "uri";    break;  }  ADD_STR_TO_ENCODE_WITH_RETURN(se, "k=");  ADD_STR_TO_ENCODE_WITH_RETURN(se, temp);  ADD_STR_TO_ENCODE_WITH_RETURN(se, ":");  ADD_STR_TO_ENCODE_WITH_RETURN(se, kptr->key);  ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");  return (0);}static int encode_range (range_desc_t *rptr, sdp_encode_t *se){  char buffer[80];  if (rptr->have_range) {    if (rptr->range_is_npt) {      ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=npt:");      snprintf(buffer, sizeof(buffer), "%g-", rptr->range_start);      ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);      if (rptr->range_end_infinite == FALSE) {	snprintf(buffer, sizeof(buffer), "%g", rptr->range_end);	ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);      }    } else {      ADD_STR_TO_ENCODE_WITH_RETURN(se, "a=smpte");      if (rptr->range_smpte_fps != 0) {	snprintf(buffer, sizeof(buffer), "-%d", rptr->range_smpte_fps);	ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);      }      ADD_STR_TO_ENCODE_WITH_RETURN(se, "=");      sdp_smpte_to_str(rptr->range_start, rptr->range_smpte_fps, buffer, 		       sizeof(buffer));      ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);      ADD_STR_TO_ENCODE_WITH_RETURN(se, "-");      if (rptr->range_end_infinite == FALSE) {	sdp_smpte_to_str(rptr->range_end, rptr->range_smpte_fps, buffer,			 sizeof(buffer));	ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);      }    }    ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");  }  return (0);}static int encode_time (session_time_desc_t *tptr, sdp_encode_t *se){  uint64_t start, end;  time_repeat_desc_t *rptr;  uint32_t ix;  char buffer[80];    while (tptr != NULL) {    start = tptr->start_time;    if (start != 0) start += NTP_TO_UNIX_TIME;    end = tptr->end_time;    if (end != 0) end += NTP_TO_UNIX_TIME;    snprintf(buffer, sizeof(buffer), "t="U64" "U64"\n", start, end);    ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);    rptr = tptr->repeat;    while (rptr != NULL) {      ADD_STR_TO_ENCODE_WITH_RETURN(se, "r=");      sdp_time_offset_to_str(rptr->repeat_interval, buffer, sizeof(buffer));      ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);      ADD_STR_TO_ENCODE_WITH_RETURN(se, " ");      sdp_time_offset_to_str(rptr->active_duration, buffer, sizeof(buffer));      ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);      for (ix = 0; ix < rptr->offset_cnt; ix++) {	snprintf(buffer, sizeof(buffer), " %d", rptr->offsets[ix]);	ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);      }      ADD_STR_TO_ENCODE_WITH_RETURN(se, "\n");      rptr = rptr->next;    }    tptr = tptr->next;  }  return (0);}static int encode_time_adj (time_adj_desc_t *aptr, sdp_encode_t *se){  uint64_t time_val;  uint32_t offset;  uint32_t len;  char buffer[40], *buff;  int dohead;  if (aptr == NULL) return (0);    dohead = TRUE;  while (aptr != NULL) {    ADD_STR_TO_ENCODE_WITH_RETURN(se, dohead ? "z=" : " ");	time_val = aptr->adj_time + NTP_TO_UNIX_TIME;    snprintf(buffer, sizeof(buffer), U64" ", time_val);    ADD_STR_TO_ENCODE_WITH_RETURN(se, buffer);    if (aptr->offset < 0) {      offset = (0 - aptr->offset);

⌨️ 快捷键说明

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