📄 player_sdp.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 + -