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

📄 player_sdp.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
字号:
/* * 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 *//* * player_sdp.c - utilities for handling SDP structures */#include <string.h>#include <stdlib.h>#include <stdio.h>#include <sdp/sdp.h>#include "player_sdp.h"#include "player_util.h"#define ADV_SPACE(a) {while (isspace(*(a)) && (*(a) != '\0'))(a)++;}/* * do_relative_url_to_absolute - does the actual work to convert a * relative url to an absolute url. */void do_relative_url_to_absolute (char **control_string,				  const char *base_url,				  int dontfree){  char *str, *cpystr;  uint32_t cblen, malloclen;  malloclen = cblen = strlen(base_url);  if (base_url[cblen - 1] != '/') malloclen++;  /*   * If the control string is just a *, use the base url only   */  cpystr = *control_string;  if (strcmp(cpystr, "*") != 0) {    if (*cpystr == '/') cpystr++;    // duh - add 1 for \0...    str = (char *)malloc(strlen(cpystr) + malloclen + 1);    if (str == NULL)      return;    strcpy(str, base_url);    if (base_url[cblen - 1] != '/') {      strcat(str, "/");    }    if (*cpystr == '/') cpystr++;    strcat(str, cpystr);  } else {    str = strdup(base_url);  }  if (dontfree == 0)     free(*control_string);  *control_string = str;}/* * convert_relative_urls_to_absolute - for every url inside the session * description, convert relative to absolute. */void convert_relative_urls_to_absolute (session_desc_t *sdp,					const char *base_url){  media_desc_t *media;    if (base_url == NULL)    return;  if ((sdp->control_string != NULL) &&      (strncmp(sdp->control_string, "rtsp://", strlen("rtsp://"))) != 0) {    do_relative_url_to_absolute(&sdp->control_string, base_url, 0);  }    for (media = sdp->media; media != NULL; media = media->next) {    if ((media->control_string != NULL) &&	(strncmp(media->control_string, "rtsp://", strlen("rtsp://")) != 0)) {      do_relative_url_to_absolute(&media->control_string, base_url, 0);    }  }}/* * create_rtsp_transport_from_sdp - from a sdp media description, create * the RTSP transport string needed. */void create_rtsp_transport_from_sdp (session_desc_t *sdp,				     media_desc_t *media,				     in_port_t port,				     char *buffer,				     uint32_t buflen){  uint32_t ret;  ret = snprintf(buffer, buflen, "%s;unicast;client_port=%d-%d",		 media->proto, port, port + 1);  }/* * get_connect_desc_from_media.  If the media doesn't have one, the * session_desc_t might. */connect_desc_t *get_connect_desc_from_media (media_desc_t *media){  session_desc_t *sptr;    if (media->media_connect.used)    return (&media->media_connect);  sptr = media->parent;  if (sptr == NULL) return (NULL);  if (sptr->session_connect.used == FALSE)    return (NULL);  return (&sptr->session_connect);}/* * get_range_from_media.  If the media doesn't have one, the * session_desc_t might. */range_desc_t *get_range_from_media (media_desc_t *media){  session_desc_t *sptr;    if (media->media_range.have_range) {    return (&media->media_range);  }  sptr = media->parent;  if (sptr == NULL || sptr->session_range.have_range == FALSE)    return (NULL);  return (&sptr->session_range);}range_desc_t *get_range_from_sdp (session_desc_t *sptr){  media_desc_t *media;    if (sptr == NULL)    return (NULL);    if (sptr->session_range.have_range != FALSE)    return (&sptr->session_range);  media = sptr->media;  while (media != NULL) {    if (media->media_range.have_range) {      return (&media->media_range);    }    media = media->next;  }  return (NULL);}static bandwidth_t *find_bandwidth_from_bw_list (bandwidth_t *bptr,						 bandwidth_modifier_t bw_type,						 const char *user_type){  int user_type_len = 0;  if (bw_type == BANDWIDTH_MODIFIER_USER) {    user_type_len = strlen(user_type);  }  while (bptr != NULL) {    if (bptr->modifier == bw_type) {      if (bptr->modifier != BANDWIDTH_MODIFIER_USER)	return (bptr);      if (strncasecmp(user_type, bptr->user_band, user_type_len) == 0)	return (bptr);    }    bptr = bptr->next;  }  return (NULL);}bandwidth_t *find_bandwidth_from_media (media_desc_t *media,					bandwidth_modifier_t bw_type,					const char *user_type){  bandwidth_t *bptr;  session_desc_t *sptr;  if (media == NULL) return NULL;  bptr = find_bandwidth_from_bw_list(media->media_bandwidth,				     bw_type,				     user_type);  if (bptr != NULL)    return bptr;  sptr = media->parent;  if (sptr == NULL)    return (NULL);  return (find_bandwidth_from_bw_list(sptr->session_bandwidth,				      bw_type,				      user_type));}int find_rtcp_bandwidth_from_media (media_desc_t *media,				    double *bw){  bandwidth_t *bptr;    *bw = 0.0;  bptr = find_bandwidth_from_media(media, BANDWIDTH_MODIFIER_USER, "rr");  if (bptr == NULL) {    return -1;  }  *bw = (double)bptr->bandwidth;  return 0;}/* end file player_sdp.c */

⌨️ 快捷键说明

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