player_sdp.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:6k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. /*
  22.  * player_sdp.c - utilities for handling SDP structures
  23.  */
  24. #include <string.h>
  25. #include <stdlib.h>
  26. #include <stdio.h>
  27. #include <sdp/sdp.h>
  28. #include "player_sdp.h"
  29. #include "player_util.h"
  30. #define ADV_SPACE(a) {while (isspace(*(a)) && (*(a) != ''))(a)++;}
  31. /*
  32.  * do_relative_url_to_absolute - does the actual work to convert a
  33.  * relative url to an absolute url.
  34.  */
  35. void do_relative_url_to_absolute (char **control_string,
  36.   const char *base_url,
  37.   int dontfree)
  38. {
  39.   char *str, *cpystr;
  40.   uint32_t cblen, malloclen;
  41.   malloclen = cblen = strlen(base_url);
  42.   if (base_url[cblen - 1] != '/') malloclen++;
  43.   /*
  44.    * If the control string is just a *, use the base url only
  45.    */
  46.   cpystr = *control_string;
  47.   if (strcmp(cpystr, "*") != 0) {
  48.     if (*cpystr == '/') cpystr++;
  49.     // duh - add 1 for ...
  50.     str = (char *)malloc(strlen(cpystr) + malloclen + 1);
  51.     if (str == NULL)
  52.       return;
  53.     strcpy(str, base_url);
  54.     if (base_url[cblen - 1] != '/') {
  55.       strcat(str, "/");
  56.     }
  57.     if (*cpystr == '/') cpystr++;
  58.     strcat(str, cpystr);
  59.   } else {
  60.     str = strdup(base_url);
  61.   }
  62.   if (dontfree == 0) 
  63.     free(*control_string);
  64.   *control_string = str;
  65. }
  66. /*
  67.  * convert_relative_urls_to_absolute - for every url inside the session
  68.  * description, convert relative to absolute.
  69.  */
  70. void convert_relative_urls_to_absolute (session_desc_t *sdp,
  71. const char *base_url)
  72. {
  73.   media_desc_t *media;
  74.   
  75.   if (base_url == NULL)
  76.     return;
  77.   if ((sdp->control_string != NULL) &&
  78.       (strncmp(sdp->control_string, "rtsp://", strlen("rtsp://"))) != 0) {
  79.     do_relative_url_to_absolute(&sdp->control_string, base_url, 0);
  80.   }
  81.   
  82.   for (media = sdp->media; media != NULL; media = media->next) {
  83.     if ((media->control_string != NULL) &&
  84. (strncmp(media->control_string, "rtsp://", strlen("rtsp://")) != 0)) {
  85.       do_relative_url_to_absolute(&media->control_string, base_url, 0);
  86.     }
  87.   }
  88. }
  89. /*
  90.  * create_rtsp_transport_from_sdp - from a sdp media description, create
  91.  * the RTSP transport string needed.
  92.  */
  93. void create_rtsp_transport_from_sdp (session_desc_t *sdp,
  94.      media_desc_t *media,
  95.      in_port_t port,
  96.      char *buffer,
  97.      uint32_t buflen)
  98. {
  99.   uint32_t ret;
  100.   ret = snprintf(buffer, buflen, "%s;unicast;client_port=%d-%d",
  101.  media->proto, port, port + 1);
  102.   
  103. }
  104. /*
  105.  * get_connect_desc_from_media.  If the media doesn't have one, the
  106.  * session_desc_t might.
  107.  */
  108. connect_desc_t *get_connect_desc_from_media (media_desc_t *media)
  109. {
  110.   session_desc_t *sptr;
  111.   
  112.   if (media->media_connect.used)
  113.     return (&media->media_connect);
  114.   sptr = media->parent;
  115.   if (sptr == NULL) return (NULL);
  116.   if (sptr->session_connect.used == FALSE)
  117.     return (NULL);
  118.   return (&sptr->session_connect);
  119. }
  120. /*
  121.  * get_range_from_media.  If the media doesn't have one, the
  122.  * session_desc_t might.
  123.  */
  124. range_desc_t *get_range_from_media (media_desc_t *media)
  125. {
  126.   session_desc_t *sptr;
  127.   
  128.   if (media->media_range.have_range) {
  129.     return (&media->media_range);
  130.   }
  131.   sptr = media->parent;
  132.   if (sptr == NULL || sptr->session_range.have_range == FALSE)
  133.     return (NULL);
  134.   return (&sptr->session_range);
  135. }
  136. range_desc_t *get_range_from_sdp (session_desc_t *sptr)
  137. {
  138.   media_desc_t *media;
  139.   
  140.   if (sptr == NULL)
  141.     return (NULL);
  142.   
  143.   if (sptr->session_range.have_range != FALSE)
  144.     return (&sptr->session_range);
  145.   media = sptr->media;
  146.   while (media != NULL) {
  147.     if (media->media_range.have_range) {
  148.       return (&media->media_range);
  149.     }
  150.     media = media->next;
  151.   }
  152.   return (NULL);
  153. }
  154. static bandwidth_t *find_bandwidth_from_bw_list (bandwidth_t *bptr,
  155.  bandwidth_modifier_t bw_type,
  156.  const char *user_type)
  157. {
  158.   int user_type_len = 0;
  159.   if (bw_type == BANDWIDTH_MODIFIER_USER) {
  160.     user_type_len = strlen(user_type);
  161.   }
  162.   while (bptr != NULL) {
  163.     if (bptr->modifier == bw_type) {
  164.       if (bptr->modifier != BANDWIDTH_MODIFIER_USER)
  165. return (bptr);
  166.       if (strncasecmp(user_type, bptr->user_band, user_type_len) == 0)
  167. return (bptr);
  168.     }
  169.     bptr = bptr->next;
  170.   }
  171.   return (NULL);
  172. }
  173. bandwidth_t *find_bandwidth_from_media (media_desc_t *media,
  174. bandwidth_modifier_t bw_type,
  175. const char *user_type)
  176. {
  177.   bandwidth_t *bptr;
  178.   session_desc_t *sptr;
  179.   if (media == NULL) return NULL;
  180.   bptr = find_bandwidth_from_bw_list(media->media_bandwidth,
  181.      bw_type,
  182.      user_type);
  183.   if (bptr != NULL)
  184.     return bptr;
  185.   sptr = media->parent;
  186.   if (sptr == NULL)
  187.     return (NULL);
  188.   return (find_bandwidth_from_bw_list(sptr->session_bandwidth,
  189.       bw_type,
  190.       user_type));
  191. }
  192. int find_rtcp_bandwidth_from_media (media_desc_t *media,
  193.     double *bw)
  194. {
  195.   bandwidth_t *bptr;
  196.   
  197.   *bw = 0.0;
  198.   bptr = find_bandwidth_from_media(media, BANDWIDTH_MODIFIER_USER, "rr");
  199.   if (bptr == NULL) {
  200.     return -1;
  201.   }
  202.   *bw = (double)bptr->bandwidth;
  203.   return 0;
  204. }
  205. /* end file player_sdp.c */