media_node.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:2k
源码类别:

流媒体/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-2002.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  * Bill May  wmay@cisco.com
  21.  */
  22. #ifndef __MEDIA_NODE_H__
  23. #define __MEDIA_NODE_H__
  24. #include <SDL.h>
  25. #include <SDL_thread.h>
  26. #include <msg_queue.h>
  27. #include "mp4live_config.h"
  28. #include "media_frame.h"
  29. class CMediaNode {
  30. public:
  31. CMediaNode() {
  32. m_myThread = NULL;
  33. m_myMsgQueueSemaphore = NULL;
  34. m_pConfig = NULL;
  35. }
  36. static int StartThreadCallback(void* data) {
  37. return ((CMediaNode*)data)->ThreadMain();
  38. }
  39. void StartThread() {
  40. if (m_myThread == NULL) {
  41. m_myMsgQueueSemaphore = SDL_CreateSemaphore(0);
  42. m_myThread = SDL_CreateThread(StartThreadCallback, this);
  43. }
  44. }
  45. void StopThread() {
  46. if (m_myThread) {
  47. m_myMsgQueue.send_message(MSG_NODE_STOP_THREAD,
  48. NULL, 0, m_myMsgQueueSemaphore);
  49. SDL_WaitThread(m_myThread, NULL);
  50. m_myThread = NULL;
  51. SDL_DestroySemaphore(m_myMsgQueueSemaphore);
  52. m_myMsgQueueSemaphore = NULL;
  53. }
  54. }
  55. void Start(void) {
  56. m_myMsgQueue.send_message(MSG_NODE_START,
  57.  NULL, 0, m_myMsgQueueSemaphore);
  58. }
  59. void Stop(void) {
  60. m_myMsgQueue.send_message(MSG_NODE_STOP,
  61. NULL, 0, m_myMsgQueueSemaphore);
  62. }
  63. virtual ~CMediaNode() {
  64. StopThread();
  65. }
  66. void SetConfig(CLiveConfig* pConfig) {
  67. m_pConfig = pConfig;
  68. }
  69. protected:
  70. static const int MSG_NODE = 1024;
  71. static const int MSG_NODE_START = MSG_NODE + 1;
  72. static const int MSG_NODE_STOP = MSG_NODE + 2;
  73. static const int MSG_NODE_STOP_THREAD = MSG_NODE + 3;
  74. virtual int ThreadMain(void) = NULL;
  75. protected:
  76. SDL_Thread* m_myThread;
  77. CMsgQueue m_myMsgQueue;
  78. SDL_sem* m_myMsgQueueSemaphore;
  79. CLiveConfig* m_pConfig;
  80. };
  81. #endif /* __MEDIA_NODE_H__ */