video_sdl_preview.cpp
上传用户: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. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. #include "mp4live.h"
  22. #include "video_sdl_preview.h"
  23. int CSDLVideoPreview::ThreadMain(void) 
  24. {
  25. while (SDL_SemWait(m_myMsgQueueSemaphore) == 0) {
  26. CMsg* pMsg = m_myMsgQueue.get_message();
  27. if (pMsg != NULL) {
  28. switch (pMsg->get_value()) {
  29. case MSG_NODE_STOP_THREAD:
  30. DoStopPreview();
  31. delete pMsg;
  32. return 0;
  33. case MSG_NODE_START:
  34. DoStartPreview();
  35. break;
  36. case MSG_NODE_STOP:
  37. DoStopPreview();
  38. break;
  39. case MSG_SINK_FRAME:
  40. size_t dontcare;
  41. DoPreviewFrame((CMediaFrame*)pMsg->get_message(dontcare));
  42. break;
  43. }
  44. delete pMsg;
  45. }
  46. }
  47. return -1;
  48. }
  49. void CSDLVideoPreview::DoStartPreview()
  50. {
  51. if (m_sink) {
  52. return;
  53. }
  54. if (!m_pConfig->m_videoPreviewWindowId) {
  55. return;
  56. }
  57. char buffer[16];
  58. snprintf(buffer, sizeof(buffer), "%u", 
  59. m_pConfig->m_videoPreviewWindowId);
  60. setenv("SDL_WINDOWID", buffer, 1);
  61. setenv("SDL_VIDEO_CENTERED", "1", 1);
  62. if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE) < 0) {
  63. error_message("Could not init SDL video: %s", SDL_GetError());
  64. }
  65. char driverName[32];
  66. if (!SDL_VideoDriverName(driverName, 1)) {
  67. error_message("Could not init SDL video: %s", SDL_GetError());
  68. }
  69. m_sdlScreen = SDL_SetVideoMode(m_pConfig->m_videoWidth, 
  70. m_pConfig->m_videoHeight, 32, SDL_HWSURFACE | SDL_NOFRAME);
  71. m_sdlScreenRect.x = 0;
  72. m_sdlScreenRect.y = 0;
  73. m_sdlScreenRect.w = m_pConfig->m_videoWidth;
  74. m_sdlScreenRect.h = m_pConfig->m_videoHeight;
  75. m_sdlImage = SDL_CreateYUVOverlay(m_pConfig->m_videoWidth, 
  76. m_pConfig->m_videoHeight, SDL_YV12_OVERLAY, m_sdlScreen);
  77. // currently we can only do one type of preview
  78. if (m_pConfig->GetBoolValue(CONFIG_VIDEO_RAW_PREVIEW)
  79.   && m_pConfig->GetBoolValue(CONFIG_VIDEO_ENCODED_PREVIEW)) {
  80. // so resolve any misconfiguration
  81. m_pConfig->SetBoolValue(CONFIG_VIDEO_ENCODED_PREVIEW, false);
  82. }
  83. m_sink = true;
  84. }
  85. void CSDLVideoPreview::DoStopPreview()
  86. {
  87. if (!m_sink) {
  88. return;
  89. }
  90. SDL_FreeYUVOverlay(m_sdlImage);
  91. m_sdlImage = NULL;
  92. SDL_FreeSurface(m_sdlScreen);
  93. m_sdlScreen = NULL;
  94. SDL_Quit();
  95. m_sink = false;
  96. }
  97. void CSDLVideoPreview::DoPreviewFrame(CMediaFrame* pFrame)
  98. {
  99. if (pFrame == NULL) {
  100. return;
  101. }
  102. if (m_sink) {
  103. if ((pFrame->GetType() == CMediaFrame::YuvVideoFrame 
  104.     && m_pConfig->GetBoolValue(CONFIG_VIDEO_RAW_PREVIEW))
  105.   || (pFrame->GetType() == CMediaFrame::ReconstructYuvVideoFrame 
  106.     && m_pConfig->GetBoolValue(CONFIG_VIDEO_ENCODED_PREVIEW))) {
  107. SDL_LockYUVOverlay(m_sdlImage);
  108. u_int8_t* pImage = (u_int8_t*)pFrame->GetData();
  109. memcpy(m_sdlImage->pixels[0], 
  110. pImage, 
  111. m_pConfig->m_ySize);
  112. memcpy(m_sdlImage->pixels[2], 
  113. pImage + m_pConfig->m_ySize, 
  114. m_pConfig->m_uvSize);
  115. memcpy(m_sdlImage->pixels[1], 
  116. pImage + m_pConfig->m_ySize + m_pConfig->m_uvSize, 
  117. m_pConfig->m_uvSize);
  118. SDL_DisplayYUVOverlay(m_sdlImage, &m_sdlScreenRect);
  119. SDL_UnlockYUVOverlay(m_sdlImage);
  120. // TBD SDL_Delay(pFrame->GetDuration() / 1000);
  121. }
  122. }
  123. delete pFrame;
  124. }