yuvdump.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "systems.h"
  2. #include <SDL.h>
  3. int main (int argc, char **argv)
  4. {
  5.   FILE *yuvfile;
  6.   uint8_t *ybuf, *ubuf, *vbuf;
  7.   uint32_t height = 240, width = 320, ysize, uvsize, readbytes;
  8.   char buf[32];
  9.   printf("%s - %s version %sn", *argv, PACKAGE, VERSION);
  10.   argc--;
  11.   argv++;
  12.   if (argc == 0) {
  13.     printf("Usage - yuvdump -h <height> -w <width> filenamen");
  14.     return 0;
  15.   }
  16.   while (argv[0][0] == '-') {
  17.     switch (argv[0][1]) {
  18.     case 'h':
  19.       argv++;
  20.       argc--;
  21.       height = atoi(*argv);
  22.       argv++;
  23.       argc--;
  24.       break;
  25.     case 'w':
  26.       argv++;
  27.       argc--;
  28.       width = atoi(*argv);
  29.       argv++;
  30.       argc--;
  31.       break;
  32.     default:
  33.       printf("Unknown option %s", *argv);
  34.       exit(-1);
  35.     }
  36.   }
  37.   if (SDL_Init(SDL_INIT_VIDEO) < 0 || !SDL_VideoDriverName(buf, 1)) {
  38.     printf("Could not init SDL video: %sn", SDL_GetError());
  39.   }
  40.   if (*argv == NULL) 
  41.     return(0);
  42.   const SDL_VideoInfo *video_info;
  43.   int video_bpp;
  44.   video_info = SDL_GetVideoInfo();
  45.   switch (video_info->vfmt->BitsPerPixel) {
  46.   case 16:
  47.   case 32:
  48.     video_bpp = video_info->vfmt->BitsPerPixel;
  49.     break;
  50.   default:
  51.     video_bpp = 16;
  52.     break;
  53.   }
  54.   SDL_Surface *m_screen = SDL_SetVideoMode(width,
  55.    height,
  56.    32,
  57.    SDL_SWSURFACE | SDL_ASYNCBLIT);
  58.   SDL_Rect m_dstrect;
  59.   m_dstrect.x = 0;
  60.   m_dstrect.y = 0;
  61.   m_dstrect.w = m_screen->w;
  62.   m_dstrect.h = m_screen->h;
  63.   SDL_Overlay *m_image = SDL_CreateYUVOverlay(width,
  64.       height,
  65.       SDL_YV12_OVERLAY, 
  66.       m_screen);
  67.   yuvfile = fopen(*argv, "r");
  68.   ysize = width*height;
  69.   uvsize = ysize / 4;
  70.   printf("ysize %u uvsize %un", ysize, uvsize);
  71.   ybuf = (uint8_t *)malloc(ysize);
  72.   ubuf = (uint8_t *)malloc(ysize);
  73.   vbuf = (uint8_t *)malloc(ysize);
  74.   unsigned int fcount = 0;
  75.   int qevent = 0;
  76.   do {
  77.     SDL_Event event;
  78.     while (SDL_PollEvent(&event)) {
  79.       if (event.type == SDL_QUIT) {
  80. qevent = 1;
  81.       }
  82.     }
  83.     readbytes = fread(ybuf, ysize,  sizeof(uint8_t), yuvfile);
  84.     if (readbytes != 1) {
  85.       printf("frame %u - y buf read errorn", fcount);
  86.       continue;
  87.     }
  88.     readbytes = fread(ubuf, uvsize,  sizeof(uint8_t), yuvfile);
  89.     if (readbytes != 1) {
  90.       printf("frame %u - u buf read errorn", fcount);
  91.       continue;
  92.     }
  93.     readbytes = fread(vbuf, uvsize,  sizeof(uint8_t), yuvfile);
  94.     if (readbytes != 1) {
  95.       printf("frame %u - v buf read errorn", fcount);
  96.       continue;
  97.     }
  98.     SDL_LockYUVOverlay(m_image);
  99.     memcpy(m_image->pixels[0], ybuf, ysize);
  100.     memcpy(m_image->pixels[1], vbuf, uvsize);
  101.     memcpy(m_image->pixels[2], ubuf, uvsize);
  102.     SDL_DisplayYUVOverlay(m_image, &m_dstrect);
  103.     SDL_UnlockYUVOverlay(m_image);
  104.     if (fcount == 0) SDL_Delay(1000);
  105.     fcount++;
  106.     //SDL_Delay(33);
  107.     //printf("%un", fcount);
  108.   } while (qevent == 0 && !feof(yuvfile));
  109.   SDL_Delay(2000);
  110.   printf("Frames read %un", fcount);
  111.   SDL_FreeYUVOverlay(m_image);
  112.   SDL_FreeSurface(m_screen);
  113.   SDL_Quit();
  114.   fclose(yuvfile);
  115.   return (0);
  116. }