⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yuvdump.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
字号:
/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is MPEG4IP. * * The Initial Developer of the Original Code is Cisco Systems Inc. * Portions created by Cisco Systems Inc. are * Copyright (C) Cisco Systems Inc. 2000-2002.  All Rights Reserved. * * Contributor(s): *              Bill May                wmay@cisco.com */#include "systems.h"#include <SDL.h>int main (int argc, char **argv){  FILE *yuvfile;  uint8_t *ybuf, *ubuf, *vbuf;  uint32_t height = 240, width = 320, ysize, uvsize, readbytes, rate = 30*100;  char buf[32];  printf("%s - %s version %s\n", *argv, PACKAGE, VERSION);  argc--;  argv++;  if (argc <= 1) {    printf("usage: yuvdump -h [height] -w [width] -r [frameRate/(perSecond/100)] fileName\n");    return 0;  }  while (argv[0][0] == '-') {    switch (argv[0][1]) {    case 'h':      argv++;      argc--;      height = atoi(*argv);      argv++;      argc--;      break;    case 'w':      argv++;      argc--;      width = atoi(*argv);      argv++;      argc--;      break;    case 'r':      argv++;      argc--;      rate = atoi(*argv);      argv++;      argc--;      break;    default:      printf("Unknown option %s", *argv);      exit(-1);    }  }  if (SDL_Init(SDL_INIT_VIDEO) < 0 || !SDL_VideoDriverName(buf, 1)) {    printf("Could not init SDL video: %s\n", SDL_GetError());  }  if (*argv == NULL) return(0);  const SDL_VideoInfo *video_info;  int video_bpp;  video_info = SDL_GetVideoInfo();  switch (video_info->vfmt->BitsPerPixel) {  case 16:  case 32:    video_bpp = video_info->vfmt->BitsPerPixel;    break;  default:    video_bpp = 16;    break;  }  SDL_Surface *m_screen = SDL_SetVideoMode(width,					   height,					   32,					   SDL_SWSURFACE | SDL_ASYNCBLIT);  SDL_Rect m_dstrect;  m_dstrect.x = 0;  m_dstrect.y = 0;  m_dstrect.w = m_screen->w;  m_dstrect.h = m_screen->h;  SDL_Overlay *m_image = SDL_CreateYUVOverlay(width,					      height,					      SDL_YV12_OVERLAY, 					      m_screen);  yuvfile = fopen(*argv, FOPEN_READ_BINARY);  ysize = width*height;  uvsize = ysize / 4;  printf("ysize %u uvsize %u\n", ysize, uvsize);  ybuf = (uint8_t *)malloc(ysize);  ubuf = (uint8_t *)malloc(ysize);  vbuf = (uint8_t *)malloc(ysize);  unsigned int fcount = 0;  int qevent = 0;  do {    SDL_Event event;    while (SDL_PollEvent(&event)) {      if (event.type == SDL_QUIT) {	qevent = 1;      }    }    readbytes = fread(ybuf, ysize,  sizeof(uint8_t), yuvfile);    if (readbytes != 1) {      if (feof(yuvfile)) {	continue;      }      printf("frame %u - y buf read error\n", fcount);      continue;    }    readbytes = fread(ubuf, uvsize,  sizeof(uint8_t), yuvfile);    if (readbytes != 1) {      printf("frame %u - u buf read error\n", fcount);      continue;    }    readbytes = fread(vbuf, uvsize,  sizeof(uint8_t), yuvfile);    if (readbytes != 1) {      printf("frame %u - v buf read error\n", fcount);      continue;    }    SDL_LockYUVOverlay(m_image);    memcpy(m_image->pixels[0], ybuf, ysize);    memcpy(m_image->pixels[1], vbuf, uvsize);    memcpy(m_image->pixels[2], ubuf, uvsize);    SDL_DisplayYUVOverlay(m_image, &m_dstrect);    SDL_UnlockYUVOverlay(m_image);    SDL_Delay( 1000 * 100 / rate );    fcount++;  } while (qevent == 0 && !feof(yuvfile));  SDL_Delay(2000);  printf("Frames read %u\n", fcount);  SDL_FreeYUVOverlay(m_image);  SDL_FreeSurface(m_screen);  SDL_Quit();  fclose(yuvfile);  return (0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -