VideoRenderer.cpp
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:5k
源码类别:

VC书籍

开发平台:

Visual C++

  1. /**************************************************************************************
  2.  *                                                                                    *
  3.  *                                                                                    *
  4.  **************************************************************************************/
  5. #include "VideoRenderer.h"
  6. /*
  7.  * 视频补偿器封装类
  8.  */
  9. MediaVideoRenderer::MediaVideoRenderer()
  10. {
  11. this->overlayRenderer = new MediaVideoRendererOverlay();
  12. this->rgbRenderer     = new MediaVideoRendererRGB();
  13. this->renderer        = NULL;
  14. }
  15. MediaVideoRenderer::~MediaVideoRenderer()
  16. {
  17. delete this->overlayRenderer;
  18. delete this->rgbRenderer;
  19. }
  20. /*
  21.  * 媒体项方法
  22.  */
  23. media_type_t  MediaVideoRenderer::GetType()
  24. {
  25. return MEDIA_TYPE_VIDEO_RENDERER;
  26. }
  27. char         *MediaVideoRenderer::GetName()
  28. {
  29. if(this->renderer)
  30. return this->renderer->GetName();
  31. return "Video Renderer Wrapper";
  32. }
  33. MP_RESULT     MediaVideoRenderer::Connect(MediaItem *item)
  34. {
  35. if(this->renderer)
  36. return this->renderer->Connect(item);
  37. return MP_RESULT_ERROR;
  38. }
  39. MP_RESULT     MediaVideoRenderer::ReleaseConnections()
  40. {
  41. return MP_RESULT_OK;
  42. }
  43. DWORD         MediaVideoRenderer::GetCaps()
  44. {
  45. return 0;
  46. }
  47. MP_RESULT     MediaVideoRenderer::Configure(HINSTANCE hInstance, HWND hwnd)
  48. {
  49. return MP_RESULT_ERROR;
  50. }
  51. /*
  52.  * 视频补偿方法
  53.  */
  54. MP_RESULT MediaVideoRenderer::Init(HWND hwnd, 
  55.    unsigned int width, 
  56.    unsigned int height, 
  57.    media_video_mode_t preferedMode)
  58. {
  59. this->renderer = NULL;
  60. switch(preferedMode) {
  61. case VIDEO_MODE_RGB16:
  62. case VIDEO_MODE_RGB24:
  63. case VIDEO_MODE_RGB32:
  64. if(this->rgbRenderer->Init(hwnd, width, height) == MP_RESULT_OK) {
  65. this->renderer = (MediaVideoRenderer *) this->rgbRenderer;
  66. return MP_RESULT_OK;
  67. }
  68. else {
  69. return MP_RESULT_ERROR;
  70. }
  71. break;
  72. case VIDEO_MODE_YUV12:
  73. case VIDEO_MODE_UYVY:
  74. case VIDEO_MODE_YUY2:
  75. if(this->overlayRenderer->Init(hwnd, width, height) == MP_RESULT_OK) {
  76. this->renderer = (MediaVideoRenderer *) this->overlayRenderer;
  77. return MP_RESULT_OK;
  78. }
  79. else {
  80. /*
  81.  * 尝试标准补偿器
  82.  */
  83. if(this->rgbRenderer->Init(hwnd, width, height) == MP_RESULT_OK) {
  84. this->renderer = (MediaVideoRenderer *) this->rgbRenderer;
  85. return MP_RESULT_OK;
  86. }
  87. else {
  88. return MP_RESULT_ERROR;
  89. }
  90. }
  91. break;
  92. }
  93. return MP_RESULT_ERROR;
  94. }
  95. MP_RESULT MediaVideoRenderer::InitFullscreen(HWND hwnd, 
  96.  unsigned int width, 
  97.  unsigned int height,
  98.  media_video_mode_t preferedMode)
  99. {
  100. this->renderer = NULL;
  101. switch(preferedMode) {
  102. case VIDEO_MODE_RGB16:
  103. case VIDEO_MODE_RGB24:
  104. case VIDEO_MODE_RGB32:
  105. if(this->rgbRenderer->InitFullscreen(hwnd, width, height) == MP_RESULT_OK) {
  106. this->renderer = (MediaVideoRenderer *) this->rgbRenderer;
  107. return MP_RESULT_OK;
  108. }
  109. else {
  110. return MP_RESULT_ERROR;
  111. }
  112. break;
  113. case VIDEO_MODE_YUV12:
  114. case VIDEO_MODE_UYVY:
  115. case VIDEO_MODE_YUY2:
  116. if(this->overlayRenderer->InitFullscreen(hwnd, width, height) == MP_RESULT_OK) {
  117. this->renderer = (MediaVideoRenderer *) this->overlayRenderer;
  118. return MP_RESULT_OK;
  119. }
  120. else {
  121. /*
  122.  * 尝试标准补偿器
  123.  */
  124. if(this->rgbRenderer->InitFullscreen(hwnd, width, height) == MP_RESULT_OK) {
  125. this->renderer = (MediaVideoRenderer *) this->rgbRenderer;
  126. return MP_RESULT_OK;
  127. }
  128. else {
  129. return MP_RESULT_ERROR;
  130. }
  131. }
  132. break;
  133. }
  134. return MP_RESULT_ERROR;
  135. }
  136. /*
  137.  * 以下两个不使用
  138.  */
  139. MP_RESULT MediaVideoRenderer::Init(HWND hwnd, unsigned int width, unsigned int height)
  140. {
  141. if(this->renderer) {
  142. this->renderer->Close();
  143. return this->renderer->Init(hwnd, width, height);
  144. }
  145. return MP_RESULT_ERROR;
  146. }
  147. MP_RESULT MediaVideoRenderer::InitFullscreen(HWND hwnd, unsigned int width, unsigned int height)
  148. {
  149. if(this->renderer) {
  150. this->renderer->Close();
  151. return this->renderer->InitFullscreen(hwnd, width, height);
  152. }
  153. return MP_RESULT_ERROR;
  154. }
  155.  
  156. MP_RESULT MediaVideoRenderer::Stop()
  157. {
  158. if(this->renderer)
  159. return this->renderer->Stop();
  160. return MP_RESULT_ERROR;
  161. }
  162. RECT *MediaVideoRenderer::GetFullscreenRects()
  163. {
  164. if(this->renderer)
  165. return this->renderer->GetFullscreenRects();
  166. return NULL;
  167. }
  168. media_video_mode_t MediaVideoRenderer::GetVideoMode()
  169. {
  170. if(this->renderer)
  171. return this->renderer->GetVideoMode();
  172. return VIDEO_MODE_NONE;
  173. }
  174. MP_RESULT MediaVideoRenderer::Draw(MediaBuffer *buffer, RECT *rect, int frameNumber, int invertFlag)
  175. {
  176. if(this->renderer)
  177. return this->renderer->Draw(buffer, rect, frameNumber, invertFlag);
  178. return MP_RESULT_ERROR;
  179. }
  180. MP_RESULT MediaVideoRenderer::DrawFullscreen(MediaBuffer *buffer, int frameNumber, int invertFlag, int desktop)
  181. {
  182. if(this->renderer)
  183. return this->renderer->DrawFullscreen(buffer, frameNumber, invertFlag, desktop);
  184. return MP_RESULT_ERROR;
  185. }
  186. MP_RESULT MediaVideoRenderer::Close()
  187. {
  188. if(this->renderer) {
  189. this->renderer->Close();
  190. this->renderer = NULL;
  191. }
  192. return MP_RESULT_ERROR;
  193. }