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

简介: <div class="bct fc05 fc11 nbw-blog ztag"><br>DWORD ThreadFun()<br>{<br>    //用mfc窗口句柄创建一个sdl window<br>    SDL_Window * pWindow = SDL_CreateWindowFrom( (void *)( GetDlgItem(IDC_STATIC1)->GetSafe

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的使用还在摸索中,不能保证上述知识全部正确,如哪位仁兄发现问题,请留言更正,再次谢过了!
 
相关文章
|
8月前
|
计算机视觉 数据格式
使用opencv在Qt控件上播放mp4文件
使用opencv在Qt控件上播放mp4文件
225 2
|
3月前
|
Windows
SDL基础使用07(YUV数据显示)
使用SDL库在Windows上处理和显示YUV数据,包括生成随机YUV数据、播放YUV文件以及实现带缩放的实时渲染。
65 1
|
程序员 C++ Windows
GDI+与GDI屏幕抓图比较
GDI+与GDI屏幕抓图比较
202 0
|
开发工具 Windows
SDL开发笔记(三):使用SDL渲染窗口颜色和图片
SDL开发笔记(三):使用SDL渲染窗口颜色和图片
【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★(二)
【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★(二)
204 0
【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★(二)
|
存储 Windows
【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★(一)
【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★(一)
288 0
|
开发者
【音视频连载-002】基础学习篇-SDL 创建窗口并显示颜色
在前面的文章中我们已经完成了 SDL 的工程配置,接下来就是 SDL 相关功能的开发。 本篇文章主要是创建一个应用程序窗口并显示。
293 0
【音视频连载-002】基础学习篇-SDL 创建窗口并显示颜色
MFC中MessageBeep与sndPlaySound播放声音函数使用
MessageBeep(0x00000000L);        //用来播放系统默认音频文件,如0x00000000L为系统提示音,具体音频对应规则,请参照MSDN。   sndPlaySound函数用来播放指定音频WAV文件,分为两种: 同步模式:音乐播放过程中函数不返回,播放完成才返回 异步播放在做游戏等需要播放时间较长的音乐时使用,因为程序不会在音乐播放过程中有假死的情况。
2757 0
|
图形学
1.关于QT中的Graphics绘图,定时器,动画,将窗口中的内容打印到图片上,打印机,打印预览
 1 新建项目 A  修改pro中的内容如下: HEADERS += \     MyWidget.h   SOURCES += \     MyWidget.cpp   QT += gui widgets printsupport B  编写MyWidget
1697 0

热门文章

最新文章