SDL2.0图片渲染封装

最近几个项目视频处理中,渲染采用SDL2.0,现在封装一个SDL2.0类,方便大家使用。SDL2.0库调用流程如下:




Sdl2Handle.h

  1. #ifndef _SDL2HANDLE_H_   
  2. #define _SDL2HANDLE_H_  
  3. //基于SDL2.0实现的图片渲染器  
  4. //SDL_Window就是使用SDL的时候弹出的那个窗口。在SDL2.0版本中,可以创建多个窗口。  
  5. //SDL_Texture用于显示YUV数据。一个SDL_Texture对应一帧YUV数据。  
  6. //SDL_Renderer用于渲染SDL_Texture至SDL_Window。  
  7. //SDL_Rect用于确定SDL_Texture显示的位置。注意:一个SDL_Texture可以指定多个不同的SDL_Rect,这样就可以在SDL_Window不同位置显示相同的内容(使用SDL_RenderCopy()函数)。  
  8. extern "C"    
  9. {    
  10. #include "SDL.h"    
  11. };   
  12. class CSdl2Handle  
  13. {  
  14. public:  
  15.     CSdl2Handle();  
  16.     ~CSdl2Handle();  
  17.     bool SdlOpen(void *pWndHandle,const char *pTitle,int iWidth,int iHeight);  
  18.     void SdlClose();  
  19.     //显示一帧YV12数据 iLinesize YUV每个分量 每行数据宽度 不一定等于图片宽度  
  20.     void SdlDisplayFrame(uint8_t *pszData[],int iLinesize[],int iFlag);  
  21.     //YUV显示BMP图片  
  22.     bool SdlDisplayBmp(char *pFilePath);  
  23. public:  
  24.     static bool SdlInit();  
  25.     static void SdlUnInit();  
  26. private:  
  27.     //显示窗口  
  28.     SDL_Window *  m_pWnd;     
  29.     //图片渲染器  
  30.     SDL_Renderer* m_pRender;    
  31.     //图片装载器  
  32.     SDL_Texture*  m_pTexture;    
  33.     //显示位置(一个窗口可以有多个显示位置,当前支持一个)  
  34.     SDL_Rect      m_Rect;    
  35.     //标志窗口是否本层创建  
  36.     bool          m_IsSdlCreate;  
  37.       
  38. };  
  39.   
  40. #endif  

Sdl2Handle.cpp
  1. #include "stdafx.h"  
  2. #include "Sdl2Handle.h"  
  3. #include <stdio.h>  
  4. //初始化SDL  
  5. bool CSdl2Handle::SdlInit()  
  6. {  
  7.     if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER))   
  8.     {    
  9.         return false;  
  10.     }   
  11. }  
  12. //反初始化SDL  
  13. void CSdl2Handle::SdlUnInit()  
  14. {  
  15.     SDL_Quit();  
  16. }  
  17.   
  18. CSdl2Handle::CSdl2Handle()  
  19. {  
  20.     //显示窗口  
  21.     SDL_Window *  m_pWnd=NULL;     
  22.     //图片渲染器  
  23.     SDL_Renderer* m_pRender=NULL;    
  24.     //图片装载器  
  25.     SDL_Texture*  m_pTexture=NULL;   
  26.     //标志窗口是否本层创建  
  27.     m_IsSdlCreate=true;  
  28. }  
  29. CSdl2Handle::~CSdl2Handle()  
  30. {  
  31.     SdlClose();  
  32. }  
  33. bool CSdl2Handle::SdlOpen(void *pWndHandle,const char *pTitle,int iWidth,int iHeight)  
  34. {  
  35.     bool bRet=true;  
  36.     do  
  37.     {  
  38.         if(!pWndHandle)  
  39.         {  
  40.             m_pWnd =SDL_CreateWindow(pTitle, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,  iWidth, iHeight,    
  41.                 SDL_WINDOW_OPENGL);  
  42.             if(!m_pWnd)  
  43.             {  
  44.                 printf("SDL: 创建窗口失败 - 错误信息:%s\n",SDL_GetError());      
  45.                 bRet=false;  
  46.                 break;  
  47.             }  
  48.         }  
  49.         else  
  50.         {  
  51.             m_pWnd =SDL_CreateWindowFrom(pWndHandle);  
  52.             if(!m_pWnd)  
  53.             {  
  54.                 printf("SDL: 创建窗口失败 - 错误信息:%s\n",SDL_GetError());      
  55.                 bRet=false;  
  56.                 break;  
  57.             }  
  58.             m_IsSdlCreate=false;  
  59.         }  
  60.         m_pRender = SDL_CreateRenderer(m_pWnd, -1, 0);      
  61.   
  62.         m_pTexture = SDL_CreateTexture(m_pRender, SDL_PIXELFORMAT_IYUV, SDL_TEXTUREACCESS_STREAMING, iWidth, iHeight);      
  63.   
  64.         m_Rect.x=0;    
  65.         m_Rect.y=0;    
  66.         m_Rect.w=iWidth;    
  67.         m_Rect.h=iHeight;    
  68.   
  69.     }while(0);  
  70.   
  71.     return bRet;    
  72. }  
  73.   
  74. void CSdl2Handle::SdlClose()  
  75. {  
  76.     if(m_pTexture)  
  77.     {  
  78.         SDL_DestroyTexture(m_pTexture);  
  79.         m_pTexture=NULL;  
  80.     }  
  81.     if(m_pRender)  
  82.     {  
  83.         SDL_DestroyRenderer(m_pRender);  
  84.         m_pRender=NULL;  
  85.     }  
  86.     if(m_pWnd)  
  87.     {  
  88.         //SDL本身创建 销毁  
  89.         if(m_IsSdlCreate)  
  90.         {  
  91.             SDL_DestroyWindow(m_pWnd);  
  92.         }  
  93.     }  
  94. }  
  95.   
  96. void CSdl2Handle::SdlDisplayFrame(uint8_t*pszData[],int iLinesize[],int iFlag)  
  97. {  
  98.     //一帧YV12数据填充到 图片装载器中 颜色反了 可能 U和V反了  
  99.     if(iFlag)  
  100.     {  
  101.         SDL_UpdateYUVTexture(m_pTexture, &m_Rect,  
  102.         (const Uint8 *)pszData[0], iLinesize[0],  
  103.         (const Uint8 *)pszData[2], iLinesize[2],  
  104.         (const Uint8 *)pszData[1], iLinesize[1]);     
  105.     }  
  106.     else  
  107.     {  
  108.         SDL_UpdateYUVTexture(m_pTexture, &m_Rect,  
  109.         (const Uint8 *)pszData[0], iLinesize[0],  
  110.         (const Uint8 *)pszData[1], iLinesize[1],  
  111.         (const Uint8 *)pszData[2], iLinesize[2]);  
  112.     }  
  113.     //清屏  
  114.     SDL_RenderClear( m_pRender );    
  115.     //装载器数据渲染到窗口  
  116.     SDL_RenderCopy( m_pRender, m_pTexture,  NULL, &m_Rect);    
  117.     //刷新  
  118.     SDL_RenderPresent( m_pRender );    
  119. }  
  120.   
  121. //YUV显示BMP图片  
  122. bool CSdl2Handle::SdlDisplayBmp(char *pFilePath)  
  123. {  
  124.     SDL_Surface *pBmp = NULL;  
  125.     pBmp = SDL_LoadBMP(pFilePath);  
  126.     if (pBmp == NULL)   
  127.     {  
  128.         printf("SDL_LoadBMP failed: %s", SDL_GetError());  
  129.         return false;  
  130.     }  
  131.     SDL_Texture*  pTmpTexture=NULL;   
  132.     pTmpTexture = SDL_CreateTextureFromSurface(m_pRender, pBmp);  
  133.     //清屏  
  134.     SDL_RenderClear( m_pRender );    
  135.     //装载器数据渲染到窗口  
  136.     SDL_RenderCopy( m_pRender, pTmpTexture,  NULL, &m_Rect);    
  137.     //刷新  
  138.     SDL_RenderPresent( m_pRender );    
  139.       
  140.     //销毁临时  
  141.     SDL_FreeSurface(pBmp);  
  142.     SDL_DestroyTexture(pTmpTexture);  
  143.     return true;  
  144. }  
SDL说明文档: http://wiki.libsdl.org/CategoryAPI#Functions

版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/hiwubihe/article/details/52102110

猜你喜欢

转载自blog.csdn.net/u014421422/article/details/79650544
SDL