sdp_util.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.  * sdp_util.c
  23.  *
  24.  * Utility routines for sdp decode/encode.
  25.  *
  26.  * October, 2000
  27.  * Bill May (wmay@cisco.com)
  28.  * Cisco Systems, Inc.
  29.  */
  30. #include <ctype.h>
  31. #include <stdlib.h>
  32. #include <stdio.h>
  33. #include <string.h>
  34. #include <stdarg.h>
  35. #include "sdp.h"
  36. #include "sdp_decode_private.h"
  37. #define FREE_CHECK(a,b) if (a->b != NULL) { free(a->b); a->b = NULL;}
  38. /*
  39.  * sdp_add_format_to_list()
  40.  * Adds a format to a media_desc_t format list.  Note: will only add unique
  41.  * values.
  42.  *
  43.  * Inputs:
  44.  *   **list - ptr to ptr to list to store in (usually &<media_desc_t>->fmt)
  45.  *   *val - value to save.
  46.  * Outputs:
  47.  *   pointer to added value.  This could be a new one, or one previously
  48.  *   added
  49.  */
  50. format_list_t *sdp_add_format_to_list (media_desc_t *mptr, char *val)
  51. {
  52.   format_list_t *new, *p;
  53.   
  54.   new = malloc(sizeof(format_list_t));
  55.   if (new == NULL) {
  56.     return (NULL);
  57.   }
  58.   new->next = NULL;
  59.   new->fmt = strdup(val);
  60.   new->rtpmap = NULL;
  61.   new->fmt_param = NULL;
  62.   new->media = mptr;
  63.   
  64.   if (new->fmt == NULL) {
  65.     free(new);
  66.     return (NULL);
  67.   }
  68.   
  69.   if (mptr->fmt == NULL) {
  70.     mptr->fmt = new;
  71.   } else {
  72.     p = mptr->fmt;
  73.     if (strcmp(p->fmt, new->fmt) == 0) {
  74.       free(new);
  75.       return (p);
  76.     }
  77.     while (p->next != NULL) {
  78.       p = p->next;
  79.       if (strcmp(p->fmt, new->fmt) == 0) {
  80. free(new);
  81. return (p);
  82.       }
  83.     }
  84.     p->next = new;
  85.   }
  86.   return (new);
  87. }
  88. static void free_rtpmap_desc (rtpmap_desc_t *rtpptr)
  89. {
  90.   FREE_CHECK(rtpptr, encode_name);
  91.   free(rtpptr);
  92. }
  93.    
  94. void sdp_free_format_list (format_list_t **fptr)
  95. {
  96.   format_list_t *p;
  97.   while (*fptr != NULL) {
  98.     p = *fptr;
  99.     *fptr = p->next;
  100.     p->next = NULL;
  101.     if (p->rtpmap != NULL) {
  102.       free_rtpmap_desc(p->rtpmap);
  103.       p->rtpmap = NULL;
  104.     }
  105.     FREE_CHECK(p, fmt_param);
  106.     FREE_CHECK(p, fmt);
  107.     free(p);
  108.   }
  109. }
  110. /*
  111.  * sdp_add_string_to_list()
  112.  * Adds string to string_list_t list.  Duplicates string.
  113.  * Inputs:
  114.  *   list - pointer to pointer of list head
  115.  *   val - value to add
  116.  * Outputs:
  117.  *   TRUE - succeeded, FALSE - failed due to no memory
  118.  */
  119. int sdp_add_string_to_list (string_list_t **list, char *val)
  120. {
  121.   string_list_t *new, *p;
  122.   
  123.   new = malloc(sizeof(string_list_t));
  124.   if (new == NULL) {
  125.     return (FALSE);
  126.   }
  127.   new->next = NULL;
  128.   new->string_val = strdup(val);
  129.   if (new->string_val == NULL) {
  130.     free(new);
  131.     return (FALSE);
  132.   }
  133.   
  134.   if (*list == NULL) {
  135.     *list = new;
  136.   } else {
  137.     p = *list;
  138.     while (p->next != NULL) p = p->next;
  139.     p->next = new;
  140.   }
  141.   return (TRUE);
  142. }
  143. void sdp_free_string_list (string_list_t **list)
  144. {
  145.   string_list_t *p;
  146.   while (*list != NULL) {
  147.     p = *list;
  148.     *list = p->next;
  149.     FREE_CHECK(p, string_val);
  150.     free(p);
  151.   }
  152. }
  153. /*
  154.  * sdp_time_offset_to_str()
  155.  * Converts a time offset in seconds to dhms format. (ie: 3600 -> 1h)
  156.  * Inputs:
  157.  *   val - value in seconds to convert
  158.  *   buff - buffer to store into
  159.  *   buflen - length of buffer
  160.  */
  161. void sdp_time_offset_to_str (uint32_t val, char *buff, uint32_t buflen)
  162. {
  163.   uint32_t div;
  164.   div = val % SEC_PER_DAY;
  165.   if (div == 0) {
  166.     div = val / SEC_PER_DAY;
  167.     snprintf(buff, buflen, "%dd", div);
  168.     return;
  169.   }
  170.   div = val % SEC_PER_HOUR;
  171.   if (div == 0) {
  172.     div = val / SEC_PER_HOUR;
  173.     snprintf(buff, buflen, "%dh", div);
  174.     return;
  175.   }
  176.   div = val % SEC_PER_MINUTE;
  177.   if (div == 0) {
  178.     div = val / SEC_PER_MINUTE;
  179.     snprintf(buff, buflen, "%dm", div);
  180.     return;
  181.   }
  182.   snprintf(buff, buflen, "%d", val);
  183. }
  184. /*
  185.  * sdp_find_format_in_line()
  186.  * Looks for a format value in the list specified.  Must be an exact match.
  187.  * Inputs:
  188.  *   head - pointer to head of format list
  189.  *   lptr - pointer to string to compare with.  Must have a space or 
  190.  *      seperating format from rest of line
  191.  * Outputs:
  192.  *   ptr of matching format or NULL if nothing matched.
  193.  */
  194. format_list_t *sdp_find_format_in_line (format_list_t *head, char *lptr)
  195. {
  196.   uint32_t len;
  197.   
  198.   while (head != NULL) {
  199.     len = strlen(head->fmt);
  200.     if ((strncasecmp(lptr, head->fmt, len) == 0) &&
  201. ((isspace(*(lptr + len)) ||
  202.  (*(lptr + len) == '')))) {
  203.       return (head);
  204.     } else 
  205.       head = head->next;
  206.   }
  207.   return (NULL);
  208. }
  209. void sdp_smpte_to_str (double value, uint16_t fps, char *buffer)
  210. {
  211.   double div;
  212.   unsigned int temp;
  213.   uint32_t index;
  214.   if (fps == 0) fps = 30;
  215.   temp = 0;
  216.   div = 3600.0 * fps;
  217.   while (value >= div) {
  218.     temp++;
  219.     value -= div;
  220.   }
  221.   index = sprintf(buffer, "%02d:", temp);
  222.   temp = 0;
  223.   div = 60.0 * fps;
  224.   while (value >= div) {
  225.     temp++;
  226.     value -= div;
  227.   }
  228.   index += sprintf(buffer + index, "%02d:", temp);
  229.   temp = 0;
  230.   div = fps;
  231.   while (value >= div) {
  232.     temp++;
  233.     value -= div;
  234.   }
  235.   index += sprintf(buffer + index, "%02d", temp);
  236.   if (value > 0.0) sprintf(buffer + index, ":%02g", value);
  237. }
  238. static int sdp_debug_level = LOG_ALERT;
  239. static error_msg_func_t error_msg_func = NULL;
  240. void sdp_set_loglevel (int loglevel)
  241. {
  242.   sdp_debug_level = loglevel;
  243. }
  244. void sdp_set_error_func (error_msg_func_t func)
  245. {
  246.   error_msg_func = func;
  247. }
  248. void sdp_debug (int loglevel, const char *fmt, ...)
  249. {
  250.   if (loglevel <= sdp_debug_level) {
  251.     if (error_msg_func != NULL) {
  252.       va_list ap;
  253.       va_start(ap, fmt);
  254.       (error_msg_func)(loglevel, "libsdp", fmt, ap);
  255.       va_end(ap);
  256.     }
  257.   }
  258. }
  259. /* end file sdp_util.c */