閱讀704 返回首頁    go 阿裏雲 go 技術社區[雲棲]


【轉載】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的使用還在摸索中,不能保證上述知識全部正確,如哪位仁兄發現問題,請留言更正,再次謝過了!
 

最後更新:2017-04-03 16:49:03

  上一篇:go Spark on Mesos: 搭建Mesos的一些問題
  下一篇:go Hi3531用SPI FLASH啟動 使用Nand做文件係統