test.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.  * test.c - test program for rtsp library
  23.  */
  24. #include "systems.h"
  25. #include <time.h>
  26. #include "sdp.h"
  27. #include "rtsp_private.h"
  28. #if 0
  29. static const char *optbuff =
  30. "OPTIONS * RTSP/1.0rnCSeq: 1rnrn";
  31. static const char *optbuff2 =
  32. "OPTIONS * RTSP/1.0rnCSeq: 2rnrn";
  33. #endif
  34. static void local_error_msg (int loglevel,
  35.      const char *lib,
  36.      const char *fmt,
  37.      va_list ap)
  38. {
  39. #if _WIN32 && _DEBUG
  40.   char msg[512];
  41.   if (initialized) init_local_mutex();
  42.   lock_mutex();
  43.   sprintf(msg, "%s:", lib);
  44.   OutputDebugString(msg);
  45.   va_start(ap, fmt);
  46.   _vsnprintf(msg, 512, fmt, ap);
  47.   va_end(ap);
  48.   OutputDebugString(msg);
  49.   OutputDebugString("n");
  50.   unlock_mutex();
  51. #else
  52.   struct timeval thistime;
  53.   char buffer[80];
  54.   gettimeofday(&thistime, NULL);
  55.   strftime(buffer, sizeof(buffer), "%X", localtime(&thistime.tv_sec));
  56.   printf("%s.%03ld-%s-%d: ",
  57.  buffer,
  58.  thistime.tv_usec / 1000,
  59.  lib,
  60.  loglevel);
  61.   vprintf(fmt, ap);
  62.   printf("n");
  63. #endif
  64. }
  65. static void do_relative_url_to_absolute (char **control_string,
  66.   const char *base_url,
  67.   int dontfree)
  68. {
  69.   char *str, *cpystr;
  70.   uint32_t cblen, malloclen;
  71.   malloclen = cblen = strlen(base_url);
  72.   if (base_url[cblen - 1] != '/') malloclen++;
  73.   /*
  74.    * If the control string is just a *, use the base url only
  75.    */
  76.   cpystr = *control_string;
  77.   if (strcmp(cpystr, "*") != 0) {
  78.     if (*cpystr == '/') cpystr++;
  79.     // duh - add 1 for ...
  80.     str = (char *)malloc(strlen(cpystr) + malloclen + 1);
  81.     if (str == NULL)
  82.       return;
  83.     strcpy(str, base_url);
  84.     if (base_url[cblen - 1] != '/') {
  85.       strcat(str, "/");
  86.     }
  87.     if (*cpystr == '/') cpystr++;
  88.     strcat(str, cpystr);
  89.   } else {
  90.     str = strdup(base_url);
  91.   }
  92.   if (dontfree == 0) 
  93.     free(*control_string);
  94.   *control_string = str;
  95. }
  96. /*
  97.  * convert_relative_urls_to_absolute - for every url inside the session
  98.  * description, convert relative to absolute.
  99.  */
  100. static void convert_relative_urls_to_absolute (session_desc_t *sdp,
  101. const char *base_url)
  102. {
  103.   media_desc_t *media;
  104.   
  105.   if (base_url == NULL)
  106.     return;
  107.   if ((sdp->control_string != NULL) &&
  108.       (strncmp(sdp->control_string, "rtsp://", strlen("rtsp://"))) != 0) {
  109.     do_relative_url_to_absolute(&sdp->control_string, base_url, 0);
  110.   }
  111.   
  112.   for (media = sdp->media; media != NULL; media = media->next) {
  113.     if ((media->control_string != NULL) &&
  114. (strncmp(media->control_string, "rtsp://", strlen("rtsp://")) != 0)) {
  115.       do_relative_url_to_absolute(&media->control_string, base_url, 0);
  116.     }
  117.   }
  118. }
  119. int main (int argc, char **argv)
  120. {
  121.   rtsp_client_t *rtsp_client;
  122.   int ret;
  123.   rtsp_command_t cmd;
  124.   rtsp_decode_t *decode;
  125.   session_desc_t *sdp;
  126.   media_desc_t *media;
  127.   sdp_decode_info_t *sdpdecode;
  128.   rtsp_session_t *session;
  129.   int dummy;
  130.   rtsp_set_error_func(local_error_msg);
  131.   rtsp_set_loglevel(LOG_DEBUG);
  132.   memset(&cmd, 0, sizeof(rtsp_command_t));
  133.   argv++;
  134.   rtsp_client = rtsp_create_client(*argv, &ret);
  135.   if (rtsp_client == NULL) {
  136.     printf("No client created - error %dn", ret);
  137.     return (1);
  138.   }
  139.   if (rtsp_send_describe(rtsp_client, &cmd, &decode) != RTSP_RESPONSE_GOOD) {
  140.     printf("Describe response not goodn");
  141.     free_decode_response(decode);
  142.     free_rtsp_client(rtsp_client);
  143.     return(1);
  144.   }
  145.   sdpdecode = set_sdp_decode_from_memory(decode->body);
  146.   if (sdpdecode == NULL) {
  147.     printf("Couldn't get sdp decoden");
  148.     free_decode_response(decode);
  149.     free_rtsp_client(rtsp_client);
  150.     return(1);
  151.   }
  152.   if (sdp_decode(sdpdecode, &sdp, &dummy) != 0) {
  153.     printf("Couldn't decode sdpn");
  154.     free_decode_response(decode);
  155.     free_rtsp_client(rtsp_client);
  156.     return (1);
  157.   }
  158.   free(sdpdecode);
  159.   if (decode->content_base != NULL) {
  160.     convert_relative_urls_to_absolute (sdp, *argv);
  161.   }
  162.   free_decode_response(decode);
  163.   decode = NULL;
  164. #if 1
  165.   cmd.transport = "RTP/AVP;unicast;client_port=4588-4589";
  166. #else
  167.   cmd.transport = "RTP/AVP/TCP;interleaved=0-1";
  168. #endif
  169.   media = sdp->media;
  170.   dummy = rtsp_send_setup(rtsp_client,
  171.   media->control_string,
  172.   &cmd,
  173.   &session,
  174.   &decode, 0);
  175.   if (dummy != RTSP_RESPONSE_GOOD) {
  176.     printf("Response to setup is %dn", dummy);
  177.     sdp_free_session_desc(sdp);
  178.     free_decode_response(decode);
  179.     free_rtsp_client(rtsp_client);
  180.     return (1);
  181.   }
  182.   free_decode_response(decode);
  183.   cmd.range = "npt=0.0-30.0";
  184.   cmd.transport = NULL;
  185.   dummy = rtsp_send_play(session, &cmd, &decode);
  186.   if (dummy != RTSP_RESPONSE_GOOD) {
  187.     printf("response to play is %dn", dummy);
  188.   } else {
  189.     sleep(10);
  190.   }
  191.   free_decode_response(decode);
  192.   cmd.transport = NULL;
  193.   dummy = rtsp_send_teardown(session, NULL, &decode);
  194.   printf("Teardown response %dn", dummy);
  195.   sdp_free_session_desc(sdp);
  196.   free_decode_response(decode);
  197.   free_rtsp_client(rtsp_client);
  198.   return (0);
  199. }  
  200.