SDL2.0在mfc窗口中显示yuv的一种方法

DWORD ThreadFun()
{
       //用mfc窗口句柄创建一个sdl window
       SDL_Window * pWindow = SDL_CreateWindowFrom( (void *)( GetDlgItem(IDC_STATIC1)->GetSafeHwnd() ) );

       SDL_Rect sdlRT;
       sdlRT.h = 288;
       sdlRT.w = 352;
       sdlRT.x = 0;
       sdlRT.y = 0;

       SDL_Rect dstRT;
       dstRT.h = 288;
       dstRT.w = 352;
       dstRT.x = 0;
       dstRT.y = 0;

       int iW = 352;
       int iH = 288;
       char szData[352*288*2] = {0};

       char szPrint[256] = {0};
     
       //计算yuv一行数据占的字节数
       int iPitch = iW*SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_YV12);     

       int iWidth = 0;
       int iHeight = 0;
       SDL_GetWindowSize( pWindow, &iWidth, &iHeight );
       dstRT.h = iHeight;
       dstRT.w = iWidth;

       //获取当前可用画图驱动 window中有3个,第一个为d3d,第二个为opengl,第三个为software
       int iii = SDL_GetNumRenderDrivers();
       //创建渲染器,第二个参数为选用的画图驱动,0代表d3d
       SDL_Renderer * pRender = SDL_CreateRenderer( pWindow, 0, SDL_RENDERER_ACCELERATED );
       sprintf( szPrint, "%s", SDL_GetError());

       SDL_RendererInfo info;
       SDL_GetRendererInfo(pRender, &info);

       SDL_GetRenderDriverInfo(0, &info);       //d3d
       SDL_GetRenderDriverInfo(1, &info);       //opgl
       SDL_GetRenderDriverInfo(2, &info);       //software

       char szInfo[256] = {0};
       sprintf(szInfo, "%s", info.name);
       sprintf( szPrint, "%s", SDL_GetError());

       //创建纹理
       SDL_Texture * pTexture = SDL_CreateTexture( pRender,SDL_PIXELFORMAT_YV12, SDL_TEXTUREACCESS_STREAMING, iW, iH );


       FILE * pFile = fopen( "d:\\cap1.yuv", "rb" );

       if ( pFile == NULL )
       {
              int u = 0;
       }


       //读yuv文件,该文件中存放的数据尺寸为 352*288的yv12数据
       while ( fread( szData, 1, iW*iH*3/2, pFile ) != NULL )
       {
              int i = SDL_UpdateTexture( pTexture, &sdlRT, szData, iPitch );
              SDL_RenderClear( pRender );
              SDL_RenderCopy( pRender, pTexture, &sdlRT, &dstRT );
              SDL_RenderPresent( pRender );

              Sleep(40);
       }

       fclose(pFile);


       if ( pTexture != NULL )
       {
              SDL_DestroyTexture( pTexture );
              pTexture = NULL       ;
       }

       if ( pRender != NULL )
       {
              SDL_DestroyRenderer( pRender );
              pRender = NULL;
       }


       if ( NULL != pWindow )
       {
              SDL_DestroyWindow( pWindow );
              pWindow = NULL;
       }

}
注意在SDL_CreateWindowFrom中sdl将窗口的消息处理函数地址给改写成sdl的函数了(在sdl源文件中SetupWindowData()此函数内修改),
SDL2.0在mfc窗口中显示yuv的一种方法 - airmanisvip - 我的博客

同时在SDL_Destroy函数中会恢复hwnd默认消息处理函数,如果不希望sdl参与消息处理,可将SetWindowLongPtr注销掉

对SDL的使用还在摸索中,不能保证上述知识全部正确,如哪位仁兄发现问题,请留言更正,再次谢过了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值