閱讀435 返回首頁    go 阿裏雲 go 技術社區[雲棲]


directdraw顯示yuv422(yuy2)


#include <mmsystem.h>
void CshowpicDlg::OnBnClickedButton3()
{
 // TODO: 在此添加控件通知處理程序代碼

    height=width=widthBytes=0;
 m_screen.SetWindowPos(&CWnd::wndBottom,0,0,720,576, SWP_NOMOVE | SWP_SHOWWINDOW);
 UpdateWindow();
 main_window_handle = m_screen.GetSafeHwnd();
   
 if(DD_OK!=(DirectDrawCreateEx(NULL, (void **)&lpdd7, IID_IDirectDraw7, NULL)))
 {
  return ;
 }
 // set the cooperative level for full-screen mode
 if(DD_OK != lpdd7->SetCooperativeLevel(AfxGetMainWnd()->GetSafeHwnd(), DDSCL_NORMAL))
 {
  return ;
 }
 /*設置控製級時,如果應用程序請求了 DDSCL_NORMAL 模式(表明應用程序以普通窗口的形式運行),則不需要提供一個指定窗口的句柄.給窗口句柄參數為 NULL, 所有的窗口都可以被設置為普通的控製級. */
 // set the display mode to 640x480x256
 // clear ddsd and set size
 memset(&ddsd,0,sizeof(ddsd));
 ddsd.dwSize = sizeof(ddsd);
 
 // enable valid fields
 ddsd.dwFlags=DDSD_CAPS;
 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
 // create the primary surface
 
 if(DD_OK!=(lpdd7->CreateSurface(&ddsd, &lpddsprimary, NULL)))
 {
  return ;
 }
 
 // 創建裁剪器
 if (FAILED(lpdd7->CreateClipper(0, &lpDDClipper, NULL)))
  return ;
 // 與窗口工作區關聯

 if (FAILED(lpDDClipper->SetHWnd(0, main_window_handle)))
 {
  lpDDClipper->Release();
  return ;
 }
 
 if (FAILED(lpddsprimary->SetClipper(lpDDClipper)))
 {
  lpDDClipper->Release();
  return ;
 }


 //
 memset(&ddsd,0,sizeof(ddsd));
 ddsd.dwSize = sizeof(ddsd);
 DDPIXELFORMAT camdispPixelFormat = {sizeof(DDPIXELFORMAT), DDPF_FOURCC, mmioFOURCC('Y','U','Y','2'), 0,0,0,0,0}; 
 ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
 ddsd.dwWidth = 720;
 ddsd.dwHeight = 576;
 ddsd.dwBackBufferCount = 0;
 ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN| DDSCAPS_VIDEOMEMORY;
 ddsd.ddpfPixelFormat = camdispPixelFormat;
 //
 
 if(DD_OK!=(lpdd7->CreateSurface(&ddsd, &lpddsmypage[0], NULL)))
 {
  return ;
 }

 POINT p;

 p.x = 0; p.y = 0;
 m_screen.ClientToScreen(&p);//獲取屏幕頂點
 // m_screen.GetClientRect(&rcRectDest);

 rcRectDest.left = 0;  rcRectDest.top=0;  rcRectDest.right = 720;  rcRectDest.bottom = 576;


 OffsetRect(&rcRectDest, p.x, p.y);//把窗口區域轉化為屏幕區域坐標

 SetRect(&rcRectSrc, 0, 0, 720, 576);//初始化窗口區域
 /////////////////////////////////////////////////////////////
 FILE *fp;
 fp = fopen("D:\\6089.DAT","rb+");
 buf[0] = new BYTE[720*2*576];
 for (int i=0;i<200;i++)
 {
  if(DD_OK != lpddsmypage[0]->Lock(NULL,&ddsd,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL))
  {
   return ;
  }

  UCHAR  *bmp_buffer = (UCHAR *)ddsd.lpSurface;
///////////////////////////提取數據/////////////////////////////////////////////
  fread(buf[0],720*2*576,1,fp); 
  for (int k=0;k<576;k++)
  {
   memcpy(bmp_buffer+k*ddsd.lPitch,buf[0]+k*720*2,720*2);
  }
     Sleep(40);
//////////////////////////////////////////////////////////////////////////
  //memcpy(bmp_buffer,buf[0],720*576*2);

  if(DD_OK != lpddsmypage[0]->Unlock(NULL))
  {
   return ;
  }
  if(DD_OK != lpddsprimary->Blt( &rcRectDest, lpddsmypage[0], &rcRectSrc, DDBLT_WAIT, NULL))
  {
   return ;
  }
 }
 fclose(fp);
 if(lpddsmypage)
 {
  lpddsmypage[0]->Release();
  lpddsmypage[0]=NULL;
 }
 MessageBox(_T("over"));
}

最後更新:2017-04-03 14:54:20

  上一篇:go directdraw顯示rgb555
  下一篇:go 解決編譯內核模塊helloworld.c:1: 錯誤:代碼模式‘kernel’在 32 位模式下不受支持問題,未編譯對64位的支持