DirectX: YUY2格式的OVERLAY页面为什么要填入RGB格式的数据才显示正常???

wmrwinhap 2004-08-31 05:16:01
我的显卡可以成功创建YUY2或Y411两种YUV格式的OVERLAY表面,可是我使用Lock->memcpy->Unlock往lpSurface地址填入的数据是YUY2或Y411的格式时显示不正确,填入RGB格式的数据反而显示正常,Why ???
...全文
561 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmrwinhap 2004-09-06
  • 打赏
  • 举报
回复
回复人: kathywp(树欲静而风不止)
那是你显卡不只持

Maybe you are right.

我的显卡似乎只支持YUV(FOURCC)的UpdateOverlay,通过UpdateOverlay方法可以正常显示YUV格式的数据;但并不支持YUV的Blt,所以使用Blt方法则无论是YUV格式还是RGB格式的OVERLAY表面,都只能填入与主表面颜色深度一致的RGB格式的数据。

可是我做的是控件需多于多视频,改用DirectShow又太麻烦,真是郁闷!

wmrwinhap 2004-09-03
  • 打赏
  • 举报
回复
再有一个急切的问题:如果采用UpdateOverlay显示,那么OVERLAY表面能象主表面一样通过设置CLIPPER限定在一个窗口内吗?
我对主表面设置了CLIPPER后,主表面显示的内容就不会覆盖它上面的窗口;但对OVERLAY表面设置CLIPPER后,OVERLAY表面还是始终显示在屏幕最顶层,实际位于显示窗口上面的窗口也总被覆盖
wmrwinhap 2004-09-02
  • 打赏
  • 举报
回复
0 的突破,YUY2格式的UpdateOverlay能正常显示但还没找到原来不能正常显示的原因,而且Blt不正常,继续研究中...

谢谢牙科医生,真的非常感谢!!!
DentistryDoctor 2004-09-01
  • 打赏
  • 举报
回复
一般来说现在的显示卡不支持YUYV的已经很少了。可能你创建的根据就不是YUV2的Overlay平面。可否将代码让我为你一看?
thsy 2004-09-01
  • 打赏
  • 举报
回复
真羡慕。我的dell机只支持yv12,不支持y411,伤心呀
wmrwinhap 2004-09-01
  • 打赏
  • 举报
回复
我已经是YUV格式的数据了,要转换成RGB格式才能显示,好费CPU资源呀,效率已经无法忍受了
wmrwinhap 2004-09-01
  • 打赏
  • 举报
回复
比如创建YUY2格式的OFFSCREEN_PLAN的表面就会失败,那确实是不支持。
明明我创建YUY2格式的OVERLAY表面是成功的,为何还会不支持呢?
DentistryDoctor 2004-09-01
  • 打赏
  • 举报
回复
DDSURFACEDESC ddsd;
ZeroMemory(&ddsd, sizeof ddsd);
ddsd.dwSize = sizeof ddsd;

if(FAILED(m_pOverlay->Lock((LPRECT)rc, &ddsd, DDLOCK_WRITEONLY | DDLOCK_SURFACEMEMORYPTR, 0)))return FALSE;
....//memcpy to write data

m_pOverlay->Unlock(ddsd.lpSurface);
DentistryDoctor 2004-09-01
  • 打赏
  • 举报
回复
你是不是将数据写在主平面上了?
DentistryDoctor 2004-09-01
  • 打赏
  • 举报
回复
创建OVERLAY平面的代码没多大问题。一般来说YUY2总是可以成功的,除非OVERLAY已经被占用,一些显卡即使能创建Y411,但却显示不正常。
那你说往OVERLAY平面写YUYV数据不能正常显示?
wmrwinhap 2004-09-01
  • 打赏
  • 举报
回复
不好意思,上面贴得太乱了,重贴一下:

#define FOURCC_YV12 0x32315659 // MAKEFOURCC('Y','V','1','2')
#define FOURCC_Y411 0x31313459 // MAKEFOURCC('Y','4','1','1')
#define FOURCC_YUY2 0x32595559 // MAKEFOURCC('Y','U','Y','2')
#define FOURCC_UYVY 0x59565955 // MAKEFOURCC('U','Y','V','Y')

HRESULT hr=0;

//创建DirectDraw对象
hr=DirectDrawCreate(NULL,&m_lpDD,NULL);
if(hr==DD_OK) {
hr=m_lpDD->SetCooperativeLevel(GetActiveWindow(),DDSCL_NORMAL);
if(hr==DD_OK) {
DDSURFACEDESC ddsd; //表面描述
ddsd.dwSize=sizeof( ddsd );

//创建主表面
ddsd.dwFlags=DDSD_CAPS;
ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
hr=m_lpDD->CreateSurface(&ddsd,&m_lpDDSPrimary,NULL);
if(hr==DD_OK) {
// Get driver capabilities
DDCAPS capsDrv;
memset(&capsDrv,0,sizeof(capsDrv));
capsDrv.dwSize=sizeof(DDCAPS);
hr=m_lpDD->GetCaps(&capsDrv, NULL);
if(hr==DD_OK && (capsDrv.dwCaps & DDCAPS_OVERLAY)) { // determine Overlay support.
DDPIXELFORMAT PixelFormat[] = {
{ sizeof(DDPIXELFORMAT), DDPF_FOURCC, FOURCC_YV12, 0, 0, 0, 0, 0 }, // YV12
{ sizeof(DDPIXELFORMAT), DDPF_FOURCC, FOURCC_Y411, 0, 0, 0, 0, 0 }, // Y411
{ sizeof(DDPIXELFORMAT), DDPF_FOURCC, FOURCC_YUY2, 0, 0, 0, 0, 0 }, // YUY2
{ sizeof(DDPIXELFORMAT), DDPF_FOURCC, FOURCC_UYVY, 0, 0, 0, 0, 0 } // UYVY
};
int i, nPixelFormat=sizeof(PixelFormat)/sizeof(DDPIXELFORMAT);

// 创建覆盖表面
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OVERLAY; // Overlay related APIs will fail without hardware support.
ddsd.dwWidth = 352;
ddsd.dwHeight = 288;
for(i=0;i<nPixelFormat;i++) {
memcpy(&ddsd.ddpfPixelFormat,&PixelFormat[i],sizeof(DDPIXELFORMAT));

hr=m_lpDD->CreateSurface(&ddsd,&m_lpDDSOverlay,NULL);
if(hr==DD_OK) {
char tmpBuf[256];
sprintf(tmpBuf,"创建第%d种OVERLAY表面成功 !",i);
MessageBox(tmpBuf,"DirectDraw初始化",MB_ICONINFORMATION);
break;
}
}
}
}
}
}

运行结果显示,Y411或YUY2格式是能成功创建的,但其它格式会失败
wmrwinhap 2004-09-01
  • 打赏
  • 举报
回复
#define FOURCC_YV12 0x32315659 // MAKEFOURCC('Y','V','1','2')
#define FOURCC_Y411 0x31313459 // MAKEFOURCC('Y','4','1','1')
#define FOURCC_YUY2 0x32595559 // MAKEFOURCC('Y','U','Y','2')
#define FOURCC_UYVY 0x59565955 // MAKEFOURCC('U','Y','V','Y')

HRESULT hr=0;

//创建DirectDraw对象
hr=DirectDrawCreate(NULL,&m_lpDD,NULL);
if(hr==DD_OK) {
hr=m_lpDD->SetCooperativeLevel(GetActiveWindow(),DDSCL_NORMAL);
if(hr==DD_OK) {
DDSURFACEDESC ddsd; //表面描述
ddsd.dwSize=sizeof( ddsd );

//创建主表面
ddsd.dwFlags=DDSD_CAPS;
ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
hr=m_lpDD->CreateSurface(&ddsd,&m_lpDDSPrimary,NULL);
if(hr==DD_OK) {
// Get driver capabilities to determine Overlay support.
DDCAPS capsDrv;
memset(&capsDrv,0,sizeof(capsDrv));
capsDrv.dwSize=sizeof(DDCAPS);
hr=m_lpDD->GetCaps(&capsDrv, NULL);
if(hr==DD_OK) {
DDPIXELFORMAT PixelFormat[] = {
{ sizeof(DDPIXELFORMAT), DDPF_FOURCC, FOURCC_YV12, 0, 0, 0, 0, 0 }, // YV12
{ sizeof(DDPIXELFORMAT), DDPF_FOURCC, FOURCC_Y411, 0, 0, 0, 0, 0 }, // Y411
{ sizeof(DDPIXELFORMAT), DDPF_FOURCC, FOURCC_YUY2, 0, 0, 0, 0, 0 }, // YUY2
{ sizeof(DDPIXELFORMAT), DDPF_FOURCC, FOURCC_UYVY, 0, 0, 0, 0, 0 } // UYVY
};
int i, nPixelFormat=sizeof(PixelFormat)/sizeof(DDPIXELFORMAT);

// 创建覆盖表面
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
ddsd.ddsCaps.dwCaps = (capsDrv.dwCaps & DDCAPS_OVERLAY)?DDSCAPS_OVERLAY:DDSCAPS_OFFSCREENPLAIN; // Does the driver support overlays in the current mode? Overlay related APIs will fail without hardware support).
ddsd.dwWidth = 352;
ddsd.dwHeight = 288;
for(i=0;i<nPixelFormat;i++) {
memcpy(&ddsd.ddpfPixelFormat,&PixelFormat[i],sizeof(DDPIXELFORMAT));

hr=m_lpDD->CreateSurface(&ddsd,&m_lpDDSOverlay,NULL);
if(hr==DD_OK) {
char tmpBuf[256];
sprintf(tmpBuf,"创建第%d种OVERLAY表面成功 !",i);
MessageBox(tmpBuf,"DirectDraw初始化",MB_ICONINFORMATION);
break;
}
}
}
}
}
}

kathywp 2004-08-31
  • 打赏
  • 举报
回复
那是你显卡不只持

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧