yuv422 java_directdraw显示yuv422(yuy2)

#include

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值