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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_yuv.c,v 1.4 2002/04/22 21:38:03 wmay Exp $";
  21. #endif
  22. /* This is the implementation of the YUV video surface support */
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include "SDL_getenv.h"
  26. #include "SDL_video.h"
  27. #include "SDL_sysvideo.h"
  28. #include "SDL_yuvfuncs.h"
  29. #include "SDL_yuv_sw_c.h"
  30. SDL_Overlay *SDL_CreateYUVOverlay(int w, int h, Uint32 format,
  31.                                   SDL_Surface *display)
  32. {
  33. SDL_VideoDevice *video = current_video;
  34. SDL_VideoDevice *this  = current_video;
  35. const char *yuv_hwaccel;
  36. SDL_Overlay *overlay;
  37. overlay = NULL;
  38. /* Display directly on video surface, if possible */
  39. if ( getenv("SDL_VIDEO_YUV_DIRECT") ) {
  40. if ( (display == SDL_PublicSurface) &&
  41.      ((SDL_VideoSurface->format->BytesPerPixel == 2) ||
  42.       (SDL_VideoSurface->format->BytesPerPixel == 4)) ) {
  43. display = SDL_VideoSurface;
  44. }
  45. }
  46.         yuv_hwaccel = getenv("SDL_VIDEO_YUV_HWACCEL");
  47. if ( ((display == SDL_VideoSurface) && video->CreateYUVOverlay) &&
  48.      (!yuv_hwaccel || (atoi(yuv_hwaccel) > 0)) ) {
  49. overlay = video->CreateYUVOverlay(this, w, h, format, display);
  50. }
  51. /* If hardware YUV overlay failed ... */
  52. if ( overlay == NULL ) {
  53. overlay = SDL_CreateYUV_SW(this, w, h, format, display);
  54. }
  55. return overlay;
  56. }
  57. int SDL_LockYUVOverlay(SDL_Overlay *overlay)
  58. {
  59. return overlay->hwfuncs->Lock(current_video, overlay);
  60. }
  61. void SDL_UnlockYUVOverlay(SDL_Overlay *overlay)
  62. {
  63. overlay->hwfuncs->Unlock(current_video, overlay);
  64. }
  65. int SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect)
  66. {
  67. return overlay->hwfuncs->Display(current_video, overlay, dstrect);
  68. }
  69. void SDL_FreeYUVOverlay(SDL_Overlay *overlay)
  70. {
  71. if ( overlay ) {
  72. if ( overlay->hwfuncs ) {
  73. overlay->hwfuncs->FreeHW(current_video, overlay);
  74. }
  75. free(overlay);
  76. }
  77. }