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

流媒体/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 <SDL.h>
  25. #include <sdp/sdp.h>
  26. #include <time.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.   struct timeval thistime;
  40.   char buffer[80];
  41. #if _WIN32
  42.   if (IsDebuggerPresent()) {
  43.         char msg[512];
  44. sprintf(msg, "%s-%d:", lib, loglevel);
  45. OutputDebugString(msg);
  46. //        va_start(ap, fmt);
  47.     _vsnprintf(msg, 512, fmt, ap);
  48. //        va_end(ap);
  49.         OutputDebugString(msg);
  50. OutputDebugString("n");
  51. return;
  52. }
  53. #define sleep(a) Sleep((a) * 1000)
  54. #endif
  55.   gettimeofday(&thistime, NULL);
  56.   strftime(buffer, sizeof(buffer), "%X", localtime(&thistime.tv_sec));
  57.   printf("%s.%03ld-%s-%d: ",
  58.  buffer,
  59.  thistime.tv_usec / 1000,
  60.  lib,
  61.  loglevel);
  62.   vprintf(fmt, ap);
  63.   printf("n");
  64. }
  65. static int callback (void *foo)
  66. {
  67.   rtsp_debug(LOG_DEBUG, "callback - SDL thread %dn", SDL_ThreadID());
  68.   return (SDL_ThreadID());
  69. }
  70. static void do_relative_url_to_absolute (char **control_string,
  71.   const char *base_url,
  72.   int dontfree)
  73. {
  74.   char *str, *cpystr;
  75.   uint32_t cblen, malloclen;
  76.   malloclen = cblen = strlen(base_url);
  77.   if (base_url[cblen - 1] != '/') malloclen++;
  78.   /*
  79.    * If the control string is just a *, use the base url only
  80.    */
  81.   cpystr = *control_string;
  82.   if (strcmp(cpystr, "*") != 0) {
  83.     if (*cpystr == '/') cpystr++;
  84.     // duh - add 1 for ...
  85.     str = (char *)malloc(strlen(cpystr) + malloclen + 1);
  86.     if (str == NULL)
  87.       return;
  88.     strcpy(str, base_url);
  89.     if (base_url[cblen - 1] != '/') {
  90.       strcat(str, "/");
  91.     }
  92.     if (*cpystr == '/') cpystr++;
  93.     strcat(str, cpystr);
  94.   } else {
  95.     str = strdup(base_url);
  96.   }
  97.   if (dontfree == 0) 
  98.     free(*control_string);
  99.   *control_string = str;
  100. }
  101. /*
  102.  * convert_relative_urls_to_absolute - for every url inside the session
  103.  * description, convert relative to absolute.
  104.  */
  105. static void convert_relative_urls_to_absolute (session_desc_t *sdp,
  106. const char *base_url)
  107. {
  108.   media_desc_t *media;
  109.   
  110.   if (base_url == NULL)
  111.     return;
  112.   if ((sdp->control_string != NULL) &&
  113.       (strncmp(sdp->control_string, "rtsp://", strlen("rtsp://"))) != 0) {
  114.     do_relative_url_to_absolute(&sdp->control_string, base_url, 0);
  115.   }
  116.   
  117.   for (media = sdp->media; media != NULL; media = media->next) {
  118.     if ((media->control_string != NULL) &&
  119. (strncmp(media->control_string, "rtsp://", strlen("rtsp://")) != 0)) {
  120.       do_relative_url_to_absolute(&media->control_string, base_url, 0);
  121.     }
  122.   }
  123. }
  124. int main (int argc, char **argv)
  125. {
  126.   rtsp_client_t *rtsp_client;
  127.   int ret;
  128.   rtsp_command_t cmd;
  129.   rtsp_decode_t *decode;
  130.   #if 1
  131.   session_desc_t *sdp;
  132.   media_desc_t *media;
  133.   sdp_decode_info_t *sdpdecode;
  134.   rtsp_session_t *session;
  135.   int dummy;
  136.   #endif
  137.   rtsp_set_error_func(local_error_msg);
  138.   rtsp_set_loglevel(LOG_DEBUG);
  139.   memset(&cmd, 0, sizeof(rtsp_command_t));
  140.   callback(NULL);
  141.   
  142.   argv++;
  143.   rtsp_client = rtsp_create_client_for_rtp_tcp(*argv, &ret);
  144.   if (rtsp_client == NULL) {
  145.     printf("No client created - error %dn", ret);
  146.     return (1);
  147.   }
  148.   ret = rtsp_thread_perform_callback(rtsp_client, callback, NULL);
  149.   rtsp_debug(LOG_DEBUG, "Return from callback is %dn", ret);
  150.   
  151.   if (rtsp_send_describe(rtsp_client, &cmd, &decode) != RTSP_RESPONSE_GOOD) {
  152.     rtsp_debug(LOG_CRIT, "Describe response not goodn");
  153.     free_decode_response(decode);
  154.     free_rtsp_client(rtsp_client);
  155.     return(1);
  156.   }
  157.   sdpdecode = set_sdp_decode_from_memory(decode->body);
  158.   if (sdpdecode == NULL) {
  159.     rtsp_debug(LOG_CRIT, "Couldn't get sdp decoden");
  160.     free_decode_response(decode);
  161.     free_rtsp_client(rtsp_client);
  162.     return(1);
  163.   }
  164.   if (sdp_decode(sdpdecode, &sdp, &dummy) != 0) {
  165.     rtsp_debug(LOG_CRIT, "Couldn't decode sdpn");
  166.     free_decode_response(decode);
  167.     free_rtsp_client(rtsp_client);
  168.     return (1);
  169.   }
  170.   free(sdpdecode);
  171.   if (decode->content_base != NULL) {
  172.     convert_relative_urls_to_absolute (sdp, *argv);
  173.   }
  174.   free_decode_response(decode);
  175.   decode = NULL;
  176. #if 0
  177.   cmd.transport = "RTP/AVP;unicast;client_port=4588-4589";
  178. #else
  179.   cmd.transport = "RTP/AVP/TCP;interleaved=0-1";
  180. #endif
  181.   media = sdp->media;
  182.   dummy = rtsp_send_setup(rtsp_client,
  183.   media->control_string,
  184.   &cmd,
  185.   &session,
  186.   &decode, 0);
  187.   if (dummy != RTSP_RESPONSE_GOOD) {
  188.     rtsp_debug(LOG_DEBUG, "Response to setup is %dn", dummy);
  189.     sdp_free_session_desc(sdp);
  190.     free_decode_response(decode);
  191.     free_rtsp_client(rtsp_client);
  192.     return (1);
  193.   }
  194.   free_decode_response(decode);
  195.   cmd.range = "npt=0.0-30.0";
  196.   cmd.transport = NULL;
  197.   dummy = rtsp_send_play(session, &cmd, &decode);
  198.   if (dummy != RTSP_RESPONSE_GOOD) {
  199.     rtsp_debug(LOG_INFO, "response to play is %dn", dummy);
  200.   } else {
  201.     sleep(10);
  202.   }
  203.   free_decode_response(decode);
  204.   cmd.range = NULL;
  205.   dummy = rtsp_send_pause(session, &cmd, &decode);
  206.   if (dummy != RTSP_RESPONSE_GOOD) {
  207.     rtsp_debug(LOG_INFO, "response to pause is %dn", dummy);
  208.   } else {
  209.     sleep(5);
  210.   }
  211.   free_decode_response(decode);
  212.   cmd.range = "npt=15.0-30.0";
  213.   cmd.transport = NULL;
  214.   dummy = rtsp_send_play(session, &cmd, &decode);
  215.   if (dummy != RTSP_RESPONSE_GOOD) {
  216.     rtsp_debug(LOG_INFO, "response to play is %dn", dummy);
  217.   } else {
  218.     sleep(10);
  219.   }
  220.   free_decode_response(decode);
  221.   cmd.transport = NULL;
  222.   dummy = rtsp_send_teardown(session, NULL, &decode);
  223.   rtsp_debug(LOG_DEBUG, "Teardown response %dn", dummy);
  224.   sdp_free_session_desc(sdp);
  225.   free_decode_response(decode);
  226.   sleep(5);
  227.   free_rtsp_client(rtsp_client);
  228.   return (0);
  229. }  
  230.