MFC利用SDL 绘制FFMPEG AVFrame 绘制YUV420P
2014-04-04 14:42
411 查看
代码比较简单
class SDLDraw{ private: SDL_Window * pWindow; SDL_Rect m_DrawRect; SDL_Renderer * pRender; SDL_Texture * pTexture; HWND m_hWnd; int m_Width; int m_Height; public: SDLDraw(); ~SDLDraw(); void Init(HWND hWnd); void Destory(); void Draw(AVFrame* frame); void Clear(); };
#define Y_BLACK 0 #define U_BLACK 128 #define V_BLACK 128 #pragma comment(lib, "SDL2.lib") SDLDraw::SDLDraw(){ SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO); pWindow=NULL; pRender=NULL; pTexture=NULL; } SDLDraw::~SDLDraw(){ Destory(); } void SDLDraw::Init(HWND hWnd){ LONG_PTR WinMessage= (LONG_PTR)GetWindowLongPtr(hWnd, GWLP_WNDPROC); pWindow = SDL_CreateWindowFrom(hWnd ); SetWindowLongPtr(hWnd, GWLP_WNDPROC, WinMessage); m_DrawRect.x=0; m_DrawRect.y=0; int iWidth = 0; int iHeight = 0; SDL_GetWindowSize( pWindow, &iWidth, &iHeight ); m_DrawRect.w=iWidth; m_DrawRect.h=iHeight; pRender = SDL_CreateRenderer( pWindow,-1, SDL_RENDERER_TARGETTEXTURE ); m_Width=176; m_Height=144; m_hWnd=hWnd; } void SDLDraw::Destory(){ if ( pTexture != NULL ) { SDL_DestroyTexture( pTexture ); pTexture = NULL ; } if ( pRender != NULL ) { SDL_DestroyRenderer( pRender ); pRender = NULL; } if ( NULL != pWindow ) { SDL_DestroyWindow( pWindow ); pWindow = NULL; } } void SDLDraw::Draw(AVFrame* frame){ if(!pWindow) return; if(!frame) return; int nWidth=frame->width; int nHeight=frame->height; if(nWidth!=m_Width||nHeight!=m_Height){ if ( pTexture != NULL ) { SDL_DestroyTexture( pTexture ); pTexture = NULL ; } } m_Width=nWidth; m_Height=nHeight; if(!pTexture){ pTexture = SDL_CreateTexture( pRender,SDL_PIXELFORMAT_YV12, SDL_TEXTUREACCESS_STREAMING, nWidth, nHeight ); } int iPitch = m_Width*SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_YV12); VideoConvter convert((AVPixelFormat)frame->format,PIX_FMT_YUV420P,nWidth,nHeight,nWidth,nHeight); if(convert.Convert(frame)>=0){ const AVFrame* cframe=convert.GetFrame(); SDL_UpdateTexture( pTexture,NULL, cframe->data[0], iPitch ); } SDL_RenderClear( pRender ); SDL_Rect sdlRT; sdlRT.x = 0; sdlRT.y = 0; sdlRT.h = nHeight; sdlRT.w = nWidth; SDL_RenderCopy( pRender, pTexture, &sdlRT, &m_DrawRect ); SDL_RenderPresent( pRender ); } void SDLDraw::Clear(){ int size=avpicture_get_size ((AVPixelFormat) PIX_FMT_YUV420P, m_DrawRect.w,m_DrawRect.h); uint8_t* yuvBuffer=(uint8_t*) av_malloc(size); AVFrame* pFrame = av_frame_alloc(); if (pFrame&&avpicture_fill((AVPicture*) pFrame, yuvBuffer, PIX_FMT_YUV420P, m_DrawRect.w,m_DrawRect.h)>= 0) { pFrame->width = m_DrawRect.w; pFrame->height = m_DrawRect.h; pFrame->format = PIX_FMT_YUV420P; memset(pFrame->data[0],Y_BLACK,pFrame->linesize[0]* m_DrawRect.h); memset(pFrame->data[1],U_BLACK,pFrame->linesize[1]* (m_DrawRect.h>>1)); memset(pFrame->data[2],V_BLACK,pFrame->linesize[2]* (m_DrawRect.h>>1)); } Draw(pFrame); if(pFrame){ av_frame_free(&pFrame); } av_free(yuvBuffer);
}
相关文章推荐
- Ubuntu下Android设备显示???的处理方法
- [问题2014S07] 复旦高等代数II(13级)每周一题(第七教学周)
- 类对象相较于结构体方便析构指针
- 如何知道自己是工作组计算机中的哪个
- Ubuntu 中切换工作区的五种方法
- Windows Server 2008 R2 IIS7.5+PHP5(FastCGI)+MySQL5环境搭建
- 读《春秋》有感之十:中分之盟
- hadoop1.2.1+zk-3.4.5+hbase-0.94.1集群安装过程详解
- STM32F103C8T6 CAN通信详解
- [ASP.NET]强大的网页处理类NSoup
- WDS、WPS及WIFI2.4/5G相关
- TaskStackBuilder 不支持Android 3.0以下的设备
- NABC
- 11
- 基本数据类型可以直接返回
- windows下eclipse java开发能正常运行,移植到linux下,从Mysql中读取数据,出现中文乱码
- Open Source and SOA, ESB and Security
- 最受欢迎的棋牌游戏
- Referenced file contains errors (http://struts.apache.org/dtds/struts-2.1.7.dtd).
- 高德地图iOS SDK V2.2.0新版本(2014-03-18)