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','1','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.dwSize = sizeof(DDPIXELFORMAT);

 ddsd.ddpfPixelFormat.dwFlags  = DDPF_FOURCC | DDPF_YUV ;

 ddsd.ddpfPixelFormat.dwFourCC = MAKEFOURCC('Y','V','1','2');

 ddsd.ddpfPixelFormat.dwYUVBitCount = 8;

 //

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;

 buf[0] = new BYTE[720*576];

 buf[1] = new BYTE[720*576/4];

 buf[2] = new BYTE[720*576/4];

 fp = fopen("d:\\temp\\test.yuv","rb+");

 while(!feof(fp))

 {

  if(DD_OK != lpddsmypage[0]->Lock(NULL,&ddsd,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL))

  {

   return ;

  }

UCHAR  *lp_buffer = (UCHAR *)ddsd.lpSurface;

///////////////////////////提取数据/////////////////////////////////////////////

  fread(buf[0],720*576,1,fp); 

  fread(buf[1],720*576/4,1,fp); 

  fread(buf[2],720*576/4,1,fp);

LPBYTE lpY = lp_buffer;

  LPBYTE lpV = lp_buffer + ddsd.lPitch * 576;

  LPBYTE lpU = lp_buffer + ddsd.lPitch * 576 * 5 / 4;

  for (int k=0;k<576;k++)

  {

   memcpy(lpY + k*ddsd.lPitch,buf[0]+720*k,720);

  }

for (int k=0;k<576/2;k++)

  {

   memcpy(lpU+ k*ddsd.lPitch/2  ,buf[1]+720*k/2,720/2);

   memcpy(lpV+ k*ddsd.lPitch/2 ,buf[2]+720*k/2,720/2);

  }

Sleep(40);

//////////////////////////////////////////////////////////////////////////

  //memcpy(bmp_buffer,buf[0],720*576*2);

if(DD_OK != lpddsmypage[0]->Unlock(NULL))

  {

   return ;

  }

  HRESULT     ddRval;

  ddRval= lpddsprimary->Blt( &rcRectDest, lpddsmypage[0], &rcRectSrc, DDBLT_WAIT, NULL);

        while(ddRval == DDERR_WASSTILLDRAWING);

  if(DD_OK != ddRval)

  {

   return ;

  }

 }

 fclose(fp);

 if(lpddsmypage)

 {

  lpddsmypage[0]->Release();

  lpddsmypage[0]=NULL;

 }

 MessageBox(_T("over"));

directdraw显示yuv420(YV12)的更多相关文章

  1. 【OpenGL】用OpenGL shader实现将YUV(YUV420,YV12)转RGB-(直接调用GPU实现,纯硬件方式,效率高)

    这段时间一直在搞视频格式的转换问题,终于最近将一个图片的YUV格式转RGB格式转换成功了.下面就来介绍一下: 由于我的工程是在vs2008中的,其中包含一些相关头文件和库,所以下面只是列出部分核心代码 ...

  2. YUV图解 (YUV444, YUV422, YUV420, YV12, NV12, NV21)

    背景: 最近在研究音视频,了解YUV这样的格式对于音视频开发比较重要. 虽然这篇文章大部分是转载别人的,但是经过了校对以后,重新排版并补充了一部分内容   概览: 之所以提出yuv格式的原因,是为了解 ...

  3. 嵌入式linux------SDL移植(am335x下显示yuv420)

    #include<stdio.h> #include "/usr/local/ffmpeg_arm/include/SDL/SDL.h" char *bmp_name[ ...

  4. directdraw显示yuv视频,出现屏保时,yuv显示不出来,表面丢失

    原因是: DDrawSurface 丢失, DDraw表面在很多情况下都会丢失(如:启动其他全屏独占程序,屏保,或锁屏时), 表面丢失其实就是表面所使用的内存或显存被DirectDraw系统释放, 分 ...

  5. directdraw显示rgb555

    // TODO: 在此添加控件通知处理程序代码  height=width=widthBytes=0;  m_screen.SetWindowPos(&CWnd::wndBottom,0,0, ...

  6. directdraw显示rgb565

    // TODO: 在此添加控件通知处理程序代码  height=width=widthBytes=0;  m_screen.SetWindowPos(&CWnd::wndBottom,0,0, ...

  7. directdraw显示yuv422(yuy2)

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

  8. directdraw 显示yuv

    http://www.cnblogs.com/lidan/archive/2012/03/23/2413772.html http://www.yirendai.com/msd/

  9. linux之x86裁剪移植---ffmpeg的H264解码显示(420、422)

    在虚拟机上yuv420可以正常显示 ,而945(D525)模块上却无法显示 ,后来验证了directdraw的yuv420也无法显示 ,由此怀疑显卡不支持 ,后把420转换为422显示. 420显示如 ...

随机推荐

  1. notepad++代码输出电话号

    在网上看到一个程序员找合租的消息,希望找一个程序员合租,所以电话号码以代码的形式输出,闲来没事打出来玩玩.首先新建一个test.java文件,并敲入下面代码: 1 public class test{ ...

  2. left join on/right join on/inner join on/full join on连接

    现在有两张表,第一张表是用户表,第二张表是订单表.情况是这样的,在我这张用户表里用户很多,但是真正下单的人却不多,而且,每一个用户可以有多个订单.然后领导喊话了,小王,你给我查下,现在咱们的订单有多少 ...

  3. Cookie简述

    1. Cookie是什么? Cookie(Cookies,浏览器缓存), 是指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密). 2. Cookie的作用: ...

  4. SpringMVC和Struts2的比较

    整体的框架机制     1.Struts2的入口是StrutsPrepareAndExecuteFilter,SpringMVC的入口是通过DispatcherServlet实现.     2.Str ...

  5. NIO内存映射

    磁盘的IO因为速度较慢,可能成为系统运行的瓶颈.所以磁盘的IO在操作系统级实现了提前读,延迟写的机制来提升IO的性能. 提前读就是一次读取需求的数据的同时多读接下来的一段数据至OS缓冲区中,延迟写就是 ...

  6. 洛谷 [P1801] 黑匣子

    这道题是一道splay裸题,然而身为蒟蒻的我并不会,所以这道题我维护的是一个大根堆与一个小根堆结合起来的类似沙漏的结构. 本题难点在于询问的不是最大最小值,而是第K小值,所以我们想到了维护这样两个堆, ...

  7. [Sdoi2017]序列计数 [矩阵快速幂]

    [Sdoi2017]序列计数 题意:长为\(n \le 10^9\)由不超过\(m \le 2 \cdot 10^7\)的正整数构成的和为\(t\le 100\)的倍数且至少有一个质数的序列个数 总- ...

  8. Delegate &&Lambda

    匿名函数及委托的使用: public delegate void NoReturnNoParaOutClass();//delegate can be defined in class or out ...

  9. 【Tools】ubuntu16.04升级Python2.7到3.5

    最近开始学Python,但我发现我ubuntu16.04上默认的Python是2.7,并不是3,x 于是准备Python升级,记录安装过程给初学者参考一下. 1.先取得管理员权限, 个人习惯先取得管理 ...

  10. centos 6 安装zabbix 3.0

    1.安装PHP Zabbix 3.0对PHP的要求最低为5.4,而CentOS6默认为5.3.3,完全不满足要求,故需要利用第三方源,将PHP升级到5.4以上,注意,不支持PHP7 rpm -ivh  ...