zoukankan      html  css  js  c++  java
  • 【转载】SDL2.0在mfc窗口中显示yuv的一种方法 分类: ffmpeg-SDL-VLC-Live555 2013-08-28 11:33 1124人阅读 评论(0) 收藏


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

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    体温上报APP2.2(第二阶段总结)
    体温上报APP2.1
    体温上报APP2.0
    体温上报APP1.2
    体温上报APP1.1
    个人作业——体温上报APP
    安卓学习14(ViewPager)
    安卓学习13(RecyclerView)
    安卓学习12(ListView)
    javascript获得给定日期的前一天的日期
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706816.html
Copyright © 2011-2022 走看看