dierectdraw 7显示视频

来源:互联网 发布:微商吸粉软件 编辑:程序博客网 时间:2024/05/31 06:23
bool CDrawView::CreateSurface(HWND hWnd, Sint32 lWidth, Sint32 lHeight)
{
    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;
}


2 0
原创粉丝点击