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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "rtsp_private.h"
  2. #include "rtsp_thread_win.h"
  3. /*
  4.  * rtsp_thread_ipc_respond
  5.  * respond with the message given
  6.  */
  7. int rtsp_thread_ipc_respond (rtsp_client_t *info, int msg)
  8. {
  9. info->m_thread_info->from_thread_resp = msg;
  10. if (SetEvent(info->m_thread_info->from_thread_resp_event)) {
  11. return 0;
  12. }
  13. return -1;
  14. }
  15. int rtsp_thread_ipc_receive (rtsp_client_t *info, char *msg, size_t msg_len)
  16. {
  17. const unsigned char *ptr;
  18. uint32_t len;
  19. if (info->m_thread_info->msg == NULL) 
  20. return -1;
  21. ptr = info->m_thread_info->msg->get_message(len);
  22. if (len != msg_len) return -1;
  23. memcpy(msg, ptr, msg_len);
  24. return msg_len;
  25. }
  26. void rtsp_thread_init_thread_info (rtsp_client_t *info)
  27. {
  28.   //COMM_SOCKET_THREAD = info->m_thread_info->comm_socket[0];
  29. }
  30. int rtsp_thread_wait_for_event (rtsp_client_t *info)
  31. {
  32.   rtsp_thread_info_t *tinfo = info->m_thread_info;
  33.   DWORD ret;
  34.   ret = 
  35.   WaitForMultipleObjects(info->server_socket == -1 ? 1 : 2,
  36.  tinfo->handles,
  37.  FALSE,
  38.  info->recv_timeout);
  39.   //rtsp_debug(LOG_DEBUG, "wait for event return %ld", ret);
  40.   if (ret == WAIT_TIMEOUT) {
  41.   //rtsp_debug(LOG_DEBUG, "timeout");
  42.   return 0;
  43.   }
  44.   return 1;
  45. }
  46. int rtsp_thread_has_control_message (rtsp_client_t *info)
  47. {
  48.   rtsp_thread_info_t *tinfo = info->m_thread_info;
  49.   DWORD ret;
  50.   ret = WaitForSingleObject(tinfo->to_thread_event, 0);
  51.   if (ret == WAIT_TIMEOUT) {
  52.   return FALSE;
  53.   }
  54.   ResetEvent(tinfo->to_thread_event);
  55.   tinfo->msg = tinfo->m_msg_queue->get_message();
  56.   if (tinfo->msg == NULL) {
  57.   rtsp_debug(LOG_ERR, "has control message - event, but no msg");
  58.   return FALSE;
  59.   }
  60.   return TRUE;
  61. }
  62. int rtsp_thread_has_receive_data (rtsp_client_t *info)
  63. {
  64.   rtsp_thread_info_t *tinfo = info->m_thread_info;
  65.   DWORD ret;
  66. #if 0
  67.   if (tinfo->socket_event != NULL)
  68.   return FALSE;
  69.   ret = WaitForSingleObject(tinfo->socket_event, 0);
  70.   if (ret == WAIT_TIMEOUT) {
  71.   return FALSE;
  72.   }
  73.   rtsp_debug(LOG_DEBUG, "has receive data");
  74. #endif
  75.   ResetEvent(tinfo->socket_event);
  76.   return TRUE;
  77. }
  78. int rtsp_thread_get_control_message (rtsp_client_t *info,
  79.      rtsp_msg_type_t *msg)
  80. {
  81. if (info->m_thread_info->msg == NULL) return -1;
  82. *msg = info->m_thread_info->msg->get_value();
  83. return sizeof(rtsp_msg_type_t);
  84. }
  85. void rtsp_close_thread (rtsp_client_t *rptr)
  86. {
  87.     uint32_t msg = RTSP_MSG_QUIT;
  88.     rtsp_thread_info_t *info;
  89.     
  90.     rtsp_thread_ipc_send(rptr, (unsigned char *)&msg, sizeof(msg));
  91.     SDL_WaitThread(rptr->thread, NULL);
  92.     info = rptr->m_thread_info;
  93. CloseHandle(info->handles[0]);
  94. CloseHandle(info->from_thread_resp_event);
  95.     
  96.     free(info);
  97.     rptr->m_thread_info = NULL;
  98.     rptr->thread = NULL;
  99. }
  100. /*
  101.  * rtsp_create_thread - create the thread we need, along with the
  102.  * communications socket.
  103.  */
  104. int rtsp_create_thread (rtsp_client_t *cptr)
  105. {
  106. rtsp_thread_info_t *info;
  107. info = cptr->m_thread_info =
  108. (rtsp_thread_info_t *)malloc(sizeof(rtsp_thread_info_t));
  109. if (info == NULL) return -1;
  110. info->m_msg_queue = new CMsgQueue();
  111. info->m_saAttr.nLength = sizeof(info->m_saAttr);
  112.     info->m_saAttr.bInheritHandle = TRUE;
  113.     info->m_saAttr.lpSecurityDescriptor = NULL;
  114. info->from_thread_resp_event = 
  115. CreateEvent(NULL, TRUE, FALSE, NULL);
  116. info->to_thread_event = 
  117. CreateEvent(NULL, TRUE, FALSE, NULL);
  118. info->socket_event = NULL;
  119. cptr->thread = SDL_CreateThread(rtsp_thread, cptr);
  120. if (cptr->thread == NULL) {
  121. rtsp_debug(LOG_CRIT, "Couldn't create comm thread");
  122. return -1;
  123. }
  124.   return 0;
  125. }
  126. /*
  127.  * rtsp_thread_ipc_send - send message to rtsp thread
  128.  */
  129. int rtsp_thread_ipc_send (rtsp_client_t *info,
  130.   unsigned char *msg,
  131.   int len)
  132. {
  133. rtsp_msg_type_t this_msg;
  134. rtsp_thread_info_t *tinfo = info->m_thread_info;
  135. this_msg = *(rtsp_msg_type_t *)msg;
  136. msg += sizeof(rtsp_msg_type_t);
  137. len -= sizeof(rtsp_msg_type_t);
  138. if (len == 0) msg = NULL;
  139. tinfo->m_msg_queue->send_message(this_msg, msg, len);
  140. return SetEvent(tinfo->to_thread_event);
  141. }
  142. /*
  143.  * rtsp_thread_ipc_send_wait
  144.  * send a message, and wait for response
  145.  * returns number of bytes we've received.
  146.  */
  147. int rtsp_thread_ipc_send_wait (rtsp_client_t *info,
  148.        unsigned char *msg,
  149.        int msg_len,
  150.        int *return_msg)
  151. {
  152. DWORD ret;
  153. rtsp_debug(LOG_DEBUG, "Send-wait msg to thread %u - len %d",
  154. *(rtsp_msg_type_t *)msg, msg_len);
  155. SDL_LockMutex(info->msg_mutex);
  156. ResetEvent(info->m_thread_info->from_thread_resp_event);
  157. if (!rtsp_thread_ipc_send(info, msg, msg_len)) {
  158. SDL_UnlockMutex(info->msg_mutex);
  159. return -1;
  160. }
  161. ret = WaitForSingleObject(info->m_thread_info->from_thread_resp_event, 
  162. 30 * 1000);
  163. if (ret == WAIT_TIMEOUT) {
  164. SDL_UnlockMutex(info->msg_mutex);
  165. rtsp_debug(LOG_ERR, "Timedout from ipc_send_wait");
  166. return -1;
  167. }
  168. rtsp_debug(LOG_DEBUG, "Response received - %d", 
  169. info->m_thread_info->from_thread_resp);
  170. *return_msg = info->m_thread_info->from_thread_resp;
  171. return (sizeof(int));
  172. }
  173. void rtsp_thread_close (rtsp_client_t *info)
  174. {
  175.   rtsp_close_socket(info);
  176.   if (info->m_thread_info->socket_event != NULL) {
  177.   CloseHandle(info->m_thread_info->socket_event);
  178.   info->m_thread_info->socket_event = NULL;
  179.   }
  180. }
  181. void rtsp_thread_set_nonblocking (rtsp_client_t *info)
  182. {
  183.     rtsp_thread_info_t *tinfo = info->m_thread_info;
  184. DWORD ret;
  185. tinfo->socket_event = CreateEvent(NULL,
  186. TRUE, 
  187. FALSE,
  188. NULL);
  189. if (WSAEventSelect(info->server_socket,
  190. tinfo->socket_event,
  191. FD_READ) != 0) {
  192. rtsp_debug(LOG_CRIT, "Couldn't associate event with socket - err %d", 
  193. WSAGetLastError());
  194. }
  195. }