MFC下用sdl 显示bmp、rgb、yuv

简介: <p><img src="http://img.blog.csdn.net/20141127084518778?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFvMDUxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>

#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\n", 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\n", 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.\n", 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\n", 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!\n");
        exit(1);
    }

    printf("w:%d, h:%d, planes:%d\n", overlay->w, overlay->h, overlay->planes);
    printf("pitches:%d, %d, %d\n", 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!\n");
            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\n", 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\n", 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\n", 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!\n");
        exit(1);
    }

    printf("w:%d, h:%d, planes:%d\n", overlay->w, overlay->h, overlay->planes);
    printf("pitches:%d, %d, %d\n", 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!\n");
            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

相关文章
|
1月前
|
存储 算法 编译器
【ffmpeg 到Qt的图片格式转换】精彩的像素:深入解析 AVFrame 到 QImage 的转换
【ffmpeg 到Qt的图片格式转换】精彩的像素:深入解析 AVFrame 到 QImage 的转换
46 0
|
3月前
|
存储 传感器 编解码
图像格式:常见图像格式RAW, RGB, YUV&&图像格式的解析、格式转换和看图软件
图像格式:常见图像格式RAW, RGB, YUV&&图像格式的解析、格式转换和看图软件
273 1
|
7月前
|
编解码 API 开发工具
NV21、NV12、YV12、RGB565、YUV等颜色编码格式区别和接口设计探讨
NV21、NV12、YV12、RGB565、YUV分别是不同的颜色编码格式,这些颜色编码格式各有特点,适用于不同的应用场景。选择合适的颜色编码格式取决于具体的需求和环境:
148 1
FreeSwitch中,RGB颜色转换为YUV
FreeSwitch中,RGB颜色转换为YUV
71 0
使用FFMPEG的sws_scale函数实现各种原始颜色格式互转(YUV\RGB\)
使用FFMPEG的sws_scale函数实现各种原始颜色格式互转(YUV\RGB\)
728 0
|
存储 编解码 数据建模
常用YUV转RGB代码
<p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">常用YUV转RGB </p> <div class="dp-highlighter bg_java" style="font-family: Consolas, 'Courier New', Courier, mo
5370 0
|
存储
YUV转RGB(NV21-ARGB)的Neon优化代码
说明 此代码仅限于 NV21 格式转 ARGB 格式。 NV21 格式中,Y 单独存储,UV分量交错存储。 使用如下公式: R = Y + 1.402*(V-128); G = Y - 0.34414*(U-128) - 0.71414*(V-128); B = Y + 1.772*(U-12
6536 0
|
存储 API C++
最简单的视音频播放示例7:SDL2播放RGB/YUV
本文记录SDL播放视频的技术。在这里使用的版本是SDL2。实际上SDL本身并不提供视音频播放的功能,它只是封装了视音频播放的底层API。在Windows平台下,SDL封装了Direct3D这类的API用于播放视频;封装了DirectSound这类的API用于播放音频。
2193 0