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

流媒体/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. 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. #include "rtsp_private.h"
  22. /*
  23.  * free_rtsp_client()
  24.  * frees all memory associated with rtsp client information
  25.  */
  26. void free_rtsp_client (rtsp_client_t *rptr)
  27. {
  28.   if (rptr->thread != NULL) {
  29.     rtsp_close_thread(rptr);
  30.   } else {
  31.     rtsp_close_socket(rptr);
  32. #ifdef _WINDOWS
  33.     WSACleanup();
  34. #endif
  35.   }
  36.   if (rptr->msg_mutex != NULL) {
  37.     SDL_DestroyMutex(rptr->msg_mutex);
  38.     rptr->msg_mutex = NULL;
  39.   }
  40.   CHECK_AND_FREE(rptr, orig_url);
  41.   CHECK_AND_FREE(rptr, url);
  42.   CHECK_AND_FREE(rptr, server_name);
  43.   CHECK_AND_FREE(rptr, cookie);
  44.   free_decode_response(rptr->decode_response);
  45.   rptr->decode_response = NULL;
  46.   free(rptr);
  47. }
  48. rtsp_client_t *rtsp_create_client_common (const char *url, int *perr)
  49. {
  50.   int err;
  51.   rtsp_client_t *info;
  52.   info = malloc(sizeof(rtsp_client_t));
  53.   if (info == NULL) {
  54.     *perr = ENOMEM;
  55.     return (NULL);
  56.   }
  57.   memset(info, 0, sizeof(rtsp_client_t));
  58.   info->url = NULL;
  59.   info->orig_url = NULL;
  60.   info->server_name = NULL;
  61.   info->cookie = NULL;
  62.   info->recv_timeout = 2 * 1000;  // default timeout is 2 seconds.
  63.   info->server_socket = -1;
  64.   info->next_cseq = 1;
  65.   info->session = NULL;
  66.   info->m_offset_on = 0;
  67.   info->m_buffer_len = 0;
  68.   info->m_resp_buffer[RECV_BUFF_DEFAULT_LEN] = '';
  69.   info->thread = NULL;
  70.   
  71.   err = rtsp_dissect_url(info, url);
  72.   if (err != 0) {
  73.     rtsp_debug(LOG_ALERT, "Couldn't decode url %dn", err);
  74.     *perr = err;
  75.     free_rtsp_client(info);
  76.     return (NULL);
  77.   }
  78.   return (info);
  79. }
  80. rtsp_client_t *rtsp_create_client (const char *url, int *err)
  81. {
  82.   rtsp_client_t *info;
  83. #ifdef _WINDOWS
  84.   WORD wVersionRequested;
  85.   WSADATA wsaData;
  86.   int ret;
  87.  
  88.   wVersionRequested = MAKEWORD( 2, 0 );
  89.  
  90.   ret = WSAStartup( wVersionRequested, &wsaData );
  91.   if ( ret != 0 ) {
  92.     /* Tell the user that we couldn't find a usable */
  93.     /* WinSock DLL.*/
  94.     *err = ret;
  95.     return (NULL);
  96.   }
  97. #endif
  98.   info = rtsp_create_client_common(url, err);
  99.   if (info == NULL) return (NULL);
  100.   
  101.   *err = rtsp_create_socket(info);
  102.   if (*err != 0) {
  103.     rtsp_debug(LOG_EMERG,"Couldn't create socket %dn", errno);
  104.     free_rtsp_client(info);
  105.     return (NULL);
  106.   }
  107.   return (info);
  108. }
  109. int rtsp_send_and_get (rtsp_client_t *info,
  110.        char *buffer,
  111.        uint32_t buflen)
  112. {
  113.   int ret;
  114.   if (info->thread == NULL) {
  115.     ret = rtsp_send(info, buffer, buflen);
  116.     if (ret < 0) {
  117.       return (RTSP_RESPONSE_RECV_ERROR);
  118.     }
  119.     ret = rtsp_get_response(info);
  120.   } else {
  121.    rtsp_wrap_send_and_get_t msg;
  122.     int ret_msg;
  123.     msg.msg = RTSP_MSG_SEND_AND_GET;
  124.     msg.body.buffer = buffer;
  125.     msg.body.buflen = buflen;
  126.     ret = rtsp_thread_ipc_send_wait(info,
  127.     (unsigned char *)&msg,
  128.     sizeof(msg),
  129.     &ret_msg);
  130.     if (ret != sizeof(ret_msg)) {
  131.       return (RTSP_RESPONSE_RECV_ERROR);
  132.     }
  133.     ret = ret_msg;
  134.   }
  135.   return ret;
  136. }