• MFC下用sdl 显示bmp、rgb、yuv 分类: windows驱动程序WDM VC++ ffmpeg-SDL-VLC-Live555 DirectX 2013-08-16 18:11 1114人阅读 评论(0) 收藏


    #include <libsdl/SDL.h>
    //#include "SDL.h"


    #ifdef TEST_VGA16 /* Define this if you want to test VGA 16-color video modes */
    #define NUM_COLORS 16
    #else
    #define NUM_COLORS 256
    #endif
    SDL_Surface *screen;




    void display_bmp()
    {
        SDL_Surface *image;
        char *file_name = "d:\temp\bao.bmp";
        /* Load the BMP file into a surface */
        image = SDL_LoadBMP(file_name);
        if (image == NULL) {
           // fprintf(stderr, "Couldn't load %s: %s ", file_name, SDL_GetError());
            return;
        }


        /*
         * Palettized screen modes will have a default palette (a standard
         * 8*8*4 colour cube), but if the image is palettized as well we can
         * use that palette for a nicer colour matching
         */
        if (image->format->palette && screen->format->palette) 
    {
        SDL_SetColors(screen, image->format->palette->colors, 0,
                      image->format->palette->ncolors);
        }


        /* Blit onto the screen surface */
        if(SDL_BlitSurface(image, NULL, screen, NULL) < 0)
            fprintf(stderr, "BlitSurface error: %s ", SDL_GetError());


        SDL_UpdateRect(screen, 0, 0, image->w, image->h);


        /* Free the allocated BMP surface */
        SDL_FreeSurface(image);
    }
    CString str;
    void CSdl_testDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    m_list.ResetContent();


    SDL_Event event;
        if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) { 
            str.Format("Could not initialize SDL: %s. ", SDL_GetError());
            m_list.AddString(str);
        }

        m_list.AddString("SDL initialized.");


    /* Have a preference for 8-bit, but accept any depth */
        screen = SDL_SetVideoMode(720, 576, 16, SDL_SWSURFACE|SDL_ANYFORMAT);
        if ( screen == NULL ) {
            str.Format( "Couldn't set 720*576 video mode: %s",SDL_GetError());
            m_list.AddString(str);
        }
        str.Format("Set 720*576 at %d bits-per-pixel mode",
    screen->format->BitsPerPixel);
    m_list.AddString(str);

        display_bmp();
        
        /* Shutdown all subsystems */
    //  
        
        m_list.AddString("Quiting.... press image!");


    while (SDL_WaitEvent(&event) ) 
    {
    switch (event.type)
    {
    case SDL_MOUSEBUTTONDOWN:
    SDL_Quit();
    return ;
    break;
    case SDL_KEYDOWN:
    if ( event.key.keysym.sym == SDLK_SPACE ) 
    {
    SDL_Quit();
    return ;
    break;
    }
    }
    }
    }


    void CSdl_testDlg::OnButton2() 
    {
    // TODO: Add your control notification handler code here
    int i = 1;
        int x, y;
        int w = 720;
        int h = 576;
        char c = 'n';

        FILE* fp;
        char filename[64];
        unsigned char* pY;
        unsigned char* pU;
        unsigned char* pV;
        SDL_Rect rect;
    m_list.ResetContent();
        if (SDL_Init(SDL_INIT_VIDEO) < 0)
        {
            fprintf(stderr, "can not initialize SDL:%s ", SDL_GetError());
            exit(1);
        }
        atexit(SDL_Quit);

        screen = SDL_SetVideoMode(720, 576, 32, SDL_SWSURFACE|SDL_ANYFORMAT);
        if ( screen == NULL ) {
            str.Format( "Couldn't set 720*576 video mode: %s",SDL_GetError());
            m_list.AddString(str);
        }

        SDL_Overlay* overlay = SDL_CreateYUVOverlay(w, h, SDL_YV12_OVERLAY, screen);
        if (overlay == NULL)
        {
            fprintf(stderr, "create overlay error! ");
            exit(1);
        }

        printf("w:%d, h:%d, planes:%d ", overlay->w, overlay->h, overlay->planes);
        printf("pitches:%d, %d, %d ", overlay->pitches[0], overlay->pitches[1], overlay->pitches[2]);

        pY = (unsigned char*)malloc(w*h);
        pU = (unsigned char*)malloc(w*h/4);
        pV = (unsigned char*)malloc(w*h/4);

       
            SDL_LockSurface(screen);
            SDL_LockYUVOverlay(overlay);

     
            fp = fopen("d:\temp\1.yuv", "rb");
            if (fp == NULL)
            {
                fprintf(stderr, "open file error! ");
                exit(1);
            }
    while (!feof(fp))
    {
            fread(pY, 1, w*h, fp);
            fread(pU, 1, w*h/4, fp);
            fread(pV, 1, w*h/4, fp);

            memcpy(overlay->pixels[0], pY, w*h);
            memcpy(overlay->pixels[1], pV, w*h/4);
            memcpy(overlay->pixels[2], pU, w*h/4);

           

            SDL_UnlockYUVOverlay(overlay);
            SDL_UnlockSurface(screen);

            rect.w = w;
            rect.h = h;
            rect.x = rect.y = 0;
            SDL_DisplayYUVOverlay(overlay, &rect);

            SDL_Delay(40);

            i += 1;
    str.Format("current frmcnt:%d",i);
    m_list.AddString(str);
        }
    fclose(fp);
        free(pY);
        free(pU);
        free(pV);


        SDL_FreeYUVOverlay(overlay);
        SDL_FreeSurface(screen);

        
    }
    //unsigned char buff[720*576*3];
    unsigned int rgb[720*576];
    void CSdl_testDlg::OnButton3() 
    {
    // TODO: Add your control notification handler code here
    m_list.ResetContent();

    // SDL_Event event;
    if (SDL_Init(SDL_INIT_VIDEO) < 0)
        {
            fprintf(stderr, "can not initialize SDL:%s ", SDL_GetError());
            exit(1);
        }
        atexit(SDL_Quit);

        screen = SDL_SetVideoMode(720, 576, 32, SDL_SWSURFACE|SDL_ANYFORMAT);
        if ( screen == NULL ) {
            str.Format( "Couldn't set 720*576 video mode: %s",SDL_GetError());
            m_list.AddString(str);
        }


    SDL_Surface *image;


        Uint32 rmask, gmask, bmask, amask;


        /* SDL interprets each pixel as a 32-bit number, so our masks must depend
           on the endianness (byte order) of the machine */
    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
        rmask = 0xff000000;
        gmask = 0x00ff0000;
        bmask = 0x0000ff00;
        amask = 0x000000ff;
    #else
        rmask = 0x000000ff;
        gmask = 0x0000ff00;
        bmask = 0x00ff0000;
        amask = 0xff000000;
    #endif


        image = SDL_CreateRGBSurface(SDL_SWSURFACE, 720, 576, 0,
                                       rmask, gmask, bmask, amask);
        if(image == NULL) {
            fprintf(stderr, "CreateRGBSurface failed: %s ", SDL_GetError());
            exit(1);
        }


    // SDL_LockSurface(screen);
      //  SDL_LockSurface(image);
        CBitmap m_bitmap; 
        HBITMAP m_hBitmap;
    BITMAP bm;//存放位图信息的结构


    m_hBitmap = (HBITMAP)::LoadImage(NULL,"d:\temp\bao.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);   //装载位图
    if(m_bitmap.m_hObject)
    m_bitmap.DeleteObject();
    m_bitmap.Attach(m_hBitmap);//将句柄与CBitmap关联起来
    m_bitmap.GetBitmap(&bm);
    m_bitmap.GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,rgb);
    //


        memcpy(screen->pixels,rgb,720*576*4);
      //  SDL_UnlockSurface(image);
    // SDL_UnlockSurface(screen);


        SDL_UpdateRect(screen, 0, 0, image->w, image->h);
        
        /* Free the allocated BMP surface */
        SDL_FreeSurface(image);
    }


    void CSdl_testDlg::OnButton4() 
    {
    // TODO: Add your control notification handler code here
    int i = 1;
        int x, y;
        int w = 720;
        int h = 576;
        char c = 'n';

        FILE* fp;
        char filename[64];
        unsigned char* pY;
     //   unsigned char* pU;
     //   unsigned char* pV;
        SDL_Rect rect;
    m_list.ResetContent();
        if (SDL_Init(SDL_INIT_VIDEO) < 0)
        {
            fprintf(stderr, "can not initialize SDL:%s ", SDL_GetError());
            exit(1);
        }
        atexit(SDL_Quit);

        screen = SDL_SetVideoMode(720, 576, 32, SDL_SWSURFACE|SDL_ANYFORMAT);
        if ( screen == NULL ) {
            str.Format( "Couldn't set 720*576 video mode: %s",SDL_GetError());
            m_list.AddString(str);
        }

        SDL_Overlay* overlay = SDL_CreateYUVOverlay(w, h, SDL_YUY2_OVERLAY, screen);
        if (overlay == NULL)
        {
            fprintf(stderr, "create overlay error! ");
            exit(1);
        }

        printf("w:%d, h:%d, planes:%d ", overlay->w, overlay->h, overlay->planes);
        printf("pitches:%d, %d, %d ", overlay->pitches[0], overlay->pitches[1], overlay->pitches[2]);

        pY = (unsigned char*)malloc(w*h*2);
    //    pU = (unsigned char*)malloc(w*h/4);
    //    pV = (unsigned char*)malloc(w*h/4);

       
            SDL_LockSurface(screen);
            SDL_LockYUVOverlay(overlay);

     
            fp = fopen("d:\TEMP\6082.dat", "rb");
            if (fp == NULL)
            {
                fprintf(stderr, "open file error! ");
                exit(1);
            }
    while (!feof(fp))
    {
            fread(pY, 1, w*h*2, fp);



            memcpy(overlay->pixels[0], pY, w*h*2);



           

            SDL_UnlockYUVOverlay(overlay);
            SDL_UnlockSurface(screen);

            rect.w = w;
            rect.h = h;
            rect.x = rect.y = 0;
            SDL_DisplayYUVOverlay(overlay, &rect);

            SDL_Delay(40);

            i += 1;
    str.Format("current frmcnt:%d",i);
    m_list.AddString(str);
        }
    fclose(fp);
        free(pY);
    //    free(pU);
      //  free(pV);


        SDL_FreeYUVOverlay(overlay);
        SDL_FreeSurface(screen);
    }


    http://download.csdn.net/detail/mao0514/8202701

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

  • 相关阅读:
    【NumPy】 之常见运算(np.around、np.floor、np.ceil、np.where)(转)
    python3中collections模块(转)
    numpy.random模块用法小结
    生成模型和判别模型(《统计学习方法》截图)
    linux(Ubuntu)下机器学习/深度学习环境配置
    sklearn中predict_proba的用法例子(转)
    机器学习案例实战之信用卡欺诈检测——收获的技术
    分析长期治疗数据显示TNF拮抗剂似乎并未增加严重感染和肿瘤发生风险
    超声在鉴别诊断RA与PsA中的应用价值
    结合超声计数炎症关节的改良版DAS28的临床应用
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706841.html
Copyright © 2020-2023  润新知