dierectdraw 7显示视频
来源:互联网 发布:微商吸粉软件 编辑:程序博客网 时间:2024/05/31 06:23
{
bool bRet = false;
do
{
HRESULT hr = DirectDrawCreate(NULL, &m_lpDDraw, NULL);
if (DD_OK != hr)
{
break;
}
hr = m_lpDDraw->SetCooperativeLevel(hWnd, DDSCL_NORMAL|DDSCL_NOWINDOWCHANGES); //lint !e620
if (DD_OK != hr)
{
break;
}
//创建主表面
DDSURFACEDESC ddsd;
memset(&ddsd, 0, sizeof(DDSURFACEDESC));
ddsd.dwSize = sizeof(DDSURFACEDESC);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
hr = m_lpDDraw->CreateSurface(&ddsd, &m_lpPrimarySurface, NULL);
if (DD_OK != hr)
{
break;
}
LPDIRECTDRAWCLIPPER lpClipperBack = NULL;
hr = m_lpDDraw->CreateClipper(NULL, &lpClipperBack, NULL);
if (DD_OK != hr)
{
break;
}
lpClipperBack->SetHWnd(0, hWnd);
m_lpPrimarySurface->SetClipper(lpClipperBack);
lpClipperBack->Release();
//create off screen surface
memset(&ddsd, 0, sizeof(DDSURFACEDESC));
ddsd.dwSize = sizeof(DDSURFACEDESC);
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
if (m_bNeedHdc)
{
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
}
else
{
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
ddsd.ddpfPixelFormat.dwSize = sizeof(DDSD_PIXELFORMAT);
ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC | DDPF_YUV;
ddsd.ddpfPixelFormat.dwFourCC = MAKEFOURCC('Y', 'V', '1', '2');
ddsd.ddpfPixelFormat.dwYUVBitCount = 12;
}
ddsd.dwWidth = lWidth;
ddsd.dwHeight = lHeight;
hr = m_lpDDraw->CreateSurface(&ddsd, &m_lpOffScrnSurface, NULL);
if (DD_OK != hr)
{
break;
}
m_lFrameWidth = lWidth;
m_lFrameHeight = lHeight;
bRet = true;
} while (false);
if (!bRet)
{
ReleaseSurface();
}
return bRet;
}
bool CDrawView::ShowPictureByDraw(HWND hWnd, AVPixelFormat eFrameType, Sint32 lWidth, Sint32 lHeight, Uint8* pData,BOOL bshow)
{
if (NULL == m_lpDDraw)
{
return false;
}
Uint8* pYUV = NULL;
if (AV_PIX_FMT_YUV420P == eFrameType)
{
pYUV = pData;
}
else
{
if (NULL == m_pYUVCvt)
{
m_pYUVCvt = new(std::nothrow) CColorCvt();
if (NULL == m_pYUVCvt)
{
return false;
}
}
//封装ffmpeg转换 sws_scale
if (VID_PLAY_ERROR_SUCCESS != m_pYUVCvt->CvtColor(eFrameType, lWidth, lHeight, pData, AV_PIX_FMT_YUV420P, pYUV, NULL, true))
{
return false;
}
}
DDSURFACEDESC ddsd;
memset(&ddsd, 0, sizeof(DDSURFACEDESC));
ddsd.dwSize = sizeof(DDSURFACEDESC);
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
ddsd.dwWidth = lWidth;
ddsd.dwHeight = lHeight;
ddsd.ddpfPixelFormat.dwSize = sizeof(DDSD_PIXELFORMAT);
ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC | DDPF_YUV;
ddsd.ddpfPixelFormat.dwFourCC = MAKEFOURCC('Y', 'V', '1', '2');
ddsd.ddpfPixelFormat.dwYUVBitCount = 12;
HRESULT hr = m_lpOffScrnSurface->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_WRITEONLY, NULL); //lint !e613
while (DDERR_WASSTILLDRAWING == hr);
if (DD_OK != hr)
{
return false;
}
Uint8* lpSurface = (Uint8*)ddsd.lpSurface;
if (NULL != lpSurface)
{
for (int i=0; i<(int)ddsd.dwHeight; ++i)
{
memcpy(lpSurface, pYUV, ddsd.dwWidth);
pYUV += lWidth;
lpSurface += ddsd.lPitch;
}
for (int i=0; i<(int)ddsd.dwHeight; ++i)
{
memcpy(lpSurface, pYUV, ddsd.dwWidth/2);
pYUV += (lWidth/2);
lpSurface += (ddsd.lPitch/2);
}
}
m_lpOffScrnSurface->Unlock(NULL); //lint !e613
RECT dstRect;
GetClientRect(hWnd, &dstRect);
ClientToScreen(hWnd, (LPPOINT)&dstRect.left);
ClientToScreen(hWnd, (LPPOINT)&dstRect.right);
if(bshow)
{
hr = m_lpPrimarySurface->Blt(&dstRect, m_lpOffScrnSurface, &m_srcRect, DDBLTFAST_WAIT, NULL); //lint !e613
}
while (DDERR_WASSTILLDRAWING == hr);
return DD_OK == hr;
}
- dierectdraw 7显示视频
- 视频显示
- 视频显示
- DSHOW 显示视频
- 视频渲染(显示)技术
- Android显示视频Demo
- Direct3D显示视频
- Qt显示视频总时长
- 关于视频显示
- Opencv显示视频
- android OpenGL 显示视频
- opencv 显示播放视频
- OpenGL显示YUV视频
- 4.4 视频缩略图显示
- qt opencv 视频显示
- Surface+MediaPlayer显示视频
- 网页中显示视频
- opencv显示视频流
- 备忘录模式
- Box of Bricks
- RNN 的训练
- poj3279(状态压缩)
- stm32 TIM2 重映射
- dierectdraw 7显示视频
- Ubuntu 16.04 命令行下安装jdk1.8
- 数据结构——线性表——散列存储结构——哈希表知识点总结
- A1 = ?
- linux新建文件及目录默认权限
- python 包安装的好方法
- POJ 2387 Til the Cows Come Home(Dijkstra算法)
- HDOJ 1522 Marriage is Stable
- input传参