【转载】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()此函数内修改),

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

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

 

时间: 2024-10-28 22:05:41

【转载】SDL2.0在mfc窗口中显示yuv的一种方法的相关文章

界面-如何使打开的其他程序或者文档在MFC窗口中显示,而不是新打开一个窗口

问题描述 如何使打开的其他程序或者文档在MFC窗口中显示,而不是新打开一个窗口 我想在程序界面中指定一个区域,用于显示被打开的其他程序或者文档的界面.可是我用ShellExecute函数打开指定的那个文档和程序的时候,总是会再启动另一个窗口,效果就像是直接点击打开那个文件一样. 解决方案 将mfc窗口设置为其它程序的父窗口 解决方案二: 参考:程序只允许打开唯一实例且所有关联文档都在同一实例内打开的一揽子解决办法http://blog.csdn.net/IfI/article/details/1

Windows 7中显示桌面有几种方法?

  一般用到以下几种:1.Win+D 快捷键,这个在早期版本的Windows系统中也可以用.2.右下角"显示桌面"按钮,就是那个竖长条.3.Win+空格 快捷键,这个其实是预览桌面,准确的说不是回到桌面.4.任务栏上点鼠标右键,选择"显示桌面",这个用得比较少.

windows下ruby中显示中文的3种方法

A:    1将x.rb编码为ascii格式   2 在x.rb开头加上 #code:gbk或者 #coding:gbk B:    1 将x.rb编码为utf-8格式   2 在x.rb开头加上 #code:utf-8   3 chcp 65001将控制台代码页改为utf-8(OEM GBK为936)   4 将控制台字体改为非点阵字体 C:    1 将x.rb编码为utf-8格式   2 同B.2   3 str = str.encode("gbk")

C#窗口中显示复杂Word文档

问题描述 需要一个在C#窗口中显示Word文档的功能,而且Word的格式比较复杂,有图片.图表.图形.文字等,而且板式要求高.请问有没有好的方法!先谢谢啦! 解决方案 解决方案二:我也想知道!牛人快出现!解决方案三:OFFICE在线编辑器如DSOFramer,officecontrol.cab直接在URL中打开WORD解决方案四:DSOFramerOWC解决方案五:C#编写的Word操作类,有换页,添加表格,文本功能(转)usingSystem;usingSystem.Collections.G

mfc windows编程-怎么才可以让mfc框架中显示出图片

问题描述 怎么才可以让mfc框架中显示出图片 如图所示,我看视频学的,写的也和视频中一样,可为什么图片总是显示不出来,是因为m_img没有赋值成功么,希望大神们指导,最好能写下源码.对了,我建立mfc.exe时,里面的什么头文件啊什么的,就加了一个Gdiplus.h,其他的什么定义也没动,只是加了一些东西,求教多谢各位大神 解决方案 http://blog.csdn.net/friendan/article/details/38358507http://blog.csdn.net/liu_che

请问C#在通过命令行调用另一个程序的时候,如何让另一个程序的输出信息在新窗口中显示

问题描述 情况是这样的,我用C++写了一个程序,可以在黑窗口显示信息并且可以运行完,然后我用命令行调用C++生成的.exe文件的时候也能够运行结束并且显示信息,但是当我用C#调用的时候,C++程序始终在运行不结束,于是我就想用黑窗口看信息,结果始终看不到信息,不知道应该怎么写,而且由于程序始终在运行,我也无法在其运行结束后获取信息输出,所以我现在完全不知道问题出在哪里,所以还是想用黑窗口看一下信息,我现在的代码是下面这样的,想问问应该怎么改能看到信息Processp=newProcess();p

先谢谢了!!!双击datagridview中显示的行后,在一个新的窗口中显示带有TEXTBOX同样内容\同样数据的程序,因为我要实现修改\添加数据,这样做比较直观

问题描述 双击datagridview中显示的行后,在一个新的窗口中显示带有TEXTBOX同样内容同样数据的程序,因为我要实现修改添加数据,这样做比较直观,最好给个代码,或源程序,谢谢了 解决方案 解决方案二:怎么没有人回答呀解决方案三:在SelectedIndexChanging事件中,把该行的主键取出来,然后window.open()新页面,参数传过去接下来就好做了吧,更新完毕关闭新开的窗口并刷新原来网页解决方案四:深更半夜的人本来就不多...解决方案五:///<summary>///双击

VisuaC++6.0和MFC语言中编写一个像百度网盘的程序

问题描述 VisuaC++6.0和MFC语言中编写一个像百度网盘的程序 VisuaC++6.0和MFC语言中编写一个像百度网盘的程序,要怎么做?用到数据库的知识么?用到哪些? 解决方案 用sql server就是了,微软亲儿子.

DOS窗口cmd中显示UTF-8字符的解决方法

在一个包含了中文字符的.sql文件,我们在Eclipse属性中看到是UTF8编码的,如下图所示, 但是当在Windows控制台中查看这个文件(为了方便,我将文件拷贝到桌面了)的时候,就是乱码了: C:\Users\002778\Desktop>type abc.sql USE Abc; INSERT INTO `School` VALUES(1,'??浜?ぇ瀛Α?'??浜??涓??虫????澶ц?7??,'01062752114','???╁??),(2,'娓???澶у?','??浜??娴锋??