• directdraw显示yuv422(yuy2) 分类: VC++ 2013-11-14 14:58 932人阅读 评论(0) 收藏



    #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"));
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    11.爱吃皮蛋的小明(斐波那契数列)
    10.二叉树最大宽度和高度
    9.二叉树的序遍历
    8.递归第一次
    6.数的计算(递归算法)
    5.十进制转m进制
    数论——快速幂(C++)
    最短路径——SPFA算法(C++)
    最小环——Floyd变种算法(C++)
    数论——质因数分解(C++)
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706724.html
Copyright © 2020-2023  润新知