首页 新闻 会员 周边 捐助

c++代码改成C#

0
悬赏园豆:100 [待解决问题]

BOOL CDDrawShow::DrawYV12byDraw7(LPBYTE lpY, LPBYTE lpV, LPBYTE lpU, DWORD width, DWORD height)
{
  if ((m_dwHeight != height) || (m_dwWidth != width))
  {
    DestroyDDrawObj();//自定义方法,不用理会
    CreateDDrawObj(YV12, m_hPlayWnd, width, height);//自定义方法,不用理会
  }  

  if (!m_lpDDSOffScr || !m_lpDDSPrimary || !m_lpDD )
  {
    return S_FALSE;
  }

  if (!lpY || !lpV || !lpU)
  {
    return S_FALSE;
  }

  //将解码得到的YUV数据拷贝到YUV表面
  HRESULT ddRval; // DirectDraw 函数返回值
  RECT rctDest; // 目标区域
  RECT rctSour; // 源区域


  ddRval = m_lpDDSOffScr->Lock(NULL,&m_ddsd,/*DDLOCK_DONOTWAIT*/DDLOCK_WAIT | DDLOCK_WRITEONLY,NULL);

  // while(ddRval == DDERR_WASSTILLDRAWING);
  if( ddRval == DDERR_SURFACELOST )
  {
    //MessageBox("DDERR_SURFACELOST");
    ddRval = m_lpDDSOffScr->Restore();
    ddRval = m_lpDDSOffScr->Lock(NULL, &m_ddsd,     DDLOCK_WAIT|DDLOCK_WRITEONLY, NULL);
  }

  if(ddRval != DD_OK)
    return FALSE;

  // 填充离屏表面
  LPBYTE lpSurf = (LPBYTE)m_ddsd.lpSurface;
  if(lpSurf)
  {
    unsigned int i = 0;

    for (i=0;i<m_ddsd.dwHeight;i++)
    {
      memcpy(lpSurf, lpY, m_ddsd.dwWidth);
      lpY += m_dwWidth;
      lpSurf += m_ddsd.lPitch;
    }

    for (i=0;i<m_ddsd.dwHeight/2;i++)
    {
      memcpy(lpSurf, lpV, m_ddsd.dwWidth/2);
      lpV += m_dwWidth/2;
      lpSurf += m_ddsd.lPitch/2;
    }
    for (i=0;i<m_ddsd.dwHeight/2;i++)
    {
      memcpy(lpSurf, lpU, m_ddsd.dwWidth/2);
      lpU += m_dwWidth/2;
      lpSurf += m_ddsd.lPitch/2;
    }
  }

  m_lpDDSOffScr->Unlock(NULL);

  //YUV表面的显示
  rctSour.left = 0;
  rctSour.top = 0;
  rctSour.right = m_ddsd.dwWidth;
  rctSour.bottom = m_ddsd.dwHeight;
  ::GetClientRect(m_hPlayWnd,&rctDest);
  ::ClientToScreen(m_hPlayWnd, (LPPOINT)&rctDest.left);
  ::ClientToScreen(m_hPlayWnd, (LPPOINT)&rctDest.right);

  ddRval = m_lpDDSPrimary->Blt(&rctDest, m_lpDDSOffScr, &rctSour,   DDBLT_WAIT, NULL);
  // while(ddRval == DDERR_WASSTILLDRAWING);
  if(ddRval != DD_OK)
  {
    // MessageBox(NULL,"blt error",NULL,MB_OK);
    return FALSE;
  }


  return TRUE;
}

 

以上代码是C++,将YV12格式的视频流显示出来。跪求:C#的实现方式。换个思路也行。其它第三方组件能解决这个问题也可以。倒计时,此问题不解决,只有离职了。

问题补充:

自定义的方法不用理会

月光小提琴的主页 月光小提琴 | 初学一级 | 园豆:44
提问于:2012-12-05 14:44
< >
分享
所有回答(4)
0

哥啊……

 

你把代码排版一下啊……

需要格局 | 园豆:2145 (老鸟四级) | 2012-12-05 20:46

已经排版,请求帮助!

支持(0) 反对(0) 月光小提琴 | 园豆:44 (初学一级) | 2012-12-06 15:17
0

你需要熟悉一下.net调用COM,熟悉一下DDraw。

glimix | 园豆:154 (初学一级) | 2012-12-09 01:49
0

编译成dll然后用p/invoke试试呢?

undefined | 园豆:898 (小虾三级) | 2012-12-10 14:04
0

LZl离职了没。

shin8090 | 园豆:202 (菜鸟二级) | 2013-04-23 16:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册