【转载】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的使用还在摸索中,不能保证上述知识全部正确,如哪位仁兄发现问题,请留言更正,再次谢过了!
 
相关文章
|
Web App开发 编解码 Android开发
2023年音视频开发知识技术合集(基础入门到高级进阶)
2023年音视频开发知识技术合集(基础入门到高级进阶)
|
12月前
|
Dart 索引
鸿蒙应用开发从入门到入行 - 篇8:Tabs选项卡页签视图切换
在本篇文章里,您将掌握使用Tabs选项卡做栏目分类,这是未来应用开发中极为常用的组件
527 7
鸿蒙应用开发从入门到入行 - 篇8:Tabs选项卡页签视图切换
|
安全 应用服务中间件 网络安全
49.3k star,本地 SSL 证书生成神器,轻松解决 HTTPS 配置痛点
mkcert是一款由Filippo Valsorda开发的免费开源工具,专为生成受信任的本地SSL/TLS证书而设计。它通过简单的命令自动生成并安装本地信任的证书,使本地环境中的HTTPS配置变得轻松无比。mkcert支持多个操作系统,已获得49.2K的GitHub Star,成为开发者首选的本地SSL工具。
662 10
|
机器学习/深度学习 存储 人工智能
深度学习中的模型压缩技术在人工智能领域,深度学习技术的迅猛发展带来了巨大的计算资源需求。为了解决这一问题,模型压缩技术应运而生。本文将介绍什么是模型压缩、常见的模型压缩方法以及其在实际应用中的意义。
随着深度学习技术的广泛应用,计算资源的需求也大幅增加。为减少资源消耗,提升模型效率,模型压缩技术成为研究热点。本文探讨了模型压缩的定义、主流方法和其重要性。通过量化、剪枝、知识蒸馏和轻量级架构等策略,模型得以在保持性能的同时减小体积,从而适用于资源受限的环境。这些技术不仅降低了计算成本,还推动了深度学习在移动设备和边缘计算等领域的应用,使AI技术更加普及和实用。总之,模型压缩在平衡模型性能与资源消耗之间发挥着关键作用,是未来AI发展的重要方向。
|
缓存 前端开发 Java
在Java项目中实现跨域资源共享(CORS)
在Java项目中实现跨域资源共享(CORS)
|
API 调度 芯片
FreeRTOS 延时函数和软件定时器 详解
FreeRTOS 延时函数和软件定时器 详解
FreeRTOS 延时函数和软件定时器 详解
|
Linux 网络安全 Docker
CentOS7搭建私有化Docker仓库Harbor(上)
CentOS7搭建私有化Docker仓库Harbor(上)
524 0
av_seek_frame实战--跳转到文件指定时间后开始推流或写入新文件
av_seek_frame实战--跳转到文件指定时间后开始推流或写入新文件
311 0
av_seek_frame实战--跳转到文件指定时间后开始推流或写入新文件
|
存储 Python
候选基因如何分析?
候选基因如何分析?