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

📄 win.c

📁 h.263解码器 视频会议 图像采集 图像压缩
💻 C
字号:
/************************************************************************ * These routines were written by Intel Architecture Labs (IAL) * * v1 : Michael Third  * v2 : Karl (removed unnecessary code, collected routines in one file) *           (moved and changed parts of message loop) *           (changed YUVtoRGB routine) *           (added synchronization with events  *           instead of empty while loop) ************************************************************************/#include "config.h"#include "tmndec.h"#include "global.h"#include "win.h"#ifdef WINDOWS/* vdinit.c */T_VDWINDOW vdWindow;int initDisplay (int pels, int lines){  int errFlag = 0;  init_dither_tab();  errFlag |= InitDisplayWindowThread (pels, lines);  return errFlag;}int InitDisplayWindowThread (int width, int height){  int errFlag = 0;  /* now modify the couple that need it */  vdWindow.width = width;  vdWindow.height = height;  vdWindow.biHeader.biWidth = vdWindow.width;  vdWindow.biHeader.biHeight = vdWindow.height;  vdWindow.biHeader.biSize = sizeof(BITMAPINFOHEADER);  vdWindow.biHeader.biCompression = BI_RGB;  vdWindow.biHeader.biPlanes = 1;  vdWindow.biHeader.biBitCount = 24;  vdWindow.biHeader.biSizeImage = 3 * vdWindow.width * vdWindow.height;  vdWindow.imageIsReady = FALSE;  /* allocate the memory needed to hold the RGB and visualization information */  vdWindow.bufRGB = (unsigned char *)malloc (3 * vdWindow.width * vdWindow.height);  /* Create synchronization event */  vdWindow.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);  vdWindow.hThread =     CreateThread (      NULL,       0,       (LPTHREAD_START_ROUTINE) DisplayWinMain,       (LPVOID) NULL,       0,       &(vdWindow.dwThreadID)    );  if (vdWindow.hThread == NULL) {    errFlag = 1;    return errFlag;  }  return errFlag;}/* vddraw.c */int displayImage (unsigned char *lum, unsigned char *Cr, unsigned char *Cb){  int errFlag = 0;  DWORD dwRetVal;  /* wait until we have finished drawing the last frame */  if (vdWindow.windowDismissed == FALSE) {    vdWindow.src[0] = lum;    vdWindow.src[1] = Cb;    vdWindow.src[2] = Cr;    /* wait until previous frame has been drawn */    dwRetVal = WaitForSingleObject(vdWindow.hEvent,INFINITE);    vdWindow.imageIsReady = TRUE;    /* Post message to drawing thread's window to draw frame */    PostMessage (vdWindow.hWnd, VIDEO_DRAW_FRAME, (WPARAM) NULL, (LPARAM) NULL);	}		return errFlag;}int DrawDIB(){											        int errFlag = 0;  errFlag |=     DrawDibDraw (      vdWindow.hDrawDib,       vdWindow.hDC,       0,       0,       vdWindow.zoom * vdWindow.width,       vdWindow.zoom * vdWindow.height,       &vdWindow.biHeader,       vdWindow.bufRGB,       0,       0,       vdWindow.width,       vdWindow.height,       DDF_SAME_DRAW    ); 		return errFlag;}/* vdwinman.c */void DisplayWinMain (void *dummy){  int errFlag = 0;  DWORD dwStyle;	  vdWindow.wc.style =  CS_BYTEALIGNWINDOW;				   vdWindow.wc.lpfnWndProc = MainWndProc;  vdWindow.wc.cbClsExtra = 0;  vdWindow.wc.cbWndExtra = 0;  vdWindow.wc.hInstance = 0;  vdWindow.wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);  vdWindow.wc.hCursor = LoadCursor (NULL, IDC_ARROW);  vdWindow.wc.hbrBackground = GetStockObject (WHITE_BRUSH);  vdWindow.wc.lpszMenuName = NULL;  vdWindow.zoom = 1;  strcpy (vdWindow.lpszAppName, "H.263 Display");  vdWindow.wc.lpszClassName = vdWindow.lpszAppName;  RegisterClass(&vdWindow.wc);  dwStyle =  WS_DLGFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;  vdWindow.hWnd =     CreateWindow (vdWindow.lpszAppName,      vdWindow.lpszAppName,      dwStyle,      CW_USEDEFAULT,      CW_USEDEFAULT,      vdWindow.width + 6,      vdWindow.height + 25,      NULL,      NULL,      0,      NULL    );	  if (vdWindow.hWnd == NULL)    ExitThread (errFlag = 1);  ShowWindow(vdWindow.hWnd, SW_SHOWNOACTIVATE);  UpdateWindow(vdWindow.hWnd);  /* Message loop for display window's thread */  while (GetMessage (&(vdWindow.msg), NULL, 0, 0)) {    TranslateMessage (&(vdWindow.msg));    DispatchMessage (&(vdWindow.msg));  }  ExitThread (0);}LRESULT APIENTRY MainWndProc (HWND hWnd, UINT msg, UINT wParam, LONG lParam){  LPMINMAXINFO lpmmi;  switch (msg) {    case VIDEO_BEGIN:      vdWindow.hDC = GetDC (vdWindow.hWnd);      vdWindow.hDrawDib = DrawDibOpen();      vdWindow.zoom = 1;      vdWindow.oldzoom = 0;      DrawDibBegin (        vdWindow.hDrawDib,         vdWindow.hDC,         2*vdWindow.width,         2*vdWindow.height,         &vdWindow.biHeader,         vdWindow.width,         vdWindow.height,         0      );      SetEvent(vdWindow.hEvent);      vdWindow.windowDismissed = FALSE;      ReleaseDC (vdWindow.hWnd, vdWindow.hDC);      break;    case VIDEO_DRAW_FRAME:      vdWindow.hDC = GetDC (vdWindow.hWnd);      ConvertYUVtoRGB(        vdWindow.src[0],        vdWindow.src[1],        vdWindow.src[2],        vdWindow.bufRGB,        vdWindow.width,        vdWindow.height      );      /* draw the picture onto the screen*/      DrawDIB();      SetEvent(vdWindow.hEvent);      ReleaseDC (vdWindow.hWnd, vdWindow.hDC);      break;    case VIDEO_END:      /* Window has been closed.  The following lines handle the cleanup. */      vdWindow.hDC = GetDC (vdWindow.hWnd);      DrawDibEnd (vdWindow.hDrawDib);      DrawDibClose (vdWindow.hDrawDib);      ReleaseDC (vdWindow.hWnd, vdWindow.hDC);      vdWindow.windowDismissed = TRUE;      PostQuitMessage(0);      break;    case WM_CREATE:      PostMessage(hWnd, VIDEO_BEGIN, 0, 0);      break;    case WM_SIZE:      switch (wParam) {        case SIZE_MAXIMIZED:          vdWindow.zoom = 2;          break;        case SIZE_MINIMIZED:          vdWindow.oldzoom = vdWindow.zoom;        	break;        case SIZE_RESTORED:          if (vdWindow.oldzoom) {            vdWindow.zoom = vdWindow.oldzoom;            vdWindow.oldzoom = 0;          }          else            vdWindow.zoom = 1;          break;        case SIZE_MAXHIDE:          break;        case SIZE_MAXSHOW:          break;      }      PostMessage(hWnd,WM_PAINT,0,0);      break;      case WM_GETMINMAXINFO:      lpmmi = (LPMINMAXINFO) lParam;      GetWindowRect (hWnd, &vdWindow.rect);      lpmmi->ptMaxPosition.x = vdWindow.rect.left;      lpmmi->ptMaxPosition.y = vdWindow.rect.top;      lpmmi->ptMaxSize.x = 2 * (vdWindow.width) + 6;      lpmmi->ptMaxSize.y = 2 * (vdWindow.height) + 25;      break;    case WM_DESTROY:      /* Window has been closed.  The following lines handle the cleanup. */      DrawDibEnd (vdWindow.hDrawDib);      ReleaseDC (vdWindow.hWnd, vdWindow.hDC);      DrawDibClose (vdWindow.hDrawDib);      vdWindow.windowDismissed = TRUE;      PostQuitMessage(0);      break;    case WM_PAINT:      if (vdWindow.imageIsReady) {        vdWindow.hDC = GetDC (vdWindow.hWnd);        DrawDIB ();        ReleaseDC (vdWindow.hWnd, vdWindow.hDC);      }      break;  }  return DefWindowProc (hWnd, msg, wParam, lParam);}/* vdclose.c */int closeDisplay (){  int errFlag = 0;  if (vdWindow.hWnd) {    PostMessage (vdWindow.hWnd, VIDEO_END, (WPARAM) NULL, (LPARAM) NULL);    while (vdWindow.windowDismissed == FALSE)      ;  }  if (vdWindow.hEvent)    CloseHandle(vdWindow.hEvent);  if (vdWindow.hThread)    CloseHandle (vdWindow.hThread);  free (vdWindow.bufRGB);  return errFlag;}#endif

⌨️ 快捷键说明

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